{"version":3,"file":"useQueryExecutors.mjs","names":["useCallback","useEffect","useMemo","useState","useLookupsStore","executeQueryInstance","executeQueryWithParameters","executeQueryInstanceWithApiMethodInstance","executeQueryAdHoc","handleResponseErrors","ApiMethodInstance","QueryResult","cloneDeep","LookupCollection","Lookup","DeprecatedLookupCollection","field","LookupConfig","value","lookupKeyName","lookupValueName","ExecuteInstanceAndMapLookups","queryParams","apiMethodInstanceId","replaceCache","showSnackbars","urlQueryParams","Promise","ExecuteInstanceWithObjectAndMapLookups","apiMethodInstance","ExecuteAdHocAndMapLookups","searchObject","apiMethodId","lookupsMap","Record","UseQueryExecutorsReturn","executeQueryInstanceAndMapLookups","executeQueryInstanceWithObjectAndMapLookups","executeQueryAdHocAndMapLookups","getCleanData","data","getLookup","lookupId","useQueryExecutors","lookupApiMethodId","lookupsDataMap","setLookupsDataMap","getLookupById","getMappedSearchResults","lookups","searchResults","pageList","countable","total","eagerLoad","aggregateResults","aliasMap","mapLookup","item","updatedItem","Object","keys","forEach","attribute","lookup","propertyValue","undefined","matchingLookupRow","find","row","udpLookupUdpLookupKey","keyName","name","length","r","every","k","String","valueName","updatedPageList","map","updatedAggregateResults","processQueryResponseWithLookups","response","lookupDataMap","resultData","status","promises","Array","key","lookupConfig","existingLookup","lookupQueryData","id","push","then","businessObjectKey","catch","e","all","console","info","cachedLookup","cleanData","isArray","index","currentValue","temp"],"sources":["../../src/hooks/useQueryExecutors.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useLookupsStore } from '../stores/lookupsStore';\nimport {\n  executeQueryInstance,\n  executeQueryWithParameters,\n  executeQueryInstanceWithApiMethodInstance,\n  executeQueryAdHoc\n} from '../udp/utilities/methodUtils';\nimport { handleResponseErrors } from '../utilities/apiHelpers';\nimport ApiMethodInstance from '../models/ApiMethodInstance';\nimport QueryResult from '../models/QueryResult';\nimport { cloneDeep } from 'lodash-es';\nimport type { LookupCollection } from '@univerus/udp-stencil-component-library';\nimport Lookup from '../models/Lookup';\n\n/**\n * @deprecated Use {@link LookupCollection} from `@univerus/udp-stencil-component-library` instead.\n * Old shape: `{ [field: string]: Lookup }`\n */\nexport type DeprecatedLookupCollection = {\n  [field: string]: Lookup;\n};\n\n/**\n * value - id of lookup\n * lookupKeyName - used to find the correct lookup key/value pair\n * lookupValueName - the value in which to replace the target value\n */\ninterface LookupConfig {\n  value: string;\n  lookupKeyName: string | null | undefined;\n  lookupValueName: string | null | undefined;\n}\n\ntype ExecuteInstanceAndMapLookups = (\n  queryParams: any,\n  apiMethodInstanceId: string | null | undefined,\n  replaceCache: boolean | null | undefined,\n  showSnackbars?: boolean | null | undefined,\n  urlQueryParams?: string\n) => Promise<any>;\n\ntype ExecuteInstanceWithObjectAndMapLookups = (\n  queryParams: any,\n  apiMethodInstance: ApiMethodInstance | null | undefined | any,\n  replaceCache: boolean | null | undefined,\n  showSnackbars?: boolean | null | undefined,\n  urlQueryParams?: string\n) => Promise<any>;\n\ntype ExecuteAdHocAndMapLookups = (\n  searchObject: any,\n  apiMethodId: string | null | undefined,\n  lookupsMap: Record<string, LookupConfig> | null | undefined,\n  replaceCache: boolean | null | undefined,\n  showSnackbars?: boolean | null | undefined\n) => Promise<any>;\n\nexport interface UseQueryExecutorsReturn {\n  executeQueryInstanceAndMapLookups: ExecuteInstanceAndMapLookups;\n  executeQueryInstanceWithObjectAndMapLookups: ExecuteInstanceWithObjectAndMapLookups;\n  executeQueryAdHocAndMapLookups: ExecuteAdHocAndMapLookups;\n  getCleanData: (data: any, lookupsMap: Record<string, LookupConfig> | null | undefined) => any;\n  getLookup: (lookupId: string) => any;\n}\n\nexport const useQueryExecutors = (): UseQueryExecutorsReturn => {\n  const { lookupApiMethodId, lookupsDataMap, setLookupsDataMap } =\n    useLookupsStore();\n\n  const getLookupById = useCallback(\n    (lookupId: string) => {\n      if (!lookupsDataMap || !lookupId) {\n        return null;\n      }\n      return lookupsDataMap[lookupId];\n    },\n    [lookupsDataMap]\n  );\n\n  const getMappedSearchResults: (\n    lookups: LookupCollection,\n    searchResults: QueryResult\n  ) => QueryResult = (\n    lookups = {},\n    searchResults = {\n      pageList: [],\n      countable: false,\n      total: 0,\n      eagerLoad: false,\n      aggregateResults: [],\n      aliasMap: [],\n      lookupsMap: []\n    }\n  ) => {\n      const mapLookup = (item: Record<string, any>) => {\n        const updatedItem: Record<string, any> = { ...item };\n\n        Object.keys(lookups).forEach((attribute) => {\n          const lookup = lookups[attribute];\n          const propertyValue = (item as any)[attribute];\n\n          if (propertyValue !== null && propertyValue !== undefined) {\n            const matchingLookupRow = lookup?.data?.find((row) => {\n              const keys = lookup.udpLookupUdpLookupKey ?? (lookup.keyName ? [{ name: lookup.keyName }] : []);\n              if (!keys.length) return false;\n              const r = row as Record<string, unknown>;\n              return keys.every((k: { name: string }) =>\n                r[k.name] != null && String(r[k.name] as string | number) === String(item[k.name])\n              );\n            });\n\n            if (matchingLookupRow && lookup.valueName) {\n              updatedItem[attribute] = matchingLookupRow[lookup.valueName];\n            }\n          }\n        });\n\n        return updatedItem;\n      };\n      const updatedPageList = searchResults.pageList.map(mapLookup);\n      const updatedAggregateResults =\n        searchResults?.aggregateResults?.map?.(mapLookup);\n\n      return {\n        ...searchResults,\n        pageList: updatedPageList,\n        aggregateResults: updatedAggregateResults\n      };\n    };\n\n  const processQueryResponseWithLookups = useCallback(\n    async (\n      lookupApiMethodId: string,\n      response: any,\n      replaceCache: boolean | null | undefined,\n      showSnackbars: boolean | null | undefined,\n      lookupDataMap: object | null | undefined\n    ) => {\n      let resultData: QueryResult = new QueryResult();\n      let lookupsMap = {};\n      if (response?.status === 200) {\n        lookupsMap = lookupDataMap || response?.data?.lookupsMap || {};\n        resultData = response.data;\n      } else {\n        showSnackbars && handleResponseErrors('Could not retrieve query data');\n        return null;\n      }\n\n      // Keys are a list of Entity Properties\n      const promises: Array<Promise<any>> = [];\n      const lookups: LookupCollection = {};\n\n      Object.keys(lookupsMap).forEach((key: string) => {\n        const lookupConfig = lookupsMap[key];\n        if (lookupConfig?.value) {\n          const existingLookup =\n            !replaceCache && getLookupById(lookupConfig.value);\n          const lookupQueryData = { id: lookupConfig.value };\n\n          if (!existingLookup) {\n            promises.push(\n              executeQueryWithParameters(\n                { data: lookupQueryData },\n                lookupApiMethodId\n              )\n                .then((response) => {\n                  if (response?.status === 200 && response?.data) {\n                    const lookupConfig = lookupsMap[key];\n                    lookups[key] = {\n                      data: response.data.data,\n                      keyName:\n                        lookupConfig.lookupKeyName || response.data.keyName,\n                      // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n                      udpLookupUdpLookupKey: response.data.udpLookupUdpLookupKey,\n                      valueName:\n                        lookupConfig.lookupValueName || response.data.valueName,\n                      businessObjectKey: response.data.businessObjectKey,\n                      ...response.data\n                    };\n                    setLookupsDataMap(\n                      { [response.data.id]: response.data },\n                      replaceCache\n                    );\n                  }\n                })\n                .catch((e) => e)\n            );\n          } else {\n            lookups[key] = {\n              data: existingLookup.data,\n              keyName: lookupConfig.lookupKeyName || existingLookup.keyName,\n              // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access\n              udpLookupUdpLookupKey: existingLookup.udpLookupUdpLookupKey,\n              valueName:\n                lookupConfig.lookupValueName || existingLookup.valueName,\n              businessObjectKey: existingLookup.businessObjectKey,\n              ...existingLookup\n            };\n          }\n        }\n      });\n\n      await Promise.all(promises);\n\n      resultData = getMappedSearchResults(lookups, resultData);\n      return resultData;\n    },\n    [getLookupById]\n  );\n\n  const executeQueryAdHocAndMapLookups: ExecuteAdHocAndMapLookups = useCallback(\n    async (\n      searchObject: any = {},\n      apiMethodId: string | null | undefined,\n      lookupsMap: Record<string, LookupConfig> | null | undefined,\n      replaceCache: boolean | null | undefined,\n      showSnackbars: boolean | null | undefined = false\n    ) => {\n      if (!lookupApiMethodId) {\n        console.info('Udp Lookup Api Method Id NOT Set');\n      }\n      console.info('Udp Lookup Api Method Id IS Set');\n\n      const response = await executeQueryAdHoc(searchObject || {}, apiMethodId);\n\n      if (lookupApiMethodId) {\n        return await processQueryResponseWithLookups(\n          lookupApiMethodId,\n          response,\n          replaceCache,\n          showSnackbars,\n          lookupsMap\n        );\n      }\n      return response?.data;\n    },\n    [lookupApiMethodId, processQueryResponseWithLookups]\n  );\n\n  const executeQueryInstanceAndMapLookups: ExecuteInstanceAndMapLookups = useCallback(\n    async (\n      queryParams: any = {},\n      apiMethodInstanceId: string | null | undefined,\n      replaceCache: boolean | null | undefined,\n      showSnackbars: boolean | null | undefined = false,\n      urlQueryParams: string = ''\n    ) => {\n      if (!lookupApiMethodId) {\n        console.info('Udp Lookup Api Method Id NOT Set');\n        // return null;\n      }\n      console.info('Udp Lookup Api Method Id IS Set');\n\n      const response = await executeQueryInstance(\n        { data: queryParams || {} },\n        apiMethodInstanceId,\n        urlQueryParams\n      );\n\n      if (lookupApiMethodId) {\n        return await processQueryResponseWithLookups(\n          lookupApiMethodId,\n          response,\n          replaceCache,\n          showSnackbars,\n          null\n        );\n      }\n      return response?.data;\n    },\n    [lookupApiMethodId, processQueryResponseWithLookups]\n  );\n\n  const executeQueryInstanceWithObjectAndMapLookups: ExecuteInstanceWithObjectAndMapLookups = useCallback(\n    async (\n      queryParams: any = {},\n      apiMethodInstance: ApiMethodInstance | null | undefined | any,\n      replaceCache: boolean | null | undefined,\n      showSnackbars: boolean | null | undefined = false,\n      urlQueryParams: string = ''\n    ) => {\n      if (!lookupApiMethodId) {\n        console.info('Udp Lookup Api Method Id NOT Set');\n        // return null;\n      }\n      console.info('Udp Lookup Api Method Id IS Set');\n\n      const response = await executeQueryInstanceWithApiMethodInstance(\n        {\n          data: { queryParams: queryParams || {}, apiMethodInstance }\n        },\n        urlQueryParams\n      );\n\n      if (lookupApiMethodId) {\n        return await processQueryResponseWithLookups(\n          lookupApiMethodId,\n          response,\n          replaceCache,\n          showSnackbars,\n          null\n        );\n      }\n      return response?.data;\n    },\n    [lookupApiMethodId, processQueryResponseWithLookups]\n  );\n\n  const getLookup = useCallback(\n    async (lookupId: string) => {\n      const cachedLookup = getLookupById(lookupId);\n      if (cachedLookup) {\n        return cachedLookup;\n      }\n      if (lookupApiMethodId) {\n        try {\n          const response = await executeQueryWithParameters(\n            { data: { id: lookupId } },\n            lookupApiMethodId\n          );\n          if (response?.status === 200 && response?.data) {\n            return response;\n          }\n        } catch (e) {\n          // handle or rethrow\n        }\n      }\n      return null;\n    },\n    [lookupApiMethodId, getLookupById]\n  );\n\n  const getCleanData = useCallback(\n    async (data: any, lookupsMap: Record<string, LookupConfig> | null | undefined) => {\n      let cleanData = cloneDeep(data);\n      if (lookupsMap && cleanData) {\n        await Promise.all(\n          Object.keys(lookupsMap).map(async (attribute) => {\n            const lookupConfig = lookupsMap[attribute];\n            const lookup = await getLookup(lookupConfig.value); // ← await here\n            if (!lookup) return;\n\n            if (Array.isArray(cleanData)) {\n              cleanData.forEach((row, index) => {\n                const currentValue = row[attribute];\n                const temp = lookup.data?.find(\n                  (item) => item[lookup.valueName] === currentValue\n                );\n                if (temp != null) cleanData[index][attribute] = temp[lookup.keyName];\n              });\n            } else if (cleanData[attribute]) {\n              const currentValue = cleanData[attribute];\n              const temp = lookup.data?.find(\n                (item) => item[lookup.valueName] === currentValue\n              );\n              if (temp != null) cleanData[attribute] = temp[lookup.keyName];\n            }\n          })\n        );\n      }\n      return cleanData;\n    },\n    [getLookup]\n  );\n\n  return {\n    executeQueryInstanceAndMapLookups: executeQueryInstanceAndMapLookups,\n    executeQueryInstanceWithObjectAndMapLookups: executeQueryInstanceWithObjectAndMapLookups,\n    executeQueryAdHocAndMapLookups: executeQueryAdHocAndMapLookups,\n    getCleanData: getCleanData,\n    getLookup: getLookup\n  };\n};\n"],"mappings":"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"}