{"version":3,"file":"permission.aa68ce5a.js","sources":["../../../../node_modules/.pnpm/@tanstack+query-core@4.33.0/node_modules/@tanstack/query-core/build/lib/queriesObserver.mjs","../../../../node_modules/.pnpm/@tanstack+vue-query@4.34.3_vue@3.3.8/node_modules/@tanstack/vue-query/build/lib/useQueries.mjs","../../../../composables/api/permission.ts"],"sourcesContent":["import { difference, replaceAt } from './utils.mjs';\nimport { notifyManager } from './notifyManager.mjs';\nimport { QueryObserver } from './queryObserver.mjs';\nimport { Subscribable } from './subscribable.mjs';\n\nclass QueriesObserver extends Subscribable {\n constructor(client, queries) {\n super();\n this.client = client;\n this.queries = [];\n this.result = [];\n this.observers = [];\n this.observersMap = {};\n\n if (queries) {\n this.setQueries(queries);\n }\n }\n\n onSubscribe() {\n if (this.listeners.size === 1) {\n this.observers.forEach(observer => {\n observer.subscribe(result => {\n this.onUpdate(observer, result);\n });\n });\n }\n }\n\n onUnsubscribe() {\n if (!this.listeners.size) {\n this.destroy();\n }\n }\n\n destroy() {\n this.listeners = new Set();\n this.observers.forEach(observer => {\n observer.destroy();\n });\n }\n\n setQueries(queries, notifyOptions) {\n this.queries = queries;\n notifyManager.batch(() => {\n const prevObservers = this.observers;\n const newObserverMatches = this.findMatchingObservers(this.queries); // set options for the new observers to notify of changes\n\n newObserverMatches.forEach(match => match.observer.setOptions(match.defaultedQueryOptions, notifyOptions));\n const newObservers = newObserverMatches.map(match => match.observer);\n const newObserversMap = Object.fromEntries(newObservers.map(observer => [observer.options.queryHash, observer]));\n const newResult = newObservers.map(observer => observer.getCurrentResult());\n const hasIndexChange = newObservers.some((observer, index) => observer !== prevObservers[index]);\n\n if (prevObservers.length === newObservers.length && !hasIndexChange) {\n return;\n }\n\n this.observers = newObservers;\n this.observersMap = newObserversMap;\n this.result = newResult;\n\n if (!this.hasListeners()) {\n return;\n }\n\n difference(prevObservers, newObservers).forEach(observer => {\n observer.destroy();\n });\n difference(newObservers, prevObservers).forEach(observer => {\n observer.subscribe(result => {\n this.onUpdate(observer, result);\n });\n });\n this.notify();\n });\n }\n\n getCurrentResult() {\n return this.result;\n }\n\n getQueries() {\n return this.observers.map(observer => observer.getCurrentQuery());\n }\n\n getObservers() {\n return this.observers;\n }\n\n getOptimisticResult(queries) {\n return this.findMatchingObservers(queries).map(match => match.observer.getOptimisticResult(match.defaultedQueryOptions));\n }\n\n findMatchingObservers(queries) {\n const prevObservers = this.observers;\n const prevObserversMap = new Map(prevObservers.map(observer => [observer.options.queryHash, observer]));\n const defaultedQueryOptions = queries.map(options => this.client.defaultQueryOptions(options));\n const matchingObservers = defaultedQueryOptions.flatMap(defaultedOptions => {\n const match = prevObserversMap.get(defaultedOptions.queryHash);\n\n if (match != null) {\n return [{\n defaultedQueryOptions: defaultedOptions,\n observer: match\n }];\n }\n\n return [];\n });\n const matchedQueryHashes = new Set(matchingObservers.map(match => match.defaultedQueryOptions.queryHash));\n const unmatchedQueries = defaultedQueryOptions.filter(defaultedOptions => !matchedQueryHashes.has(defaultedOptions.queryHash));\n const matchingObserversSet = new Set(matchingObservers.map(match => match.observer));\n const unmatchedObservers = prevObservers.filter(prevObserver => !matchingObserversSet.has(prevObserver));\n\n const getObserver = options => {\n const defaultedOptions = this.client.defaultQueryOptions(options);\n const currentObserver = this.observersMap[defaultedOptions.queryHash];\n return currentObserver != null ? currentObserver : new QueryObserver(this.client, defaultedOptions);\n };\n\n const newOrReusedObservers = unmatchedQueries.map((options, index) => {\n if (options.keepPreviousData) {\n // return previous data from one of the observers that no longer match\n const previouslyUsedObserver = unmatchedObservers[index];\n\n if (previouslyUsedObserver !== undefined) {\n return {\n defaultedQueryOptions: options,\n observer: previouslyUsedObserver\n };\n }\n }\n\n return {\n defaultedQueryOptions: options,\n observer: getObserver(options)\n };\n });\n\n const sortMatchesByOrderOfQueries = (a, b) => defaultedQueryOptions.indexOf(a.defaultedQueryOptions) - defaultedQueryOptions.indexOf(b.defaultedQueryOptions);\n\n return matchingObservers.concat(newOrReusedObservers).sort(sortMatchesByOrderOfQueries);\n }\n\n onUpdate(observer, result) {\n const index = this.observers.indexOf(observer);\n\n if (index !== -1) {\n this.result = replaceAt(this.result, index, result);\n this.notify();\n }\n }\n\n notify() {\n notifyManager.batch(() => {\n this.listeners.forEach(({\n listener\n }) => {\n listener(this.result);\n });\n });\n }\n\n}\n\nexport { QueriesObserver };\n//# sourceMappingURL=queriesObserver.mjs.map\n","import { QueriesObserver } from '@tanstack/query-core';\nimport { getCurrentScope, computed, reactive, watch, onScopeDispose, readonly } from 'vue-demi';\nimport { useQueryClient } from './useQueryClient.mjs';\nimport { cloneDeepUnref } from './utils.mjs';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nfunction useQueries({\n queries,\n queryClient: queryClientInjected\n}) {\n var _unreffedQueries$valu, _unreffedQueries$valu2, _ref;\n\n if (process.env.NODE_ENV === 'development') {\n if (!getCurrentScope()) {\n console.warn('vue-query composables like \"uesQuery()\" should only be used inside a \"setup()\" function or a running effect scope. They might otherwise lead to memory leaks.');\n }\n }\n\n const unreffedQueries = computed(() => cloneDeepUnref(queries));\n const queryClientKey = (_unreffedQueries$valu = unreffedQueries.value[0]) == null ? void 0 : _unreffedQueries$valu.queryClientKey;\n const optionsQueryClient = (_unreffedQueries$valu2 = unreffedQueries.value[0]) == null ? void 0 : _unreffedQueries$valu2.queryClient;\n const queryClient = (_ref = queryClientInjected != null ? queryClientInjected : optionsQueryClient) != null ? _ref : useQueryClient(queryClientKey);\n\n if (process.env.NODE_ENV !== 'production' && (queryClientKey || optionsQueryClient)) {\n queryClient.getLogger().error(\"Providing queryClient to individual queries in useQueries has been deprecated and will be removed in the next major version. You can still pass queryClient as an option directly to useQueries hook.\");\n }\n\n const defaultedQueries = computed(() => unreffedQueries.value.map(options => {\n const defaulted = queryClient.defaultQueryOptions(options);\n defaulted._optimisticResults = queryClient.isRestoring.value ? 'isRestoring' : 'optimistic';\n return defaulted;\n }));\n const observer = new QueriesObserver(queryClient, defaultedQueries.value);\n const state = reactive(observer.getCurrentResult());\n\n let unsubscribe = () => {// noop\n };\n\n watch(queryClient.isRestoring, isRestoring => {\n if (!isRestoring) {\n unsubscribe();\n unsubscribe = observer.subscribe(result => {\n state.splice(0, result.length, ...result);\n }); // Subscription would not fire for persisted results\n\n state.splice(0, state.length, ...observer.getOptimisticResult(defaultedQueries.value));\n }\n }, {\n immediate: true\n });\n watch(defaultedQueries, () => {\n observer.setQueries(defaultedQueries.value);\n state.splice(0, state.length, ...observer.getCurrentResult());\n }, {\n flush: 'sync'\n });\n onScopeDispose(() => {\n unsubscribe();\n });\n return readonly(state);\n}\n\nexport { useQueries };\n//# sourceMappingURL=useQueries.mjs.map\n","import { useQueries, useQuery } from '@tanstack/vue-query'\n\nimport { type User } from './user'\n\nexport interface UserPermissions extends UserPermissionsCanView {\n id: number // integer // readOnly\n is_manager: boolean\n is_admin: boolean // readOnly\n}\ninterface UserPermissionsCanView {\n can_view_contact: boolean\n can_view_contract: boolean\n can_view_download: boolean\n can_view_power: boolean\n can_view_ticket: boolean\n can_view_traffic: boolean\n}\nexport type UserPermissionName = keyof UserPermissionsCanView\n\ninterface UserPermissionsList {\n count: number // eg. 123,\n next: string // eg. \"http://api.example.org/accounts/?offset=400&limit=100\",\n previous: string // eg. \"http://api.example.org/accounts/?offset=200&limit=100\",\n results: UserPermissions[]\n}\n/**\n * for: manager, admin\n * https://kupo-test.ibh.de/rest/schema/swagger-ui#/permission/permission_list\n */\nexport function usePermissionsList(offset: number, limit: number) {\n return useQuery({\n queryKey: ['get', 'permission', { offset, limit }],\n queryFn: () =>\n useApi().get(`permission`, { searchParams: { offset, limit } }).json(),\n })\n}\n\n/**\n * for: any user\n * https://kupo-test.ibh.de/rest/schema/swagger-ui#/permission/permission_own_retrieve\n */\nexport function useOwnPermissions() {\n return useQuery({\n queryKey: ['get', 'permission', 'own'],\n queryFn: () => useApi().get(`permission/own`).json(),\n refetchInterval: 5 * 60 * 1000,\n retry: false,\n })\n}\n\n/**\n * for: admin, manager (only for users below their tenancy),\n * rules: is_manager user cannot give themselves other permissions; is_manager can only be set by user with is_admin permission; is_admin cannot be set via API\n * https://kupo-test.ibh.de/rest/schema/swagger-ui#/permission/permission_retrieve\n */\nfunction retrieveUserPermission(userId: User['id']) {\n return useApi().get(`permission/${userId}`).json()\n}\n\nexport const queryKey_get_permission = (userId: User['id']) => ['get', 'permission', { userId }]\n\n/**\n * for: admin, manager (only for users below their tenancy),\n * rules: is_manager user cannot give themselves other permissions; is_manager can only be set by user with is_admin permission; is_admin cannot be set via API\n * https://kupo-test.ibh.de/rest/schema/swagger-ui#/permission/permission_retrieve\n */\nexport function useUserPermissions(userIds: MaybeRefOrGetter) {\n const queries = computed(() =>\n toValue(userIds).map((userId) => ({\n queryKey: queryKey_get_permission(userId),\n queryFn: () => retrieveUserPermission(userId),\n })),\n )\n return useQueries({ queries })\n}\n\ninterface UpdateUserPermissionsVariables {\n userId: User['id']\n permissionsUpdate: Partial\n}\n/**\n * for: admin, manager (only for users below their tenancy)\n * https://kupo-test.ibh.de/rest/schema/swagger-ui#/permission/permission_partial_update\n */\nexport function useUpdateUserPermissions() {\n return useOptimisticMutation({\n mutationFn: ({ userId, permissionsUpdate }: UpdateUserPermissionsVariables) =>\n useApi().patch(`permission/${userId}`, { json: permissionsUpdate }).json(),\n optimisticUpdates: ({ userId, permissionsUpdate }: UpdateUserPermissionsVariables) => [\n {\n queryKey: queryKey_get_permission(userId),\n updater: (previousPermissions: UserPermissions | undefined) => ({\n id: 0,\n is_manager: false,\n is_admin: false,\n can_view_contact: false,\n can_view_contract: false,\n can_view_download: false,\n can_view_power: false,\n can_view_ticket: false,\n can_view_traffic: false,\n ...previousPermissions,\n ...permissionsUpdate,\n }),\n },\n ],\n otherAffectedQueries: (variables) => [\n { queryKey: ['get', 'permission'], options: { exact: true } },\n // update own permissions\n {\n queryKey: ['get', 'permission', 'own'],\n options: {\n predicate: (_) => {\n const auth = useAuth()\n\n return variables.userId === auth.ownPermissions?.id\n },\n },\n },\n ],\n })\n}\n"],"names":["QueriesObserver","Subscribable","client","queries","observer","result","notifyOptions","notifyManager","prevObservers","newObserverMatches","match","newObservers","newObserversMap","newResult","hasIndexChange","index","difference","prevObserversMap","defaultedQueryOptions","options","matchingObservers","defaultedOptions","matchedQueryHashes","unmatchedQueries","matchingObserversSet","unmatchedObservers","prevObserver","getObserver","currentObserver","QueryObserver","newOrReusedObservers","previouslyUsedObserver","sortMatchesByOrderOfQueries","a","b","replaceAt","listener","useQueries","queryClientInjected","_unreffedQueries$valu","_unreffedQueries$valu2","_ref","unreffedQueries","computed","cloneDeepUnref","queryClientKey","optionsQueryClient","queryClient","useQueryClient","defaultedQueries","defaulted","state","reactive","unsubscribe","watch","isRestoring","onScopeDispose","readonly","useOwnPermissions","useQuery","useApi","retrieveUserPermission","userId","queryKey_get_permission","useUserPermissions","userIds","toValue","useUpdateUserPermissions","useOptimisticMutation","permissionsUpdate","previousPermissions","variables","_","auth","useAuth","_a"],"mappings":"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","x_google_ignoreList":[0,1]}