dinocollab-core 2.2.33 → 2.2.35

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.
@@ -1,2 +1,2 @@
1
- import{createClass as t,createForOfIteratorHelper as e,objectWithoutProperties as r,typeof as i,classCallCheck as l,defineProperty as a}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as o}from"./types.js";import{getSeedFromURL as n,setSeedToURL as u,removeSeedFromURL as s}from"./helpers.js";import{createRequestBuilder as f}from"../http-service/graphql/request-param.js";import{decodeNumberValue as c}from"./menu/create-form-field-number.js";var v=["mode"],d=function(t){return"or"===t?"Or":"And"},h=function(t){return"asc"===t?"ASC":"DESC"};function g(t,e,l,a){var o=a||{},n=o.mode,u=r(o,v),s=i(l);switch(s){case"string":"equal"===n?e.filter(t,l.toString(),u):e.filterContains(t,l.toString(),u);break;case"number":e.filterNumber(t,"==",l.toString(),u);break;default:console.warn("Unsupported value type for filtering: ".concat(s,". Value:"),l)}}var p=function(){return t(function t(e){var r=this;l(this,t),a(this,"autoMap",function(t){(r.currentObjectMap=t,r.state.storeFilter)&&Object.keys(r.state.storeFilter).forEach(function(e){var i,l=t[e],a=null===(i=r.state.storeFilter)||void 0===i?void 0:i[e];if(l){var o=l.targetfield,n=l.operation;if(l.custom)return void l.custom(r.graphqlBuilder,a,r.state.storeFilter);switch(n){case"equal":return void r.filterEqual(e,o);case"equalAndAny":return void r.filterEqual(e,o,{isAny:!0});case"datetime":return void r.filterDatetime(e,o);case"number":return void r.filterNumber(e,o);default:return void r.filterContains(e,o)}}});return r}),a(this,"prebuild",function(t){return r.prebuildFunc=t,r}),this.state=e,this.graphqlBuilder=f({ignoreEmpty:!0})},[{key:"filterScope",value:function(t,e){var r=this;if(this.state.storeFilter){var i=(null==e?void 0:e.logic)||this.state.filterLogic||"or",l=d(i);this.graphqlBuilder.scope(function(e){return t(e,r.state.storeFilter),e},{logic:l})}return this}},{key:"filterEqual",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=d(a.logic);return this.filterScope(function(t){if(null!=r&&r.isAny)t.filterCustom("".concat(null==e?void 0:e.toString(),".isAny(").concat(JSON.stringify(o),")"),{logic:n});else for(var i=0;i<o.length;i++)g(e,t,o[i],{logic:n,mode:"equal"})},r),this}},{key:"filterContains",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=d(a.logic);return this.filterScope(function(t){for(var r=0;r<o.length;r++)g(e,t,o[r],{logic:n,mode:"contains"})},r),this}},{key:"filterDatetime",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;if("range"===a.dateLogic&&o.length>=2){this.filterScope(function(t){t.filterGreaterEqual(e,o[0].toString(),{}),t.filterLessEqual(e,o[1].toString(),{logic:"And"})},r)}else if(1==o.length){this.filterScope(function(t){switch(a.dateLogic){case"before":t.filterLessEqual(e,o[0].toString());break;case"after":t.filterGreaterEqual(e,o[0].toString());break;default:t.filterEqual(e,o[0].toString())}},r)}return this}},{key:"filterNumber",value:function(t,r,i){var l,a,o=null!==(l=null===(a=this.state.storeFilter)||void 0===a?void 0:a[t])&&void 0!==l?l:{values:[]},n=Array.isArray(o.values)?o.values:[o.values];if(!n||n.length<1||!r)return this;var u={eq:"==",lt:"<",lte:"<=",gt:">",gte:">="},s=d(o.logic);return this.filterScope(function(t){var i,l=e(n);try{for(l.s();!(i=l.n()).done;){var a=i.value,o=c(a);if(o){var f=u[o.operator];t.filterNumber(r,f,o.num.toString(),{logic:s})}}}catch(t){l.e(t)}finally{l.f()}},i),this}},{key:"sort",value:function(t){var e,r,i=this.state.storeSort,l=null!==(e=null==t?void 0:t.seed)&&void 0!==e?e:{},a=l.targetField,f=l.autoSave,c=void 0!==f&&f,v=a?null===(r=this.currentObjectMap)||void 0===r?void 0:r[a]:void 0,d=n();if((null==i?void 0:i.field)===o.sortShuffle){if(null==v||!v.targetfield)return this;var g=null!=d?d:(new Date).getTime().toString();this.graphqlBuilder.seed(v.targetfield,g),c&&u(g)}else{var p;d&&s();var m=null!=i&&i.field?null===(p=this.currentObjectMap)||void 0===p?void 0:p[null==i?void 0:i.field]:void 0;if(null==m||!m.targetfield)return this;this.graphqlBuilder.sort(m.targetfield,{direction:h(null==i?void 0:i.direction)})}return this}},{key:"quickSearch",value:function(t){var e,r,i=this;this.currentObjectMap||console.warn("No autoMap config found, quick search will not work properly without target field mapping.");var l=null!==(e=null===(r=this.state.storeFilter)||void 0===r?void 0:r.quickSearch)&&void 0!==e?e:{values:[],logic:"or"},a=Array.isArray(l.values)?l.values:[l.values];if(!a||a.length<1)return this;var o=d(l.logic),n=Array.isArray(t)?t:[t];return this.filterScope(function(t){n.forEach(function(e){var r,n=null===(r=i.currentObjectMap)||void 0===r?void 0:r[e];if(n&&a.length>0)if(n.custom)n.custom(t,l,i.state.storeFilter);else if(n.targetfield)for(var u=0;u<a.length;u++)g(n.targetfield,t,a[u],{logic:o})})}),this}},{key:"build",value:function(){return this.prebuildFunc&&this.prebuildFunc(this.graphqlBuilder),this.graphqlBuilder.build()}}])}(),m=function(t){return new p(t)};export{p as TableFileterConverter,m as createConvertToGraphQL,d as mapLogic,h as mapSortDirection};
1
+ import{createClass as t,createForOfIteratorHelper as e,objectWithoutProperties as r,typeof as i,classCallCheck as l,defineProperty as a,objectSpread2 as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import{KeySpecial as n}from"./types.js";import{getSeedFromURL as u,setSeedToURL as s,removeSeedFromURL as f}from"./helpers.js";import{createRequestBuilder as c}from"../http-service/graphql/request-param.js";import{decodeNumberValue as v}from"./menu/create-form-field-number.js";var d=["mode"],h=function(t){return"and"===t?"And":"Or"},g=function(t){return"asc"===t?"ASC":"DESC"};function p(t,e,l,a){var o=a||{},n=o.mode,u=r(o,d),s=i(l);switch(s){case"string":"equal"===n?e.filter(t,l.toString(),u):e.filterContains(t,l.toString(),u);break;case"number":e.filterNumber(t,"==",l.toString(),u);break;default:console.warn("Unsupported value type for filtering: ".concat(s,". Value:"),l)}}var m=function(){return t(function t(e){var r=this;l(this,t),a(this,"autoMap",function(t,e){(r.currentObjectMap=t,r.state.storeFilter)&&Object.keys(r.state.storeFilter).forEach(function(i){var l,a=t[i],n=null===(l=r.state.storeFilter)||void 0===l?void 0:l[i];if(a){var u=a.targetfield,s=a.operation;if(a.custom)return void a.custom(r.graphqlBuilder,n,r.state.storeFilter);switch(s){case"equal":return void r.filterEqual(i,u,e);case"equalAndAny":return void r.filterEqual(i,u,o(o({},e),{},{isAny:!0}));case"datetime":return void r.filterDatetime(i,u,e);case"number":return void r.filterNumber(i,u,e);default:return void r.filterContains(i,u,e)}}});return r}),a(this,"prebuild",function(t){return r.prebuildFunc=t,r}),this.state=e,this.graphqlBuilder=c({ignoreEmpty:!0})},[{key:"filterScope",value:function(t,e){var r=this;if(this.state.storeFilter){var i=(null==e?void 0:e.logic)||this.state.filterLogic||"and",l=h(i);this.graphqlBuilder.scope(function(e){return t(e,r.state.storeFilter),e},{logic:l})}return this}},{key:"filterEqual",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=h(a.logic);return this.filterScope(function(t){if(null!=r&&r.isAny)t.filterCustom("".concat(null==e?void 0:e.toString(),".isAny(").concat(JSON.stringify(o),")"),{logic:n});else for(var i=0;i<o.length;i++)p(e,t,o[i],{logic:n,mode:"equal"})},r),this}},{key:"filterContains",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;var n=h(a.logic);return this.filterScope(function(t){for(var r=0;r<o.length;r++)p(e,t,o[r],{logic:n,mode:"contains"})},r),this}},{key:"filterDatetime",value:function(t,e,r){var i,l,a=null!==(i=null===(l=this.state.storeFilter)||void 0===l?void 0:l[t])&&void 0!==i?i:{values:[]},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1||!e)return this;if("range"===a.dateLogic&&o.length>=2){this.filterScope(function(t){t.filterGreaterEqual(e,o[0].toString(),{}),t.filterLessEqual(e,o[1].toString(),{logic:"And"})},r)}else if(1==o.length){this.filterScope(function(t){switch(a.dateLogic){case"before":t.filterLessEqual(e,o[0].toString());break;case"after":t.filterGreaterEqual(e,o[0].toString());break;default:t.filterEqual(e,o[0].toString())}},r)}return this}},{key:"filterNumber",value:function(t,r,i){var l,a,o=null!==(l=null===(a=this.state.storeFilter)||void 0===a?void 0:a[t])&&void 0!==l?l:{values:[]},n=Array.isArray(o.values)?o.values:[o.values];if(!n||n.length<1||!r)return this;var u={eq:"==",lt:"<",lte:"<=",gt:">",gte:">="},s=h(o.logic);return this.filterScope(function(t){var i,l=e(n);try{for(l.s();!(i=l.n()).done;){var a=i.value,o=v(a);if(o){var f=u[o.operator];t.filterNumber(r,f,o.num.toString(),{logic:s})}}}catch(t){l.e(t)}finally{l.f()}},i),this}},{key:"sort",value:function(t,e){var r,i,l=this.state.storeSort,a=null!==(r=null==t?void 0:t.seed)&&void 0!==r?r:{},o=a.targetField,c=a.autoSave,v=void 0!==c&&c,d=o?null===(i=this.currentObjectMap)||void 0===i?void 0:i[o]:void 0,h=u();if((null==l?void 0:l.field)===n.sortShuffle){if(null==d||!d.targetfield)return this;var p=null!=h?h:(new Date).getTime().toString();this.graphqlBuilder.seed(d.targetfield,p),v&&s(p)}else{var m;h&&f();var y=null!=l&&l.field?null===(m=this.currentObjectMap)||void 0===m?void 0:m[null==l?void 0:l.field]:void 0;if(null==y||!y.targetfield)return this;this.graphqlBuilder.sort(y.targetfield,{direction:g(null==l?void 0:l.direction)})}return this}},{key:"quickSearch",value:function(t,e){var r,i,l=this;this.currentObjectMap||console.warn("No autoMap config found, quick search will not work properly without target field mapping.");var a=null!==(r=null===(i=this.state.storeFilter)||void 0===i?void 0:i.quickSearch)&&void 0!==r?r:{values:[],logic:"or"},o=Array.isArray(a.values)?a.values:[a.values];if(!o||o.length<1)return this;var n=h(a.logic),u=Array.isArray(t)?t:[t];return this.filterScope(function(t){u.forEach(function(e){var r,i=null===(r=l.currentObjectMap)||void 0===r?void 0:r[e];if(i&&o.length>0)if(i.custom)i.custom(t,a,l.state.storeFilter);else if(i.targetfield)for(var u=0;u<o.length;u++)p(i.targetfield,t,o[u],{logic:n})})},e),this}},{key:"build",value:function(){return this.prebuildFunc&&this.prebuildFunc(this.graphqlBuilder),this.graphqlBuilder.build()}}])}(),y=function(t){return new m(t)};export{m as TableFileterConverter,y as createConvertToGraphQL,h as mapLogic,g as mapSortDirection};
2
2
  //# sourceMappingURL=convert-to-graphql.js.map
