{"version":3,"file":"SearchServiceDatasource.mjs","names":["LogicalSearchOperatorEnums","SearchGroupingType","SearchSortDirection","getSearchObject","FilterOperators","cloneDeep","SearchServiceDatasource","queryData","apiMethodId","searchFilterElements","logicalSearchOperator","And","executeQuery","storeRowData","lookupsMap","eagerLoad","getCleanData","getRows","params","startRow","endRow","rowGroupCols","groupKeys","valueCols","filterModel","sortModel","request","page","originalSearchObject","searchObject","length","orderElements","forEach","sortItem","formattedPropertyName","colId","charAt","toUpperCase","slice","element","find","sortColumn","sortDirection","sort","push","Object","keys","filterElements","key","filterItem","searchField","searchValue","filter","searchOperator","type","field","groupingType","Distinct","groupProperty","includes","Asc","index","rowGroupCol","currentNode","api","forEachNode","node","nodeKey","toLowerCase","data","cleanData","formattedPropertyNameForSearch","searchIndex","pageList","success","rowData","rowCount","parseInt","total","response","catch","e","status"],"sources":["../../../../src/utilities/aggrid/datasources/SearchServiceDatasource.js"],"sourcesContent":["import {\n  LogicalSearchOperatorEnums,\n  SearchGroupingType,\n  SearchSortDirection\n} from '../../../enums/unitySystemEnums';\nimport { getSearchObject } from '../../search/SearchUtilities';\nimport { FilterOperators } from '../../../models/SearchOperator';\nimport { cloneDeep } from 'lodash-es';\n\nexport const SearchServiceDatasource = (\n  queryData,\n  apiMethodId,\n  searchFilterElements,\n  logicalSearchOperator = LogicalSearchOperatorEnums.And,\n  executeQuery,\n  storeRowData,\n  lookupsMap,\n  eagerLoad = false,\n  getCleanData = null\n) => {\n  return {\n    async getRows(params) {\n      const {\n        startRow,\n        endRow,\n        rowGroupCols,\n        groupKeys,\n        valueCols,\n        filterModel,\n        sortModel\n      } = params.request;\n      const page = endRow / 20;\n      const originalSearchObject = getSearchObject(\n        searchFilterElements,\n        page,\n        null,\n        eagerLoad,\n        logicalSearchOperator\n      );\n\n      const searchObject = cloneDeep(originalSearchObject);\n\n      // handle server-side sorting on ag-grid\n      if (sortModel.length) {\n        const orderElements = searchObject.orderElements;\n        sortModel.forEach((sortItem) => {\n          const formattedPropertyName =\n            sortItem.colId.charAt(0).toUpperCase() + sortItem.colId.slice(1);\n          const element = orderElements.find(\n            (element) => element.sortColumn === formattedPropertyName\n          );\n          if (element) {\n            element.sortDirection = sortItem.sort.toUpperCase();\n          } else {\n            orderElements.push({\n              sortColumn: formattedPropertyName,\n              sortDirection: sortItem.sort.toUpperCase()\n            });\n          }\n        });\n      }\n\n      // handle server-side filtering on ag-grid\n      if (Object.keys(filterModel).length) {\n        const filterElements = searchObject.filterElements;\n        Object.keys(filterModel).forEach((key) => {\n          const filterItem = filterModel[key];\n          const formattedPropertyName =\n            key.charAt(0).toUpperCase() + key.slice(1);\n          filterElements.push({\n            searchField: formattedPropertyName,\n            searchValue: filterItem.filter,\n            searchOperator: FilterOperators[filterItem.type]\n          });\n        });\n      }\n\n      // construct search for initial grouping\n      if (rowGroupCols.length && !groupKeys.length) {\n        const formattedPropertyName =\n          rowGroupCols[0].field.charAt(0).toUpperCase() +\n          rowGroupCols[0].field.slice(1);\n        searchObject.groupingType = SearchGroupingType.Distinct;\n        if (!searchObject.groupProperty.includes(formattedPropertyName)) {\n          searchObject.groupProperty.push(formattedPropertyName);\n\n          const orderElements = searchObject.orderElements;\n          const element = orderElements.find(\n            (element) => element.sortColumn === formattedPropertyName\n          );\n          if (!element) {\n            orderElements.push({\n              sortColumn: formattedPropertyName,\n              sortDirection: SearchSortDirection.Asc\n            });\n          }\n        }\n      }\n\n      // construct the filter for grouped columns\n      if (groupKeys.length) {\n        // construct search for last grouped element\n        if (groupKeys.length === rowGroupCols.length) {\n          searchObject.groupingType = '';\n          const filterElements = searchObject.filterElements;\n          groupKeys.forEach((key, index) => {\n            const rowGroupCol = rowGroupCols[index];\n            const formattedPropertyName =\n              rowGroupCol.field.charAt(0).toUpperCase() +\n              rowGroupCol.field.slice(1);\n            const element = filterElements.find(\n              (element) => element.searchField === formattedPropertyName\n            );\n\n            let currentNode = null;\n            params.api.forEachNode((node) => {\n              const nodeKey = node.field;\n              if (\n                nodeKey?.toLowerCase() ===\n                  formattedPropertyName?.toLowerCase() &&\n                node?.data?.[nodeKey] === key\n              ) {\n                currentNode = node;\n                return;\n              }\n            });\n            let searchValue = key;\n            if (currentNode) {\n              const cleanData = getCleanData\n                ? getCleanData(currentNode.data, lookupsMap)\n                : null;\n              if (cleanData) {\n                searchValue = cleanData[currentNode.field];\n              }\n            }\n\n            if (element) {\n              element.searchValue = searchValue;\n              element.searchOperator = '=';\n            } else {\n              filterElements.push({\n                searchField: formattedPropertyName,\n                searchValue: searchValue,\n                searchOperator: '='\n              });\n            }\n          });\n        } else {\n          // construct search for the next grouped element\n          groupKeys.forEach((key, index) => {\n            const formattedPropertyNameForSearch =\n              rowGroupCols[index].field.charAt(0).toUpperCase() +\n              rowGroupCols[index].field.slice(1);\n\n            let currentNode = null;\n            params.api.forEachNode((node) => {\n              const nodeKey = node.field;\n              if (\n                nodeKey?.toLowerCase() ===\n                  formattedPropertyNameForSearch?.toLowerCase() &&\n                node?.data?.[nodeKey] === key\n              ) {\n                currentNode = node;\n                return;\n              }\n            });\n            let searchValue = key;\n            if (currentNode) {\n              const cleanData = getCleanData\n                ? getCleanData(currentNode.data, lookupsMap)\n                : null;\n              if (cleanData) {\n                searchValue = cleanData[currentNode.field];\n              }\n            }\n\n            searchObject.filterElements.push({\n              searchField: formattedPropertyNameForSearch,\n              searchValue: searchValue,\n              searchOperator: '='\n            });\n          });\n\n          searchObject.groupingType = SearchGroupingType.Distinct;\n          const searchIndex = groupKeys.length;\n          const rowGroupCol = rowGroupCols[searchIndex];\n          const formattedPropertyName =\n            rowGroupCol.field.charAt(0).toUpperCase() +\n            rowGroupCol.field.slice(1);\n\n          if (!searchObject.groupProperty.includes(formattedPropertyName)) {\n            searchObject.groupProperty.push(formattedPropertyName);\n\n            const orderElements = searchObject.orderElements;\n            const element = orderElements.find(\n              (element) => element.sortColumn === formattedPropertyName\n            );\n            if (!element) {\n              orderElements.push({\n                sortColumn: formattedPropertyName,\n                sortDirection: SearchSortDirection.Asc\n              });\n            }\n          }\n        }\n      }\n\n      if (\n        !startRow &&\n        rowGroupCols.length === 0 &&\n        !sortModel.length &&\n        !Object.keys(filterModel).length &&\n        !groupKeys.length &&\n        queryData\n      ) {\n        if (queryData.pageList && queryData.pageList) {\n          params.success({\n            rowData: queryData.pageList,\n            rowCount: parseInt(queryData.total)\n          });\n          if (storeRowData) {\n            storeRowData(queryData.pageList);\n          }\n        } else {\n          // TODO: add an overlay to display no rows\n          params.success({\n            rowData: [],\n            rowCount: 0\n          });\n          if (storeRowData) {\n            storeRowData([]);\n          }\n        }\n      } else {\n        let response = null;\n        if (executeQuery) {\n          const data = { data: searchObject };\n          response = await executeQuery(data, apiMethodId, lookupsMap).catch(\n            (e) =>\n              params.success({\n                rowData: [],\n                rowCount: 0\n              })\n          );\n        }\n        const rowData = response?.status === 200 ? response?.data : response;\n        if (rowData && response) {\n          if (rowData?.pageList?.length > 0) {\n            params.success({\n              rowData: rowData.pageList,\n              rowCount: parseInt(rowData.total)\n            });\n            if (storeRowData) {\n              storeRowData(rowData.pageList);\n            }\n          } else {\n            params.success({\n              rowData: [],\n              rowCount: 0\n            });\n            if (storeRowData) {\n              storeRowData([]);\n            }\n          }\n        } else {\n          params.success({\n            rowData: [],\n            rowCount: 0\n          });\n          if (storeRowData) {\n            storeRowData([]);\n          }\n        }\n      }\n    }\n  };\n};\n"],"mappings":"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"}