dinocollab-core 2.2.40 → 2.2.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/src/data-surface/view-list/helpers.js +1 -1
  2. package/dist/src/data-surface/view-list/helpers.js.map +1 -1
  3. package/dist/src/data-surface/view-list/index.js +1 -1
  4. package/dist/src/data-surface/view-list/index.js.map +1 -1
  5. package/dist/src/data-surface/view-list/styled.js.map +1 -1
  6. package/dist/src/filter-bar/components/filter-summary.js +1 -1
  7. package/dist/src/filter-bar/components/filter-summary.js.map +1 -1
  8. package/dist/src/filter-bar/convert-to-graphql.js +1 -1
  9. package/dist/src/filter-bar/convert-to-graphql.js.map +1 -1
  10. package/dist/src/filter-bar/helpers.js.map +1 -1
  11. package/dist/src/filter-bar/hooks.js +1 -1
  12. package/dist/src/filter-bar/hooks.js.map +1 -1
  13. package/dist/src/filter-bar/index.create.js.map +1 -1
  14. package/dist/src/filter-bar/index.dino.js +1 -1
  15. package/dist/src/filter-bar/index.dino.js.map +1 -1
  16. package/dist/src/filter-bar/menu/create-form-field-boolean.js +2 -0
  17. package/dist/src/filter-bar/menu/create-form-field-boolean.js.map +1 -0
  18. package/dist/src/filter-bar/menu/create-form-field-datetime.js +1 -1
  19. package/dist/src/filter-bar/menu/create-form-field-datetime.js.map +1 -1
  20. package/dist/src/filter-bar/menu/create-form-field-number.js +1 -1
  21. package/dist/src/filter-bar/menu/create-form-field-number.js.map +1 -1
  22. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js +1 -1
  23. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js.map +1 -1
  24. package/dist/src/filter-bar/menu/create-form-field-select.js +1 -1
  25. package/dist/src/filter-bar/menu/create-form-field-select.js.map +1 -1
  26. package/dist/src/filter-bar/menu/create-form-field-string.js +1 -1
  27. package/dist/src/filter-bar/menu/create-form-field-string.js.map +1 -1
  28. package/dist/src/filter-bar/menu/create.js +1 -1
  29. package/dist/src/filter-bar/menu/create.js.map +1 -1
  30. package/dist/src/filter-bar/menu/ui.units.js.map +1 -1
  31. package/dist/src/form/helpers.js +1 -1
  32. package/dist/src/form/helpers.js.map +1 -1
  33. package/dist/src/http-service/graphql/request-param.js +1 -1
  34. package/dist/src/http-service/graphql/request-param.js.map +1 -1
  35. package/dist/src/utils/helpers.js +1 -1
  36. package/dist/src/utils/helpers.js.map +1 -1
  37. package/dist/types/filter-bar/convert-to-graphql.d.ts +2 -1
  38. package/dist/types/filter-bar/helpers.d.ts +8 -24
  39. package/dist/types/filter-bar/index.dino.d.ts +3 -0
  40. package/dist/types/filter-bar/menu/create-form-field-boolean.d.ts +55 -0
  41. package/dist/types/filter-bar/menu/types.d.ts +1 -1
  42. package/dist/types/http-service/graphql/request-param.d.ts +9 -3
  43. package/dist/types/utils/helpers.d.ts +30 -0
  44. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"convert-to-graphql.js","sources":["../../../src/filter-bar/convert-to-graphql.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { KeySpecial } from './types'\r\nimport { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\nimport { createRequestBuilder, IFilterOption, RequestParam } from '../http-service/graphql/request-param'\r\nimport { decodeNumberValue } from './menu/create-form-field-number'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType, TFieldValid, TDateLogic, TNumberOperator } from './types'\r\n\r\ntype TFilterScopeFn<TSource, TTarget extends object, U extends object = {}> = (\r\n currentBuilder: RequestParam<TTarget, U>,\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\n/**\r\n * @en\r\n * - Utility class to convert filter state from a filter bar into a GraphQL query builder.\r\n * - Supports mapping filter fields to different GraphQL fields, custom filter logic, and sorting.\r\n * @vi\r\n * - Lớp tiện ích để chuyển đổi trạng thái filter từ filter bar thành builder truy vấn GraphQL.\r\n * - Hỗ trợ ánh xạ các trường filter sang các trường GraphQL khác, logic filter tùy chỉnh và sắp xếp.\r\n */\r\ntype TAutoMapFieldCustomFn<TSource, TTarget extends object, U extends object = {}> = (\r\n currentBuilder: RequestParam<TTarget, U>,\r\n value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>],\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\ntype TAutoMapConfig<TSource, TTarget extends object, U extends object = {}> = {\r\n /**\r\n * @en The target field in the GraphQL schema that this filter field maps to. If not provided, the source field name will be used as the target field.\r\n * @vi Trường đích trong schema GraphQL mà trường filter này ánh xạ tới. Nếu không cung cấp, tên trường nguồn sẽ được sử dụng làm trường đích.\r\n */\r\n targetfield?: keyof TTarget\r\n /**\r\n * @en The operation to apply for the filter field. @default 'contains'\r\n * @vi Thao tác áp dụng cho trường filter. @default 'contains'\r\n */\r\n operation?: 'equal' | 'equalAndAny' | 'contains' | 'datetime' | 'number'\r\n /**\r\n * @en\r\n * - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.\r\n * - Receives the current GraphQL builder, the value of the filter field, and the entire filter store for context.\r\n * @vi\r\n * - Hàm tùy chỉnh để áp dụng logic filter phức tạp không phù hợp với các thao tác 'equal' hoặc 'contains' tiêu chuẩn.\r\n * - Nhận builder GraphQL hiện tại, giá trị của trường filter và toàn bộ store filter để có ngữ cảnh.\r\n */\r\n custom?: TAutoMapFieldCustomFn<TSource, TTarget, U>\r\n}\r\n\r\ntype TAutoMapConfigs<TSource, TTarget extends object, U extends object = {}> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget, U>>>\r\n\r\ntype TFilterOption = {\r\n logic?: TLogic\r\n}\r\n\r\n/** Map logic for filter operations @default 'or' */\r\nexport const mapLogic = (logic?: TLogic): 'And' | 'Or' => {\r\n return logic === 'and' ? 'And' : 'Or'\r\n}\r\n\r\n/** Map sort direction for GraphQL queries @default 'asc' */\r\nexport const mapSortDirection = (direction?: TDirection): 'ASC' | 'DESC' => {\r\n return direction === 'asc' ? 'ASC' : 'DESC'\r\n}\r\n\r\ntype TFilterByTypeOptions = Partial<IFilterOption> & {\r\n mode?: 'equal' | 'contains'\r\n}\r\n\r\nfunction filterByType<TTarget extends object, U extends object = {}>(\r\n field: keyof TTarget,\r\n builder: RequestParam<TTarget, U>,\r\n value: TFieldValid,\r\n option?: TFilterByTypeOptions\r\n) {\r\n const { mode, ...restOption } = option || {}\r\n const valueType = typeof value\r\n switch (valueType) {\r\n case 'string':\r\n if (mode === 'equal') {\r\n builder.filter(field, value.toString(), restOption)\r\n } else {\r\n builder.filterContains(field, value.toString(), restOption)\r\n }\r\n break\r\n case 'number':\r\n builder.filterNumber(field, '==', value.toString(), restOption)\r\n break\r\n default:\r\n console.warn(`Unsupported value type for filtering: ${valueType}. Value:`, value)\r\n }\r\n}\r\n\r\nexport class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object, U extends object = {}> {\r\n private state: TFilterState<TSource>\r\n private graphqlBuilder: RequestParam<TTarget, U>\r\n constructor(state: TFilterState<TSource>) {\r\n this.state = state\r\n this.graphqlBuilder = createRequestBuilder<TTarget, U>({ ignoreEmpty: true })\r\n }\r\n\r\n filterScope(fn: TFilterScopeFn<TSource, TTarget, U>, options?: TFilterOption) {\r\n if (this.state.storeFilter) {\r\n const mergedLogic = options?.logic || this.state.filterLogic || 'and'\r\n const logic = mapLogic(mergedLogic)\r\n this.graphqlBuilder.scope(\r\n (b) => {\r\n fn(b as unknown as RequestParam<TTarget, U>, this.state.storeFilter)\r\n return b\r\n },\r\n { logic }\r\n )\r\n }\r\n return this\r\n }\r\n\r\n filterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption & { isAny?: boolean }) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n if (options?.isAny) {\r\n builder.filterCustom(`${targetField?.toString()}.isAny(${JSON.stringify(values)})`, { logic })\r\n } else {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic, mode: 'equal' })\r\n }\r\n }\r\n }\r\n\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const finalLogic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic: finalLogic, mode: 'contains' })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterDatetime(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n if (fieldValue.dateLogic === 'range' && values.length >= 2) {\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n builder.filterGreaterEqual(targetField, values[0].toString(), {})\r\n builder.filterLessEqual(targetField, values[1].toString(), { logic: 'And' })\r\n }\r\n this.filterScope(fn, options)\r\n } else if (values.length == 1) {\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n switch (fieldValue.dateLogic) {\r\n case 'before':\r\n builder.filterLessEqual(targetField, values[0].toString())\r\n break\r\n case 'after':\r\n builder.filterGreaterEqual(targetField, values[0].toString())\r\n break\r\n case 'on':\r\n default:\r\n builder.filterEqual(targetField, values[0].toString())\r\n break\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n }\r\n return this\r\n }\r\n\r\n filterNumber(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const operatorMap: Record<TNumberOperator, string> = {\r\n eq: '==',\r\n lt: '<',\r\n lte: '<=',\r\n gt: '>',\r\n gte: '>='\r\n }\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n for (const encoded of values) {\r\n const decoded = decodeNumberValue(encoded)\r\n if (!decoded) continue\r\n const op = operatorMap[decoded.operator]\r\n builder.filterNumber(targetField, op, decoded.num.toString(), { logic })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n sort(param?: { seed: { targetField?: TFieldType<TSource>; autoSave?: boolean } }, options?: TFilterOption) {\r\n const store = this.state.storeSort\r\n const { targetField: seedTargetField, autoSave = false } = param?.seed ?? {}\r\n const seedField = seedTargetField ? this.currentObjectMap?.[seedTargetField] : undefined\r\n const seedFromURL = getSeedFromURL()\r\n if (store?.field === KeySpecial.sortShuffle) {\r\n if (!seedField?.targetfield) return this\r\n const seedValue = seedFromURL ?? new Date().getTime().toString()\r\n this.graphqlBuilder.seed(seedField.targetfield, seedValue)\r\n if (autoSave) setSeedToURL(seedValue)\r\n } else {\r\n if (seedFromURL) removeSeedFromURL()\r\n const field = store?.field ? this.currentObjectMap?.[store?.field] : undefined\r\n if (!field?.targetfield) return this\r\n this.graphqlBuilder.sort(field.targetfield, { direction: mapSortDirection(store?.direction) })\r\n }\r\n return this\r\n }\r\n\r\n quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[], options?: TFilterOption) {\r\n if (!this.currentObjectMap) {\r\n console.warn('No autoMap config found, quick search will not work properly without target field mapping.')\r\n }\r\n const fieldValue: TFieldValue = this.state.storeFilter?.quickSearch ?? { values: [], logic: 'or' }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const targetFields = Array.isArray(fields) ? fields : [fields]\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n targetFields.forEach((field) => {\r\n const fieldMap = this.currentObjectMap?.[field]\r\n if (fieldMap && values.length > 0) {\r\n if (fieldMap.custom) {\r\n fieldMap.custom(builder, fieldValue, this.state.storeFilter)\r\n } else if (fieldMap.targetfield) {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(fieldMap.targetfield, builder, values[index], { logic })\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget, U>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget, U>, options?: TFilterOption) => {\r\n this.currentObjectMap = objMap\r\n\r\n if (this.state.storeFilter) {\r\n const keys = Object.keys(this.state.storeFilter) as (keyof TFieldStore<TSource>)[]\r\n // filter the keys that exist in objMap\r\n keys.forEach((key) => {\r\n const mapConfig = objMap[key]\r\n const fieldValue: TFieldValue | undefined = this.state.storeFilter?.[key]\r\n if (mapConfig) {\r\n const { targetfield, operation } = mapConfig\r\n if (mapConfig.custom) {\r\n mapConfig.custom(this.graphqlBuilder, fieldValue, this.state.storeFilter)\r\n return // skip the rest logic if custom function is provided\r\n }\r\n switch (operation) {\r\n case 'equal':\r\n this.filterEqual(key, targetfield, options)\r\n return // break is not needed here because of the return statement\r\n case 'equalAndAny':\r\n this.filterEqual(key, targetfield, { ...options, isAny: true })\r\n return // break is not needed here because of the return statement\r\n case 'datetime':\r\n this.filterDatetime(key, targetfield, options)\r\n return // break is not needed here because of the return statement\r\n case 'number':\r\n this.filterNumber(key, targetfield, options)\r\n return // break is not needed here because of the return statement\r\n case 'contains':\r\n default:\r\n this.filterContains(key, targetfield, options)\r\n return // break is not needed here because of the return statement\r\n }\r\n }\r\n })\r\n }\r\n return this\r\n }\r\n\r\n private prebuildFunc?: (rp: RequestParam<TTarget, U>) => RequestParam<TTarget, U>\r\n prebuild = (func: (requestParam: RequestParam<TTarget, U>) => RequestParam<TTarget, U>) => {\r\n this.prebuildFunc = func\r\n return this\r\n }\r\n\r\n build() {\r\n if (this.prebuildFunc) this.prebuildFunc(this.graphqlBuilder)\r\n return this.graphqlBuilder.build()\r\n }\r\n}\r\n\r\nexport const createConvertToGraphQL = <TSource extends Record<string, any>, TTarget extends object, U extends object = {}>(\r\n state: TFilterState<TSource>\r\n) => {\r\n return new TableFileterConverter<TSource, TTarget, U>(state)\r\n}\r\n"],"names":["mapLogic","logic","mapSortDirection","direction","filterByType","field","builder","value","option","_ref","mode","restOption","_objectWithoutProperties","_excluded","valueType","_typeof","filter","toString","filterContains","filterNumber","console","warn","concat","TableFileterConverter","_createClass","state","_this","this","_classCallCheck","_defineProperty","objMap","options","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","filterEqual","_objectSpread","isAny","filterDatetime","func","prebuildFunc","createRequestBuilder","ignoreEmpty","fn","_this2","mergedLogic","filterLogic","scope","b","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","filterCustom","JSON","stringify","index","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","_this$state$storeFilt6","_this$state$storeFilt7","dateLogic","filterGreaterEqual","filterLessEqual","_this$state$storeFilt8","_this$state$storeFilt9","operatorMap","eq","lt","lte","gt","gte","_step","_iterator","_createForOfIteratorHelper","s","n","done","encoded","decoded","decodeNumberValue","op","operator","num","err","e","f","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref2","seed","seedTargetField","_ref2$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt0","_this$state$storeFilt1","_this3","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"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"}
1
+ {"version":3,"file":"convert-to-graphql.js","sources":["../../../src/filter-bar/convert-to-graphql.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { KeySpecial } from './types'\r\nimport { getSeedFromURL, removeSeedFromURL, setSeedToURL } from './helpers'\r\nimport { createRequestBuilder, IFilterOption, RequestParam } from '../http-service/graphql/request-param'\r\nimport { decodeNumberValue } from './menu/create-form-field-number'\r\n// types\r\nimport type { TFilterState, TFieldStore, TFieldValue, TLogic, TDirection, TFieldType, TFieldValid, TDateLogic, TNumberOperator } from './types'\r\n\r\ntype TFilterScopeFn<TSource, TTarget extends object, U extends object = {}> = (\r\n currentBuilder: RequestParam<TTarget, U>,\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\n/**\r\n * @en\r\n * - Utility class to convert filter state from a filter bar into a GraphQL query builder.\r\n * - Supports mapping filter fields to different GraphQL fields, custom filter logic, and sorting.\r\n * @vi\r\n * - Lớp tiện ích để chuyển đổi trạng thái filter từ filter bar thành builder truy vấn GraphQL.\r\n * - Hỗ trợ ánh xạ các trường filter sang các trường GraphQL khác, logic filter tùy chỉnh và sắp xếp.\r\n */\r\ntype TAutoMapFieldCustomFn<TSource, TTarget extends object, U extends object = {}> = (\r\n currentBuilder: RequestParam<TTarget, U>,\r\n value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>],\r\n store?: TFieldStore<TSource>\r\n) => void\r\n\r\ntype TAutoMapConfig<TSource, TTarget extends object, U extends object = {}> = {\r\n /**\r\n * @en The target field in the GraphQL schema that this filter field maps to. If not provided, the source field name will be used as the target field.\r\n * @vi Trường đích trong schema GraphQL mà trường filter này ánh xạ tới. Nếu không cung cấp, tên trường nguồn sẽ được sử dụng làm trường đích.\r\n */\r\n targetfield?: keyof TTarget\r\n /**\r\n * @en The operation to apply for the filter field. @default 'contains'\r\n * @vi Thao tác áp dụng cho trường filter. @default 'contains'\r\n */\r\n operation?: 'equal' | 'equalAndAny' | 'contains' | 'datetime' | 'number' | 'boolean'\r\n /**\r\n * @en\r\n * - Custom function to apply complex filter logic that doesn't fit standard 'equal' or 'contains' operations.\r\n * - Receives the current GraphQL builder, the value of the filter field, and the entire filter store for context.\r\n * @vi\r\n * - Hàm tùy chỉnh để áp dụng logic filter phức tạp không phù hợp với các thao tác 'equal' hoặc 'contains' tiêu chuẩn.\r\n * - Nhận builder GraphQL hiện tại, giá trị của trường filter và toàn bộ store filter để có ngữ cảnh.\r\n */\r\n custom?: TAutoMapFieldCustomFn<TSource, TTarget, U>\r\n}\r\n\r\ntype TAutoMapConfigs<TSource, TTarget extends object, U extends object = {}> = Partial<Record<keyof TSource, TAutoMapConfig<TSource, TTarget, U>>>\r\n\r\ntype TFilterOption = {\r\n logic?: TLogic\r\n}\r\n\r\n/** Map logic for filter operations @default 'or' */\r\nexport const mapLogic = (logic?: TLogic): 'And' | 'Or' => {\r\n return logic === 'and' ? 'And' : 'Or'\r\n}\r\n\r\n/** Map sort direction for GraphQL queries @default 'asc' */\r\nexport const mapSortDirection = (direction?: TDirection): 'ASC' | 'DESC' => {\r\n return direction === 'asc' ? 'ASC' : 'DESC'\r\n}\r\n\r\ntype TFilterByTypeOptions = Partial<IFilterOption> & {\r\n mode?: 'equal' | 'contains'\r\n}\r\n\r\nfunction filterByType<TTarget extends object, U extends object = {}>(\r\n field: keyof TTarget,\r\n builder: RequestParam<TTarget, U>,\r\n value: TFieldValid,\r\n option?: TFilterByTypeOptions\r\n) {\r\n const { mode, ...restOption } = option || {}\r\n const valueType = typeof value\r\n switch (valueType) {\r\n case 'string':\r\n if (mode === 'equal') {\r\n builder.filter(field, value.toString(), restOption)\r\n } else {\r\n builder.filterContains(field, value.toString(), restOption)\r\n }\r\n break\r\n case 'number':\r\n builder.filterNumber(field, '==', value.toString(), restOption)\r\n break\r\n case 'boolean':\r\n builder.filter(field, value.toString(), restOption)\r\n break\r\n default:\r\n console.warn(`Unsupported value type for filtering: ${valueType}. Value:`, value)\r\n }\r\n}\r\n\r\nexport class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object, U extends object = {}> {\r\n private state: TFilterState<TSource>\r\n private graphqlBuilder: RequestParam<TTarget, U>\r\n constructor(state: TFilterState<TSource>) {\r\n this.state = state\r\n this.graphqlBuilder = createRequestBuilder<TTarget, U>({ ignoreEmpty: true })\r\n }\r\n\r\n filterScope(fn: TFilterScopeFn<TSource, TTarget, U>, options?: TFilterOption) {\r\n if (this.state.storeFilter) {\r\n const mergedLogic = options?.logic || this.state.filterLogic || 'and'\r\n const logic = mapLogic(mergedLogic)\r\n this.graphqlBuilder.scope(\r\n (b) => {\r\n fn(b as unknown as RequestParam<TTarget, U>, this.state.storeFilter)\r\n return b\r\n },\r\n { logic }\r\n )\r\n }\r\n return this\r\n }\r\n\r\n filterEqual(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption & { isAny?: boolean }) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n if (options?.isAny) {\r\n builder.filterCustom(`${targetField?.toString()}.isAny(${JSON.stringify(values)})`, { logic })\r\n } else {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic, mode: 'equal' })\r\n }\r\n }\r\n }\r\n\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterContains(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const finalLogic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(targetField, builder, values[index], { logic: finalLogic, mode: 'contains' })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterDatetime(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n if (fieldValue.dateLogic === 'range' && values.length >= 2) {\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n builder.filterGreaterEqual(targetField, values[0].toString(), {})\r\n builder.filterLessEqual(targetField, values[1].toString(), { logic: 'And' })\r\n }\r\n this.filterScope(fn, options)\r\n } else if (values.length == 1) {\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n switch (fieldValue.dateLogic) {\r\n case 'before':\r\n builder.filterLessEqual(targetField, values[0].toString())\r\n break\r\n case 'after':\r\n builder.filterGreaterEqual(targetField, values[0].toString())\r\n break\r\n case 'on':\r\n default:\r\n builder.filterEqual(targetField, values[0].toString())\r\n break\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n }\r\n return this\r\n }\r\n\r\n filterBoolean(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n for (const val of values) {\r\n // Normalise to actual boolean regardless of whether stored as boolean or string 'true'/'false'\r\n const boolValue = val === true || val === 'true'\r\n builder.filterCustom(`${targetField?.toString()}==${boolValue}`, { logic })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n filterNumber(field: TFieldType<TSource>, targetField?: keyof TTarget, options?: TFilterOption) {\r\n const fieldValue: TFieldValue = this.state.storeFilter?.[field] ?? { values: [] }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty || !targetField) return this\r\n\r\n const operatorMap: Record<TNumberOperator, string> = {\r\n eq: '==',\r\n lt: '<',\r\n lte: '<=',\r\n gt: '>',\r\n gte: '>='\r\n }\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n for (const encoded of values) {\r\n const decoded = decodeNumberValue(encoded)\r\n if (!decoded) continue\r\n const op = operatorMap[decoded.operator]\r\n builder.filterNumber(targetField, op, decoded.num.toString(), { logic })\r\n }\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n sort(param?: { seed: { targetField?: TFieldType<TSource>; autoSave?: boolean } }, options?: TFilterOption) {\r\n const store = this.state.storeSort\r\n const { targetField: seedTargetField, autoSave = false } = param?.seed ?? {}\r\n const seedField = seedTargetField ? this.currentObjectMap?.[seedTargetField] : undefined\r\n const seedFromURL = getSeedFromURL()\r\n if (store?.field === KeySpecial.sortShuffle) {\r\n if (!seedField?.targetfield) return this\r\n const seedValue = seedFromURL ?? new Date().getTime().toString()\r\n this.graphqlBuilder.seed(seedField.targetfield, seedValue)\r\n if (autoSave) setSeedToURL(seedValue)\r\n } else {\r\n if (seedFromURL) removeSeedFromURL()\r\n const field = store?.field ? this.currentObjectMap?.[store?.field] : undefined\r\n if (!field?.targetfield) return this\r\n this.graphqlBuilder.sort(field.targetfield, { direction: mapSortDirection(store?.direction) })\r\n }\r\n return this\r\n }\r\n\r\n quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[], options?: TFilterOption) {\r\n if (!this.currentObjectMap) {\r\n console.warn('No autoMap config found, quick search will not work properly without target field mapping.')\r\n }\r\n const fieldValue: TFieldValue = this.state.storeFilter?.quickSearch ?? { values: [], logic: 'or' }\r\n const values = Array.isArray(fieldValue.values) ? fieldValue.values : [fieldValue.values]\r\n const isValueEmpty = !values || values.length < 1\r\n if (isValueEmpty) return this\r\n\r\n const logic = mapLogic(fieldValue.logic)\r\n const targetFields = Array.isArray(fields) ? fields : [fields]\r\n const fn: TFilterScopeFn<TSource, TTarget, U> = (builder) => {\r\n targetFields.forEach((field) => {\r\n const fieldMap = this.currentObjectMap?.[field]\r\n if (fieldMap && values.length > 0) {\r\n if (fieldMap.custom) {\r\n fieldMap.custom(builder, fieldValue, this.state.storeFilter)\r\n } else if (fieldMap.targetfield) {\r\n for (let index = 0; index < values.length; index++) {\r\n filterByType(fieldMap.targetfield, builder, values[index], { logic })\r\n }\r\n }\r\n }\r\n })\r\n }\r\n this.filterScope(fn, options)\r\n return this\r\n }\r\n\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget, U>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget, U>, options?: TFilterOption) => {\r\n this.currentObjectMap = objMap\r\n\r\n if (this.state.storeFilter) {\r\n const keys = Object.keys(this.state.storeFilter) as (keyof TFieldStore<TSource>)[]\r\n // filter the keys that exist in objMap\r\n keys.forEach((key) => {\r\n const mapConfig = objMap[key]\r\n const fieldValue: TFieldValue | undefined = this.state.storeFilter?.[key]\r\n if (mapConfig) {\r\n const { targetfield, operation } = mapConfig\r\n if (mapConfig.custom) {\r\n mapConfig.custom(this.graphqlBuilder, fieldValue, this.state.storeFilter)\r\n return // skip the rest logic if custom function is provided\r\n }\r\n switch (operation) {\r\n case 'equal':\r\n this.filterEqual(key, targetfield, options)\r\n return // break is not needed here because of the return statement\r\n case 'equalAndAny':\r\n this.filterEqual(key, targetfield, { ...options, isAny: true })\r\n return // break is not needed here because of the return statement\r\n case 'datetime':\r\n this.filterDatetime(key, targetfield, options)\r\n return // break is not needed here because of the return statement\r\n case 'number':\r\n this.filterNumber(key, targetfield, options)\r\n return // break is not needed here because of the return statement\r\n case 'boolean':\r\n this.filterBoolean(key, targetfield, options)\r\n return // break is not needed here because of the return statement\r\n case 'contains':\r\n default:\r\n this.filterContains(key, targetfield, options)\r\n return // break is not needed here because of the return statement\r\n }\r\n }\r\n })\r\n }\r\n return this\r\n }\r\n\r\n private prebuildFunc?: (rp: RequestParam<TTarget, U>) => RequestParam<TTarget, U>\r\n prebuild = (func: (requestParam: RequestParam<TTarget, U>) => RequestParam<TTarget, U>) => {\r\n this.prebuildFunc = func\r\n return this\r\n }\r\n\r\n build() {\r\n if (this.prebuildFunc) this.prebuildFunc(this.graphqlBuilder)\r\n return this.graphqlBuilder.build()\r\n }\r\n}\r\n\r\nexport const createConvertToGraphQL = <TSource extends Record<string, any>, TTarget extends object, U extends object = {}>(\r\n state: TFilterState<TSource>\r\n) => {\r\n return new TableFileterConverter<TSource, TTarget, U>(state)\r\n}\r\n"],"names":["mapLogic","logic","mapSortDirection","direction","filterByType","field","builder","value","option","_ref","mode","restOption","_objectWithoutProperties","_excluded","valueType","_typeof","filter","toString","filterContains","filterNumber","console","warn","concat","TableFileterConverter","_createClass","state","_this","this","_classCallCheck","_defineProperty","objMap","options","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","filterEqual","_objectSpread","isAny","filterDatetime","filterBoolean","func","prebuildFunc","createRequestBuilder","ignoreEmpty","fn","_this2","mergedLogic","filterLogic","scope","b","targetField","_this$state$storeFilt2","_this$state$storeFilt3","values","Array","isArray","length","filterScope","filterCustom","JSON","stringify","index","_this$state$storeFilt4","_this$state$storeFilt5","finalLogic","_this$state$storeFilt6","_this$state$storeFilt7","dateLogic","filterGreaterEqual","filterLessEqual","_this$state$storeFilt8","_this$state$storeFilt9","_step","_iterator","_createForOfIteratorHelper","s","n","done","val","boolValue","err","e","f","_this$state$storeFilt0","_this$state$storeFilt1","operatorMap","eq","lt","lte","gt","gte","_step2","_iterator2","encoded","decoded","decodeNumberValue","op","operator","num","param","_param$seed","_this$currentObjectMa","store","storeSort","_ref2","seed","seedTargetField","_ref2$autoSave","autoSave","seedField","undefined","seedFromURL","getSeedFromURL","KeySpecial","sortShuffle","seedValue","Date","getTime","setSeedToURL","_this$currentObjectMa2","removeSeedFromURL","sort","fields","_this$state$storeFilt10","_this$state$storeFilt11","_this3","quickSearch","targetFields","_this3$currentObjectM","fieldMap","build","createConvertToGraphQL"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../src/filter-bar/helpers.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\nimport { QueryParam } from '../utils/query-param'\r\nimport { KeySpecial, TFilterState } from './types'\r\n\r\nexport const mapSpecialTexts = {\r\n qsTooltip: 'Type to search — the suggestion list shows matching values and the current value.'\r\n}\r\n\r\nexport const mapSpecialLabel: Record<KeySpecial, string> = {\r\n [KeySpecial.quickSearch]: 'Quick Search',\r\n [KeySpecial.sortShuffle]: 'Shuffle Arrangement'\r\n}\r\n\r\nexport interface IFilterStateQueryParams {\r\n filter?: string\r\n}\r\n\r\n/**\r\n * @en Remove null/undefined values from object recursively for accurate comparison.\r\n * @vi Loai bo cac gia tri null/undefined khoi object mot cach de quy de so sanh chinh xac.\r\n */\r\nexport function removeNullValues<T = any>(obj: T): T | undefined {\r\n if (obj === null || obj === undefined) {\r\n return undefined\r\n }\r\n\r\n if (typeof obj !== 'object') {\r\n return obj\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n const cleaned = obj.map(removeNullValues).filter((v) => v !== undefined)\r\n return cleaned.length > 0 ? (cleaned as any) : undefined\r\n }\r\n\r\n const cleaned: any = {}\r\n let hasValue = false\r\n\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const value = removeNullValues(obj[key])\r\n if (value !== undefined) {\r\n cleaned[key] = value\r\n hasValue = true\r\n }\r\n }\r\n }\r\n\r\n return hasValue ? cleaned : undefined\r\n}\r\n\r\n/**\r\n * @en Check if filter state is empty (no filters applied). Null/undefined values are ignored in this check.\r\n * @vi Kiem tra xem filter state co rong khong (khong co filter nao duoc ap dung). Gia tri null/undefined se duoc bo qua trong kiem tra nay.\r\n */\r\nexport function isEmptyFilterState<T>(state?: TFilterState<T>): boolean {\r\n if (!state) return true\r\n const cleaned = removeNullValues(state)\r\n return !cleaned || Object.keys(cleaned).length === 0\r\n}\r\n\r\n/**\r\n * @en Deep comparison of two filter states to check if they are equal.\r\n * @vi So sanh sau hai filter state de kiem tra xem chung co bang nhau khong.\r\n */\r\nexport function isFilterStateEqual<T>(state1?: TFilterState<T>, state2?: TFilterState<T>): boolean {\r\n if (state1 === state2) return true\r\n\r\n try {\r\n // Remove null/undefined values before comparison\r\n const cleaned1 = removeNullValues(state1)\r\n const cleaned2 = removeNullValues(state2)\r\n\r\n if (cleaned1 === cleaned2) return true\r\n if (!cleaned1 || !cleaned2) return false\r\n\r\n return JSON.stringify(cleaned1) === JSON.stringify(cleaned2)\r\n } catch (error) {\r\n console.error('Error comparing filter states:', error)\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * @en Synchronize filter state to URL query parameters. If state equals defaultState, remove from URL to keep it clean.\r\n * @vi Dong bo filter state vao URL query parameters. Neu state bang defaultState, xoa khoi URL de giu URL sach.\r\n *\r\n * @param state - Current filter state to sync\r\n * @param defaultState - Default filter state (if current equals this, don't save to URL)\r\n */\r\nexport function setFilterToURL<T>(state?: TFilterState<T>, defaultState?: TFilterState<T>) {\r\n // If window is undefined (e.g., during SSR), do nothing\r\n if (typeof window === 'undefined') return\r\n\r\n try {\r\n // Extract filterLogic to avoid including it in URL since it's not part of the actual filter criteria\r\n const { filterLogic: fl, ...st } = state || {}\r\n const { filterLogic: dfl, ...dst } = defaultState || {}\r\n\r\n const isEqualToDefault = isFilterStateEqual(st, dst)\r\n const isEmpty = isEmptyFilterState(st)\r\n // If state equals default or is empty, remove from URL\r\n if (isEqualToDefault || isEmpty) {\r\n QueryParam.replaceDeletes<IFilterStateQueryParams>('filter')\r\n return\r\n }\r\n\r\n // Serialize state to JSON and save to URL\r\n const updateParams: IFilterStateQueryParams = { filter: JSON.stringify(st) }\r\n\r\n QueryParam.replacePatch<IFilterStateQueryParams>(updateParams)\r\n } catch (error) {\r\n console.error('Error syncing filter state to URL:', error)\r\n }\r\n}\r\n\r\n/**\r\n * @en Retrieve filter state from URL query parameters.\r\n * @vi Lay filter state tu URL query parameters.\r\n *\r\n * @param defaultState - Default filter state to return if URL has no filter state\r\n * @returns Filter state from URL or defaultState\r\n */\r\nexport function getFilterFromURL<T>(defaultState?: TFilterState<T>): TFilterState<T> | undefined {\r\n // If window is undefined (e.g., during SSR), return defaultState\r\n if (typeof window === 'undefined') return defaultState\r\n\r\n try {\r\n const q = QueryParam.gets<IFilterStateQueryParams>('filter')\r\n\r\n if (!q.filter) return defaultState\r\n\r\n // Parse JSON from URL\r\n const state = JSON.parse(q.filter) as TFilterState<T>\r\n const isEmpty = isEmptyFilterState(state)\r\n return isEmpty ? defaultState : state\r\n } catch (error) {\r\n console.error('Error getting filter state from URL:', error)\r\n return defaultState\r\n }\r\n}\r\n\r\n/**\r\n * @en Set seed value to URL for shuffle sorting. If seed is undefined, remove from URL.\r\n * @vi Dat gia tri seed vao URL de sap xep shuffle. Neu seed khong xac dinh, xoa khoi URL.\r\n * @param seed - Seed value for shuffle sorting\r\n */\r\nexport const setSeedToURL = (seed?: string) => {\r\n if (typeof window === 'undefined') return\r\n try {\r\n if (!seed) {\r\n QueryParam.replaceDeletes('seed')\r\n return\r\n }\r\n QueryParam.replacePatch({ seed })\r\n } catch (error) {\r\n console.error('Error syncing seed to URL:', error)\r\n }\r\n}\r\n\r\n/**\r\n * @en Get seed value from URL for shuffle sorting. Returns undefined if not set or on error.\r\n * @vi Lay gia tri seed tu URL de sap xep shuffle. Tra ve undefined neu khong duoc dat hoac co loi.\r\n * @returns Seed value from URL or undefined\r\n */\r\nexport const getSeedFromURL = (): string | undefined => {\r\n if (typeof window === 'undefined') return undefined\r\n try {\r\n const q = QueryParam.gets<{ seed?: string }>('seed')\r\n return q.seed\r\n } catch (error) {\r\n console.error('Error getting seed from URL:', error)\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * @en Remove seed value from URL.\r\n * @vi Xoa gia tri seed khoi URL.\r\n */\r\nexport const removeSeedFromURL = () => {\r\n if (typeof window === 'undefined') return\r\n try {\r\n QueryParam.replaceDeletes('seed')\r\n } catch (error) {\r\n console.error('Error removing seed from URL:', error)\r\n }\r\n}\r\n"],"names":["mapSpecialTexts","qsTooltip","mapSpecialLabel","_defineProperty","KeySpecial","quickSearch","sortShuffle","removeNullValues","obj","_typeof","Array","isArray","cleaned","map","filter","v","undefined","length","hasValue","key","hasOwnProperty","value","isEmptyFilterState","state","Object","keys","isFilterStateEqual","state1","state2","cleaned1","cleaned2","JSON","stringify","error","console","setFilterToURL","defaultState","window","_ref","st","filterLogic","_objectWithoutProperties","_excluded","_ref2","isEqualToDefault","_excluded2","isEmpty","QueryParam","replaceDeletes","updateParams","replacePatch","getFilterFromURL","q","gets","parse","setSeedToURL","seed","getSeedFromURL","removeSeedFromURL"],"mappings":"2PAKaA,EAAkB,CAC7BC,UAAW,qFAGAC,EAAeC,EAAAA,KACzBC,EAAWC,YAAc,gBACzBD,EAAWE,YAAc,uBAWtB,SAAUC,EAA0BC,GACxC,GAAIA,QAAJ,CAIA,GAAmB,WAAfC,EAAOD,GACT,OAAOA,EAGT,GAAIE,MAAMC,QAAQH,GAAM,CACtB,IAAMI,EAAUJ,EAAIK,IAAIN,GAAkBO,OAAO,SAACC,GAAC,YAAWC,IAAND,IACxD,OAAOH,EAAQK,OAAS,EAAKL,OAAkBI,CAChD,CAED,IAAMJ,EAAe,CAAE,EACnBM,GAAW,EAEf,IAAK,IAAMC,KAAOX,EAChB,GAAIA,EAAIY,eAAeD,GAAM,CAC3B,IAAME,EAAQd,EAAiBC,EAAIW,SACrBH,IAAVK,IACFT,EAAQO,GAAOE,EACfH,GAAW,EAEd,CAGH,OAAOA,EAAWN,OAAUI,CAxB3B,CAyBH,CAMM,SAAUM,EAAsBC,GACpC,IAAKA,EAAO,OAAO,EACnB,IAAMX,EAAUL,EAAiBgB,GACjC,OAAQX,GAA2C,IAAhCY,OAAOC,KAAKb,GAASK,MAC1C,CAMgB,SAAAS,EAAsBC,EAA0BC,GAC9D,GAAID,IAAWC,EAAQ,OAAO,EAE9B,IAEE,IAAMC,EAAWtB,EAAiBoB,GAC5BG,EAAWvB,EAAiBqB,GAElC,OAAIC,IAAaC,MACZD,IAAaC,IAEXC,KAAKC,UAAUH,KAAcE,KAAKC,UAAUF,EACpD,CAAC,MAAOG,GAEP,OADAC,QAAQD,MAAM,iCAAkCA,IACzC,CACR,CACH,CASgB,SAAAE,EAAkBZ,EAAyBa,GAEzD,GAAsB,oBAAXC,OAEX,IAEE,IAAAC,EAAmCf,GAAS,CAAE,EAAlBgB,GAALD,EAAfE,YAAsBC,EAAAH,EAAAI,IAC9BC,EAAqCP,GAAgB,CAAE,EAEjDQ,GAFkBD,EAAhBH,YAEiBd,EAAmBa,EAFZE,EAAAE,EAAAE,KAG1BC,EAAUxB,EAAmBiB,GAEnC,GAAIK,GAAoBE,EAEtB,YADAC,EAAWC,eAAwC,UAKrD,IAAMC,EAAwC,CAAEnC,OAAQiB,KAAKC,UAAUO,IAEvEQ,EAAWG,aAAsCD,EAClD,CAAC,MAAOhB,GACPC,QAAQD,MAAM,qCAAsCA,EACrD,CACH,CASM,SAAUkB,EAAoBf,GAElC,GAAsB,oBAAXC,OAAwB,OAAOD,EAE1C,IACE,IAAMgB,EAAIL,EAAWM,KAA8B,UAEnD,IAAKD,EAAEtC,OAAQ,OAAOsB,EAGtB,IAAMb,EAAQQ,KAAKuB,MAAMF,EAAEtC,QAE3B,OADgBQ,EAAmBC,GAClBa,EAAeb,CACjC,CAAC,MAAOU,GAEP,OADAC,QAAQD,MAAM,uCAAwCA,GAC/CG,CACR,CACH,KAOamB,EAAe,SAACC,GAC3B,GAAsB,oBAAXnB,OACX,IACE,IAAKmB,EAEH,YADAT,EAAWC,eAAe,QAG5BD,EAAWG,aAAa,CAAEM,KAAAA,GAC3B,CAAC,MAAOvB,GACPC,QAAQD,MAAM,6BAA8BA,EAC7C,CACH,EAOawB,EAAiB,WAC5B,GAAsB,oBAAXpB,OACX,IAEE,OADUU,EAAWM,KAAwB,QACpCG,IACV,CAAC,MAAOvB,GAEP,YADAC,QAAQD,MAAM,+BAAgCA,EAE/C,CACH,EAMayB,EAAoB,WAC/B,GAAsB,oBAAXrB,OACX,IACEU,EAAWC,eAAe,OAC3B,CAAC,MAAOf,GACPC,QAAQD,MAAM,gCAAiCA,EAChD,CACH"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/filter-bar/helpers.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\nimport { QueryParam } from '../utils/query-param'\r\nimport { KeySpecial, TFilterState } from './types'\r\n\r\nexport const mapSpecialTexts = {\r\n qsTooltip: 'Type to search — the suggestion list shows matching values and the current value.'\r\n}\r\n\r\nexport const mapSpecialLabel: Record<KeySpecial, string> = {\r\n [KeySpecial.quickSearch]: 'Quick Search',\r\n [KeySpecial.sortShuffle]: 'Shuffle Arrangement'\r\n}\r\n\r\nexport interface IFilterStateQueryParams {\r\n filter?: string\r\n}\r\n\r\n/** Remove null/undefined values from object recursively for accurate comparison. */\r\nexport function removeNullValues<T = any>(obj: T): T | undefined {\r\n if (obj === null || obj === undefined) {\r\n return undefined\r\n }\r\n\r\n if (typeof obj !== 'object') {\r\n return obj\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n const cleaned = obj.map(removeNullValues).filter((v) => v !== undefined)\r\n return cleaned.length > 0 ? (cleaned as any) : undefined\r\n }\r\n\r\n const cleaned: any = {}\r\n let hasValue = false\r\n\r\n for (const key in obj) {\r\n if (obj.hasOwnProperty(key)) {\r\n const value = removeNullValues(obj[key])\r\n if (value !== undefined) {\r\n cleaned[key] = value\r\n hasValue = true\r\n }\r\n }\r\n }\r\n\r\n return hasValue ? cleaned : undefined\r\n}\r\n\r\n/** Check if filter state is empty (no filters applied). Null/undefined values are ignored in this check. */\r\nexport function isEmptyFilterState<T>(state?: TFilterState<T>): boolean {\r\n if (!state) return true\r\n const cleaned = removeNullValues(state)\r\n return !cleaned || Object.keys(cleaned).length === 0\r\n}\r\n\r\n/** Deep comparison of two filter states to check if they are equal. */\r\nexport function isFilterStateEqual<T>(state1?: TFilterState<T>, state2?: TFilterState<T>): boolean {\r\n if (state1 === state2) return true\r\n\r\n try {\r\n // Remove null/undefined values before comparison\r\n const cleaned1 = removeNullValues(state1)\r\n const cleaned2 = removeNullValues(state2)\r\n\r\n if (cleaned1 === cleaned2) return true\r\n if (!cleaned1 || !cleaned2) return false\r\n\r\n return JSON.stringify(cleaned1) === JSON.stringify(cleaned2)\r\n } catch (error) {\r\n console.error('Error comparing filter states:', error)\r\n return false\r\n }\r\n}\r\n\r\n/**\r\n * Synchronize filter state to URL query parameters. If state equals defaultState, remove from URL to keep it clean.\r\n * @param state - Current filter state to sync\r\n * @param defaultState - Default filter state (if current equals this, don't save to URL)\r\n */\r\nexport function setFilterToURL<T>(state?: TFilterState<T>, defaultState?: TFilterState<T>) {\r\n // If window is undefined (e.g., during SSR), do nothing\r\n if (typeof window === 'undefined') return\r\n\r\n try {\r\n // Extract filterLogic to avoid including it in URL since it's not part of the actual filter criteria\r\n const { filterLogic: fl, ...st } = state || {}\r\n const { filterLogic: dfl, ...dst } = defaultState || {}\r\n\r\n const isEqualToDefault = isFilterStateEqual(st, dst)\r\n const isEmpty = isEmptyFilterState(st)\r\n // If state equals default or is empty, remove from URL\r\n if (isEqualToDefault || isEmpty) {\r\n QueryParam.replaceDeletes<IFilterStateQueryParams>('filter')\r\n return\r\n }\r\n\r\n // Serialize state to JSON and save to URL\r\n const updateParams: IFilterStateQueryParams = { filter: JSON.stringify(st) }\r\n\r\n QueryParam.replacePatch<IFilterStateQueryParams>(updateParams)\r\n } catch (error) {\r\n console.error('Error syncing filter state to URL:', error)\r\n }\r\n}\r\n\r\n/**\r\n * Retrieve filter state from URL query parameters.\r\n * @param defaultState - Default filter state to return if URL has no filter state\r\n * @returns Filter state from URL or defaultState\r\n */\r\nexport function getFilterFromURL<T>(defaultState?: TFilterState<T>): TFilterState<T> | undefined {\r\n // If window is undefined (e.g., during SSR), return defaultState\r\n if (typeof window === 'undefined') return defaultState\r\n\r\n try {\r\n const q = QueryParam.gets<IFilterStateQueryParams>('filter')\r\n\r\n if (!q.filter) return defaultState\r\n\r\n // Parse JSON from URL\r\n const state = JSON.parse(q.filter) as TFilterState<T>\r\n const isEmpty = isEmptyFilterState(state)\r\n return isEmpty ? defaultState : state\r\n } catch (error) {\r\n console.error('Error getting filter state from URL:', error)\r\n return defaultState\r\n }\r\n}\r\n\r\n/**\r\n * Set seed value to URL for shuffle sorting. If seed is undefined, remove from URL.\r\n * @param seed - Seed value for shuffle sorting\r\n */\r\nexport const setSeedToURL = (seed?: string) => {\r\n if (typeof window === 'undefined') return\r\n try {\r\n if (!seed) {\r\n QueryParam.replaceDeletes('seed')\r\n return\r\n }\r\n QueryParam.replacePatch({ seed })\r\n } catch (error) {\r\n console.error('Error syncing seed to URL:', error)\r\n }\r\n}\r\n\r\n/**\r\n * Get seed value from URL for shuffle sorting. Returns undefined if not set or on error.\r\n * @returns Seed value from URL or undefined\r\n */\r\nexport const getSeedFromURL = (): string | undefined => {\r\n if (typeof window === 'undefined') return undefined\r\n try {\r\n const q = QueryParam.gets<{ seed?: string }>('seed')\r\n return q.seed\r\n } catch (error) {\r\n console.error('Error getting seed from URL:', error)\r\n return undefined\r\n }\r\n}\r\n\r\n/**\r\n * Remove seed value from URL.\r\n */\r\nexport const removeSeedFromURL = () => {\r\n if (typeof window === 'undefined') return\r\n try {\r\n QueryParam.replaceDeletes('seed')\r\n } catch (error) {\r\n console.error('Error removing seed from URL:', error)\r\n }\r\n}\r\n"],"names":["mapSpecialTexts","qsTooltip","mapSpecialLabel","_defineProperty","KeySpecial","quickSearch","sortShuffle","removeNullValues","obj","_typeof","Array","isArray","cleaned","map","filter","v","undefined","length","hasValue","key","hasOwnProperty","value","isEmptyFilterState","state","Object","keys","isFilterStateEqual","state1","state2","cleaned1","cleaned2","JSON","stringify","error","console","setFilterToURL","defaultState","window","_ref","st","filterLogic","_objectWithoutProperties","_excluded","_ref2","isEqualToDefault","_excluded2","isEmpty","QueryParam","replaceDeletes","updateParams","replacePatch","getFilterFromURL","q","gets","parse","setSeedToURL","seed","getSeedFromURL","removeSeedFromURL"],"mappings":"2PAKaA,EAAkB,CAC7BC,UAAW,qFAGAC,EAAeC,EAAAA,KACzBC,EAAWC,YAAc,gBACzBD,EAAWE,YAAc,uBAQtB,SAAUC,EAA0BC,GACxC,GAAIA,QAAJ,CAIA,GAAmB,WAAfC,EAAOD,GACT,OAAOA,EAGT,GAAIE,MAAMC,QAAQH,GAAM,CACtB,IAAMI,EAAUJ,EAAIK,IAAIN,GAAkBO,OAAO,SAACC,GAAC,YAAWC,IAAND,IACxD,OAAOH,EAAQK,OAAS,EAAKL,OAAkBI,CAChD,CAED,IAAMJ,EAAe,CAAE,EACnBM,GAAW,EAEf,IAAK,IAAMC,KAAOX,EAChB,GAAIA,EAAIY,eAAeD,GAAM,CAC3B,IAAME,EAAQd,EAAiBC,EAAIW,SACrBH,IAAVK,IACFT,EAAQO,GAAOE,EACfH,GAAW,EAEd,CAGH,OAAOA,EAAWN,OAAUI,CAxB3B,CAyBH,CAGM,SAAUM,EAAsBC,GACpC,IAAKA,EAAO,OAAO,EACnB,IAAMX,EAAUL,EAAiBgB,GACjC,OAAQX,GAA2C,IAAhCY,OAAOC,KAAKb,GAASK,MAC1C,CAGgB,SAAAS,EAAsBC,EAA0BC,GAC9D,GAAID,IAAWC,EAAQ,OAAO,EAE9B,IAEE,IAAMC,EAAWtB,EAAiBoB,GAC5BG,EAAWvB,EAAiBqB,GAElC,OAAIC,IAAaC,MACZD,IAAaC,IAEXC,KAAKC,UAAUH,KAAcE,KAAKC,UAAUF,EACpD,CAAC,MAAOG,GAEP,OADAC,QAAQD,MAAM,iCAAkCA,IACzC,CACR,CACH,CAOgB,SAAAE,EAAkBZ,EAAyBa,GAEzD,GAAsB,oBAAXC,OAEX,IAEE,IAAAC,EAAmCf,GAAS,CAAE,EAAlBgB,GAALD,EAAfE,YAAsBC,EAAAH,EAAAI,IAC9BC,EAAqCP,GAAgB,CAAE,EAEjDQ,GAFkBD,EAAhBH,YAEiBd,EAAmBa,EAFZE,EAAAE,EAAAE,KAG1BC,EAAUxB,EAAmBiB,GAEnC,GAAIK,GAAoBE,EAEtB,YADAC,EAAWC,eAAwC,UAKrD,IAAMC,EAAwC,CAAEnC,OAAQiB,KAAKC,UAAUO,IAEvEQ,EAAWG,aAAsCD,EAClD,CAAC,MAAOhB,GACPC,QAAQD,MAAM,qCAAsCA,EACrD,CACH,CAOM,SAAUkB,EAAoBf,GAElC,GAAsB,oBAAXC,OAAwB,OAAOD,EAE1C,IACE,IAAMgB,EAAIL,EAAWM,KAA8B,UAEnD,IAAKD,EAAEtC,OAAQ,OAAOsB,EAGtB,IAAMb,EAAQQ,KAAKuB,MAAMF,EAAEtC,QAE3B,OADgBQ,EAAmBC,GAClBa,EAAeb,CACjC,CAAC,MAAOU,GAEP,OADAC,QAAQD,MAAM,uCAAwCA,GAC/CG,CACR,CACH,KAMamB,EAAe,SAACC,GAC3B,GAAsB,oBAAXnB,OACX,IACE,IAAKmB,EAEH,YADAT,EAAWC,eAAe,QAG5BD,EAAWG,aAAa,CAAEM,KAAAA,GAC3B,CAAC,MAAOvB,GACPC,QAAQD,MAAM,6BAA8BA,EAC7C,CACH,EAMawB,EAAiB,WAC5B,GAAsB,oBAAXpB,OACX,IAEE,OADUU,EAAWM,KAAwB,QACpCG,IACV,CAAC,MAAOvB,GAEP,YADAC,QAAQD,MAAM,+BAAgCA,EAE/C,CACH,EAKayB,EAAoB,WAC/B,GAAsB,oBAAXrB,OACX,IACEU,EAAWC,eAAe,OAC3B,CAAC,MAAOf,GACPC,QAAQD,MAAM,gCAAiCA,EAChD,CACH"}
@@ -1,2 +1,2 @@
1
- import{objectSpread2 as t,defineProperty as e,toConsumableArray as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as i}from"./types.js";var l=function(t,e,r){if(!t)return!1;var i=t[e];if(!i)return!1;var l=r.logic!==i.logic,o=new Set(i.values.map(function(t){return JSON.stringify(t)}).filter(Boolean));return r.values.some(function(t){return o.has(JSON.stringify(t))})&&!l},o=function(t,i,l){var o=null==t?void 0:t[i],n={values:Array.from(new Set([].concat(r((null==o?void 0:o.values)||[]),r(l.values)).filter(Boolean))),logic:l.logic||(null==o?void 0:o.logic)};return Object.assign({},t,e({},i,n))},n=function(i,l,o){var n=null==i?void 0:i[l],a=(null==n?void 0:n.values)||[];if(a.some(function(t){return JSON.stringify(t)===JSON.stringify(o)}))return null!=i?i:{};var s=t(t({},n),{},{values:[].concat(r(a),[o]).filter(Boolean)});return Object.assign({},i,e({},l,s))},a=function(r){return{addFilter:function(e,i,n){var a=r.filterState.storeFilter,s=t(t({},i),{},{logic:(null==n?void 0:n.logic)||i.logic});if(!l(a,e,s)){var u=o(a,e,s),f=Object.assign({},a,u);r.setFilterState(t(t({},r.filterState),{},{storeFilter:f}))}},replaceFilter:function(i,l,o){var n=t(t({},l),{},{logic:(null==o?void 0:o.logic)||l.logic}),a=Object.assign({},r.filterState.storeFilter,e({},i,n));r.setFilterState(t(t({},r.filterState),{},{storeFilter:a}))},upsertManyFilter:function(e,i,n){if(0!==i.values.length){var a=Object.assign({},r.filterState.storeFilter);i.values.forEach(function(t){var r={values:[t],logic:(null==n?void 0:n.logic)||i.logic};l(a,e,r)||(a=o(a,e,r))}),r.setFilterState(t(t({},r.filterState),{},{storeFilter:a}))}},removeFilter:function(e){var i=Object.assign({},r.filterState.storeFilter);i[e]&&delete i[e],r.setFilterState(t(t({},r.filterState),{},{storeFilter:i}))},removeFilterByFieldValue:function(e,i){var l=Object.assign({},r.filterState.storeFilter),o=l[e];o&&(l[e]=t(t({},o),{},{values:o.values.filter(function(t){return t.toString()!==i.toString()})}),l[e]&&0===l[e].values.length&&delete l[e],r.setFilterState(t(t({},r.filterState),{},{storeFilter:l})))},clearAllFilters:function(){r.setFilterState(t(t({},r.filterState),{},{storeFilter:{}}))},getFieldInfo:function(t){var e;return null===(e=r.filterState.storeFilter)||void 0===e?void 0:e[t]},getTotalCount:function(){var t=r.filterState.storeFilter;return t?Object.keys(t).reduce(function(e,r){var i=t[r];return e+(i?i.values.length:0)},0):0},hasSortByField:function(t){var e=r.filterState.storeSort;return(null==e?void 0:e.field)===t},getSort:function(){return r.filterState.storeSort},changeSort:function(e){var l,o=r.filterState.storeSort,n=null===(l=r.defaultFilterState)||void 0===l?void 0:l.storeSort,a=e===i.sortShuffle,s=(null==o?void 0:o.field)===e;if(a){var u=void 0;return s||(u={field:e}),void r.setFilterState(t(t({},r.filterState),{},{storeSort:u}))}var f="desc";s?f="desc"===o.direction?"asc":"desc":o||(null==n?void 0:n.field)!==e||(f="desc"===n.direction?"asc":"desc"),r.setFilterState(t(t({},r.filterState),{},{storeSort:{field:e,direction:f}}))},removeSort:function(){var e,i=null===(e=r.defaultFilterState)||void 0===e?void 0:e.storeSort;r.setFilterState(t(t({},r.filterState),{},{storeSort:i}))}}};export{n as mergeSingleValueToStoreFilter,o as mergeValueToStoreFilter,a as useFilterActions};
1
+ import{objectSpread2 as t,defineProperty as e,toConsumableArray as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as i}from"./types.js";var l=function(t,e,r){if(!t)return!1;var i=t[e];if(!i)return!1;var l=r.logic!==i.logic,o=new Set(i.values.map(function(t){return JSON.stringify(t)}).filter(Boolean));return r.values.some(function(t){return o.has(JSON.stringify(t))})&&!l},o=function(t,i,l){var o=null==t?void 0:t[i],n={values:Array.from(new Set([].concat(r((null==o?void 0:o.values)||[]),r(l.values)).filter(function(t){return null!=t}))),logic:l.logic||(null==o?void 0:o.logic)};return Object.assign({},t,e({},i,n))},n=function(i,l,o){var n=null==i?void 0:i[l],a=(null==n?void 0:n.values)||[];if(a.some(function(t){return JSON.stringify(t)===JSON.stringify(o)}))return null!=i?i:{};var s=t(t({},n),{},{values:[].concat(r(a),[o]).filter(function(t){return null!=t})});return Object.assign({},i,e({},l,s))},a=function(r){return{addFilter:function(e,i,n){var a=r.filterState.storeFilter,s=t(t({},i),{},{logic:(null==n?void 0:n.logic)||i.logic});if(!l(a,e,s)){var u=o(a,e,s),f=Object.assign({},a,u);r.setFilterState(t(t({},r.filterState),{},{storeFilter:f}))}},replaceFilter:function(i,l,o){var n=t(t({},l),{},{logic:(null==o?void 0:o.logic)||l.logic}),a=Object.assign({},r.filterState.storeFilter,e({},i,n));r.setFilterState(t(t({},r.filterState),{},{storeFilter:a}))},upsertManyFilter:function(e,i,n){if(0!==i.values.length){var a=Object.assign({},r.filterState.storeFilter);i.values.forEach(function(t){var r={values:[t],logic:(null==n?void 0:n.logic)||i.logic};l(a,e,r)||(a=o(a,e,r))}),r.setFilterState(t(t({},r.filterState),{},{storeFilter:a}))}},removeFilter:function(e){var i=Object.assign({},r.filterState.storeFilter);i[e]&&delete i[e],r.setFilterState(t(t({},r.filterState),{},{storeFilter:i}))},removeFilterByFieldValue:function(e,i){var l=Object.assign({},r.filterState.storeFilter),o=l[e];o&&(l[e]=t(t({},o),{},{values:o.values.filter(function(t){return t.toString()!==i.toString()})}),l[e]&&0===l[e].values.length&&delete l[e],r.setFilterState(t(t({},r.filterState),{},{storeFilter:l})))},clearAllFilters:function(){r.setFilterState(t(t({},r.filterState),{},{storeFilter:{}}))},getFieldInfo:function(t){var e;return null===(e=r.filterState.storeFilter)||void 0===e?void 0:e[t]},getTotalCount:function(){var t=r.filterState.storeFilter;return t?Object.keys(t).reduce(function(e,r){var i=t[r];return e+(i?i.values.length:0)},0):0},hasSortByField:function(t){var e=r.filterState.storeSort;return(null==e?void 0:e.field)===t},getSort:function(){return r.filterState.storeSort},changeSort:function(e){var l,o=r.filterState.storeSort,n=null===(l=r.defaultFilterState)||void 0===l?void 0:l.storeSort,a=e===i.sortShuffle,s=(null==o?void 0:o.field)===e;if(a){var u=void 0;return s||(u={field:e}),void r.setFilterState(t(t({},r.filterState),{},{storeSort:u}))}var f="desc";s?f="desc"===o.direction?"asc":"desc":o||(null==n?void 0:n.field)!==e||(f="desc"===n.direction?"asc":"desc"),r.setFilterState(t(t({},r.filterState),{},{storeSort:{field:e,direction:f}}))},removeSort:function(){var e,i=null===(e=r.defaultFilterState)||void 0===e?void 0:e.storeSort;r.setFilterState(t(t({},r.filterState),{},{storeSort:i}))}}};export{n as mergeSingleValueToStoreFilter,o as mergeValueToStoreFilter,a as useFilterActions};
2
2
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sources":["../../../src/filter-bar/hooks.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// types\r\nimport { KeySpecial } from './types'\r\nimport type { IFilterBarContext } from './index.context'\r\nimport type { TFieldSort, TFieldStore, TFieldType, TFieldValid, TFieldValue, TLogic } from './types'\r\n\r\ntype TOptions = {\r\n logic?: TLogic\r\n}\r\n\r\n/**\r\n * Check if a given filter value already exists in the store for a specific field.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to check for duplicate values.\r\n * @param value - The filter value to check for duplicates.\r\n * @returns True if a duplicate value exists, false otherwise.\r\n */\r\nconst checkDuplicateValue = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValue): boolean => {\r\n // If there is no filter store or no filter values for the field, there can be no duplicates\r\n if (!storeFilter) return false\r\n const fieldValue = storeFilter[field]\r\n // If there are no filter values for the field, there can be no duplicates\r\n if (!fieldValue) return false\r\n const isLogicChange = value.logic !== fieldValue.logic\r\n // Create a set of existing values for the field to efficiently check for duplicates\r\n const fieldSet = new Set(fieldValue.values.map((v) => JSON.stringify(v)).filter(Boolean))\r\n return value.values.some((v) => fieldSet.has(JSON.stringify(v))) && !isLogicChange\r\n}\r\n/**\r\n * Merge a filter value into the store for a specific field.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to merge the value into.\r\n * @param value - The filter value to merge.\r\n * @returns The updated filter store.\r\n */\r\nexport const mergeValueToStoreFilter = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValue): TFieldStore<T> => {\r\n const fieldValue: TFieldValue | undefined = storeFilter?.[field]\r\n const values = Array.from(new Set([...(fieldValue?.values || []), ...value.values].filter(Boolean)))\r\n const newData: TFieldValue = { values, logic: value.logic || fieldValue?.logic }\r\n return Object.assign({}, storeFilter, { [field]: newData }) as TFieldStore<T>\r\n}\r\n\r\n/**\r\n * Merge a single filter value into the store for a specific field, ensuring no duplicates are added.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to merge the value into.\r\n * @param value - The single filter value to merge.\r\n * @returns The updated filter store with the new value merged in, or the original store if the value is a duplicate.\r\n */\r\nexport const mergeSingleValueToStoreFilter = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValid): TFieldStore<T> => {\r\n const fieldValue: TFieldValue | undefined = storeFilter?.[field]\r\n const existingValues = fieldValue?.values || []\r\n const isDuplicate = existingValues.some((v) => JSON.stringify(v) === JSON.stringify(value))\r\n if (isDuplicate) return storeFilter ?? ({} as TFieldStore<T>)\r\n const newData: TFieldValue = { ...fieldValue, values: [...existingValues, value].filter(Boolean) }\r\n return Object.assign({}, storeFilter, { [field]: newData }) as TFieldStore<T>\r\n}\r\n\r\nexport const useFilterActions = <T>(context: IFilterBarContext<T>) => {\r\n /**\r\n * Add a filter value to the store for a specific field.\r\n * @param field - The field to add the filter value to.\r\n * @param value - The filter value to add.\r\n * @returns void\r\n */\r\n const addFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n // Check for duplicate value before adding\r\n const { storeFilter } = context.filterState\r\n const valueObj: TFieldValue = { ...value, logic: options?.logic || value.logic }\r\n // If the value already exists in the store for the field, do not add it again\r\n if (checkDuplicateValue(storeFilter, field, valueObj)) return\r\n // Merge the new value into the store filter for the field\r\n const newData = mergeValueToStoreFilter(storeFilter, field, valueObj)\r\n const newStoreFilter = Object.assign({}, storeFilter, newData)\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n /**\r\n * Replace all filter values for a specific field in the store with a new value.\r\n * Value will be replaced instead of merged, which is useful for single-value filters or when you want to reset the filter values for a field.\r\n * @param field - The field to update the filter value for.\r\n * @param value - The new filter value to set.\r\n */\r\n const replaceFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n const valueObj: TFieldValue = { ...value, logic: options?.logic || value.logic }\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter, { [field]: valueObj })\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter as TFieldStore<T> })\r\n }\r\n /**\r\n * Add multiple filter values to the store for a specific field, ensuring no duplicates are added.\r\n * @param field - The field to add the filter values to.\r\n * @param values - The filter values to add.\r\n * @returns void\r\n */\r\n const upsertManyFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n // If there are no values to add, return early\r\n if (value.values.length === 0) return\r\n let newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n // Iterate through each value and add it to the store filter for the field, checking for duplicates\r\n value.values.forEach((val) => {\r\n const valueObj: TFieldValue = { values: [val], logic: options?.logic || value.logic }\r\n if (checkDuplicateValue(newStoreFilter, field, valueObj)) return\r\n newStoreFilter = mergeValueToStoreFilter(newStoreFilter, field, valueObj)\r\n })\r\n // Update the filter state with the new store filter after adding all values\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n /**\r\n * Remove all filter values for a specific field from the store.\r\n * @param field - The field to remove filters from.\r\n * @returns void\r\n */\r\n const removeFilter = (field: TFieldType<T>) => {\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n if (newStoreFilter[field]) delete newStoreFilter[field]\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n\r\n const removeFilterByFieldValue = (field: TFieldType<T>, value: TFieldValid) => {\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n const fieldVal: TFieldValue | undefined = newStoreFilter[field]\r\n if (!fieldVal) return\r\n newStoreFilter[field] = { ...fieldVal, values: fieldVal.values.filter((v) => v.toString() !== value.toString()) }\r\n if (newStoreFilter[field] && newStoreFilter[field]!.values.length === 0) {\r\n delete newStoreFilter[field]\r\n }\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n\r\n const clearAllFilters = () => {\r\n context.setFilterState({ ...context.filterState, storeFilter: {} as TFieldStore<T> })\r\n }\r\n\r\n const getFieldInfo = (field: TFieldType<T>): TFieldValue | undefined => {\r\n const fieldVal = context.filterState.storeFilter?.[field]\r\n return fieldVal\r\n }\r\n\r\n const getTotalCount = (): number => {\r\n const storeFilter = context.filterState.storeFilter\r\n if (!storeFilter) return 0\r\n const keys = Object.keys(storeFilter) as (keyof TFieldStore<T>)[]\r\n return keys.reduce((acc, key) => {\r\n const fieldVal = storeFilter[key]\r\n return acc + (fieldVal ? fieldVal.values.length : 0)\r\n }, 0)\r\n }\r\n\r\n const hasSortByField = (field: TFieldType<T>): boolean => {\r\n const sort = context.filterState.storeSort\r\n return sort?.field === field\r\n }\r\n\r\n const getSort = (): TFieldSort<T> | undefined => {\r\n return context.filterState.storeSort\r\n }\r\n\r\n const changeSort = (field: TFieldType<T>) => {\r\n const currentSort = context.filterState.storeSort\r\n const defaultSort = context.defaultFilterState?.storeSort\r\n const isShuffle = field === KeySpecial.sortShuffle\r\n const isEqualField = currentSort?.field === field\r\n if (isShuffle) {\r\n // if current sort is shuffle and user click shuffle again, we remove the sort completely\r\n let newValue: TFieldSort<T> | undefined = undefined\r\n if (!isEqualField) newValue = { field }\r\n context.setFilterState({ ...context.filterState, storeSort: newValue })\r\n return\r\n }\r\n let newDirection: 'asc' | 'desc' = 'desc'\r\n // If current field equals the clicked field, toggle direction\r\n if (isEqualField) {\r\n newDirection = currentSort.direction === 'desc' ? 'asc' : 'desc'\r\n }\r\n // If no current sort but field equals default sort field, toggle from default direction\r\n else if (!currentSort && defaultSort?.field === field) {\r\n newDirection = defaultSort.direction === 'desc' ? 'asc' : 'desc'\r\n }\r\n context.setFilterState({ ...context.filterState, storeSort: { field, direction: newDirection } })\r\n }\r\n\r\n const removeSort = () => {\r\n const defaultSort = context.defaultFilterState?.storeSort\r\n context.setFilterState({ ...context.filterState, storeSort: defaultSort })\r\n }\r\n\r\n return {\r\n addFilter,\r\n replaceFilter,\r\n upsertManyFilter,\r\n removeFilter,\r\n removeFilterByFieldValue,\r\n clearAllFilters,\r\n getFieldInfo,\r\n getTotalCount,\r\n hasSortByField,\r\n getSort,\r\n changeSort,\r\n removeSort\r\n }\r\n}\r\n"],"names":["checkDuplicateValue","storeFilter","field","value","fieldValue","isLogicChange","logic","fieldSet","Set","values","map","v","JSON","stringify","filter","Boolean","some","has","mergeValueToStoreFilter","newData","Array","from","concat","_toConsumableArray","Object","assign","_defineProperty","mergeSingleValueToStoreFilter","existingValues","_objectSpread","useFilterActions","context","addFilter","options","filterState","valueObj","newStoreFilter","setFilterState","replaceFilter","upsertManyFilter","length","forEach","val","removeFilter","removeFilterByFieldValue","fieldVal","toString","clearAllFilters","getFieldInfo","_context$filterState$","getTotalCount","keys","reduce","acc","key","hasSortByField","sort","storeSort","getSort","changeSort","_context$defaultFilte","currentSort","defaultSort","defaultFilterState","isShuffle","KeySpecial","sortShuffle","isEqualField","newValue","undefined","newDirection","direction","removeSort","_context$defaultFilte2"],"mappings":"+JAkBA,IAAMA,EAAsB,SAAIC,EAAyCC,EAA6BC,GAEpG,IAAKF,EAAa,OAAO,EACzB,IAAMG,EAAaH,EAAYC,GAE/B,IAAKE,EAAY,OAAO,EACxB,IAAMC,EAAgBF,EAAMG,QAAUF,EAAWE,MAE3CC,EAAW,IAAIC,IAAIJ,EAAWK,OAAOC,IAAI,SAACC,GAAC,OAAKC,KAAKC,UAAUF,EAAE,GAAEG,OAAOC,UAChF,OAAOZ,EAAMM,OAAOO,KAAK,SAACL,GAAC,OAAKJ,EAASU,IAAIL,KAAKC,UAAUF,GAAI,KAAKN,CACvE,EAQaa,EAA0B,SAAIjB,EAAyCC,EAA6BC,GAC/G,IAAMC,EAAsCH,aAAAA,EAAAA,EAAcC,GAEpDiB,EAAuB,CAAEV,OADhBW,MAAMC,KAAK,IAAIb,IAAI,GAAAc,OAAAC,GAAKnB,aAAAA,EAAAA,EAAYK,SAAU,IAAEc,EAAMpB,EAAMM,SAAQK,OAAOC,WACnDT,MAAOH,EAAMG,QAASF,aAAU,EAAVA,EAAYE,QACzE,OAAOkB,OAAOC,OAAO,GAAIxB,EAAWyB,EAAKxB,CAAAA,EAAAA,EAAQiB,GACnD,EASaQ,EAAgC,SAAI1B,EAAyCC,EAA6BC,GACrH,IAAMC,EAAsCH,aAAAA,EAAAA,EAAcC,GACpD0B,GAAiBxB,aAAU,EAAVA,EAAYK,SAAU,GAE7C,GADoBmB,EAAeZ,KAAK,SAACL,GAAC,OAAKC,KAAKC,UAAUF,KAAOC,KAAKC,UAAUV,KACnE,OAAOF,QAAAA,EAAgB,CAAqB,EAC7D,IAAMkB,EAAOU,EAAAA,KAAqBzB,GAAU,GAAA,CAAEK,OAAQ,GAAAa,OAAAC,EAAIK,GAAc,CAAEzB,IAAOW,OAAOC,WACxF,OAAOS,OAAOC,OAAO,GAAIxB,EAAWyB,EAAKxB,CAAAA,EAAAA,EAAQiB,GACnD,EAEaW,EAAmB,SAAIC,GA+HlC,MAAO,CACLC,UAzHgB,SAAC9B,EAA6BC,EAAoB8B,GAElE,IAAQhC,EAAgB8B,EAAQG,YAAxBjC,YACFkC,EAAQN,EAAAA,KAAqB1B,GAAK,GAAA,CAAEG,OAAO2B,aAAAA,EAAAA,EAAS3B,QAASH,EAAMG,QAEzE,IAAIN,EAAoBC,EAAaC,EAAOiC,GAA5C,CAEA,IAAMhB,EAAUD,EAAwBjB,EAAaC,EAAOiC,GACtDC,EAAiBZ,OAAOC,OAAO,CAAA,EAAIxB,EAAakB,GACtDY,EAAQM,eAAcR,EAAAA,EAAA,CAAA,EAAME,EAAQG,aAAW,GAAA,CAAEjC,YAAamC,IAJP,CAKxD,EAgHCE,cAzGoB,SAACpC,EAA6BC,EAAoB8B,GACtE,IAAME,EAAQN,EAAAA,KAAqB1B,GAAK,GAAA,CAAEG,OAAO2B,aAAAA,EAAAA,EAAS3B,QAASH,EAAMG,QACnE8B,EAAiBZ,OAAOC,OAAO,CAAE,EAAEM,EAAQG,YAAYjC,YAAWyB,KAAKxB,EAAQiC,IACrFJ,EAAQM,eAAcR,EAAAA,EAAA,CAAA,EAAME,EAAQG,aAAW,GAAA,CAAEjC,YAAamC,IAC/D,EAsGCG,iBA/FuB,SAACrC,EAA6BC,EAAoB8B,GAEzE,GAA4B,IAAxB9B,EAAMM,OAAO+B,OAAjB,CACA,IAAIJ,EAAiBZ,OAAOC,OAAO,CAAE,EAAEM,EAAQG,YAAYjC,aAE3DE,EAAMM,OAAOgC,QAAQ,SAACC,GACpB,IAAMP,EAAwB,CAAE1B,OAAQ,CAACiC,GAAMpC,OAAO2B,aAAAA,EAAAA,EAAS3B,QAASH,EAAMG,OAC1EN,EAAoBoC,EAAgBlC,EAAOiC,KAC/CC,EAAiBlB,EAAwBkB,EAAgBlC,EAAOiC,GAClE,GAEAJ,EAAQM,eAAcR,EAAAA,EAAA,CAAA,EAAME,EAAQG,aAAW,GAAA,CAAEjC,YAAamC,IAT/B,CAUhC,EAoFCO,aA9EmB,SAACzC,GACpB,IAAMkC,EAAiBZ,OAAOC,OAAO,CAAE,EAAEM,EAAQG,YAAYjC,aACzDmC,EAAelC,WAAekC,EAAelC,GACjD6B,EAAQM,eAAcR,EAAAA,EAAA,CAAA,EAAME,EAAQG,aAAW,GAAA,CAAEjC,YAAamC,IAC/D,EA2ECQ,yBAzE+B,SAAC1C,EAAsBC,GACtD,IAAMiC,EAAiBZ,OAAOC,OAAO,CAAE,EAAEM,EAAQG,YAAYjC,aACvD4C,EAAoCT,EAAelC,GACpD2C,IACLT,EAAelC,GAAM2B,EAAAA,KAAQgB,GAAQ,GAAA,CAAEpC,OAAQoC,EAASpC,OAAOK,OAAO,SAACH,GAAC,OAAKA,EAAEmC,aAAe3C,EAAM2C,UAAU,KAC1GV,EAAelC,IAAmD,IAAzCkC,EAAelC,GAAQO,OAAO+B,eAClDJ,EAAelC,GAExB6B,EAAQM,eAAcR,EAAAA,EAAA,CAAA,EAAME,EAAQG,aAAW,GAAA,CAAEjC,YAAamC,KAC/D,EAiECW,gBA/DsB,WACtBhB,EAAQM,eAAcR,EAAAA,EAAA,CAAA,EAAME,EAAQG,aAAW,GAAA,CAAEjC,YAAa,CAAA,IAC/D,EA8DC+C,aA5DmB,SAAC9C,GAAiD,IAAA+C,EAErE,eADcA,EAAGlB,EAAQG,YAAYjC,mBAAW,IAAAgD,OAAA,EAA/BA,EAAkC/C,EAEpD,EA0DCgD,cAxDoB,WACpB,IAAMjD,EAAc8B,EAAQG,YAAYjC,YACxC,OAAKA,EACQuB,OAAO2B,KAAKlD,GACbmD,OAAO,SAACC,EAAKC,GACvB,IAAMT,EAAW5C,EAAYqD,GAC7B,OAAOD,GAAOR,EAAWA,EAASpC,OAAO+B,OAAS,EACnD,EAAE,GALsB,CAM1B,EAiDCe,eA/CqB,SAACrD,GACtB,IAAMsD,EAAOzB,EAAQG,YAAYuB,UACjC,OAAOD,eAAAA,EAAMtD,SAAUA,CACxB,EA6CCwD,QA3Cc,WACd,OAAO3B,EAAQG,YAAYuB,SAC5B,EA0CCE,WAxCiB,SAACzD,GAAwB,IAAA0D,EACpCC,EAAc9B,EAAQG,YAAYuB,UAClCK,EAAwC,QAA7BF,EAAG7B,EAAQgC,0BAAkB,IAAAH,OAAA,EAA1BA,EAA4BH,UAC1CO,EAAY9D,IAAU+D,EAAWC,YACjCC,GAAeN,aAAW,EAAXA,EAAa3D,SAAUA,EAC5C,GAAI8D,EAAW,CAEb,IAAII,OAAsCC,EAG1C,OAFKF,IAAcC,EAAW,CAAElE,MAAAA,SAChC6B,EAAQM,eAAcR,EAAAA,EAAA,CAAA,EAAME,EAAQG,aAAW,GAAA,CAAEuB,UAAWW,IAE7D,CACD,IAAIE,EAA+B,OAE/BH,EACFG,EAAyC,SAA1BT,EAAYU,UAAuB,MAAQ,OAGlDV,IAAeC,aAAW,EAAXA,EAAa5D,SAAUA,IAC9CoE,EAAyC,SAA1BR,EAAYS,UAAuB,MAAQ,QAE5DxC,EAAQM,eAAcR,EAAAA,EAAA,CAAA,EAAME,EAAQG,aAAW,GAAA,CAAEuB,UAAW,CAAEvD,MAAAA,EAAOqE,UAAWD,KACjF,EAmBCE,WAjBiB,WAAK,IAAAC,EAChBX,EAAwC,QAA7BW,EAAG1C,EAAQgC,0BAAkB,IAAAU,OAAA,EAA1BA,EAA4BhB,UAChD1B,EAAQM,eAAcR,EAAAA,EAAA,CAAA,EAAME,EAAQG,aAAW,GAAA,CAAEuB,UAAWK,IAC7D,EAgBH"}
1
+ {"version":3,"file":"hooks.js","sources":["../../../src/filter-bar/hooks.ts"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// types\r\nimport { KeySpecial } from './types'\r\nimport type { IFilterBarContext } from './index.context'\r\nimport type { TFieldSort, TFieldStore, TFieldType, TFieldValid, TFieldValue, TLogic } from './types'\r\n\r\ntype TOptions = {\r\n logic?: TLogic\r\n}\r\n\r\n/**\r\n * Check if a given filter value already exists in the store for a specific field.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to check for duplicate values.\r\n * @param value - The filter value to check for duplicates.\r\n * @returns True if a duplicate value exists, false otherwise.\r\n */\r\nconst checkDuplicateValue = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValue): boolean => {\r\n // If there is no filter store or no filter values for the field, there can be no duplicates\r\n if (!storeFilter) return false\r\n const fieldValue = storeFilter[field]\r\n // If there are no filter values for the field, there can be no duplicates\r\n if (!fieldValue) return false\r\n const isLogicChange = value.logic !== fieldValue.logic\r\n // Create a set of existing values for the field to efficiently check for duplicates\r\n const fieldSet = new Set(fieldValue.values.map((v) => JSON.stringify(v)).filter(Boolean))\r\n return value.values.some((v) => fieldSet.has(JSON.stringify(v))) && !isLogicChange\r\n}\r\n/**\r\n * Merge a filter value into the store for a specific field.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to merge the value into.\r\n * @param value - The filter value to merge.\r\n * @returns The updated filter store.\r\n */\r\nexport const mergeValueToStoreFilter = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValue): TFieldStore<T> => {\r\n const fieldValue: TFieldValue | undefined = storeFilter?.[field]\r\n const values = Array.from(new Set([...(fieldValue?.values || []), ...value.values].filter((v) => v !== null && v !== undefined)))\r\n const newData: TFieldValue = { values, logic: value.logic || fieldValue?.logic }\r\n return Object.assign({}, storeFilter, { [field]: newData }) as TFieldStore<T>\r\n}\r\n\r\n/**\r\n * Merge a single filter value into the store for a specific field, ensuring no duplicates are added.\r\n * @param storeFilter - The current filter store.\r\n * @param field - The field to merge the value into.\r\n * @param value - The single filter value to merge.\r\n * @returns The updated filter store with the new value merged in, or the original store if the value is a duplicate.\r\n */\r\nexport const mergeSingleValueToStoreFilter = <T>(storeFilter: TFieldStore<T> | undefined, field: keyof TFieldStore<T>, value: TFieldValid): TFieldStore<T> => {\r\n const fieldValue: TFieldValue | undefined = storeFilter?.[field]\r\n const existingValues = fieldValue?.values || []\r\n const isDuplicate = existingValues.some((v) => JSON.stringify(v) === JSON.stringify(value))\r\n if (isDuplicate) return storeFilter ?? ({} as TFieldStore<T>)\r\n const newData: TFieldValue = { ...fieldValue, values: [...existingValues, value].filter((v) => v !== null && v !== undefined) }\r\n return Object.assign({}, storeFilter, { [field]: newData }) as TFieldStore<T>\r\n}\r\n\r\nexport const useFilterActions = <T>(context: IFilterBarContext<T>) => {\r\n /**\r\n * Add a filter value to the store for a specific field.\r\n * @param field - The field to add the filter value to.\r\n * @param value - The filter value to add.\r\n * @returns void\r\n */\r\n const addFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n // Check for duplicate value before adding\r\n const { storeFilter } = context.filterState\r\n const valueObj: TFieldValue = { ...value, logic: options?.logic || value.logic }\r\n // If the value already exists in the store for the field, do not add it again\r\n if (checkDuplicateValue(storeFilter, field, valueObj)) return\r\n // Merge the new value into the store filter for the field\r\n const newData = mergeValueToStoreFilter(storeFilter, field, valueObj)\r\n const newStoreFilter = Object.assign({}, storeFilter, newData)\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n /**\r\n * Replace all filter values for a specific field in the store with a new value.\r\n * Value will be replaced instead of merged, which is useful for single-value filters or when you want to reset the filter values for a field.\r\n * @param field - The field to update the filter value for.\r\n * @param value - The new filter value to set.\r\n */\r\n const replaceFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n const valueObj: TFieldValue = { ...value, logic: options?.logic || value.logic }\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter, { [field]: valueObj })\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter as TFieldStore<T> })\r\n }\r\n /**\r\n * Add multiple filter values to the store for a specific field, ensuring no duplicates are added.\r\n * @param field - The field to add the filter values to.\r\n * @param values - The filter values to add.\r\n * @returns void\r\n */\r\n const upsertManyFilter = (field: keyof TFieldStore<T>, value: TFieldValue, options?: TOptions) => {\r\n // If there are no values to add, return early\r\n if (value.values.length === 0) return\r\n let newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n // Iterate through each value and add it to the store filter for the field, checking for duplicates\r\n value.values.forEach((val) => {\r\n const valueObj: TFieldValue = { values: [val], logic: options?.logic || value.logic }\r\n if (checkDuplicateValue(newStoreFilter, field, valueObj)) return\r\n newStoreFilter = mergeValueToStoreFilter(newStoreFilter, field, valueObj)\r\n })\r\n // Update the filter state with the new store filter after adding all values\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n /**\r\n * Remove all filter values for a specific field from the store.\r\n * @param field - The field to remove filters from.\r\n * @returns void\r\n */\r\n const removeFilter = (field: TFieldType<T>) => {\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n if (newStoreFilter[field]) delete newStoreFilter[field]\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n\r\n const removeFilterByFieldValue = (field: TFieldType<T>, value: TFieldValid) => {\r\n const newStoreFilter = Object.assign({}, context.filterState.storeFilter)\r\n const fieldVal: TFieldValue | undefined = newStoreFilter[field]\r\n if (!fieldVal) return\r\n newStoreFilter[field] = { ...fieldVal, values: fieldVal.values.filter((v) => v.toString() !== value.toString()) }\r\n if (newStoreFilter[field] && newStoreFilter[field]!.values.length === 0) {\r\n delete newStoreFilter[field]\r\n }\r\n context.setFilterState({ ...context.filterState, storeFilter: newStoreFilter })\r\n }\r\n\r\n const clearAllFilters = () => {\r\n context.setFilterState({ ...context.filterState, storeFilter: {} as TFieldStore<T> })\r\n }\r\n\r\n const getFieldInfo = (field: TFieldType<T>): TFieldValue | undefined => {\r\n const fieldVal = context.filterState.storeFilter?.[field]\r\n return fieldVal\r\n }\r\n\r\n const getTotalCount = (): number => {\r\n const storeFilter = context.filterState.storeFilter\r\n if (!storeFilter) return 0\r\n const keys = Object.keys(storeFilter) as (keyof TFieldStore<T>)[]\r\n return keys.reduce((acc, key) => {\r\n const fieldVal = storeFilter[key]\r\n return acc + (fieldVal ? fieldVal.values.length : 0)\r\n }, 0)\r\n }\r\n\r\n const hasSortByField = (field: TFieldType<T>): boolean => {\r\n const sort = context.filterState.storeSort\r\n return sort?.field === field\r\n }\r\n\r\n const getSort = (): TFieldSort<T> | undefined => {\r\n return context.filterState.storeSort\r\n }\r\n\r\n const changeSort = (field: TFieldType<T>) => {\r\n const currentSort = context.filterState.storeSort\r\n const defaultSort = context.defaultFilterState?.storeSort\r\n const isShuffle = field === KeySpecial.sortShuffle\r\n const isEqualField = currentSort?.field === field\r\n if (isShuffle) {\r\n // if current sort is shuffle and user click shuffle again, we remove the sort completely\r\n let newValue: TFieldSort<T> | undefined = undefined\r\n if (!isEqualField) newValue = { field }\r\n context.setFilterState({ ...context.filterState, storeSort: newValue })\r\n return\r\n }\r\n let newDirection: 'asc' | 'desc' = 'desc'\r\n // If current field equals the clicked field, toggle direction\r\n if (isEqualField) {\r\n newDirection = currentSort.direction === 'desc' ? 'asc' : 'desc'\r\n }\r\n // If no current sort but field equals default sort field, toggle from default direction\r\n else if (!currentSort && defaultSort?.field === field) {\r\n newDirection = defaultSort.direction === 'desc' ? 'asc' : 'desc'\r\n }\r\n context.setFilterState({ ...context.filterState, storeSort: { field, direction: newDirection } })\r\n }\r\n\r\n const removeSort = () => {\r\n const defaultSort = context.defaultFilterState?.storeSort\r\n context.setFilterState({ ...context.filterState, storeSort: defaultSort })\r\n }\r\n\r\n return {\r\n addFilter,\r\n replaceFilter,\r\n upsertManyFilter,\r\n removeFilter,\r\n removeFilterByFieldValue,\r\n clearAllFilters,\r\n getFieldInfo,\r\n getTotalCount,\r\n hasSortByField,\r\n getSort,\r\n changeSort,\r\n removeSort\r\n }\r\n}\r\n"],"names":["checkDuplicateValue","storeFilter","field","value","fieldValue","isLogicChange","logic","fieldSet","Set","values","map","v","JSON","stringify","filter","Boolean","some","has","mergeValueToStoreFilter","newData","Array","from","concat","_toConsumableArray","Object","assign","_defineProperty","mergeSingleValueToStoreFilter","existingValues","_objectSpread","useFilterActions","context","addFilter","options","filterState","valueObj","newStoreFilter","setFilterState","replaceFilter","upsertManyFilter","length","forEach","val","removeFilter","removeFilterByFieldValue","fieldVal","toString","clearAllFilters","getFieldInfo","_context$filterState$","getTotalCount","keys","reduce","acc","key","hasSortByField","sort","storeSort","getSort","changeSort","_context$defaultFilte","currentSort","defaultSort","defaultFilterState","isShuffle","KeySpecial","sortShuffle","isEqualField","newValue","undefined","newDirection","direction","removeSort","_context$defaultFilte2"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.create.js","sources":["../../../src/filter-bar/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useState, useEffect, useRef } from 'react'\r\nimport { Box, BoxProps, styled, useMediaQuery, useTheme } from '@mui/material'\r\nimport { createFilterMenu } from './menu/create'\r\nimport { createFilterBarContext } from './index.context'\r\nimport { createFilterSort } from './components/filter-sort'\r\nimport { createFilterInput } from './components/filter-input'\r\nimport { createFilterSummary } from './components/filter-summary'\r\n// types\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { TFilterState } from './types'\r\nimport type { IFilterMenuConfig, IFilterMenuProps } from './menu/types'\r\nimport type { IFilterBarContext, IFilterBarContextState } from './index.context'\r\nimport type { IFilterSortConfig, IFilterSortProps } from './components/filter-sort.types'\r\nimport type { IFilterInputConfig, IFilterInputProps } from './components/filter-input.types'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps } from './components/filter-summary.types'\r\n\r\nexport interface IFilterBarConfigs<T> {\r\n /** Debounce delay for filter input changes in milliseconds @default 300 */\r\n debounceDelay?: number\r\n defaultFilterState?: TFilterState<T>\r\n /** Default filter logic, can be overridden by individual filters @default \"and\" */\r\n defaultFilterLogic?: 'and' | 'or'\r\n InputComponent?: ComponentType<IFilterInputProps<T>>\r\n inputConfig?: IFilterInputConfig<T>\r\n MenuComponent?: ComponentType<IFilterMenuProps<T>>\r\n menuConfig?: IFilterMenuConfig<T>\r\n sortConfig?: IFilterSortConfig<T>\r\n SortComponent?: ComponentType<IFilterSortProps<T>>\r\n /** Enable or disable the summary component. Default is true. */\r\n enableSummary?: boolean\r\n SummaryComponent?: ComponentType<IFilterSummaryProps<T>>\r\n summaryConfig?: IFilterSummaryConfig<T>\r\n}\r\n\r\nexport interface IFilterBarSlots {\r\n summaryWrapProps?: BoxProps\r\n summaryBefore?: React.ReactNode\r\n summaryAfter?: React.ReactNode\r\n before?: React.ReactNode\r\n after?: React.ReactNode\r\n}\r\n\r\nexport interface IFilterBarProps<T> {\r\n sx?: BoxProps['sx']\r\n value?: TFilterState<T>\r\n defaultValue?: TFilterState<T>\r\n onChange?: (state: TFilterState<T>, signal?: AbortSignal) => Promise<void> | void\r\n slots?: IFilterBarSlots\r\n loading?: boolean\r\n}\r\n\r\ninterface IFilterBarState<T> extends IFilterBarContextState<T> {}\r\n\r\nexport function createFilterBar<T>(configs: IFilterBarConfigs<T>) {\r\n const debounceDelay = configs.debounceDelay ?? 300\r\n\r\n if (!configs.InputComponent) {\r\n const configInput = configs.inputConfig || { fields: {} }\r\n configs.inputConfig = configInput\r\n configs.InputComponent = createFilterInput<T>(configInput)\r\n }\r\n if (!configs.MenuComponent) {\r\n const configMenu = configs.menuConfig || { fields: {} }\r\n configs.menuConfig = configMenu\r\n configs.MenuComponent = createFilterMenu<T>(configMenu)\r\n }\r\n if (!configs.SummaryComponent && configs.enableSummary !== false) {\r\n const configSummary: IFilterSummaryConfig<T> = configs.summaryConfig || { fields: {} }\r\n configs.summaryConfig = configSummary\r\n configs.SummaryComponent = createFilterSummary<T>(configSummary)\r\n }\r\n if (!configs.SortComponent) {\r\n const configSort: IFilterSortConfig<T> = configs.sortConfig || { fields: {} }\r\n configs.sortConfig = configSort\r\n configs.SortComponent = createFilterSort<T>(configSort)\r\n }\r\n\r\n const defaultFilterLogic = configs.defaultFilterLogic || 'and'\r\n const Context = createFilterBarContext<T>()\r\n\r\n const FilterBar: FC<IFilterBarProps<T>> = (props) => {\r\n const { slots } = props\r\n const InputComponent = configs.InputComponent as ComponentType<IFilterInputProps<T>>\r\n const MenuComponent = configs.MenuComponent as ComponentType<IFilterMenuProps<T>>\r\n const SummaryComponent = configs.SummaryComponent as ComponentType<IFilterSummaryProps<T>>\r\n const SortComponent = configs.SortComponent as ComponentType<IFilterSortProps<T>>\r\n\r\n const getDefaultFilterState = (): TFilterState<T> => {\r\n return Object.assign({ filterLogic: defaultFilterLogic }, configs.defaultFilterState, props.defaultValue)\r\n }\r\n\r\n const computeInitial = (): IFilterBarState<T> => {\r\n if (props.value) return { filterState: props.value }\r\n return { filterState: getDefaultFilterState() }\r\n }\r\n\r\n const [localState, setLocalState] = useState<IFilterBarState<T>>(computeInitial)\r\n const [isLoading, setIsLoading] = useState<boolean>(false)\r\n const debounceTimer = useRef<number | null>(null)\r\n const pendingStateRef = useRef<TFilterState<T> | null>(null)\r\n const abortControllerRef = useRef<AbortController | null>(null)\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimer.current) {\r\n clearTimeout(debounceTimer.current)\r\n debounceTimer.current = null\r\n }\r\n abortControllerRef.current?.abort()\r\n abortControllerRef.current = null\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n // keep local state in sync if controlled\r\n if (props.value) setLocalState({ filterState: props.value })\r\n }, [props.value])\r\n\r\n const handleChange = async (filterState: TFilterState<T>, signal: AbortSignal, state?: Partial<IFilterBarState<T>>) => {\r\n try {\r\n setLocalState((prev) => ({ filterState: state?.filterState ?? prev.filterState }))\r\n setIsLoading(true)\r\n await props.onChange?.(filterState, signal)\r\n if (signal.aborted) return\r\n setIsLoading(false)\r\n } catch (error) {\r\n if (signal.aborted) return\r\n setIsLoading(false)\r\n throw error\r\n }\r\n }\r\n\r\n // Action handlers to manipulate filter state\r\n // Debounce or throttle can be added to these handlers if needed to optimize performance for rapid changes\r\n const setFilterState = (state: TFilterState<T>) => {\r\n // preserve filterLogic from current state, fallback to defaultFilterLogic if not set\r\n const currentFilterLogic = (props.value || localState.filterState).filterLogic ?? defaultFilterLogic\r\n const mergedState: TFilterState<T> = { filterLogic: currentFilterLogic, ...state }\r\n // store latest requested state\r\n pendingStateRef.current = mergedState\r\n\r\n // If uncontrolled, update UI immediately for responsiveness\r\n if (!props.value) {\r\n setLocalState({ filterState: mergedState })\r\n }\r\n\r\n // debounce actual handler calls so only the last one within delay fires\r\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\r\n debounceTimer.current = window.setTimeout(() => {\r\n // abort previous in-flight request before starting a new one\r\n abortControllerRef.current?.abort()\r\n const controller = new AbortController()\r\n abortControllerRef.current = controller\r\n\r\n const s = pendingStateRef.current as TFilterState<T>\r\n if (props.value) {\r\n handleChange(s, controller.signal)\r\n } else {\r\n handleChange(s, controller.signal, { filterState: s })\r\n }\r\n debounceTimer.current = null\r\n pendingStateRef.current = null\r\n }, debounceDelay)\r\n }\r\n\r\n const contextValue: IFilterBarContext<T> = {\r\n filterState: props.value || localState.filterState,\r\n defaultFilterState: getDefaultFilterState(),\r\n isLoading: props.loading || isLoading,\r\n setFilterState\r\n }\r\n\r\n const theme = useTheme()\r\n const isSmall = useMediaQuery(theme.breakpoints.down('md'))\r\n\r\n return (\r\n <Context.Provider value={contextValue}>\r\n <FilterBarStyled className={filterbarClasses.root} sx={props.sx}>\r\n <Box className={filterbarClasses.inner}>\r\n {slots?.before || null}\r\n <div className={filterbarClasses.action}>\r\n <MenuComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n <SortComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n </div>\r\n <InputComponent slots={{ minimalInput: isSmall, popperProps: { placement: 'bottom-start' } }} />\r\n {slots?.after || null}\r\n </Box>\r\n <Box {...slots?.summaryWrapProps} sx={{ display: 'flex', alignItems: 'center', ...slots?.summaryWrapProps?.sx }}>\r\n {slots?.summaryBefore || null}\r\n <Box sx={{ flex: 1, minWidth: 0 }}>{configs.enableSummary !== false && <SummaryComponent />}</Box>\r\n {slots?.summaryAfter || null}\r\n </Box>\r\n </FilterBarStyled>\r\n </Context.Provider>\r\n )\r\n }\r\n\r\n return FilterBar\r\n}\r\n\r\nconst filterbarClasses = {\r\n root: 'DinoFilterBar-root',\r\n inner: 'DinoFilterBar-inner',\r\n action: 'DinoFilterBar-action'\r\n}\r\n\r\nconst FilterBarStyled = styled(Box)(({ theme }) => ({\r\n [`&.${filterbarClasses.root}`]: {\r\n backgroundColor: theme.palette.background.paper,\r\n boxSizing: 'border-box'\r\n },\r\n [`.${filterbarClasses.inner}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1)\r\n },\r\n [`.${filterbarClasses.action}`]: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n }\r\n}))\r\n"],"names":["createFilterBar","configs","_configs$debounceDela","debounceDelay","InputComponent","configInput","inputConfig","fields","createFilterInput","MenuComponent","configMenu","menuConfig","createFilterMenu","SummaryComponent","enableSummary","configSummary","summaryConfig","createFilterSummary","SortComponent","configSort","sortConfig","createFilterSort","defaultFilterLogic","Context","createFilterBarContext","props","_slots$summaryWrapPro","slots","getDefaultFilterState","Object","assign","filterLogic","defaultFilterState","defaultValue","_useState","useState","value","filterState","_useState2","_slicedToArray","localState","setLocalState","_useState3","_useState4","isLoading","setIsLoading","debounceTimer","useRef","pendingStateRef","abortControllerRef","useEffect","_abortControllerRef$c","current","clearTimeout","abort","handleChange","_ref","_asyncToGenerator","_regenerator","m","_callee","signal","state","_props$onChange","_t","w","_context","p","n","prev","_state$filterState","onChange","call","aborted","a","v","_x","_x2","_x3","apply","this","arguments","contextValue","loading","setFilterState","_filterLogic","currentFilterLogic","mergedState","_objectSpread","window","setTimeout","_abortControllerRef$c2","controller","AbortController","s","theme","useTheme","isSmall","useMediaQuery","breakpoints","down","_jsx","Provider","children","_jsxs","FilterBarStyled","className","filterbarClasses","root","sx","Box","inner","before","action","popperProps","placement","minimalInput","after","summaryWrapProps","display","alignItems","summaryBefore","flex","minWidth","summaryAfter","styled","_ref2","_defineProperty","concat","backgroundColor","palette","background","paper","boxSizing","gap","spacing"],"mappings":"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"}
1
+ {"version":3,"file":"index.create.js","sources":["../../../src/filter-bar/index.create.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useState, useEffect, useRef } from 'react'\r\nimport { Box, BoxProps, styled, useMediaQuery, useTheme } from '@mui/material'\r\nimport { createFilterMenu } from './menu/create'\r\nimport { createFilterBarContext } from './index.context'\r\nimport { createFilterSort } from './components/filter-sort'\r\nimport { createFilterInput } from './components/filter-input'\r\nimport { createFilterSummary } from './components/filter-summary'\r\n// types\r\nimport type { ComponentType, FC } from 'react'\r\nimport type { TFilterState } from './types'\r\nimport type { IFilterMenuConfig, IFilterMenuProps } from './menu/types'\r\nimport type { IFilterBarContext, IFilterBarContextState } from './index.context'\r\nimport type { IFilterSortConfig, IFilterSortProps } from './components/filter-sort.types'\r\nimport type { IFilterInputConfig, IFilterInputProps } from './components/filter-input.types'\r\nimport type { IFilterSummaryConfig, IFilterSummaryProps } from './components/filter-summary.types'\r\n\r\nexport interface IFilterBarConfigs<T> {\r\n /** Debounce delay for filter input changes in milliseconds @default 300 */\r\n debounceDelay?: number\r\n defaultFilterState?: TFilterState<T>\r\n /** Default filter logic, can be overridden by individual filters @default \"and\" */\r\n defaultFilterLogic?: 'and' | 'or'\r\n InputComponent?: ComponentType<IFilterInputProps<T>>\r\n inputConfig?: IFilterInputConfig<T>\r\n MenuComponent?: ComponentType<IFilterMenuProps<T>>\r\n menuConfig?: IFilterMenuConfig<T>\r\n sortConfig?: IFilterSortConfig<T>\r\n SortComponent?: ComponentType<IFilterSortProps<T>>\r\n /** Enable or disable the summary component. Default is true. */\r\n enableSummary?: boolean\r\n SummaryComponent?: ComponentType<IFilterSummaryProps<T>>\r\n summaryConfig?: IFilterSummaryConfig<T>\r\n}\r\n\r\nexport interface IFilterBarSlots {\r\n summaryWrapProps?: BoxProps\r\n summaryBefore?: React.ReactNode\r\n summaryAfter?: React.ReactNode\r\n before?: React.ReactNode\r\n after?: React.ReactNode\r\n}\r\n\r\nexport interface IFilterBarProps<T> {\r\n sx?: BoxProps['sx']\r\n value?: TFilterState<T>\r\n defaultValue?: TFilterState<T>\r\n onChange?: (state: TFilterState<T>, signal?: AbortSignal) => Promise<void> | void\r\n slots?: IFilterBarSlots\r\n loading?: boolean\r\n}\r\n\r\ninterface IFilterBarState<T> extends IFilterBarContextState<T> {}\r\n\r\nexport function createFilterBar<T>(configs: IFilterBarConfigs<T>) {\r\n const debounceDelay = configs.debounceDelay ?? 300\r\n\r\n if (!configs.InputComponent) {\r\n const configInput = configs.inputConfig || { fields: {} }\r\n configs.inputConfig = configInput\r\n configs.InputComponent = createFilterInput<T>(configInput)\r\n }\r\n if (!configs.MenuComponent) {\r\n const configMenu = configs.menuConfig || { fields: {} }\r\n configs.menuConfig = configMenu\r\n configs.MenuComponent = createFilterMenu<T>(configMenu)\r\n }\r\n if (!configs.SummaryComponent && configs.enableSummary !== false) {\r\n const configSummary: IFilterSummaryConfig<T> = configs.summaryConfig || { fields: {} }\r\n configs.summaryConfig = configSummary\r\n configs.SummaryComponent = createFilterSummary<T>(configSummary)\r\n }\r\n if (!configs.SortComponent) {\r\n const configSort: IFilterSortConfig<T> = configs.sortConfig || { fields: {} }\r\n configs.sortConfig = configSort\r\n configs.SortComponent = createFilterSort<T>(configSort)\r\n }\r\n\r\n const defaultFilterLogic = configs.defaultFilterLogic || 'and'\r\n const Context = createFilterBarContext<T>()\r\n\r\n const FilterBar: FC<IFilterBarProps<T>> = (props) => {\r\n const { slots } = props\r\n const InputComponent = configs.InputComponent as ComponentType<IFilterInputProps<T>>\r\n const MenuComponent = configs.MenuComponent as ComponentType<IFilterMenuProps<T>>\r\n const SummaryComponent = configs.SummaryComponent as ComponentType<IFilterSummaryProps<T>>\r\n const SortComponent = configs.SortComponent as ComponentType<IFilterSortProps<T>>\r\n\r\n const getDefaultFilterState = (): TFilterState<T> => {\r\n return Object.assign({ filterLogic: defaultFilterLogic }, configs.defaultFilterState, props.defaultValue)\r\n }\r\n\r\n const computeInitial = (): IFilterBarState<T> => {\r\n if (props.value) return { filterState: props.value }\r\n return { filterState: getDefaultFilterState() }\r\n }\r\n\r\n const [localState, setLocalState] = useState<IFilterBarState<T>>(computeInitial)\r\n const [isLoading, setIsLoading] = useState<boolean>(false)\r\n const debounceTimer = useRef<number | null>(null)\r\n const pendingStateRef = useRef<TFilterState<T> | null>(null)\r\n const abortControllerRef = useRef<AbortController | null>(null)\r\n\r\n useEffect(() => {\r\n return () => {\r\n if (debounceTimer.current) {\r\n clearTimeout(debounceTimer.current)\r\n debounceTimer.current = null\r\n }\r\n abortControllerRef.current?.abort()\r\n abortControllerRef.current = null\r\n }\r\n }, [])\r\n\r\n useEffect(() => {\r\n // keep local state in sync if controlled\r\n if (props.value) setLocalState({ filterState: props.value })\r\n }, [props.value])\r\n\r\n const handleChange = async (filterState: TFilterState<T>, signal: AbortSignal, state?: Partial<IFilterBarState<T>>) => {\r\n try {\r\n setLocalState((prev) => ({ filterState: state?.filterState ?? prev.filterState }))\r\n setIsLoading(true)\r\n await props.onChange?.(filterState, signal)\r\n if (signal.aborted) return\r\n setIsLoading(false)\r\n } catch (error) {\r\n if (signal.aborted) return\r\n setIsLoading(false)\r\n throw error\r\n }\r\n }\r\n\r\n // Action handlers to manipulate filter state\r\n // Debounce or throttle can be added to these handlers if needed to optimize performance for rapid changes\r\n const setFilterState = (state: TFilterState<T>) => {\r\n // preserve filterLogic from current state, fallback to defaultFilterLogic if not set\r\n const currentFilterLogic = (props.value || localState.filterState).filterLogic ?? defaultFilterLogic\r\n const mergedState: TFilterState<T> = { filterLogic: currentFilterLogic, ...state }\r\n // store latest requested state\r\n pendingStateRef.current = mergedState\r\n\r\n // If uncontrolled, update UI immediately for responsiveness\r\n if (!props.value) setLocalState({ filterState: mergedState })\r\n\r\n // debounce actual handler calls so only the last one within delay fires\r\n if (debounceTimer.current) clearTimeout(debounceTimer.current)\r\n debounceTimer.current = window.setTimeout(() => {\r\n // abort previous in-flight request before starting a new one\r\n abortControllerRef.current?.abort()\r\n const controller = new AbortController()\r\n abortControllerRef.current = controller\r\n\r\n const s = pendingStateRef.current as TFilterState<T>\r\n if (props.value) {\r\n handleChange(s, controller.signal)\r\n } else {\r\n handleChange(s, controller.signal, { filterState: s })\r\n }\r\n debounceTimer.current = null\r\n pendingStateRef.current = null\r\n }, debounceDelay)\r\n }\r\n\r\n const contextValue: IFilterBarContext<T> = {\r\n filterState: props.value || localState.filterState,\r\n defaultFilterState: getDefaultFilterState(),\r\n isLoading: props.loading || isLoading,\r\n setFilterState\r\n }\r\n\r\n const theme = useTheme()\r\n const isSmall = useMediaQuery(theme.breakpoints.down('md'))\r\n\r\n return (\r\n <Context.Provider value={contextValue}>\r\n <FilterBarStyled className={filterbarClasses.root} sx={props.sx}>\r\n <Box className={filterbarClasses.inner}>\r\n {slots?.before || null}\r\n <div className={filterbarClasses.action}>\r\n <MenuComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n <SortComponent slots={{ popperProps: { placement: 'bottom-start' } }} />\r\n </div>\r\n <InputComponent slots={{ minimalInput: isSmall, popperProps: { placement: 'bottom-start' } }} />\r\n {slots?.after || null}\r\n </Box>\r\n <Box {...slots?.summaryWrapProps} sx={{ display: 'flex', alignItems: 'center', ...slots?.summaryWrapProps?.sx }}>\r\n {slots?.summaryBefore || null}\r\n <Box sx={{ flex: 1, minWidth: 0 }}>{configs.enableSummary !== false && <SummaryComponent />}</Box>\r\n {slots?.summaryAfter || null}\r\n </Box>\r\n </FilterBarStyled>\r\n </Context.Provider>\r\n )\r\n }\r\n\r\n return FilterBar\r\n}\r\n\r\nconst filterbarClasses = {\r\n root: 'DinoFilterBar-root',\r\n inner: 'DinoFilterBar-inner',\r\n action: 'DinoFilterBar-action'\r\n}\r\n\r\nconst FilterBarStyled = styled(Box)(({ theme }) => ({\r\n [`&.${filterbarClasses.root}`]: {\r\n backgroundColor: theme.palette.background.paper,\r\n boxSizing: 'border-box'\r\n },\r\n [`.${filterbarClasses.inner}`]: {\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: theme.spacing(1)\r\n },\r\n [`.${filterbarClasses.action}`]: {\r\n display: 'flex',\r\n alignItems: 'center'\r\n }\r\n}))\r\n"],"names":["createFilterBar","configs","_configs$debounceDela","debounceDelay","InputComponent","configInput","inputConfig","fields","createFilterInput","MenuComponent","configMenu","menuConfig","createFilterMenu","SummaryComponent","enableSummary","configSummary","summaryConfig","createFilterSummary","SortComponent","configSort","sortConfig","createFilterSort","defaultFilterLogic","Context","createFilterBarContext","props","_slots$summaryWrapPro","slots","getDefaultFilterState","Object","assign","filterLogic","defaultFilterState","defaultValue","_useState","useState","value","filterState","_useState2","_slicedToArray","localState","setLocalState","_useState3","_useState4","isLoading","setIsLoading","debounceTimer","useRef","pendingStateRef","abortControllerRef","useEffect","_abortControllerRef$c","current","clearTimeout","abort","handleChange","_ref","_asyncToGenerator","_regenerator","m","_callee","signal","state","_props$onChange","_t","w","_context","p","n","prev","_state$filterState","onChange","call","aborted","a","v","_x","_x2","_x3","apply","this","arguments","contextValue","loading","setFilterState","_filterLogic","currentFilterLogic","mergedState","_objectSpread","window","setTimeout","_abortControllerRef$c2","controller","AbortController","s","theme","useTheme","isSmall","useMediaQuery","breakpoints","down","_jsx","Provider","children","_jsxs","FilterBarStyled","className","filterbarClasses","root","sx","Box","inner","before","action","popperProps","placement","minimalInput","after","summaryWrapProps","display","alignItems","summaryBefore","flex","minWidth","summaryAfter","styled","_ref2","_defineProperty","concat","backgroundColor","palette","background","paper","boxSizing","gap","spacing"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{createClass as e,classCallCheck as t,defineProperty as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{createFilterBar as i}from"./index.create.js";import{createLocalFilterBuilder as l}from"./local-filter-builder.js";import{createConvertToGraphQL as m,mapLogic as o,mapSortDirection as a}from"./convert-to-graphql.js";import{isEmptyFilterState as s,removeNullValues as c,isFilterStateEqual as f,setFilterToURL as h,getFilterFromURL as p}from"./helpers.js";import{createFormFieldSelectWithFallback as F,createFormFieldSelectMultipleWithFallback as u}from"./menu/create-form-field-select.fallback.js";import d,{formatterNumber as n}from"./menu/create-form-field-number.js";import{createFormFieldDateTime as j,formatterDateTime as b}from"./menu/create-form-field-datetime.js";import S from"./menu/create-form-field-string.js";import g from"./menu/create-form-field-select.js";import v from"./menu/create-form-field-select-multiple.js";var L=e(function e(){t(this,e),r(this,"createFilterBar",i),r(this,"createConvertToGraphQL",m),r(this,"createLocalFilterBuilder",l),r(this,"createFormFieldString",S),r(this,"createFormFieldNumber",d),r(this,"createFormFieldDateTime",j),r(this,"createFormFieldSelect",g),r(this,"createFormFieldSelectWithFallback",F),r(this,"createFormFieldSelectMultiple",v),r(this,"createFormFieldSelectMultipleWithFallback",u),r(this,"mapLogic",o),r(this,"mapDirection",a),r(this,"formatterDateTime",b),r(this,"formatterNumber",n),r(this,"isEmptyFilterState",s),r(this,"removeNullValues",c),r(this,"isFilterStateEqual",f),r(this,"setFilterToURL",h),r(this,"getFilterFromURL",p)}),k=new L;export{L as DinoFilterBar,k as dinoFilterBar};
1
+ import{createClass as e,classCallCheck as t,defineProperty as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{createFilterBar as i}from"./index.create.js";import{createLocalFilterBuilder as l}from"./local-filter-builder.js";import{createConvertToGraphQL as o,mapLogic as m,mapSortDirection as a}from"./convert-to-graphql.js";import{isEmptyFilterState as s,removeNullValues as c,isFilterStateEqual as f,setFilterToURL as h,getFilterFromURL as p}from"./helpers.js";import{createFormFieldSelectWithFallback as F,createFormFieldSelectMultipleWithFallback as n}from"./menu/create-form-field-select.fallback.js";import u,{formatterNumber as d}from"./menu/create-form-field-number.js";import{createFormFieldDateTime as j,formatterDateTime as b}from"./menu/create-form-field-datetime.js";import S from"./menu/create-form-field-string.js";import g from"./menu/create-form-field-select.js";import v,{formatterBoolean as B}from"./menu/create-form-field-boolean.js";import L from"./menu/create-form-field-select-multiple.js";var k=e(function e(){t(this,e),r(this,"createFilterBar",i),r(this,"createConvertToGraphQL",o),r(this,"createLocalFilterBuilder",l),r(this,"createFormFieldString",S),r(this,"createFormFieldNumber",u),r(this,"createFormFieldDateTime",j),r(this,"createFormFieldBoolean",v),r(this,"createFormFieldSelect",g),r(this,"createFormFieldSelectWithFallback",F),r(this,"createFormFieldSelectMultiple",L),r(this,"createFormFieldSelectMultipleWithFallback",n),r(this,"mapLogic",m),r(this,"mapDirection",a),r(this,"formatterDateTime",b),r(this,"formatterNumber",d),r(this,"formatterBoolean",B),r(this,"isEmptyFilterState",s),r(this,"removeNullValues",c),r(this,"isFilterStateEqual",f),r(this,"setFilterToURL",h),r(this,"getFilterFromURL",p)}),C=new k;export{k as DinoFilterBar,C as dinoFilterBar};
2
2
  //# sourceMappingURL=index.dino.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.dino.js","sources":["../../../src/filter-bar/index.dino.tsx"],"sourcesContent":["import { createFilterBar } from './index.create'\r\nimport { createLocalFilterBuilder } from './local-filter-builder'\r\nimport { createConvertToGraphQL, mapLogic, mapSortDirection } from './convert-to-graphql'\r\nimport { getFilterFromURL, isEmptyFilterState, isFilterStateEqual, removeNullValues, setFilterToURL } from './helpers'\r\nimport { createFormFieldSelectMultipleWithFallback, createFormFieldSelectWithFallback } from './menu/create-form-field-select.fallback'\r\nimport createFormFieldNumber, { formatterNumber } from './menu/create-form-field-number'\r\nimport createFormFieldDateTime, { formatterDateTime } from './menu/create-form-field-datetime'\r\nimport createFormFieldString from './menu/create-form-field-string'\r\nimport createFormFieldSelect from './menu/create-form-field-select'\r\nimport createFormFieldSelectMultiple from './menu/create-form-field-select-multiple'\r\n\r\nexport class DinoFilterBar {\r\n createFilterBar = createFilterBar\r\n createConvertToGraphQL = createConvertToGraphQL\r\n createLocalFilterBuilder = createLocalFilterBuilder\r\n\r\n // Form fields\r\n createFormFieldString = createFormFieldString\r\n createFormFieldNumber = createFormFieldNumber\r\n createFormFieldDateTime = createFormFieldDateTime\r\n createFormFieldSelect = createFormFieldSelect\r\n createFormFieldSelectWithFallback = createFormFieldSelectWithFallback\r\n createFormFieldSelectMultiple = createFormFieldSelectMultiple\r\n createFormFieldSelectMultipleWithFallback = createFormFieldSelectMultipleWithFallback\r\n\r\n // support\r\n mapLogic = mapLogic\r\n mapDirection = mapSortDirection\r\n\r\n // formatter\r\n formatterDateTime = formatterDateTime\r\n formatterNumber = formatterNumber\r\n\r\n // helpers\r\n isEmptyFilterState = isEmptyFilterState\r\n removeNullValues = removeNullValues\r\n isFilterStateEqual = isFilterStateEqual\r\n setFilterToURL = setFilterToURL\r\n getFilterFromURL = getFilterFromURL\r\n}\r\n\r\nexport const dinoFilterBar = new DinoFilterBar()\r\n"],"names":["DinoFilterBar","_createClass","_classCallCheck","_defineProperty","createFilterBar","createConvertToGraphQL","createLocalFilterBuilder","createFormFieldString","createFormFieldNumber","createFormFieldDateTime","createFormFieldSelect","createFormFieldSelectWithFallback","createFormFieldSelectMultiple","createFormFieldSelectMultipleWithFallback","mapLogic","mapSortDirection","formatterDateTime","formatterNumber","isEmptyFilterState","removeNullValues","isFilterStateEqual","setFilterToURL","getFilterFromURL","dinoFilterBar"],"mappings":"s7BAWA,IAAaA,EAAaC,EAAA,SAAAD,IAAAE,OAAAF,GAAAG,yBACNC,GAAeD,gCACRE,GAAsBF,kCACpBG,GAE3BH,+BACwBI,GAAqBJ,+BACrBK,GAAqBL,iCACnBM,GAAuBN,+BACzBO,GAAqBP,2CACTQ,GAAiCR,uCACrCS,GAA6BT,mDACjBU,GAE5CV,kBACWW,GAAQX,sBACJY,GAEfZ,2BACoBa,GAAiBb,yBACnBc,GAElBd,4BACqBe,GAAkBf,0BACpBgB,GAAgBhB,4BACdiB,GAAkBjB,wBACtBkB,GAAclB,0BACZmB,EAAgB,GAGxBC,EAAgB,IAAIvB"}
1
+ {"version":3,"file":"index.dino.js","sources":["../../../src/filter-bar/index.dino.tsx"],"sourcesContent":["import { createFilterBar } from './index.create'\r\nimport { createLocalFilterBuilder } from './local-filter-builder'\r\nimport { createConvertToGraphQL, mapLogic, mapSortDirection } from './convert-to-graphql'\r\nimport { getFilterFromURL, isEmptyFilterState, isFilterStateEqual, removeNullValues, setFilterToURL } from './helpers'\r\nimport { createFormFieldSelectMultipleWithFallback, createFormFieldSelectWithFallback } from './menu/create-form-field-select.fallback'\r\nimport createFormFieldNumber, { formatterNumber } from './menu/create-form-field-number'\r\nimport createFormFieldDateTime, { formatterDateTime } from './menu/create-form-field-datetime'\r\nimport createFormFieldString from './menu/create-form-field-string'\r\nimport createFormFieldSelect from './menu/create-form-field-select'\r\nimport createFormFieldBoolean, { formatterBoolean } from './menu/create-form-field-boolean'\r\nimport createFormFieldSelectMultiple from './menu/create-form-field-select-multiple'\r\n\r\nexport class DinoFilterBar {\r\n createFilterBar = createFilterBar\r\n createConvertToGraphQL = createConvertToGraphQL\r\n createLocalFilterBuilder = createLocalFilterBuilder\r\n\r\n // Form fields\r\n createFormFieldString = createFormFieldString\r\n createFormFieldNumber = createFormFieldNumber\r\n createFormFieldDateTime = createFormFieldDateTime\r\n createFormFieldBoolean = createFormFieldBoolean\r\n createFormFieldSelect = createFormFieldSelect\r\n createFormFieldSelectWithFallback = createFormFieldSelectWithFallback\r\n createFormFieldSelectMultiple = createFormFieldSelectMultiple\r\n createFormFieldSelectMultipleWithFallback = createFormFieldSelectMultipleWithFallback\r\n\r\n // support\r\n mapLogic = mapLogic\r\n mapDirection = mapSortDirection\r\n\r\n // formatter\r\n formatterDateTime = formatterDateTime\r\n formatterNumber = formatterNumber\r\n formatterBoolean = formatterBoolean\r\n\r\n // helpers\r\n isEmptyFilterState = isEmptyFilterState\r\n removeNullValues = removeNullValues\r\n isFilterStateEqual = isFilterStateEqual\r\n setFilterToURL = setFilterToURL\r\n getFilterFromURL = getFilterFromURL\r\n}\r\n\r\nexport const dinoFilterBar = new DinoFilterBar()\r\n"],"names":["DinoFilterBar","_createClass","_classCallCheck","_defineProperty","createFilterBar","createConvertToGraphQL","createLocalFilterBuilder","createFormFieldString","createFormFieldNumber","createFormFieldDateTime","createFormFieldBoolean","createFormFieldSelect","createFormFieldSelectWithFallback","createFormFieldSelectMultiple","createFormFieldSelectMultipleWithFallback","mapLogic","mapSortDirection","formatterDateTime","formatterNumber","formatterBoolean","isEmptyFilterState","removeNullValues","isFilterStateEqual","setFilterToURL","getFilterFromURL","dinoFilterBar"],"mappings":"ggCAYA,IAAaA,EAAaC,EAAA,SAAAD,IAAAE,OAAAF,GAAAG,yBACNC,GAAeD,gCACRE,GAAsBF,kCACpBG,GAE3BH,+BACwBI,GAAqBJ,+BACrBK,GAAqBL,iCACnBM,GAAuBN,gCACxBO,GAAsBP,+BACvBQ,GAAqBR,2CACTS,GAAiCT,uCACrCU,GAA6BV,mDACjBW,GAE5CX,kBACWY,GAAQZ,sBACJa,GAEfb,2BACoBc,GAAiBd,yBACnBe,GAAef,0BACdgB,GAEnBhB,4BACqBiB,GAAkBjB,0BACpBkB,GAAgBlB,4BACdmB,GAAkBnB,wBACtBoB,GAAcpB,0BACZqB,EAAgB,GAGxBC,EAAgB,IAAIzB"}
@@ -0,0 +1,2 @@
1
+ import{defineProperty as l,slicedToArray as e}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as n}from"react/jsx-runtime";import{useMemo as o,useState as t}from"react";import{styled as r,radioGroupClasses as a,Box as u,Typography as s,RadioGroup as c,FormControlLabel as d,Radio as v,Button as p}from"@mui/material";import{createChipViewers as m}from"../components/chip-viewer.js";import{ButtonBack as f,ChipDark as b}from"../components/ui.units.js";import{PopperContent as g,PopperBody as h,PopperFooter as y}from"../components/popper-custom.js";function x(l){var r,a,x=m(),C=null!==(r=null==l?void 0:l.trueLabel)&&void 0!==r?r:"Yes",z=null!==(a=null==l?void 0:l.falseLabel)&&void 0!==a?a:"No",j=[{value:!0,label:C},{value:!1,label:z}];return function(r){var a,m=o(function(){return Object.assign({},{singleValue:!0},r.currentConfig,null==l?void 0:l.config)},[null==l?void 0:l.config,r.currentConfig]),k=r.value,A=void 0===k?{values:[],logic:"or"}:k,L=A.values.length>0?String(A.values[0]):"",B=t(L),N=e(B,2),P=N[0],R=N[1],T=null!==(a=null==m?void 0:m.label)&&void 0!==a?a:m.field.toString(),V=""!==P,w=!V,F=o(function(){var l=Array.isArray(A.values)?A.values:[A.values];return{field:m.field,items:l.map(function(l){return{value:l,label:!0===l?C:!1===l?z:String(l)}})}},[m.field,A]),I=o(function(){var e=(null==l?void 0:l.top)||r.top;return e?i(u,{sx:{mb:1},children:e}):null},[null==l?void 0:l.top,r.top]),Y=[];return r.isLoading&&Y.push("disabled"),i(S,{className:Y.join(" "),noValidate:!0,onSubmit:function(l){(l.preventDefault(),l.stopPropagation(),V)&&(!function(l){r.onSubmit(m.field,l,m)}({values:["true"===P],logic:"or"}),R(""))},children:n(g,{title:"Filter by ".concat(T),onClose:r.onClose,slots:{beforeTitle:i(f,{size:"small",onClick:r.onBack}),afterTitle:i(b,{sx:{ml:1.5},size:"small",label:"Single value"})},children:[n(h,{children:[I,m.description&&i(s,{variant:"caption",color:"text.secondary",sx:{mb:1,display:"block"},children:m.description}),i(x,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:F,onRemove:r.onRemove}),i(c,{name:m.field.toString(),value:P,onChange:function(l){return R(l.target.value)},children:j.map(function(l){return i(d,{value:String(l.value),control:i(v,{size:"small"}),label:i(s,{variant:"body2",children:l.label})},String(l.value))})})]}),n(y,{children:[i(p,{size:"small",color:"error",variant:"text",disabled:!A.values||0===A.values.length,onClick:function(){var l;null===(l=r.onRemoveField)||void 0===l||l.call(r,m.field,m)},children:"Clear All"}),i(u,{sx:{flex:1}}),i(p,{size:"small",color:"inherit",variant:"text",onClick:r.onClose,children:"Cancel"}),i(p,{size:"small",type:"submit",color:"primary",variant:"contained",disabled:w,children:"Apply"})]})]})})}}function C(l){var e,i,n=null!==(e=null==l?void 0:l.trueLabel)&&void 0!==e?e:"Yes",o=null!==(i=null==l?void 0:l.falseLabel)&&void 0!==i?i:"No";return function(l){return!0===l||"true"===l?n:!1===l||"false"===l?o:String(l)}}var S=r("form")(l({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.12)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}},".".concat(a.root),{gap:0}));export{x as default,C as formatterBoolean};
2
+ //# sourceMappingURL=create-form-field-boolean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-form-field-boolean.js","sources":["../../../../src/filter-bar/menu/create-form-field-boolean.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useMemo, useState } from 'react'\r\nimport { Box, Button, FormControlLabel, Radio, RadioGroup, radioGroupClasses, styled, Typography } from '@mui/material'\r\nimport { createChipViewers, TChipViewerGroup } from '../components/chip-viewer'\r\nimport { ButtonBack, ChipDark } from '../components/ui.units'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\n// types\r\nimport type { FC, ReactNode } from 'react'\r\nimport type { TFieldValid, TFieldValue } from '../types'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps } from './types'\r\n\r\n/** Props for the `FormFieldBoolean` component returned by `createFormFieldBoolean`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldBooleanProps<T> extends IFilterMenuFormProps<T> {\r\n /** Optional content to render at the top of the form */\r\n top?: ReactNode\r\n}\r\n\r\n/** Parameters passed to `createFormFieldBoolean` to configure the generated component. */\r\nexport interface IFormFieldBooleanParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n /** Label for the `true` option. @default \"Yes\" */\r\n trueLabel?: string\r\n /** Label for the `false` option. @default \"No\" */\r\n falseLabel?: string\r\n /** Optional content to render at the top of the form */\r\n top?: ReactNode\r\n}\r\n\r\n/**\r\n * Factory function that creates a `FormFieldBoolean` filter-menu component.\r\n *\r\n * The generated component renders two radio buttons (true / false) inside a\r\n * popper/menu panel. It is designed for boolean fields such as `is_active`,\r\n * `is_deleted`, `is_verified`, etc. It supports:\r\n * - Configurable labels for the true/false options (e.g. \"Yes / No\", \"Active / Inactive\")\r\n * - Chip viewers showing the currently applied value\r\n * - Single-value mode by default (only one boolean can be applied at a time)\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (optional label overrides, optional field config override)\r\n * @returns A React FC ready to be used as a boolean filter-menu field component\r\n */\r\nfunction createFormFieldBoolean<T>(params?: IFormFieldBooleanParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n\r\n const trueLabel = params?.trueLabel ?? 'Yes'\r\n const falseLabel = params?.falseLabel ?? 'No'\r\n\r\n const BOOLEAN_OPTIONS: { value: TFieldValid; label: string }[] = [\r\n { value: true, label: trueLabel },\r\n { value: false, label: falseLabel }\r\n ]\r\n\r\n const FormFieldBoolean: FC<IFormFieldBooleanProps<T>> = (props) => {\r\n /** Merge `props.currentConfig` with `params.config` (if provided).\r\n * Fields from `params.config` override the corresponding keys in `props.currentConfig`.\r\n * Any keys not present in `params.config` are preserved from `props.currentConfig`.\r\n */\r\n // singleValue:true is the boolean default — ensures replaceFilter is used instead of upsertManyFilter\r\n const mergedConfig = useMemo(\r\n () => Object.assign({}, { singleValue: true }, props.currentConfig, params?.config),\r\n [params?.config, props.currentConfig]\r\n )\r\n\r\n const { value = { values: [], logic: 'or' } } = props\r\n // Initialize from existing applied value so the radio reflects current state when reopening\r\n const initialSelected = value.values.length > 0 ? String(value.values[0]) : ''\r\n // Radio value is stored as string in DOM; convert back to boolean on submit\r\n const [selectedValue, setSelectedValue] = useState<string>(initialSelected)\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n const hasDataChange = selectedValue !== ''\r\n const isApplyDisabled = !hasDataChange\r\n\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(mergedConfig.field, newValue, mergedConfig)\r\n }\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n if (!hasDataChange) return\r\n\r\n // Convert string back to actual boolean\r\n const boolValue = selectedValue === 'true'\r\n const newValue: TFieldValue = { values: [boolValue as TFieldValid], logic: 'or' }\r\n handleSubmit(newValue)\r\n setSelectedValue('')\r\n }\r\n\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return {\r\n field: mergedConfig.field,\r\n items: items.map((v) => ({\r\n value: v,\r\n label: v === true ? trueLabel : v === false ? falseLabel : String(v)\r\n }))\r\n }\r\n }, [mergedConfig.field, value])\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field, mergedConfig)\r\n }\r\n\r\n const renderTop = useMemo(() => {\r\n const topContent = params?.top || props.top\r\n if (topContent) return <Box sx={{ mb: 1 }}>{topContent}</Box>\r\n return null\r\n }, [params?.top, props.top])\r\n\r\n // Boolean is always single-value — show badge instead of logic toggle\r\n const renderAfterTitle = () => <ChipDark sx={{ ml: 1.5 }} size='small' label='Single value' />\r\n\r\n const rootClasses: string[] = []\r\n if (props.isLoading) rootClasses.push('disabled')\r\n\r\n return (\r\n <RootStyled className={rootClasses.join(' ')} noValidate onSubmit={handleSubmitForm}>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n {renderTop}\r\n {mergedConfig.description && (\r\n <Typography variant='caption' color='text.secondary' sx={{ mb: 1, display: 'block' }}>\r\n {mergedConfig.description}\r\n </Typography>\r\n )}\r\n <ChipViewers\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n <RadioGroup name={mergedConfig.field.toString()} value={selectedValue} onChange={(e) => setSelectedValue(e.target.value)}>\r\n {BOOLEAN_OPTIONS.map((option) => (\r\n <FormControlLabel\r\n key={String(option.value)}\r\n value={String(option.value)}\r\n control={<Radio size='small' />}\r\n label={<Typography variant='body2'>{option.label}</Typography>}\r\n />\r\n ))}\r\n </RadioGroup>\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button size='small' color='error' variant='text' disabled={!value.values || value.values.length === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained' disabled={isApplyDisabled}>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </RootStyled>\r\n )\r\n }\r\n\r\n return FormFieldBoolean\r\n}\r\n\r\nexport default createFormFieldBoolean\r\n\r\n// ---------------------------------------------------------------------------\r\n// Utilities\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Creates a `labelFormatter` for use in `summaryConfig`.\r\n * Converts boolean values (`true` / `false`) to human-readable labels in the filter summary chips.\r\n *\r\n * @param trueLabel - Label shown for `true`. @default \"Yes\"\r\n * @param falseLabel - Label shown for `false`. @default \"No\"\r\n *\r\n * @example\r\n * ```ts\r\n * createFilterSummary({\r\n * fields: {\r\n * active: { label: 'Active', labelFormatter: formatterBoolean({ trueLabel: 'Active', falseLabel: 'Inactive' }) }\r\n * }\r\n * })\r\n * ```\r\n */\r\nexport function formatterBoolean(param?: { trueLabel?: string; falseLabel?: string }) {\r\n const trueLabel = param?.trueLabel ?? 'Yes'\r\n const falseLabel = param?.falseLabel ?? 'No'\r\n return (value: TFieldValid): string | undefined => {\r\n if (value === true || value === 'true') return trueLabel\r\n if (value === false || value === 'false') return falseLabel\r\n return String(value)\r\n }\r\n}\r\n\r\nconst RootStyled = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0,\r\n backgroundColor: 'rgba(0, 0, 0, 0.12)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': { zIndex: 1, opacity: 1, visibility: 'visible' }\r\n },\r\n [`.${radioGroupClasses.root}`]: { gap: 0 }\r\n})\r\n"],"names":["createFormFieldBoolean","params","_params$trueLabel","_params$falseLabel","ChipViewers","createChipViewers","trueLabel","falseLabel","BOOLEAN_OPTIONS","value","label","props","_mergedConfig$label","mergedConfig","useMemo","Object","assign","singleValue","currentConfig","config","_props$value","values","logic","initialSelected","length","String","_useState","useState","_useState2","_slicedToArray","selectedValue","setSelectedValue","field","toString","hasDataChange","isApplyDisabled","filterViewerValue","items","Array","isArray","map","v","renderTop","topContent","top","_jsx","Box","sx","mb","children","rootClasses","isLoading","push","RootStyled","className","join","noValidate","onSubmit","event","preventDefault","stopPropagation","newValue","handleSubmit","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","ChipDark","ml","PopperBody","description","Typography","variant","color","display","borderBottom","placement","enableMinimalesticView","onRemove","RadioGroup","name","onChange","e","target","option","FormControlLabel","control","Radio","PopperFooter","Button","disabled","_props$onRemoveField","onRemoveField","call","flex","type","formatterBoolean","param","_param$trueLabel","_param$falseLabel","styled","_defineProperty","position","content","inset","backgroundColor","filter","zIndex","opacity","transition","visibility","pointerEvents","radioGroupClasses","root","gap"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{objectSpread2 as e,slicedToArray as n}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{useMemo as t,useState as l}from"react";import{AdapterDayjs as o}from"@mui/x-date-pickers/AdapterDayjs";import{styled as r,Stack as d,Typography as c,Button as u,Box as s}from"@mui/material";import{LocalizationProvider as m,DatePicker as v,TimePicker as f,DateTimePicker as p}from"@mui/x-date-pickers";import g from"dayjs";import{ButtonBack as b,DateLogicToggle as h}from"../components/ui.units.js";import{createChipViewers as y}from"../components/chip-viewer.js";import{PopperContent as x,PopperBody as A,PopperFooter as C}from"../components/popper-custom.js";var S={before:"Before",on:"On",after:"After"},D={date:"MM/DD/YYYY",datetime:"MM/DD/YYYY HH:mm",time:"HH:mm"};function k(r){var k,j,z=y(),w=null!==(k=null==r?void 0:r.pickerType)&&void 0!==k?k:"datetime",T=null!==(j=null==r?void 0:r.mode)&&void 0!==j?j:"single",Y=D[w],F=e(e({},null==r?void 0:r.config),{},{singleValue:!0});return function(y){var D,k,j,O=t(function(){return Object.assign({},y.currentConfig,F)},[y.currentConfig]),V=y.value,B=void 0===V?{values:[]}:V,I=null!==(D=null==O?void 0:O.label)&&void 0!==D?D:O.field.toString(),H=l(null!==(k=B.dateLogic)&&void 0!==k?k:"on"),M=n(H,2),P=M[0],R=M[1],_=l(null),E=n(_,2),N=E[0],W=E[1],q=l(function(){if("range"!==T)return null;var e=Array.isArray(B.values)?B.values[0]:void 0;return e?g(e):null}),G=n(q,2),J=G[0],K=G[1],Q=l(function(){if("range"!==T)return null;var e=Array.isArray(B.values)?B.values[1]:void 0;return e?g(e):null}),U=n(Q,2),X=U[0],Z=U[1],$=function(e){y.onSubmit(O.field,e,O)},ee=t(function(){var e=Array.isArray(B.values)?B.values:[B.values];return{field:O.field,items:e.map(function(e,n){return{value:e,label:(i=e,a=B.dateLogic,t=n,o=g(i),r=o.isValid()?o.format(Y):String(i),"range"===T?0===t?"From: ".concat(r):"To: ".concat(r):a&&"range"!==a?"".concat(null!==(l=S[a])&&void 0!==l?l:a,": ").concat(r):r)};var i,a,t,l,o,r})}},[O.field,B]),ne="range"!==T&&B.values.length>0&&P!==(null!==(j=B.dateLogic)&&void 0!==j?j:"on"),ie="range"===T?!J||!X:!(null!=N&&N.isValid()||ne),ae=t(function(){return"range"===T&&J&&X&&(J.isSame(X)||J.isAfter(X))?'"From" must be earlier than "To"':null},[J,X]),te=ie||Boolean(ae),le=[];y.isLoading&&le.push("disabled");var oe="date"===w?"day":"minute",re=function(n,a,t,l){var o=e(e(e({value:n,onChange:a,label:t},null!=l&&l.minDate?{minDate:l.minDate}:{}),null!=l&&l.maxDate?{maxDate:l.maxDate}:{}),{},{slotProps:{textField:{size:"small",fullWidth:!0},popper:{sx:{zIndex:9999},modifiers:[{name:"preventOverflow",enabled:!0,options:{boundary:"window",altAxis:!0}},{name:"flip",enabled:!0}]}}});return"date"===w?i(v,e(e({},o),{},{format:Y})):"time"===w?i(f,e({},o)):i(p,e(e({},o),{},{format:Y}))};return i(L,{className:le.join(" "),noValidate:!0,onSubmit:function(e){if(e.preventDefault(),"range"===T){var n=[null==J?void 0:J.toISOString(),null==X?void 0:X.toISOString()].filter(Boolean);if(0===n.length||ae)return;$({values:n,dateLogic:"range"})}else null!=N&&N.isValid()?($({values:[N.toISOString()],dateLogic:P}),W(null)):ne&&$({values:B.values,dateLogic:P})},children:a(x,{title:"Filter by ".concat(I),onClose:y.onClose,slots:{beforeTitle:i(b,{size:"small",onClick:y.onBack}),afterTitle:"range"===T?null:i(h,{sx:{ml:1},value:P,onChange:function(e,n){return R(n)}})},children:[a(A,{children:[i(z,{sx:{mb:1,borderBottom:"none!important"},label:"range"===T?"Active range":"Applied",placement:"horizontal",enableMinimalesticView:!0,value:ee,forceShowAll:"range"===T,onRemove:"range"===T?void 0:y.onRemove}),i(m,{dateAdapter:o,children:a(d,"range"===T?{spacing:1.5,children:[i(c,{variant:"caption",color:"text.secondary",children:"Select a date range to filter between two values."}),re(J,K,"From",{maxDate:X?X.subtract(1,oe):void 0}),re(X,Z,"To",{minDate:J?J.add(1,oe):void 0}),ae&&i(c,{variant:"caption",color:"error",children:ae})]}:{gap:1,children:[i(c,{variant:"caption",color:"text.secondary",children:"Pick a date and set the match condition above. Only the latest applied value is kept."}),re(N,W,I)]})})]}),a(C,{children:[i(u,{size:"small",color:"error",variant:"text",disabled:!B.values||0===B.values.length,onClick:function(){var e,n;null===(e=y.onRemoveField)||void 0===e||e.call(y,O.field),!1!==(null==r||null===(n=r.config)||void 0===n?void 0:n.closeAfterClear)&&y.onClose()},children:"Clear All"}),i(s,{sx:{flex:1}}),i(u,{size:"small",color:"inherit",variant:"text",onClick:y.onClose,children:"Cancel"}),i(u,{size:"small",type:"submit",color:"primary",variant:"contained",disabled:te,children:"Apply"})]})]})})}}var L=r("form")({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.2)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}});function j(){var e=D[arguments.length>0&&void 0!==arguments[0]?arguments[0]:"datetime"];return function(n,i,a){var t,l=g(n),o=l.isValid()?l.format(e):String(n);return"range"===a.dateLogic?0===i?"From: ".concat(o):"To: ".concat(o):a.dateLogic?"".concat(null!==(t=S[a.dateLogic])&&void 0!==t?t:a.dateLogic,": ").concat(o):o}}export{k as createFormFieldDateTime,k as default,j as formatterDateTime};
1
+ import{objectSpread2 as e,slicedToArray as n}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as a}from"react/jsx-runtime";import{useMemo as t,useState as r}from"react";import{AdapterDayjs as l}from"@mui/x-date-pickers/AdapterDayjs";import{styled as o,Stack as d,Typography as c,Button as u,Box as s}from"@mui/material";import{LocalizationProvider as m,DatePicker as v,TimePicker as f,DateTimePicker as p}from"@mui/x-date-pickers";import g from"dayjs";import{ButtonBack as b,DateLogicToggle as h}from"../components/ui.units.js";import{createChipViewers as y}from"../components/chip-viewer.js";import{PopperContent as x,PopperBody as A,PopperFooter as S}from"../components/popper-custom.js";var D={before:"Before",on:"On",after:"After"},C={date:"MM/DD/YYYY",datetime:"MM/DD/YYYY HH:mm",time:"HH:mm"};function k(o){var k,j,z=y(),w=null!==(k=null==o?void 0:o.pickerType)&&void 0!==k?k:"datetime",T=null!==(j=null==o?void 0:o.mode)&&void 0!==j?j:"single",Y=C[w],F=e(e({},null==o?void 0:o.config),{},{singleValue:!0});return function(o){var y,C,k,j=t(function(){return Object.assign({},o.currentConfig,F)},[o.currentConfig]),O=o.value,V=void 0===O?{values:[]}:O,B=null!==(y=null==j?void 0:j.label)&&void 0!==y?y:j.field.toString(),I=r(null!==(C=V.dateLogic)&&void 0!==C?C:"on"),H=n(I,2),M=H[0],P=H[1],R=r(null),_=n(R,2),E=_[0],N=_[1],W=r(function(){if("range"!==T)return null;var e=Array.isArray(V.values)?V.values[0]:void 0;return e?g(e):null}),q=n(W,2),G=q[0],J=q[1],K=r(function(){if("range"!==T)return null;var e=Array.isArray(V.values)?V.values[1]:void 0;return e?g(e):null}),Q=n(K,2),U=Q[0],X=Q[1],Z=function(e){o.onSubmit(j.field,e,j)},$=t(function(){var e=Array.isArray(V.values)?V.values:[V.values];return{field:j.field,items:e.map(function(e,n){return{value:e,label:(i=e,a=V.dateLogic,t=n,l=g(i),o=l.isValid()?l.format(Y):String(i),"range"===T?0===t?"From: ".concat(o):"To: ".concat(o):a&&"range"!==a?"".concat(null!==(r=D[a])&&void 0!==r?r:a,": ").concat(o):o)};var i,a,t,r,l,o})}},[j.field,V]),ee="range"!==T&&V.values.length>0&&M!==(null!==(k=V.dateLogic)&&void 0!==k?k:"on"),ne="range"===T?!G||!U:!(null!=E&&E.isValid()||ee),ie=t(function(){return"range"===T&&G&&U&&(G.isSame(U)||G.isAfter(U))?'"From" must be earlier than "To"':null},[G,U]),ae=ne||Boolean(ie),te=[];o.isLoading&&te.push("disabled");var re="date"===w?"day":"minute",le=function(n,a,t,r){var l=e(e(e({value:n,onChange:a,label:t},null!=r&&r.minDate?{minDate:r.minDate}:{}),null!=r&&r.maxDate?{maxDate:r.maxDate}:{}),{},{slotProps:{textField:{size:"small",fullWidth:!0},popper:{sx:{zIndex:9999},modifiers:[{name:"preventOverflow",enabled:!0,options:{boundary:"window",altAxis:!0}},{name:"flip",enabled:!0}]}}});return"date"===w?i(v,e(e({},l),{},{format:Y})):"time"===w?i(f,e({},l)):i(p,e(e({},l),{},{format:Y}))};return i(L,{className:te.join(" "),noValidate:!0,onSubmit:function(e){if(e.preventDefault(),"range"===T){var n=[null==G?void 0:G.toISOString(),null==U?void 0:U.toISOString()].filter(Boolean);if(0===n.length||ie)return;Z({values:n,dateLogic:"range"})}else null!=E&&E.isValid()?(Z({values:[E.toISOString()],dateLogic:M}),N(null)):ee&&Z({values:V.values,dateLogic:M})},children:a(x,{title:"Filter by ".concat(B),onClose:o.onClose,slots:{beforeTitle:i(b,{size:"small",onClick:o.onBack}),afterTitle:"range"===T?null:i(h,{sx:{ml:1},value:M,onChange:function(e,n){return P(n)}})},children:[a(A,{children:[i(z,{sx:{mb:1,borderBottom:"none!important"},label:"range"===T?"Active range":"Applied",placement:"horizontal",enableMinimalesticView:!0,value:$,forceShowAll:"range"===T,onRemove:"range"===T?void 0:o.onRemove}),i(m,{dateAdapter:l,children:a(d,"range"===T?{spacing:1.5,children:[i(c,{variant:"caption",color:"text.secondary",children:"Select a date range to filter between two values."}),le(G,J,"From",{maxDate:U?U.subtract(1,re):void 0}),le(U,X,"To",{minDate:G?G.add(1,re):void 0}),ie&&i(c,{variant:"caption",color:"error",children:ie})]}:{gap:1,children:[i(c,{variant:"caption",color:"text.secondary",children:"Pick a date and set the match condition above. Only the latest applied value is kept."}),le(E,N,B)]})})]}),a(S,{children:[i(u,{size:"small",color:"error",variant:"text",disabled:!V.values||0===V.values.length,onClick:function(){var e;null===(e=o.onRemoveField)||void 0===e||e.call(o,j.field,j)},children:"Clear All"}),i(s,{sx:{flex:1}}),i(u,{size:"small",color:"inherit",variant:"text",onClick:o.onClose,children:"Cancel"}),i(u,{size:"small",type:"submit",color:"primary",variant:"contained",disabled:ae,children:"Apply"})]})]})})}}var L=o("form")({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.2)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}});function j(){var e=C[arguments.length>0&&void 0!==arguments[0]?arguments[0]:"datetime"];return function(n,i,a){var t,r=g(n),l=r.isValid()?r.format(e):String(n);return"range"===a.dateLogic?0===i?"From: ".concat(l):"To: ".concat(l):a.dateLogic?"".concat(null!==(t=D[a.dateLogic])&&void 0!==t?t:a.dateLogic,": ").concat(l):l}}export{k as createFormFieldDateTime,k as default,j as formatterDateTime};
2
2
  //# sourceMappingURL=create-form-field-datetime.js.map