@@ -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\nexport const mapLogic = (logic?: TLogic): 'And' | 'Or' => {\r\n return logic === 'or' ? 'Or' : 'And'\r\n}\r\n\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 || 'or'\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 } }) {\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>[]) {\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)\r\n return this\r\n }\r\n\r\n private currentObjectMap?: TAutoMapConfigs<TSource, TTarget, U>\r\n autoMap = (objMap: TAutoMapConfigs<TSource, TTarget, U>) => {\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)\r\n return // break is not needed here because of the return statement\r\n case 'equalAndAny':\r\n this.filterEqual(key, targetfield, { 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)\r\n return // break is not needed here because of the return statement\r\n case 'number':\r\n this.filterNumber(key, targetfield)\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)\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","currentObjectMap","storeFilter","Object","keys","forEach","key","_this$state$storeFilt","mapConfig","fieldValue","targetfield","operation","custom","graphqlBuilder","filterEqual","isAny","filterDatetime","func","prebuildFunc","createRequestBuilder","ignoreEmpty","fn","options","_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'\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,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 a,jsxs as l}from"react/jsx-runtime";import{useState as i,useRef as u,useEffect as m}from"react";import{styled as s,Box as c,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{createFilterSort as g}from"./components/filter-sort.js";import{createFilterInput as b}from"./components/filter-input.js";import{createFilterSummary as C}from"./components/filter-summary.js";function S(r){var s,S=null!==(s=r.debounceDelay)&&void 0!==s?s:300;if(!r.InputComponent){var h=r.inputConfig||{fields:{}};r.inputConfig=h,r.InputComponent=b(h)}if(!r.MenuComponent){var j=r.menuConfig||{fields:{}};r.menuConfig=j,r.MenuComponent=d(j)}if(!r.SummaryComponent&&!1!==r.enableSummary){var P=r.summaryConfig||{fields:{}};r.summaryConfig=P,r.SummaryComponent=C(P)}if(!r.SortComponent){var w=r.sortConfig||{fields:{}};r.sortConfig=w,r.SortComponent=g(w)}var F=r.defaultFilterLogic||"or",I=v();return function(s){var d,v=s.slots,g=r.InputComponent,b=r.MenuComponent,C=r.SummaryComponent,h=r.SortComponent,j=function(){return Object.assign({filterLogic:F},r.defaultFilterState,s.defaultValue)},P=i(function(){return s.value?{filterState:s.value}:{filterState:j()}}),w=e(P,2),k=w[0],B=w[1],T=i(!1),D=e(T,2),A=D[0],L=D[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(){s.value&&B({filterState:s.value})},[s.value]);var _=function(){var r=n(o().m(function r(e,t,n){var a,l;return o().w(function(r){for(;;)switch(r.p=r.n){case 0:return r.p=0,B(function(r){var e;return{filterState:null!==(e=null==n?void 0:n.filterState)&&void 0!==e?e:r.filterState}}),L(!0),r.n=1,null===(a=s.onChange)||void 0===a?void 0:a.call(s,e,t);case 1:if(!t.aborted){r.n=2;break}return r.a(2);case 2:L(!1),r.n=5;break;case 3:if(r.p=3,l=r.v,!t.aborted){r.n=4;break}return r.a(2);case 4:throw L(!1),l;case 5:return r.a(2)}},r,null,[[0,3]])}));return function(e,t,n){return r.apply(this,arguments)}}(),z={filterState:s.value||k.filterState,defaultFilterState:j(),isLoading:s.loading||A,setFilterState:function(r){N.current=r,s.value||B({filterState:r}),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;s.value?_(t,e.signal):_(t,e.signal,{filterState:t}),M.current=null,N.current=null},S)}},G=f(),H=p(G.breakpoints.down("md"));return a(I.Provider,{value:z,children:l(x,{className:y.root,sx:s.sx,children:[l(c,{className:y.inner,children:[(null==v?void 0:v.before)||null,l("div",{className:y.action,children:[a(b,{slots:{popperProps:{placement:"bottom-start"}}}),a(h,{slots:{popperProps:{placement:"bottom-start"}}})]}),a(g,{slots:{minimalInput:H,popperProps:{placement:"bottom-start"}}}),(null==v?void 0:v.after)||null]}),l(c,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,a(c,{sx:{flex:1,minWidth:0},children:!1!==r.enableSummary&&a(C,{})}),(null==v?void 0:v.summaryAfter)||null]}))]})})}}var y={root:"DinoFilterBar-root",inner:"DinoFilterBar-inner",action:"DinoFilterBar-action"},x=s(c)(function(e){var t=e.theme;return r(r(r({},"&.".concat(y.root),{backgroundColor:t.palette.background.paper,boxSizing:"border-box"}),".".concat(y.inner),{display:"flex",alignItems:"center",gap:t.spacing(1)}),".".concat(y.action),{display:"flex",alignItems:"center"})});export{S as createFilterBar};
1
+ import{defineProperty as r,slicedToArray as e,objectSpread2 as t,asyncToGenerator as n,regenerator as o}from"../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as a,jsxs as l}from"react/jsx-runtime";import{useState as i,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{createFilterSort as g}from"./components/filter-sort.js";import{createFilterInput as b}from"./components/filter-input.js";import{createFilterSummary as S}from"./components/filter-summary.js";function C(r){var c,C=null!==(c=r.debounceDelay)&&void 0!==c?c:300;if(!r.InputComponent){var h=r.inputConfig||{fields:{}};r.inputConfig=h,r.InputComponent=b(h)}if(!r.MenuComponent){var j=r.menuConfig||{fields:{}};r.menuConfig=j,r.MenuComponent=d(j)}if(!r.SummaryComponent&&!1!==r.enableSummary){var P=r.summaryConfig||{fields:{}};r.summaryConfig=P,r.SummaryComponent=S(P)}if(!r.SortComponent){var w=r.sortConfig||{fields:{}};r.sortConfig=w,r.SortComponent=g(w)}var F=r.defaultFilterLogic||"and",I=v();return function(c){var d,v=c.slots,g=r.InputComponent,b=r.MenuComponent,S=r.SummaryComponent,h=r.SortComponent,j=function(){return Object.assign({filterLogic:F},r.defaultFilterState,c.defaultValue)},P=i(function(){return c.value?{filterState:c.value}:{filterState:j()}}),w=e(P,2),k=w[0],B=w[1],L=i(!1),T=e(L,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&&B({filterState:c.value})},[c.value]);var _=function(){var r=n(o().m(function r(e,t,n){var a,l;return o().w(function(r){for(;;)switch(r.p=r.n){case 0:return r.p=0,B(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===(a=c.onChange)||void 0===a?void 0:a.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,l=r.v,!t.aborted){r.n=4;break}return r.a(2);case 4:throw A(!1),l;case 5:return r.a(2)}},r,null,[[0,3]])}));return function(e,t,n){return r.apply(this,arguments)}}(),z={filterState:c.value||k.filterState,defaultFilterState:j(),isLoading:c.loading||D,setFilterState:function(r){var e,n=null!==(e=(c.value||k.filterState).filterLogic)&&void 0!==e?e:F,o=t({filterLogic:n},r);N.current=o,c.value||B({filterState:o}),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},C)}},G=f(),H=p(G.breakpoints.down("md"));return a(I.Provider,{value:z,children:l(x,{className:y.root,sx:c.sx,children:[l(s,{className:y.inner,children:[(null==v?void 0:v.before)||null,l("div",{className:y.action,children:[a(b,{slots:{popperProps:{placement:"bottom-start"}}}),a(h,{slots:{popperProps:{placement:"bottom-start"}}})]}),a(g,{slots:{minimalInput:H,popperProps:{placement:"bottom-start"}}}),(null==v?void 0:v.after)||null]}),l(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,a(s,{sx:{flex:1,minWidth:0},children:!1!==r.enableSummary&&a(S,{})}),(null==v?void 0:v.summaryAfter)||null]}))]})})}}var y={root:"DinoFilterBar-root",inner:"DinoFilterBar-inner",action:"DinoFilterBar-action"},x=c(s)(function(e){var t=e.theme;return r(r(r({},"&.".concat(y.root),{backgroundColor:t.palette.background.paper,boxSizing:"border-box"}),".".concat(y.inner),{display:"flex",alignItems:"center",gap:t.spacing(1)}),".".concat(y.action),{display:"flex",alignItems:"center"})});export{C 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 { 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 \"or\" */\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 || 'or'\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 // store latest requested state\r\n pendingStateRef.current = state\r\n\r\n // If uncontrolled, update UI immediately for responsiveness\r\n if (!props.value) {\r\n setLocalState({ filterState: state })\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","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","_objectSpread","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) {\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,2 +1,2 @@
1
- import{slicedToArray as e,defineProperty as l,toConsumableArray as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as n}from"react/jsx-runtime";import{useMemo as r,useState as a}from"react";import{styled as t,Typography as u,FormGroup as s,FormControlLabel as c,Checkbox as d,Button as v,Box as m}from"@mui/material";import"../../form/validator.js";import"../../form/dino-form.js";import{getErrorMessage as f}from"../../form/helpers.js";import"../../../_virtual/Reflect.js";import"../../form/decorator.form.js";import"../../form/create.form-grid-layout.units.js";import{createChipViewers as p}from"../components/chip-viewer.js";import{PopperContent as b,PopperBody as g,PopperFooter as h}from"../components/popper-custom.js";import{ButtonBack as x,ChipDark as y,FilterLogicToggle as C}from"../components/ui.units.js";function j(t){var j=p(),V=(t||{}).options,k=void 0===V?[]:V;return function(p){var V,z,S,L=r(function(){return Object.assign({},p.currentConfig,null==t?void 0:t.config)},[null==t?void 0:t.config,p.currentConfig]),R=p.value,w=void 0===R?{values:[],logic:null!==(V=null==L?void 0:L.defaultLogic)&&void 0!==V?V:"or"}:R,B=a(w.logic),T=e(B,2),_=T[0],F=T[1],I=null!==(z=null==t?void 0:t.forceLogic)&&void 0!==z?z:_,M=null!==(S=null==L?void 0:L.label)&&void 0!==S?S:L.field.toString(),N=r(function(){var e=Array.isArray(w.values)?w.values:[w.values];return k.filter(function(l){return e.includes(l.value)}).map(function(e){return e.value})},[]),O=a(N),P=e(O,2),D=P[0],E=P[1],H=Array.isArray(w.values)?w.values:[],U=_!==w.logic,q=D.length!==H.length||D.some(function(e){return!H.includes(e)}),G=!q&&!U,J=a({}),K=e(J,2),Q=K[0],W=K[1],X=function(e){p.onSubmit(L.field,e,L)},Y=f(Q,L.field),Z=r(function(){var e=Array.isArray(w.values)?w.values:[w.values];return{field:L.field,items:e.map(function(e){var l;return{value:e,label:null===(l=k.find(function(l){return l.value===e}))||void 0===l?void 0:l.label}})}},[L.field,w]),$=null!=(null==t?void 0:t.maxValueCount)&&D.length>t.maxValueCount,ee=null!=(null==t?void 0:t.maxValueCount)&&D.length>=t.maxValueCount,le=[];return p.isLoading&&le.push("disabled"),i(A,{className:le.join(" "),noValidate:!0,onSubmit:function(e){var o;if(e.preventDefault(),q){if(!$){var i=l({},L.field,D),n=null===(o=p.validator)||void 0===o?void 0:o.run(i);if(W(n||{}),!n||0===Object.keys(n).length)X({values:D,logic:I})}}else U&&X({values:w.values,logic:I})},children:n(b,{title:"Filter by ".concat(M),onClose:p.onClose,slots:{beforeTitle:i(x,{size:"small",onClick:p.onBack}),afterTitle:L.singleValue?i(y,{sx:{ml:1.5},size:"small",label:"Last value only"}):null!=t&&t.forceLogic?null:i(C,{sx:{ml:1},value:I,onChange:function(e,l){F(l)}})},children:[n(g,{children:[L.description&&i(u,{variant:"caption",color:"text.secondary",sx:{mb:1,display:"block"},children:L.description}),null!=(null==t?void 0:t.maxValueCount)&&i(u,{variant:"caption",color:$?"warning.main":"text.secondary",sx:{mb:.5,display:"block"},children:null!=t&&t.maxValueCount?$?"Maximum ".concat(t.maxValueCount," value").concat(t.maxValueCount>1?"s":""," selected (limit reached)"):"Up to ".concat(t.maxValueCount," value").concat(t.maxValueCount>1?"s":""," can be selected"):""}),i(j,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:Z,onRemove:p.onRemove}),i(s,{className:Y.error?"error":"",children:k.map(function(e,l){var n,r=D.includes(e.value),a=Z.items.some(function(l){return l.value===e.value})&&!0===(null==t?void 0:t.disabledAfterSubmit),u=!r&&ee;return i(c,{value:e.value,disabled:a||u,label:null!==(n=e.label)&&void 0!==n?n:e.value,control:i(d,{name:L.field.toString(),checked:r,onChange:function(l){return i=e.value,n=l.target.checked,void E(function(e){return n?[].concat(o(e),[i]):e.filter(function(e){return e!==i})});var i,n}})},e.value.toString()+l)})})]}),n(h,{children:[i(v,{size:"small",color:"error",variant:"text",disabled:!w.values||0===w.values.length,onClick:function(){var e,l;null===(e=p.onRemoveField)||void 0===e||e.call(p,L.field),!1!==(null==t||null===(l=t.config)||void 0===l?void 0:l.closeAfterClear)&&p.onClose()},children:"Clear All"}),i(m,{sx:{flex:1}}),i(v,{size:"small",color:"inherit",variant:"text",onClick:p.onClose,children:"Cancel"}),i(v,{size:"small",type:"submit",color:"primary",variant:"contained",disabled:G,children:"Apply"})]})]})})}}var A=t("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"}}});export{j as default};
1
+ import{slicedToArray as e,defineProperty as l,toConsumableArray as n}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as i,jsxs as o}from"react/jsx-runtime";import{useMemo as a,useState as t}from"react";import{styled as r,Typography as u,FormGroup as c,FormControlLabel as s,Checkbox as d,Button as v,Box as m}from"@mui/material";import{createChipViewers as f}from"../components/chip-viewer.js";import{PopperContent as p,PopperBody as b,PopperFooter as g}from"../components/popper-custom.js";import{ButtonBack as h,ChipDark as x,FilterLogicToggle as C}from"../components/ui.units.js";import{getErrorMessage as y}from"../../form/helpers.js";function A(r){var A=f(),k=(r||{}).options,j=void 0===k?[]:k;return function(f){var k,z,S,L=a(function(){return Object.assign({},f.currentConfig,null==r?void 0:r.config)},[null==r?void 0:r.config,f.currentConfig]),w=f.value,B=void 0===w?{values:[],logic:null!==(k=null==L?void 0:L.defaultLogic)&&void 0!==k?k:"or"}:w,R=t(B.logic),T=e(R,2),F=T[0],I=T[1],M=null!==(z=null==r?void 0:r.forceLogic)&&void 0!==z?z:F,N=null!==(S=null==L?void 0:L.label)&&void 0!==S?S:L.field.toString(),O=a(function(){var e=Array.isArray(B.values)?B.values:[B.values];return j.filter(function(l){return e.includes(l.value)}).map(function(e){return e.value})},[]),P=t(O),_=e(P,2),D=_[0],E=_[1],H=Array.isArray(B.values)?B.values:[],U=F!==B.logic,q=D.length!==H.length||D.some(function(e){return!H.includes(e)}),G=!q&&!U,J=t({}),K=e(J,2),Q=K[0],W=K[1],X=function(e){f.onSubmit(L.field,e,L)},Y=y(Q,L.field),Z=a(function(){var e=Array.isArray(B.values)?B.values:[B.values];return{field:L.field,items:e.map(function(e){var l;return{value:e,label:null===(l=j.find(function(l){return l.value===e}))||void 0===l?void 0:l.label}})}},[L.field,B]),$=null!=(null==r?void 0:r.maxValueCount)&&D.length>r.maxValueCount,ee=null!=(null==r?void 0:r.maxValueCount)&&D.length>=r.maxValueCount,le=[];return f.isLoading&&le.push("disabled"),i(V,{className:le.join(" "),noValidate:!0,onSubmit:function(e){var n;if(e.preventDefault(),q){if(!$){var i=l({},L.field,D),o=null===(n=f.validator)||void 0===n?void 0:n.run(i);if(W(o||{}),!o||0===Object.keys(o).length)X({values:D,logic:M})}}else U&&X({values:B.values,logic:M})},children:o(p,{title:"Filter by ".concat(N),onClose:f.onClose,slots:{beforeTitle:i(h,{size:"small",onClick:f.onBack}),afterTitle:L.singleValue?i(x,{sx:{ml:1.5},size:"small",label:"Last value only"}):null!=r&&r.forceLogic?null:i(C,{sx:{ml:1},value:M,onChange:function(e,l){I(l)}})},children:[o(b,{children:[L.description&&i(u,{variant:"caption",color:"text.secondary",sx:{mb:1,display:"block"},children:L.description}),null!=(null==r?void 0:r.maxValueCount)&&i(u,{variant:"caption",color:$?"warning.main":"text.secondary",sx:{mb:.5,display:"block"},children:null!=r&&r.maxValueCount?$?"Maximum ".concat(r.maxValueCount," value").concat(r.maxValueCount>1?"s":""," selected (limit reached)"):"Up to ".concat(r.maxValueCount," value").concat(r.maxValueCount>1?"s":""," can be selected"):""}),i(A,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:Z,onRemove:f.onRemove}),i(c,{className:Y.error?"error":"",children:j.map(function(e,l){var o,a=D.includes(e.value),t=Z.items.some(function(l){return l.value===e.value})&&!0===(null==r?void 0:r.disabledAfterSubmit),u=!a&&ee;return i(s,{value:e.value,disabled:t||u,label:null!==(o=e.label)&&void 0!==o?o:e.value,control:i(d,{name:L.field.toString(),checked:a,onChange:function(l){return i=e.value,o=l.target.checked,void E(function(e){return o?[].concat(n(e),[i]):e.filter(function(e){return e!==i})});var i,o}})},e.value.toString()+l)})})]}),o(g,{children:[i(v,{size:"small",color:"error",variant:"text",disabled:!B.values||0===B.values.length,onClick:function(){var e,l;null===(e=f.onRemoveField)||void 0===e||e.call(f,L.field),!1!==(null==r||null===(l=r.config)||void 0===l?void 0:l.closeAfterClear)&&f.onClose()},children:"Clear All"}),i(m,{sx:{flex:1}}),i(v,{size:"small",color:"inherit",variant:"text",onClick:f.onClose,children:"Cancel"}),i(v,{size:"small",type:"submit",color:"primary",variant:"contained",disabled:G,children:"Apply"})]})]})})}}var V=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"}}});export{A 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 { useMemo, useState } from 'react'\r\nimport { Box, Button, Checkbox, FormControlLabel, FormGroup, formGroupClasses, styled, Typography } from '@mui/material'\r\nimport { getErrorMessage } from '../../form'\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 } 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 } 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\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 /** 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}\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 = [] } = 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 { value = { values: [], logic: mergedConfig?.defaultLogic ?? 'or' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n const effectiveLogic = params?.forceLogic ?? filterLogic\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n // Track checked values as controlled state to avoid the uncontrolled→controlled MUI warning\r\n const initialChecked = useMemo<TFieldValid[]>(() => {\r\n const values = Array.isArray(value.values) ? value.values : [value.values]\r\n return options.filter((opt) => values.includes(opt.value)).map((opt) => opt.value)\r\n }, [])\r\n const [checkedValues, setCheckedValues] = useState<TFieldValid[]>(initialChecked)\r\n\r\n const appliedValues = Array.isArray(value.values) ? value.values : []\r\n const hasLogicChange = filterLogic !== value.logic\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) {\r\n handleSubmit({ values: value.values, logic: effectiveLogic })\r\n }\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)\r\n if (params?.config?.closeAfterClear !== false) props.onClose()\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 (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n if (params?.forceLogic) return null\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={effectiveLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\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 {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 <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.2)',\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","props","_mergedConfig$default","_params$forceLogic","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","_props$value","value","values","logic","defaultLogic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","effectiveLogic","forceLogic","label","field","toString","initialChecked","Array","isArray","filter","opt","includes","map","_useState3","_useState4","checkedValues","setCheckedValues","appliedValues","hasLogicChange","hasDataChange","length","some","v","isApplyDisabled","_useState5","_useState6","errorData","setErrorData","handleSubmit","newValue","onSubmit","errorResult","getErrorMessage","filterViewerValue","items","_options$find","find","o","isMaxReached","maxValueCount","isMaxReachedValid","rootClasses","isLoading","push","_jsx","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","obj","_defineProperty","validator","run","keys","children","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","sx","ml","FilterLogicToggle","onChange","_","nVal","PopperBody","description","Typography","variant","color","mb","display","borderBottom","placement","enableMinimalesticView","onRemove","FormGroup","error","x","i","_x$label","isChecked","disabled","item","disabledAfterSubmit","disableDueToMax","FormControlLabel","control","Checkbox","name","checked","e","optionValue","target","prev","_toConsumableArray","PopperFooter","Button","_props$onRemoveField","_params$config","onRemoveField","call","closeAfterClear","Box","flex","type","styled","position","content","inset","backgroundColor","zIndex","opacity","transition","visibility","pointerEvents"],"mappings":"60BAgDA,SAASA,EAAiCC,GACxC,IAAMC,EAAcC,IACiBC,GAAZH,GAAU,CAAE,GAA7BI,QAAAA,OAAU,IAAHD,EAAG,GAAEA,EAyKpB,OAvKsE,SAACE,GAAS,IAAAC,EAAAC,EAAAC,EAKxEC,EAAeC,EAAQ,WAAA,OAAMC,OAAOC,OAAO,GAAIP,EAAMQ,cAAeb,eAAAA,EAAQc,OAAO,EAAE,CAACd,aAAAA,EAAAA,EAAQc,OAAQT,EAAMQ,gBAElHE,EAA8EV,EAAtEW,MAAAA,OAAQ,IAAHD,EAAG,CAAEE,OAAQ,GAAIC,MAAiC,QAA5BZ,EAAEG,aAAY,EAAZA,EAAcU,oBAAY,IAAAb,EAAAA,EAAI,MAAMS,EACzEK,EAAsCC,EAAiBL,EAAME,OAAOI,EAAAC,EAAAH,EAAA,GAA7DI,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GAC5BI,EAAmCnB,QAArBA,EAAGP,aAAM,EAANA,EAAQ2B,kBAAUpB,IAAAA,EAAAA,EAAIiB,EAEvCI,UAAKpB,EAAGC,aAAAA,EAAAA,EAAcmB,aAAK,IAAApB,EAAAA,EAAIC,EAAaoB,MAAMC,WAGlDC,EAAiBrB,EAAuB,WAC5C,IAAMO,EAASe,MAAMC,QAAQjB,EAAMC,QAAUD,EAAMC,OAAS,CAACD,EAAMC,QACnE,OAAOb,EAAQ8B,OAAO,SAACC,GAAG,OAAKlB,EAAOmB,SAASD,EAAInB,MAAM,GAAEqB,IAAI,SAACF,GAAG,OAAKA,EAAInB,OAC7E,EAAE,IACHsB,EAA0CjB,EAAwBU,GAAeQ,EAAAhB,EAAAe,EAAA,GAA1EE,EAAaD,EAAA,GAAEE,EAAgBF,EAAA,GAEhCG,EAAgBV,MAAMC,QAAQjB,EAAMC,QAAUD,EAAMC,OAAS,GAC7D0B,EAAiBnB,IAAgBR,EAAME,MACvC0B,EAAgBJ,EAAcK,SAAWH,EAAcG,QAAUL,EAAcM,KAAK,SAAAC,GAAC,OAAKL,EAAcN,SAASW,KACjHC,GAAmBJ,IAAkBD,EAE3CM,EAAkC5B,EAA6C,IAAG6B,EAAA3B,EAAA0B,EAAA,GAA3EE,EAASD,EAAA,GAAEE,EAAYF,EAAA,GAMxBG,EAAe,SAACC,GACpBjD,EAAMkD,SAAS9C,EAAaoB,MAAOyB,EAAU7C,EAC9C,EAyBK+C,EAAcC,EAAgBN,EAAW1C,EAAaoB,OACtD6B,EAAoBhD,EAA6B,WACrD,IAAMiD,EAAQ3B,MAAMC,QAAQjB,EAAMC,QAAUD,EAAMC,OAAS,CAACD,EAAMC,QAClE,MAAO,CACLY,MAAOpB,EAAaoB,MACpB8B,MAAOA,EAAMtB,IAAI,SAACU,GAAC,IAAAa,EAAA,MAAM,CAAE5C,MAAO+B,EAAGnB,MAAyCgC,QAApCA,EAAExD,EAAQyD,KAAK,SAACC,GAAC,OAAKA,EAAE9C,QAAU+B,CAAC,UAAjCa,IAAkCA,OAAlCA,EAAAA,EAAoChC,MAAQ,GAE3F,EAAE,CAACnB,EAAaoB,MAAOb,IAElB+C,EAAwC,OAAzB/D,eAAAA,EAAQgE,gBAAyBxB,EAAcK,OAAS7C,EAAOgE,cAC9EC,GAA6C,OAAzBjE,eAAAA,EAAQgE,gBAAyBxB,EAAcK,QAAU7C,EAAOgE,cA0BpFE,GAAwB,GAG9B,OAFI7D,EAAM8D,WAAWD,GAAYE,KAAK,YAGpCC,EAACC,EAAU,CAACC,UAAWL,GAAYM,KAAK,KAAMC,cAAWlB,SA/DlC,SAACmB,GAA2C,IAAAC,EAGnE,GAFAD,EAAME,iBAEDhC,GAOL,IAAImB,EAAJ,CAEA,IAAMc,EAAGC,EAAA,CAAA,EAAMrE,EAAaoB,MAAQW,GAChCW,EAA2BwB,QAAlBA,EAAGtE,EAAM0E,qBAASJ,SAAfA,EAAiBK,IAAIH,GAIrC,GAFAzB,EAAaD,GAAa,KAErBA,GAA+C,IAAlCxC,OAAOsE,KAAK9B,GAAWN,OAEvCQ,EAD8B,CAAEpC,OAAQuB,EAAetB,MAAOQ,GAR9C,OANZiB,GACFU,EAAa,CAAEpC,OAAQD,EAAMC,OAAQC,MAAOQ,GAgBjD,EA0CoFwD,SACjFC,EAACC,EAAa,CACZC,MAAKC,aAAAA,OAAe1D,GACpB2D,QAASlF,EAAMkF,QACfC,MAAO,CACLC,YAAapB,EAACqB,EAAU,CAACC,KAAK,QAAQC,QAASvF,EAAMwF,SACrDC,WAfFrF,EAAasF,YAAoB1B,EAAC2B,EAAQ,CAACC,GAAI,CAAEC,GAAI,KAAOP,KAAK,QAAQ/D,MAAM,oBAC/E5B,SAAAA,EAAQ2B,WAAmB,KACxB0C,EAAC8B,EAAkB,CAAAF,GAAI,CAAEC,GAAI,GAAKlF,MAAOU,EAAgB0E,SAAU,SAACC,EAAGC,GApB9E7E,EAoByG6E,EAAK,KAczGpB,SAAA,CAEDC,EAACoB,EACE,CAAArB,SAAA,CAAAzE,EAAa+F,aACZnC,EAACoC,EAAU,CAACC,QAAQ,UAAUC,MAAM,iBAAiBV,GAAI,CAAEW,GAAI,EAAGC,QAAS,SAAS3B,SACjFzE,EAAa+F,cAGQ,OAAzBxG,aAAAA,EAAAA,EAAQgE,gBACPK,EAACoC,EAAU,CAACC,QAAQ,UAAUC,MAAO5C,EAAe,eAAiB,iBAAkBkC,GAAI,CAAEW,GAAI,GAAKC,QAAS,SAAS3B,SAlC3HlF,SAAAA,EAAQgE,cACTD,EACF,WAAAuB,OAAkBtF,EAAOgE,wBAAasB,OAAStF,EAAOgE,cAAgB,EAAI,IAAM,GAAE,6BAElF,SAAAsB,OAAgBtF,EAAOgE,wBAAasB,OAAStF,EAAOgE,cAAgB,EAAI,IAAM,GAAE,oBAJ/C,KAsC7BK,EAACpE,EACC,CAAAgG,GAAI,CAAEW,GAAI,EAAGE,aAAc,kBAC3BlF,MAAM,UACNmF,UAAU,aACVC,0BACAhG,MAAO0C,EACPuD,SAAU5G,EAAM4G,WAElB5C,EAAC6C,EAAU,CAAA3C,UAAWf,EAAY2D,MAAQ,QAAU,GACjDjC,SAAA9E,EAAQiC,IAAI,SAAC+E,EAAGC,GAAK,IAAAC,EACdC,EAAY/E,EAAcJ,SAASgF,EAAEpG,OAErCwG,EADa9D,EAAkBC,MAAMb,KAAK,SAAC2E,GAAI,OAAKA,EAAKzG,QAAUoG,EAAEpG,UACZ,KAAhChB,aAAAA,EAAAA,EAAQ0H,qBACjCC,GAAmBJ,GAAatD,GACtC,OACEI,EAACuD,EAAgB,CAEf5G,MAAOoG,EAAEpG,MACTwG,SAAUA,GAAYG,EACtB/F,MAAc0F,QAATA,EAAEF,EAAExF,aAAK0F,IAAAA,EAAAA,EAAIF,EAAEpG,MACpB6G,QACExD,EAACyD,EACC,CAAAC,KAAMtH,EAAaoB,MAAMC,WACzBkG,QAAST,EACTnB,SAAU,SAAC6B,GAAC,OAnHFC,EAmH4Bd,EAAEpG,MAnHJgH,EAmH0BC,EAAEE,OAAOH,aAlHzFvF,EAAiB,SAAC2F,GAAI,OAAMJ,EAAO,GAAA1C,OAAA+C,EAAOD,GAAMF,CAAAA,IAAeE,EAAKlG,OAAO,SAACa,GAAC,OAAKA,IAAMmF,GAAY,GADzE,IAACA,EAA0BF,CAmH2C,KAR9EZ,EAAEpG,MAAMc,WAAauF,EAa/B,QAGLlC,EAACmD,EAAY,CAAApD,SAAA,CACXb,EAACkE,EAAO,CAAA5C,KAAK,QAAQgB,MAAM,QAAQD,QAAQ,OAAOc,UAAWxG,EAAMC,QAAkC,IAAxBD,EAAMC,OAAO4B,OAAc+C,QA7EzF,WAAK,IAAA4C,EAAAC,UAC1BD,EAAAnI,EAAMqI,qBAAa,IAAAF,GAAnBA,EAAAG,KAAAtI,EAAsBI,EAAaoB,QACK,KAApC7B,SAAc,QAARyI,EAANzI,EAAQc,cAAR2H,IAAcA,OAAdA,EAAAA,EAAgBG,kBAA2BvI,EAAMkF,SACtD,EA4EgBL,SAAA,cACTb,EAACwE,GAAI5C,GAAI,CAAE6C,KAAM,KACjBzE,EAACkE,EAAM,CAAC5C,KAAK,QAAQgB,MAAM,UAAUD,QAAQ,OAAOd,QAASvF,EAAMkF,QAE1DL,SAAA,WACTb,EAACkE,GAAO5C,KAAK,QAAQoD,KAAK,SAASpC,MAAM,UAAUD,QAAQ,YAAYc,SAAUxE,4BAO1F,CAGH,CAIA,IAAMsB,EAAa0E,EAAO,OAAPA,CAAe,CAChCC,SAAU,WACV,WAAY,CACVC,QAAS,KACTrC,QAAS,QACToC,SAAU,WACVE,MAAO,EACPC,gBAAiB,qBACjBlH,OAAQ,YACRmH,QAAU,EACVC,QAAS,EACTC,WAAY,eACZC,WAAY,UAEd,aAAc,CACZC,cAAe,OACf,WAAY,CACVJ,OAAQ,EACRC,QAAS,EACTE,WAAY"}
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 { useMemo, useState } from 'react'\r\nimport { Box, Button, Checkbox, FormControlLabel, FormGroup, formGroupClasses, styled, Typography } from '@mui/material'\r\nimport { getErrorMessage } from '../../form'\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 } 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 } 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\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 /** 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}\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 = [] } = 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 { value = { values: [], logic: mergedConfig?.defaultLogic ?? 'or' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n const effectiveLogic = params?.forceLogic ?? filterLogic\r\n\r\n const label = mergedConfig?.label ?? mergedConfig.field.toString()\r\n\r\n // Track checked values as controlled state to avoid the uncontrolled→controlled MUI warning\r\n const initialChecked = useMemo<TFieldValid[]>(() => {\r\n const values = Array.isArray(value.values) ? value.values : [value.values]\r\n return options.filter((opt) => values.includes(opt.value)).map((opt) => opt.value)\r\n }, [])\r\n const [checkedValues, setCheckedValues] = useState<TFieldValid[]>(initialChecked)\r\n\r\n const appliedValues = Array.isArray(value.values) ? value.values : []\r\n const hasLogicChange = filterLogic !== value.logic\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) {\r\n handleSubmit({ values: value.values, logic: effectiveLogic })\r\n }\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)\r\n if (params?.config?.closeAfterClear !== false) props.onClose()\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 (mergedConfig.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n if (params?.forceLogic) return null\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={effectiveLogic} onChange={(_, nVal) => handleChangeLogic(nVal)} />\r\n }\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 {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 <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.2)',\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","props","_mergedConfig$default","_params$forceLogic","_mergedConfig$label","mergedConfig","useMemo","Object","assign","currentConfig","config","_props$value","value","values","logic","defaultLogic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","effectiveLogic","forceLogic","label","field","toString","initialChecked","Array","isArray","filter","opt","includes","map","_useState3","_useState4","checkedValues","setCheckedValues","appliedValues","hasLogicChange","hasDataChange","length","some","v","isApplyDisabled","_useState5","_useState6","errorData","setErrorData","handleSubmit","newValue","onSubmit","errorResult","getErrorMessage","filterViewerValue","items","_options$find","find","o","isMaxReached","maxValueCount","isMaxReachedValid","rootClasses","isLoading","push","_jsx","RootStyled","className","join","noValidate","event","_props$validator","preventDefault","obj","_defineProperty","validator","run","keys","children","_jsxs","PopperContent","title","concat","onClose","slots","beforeTitle","ButtonBack","size","onClick","onBack","afterTitle","singleValue","ChipDark","sx","ml","FilterLogicToggle","onChange","_","nVal","PopperBody","description","Typography","variant","color","mb","display","borderBottom","placement","enableMinimalesticView","onRemove","FormGroup","error","x","i","_x$label","isChecked","disabled","item","disabledAfterSubmit","disableDueToMax","FormControlLabel","control","Checkbox","name","checked","e","optionValue","target","prev","_toConsumableArray","PopperFooter","Button","_props$onRemoveField","_params$config","onRemoveField","call","closeAfterClear","Box","flex","type","styled","position","content","inset","backgroundColor","zIndex","opacity","transition","visibility","pointerEvents"],"mappings":"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"}
@@ -35,7 +35,9 @@ type TAutoMapConfigs<TSource, TTarget extends object, U extends object = {}> = P
35
35
  type TFilterOption = {
36
36
  logic?: TLogic;
37
37
  };
38
+ /** Map logic for filter operations @default 'or' */
38
39
  export declare const mapLogic: (logic?: TLogic) => 'And' | 'Or';
