dinocollab-core 2.2.42 → 2.2.43
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.
- package/dist/src/filter-bar/hooks.js +1 -1
- package/dist/src/filter-bar/hooks.js.map +1 -1
- package/dist/src/filter-bar/index.create.js +1 -1
- package/dist/src/filter-bar/index.create.js.map +1 -1
- package/dist/src/filter-bar/menu/create-form-field-select-multiple.js +1 -1
- package/dist/src/filter-bar/menu/create-form-field-select-multiple.js.map +1 -1
- package/package.json +1 -1
|
@@ -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";import{DEFAULT_LOGIC as l}from"./helpers.js";var o=function(t){return
|
|
1
|
+
import{objectSpread2 as t,defineProperty as e,toConsumableArray as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as i}from"./types.js";import{DEFAULT_LOGIC as l}from"./helpers.js";var o=function(t,e){return e&&e!==l?t.logic=e:delete t.logic,t},n=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},a=function(t,i,l){var n=null==t?void 0:t[i],a={values:Array.from(new Set([].concat(r((null==n?void 0:n.values)||[]),r(l.values)).filter(function(t){return null!=t})))};return o(a,l.logic||(null==n?void 0:n.logic)),Object.assign({},t,e({},i,a))},s=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))},u=function(r){return{addFilter:function(e,i,l){var s=r.filterState.storeFilter,u=o(t({},i),(null==l?void 0:l.logic)||i.logic);if(!n(s,e,u)){var f=a(s,e,u),c=Object.assign({},s,f);r.setFilterState(t(t({},r.filterState),{},{storeFilter:c}))}},replaceFilter:function(i,l,n){var a=o(t({},l),(null==n?void 0:n.logic)||l.logic),s=Object.assign({},r.filterState.storeFilter,e({},i,a));r.setFilterState(t(t({},r.filterState),{},{storeFilter:s}))},upsertManyFilter:function(e,i,l){if(0!==i.values.length){var s=Object.assign({},r.filterState.storeFilter);i.values.forEach(function(t){var r=o({values:[t]},(null==l?void 0:l.logic)||i.logic);n(s,e,r)||(s=a(s,e,r))}),r.setFilterState(t(t({},r.filterState),{},{storeFilter:s}))}},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{s as mergeSingleValueToStoreFilter,a as mergeValueToStoreFilter,u 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 { DEFAULT_LOGIC } from './helpers'\r\nimport type { IFilterBarContext } from './index.context'\r\nimport type { TFieldSort, TFieldStore, TFieldType, TFieldValid, TFieldValue, TLogic } from './types'\r\n\r\n/** Return undefined when logic equals the default, so the store stays clean. */\r\nconst omitDefaultLogic = (logic?: TLogic): TLogic | undefined => (logic === DEFAULT_LOGIC ? undefined : logic)\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: omitDefaultLogic(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: omitDefaultLogic(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: omitDefaultLogic(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: omitDefaultLogic(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":["omitDefaultLogic","logic","DEFAULT_LOGIC","undefined","checkDuplicateValue","storeFilter","field","value","fieldValue","isLogicChange","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","newDirection","direction","removeSort","_context$defaultFilte2"],"mappings":"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"}
|
|
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 { DEFAULT_LOGIC } from './helpers'\r\nimport type { IFilterBarContext } from './index.context'\r\nimport type { TFieldSort, TFieldStore, TFieldType, TFieldValid, TFieldValue, TLogic } from './types'\r\n\r\n/** Strip logic key when it equals the default — keeps the store clean. */\r\nconst cleanLogic = (obj: TFieldValue, logic?: TLogic): TFieldValue => {\r\n if (logic && logic !== DEFAULT_LOGIC) obj.logic = logic\r\n else delete obj.logic\r\n return obj\r\n}\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>(\r\n storeFilter: TFieldStore<T> | undefined,\r\n field: keyof TFieldStore<T>,\r\n value: TFieldValue\r\n): 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 }\r\n cleanLogic(newData, 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>(\r\n storeFilter: TFieldStore<T> | undefined,\r\n field: keyof TFieldStore<T>,\r\n value: TFieldValid\r\n): 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 = cleanLogic({ ...value }, options?.logic || value.logic)\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 = cleanLogic({ ...value }, 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 = cleanLogic({ values: [val] }, 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":["cleanLogic","obj","logic","DEFAULT_LOGIC","checkDuplicateValue","storeFilter","field","value","fieldValue","isLogicChange","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,2 +1,2 @@
|
|
|
1
|
-
import{defineProperty as r,slicedToArray as e,objectSpread2 as t,asyncToGenerator as n,regenerator as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as i}from"react/jsx-runtime";import{useState as a,useRef as u,useEffect as m}from"react";import{styled as c,Box as s,useTheme as f,useMediaQuery as p}from"@mui/material";import{createFilterMenu as d}from"./menu/create.js";import{createFilterBarContext as v}from"./index.context.js";import{DEFAULT_LOGIC_ROOT as g}from"./helpers.js";import{createFilterSort as b}from"./components/filter-sort.js";import{createFilterInput as S}from"./components/filter-input.js";import{createFilterSummary as C}from"./components/filter-summary.js";function y(r){var c,y=null!==(c=r.debounceDelay)&&void 0!==c?c:300;if(!r.InputComponent){var j=r.inputConfig||{fields:{}};r.inputConfig=j,r.InputComponent=S(j)}if(!r.MenuComponent){var P=r.menuConfig||{fields:{}};r.menuConfig=P,r.MenuComponent=d(P)}if(!r.SummaryComponent&&!1!==r.enableSummary){var w=r.summaryConfig||{fields:{}};r.summaryConfig=w,r.SummaryComponent=C(w)}if(!r.SortComponent){var F=r.sortConfig||{fields:{}};r.sortConfig=F,r.SortComponent=b(F)}var I=r.defaultFilterLogic||g,
|
|
1
|
+
import{defineProperty as r,slicedToArray as e,objectSpread2 as t,asyncToGenerator as n,regenerator as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as i}from"react/jsx-runtime";import{useState as a,useRef as u,useEffect as m}from"react";import{styled as c,Box as s,useTheme as f,useMediaQuery as p}from"@mui/material";import{createFilterMenu as d}from"./menu/create.js";import{createFilterBarContext as v}from"./index.context.js";import{DEFAULT_LOGIC_ROOT as g}from"./helpers.js";import{createFilterSort as b}from"./components/filter-sort.js";import{createFilterInput as S}from"./components/filter-input.js";import{createFilterSummary as C}from"./components/filter-summary.js";function y(r){var c,y=null!==(c=r.debounceDelay)&&void 0!==c?c:300;if(!r.InputComponent){var j=r.inputConfig||{fields:{}};r.inputConfig=j,r.InputComponent=S(j)}if(!r.MenuComponent){var P=r.menuConfig||{fields:{}};r.menuConfig=P,r.MenuComponent=d(P)}if(!r.SummaryComponent&&!1!==r.enableSummary){var w=r.summaryConfig||{fields:{}};r.summaryConfig=w,r.SummaryComponent=C(w)}if(!r.SortComponent){var F=r.sortConfig||{fields:{}};r.sortConfig=F,r.SortComponent=b(F)}var I=r.defaultFilterLogic||g,L=v();return function(c){var d,v=c.slots,g=r.InputComponent,b=r.MenuComponent,S=r.SummaryComponent,C=r.SortComponent,j=function(){return Object.assign({filterLogic:I},r.defaultFilterState,c.defaultValue)},P=a(function(){return c.value?{filterState:c.value}:{filterState:j()}}),w=e(P,2),F=w[0],k=w[1],B=a(!1),T=e(B,2),D=T[0],A=T[1],M=u(null),N=u(null),W=u(null);m(function(){return function(){var r;M.current&&(clearTimeout(M.current),M.current=null),null===(r=W.current)||void 0===r||r.abort(),W.current=null}},[]),m(function(){c.value&&k({filterState:c.value})},[c.value]);var _=function(){var r=n(o().m(function r(e,t,n){var l,i;return o().w(function(r){for(;;)switch(r.p=r.n){case 0:return r.p=0,k(function(r){var e;return{filterState:null!==(e=null==n?void 0:n.filterState)&&void 0!==e?e:r.filterState}}),A(!0),r.n=1,null===(l=c.onChange)||void 0===l?void 0:l.call(c,e,t);case 1:if(!t.aborted){r.n=2;break}return r.a(2);case 2:A(!1),r.n=5;break;case 3:if(r.p=3,i=r.v,!t.aborted){r.n=4;break}return r.a(2);case 4:throw A(!1),i;case 5:return r.a(2)}},r,null,[[0,3]])}));return function(e,t,n){return r.apply(this,arguments)}}(),z={filterState:c.value||F.filterState,defaultFilterState:j(),isLoading:c.loading||D,setFilterState:function(r){var e,n,o=null!==(e=(c.value||F.filterState).filterLogic)&&void 0!==e?e:I,l=null!==(n=r.filterLogic)&&void 0!==n?n:o,i=t({},r);l!==I?i.filterLogic=l:delete i.filterLogic,N.current=i,c.value||k({filterState:i}),M.current&&clearTimeout(M.current),M.current=window.setTimeout(function(){var r;null===(r=W.current)||void 0===r||r.abort();var e=new AbortController;W.current=e;var t=N.current;c.value?_(t,e.signal):_(t,e.signal,{filterState:t}),M.current=null,N.current=null},y)}},G=f(),H=p(G.breakpoints.down("md"));return l(L.Provider,{value:z,children:i(h,{className:x.root,sx:c.sx,children:[i(s,{className:x.inner,children:[(null==v?void 0:v.before)||null,i("div",{className:x.action,children:[l(b,{slots:{popperProps:{placement:"bottom-start"}}}),l(C,{slots:{popperProps:{placement:"bottom-start"}}})]}),l(g,{slots:{minimalInput:H,popperProps:{placement:"bottom-start"}}}),(null==v?void 0:v.after)||null]}),i(s,t(t({},null==v?void 0:v.summaryWrapProps),{},{sx:t({display:"flex",alignItems:"center"},null==v||null===(d=v.summaryWrapProps)||void 0===d?void 0:d.sx),children:[(null==v?void 0:v.summaryBefore)||null,l(s,{sx:{flex:1,minWidth:0},children:!1!==r.enableSummary&&l(S,{})}),(null==v?void 0:v.summaryAfter)||null]}))]})})}}var x={root:"DinoFilterBar-root",inner:"DinoFilterBar-inner",action:"DinoFilterBar-action"},h=c(s)(function(e){var t=e.theme;return r(r(r({},"&.".concat(x.root),{backgroundColor:t.palette.background.paper,boxSizing:"border-box"}),".".concat(x.inner),{display:"flex",alignItems:"center",gap:t.spacing(1)}),".".concat(x.action),{display:"flex",alignItems:"center"})});export{y as createFilterBar};
|
|
2
2
|
//# sourceMappingURL=index.create.js.map
|
|
@@ -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 { DEFAULT_LOGIC_ROOT } from './helpers'\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 || DEFAULT_LOGIC_ROOT\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 rawFilterLogic = state.filterLogic ?? currentFilterLogic\r\n const normalizedFilterLogic = rawFilterLogic === defaultFilterLogic ? undefined : rawFilterLogic\r\n const mergedState: TFilterState<T> = { ...state, filterLogic: normalizedFilterLogic }\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","DEFAULT_LOGIC_ROOT","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","_state$filterLogic","currentFilterLogic","rawFilterLogic","normalizedFilterLogic","undefined","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 { DEFAULT_LOGIC_ROOT } from './helpers'\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 || DEFAULT_LOGIC_ROOT\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 rawFilterLogic = state.filterLogic ?? currentFilterLogic\r\n const mergedState: TFilterState<T> = { ...state }\r\n if (rawFilterLogic !== defaultFilterLogic) mergedState.filterLogic = rawFilterLogic\r\n else delete mergedState.filterLogic\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","DEFAULT_LOGIC_ROOT","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","_state$filterLogic","currentFilterLogic","rawFilterLogic","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{slicedToArray as l,toConsumableArray as e,defineProperty as
|
|
1
|
+
import{slicedToArray as l,toConsumableArray as e,defineProperty as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as n,jsxs as i}from"react/jsx-runtime";import{useMemo as r,useState as t,useRef as a,useEffect as u}from"react";import{styled as c,Box as s,Typography as d,CircularProgress as m,Button as v,FormGroup as f,FormControlLabel as p,Checkbox as b}from"@mui/material";import h from"@mui/icons-material/Info";import"../../form/validator.js";import"../../form/dino-form.js";import{getErrorMessage as g}from"../../form/helpers.js";import"../../../_virtual/Reflect.js";import"../../form/decorator.form.js";import"../../form/create.form-grid-layout.units.js";import{DEFAULT_LOGIC as x}from"../helpers.js";import{createChipViewers as y}from"../components/chip-viewer.js";import{PopperContent as C,PopperBody as j,PopperFooter as A}from"../components/popper-custom.js";import{ButtonBack as V,ChipDark as k,FilterLogicToggle as z}from"../components/ui.units.js";function S(c){var S=y(),L=(c||{}).options,R=void 0===L?[]:L;return function(y){var L,w,I,B,E,F=r(function(){return Object.assign({},y.currentConfig,null==c?void 0:c.config)},[null==c?void 0:c.config,y.currentConfig]),N=null!==(L=null==F?void 0:F.defaultLogic)&&void 0!==L?L:x,T=y.value,_=void 0===T?{values:[]}:T,D=t(null!==(w=_.logic)&&void 0!==w?w:N),M=l(D,2),P=M[0],H=M[1],U=null!==(I=null==c?void 0:c.forceLogic)&&void 0!==I?I:P,q=null!==(B=null==F?void 0:F.label)&&void 0!==B?B:F.field.toString(),G=t([]),J=l(G,2),K=J[0],Q=J[1],W=t(null!=c&&c.fetchOptions?"loading":"loaded"),X=l(W,2),Y=X[0],Z=X[1],$=a(null),ll=function(){var l;if(null!=c&&c.fetchOptions){null===(l=$.current)||void 0===l||l.abort();var e=new AbortController;$.current=e,Z("loading"),c.fetchOptions(e.signal).then(function(l){Q(l),Z("loaded")}).catch(function(l){var e;null===(e=y.onError)||void 0===e||e.call(y),"AbortError"!==(null==l?void 0:l.name)&&Z("error")})}};u(function(){return ll(),function(){var l;return null===(l=$.current)||void 0===l?void 0:l.abort()}},[]);var el=null!=c&&c.fetchOptions?K:R,ol=t(function(){return Array.isArray(_.values)?e(_.values):[]}),nl=l(ol,2),il=nl[0],rl=nl[1],tl=Array.isArray(_.values)?_.values:[],al=P!==(null!==(E=_.logic)&&void 0!==E?E:N),ul=il.length!==tl.length||il.some(function(l){return!tl.includes(l)}),cl=!ul&&!al,sl=t({}),dl=l(sl,2),ml=dl[0],vl=dl[1],fl=function(l){y.onSubmit(F.field,l,F)},pl=g(ml,F.field),bl=r(function(){var l=Array.isArray(_.values)?_.values:[_.values];return{field:F.field,items:l.map(function(l){var e;return{value:l,label:null===(e=el.find(function(e){return e.value===l}))||void 0===e?void 0:e.label}})}},[F.field,_]),hl=null!=(null==c?void 0:c.maxValueCount)&&il.length>c.maxValueCount,gl=null!=(null==c?void 0:c.maxValueCount)&&il.length>=c.maxValueCount,xl=r(function(){var l=(null==c?void 0:c.top)||y.top;return l?n(s,{sx:{mb:1},children:l}):null},[null==c?void 0:c.top,y.top]),yl=[];return(y.isLoading||"loading"===Y)&&yl.push("disabled"),n(O,{className:yl.join(" "),noValidate:!0,onSubmit:function(l){var e;if(l.preventDefault(),ul){if(!hl){var n=o({},F.field,il),i=null===(e=y.validator)||void 0===e?void 0:e.run(n);if(vl(i||{}),!i||0===Object.keys(i).length)fl({values:il,logic:U})}}else al&&fl({values:_.values,logic:U})},children:i(C,{title:"Filter by ".concat(q),onClose:y.onClose,slots:{beforeTitle:n(V,{size:"small",onClick:y.onBack}),afterTitle:null!=c&&c.forceLogic?null:F.singleValue?n(k,{sx:{ml:1.5},size:"small",label:"Last value only"}):n(z,{sx:{ml:1},value:U,onChange:function(l,e){H(e)}})},children:[i(j,{children:[xl,F.description&&n(d,{variant:"caption",color:"text.secondary",sx:{mb:1,display:"block"},children:F.description}),null!=(null==c?void 0:c.maxValueCount)&&n(d,{variant:"caption",color:hl?"warning.main":"text.secondary",sx:{mb:.5,display:"block"},children:null!=c&&c.maxValueCount?hl?"Maximum ".concat(c.maxValueCount," value").concat(c.maxValueCount>1?"s":""," selected (limit reached)"):"Up to ".concat(c.maxValueCount," value").concat(c.maxValueCount>1?"s":""," can be selected"):""}),n(S,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:bl,onRemove:y.onRemove}),"loading"===Y&&n(s,{sx:{display:"flex",justifyContent:"center",mt:2},children:n(m,{size:20})}),"error"===Y&&i(s,{sx:{display:"flex",flexDirection:"column",alignItems:"center",mt:2,mb:3,gap:1},children:[n(h,{color:"error",fontSize:"large"}),n(d,{variant:"body2",color:"error",children:"Failed to load options"}),n(v,{size:"small",variant:"outlined",color:"error",onClick:ll,children:"Retry"})]}),0===el.length&&"loaded"===Y&&n(d,{variant:"body2",color:"text.secondary",sx:{mt:2},children:"No options available"}),n(f,{className:pl.error?"error":"",children:el.map(function(l,o){var i,r=il.includes(l.value),t=bl.items.some(function(e){return e.value===l.value})&&!0===(null==c?void 0:c.disabledAfterSubmit),a=!r&≷return n(p,{value:l.value,disabled:t||a,label:null!==(i=l.label)&&void 0!==i?i:l.value,control:n(b,{name:F.field.toString(),checked:r,onChange:function(o){return n=l.value,i=o.target.checked,void rl(function(l){return i?[].concat(e(l),[n]):l.filter(function(l){return l!==n})});var n,i}})},l.value.toString()+o)})})]}),i(A,{children:[n(v,{size:"small",color:"error",variant:"text",disabled:!_.values||0===_.values.length,onClick:function(){var l;null===(l=y.onRemoveField)||void 0===l||l.call(y,F.field,F)},children:"Clear All"}),n(s,{sx:{flex:1}}),n(v,{size:"small",color:"inherit",variant:"text",onClick:y.onClose,children:"Cancel"}),n(v,{size:"small",type:"submit",color:"primary",variant:"contained",disabled:cl,children:"Apply"})]})]})})}}var O=c("form")({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"}}});export{S as default};
|
|
2
2
|
//# sourceMappingURL=create-form-field-select-multiple.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-form-field-select-multiple.js","sources":["../../../../src/filter-bar/menu/create-form-field-select-multiple.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Button, Checkbox, CircularProgress, FormControlLabel, FormGroup, formGroupClasses, styled, Typography } from '@mui/material'\r\nimport InfoIcon from '@mui/icons-material/Info'\r\nimport { getErrorMessage } from '../../form'\r\nimport { DEFAULT_LOGIC } from '../helpers'\r\nimport { createChipViewers, TChipViewerGroup } from '../components/chip-viewer'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\n// types\r\nimport type { FC, ReactNode } from 'react'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { IFieldSelectOption } from './create-form-field-select'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps, TFetchStatus } from './types'\r\n\r\n/** Props for the `FormFieldSelectMultiple` component returned by `createFormFieldSelectMultiple`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldSelectMultipleProps<T> extends IFilterMenuFormProps<T> {\r\n /** Callback function to handle errors */\r\n onError?: () => void\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 `createFormFieldSelectMultiple` to configure the generated component. */\r\nexport interface IFormFieldSelectMultipleParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n /** List of options for the select field */\r\n options?: IFieldSelectOption[]\r\n /** Function to fetch options asynchronously */\r\n fetchOptions?: (signal?: AbortSignal) => Promise<IFieldSelectOption[]>\r\n /** If true, disables the field after submission. @default false */\r\n disabledAfterSubmit?: boolean\r\n /** Force a fixed logic value, hiding the logic toggle */\r\n forceLogic?: TLogic\r\n /** Maximum number of values that can be selected */\r\n maxValueCount?: number\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 `FormFieldSelectMultiple` filter-menu component.\r\n *\r\n * The generated component renders a checkbox list of options inside a\r\n * popper/menu panel, allowing the user to select **multiple values** at once.\r\n * It supports:\r\n * - Controlled checkbox state to prevent uncontrolled→controlled React warnings\r\n * - OR / AND logic toggle when more than one value is applied\r\n * - Chip viewers showing the currently applied values\r\n * - Built-in validation via an optional `validator` prop\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (option list, optional field config override)\r\n * @returns A React FC ready to be used as a multi-select filter-menu field component\r\n */\r\nfunction createFormFieldSelectMultiple<T>(params?: IFormFieldSelectMultipleParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n const { options: staticOptions = [] } = params || {}\r\n\r\n const FormFieldSelectMultiple: FC<IFormFieldSelectMultipleProps<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 const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const defaultLogic: TLogic = mergedConfig?.defaultLogic ?? DEFAULT_LOGIC\r\n const { value = { values: [] } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic ?? defaultLogic)\r\n const effectiveLogic = params?.forceLogic ?? filterLogic\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n const [fetchedOptions, setFetchedOptions] = useState<IFieldSelectOption[]>([])\r\n const [fetchStatus, setFetchStatus] = useState<TFetchStatus>(params?.fetchOptions ? 'loading' : 'loaded')\r\n const abortRef = useRef<AbortController | null>(null)\r\n\r\n const runFetch = () => {\r\n if (!params?.fetchOptions) return\r\n abortRef.current?.abort()\r\n const controller = new AbortController()\r\n abortRef.current = controller\r\n setFetchStatus('loading')\r\n params\r\n .fetchOptions(controller.signal)\r\n .then((data) => {\r\n setFetchedOptions(data)\r\n setFetchStatus('loaded')\r\n })\r\n .catch((err) => {\r\n props.onError?.()\r\n if (err?.name !== 'AbortError') setFetchStatus('error')\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n runFetch()\r\n return () => abortRef.current?.abort()\r\n }, [])\r\n\r\n const options = params?.fetchOptions ? fetchedOptions : staticOptions\r\n\r\n // Track checked values as controlled state to avoid the uncontrolled→controlled MUI warning\r\n // Initialize directly from value.values so pre-selected values are visible even before fetchOptions resolves\r\n const [checkedValues, setCheckedValues] = useState<TFieldValid[]>(() => {\r\n return Array.isArray(value.values) ? [...value.values] : []\r\n })\r\n\r\n const appliedValues = Array.isArray(value.values) ? value.values : []\r\n const hasLogicChange = filterLogic !== (value.logic ?? defaultLogic)\r\n const hasDataChange = checkedValues.length !== appliedValues.length || checkedValues.some((v) => !appliedValues.includes(v))\r\n const isApplyDisabled = !hasDataChange && !hasLogicChange\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n\r\n const handleCheckboxChange = (optionValue: TFieldValid, checked: boolean) => {\r\n setCheckedValues((prev) => (checked ? [...prev, optionValue] : prev.filter((v) => v !== optionValue)))\r\n }\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\r\n if (!hasDataChange) {\r\n if (hasLogicChange) handleSubmit({ values: value.values, logic: effectiveLogic })\r\n return\r\n }\r\n\r\n if (isMaxReached) return\r\n\r\n const obj = { [mergedConfig.field]: checkedValues } as Partial<TFieldModelValid<T>>\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const newValue: TFieldValue = { values: checkedValues, logic: effectiveLogic }\r\n handleSubmit(newValue)\r\n }\r\n }\r\n\r\n const errorResult = getErrorMessage(errorData, mergedConfig.field)\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) => ({ value: v, label: options.find((o) => o.value === v)?.label }))\r\n }\r\n }, [mergedConfig.field, value])\r\n\r\n const isMaxReached = params?.maxValueCount != null && checkedValues.length > params.maxValueCount\r\n const isMaxReachedValid = params?.maxValueCount != null && checkedValues.length >= params.maxValueCount\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field, mergedConfig)\r\n }\r\n\r\n const getMaxReachedText = () => {\r\n if (!params?.maxValueCount) return ''\r\n if (isMaxReached) {\r\n return `Maximum ${params.maxValueCount} value${params.maxValueCount > 1 ? 's' : ''} selected (limit reached)`\r\n } else {\r\n return `Up to ${params.maxValueCount} value${params.maxValueCount > 1 ? 's' : ''} can be selected`\r\n }\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (params?.forceLogic) return null\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={effectiveLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\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 const rootClasses: string[] = []\r\n if (props.isLoading || fetchStatus === 'loading') 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 {params?.maxValueCount != null && (\r\n <Typography variant='caption' color={isMaxReached ? 'warning.main' : 'text.secondary'} sx={{ mb: 0.5, display: 'block' }}>\r\n {getMaxReachedText()}\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 {fetchStatus === 'loading' && (\r\n <Box sx={{ display: 'flex', justifyContent: 'center', mt: 2 }}>\r\n <CircularProgress size={20} />\r\n </Box>\r\n )}\r\n {fetchStatus === 'error' && (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', mt: 2, mb: 3, gap: 1 }}>\r\n <InfoIcon color='error' fontSize='large' />\r\n <Typography variant='body2' color='error'>\r\n Failed to load options\r\n </Typography>\r\n <Button size='small' variant='outlined' color='error' onClick={runFetch}>\r\n Retry\r\n </Button>\r\n </Box>\r\n )}\r\n {options.length === 0 && fetchStatus === 'loaded' && (\r\n <Typography variant='body2' color='text.secondary' sx={{ mt: 2 }}>\r\n No options available\r\n </Typography>\r\n )}\r\n <FormGroup className={errorResult.error ? 'error' : ''}>\r\n {options.map((x, i) => {\r\n const isChecked = checkedValues.includes(x.value as TFieldValid)\r\n const isSelected = filterViewerValue.items.some((item) => item.value === x.value)\r\n const disabled = isSelected && params?.disabledAfterSubmit === true\r\n const disableDueToMax = !isChecked && isMaxReachedValid\r\n return (\r\n <FormControlLabel\r\n key={x.value.toString() + i}\r\n value={x.value}\r\n disabled={disabled || disableDueToMax}\r\n label={x.label ?? x.value}\r\n control={\r\n <Checkbox\r\n name={mergedConfig.field.toString()}\r\n checked={isChecked}\r\n onChange={(e) => handleCheckboxChange(x.value as TFieldValid, e.target.checked)}\r\n />\r\n }\r\n />\r\n )\r\n })}\r\n </FormGroup>\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 FormFieldSelectMultiple\r\n}\r\n\r\nexport default createFormFieldSelectMultiple\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, // top: 0, left: 0, right: 0, bottom: 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': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n }\r\n // [`.${formGroupClasses.root}`]: {}\r\n})\r\n"],"names":["createFormFieldSelectMultiple","params","ChipViewers","createChipViewers","_ref$options","options","staticOptions","props","_mergedConfig$default","_value$logic","_params$forceLogic","_mergedConfig$label","_value$logic2","mergedConfig","useMemo","Object","assign","currentConfig","config","defaultLogic","DEFAULT_LOGIC","_props$value","value","values","_useState","useState","logic","_useState2","_slicedToArray","filterLogic","setFilterLogic","effectiveLogic","forceLogic","label","field","toString","_useState3","_useState4","fetchedOptions","setFetchedOptions","_useState5","fetchOptions","_useState6","fetchStatus","setFetchStatus","abortRef","useRef","runFetch","_abortRef$current","current","abort","controller","AbortController","signal","then","data","err","_props$onError","onError","call","name","useEffect","_abortRef$current2","_useState7","Array","isArray","_toConsumableArray","_useState8","checkedValues","setCheckedValues","appliedValues","hasLogicChange","hasDataChange","length","some","v","includes","isApplyDisabled","_useState9","_useState0","errorData","setErrorData","handleSubmit","newValue","onSubmit","errorResult","getErrorMessage","filterViewerValue","items","map","_options$find","find","o","isMaxReached","maxValueCount","isMaxReachedValid","renderTop","topContent","top","_jsx","Box","sx","mb","children","rootClasses","isLoading","push","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","obj","_defineProperty","validator","run","keys","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","ml","FilterLogicToggle","onChange","_","nVal","PopperBody","description","Typography","variant","color","display","borderBottom","placement","enableMinimalesticView","onRemove","justifyContent","mt","CircularProgress","flexDirection","alignItems","gap","InfoIcon","fontSize","Button","FormGroup","error","x","i","_x$label","isChecked","disabled","item","disabledAfterSubmit","disableDueToMax","FormControlLabel","control","Checkbox","checked","e","optionValue","target","prev","filter","PopperFooter","_props$onRemoveField","onRemoveField","flex","type","styled","position","content","inset","backgroundColor","zIndex","opacity","transition","visibility","pointerEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create-form-field-select-multiple.js","sources":["../../../../src/filter-bar/menu/create-form-field-select-multiple.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { useEffect, useMemo, useRef, useState } from 'react'\r\nimport { Box, Button, Checkbox, CircularProgress, FormControlLabel, FormGroup, formGroupClasses, styled, Typography } from '@mui/material'\r\nimport InfoIcon from '@mui/icons-material/Info'\r\nimport { getErrorMessage } from '../../form'\r\nimport { DEFAULT_LOGIC } from '../helpers'\r\nimport { createChipViewers, TChipViewerGroup } from '../components/chip-viewer'\r\nimport { PopperBody, PopperContent, PopperFooter } from '../components/popper-custom'\r\nimport { ButtonBack, ChipDark, FilterLogicToggle } from '../components/ui.units'\r\n// types\r\nimport type { FC, ReactNode } from 'react'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { IFieldSelectOption } from './create-form-field-select'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps, TFetchStatus } from './types'\r\n\r\n/** Props for the `FormFieldSelectMultiple` component returned by `createFormFieldSelectMultiple`. Extends the base filter-menu form props. */\r\nexport interface IFormFieldSelectMultipleProps<T> extends IFilterMenuFormProps<T> {\r\n /** Callback function to handle errors */\r\n onError?: () => void\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 `createFormFieldSelectMultiple` to configure the generated component. */\r\nexport interface IFormFieldSelectMultipleParam<T> {\r\n /** Optional configuration for the form field */\r\n config?: IFieldMenuConfig<T>\r\n /** List of options for the select field */\r\n options?: IFieldSelectOption[]\r\n /** Function to fetch options asynchronously */\r\n fetchOptions?: (signal?: AbortSignal) => Promise<IFieldSelectOption[]>\r\n /** If true, disables the field after submission. @default false */\r\n disabledAfterSubmit?: boolean\r\n /** Force a fixed logic value, hiding the logic toggle */\r\n forceLogic?: TLogic\r\n /** Maximum number of values that can be selected */\r\n maxValueCount?: number\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 `FormFieldSelectMultiple` filter-menu component.\r\n *\r\n * The generated component renders a checkbox list of options inside a\r\n * popper/menu panel, allowing the user to select **multiple values** at once.\r\n * It supports:\r\n * - Controlled checkbox state to prevent uncontrolled→controlled React warnings\r\n * - OR / AND logic toggle when more than one value is applied\r\n * - Chip viewers showing the currently applied values\r\n * - Built-in validation via an optional `validator` prop\r\n * - A loading overlay that disables interaction while `isLoading` is true\r\n *\r\n * @param params - Static configuration (option list, optional field config override)\r\n * @returns A React FC ready to be used as a multi-select filter-menu field component\r\n */\r\nfunction createFormFieldSelectMultiple<T>(params?: IFormFieldSelectMultipleParam<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n const { options: staticOptions = [] } = params || {}\r\n\r\n const FormFieldSelectMultiple: FC<IFormFieldSelectMultipleProps<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 const mergedConfig = useMemo(() => Object.assign({}, props.currentConfig, params?.config), [params?.config, props.currentConfig])\r\n\r\n const defaultLogic: TLogic = mergedConfig?.defaultLogic ?? DEFAULT_LOGIC\r\n const { value = { values: [] } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic ?? defaultLogic)\r\n const effectiveLogic = params?.forceLogic ?? filterLogic\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n const [fetchedOptions, setFetchedOptions] = useState<IFieldSelectOption[]>([])\r\n const [fetchStatus, setFetchStatus] = useState<TFetchStatus>(params?.fetchOptions ? 'loading' : 'loaded')\r\n const abortRef = useRef<AbortController | null>(null)\r\n\r\n const runFetch = () => {\r\n if (!params?.fetchOptions) return\r\n abortRef.current?.abort()\r\n const controller = new AbortController()\r\n abortRef.current = controller\r\n setFetchStatus('loading')\r\n params\r\n .fetchOptions(controller.signal)\r\n .then((data) => {\r\n setFetchedOptions(data)\r\n setFetchStatus('loaded')\r\n })\r\n .catch((err) => {\r\n props.onError?.()\r\n if (err?.name !== 'AbortError') setFetchStatus('error')\r\n })\r\n }\r\n\r\n useEffect(() => {\r\n runFetch()\r\n return () => abortRef.current?.abort()\r\n }, [])\r\n\r\n const options = params?.fetchOptions ? fetchedOptions : staticOptions\r\n\r\n // Track checked values as controlled state to avoid the uncontrolled→controlled MUI warning\r\n // Initialize directly from value.values so pre-selected values are visible even before fetchOptions resolves\r\n const [checkedValues, setCheckedValues] = useState<TFieldValid[]>(() => {\r\n return Array.isArray(value.values) ? [...value.values] : []\r\n })\r\n\r\n const appliedValues = Array.isArray(value.values) ? value.values : []\r\n const hasLogicChange = filterLogic !== (value.logic ?? defaultLogic)\r\n const hasDataChange = checkedValues.length !== appliedValues.length || checkedValues.some((v) => !appliedValues.includes(v))\r\n const isApplyDisabled = !hasDataChange && !hasLogicChange\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n\r\n const handleCheckboxChange = (optionValue: TFieldValid, checked: boolean) => {\r\n setCheckedValues((prev) => (checked ? [...prev, optionValue] : prev.filter((v) => v !== optionValue)))\r\n }\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\r\n if (!hasDataChange) {\r\n if (hasLogicChange) handleSubmit({ values: value.values, logic: effectiveLogic })\r\n return\r\n }\r\n\r\n if (isMaxReached) return\r\n\r\n const obj = { [mergedConfig.field]: checkedValues } as Partial<TFieldModelValid<T>>\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const newValue: TFieldValue = { values: checkedValues, logic: effectiveLogic }\r\n handleSubmit(newValue)\r\n }\r\n }\r\n\r\n const errorResult = getErrorMessage(errorData, mergedConfig.field)\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) => ({ value: v, label: options.find((o) => o.value === v)?.label }))\r\n }\r\n }, [mergedConfig.field, value])\r\n\r\n const isMaxReached = params?.maxValueCount != null && checkedValues.length > params.maxValueCount\r\n const isMaxReachedValid = params?.maxValueCount != null && checkedValues.length >= params.maxValueCount\r\n\r\n const handleChangeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(mergedConfig.field, mergedConfig)\r\n }\r\n\r\n const getMaxReachedText = () => {\r\n if (!params?.maxValueCount) return ''\r\n if (isMaxReached) {\r\n return `Maximum ${params.maxValueCount} value${params.maxValueCount > 1 ? 's' : ''} selected (limit reached)`\r\n } else {\r\n return `Up to ${params.maxValueCount} value${params.maxValueCount > 1 ? 's' : ''} can be selected`\r\n }\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (params?.forceLogic) return null\r\n if (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={effectiveLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\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 const rootClasses: string[] = []\r\n if (props.isLoading || fetchStatus === 'loading') 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 {params?.maxValueCount != null && (\r\n <Typography variant='caption' color={isMaxReached ? 'warning.main' : 'text.secondary'} sx={{ mb: 0.5, display: 'block' }}>\r\n {getMaxReachedText()}\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 {fetchStatus === 'loading' && (\r\n <Box sx={{ display: 'flex', justifyContent: 'center', mt: 2 }}>\r\n <CircularProgress size={20} />\r\n </Box>\r\n )}\r\n {fetchStatus === 'error' && (\r\n <Box sx={{ display: 'flex', flexDirection: 'column', alignItems: 'center', mt: 2, mb: 3, gap: 1 }}>\r\n <InfoIcon color='error' fontSize='large' />\r\n <Typography variant='body2' color='error'>\r\n Failed to load options\r\n </Typography>\r\n <Button size='small' variant='outlined' color='error' onClick={runFetch}>\r\n Retry\r\n </Button>\r\n </Box>\r\n )}\r\n {options.length === 0 && fetchStatus === 'loaded' && (\r\n <Typography variant='body2' color='text.secondary' sx={{ mt: 2 }}>\r\n No options available\r\n </Typography>\r\n )}\r\n <FormGroup className={errorResult.error ? 'error' : ''}>\r\n {options.map((x, i) => {\r\n const isChecked = checkedValues.includes(x.value as TFieldValid)\r\n const isSelected = filterViewerValue.items.some((item) => item.value === x.value)\r\n const disabled = isSelected && params?.disabledAfterSubmit === true\r\n const disableDueToMax = !isChecked && isMaxReachedValid\r\n return (\r\n <FormControlLabel\r\n key={x.value.toString() + i}\r\n value={x.value}\r\n disabled={disabled || disableDueToMax}\r\n label={x.label ?? x.value}\r\n control={\r\n <Checkbox\r\n name={mergedConfig.field.toString()}\r\n checked={isChecked}\r\n onChange={(e) => handleCheckboxChange(x.value as TFieldValid, e.target.checked)}\r\n />\r\n }\r\n />\r\n )\r\n })}\r\n </FormGroup>\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 FormFieldSelectMultiple\r\n}\r\n\r\nexport default createFormFieldSelectMultiple\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, // top: 0, left: 0, right: 0, bottom: 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': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n }\r\n // [`.${formGroupClasses.root}`]: {}\r\n})\r\n"],"names":["createFormFieldSelectMultiple","params","ChipViewers","createChipViewers","_ref$options","options","staticOptions","props","_mergedConfig$default","_value$logic","_params$forceLogic","_mergedConfig$label","_value$logic2","mergedConfig","useMemo","Object","assign","currentConfig","config","defaultLogic","DEFAULT_LOGIC","_props$value","value","values","_useState","useState","logic","_useState2","_slicedToArray","filterLogic","setFilterLogic","effectiveLogic","forceLogic","label","field","toString","_useState3","_useState4","fetchedOptions","setFetchedOptions","_useState5","fetchOptions","_useState6","fetchStatus","setFetchStatus","abortRef","useRef","runFetch","_abortRef$current","current","abort","controller","AbortController","signal","then","data","err","_props$onError","onError","call","name","useEffect","_abortRef$current2","_useState7","Array","isArray","_toConsumableArray","_useState8","checkedValues","setCheckedValues","appliedValues","hasLogicChange","hasDataChange","length","some","v","includes","isApplyDisabled","_useState9","_useState0","errorData","setErrorData","handleSubmit","newValue","onSubmit","errorResult","getErrorMessage","filterViewerValue","items","map","_options$find","find","o","isMaxReached","maxValueCount","isMaxReachedValid","renderTop","topContent","top","_jsx","Box","sx","mb","children","rootClasses","isLoading","push","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","obj","_defineProperty","validator","run","keys","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","ml","FilterLogicToggle","onChange","_","nVal","PopperBody","description","Typography","variant","color","display","borderBottom","placement","enableMinimalesticView","onRemove","justifyContent","mt","CircularProgress","flexDirection","alignItems","gap","InfoIcon","fontSize","Button","FormGroup","error","x","i","_x$label","isChecked","disabled","item","disabledAfterSubmit","disableDueToMax","FormControlLabel","control","Checkbox","checked","e","optionValue","target","prev","filter","PopperFooter","_props$onRemoveField","onRemoveField","flex","type","styled","position","content","inset","backgroundColor","zIndex","opacity","transition","visibility","pointerEvents"],"mappings":"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"}
|