{"version":3,"file":"SearchUtilities.mjs","names":["useCallback","useMemo","SearchGroupingType","LogicalSearchOperatorEnums","UdpSearchEnums","DateTime","IANAZone","FilterObject","Search","SearchFilters","SearchFilterGroups","BasicSearchFilter","AgGridFilterOperators","AgGridFilterTypes","SearchValueType","SqlFilterOperators","useUser","FilterElementParamType","getSearchObject","searchFilterElements","page","pageSize","eagerLoad","logicalSearchOperator","searchFilterGroups","And","searchObject","pageNumber","filterElements","filterGroups","orderElements","groupingType","groupProperty","groupOperationList","forEach","property","formattedPropertyName","searchField","sortDirection","orderElement","sortColumn","push","distinct","Distinct","getApiMethodIdByPath","apiMethodList","Array","path","apiMethodId","foundApiMethod","find","method","includes","getSearchIdentifiers","catalogObjects","catalogObjectName","businessObjectKeyFieldNames","properties","name","extendedProperties","identifier","catalogReturnObject","matchingCatalogObject","co","split","filter","map","useConvertFilterModelToSearchFilters","filterModel","t0","$","_c","timeZone","undefined","user","tz","additionalProperties","activeUtilityTimeZone","t1","isValidZone","validTimeZone","zone","t2","t3","searchFilters","Object","entries","item","field","operator","type","value","filterType","DATE","dateFilterValueWithoutTime","dateFrom","substring","dateSplit","date","Date","filterDateTimeMidnight","fromJSDate","setZone","keepLocalTime","dateString","toJSDate","toISOString","SET","values","join","IN","bb78","toLowerCase","CONTAINS","LIKE","EQUALS","Type_DateTime","NOT_EQUALS","GREATER_THAN","GREATER_THAN_OR_EQUAL","LESS_THAN","LESS_THAN_OR_EQUAL","STARTSWITH","IN_RANGE","BETWEEN","NUMBER","filterTo","dateFilterValueWithoutTime_0","dateTo","dateSplit_0","date_0","filterDateTimeMidnight_0","dateString_0","ENDSWITH","searchValue","searchOperator","searchValueType","groupId","convertFilterModelToSearchFilters","parseSearchParamsIntoFilterObjects","qs","URLSearchParams","window","location","search","filterObjects","key","startsWith","UdpQueryParamPrefix","keyParts","searchOperatorRaw","toUpperCase"],"sources":["../../../src/utilities/search/SearchUtilities.ts"],"sourcesContent":["import { useCallback, useMemo } from 'react';\nimport {\n  SearchGroupingType,\n  LogicalSearchOperatorEnums,\n  UdpSearchEnums\n} from '../../enums/unitySystemEnums';\nimport { DateTime, IANAZone } from 'luxon';\nimport {\n  FilterObject,\n  Search,\n  SearchFilters,\n  SearchFilterGroups,\n  BasicSearchFilter\n} from './Search';\nimport {\n  AgGridFilterOperators,\n  AgGridFilterTypes,\n  SearchValueType,\n  SqlFilterOperators\n} from '../../enums/aggridEnums';\nimport { useUser } from '../auth/useUser';\nimport { FilterElementParamType } from '../../enums/searchEnums';\n\nexport const getSearchObject: (\n  searchFilterElements: SearchFilters[],\n  page: number,\n  pageSize: number,\n  eagerLoad?: boolean,\n  logicalSearchOperator?: LogicalSearchOperatorEnums,\n  searchFilterGroups?: SearchFilterGroups[]\n) => Search = (\n  searchFilterElements,\n  page,\n  pageSize,\n  eagerLoad = false,\n  logicalSearchOperator = LogicalSearchOperatorEnums.And,\n  searchFilterGroups = []\n) => {\n  const searchObject: Search = {\n    pageNumber: page || 1,\n    pageSize: pageSize || 20,\n    filterElements: [],\n    filterGroups: [],\n    orderElements: [],\n    groupingType: '',\n    groupProperty: [],\n    groupOperationList: [],\n    eagerLoad: eagerLoad,\n    logicalSearchOperator: logicalSearchOperator\n  };\n\n  if (searchFilterElements) {\n    searchFilterElements.forEach((property) => {\n      const formattedPropertyName = property.searchField;\n      // adds order elements\n      if ('sortDirection' in property && property.sortDirection) {\n        const orderElement = {\n          sortColumn: formattedPropertyName,\n          sortDirection: property.sortDirection as string\n        };\n        searchObject.orderElements.push(orderElement);\n      } else {\n        // An object from searchFilterElements should be added filterElements only if it is not an orderElement (i.e. it has no sortDirection)\n        searchObject.filterElements.push(property);\n      }\n      if ('distinct' in property && property.distinct) {\n        searchObject.groupingType = SearchGroupingType.Distinct;\n        searchObject.groupProperty?.push(formattedPropertyName);\n      }\n    });\n  }\n\n  searchObject.filterGroups = searchFilterGroups;\n\n  return searchObject;\n};\nexport const getApiMethodIdByPath: (\n  apiMethodList: Array<{ path: string; apiMethodId?: string | number }>,\n  path: string\n) => string | number | null = (apiMethodList, path) => {\n  const foundApiMethod = apiMethodList.find((method) =>\n    path.includes(method.path)\n  );\n  return foundApiMethod?.apiMethodId ?? null;\n};\n\nexport const getSearchIdentifiers = (\n  catalogObjects: Array<{\n    catalogObjectName?: string;\n    businessObjectKeyFieldNames?: string;\n    properties?: Array<{\n      name: string;\n      extendedProperties?: { identifier?: boolean };\n    }>;\n  }>,\n  catalogReturnObject: string\n): string[] => {\n  if (!catalogObjects) return [];\n  const matchingCatalogObject = catalogObjects.find(\n    (co) => co.catalogObjectName === catalogReturnObject\n  );\n  // Catalogs imported from regenerated backends carry the primary key field\n  // names at the object level, in the same order as the values in\n  // BusinessObjectKey. Older catalogs fall back to identifier-flagged\n  // properties in catalog order (ambiguous for composite keys).\n  const businessObjectKeyFieldNames =\n    matchingCatalogObject?.businessObjectKeyFieldNames;\n  if (businessObjectKeyFieldNames) {\n    return businessObjectKeyFieldNames.split(',');\n  }\n  const properties = matchingCatalogObject?.properties?.filter(\n    (property) => property?.extendedProperties?.identifier\n  );\n  return properties?.map((property) => property.name) ?? [];\n};\n\n/**\n * Returns a reference to a function that takes an Ag-grid FilterModel object and\n * processes it to create an array of SearchFilters.\n * @param timeZone string or null;\n * @returns Function for processing Ag-grid FilterModel\n */\nexport const useConvertFilterModelToSearchFilters: () => (\n  filterModel: any\n) => SearchFilters[] = (timeZone: string | null = null) => {\n  const user = useUser();\n\n  const zone = useMemo(() => {\n    let tz =\n      // @ts-ignore - legacy user.additionalProperties is untyped/unknown\n      timeZone ?? user?.additionalProperties?.activeUtilityTimeZone ?? 'local';\n    const validTimeZone =\n      tz !== 'local' &&\n      // @ts-ignore - legacy user.additionalProperties is untyped/unknown\n      (tz === user?.additionalProperties?.activeUtilityTimeZone ||\n        IANAZone.isValidZone(tz))\n        ? tz\n        : 'local'; // IANAZone.isValidZone is very slow, skip it if known valid timeZone passed\n    return validTimeZone;\n  }, [timeZone, user]);\n\n  const convertFilterModelToSearchFilters = useCallback(\n    (filterModel: any = null) => {\n      if (!filterModel) {\n        return [];\n      }\n      let searchFilters: SearchFilters[] = [];\n      searchFilters = Object.entries(filterModel).map(\n        (item: FilterObject | any) => {\n          let field = item[0];\n          let operator;\n          let type;\n          let value;\n          // Set the filter value; dependent on filter type (e.g. Date, Set, etc.)\n          if (item[1]?.filterType === AgGridFilterTypes.DATE) {\n            // Applies the applicable timezone to the date filter value for usage when\n            // constructing the database query.\n            let dateFilterValueWithoutTime = item[1]?.dateFrom?.substring(\n              0,\n              10\n            ); // e.g. 2022-02-05\n            let dateSplit = dateFilterValueWithoutTime.split('-');\n            let date = new Date(dateSplit[0], dateSplit[1] - 1, dateSplit[2]);\n            const filterDateTimeMidnight = DateTime.fromJSDate(date).setZone(\n              zone,\n              { keepLocalTime: true }\n            );\n            let dateString = filterDateTimeMidnight.toJSDate().toISOString();\n            value = dateString;\n          } else if (item[1]?.filterType === AgGridFilterTypes.SET) {\n            value = item[1].values.join(',');\n            operator = SqlFilterOperators.IN;\n          } else {\n            value = item[1]?.filter;\n          }\n\n          switch (item[1]?.type?.toLowerCase()) {\n            case AgGridFilterOperators.CONTAINS:\n              operator = SqlFilterOperators.LIKE;\n              break;\n            case AgGridFilterOperators.EQUALS:\n              operator = SqlFilterOperators.EQUALS;\n              if (item[1]?.filterType === AgGridFilterTypes.DATE) {\n                type = SearchValueType.Type_DateTime;\n              }\n              break;\n            case AgGridFilterOperators.NOT_EQUALS:\n              operator = SqlFilterOperators.NOT_EQUALS;\n              break;\n            case AgGridFilterOperators.GREATER_THAN:\n              operator = SqlFilterOperators.GREATER_THAN;\n              break;\n            case AgGridFilterOperators.GREATER_THAN_OR_EQUAL:\n              operator = SqlFilterOperators.GREATER_THAN_OR_EQUAL;\n              break;\n            case AgGridFilterOperators.LESS_THAN:\n              operator = SqlFilterOperators.LESS_THAN;\n              break;\n            case AgGridFilterOperators.LESS_THAN_OR_EQUAL:\n              operator = SqlFilterOperators.LESS_THAN_OR_EQUAL;\n              break;\n            case AgGridFilterOperators.STARTSWITH:\n              operator = SqlFilterOperators.STARTSWITH;\n              break;\n            case AgGridFilterOperators.IN_RANGE:\n              operator = SqlFilterOperators.BETWEEN;\n              if (item[1]?.filterType === AgGridFilterTypes.NUMBER) {\n                value += ',' + item[1]?.filterTo;\n              } else if (item[1]?.filterType === AgGridFilterTypes.DATE) {\n                let dateFilterValueWithoutTime = item[1]?.dateTo?.substring(\n                  0,\n                  10\n                ); // e.g. 2022-02-05\n                let dateSplit = dateFilterValueWithoutTime.split('-');\n                let date = new Date(\n                  dateSplit[0],\n                  dateSplit[1] - 1,\n                  dateSplit[2]\n                );\n                const filterDateTimeMidnight = DateTime.fromJSDate(\n                  date\n                ).setZone(zone, { keepLocalTime: true });\n                let dateString = filterDateTimeMidnight\n                  .toJSDate()\n                  .toISOString();\n                value += ',' + dateString;\n              }\n              break;\n            case AgGridFilterOperators.ENDSWITH:\n              operator = SqlFilterOperators.ENDSWITH;\n              break;\n            default:\n              break;\n          }\n          return {\n            searchField: field,\n            searchValue: value,\n            searchOperator: operator,\n            searchValueType: type,\n            groupId: null\n          };\n        }\n      );\n      return searchFilters;\n    },\n    [zone]\n  );\n\n  return convertFilterModelToSearchFilters;\n};\n\n// Parses the URL search params for UDP search filters\n// e.g. udp_search-FieldName-Operator=Value - udp_search-firstName-like=John\nexport const parseSearchParamsIntoFilterObjects = (): BasicSearchFilter[] => {\n  /* eslint-disable @typescript-eslint/no-unsafe-assignment */\n  const qs = new URLSearchParams(window.location.search);\n  const filterObjects: BasicSearchFilter[] = [];\n  qs.forEach((value, key) => {\n    if (key.startsWith(UdpSearchEnums.UdpQueryParamPrefix)) {\n      const keyParts = key.split('-');\n      const searchField = keyParts[1] || undefined;\n      const searchOperatorRaw = keyParts[2] || undefined;\n      const searchOperator =\n        SqlFilterOperators[searchOperatorRaw.toUpperCase()] || undefined;\n      const searchValue = value || undefined;\n\n      if (searchField && searchOperator && searchValue) {\n        filterObjects.push({\n          searchField,\n          searchOperator,\n          searchValue\n        });\n      }\n    }\n  });\n\n  return filterObjects;\n};\n"],"mappings":"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"}