40
+ /** Map sort direction for GraphQL queries @default 'asc' */
39
41
  export declare const mapSortDirection: (direction?: TDirection) => 'ASC' | 'DESC';
40
42
  export declare class TableFileterConverter<TSource extends Record<string, any>, TTarget extends object, U extends object = {}> {
41
43
  private state;
@@ -53,10 +55,10 @@ export declare class TableFileterConverter<TSource extends Record<string, any>,
53
55
  targetField?: TFieldType<TSource>;
54
56
  autoSave?: boolean;
55
57
  };
56
- }): this;
57
- quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[]): this;
58
+ }, options?: TFilterOption): this;
59
+ quickSearch(fields: TFieldType<TSource> | TFieldType<TSource>[], options?: TFilterOption): this;
58
60
  private currentObjectMap?;
59
- autoMap: (objMap: TAutoMapConfigs<TSource, TTarget, U>) => this;
61
+ autoMap: (objMap: TAutoMapConfigs<TSource, TTarget, U>, options?: TFilterOption) => this;
60
62
  private prebuildFunc?;
61
63
  prebuild: (func: (requestParam: RequestParam<TTarget, U>) => RequestParam<TTarget, U>) => this;
62
64
  build(): import("../http-service/graphql/request-param").IRequestParamResult<TTarget, U>;
@@ -9,7 +9,7 @@ export interface IFilterBarConfigs<T> {
9
9
  /** Debounce delay for filter input changes in milliseconds @default 300 */
10
10
  debounceDelay?: number;
11
11
  defaultFilterState?: TFilterState<T>;
12
- /** Default filter logic, can be overridden by individual filters @default "or" */
12
+ /** Default filter logic, can be overridden by individual filters @default "and" */
13
13
  defaultFilterLogic?: 'and' | 'or';
14
14
  InputComponent?: ComponentType<IFilterInputProps<T>>;
15
15
  inputConfig?: IFilterInputConfig<T>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dinocollab-core",
3
- "version": "2.2.33",
3
+ "version": "2.2.35",
4
4
  "description": "Dinocollab core - libraries for building collaborative applications with React 18",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",