@fctc/widget-logic 2.5.6 → 2.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/hooks.js CHANGED
@@ -484,16 +484,17 @@ var useViewV2 = ({
484
484
  }) => {
485
485
  const { useGetView: useGetView2 } = (0, provider_exports.useService)();
486
486
  const viewParams = (0, import_react6.useMemo)(() => {
487
+ if (!model || !views) return void 0;
487
488
  return {
488
489
  model,
489
490
  views,
490
491
  context,
491
492
  id
492
493
  };
493
- }, [model]);
494
+ }, [model, views, context, id]);
494
495
  const view = useGetView2(
495
496
  viewParams || {},
496
- !!viewParams
497
+ !!viewParams && !(0, utils_exports.isObjectEmpty)(viewParams)
497
498
  );
498
499
  return {
499
500
  ...view,
@@ -590,18 +591,23 @@ var AppProvider = ({
590
591
  { ...(0, utils_exports.evalJSONContext)(action?.context) }
591
592
  ]);
592
593
  }, [menuContext, action?.context, env?.context?.lang]);
593
- const view = useViewV2({
594
- context: viewContext,
595
- views: [
596
- ...Array.isArray(action?.views) ? action?.views.map(
594
+ const memoViews = (0, import_react8.useMemo)(() => {
595
+ if (!action) return [];
596
+ return [
597
+ ...Array.isArray(action?.views) ? action.views.map(
597
598
  (view2) => view2[1] === "list" ? [view2[0], "list"] : view2
598
599
  ) : [],
599
600
  [
600
- Array.isArray(action?.search_view_id) ? action?.search_view_id[0] : action?.search_view_id,
601
+ Array.isArray(action?.search_view_id) ? action.search_view_id[0] : action.search_view_id,
601
602
  "search"
602
603
  ]
603
- ],
604
- model: String(action?.res_model)
604
+ ];
605
+ }, [action]);
606
+ const view = useViewV2({
607
+ context: viewContext,
608
+ // cũng nên memo nếu thay đổi liên tục
609
+ views: memoViews,
610
+ model: action?.res_model ? String(action.res_model) : void 0
605
611
  });
606
612
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
607
613
  ReactContext.Provider,
@@ -726,7 +732,7 @@ var useGetSpecification = ({
726
732
 
727
733
  // src/hooks/core/use-list-data.ts
728
734
  var import_react14 = require("react");
729
- var import_utils4 = require("@fctc/interface-logic/utils");
735
+ var import_utils5 = require("@fctc/interface-logic/utils");
730
736
 
731
737
  // src/hooks/utils/use-click-outside.ts
732
738
  var import_react11 = require("react");
@@ -868,12 +874,12 @@ var useListData = ({
868
874
  if (!viewData || !action || !context) {
869
875
  return null;
870
876
  }
871
- const domainParse = type === "calendar" ? getDateRange(currentDate, mode) : action?.domain ? Array.isArray(action?.domain) ? [...action?.domain] : (0, import_utils4.evalJSONDomain)(action?.domain, context) : [];
877
+ const domainParse = type === "calendar" ? getDateRange(currentDate, mode) : action?.domain ? Array.isArray(action?.domain) ? [...action?.domain] : (0, import_utils5.evalJSONDomain)(action?.domain, context) : [];
872
878
  const limit = type === "calendar" ? 2500 : pageLimit;
873
879
  const offset = debouncedPage * pageLimit;
874
880
  const fields = type === "calendar" ? convertFieldsToArray(viewData?.views?.calendar?.fields) || [] : typeof groupByList === "object" ? groupByList?.fields : void 0;
875
881
  const groupby = typeof groupByList === "object" ? [groupByList?.contexts?.[0]?.group_by] : [];
876
- const sort = order ? order : viewData?.views?.list?.default_order ? (0, import_utils4.formatSortingString)(viewData?.views?.list?.default_order) : "";
882
+ const sort = order ? order : viewData?.views?.list?.default_order ? (0, import_utils5.formatSortingString)(viewData?.views?.list?.default_order) : "";
877
883
  return {
878
884
  model: action.res_model,
879
885
  specification,
@@ -901,7 +907,7 @@ var useListData = ({
901
907
  const list = useGetListData2(
902
908
  listDataProps,
903
909
  [listDataProps],
904
- !!listDataProps && !!specification && !(0, import_utils4.isObjectEmpty)(specification)
910
+ !!listDataProps && !!specification && !(0, import_utils5.isObjectEmpty)(specification)
905
911
  );
906
912
  return {
907
913
  ...list,
package/dist/hooks.mjs CHANGED
@@ -465,16 +465,17 @@ var useViewV2 = ({
465
465
  }) => {
466
466
  const { useGetView: useGetView2 } = (0, provider_exports.useService)();
467
467
  const viewParams = useMemo3(() => {
468
+ if (!model || !views) return void 0;
468
469
  return {
469
470
  model,
470
471
  views,
471
472
  context,
472
473
  id
473
474
  };
474
- }, [model]);
475
+ }, [model, views, context, id]);
475
476
  const view = useGetView2(
476
477
  viewParams || {},
477
- !!viewParams
478
+ !!viewParams && !(0, utils_exports.isObjectEmpty)(viewParams)
478
479
  );
479
480
  return {
480
481
  ...view,
@@ -571,18 +572,23 @@ var AppProvider = ({
571
572
  { ...(0, utils_exports.evalJSONContext)(action?.context) }
572
573
  ]);
573
574
  }, [menuContext, action?.context, env?.context?.lang]);
574
- const view = useViewV2({
575
- context: viewContext,
576
- views: [
577
- ...Array.isArray(action?.views) ? action?.views.map(
575
+ const memoViews = useMemo5(() => {
576
+ if (!action) return [];
577
+ return [
578
+ ...Array.isArray(action?.views) ? action.views.map(
578
579
  (view2) => view2[1] === "list" ? [view2[0], "list"] : view2
579
580
  ) : [],
580
581
  [
581
- Array.isArray(action?.search_view_id) ? action?.search_view_id[0] : action?.search_view_id,
582
+ Array.isArray(action?.search_view_id) ? action.search_view_id[0] : action.search_view_id,
582
583
  "search"
583
584
  ]
584
- ],
585
- model: String(action?.res_model)
585
+ ];
586
+ }, [action]);
587
+ const view = useViewV2({
588
+ context: viewContext,
589
+ // cũng nên memo nếu thay đổi liên tục
590
+ views: memoViews,
591
+ model: action?.res_model ? String(action.res_model) : void 0
586
592
  });
587
593
  return /* @__PURE__ */ jsx(
588
594
  ReactContext.Provider,
@@ -710,7 +716,7 @@ import { useMemo as useMemo7, useState as useState5 } from "react";
710
716
  import {
711
717
  evalJSONDomain,
712
718
  formatSortingString,
713
- isObjectEmpty as isObjectEmpty3
719
+ isObjectEmpty as isObjectEmpty4
714
720
  } from "@fctc/interface-logic/utils";
715
721
 
716
722
  // src/hooks/utils/use-click-outside.ts
@@ -886,7 +892,7 @@ var useListData = ({
886
892
  const list = useGetListData2(
887
893
  listDataProps,
888
894
  [listDataProps],
889
- !!listDataProps && !!specification && !isObjectEmpty3(specification)
895
+ !!listDataProps && !!specification && !isObjectEmpty4(specification)
890
896
  );
891
897
  return {
892
898
  ...list,
package/dist/index.js CHANGED
@@ -55,7 +55,7 @@ var require_moment = __commonJS({
55
55
  function hasOwnProp(a, b) {
56
56
  return Object.prototype.hasOwnProperty.call(a, b);
57
57
  }
58
- function isObjectEmpty4(obj) {
58
+ function isObjectEmpty5(obj) {
59
59
  if (Object.getOwnPropertyNames) {
60
60
  return Object.getOwnPropertyNames(obj).length === 0;
61
61
  } else {
@@ -2194,7 +2194,7 @@ var require_moment = __commonJS({
2194
2194
  strict = locale2;
2195
2195
  locale2 = void 0;
2196
2196
  }
2197
- if (isObject(input) && isObjectEmpty4(input) || isArray(input) && input.length === 0) {
2197
+ if (isObject(input) && isObjectEmpty5(input) || isArray(input) && input.length === 0) {
2198
2198
  input = void 0;
2199
2199
  }
2200
2200
  c._isAMomentObject = true;
@@ -2613,7 +2613,7 @@ var require_moment = __commonJS({
2613
2613
  return isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === void 0;
2614
2614
  }
2615
2615
  function isMomentInputObject(input) {
2616
- var objectTest = isObject(input) && !isObjectEmpty4(input), propertyTest = false, properties = [
2616
+ var objectTest = isObject(input) && !isObjectEmpty5(input), propertyTest = false, properties = [
2617
2617
  "years",
2618
2618
  "year",
2619
2619
  "y",
@@ -2655,7 +2655,7 @@ var require_moment = __commonJS({
2655
2655
  return arrayTest && dataTypeTest;
2656
2656
  }
2657
2657
  function isCalendarSpec(input) {
2658
- var objectTest = isObject(input) && !isObjectEmpty4(input), propertyTest = false, properties = [
2658
+ var objectTest = isObject(input) && !isObjectEmpty5(input), propertyTest = false, properties = [
2659
2659
  "sameDay",
2660
2660
  "nextDay",
2661
2661
  "lastDay",
@@ -4534,16 +4534,17 @@ var useViewV2 = ({
4534
4534
  }) => {
4535
4535
  const { useGetView: useGetView2 } = (0, provider_exports.useService)();
4536
4536
  const viewParams = (0, import_react6.useMemo)(() => {
4537
+ if (!model || !views) return void 0;
4537
4538
  return {
4538
4539
  model,
4539
4540
  views,
4540
4541
  context,
4541
4542
  id
4542
4543
  };
4543
- }, [model]);
4544
+ }, [model, views, context, id]);
4544
4545
  const view = useGetView2(
4545
4546
  viewParams || {},
4546
- !!viewParams
4547
+ !!viewParams && !(0, utils_exports.isObjectEmpty)(viewParams)
4547
4548
  );
4548
4549
  return {
4549
4550
  ...view,
@@ -4640,18 +4641,23 @@ var AppProvider = ({
4640
4641
  { ...(0, utils_exports.evalJSONContext)(action?.context) }
4641
4642
  ]);
4642
4643
  }, [menuContext, action?.context, env?.context?.lang]);
4643
- const view = useViewV2({
4644
- context: viewContext,
4645
- views: [
4646
- ...Array.isArray(action?.views) ? action?.views.map(
4644
+ const memoViews = (0, import_react8.useMemo)(() => {
4645
+ if (!action) return [];
4646
+ return [
4647
+ ...Array.isArray(action?.views) ? action.views.map(
4647
4648
  (view2) => view2[1] === "list" ? [view2[0], "list"] : view2
4648
4649
  ) : [],
4649
4650
  [
4650
- Array.isArray(action?.search_view_id) ? action?.search_view_id[0] : action?.search_view_id,
4651
+ Array.isArray(action?.search_view_id) ? action.search_view_id[0] : action.search_view_id,
4651
4652
  "search"
4652
4653
  ]
4653
- ],
4654
- model: String(action?.res_model)
4654
+ ];
4655
+ }, [action]);
4656
+ const view = useViewV2({
4657
+ context: viewContext,
4658
+ // cũng nên memo nếu thay đổi liên tục
4659
+ views: memoViews,
4660
+ model: action?.res_model ? String(action.res_model) : void 0
4655
4661
  });
4656
4662
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
4657
4663
  ReactContext.Provider,
@@ -4776,7 +4782,7 @@ var useGetSpecification = ({
4776
4782
 
4777
4783
  // src/hooks/core/use-list-data.ts
4778
4784
  var import_react14 = require("react");
4779
- var import_utils4 = require("@fctc/interface-logic/utils");
4785
+ var import_utils5 = require("@fctc/interface-logic/utils");
4780
4786
 
4781
4787
  // src/hooks/utils/use-click-outside.ts
4782
4788
  var import_react11 = require("react");
@@ -4918,12 +4924,12 @@ var useListData = ({
4918
4924
  if (!viewData || !action || !context) {
4919
4925
  return null;
4920
4926
  }
4921
- const domainParse = type === "calendar" ? getDateRange(currentDate, mode) : action?.domain ? Array.isArray(action?.domain) ? [...action?.domain] : (0, import_utils4.evalJSONDomain)(action?.domain, context) : [];
4927
+ const domainParse = type === "calendar" ? getDateRange(currentDate, mode) : action?.domain ? Array.isArray(action?.domain) ? [...action?.domain] : (0, import_utils5.evalJSONDomain)(action?.domain, context) : [];
4922
4928
  const limit = type === "calendar" ? 2500 : pageLimit;
4923
4929
  const offset = debouncedPage * pageLimit;
4924
4930
  const fields = type === "calendar" ? convertFieldsToArray(viewData?.views?.calendar?.fields) || [] : typeof groupByList === "object" ? groupByList?.fields : void 0;
4925
4931
  const groupby = typeof groupByList === "object" ? [groupByList?.contexts?.[0]?.group_by] : [];
4926
- const sort = order ? order : viewData?.views?.list?.default_order ? (0, import_utils4.formatSortingString)(viewData?.views?.list?.default_order) : "";
4932
+ const sort = order ? order : viewData?.views?.list?.default_order ? (0, import_utils5.formatSortingString)(viewData?.views?.list?.default_order) : "";
4927
4933
  return {
4928
4934
  model: action.res_model,
4929
4935
  specification,
@@ -4951,7 +4957,7 @@ var useListData = ({
4951
4957
  const list = useGetListData2(
4952
4958
  listDataProps,
4953
4959
  [listDataProps],
4954
- !!listDataProps && !!specification && !(0, import_utils4.isObjectEmpty)(specification)
4960
+ !!listDataProps && !!specification && !(0, import_utils5.isObjectEmpty)(specification)
4955
4961
  );
4956
4962
  return {
4957
4963
  ...list,
@@ -5458,18 +5464,18 @@ var many2oneFieldController = (props) => {
5458
5464
  // src/widget/basic/many2one-button-field/controller.ts
5459
5465
  var import_environment2 = require("@fctc/interface-logic/environment");
5460
5466
  var import_hooks6 = require("@fctc/interface-logic/hooks");
5461
- var import_utils7 = require("@fctc/interface-logic/utils");
5467
+ var import_utils8 = require("@fctc/interface-logic/utils");
5462
5468
  var many2oneButtonController = (props) => {
5463
5469
  const { domain, methods, relation, service, xNode } = props;
5464
5470
  const actionDataString = sessionStorage.getItem("actionData");
5465
5471
  const env = (0, import_environment2.getEnv)();
5466
- const domainObject = (0, import_utils7.evalJSONDomain)(domain, methods?.getValues() || {});
5472
+ const domainObject = (0, import_utils8.evalJSONDomain)(domain, methods?.getValues() || {});
5467
5473
  const actionData = actionDataString && actionDataString !== "undefined" ? JSON.parse(actionDataString) : {};
5468
5474
  const { data: dataOfSelection } = (0, import_hooks6.useGetSelection)({
5469
5475
  data: {
5470
5476
  model: relation ?? "",
5471
5477
  domain: domainObject,
5472
- context: { ...env.context, ...(0, import_utils7.evalJSONContext)(actionData?.context) }
5478
+ context: { ...env.context, ...(0, import_utils8.evalJSONContext)(actionData?.context) }
5473
5479
  },
5474
5480
  queryKey: [`data_${relation}`, domainObject],
5475
5481
  service,
@@ -5486,7 +5492,7 @@ var many2oneButtonController = (props) => {
5486
5492
 
5487
5493
  // src/widget/basic/many2many-field/controller.ts
5488
5494
  var import_react17 = require("react");
5489
- var import_utils8 = require("@fctc/interface-logic/utils");
5495
+ var import_utils9 = require("@fctc/interface-logic/utils");
5490
5496
  var many2manyFieldController = (props) => {
5491
5497
  const {
5492
5498
  relation,
@@ -5544,10 +5550,10 @@ var many2manyFieldController = (props) => {
5544
5550
  return null;
5545
5551
  }, [modelInstance]);
5546
5552
  const default_order = viewResponse && viewResponse?.views?.list?.default_order;
5547
- const optionsObject = tab?.options ? (0, import_utils8.evalJSONContext)(tab?.options) : (options ? (0, import_utils8.evalJSONContext)(options) : {}) || {};
5553
+ const optionsObject = tab?.options ? (0, import_utils9.evalJSONContext)(tab?.options) : (options ? (0, import_utils9.evalJSONContext)(options) : {}) || {};
5548
5554
  const fetchData = async () => {
5549
5555
  try {
5550
- const domainParse = typeof domain === "string" ? (0, import_utils8.evalJSONDomain)(domain, contextObject) : Array.isArray(domain) ? domain : [];
5556
+ const domainParse = typeof domain === "string" ? (0, import_utils9.evalJSONDomain)(domain, contextObject) : Array.isArray(domain) ? domain : [];
5551
5557
  setDomainMany2Many(domainParse);
5552
5558
  setPage(0);
5553
5559
  } catch (err) {
@@ -5571,7 +5577,7 @@ var many2manyFieldController = (props) => {
5571
5577
  context: contextObject,
5572
5578
  fields: groupByDomain?.fields,
5573
5579
  groupby: [groupByDomain?.contexts[0]?.group_by],
5574
- sort: order ? order : default_order ? (0, import_utils8.formatSortingString)(default_order) : ""
5580
+ sort: order ? order : default_order ? (0, import_utils9.formatSortingString)(default_order) : ""
5575
5581
  };
5576
5582
  const enabled = enabledCallAPI && !!specification && !!relation && !!domainMany2Many && !!viewResponse;
5577
5583
  const {
@@ -5635,7 +5641,7 @@ var many2manyFieldController = (props) => {
5635
5641
  // src/widget/basic/many2many-tags-field/controller.ts
5636
5642
  var import_react18 = require("react");
5637
5643
  var import_constants2 = require("@fctc/interface-logic/constants");
5638
- var import_utils9 = require("@fctc/interface-logic/utils");
5644
+ var import_utils10 = require("@fctc/interface-logic/utils");
5639
5645
  var many2manyTagsController = (props) => {
5640
5646
  const {
5641
5647
  relation,
@@ -5650,9 +5656,9 @@ var many2manyTagsController = (props) => {
5650
5656
  const isUser = relation === "res.users" || relation === "res.partner";
5651
5657
  const { env } = (0, provider_exports.useEnv)();
5652
5658
  const { useGetSelection: useGetSelection3 } = (0, provider_exports.useService)();
5653
- const addtionalFields = optionsFields ? (0, import_utils9.evalJSONContext)(optionsFields) : null;
5659
+ const addtionalFields = optionsFields ? (0, import_utils10.evalJSONContext)(optionsFields) : null;
5654
5660
  const domainObject = (0, import_react18.useMemo)(
5655
- () => (0, import_utils9.evalJSONDomain)(domain, JSON.parse(JSON.stringify(formValues || {}))),
5661
+ () => (0, import_utils10.evalJSONDomain)(domain, JSON.parse(JSON.stringify(formValues || {}))),
5656
5662
  [domain, formValues]
5657
5663
  );
5658
5664
  const data = {
@@ -5697,7 +5703,7 @@ var many2manyTagsController = (props) => {
5697
5703
 
5698
5704
  // src/widget/basic/status-bar-field/controller.ts
5699
5705
  var import_react19 = require("react");
5700
- var import_utils10 = require("@fctc/interface-logic/utils");
5706
+ var import_utils11 = require("@fctc/interface-logic/utils");
5701
5707
  var durationController = (props) => {
5702
5708
  const { relation, domain, formValues, name, id, model, onRefetch, enabled } = props;
5703
5709
  const specification = {
@@ -5713,7 +5719,7 @@ var durationController = (props) => {
5713
5719
  const listDataProps = {
5714
5720
  model: relation,
5715
5721
  specification,
5716
- domain: (0, import_utils10.evalJSONDomain)(domain, JSON.parse(JSON.stringify(formValues))),
5722
+ domain: (0, import_utils11.evalJSONDomain)(domain, JSON.parse(JSON.stringify(formValues))),
5717
5723
  limit: 10,
5718
5724
  offset: 0,
5719
5725
  fields: "",
@@ -5763,10 +5769,10 @@ var durationController = (props) => {
5763
5769
  };
5764
5770
 
5765
5771
  // src/widget/basic/priority-field/controller.ts
5766
- var import_utils11 = require("@fctc/interface-logic/utils");
5772
+ var import_utils12 = require("@fctc/interface-logic/utils");
5767
5773
  var priorityFieldController = (props) => {
5768
5774
  const { name, model, index, actionData, context, onChange, specification } = props;
5769
- const _context = { ...(0, import_utils11.evalJSONContext)(actionData?.context) };
5775
+ const _context = { ...(0, import_utils12.evalJSONContext)(actionData?.context) };
5770
5776
  const contextObject = { ...context, ..._context };
5771
5777
  const { useSave: useSave3 } = (0, provider_exports.useService)();
5772
5778
  const { mutateAsync: fetchSave } = useSave3();
@@ -6734,12 +6740,12 @@ var dateFieldController = (props) => {
6734
6740
 
6735
6741
  // src/widget/basic/copy-link-button/controller.ts
6736
6742
  var import_react21 = require("react");
6737
- var import_utils12 = require("@fctc/interface-logic/utils");
6743
+ var import_utils13 = require("@fctc/interface-logic/utils");
6738
6744
  var copyLinkButtonController = (props) => {
6739
6745
  const { value, defaultValue } = props;
6740
6746
  const [isCopied, setIsCopied] = (0, import_react21.useState)(false);
6741
6747
  const handleCopyToClipboard = async (value2) => {
6742
- await (0, import_utils12.copyTextToClipboard)(value2);
6748
+ await (0, import_utils13.copyTextToClipboard)(value2);
6743
6749
  setIsCopied(true);
6744
6750
  setTimeout(() => setIsCopied(false), 2e3);
6745
6751
  };
@@ -6752,12 +6758,12 @@ var copyLinkButtonController = (props) => {
6752
6758
  };
6753
6759
 
6754
6760
  // src/widget/basic/color-field/color-controller.ts
6755
- var import_utils13 = require("@fctc/interface-logic/utils");
6761
+ var import_utils14 = require("@fctc/interface-logic/utils");
6756
6762
  var colorFieldController = (props) => {
6757
6763
  const { value, isForm, name, formValues, idForm, model, actionData } = props;
6758
6764
  const { env } = (0, provider_exports.useEnv)();
6759
6765
  const { useSave: useSave3 } = (0, provider_exports.useService)();
6760
- const _context = { ...(0, import_utils13.evalJSONContext)(actionData?.context) || {} };
6766
+ const _context = { ...(0, import_utils14.evalJSONContext)(actionData?.context) || {} };
6761
6767
  const contextObject = { ...env.context, ..._context };
6762
6768
  const idDefault = isForm ? idForm : formValues?.id;
6763
6769
  const { mutate: onSave } = useSave3();
@@ -6786,7 +6792,7 @@ var colorFieldController = (props) => {
6786
6792
 
6787
6793
  // src/widget/basic/binary-field/controller.ts
6788
6794
  var import_react22 = require("react");
6789
- var import_utils14 = require("@fctc/interface-logic/utils");
6795
+ var import_utils15 = require("@fctc/interface-logic/utils");
6790
6796
  var binaryFieldController = (props) => {
6791
6797
  const { name, methods, readonly = false, value } = props;
6792
6798
  const inputId = (0, import_react22.useId)();
@@ -6843,11 +6849,11 @@ var binaryFieldController = (props) => {
6843
6849
  };
6844
6850
  const checkIsImageLink = (url) => {
6845
6851
  const imageExtensions = /\.(jpg|jpeg|png|gif|bmp|webp|svg|tiff|ico)$/i;
6846
- return imageExtensions.test(url) || (0, import_utils14.isBase64Image)(url) || isBlobUrl(url);
6852
+ return imageExtensions.test(url) || (0, import_utils15.isBase64Image)(url) || isBlobUrl(url);
6847
6853
  };
6848
6854
  const getImageBase64WithMimeType = (base64) => {
6849
6855
  if (typeof base64 !== "string" || base64.length < 10) return null;
6850
- if ((0, import_utils14.isBase64Image)(base64)) return base64;
6856
+ if ((0, import_utils15.isBase64Image)(base64)) return base64;
6851
6857
  let mimeType = null;
6852
6858
  if (base64.startsWith("iVBORw0KGgo")) mimeType = "image/png";
6853
6859
  else if (base64.startsWith("/9j/")) mimeType = "image/jpeg";
@@ -6950,7 +6956,7 @@ var tableHeadController = (props) => {
6950
6956
 
6951
6957
  // src/widget/advance/table/table-view/controller.ts
6952
6958
  var import_react24 = require("react");
6953
- var import_utils16 = require("@fctc/interface-logic/utils");
6959
+ var import_utils17 = require("@fctc/interface-logic/utils");
6954
6960
  var tableController = ({ data }) => {
6955
6961
  const [rows, setRows] = (0, import_react24.useState)(null);
6956
6962
  const [columns, setColumns] = (0, import_react24.useState)(null);
@@ -6988,7 +6994,7 @@ var tableController = ({ data }) => {
6988
6994
  let cols = [];
6989
6995
  try {
6990
6996
  cols = mergeFields?.filter((item) => {
6991
- return item?.widget !== "details_Receive_money" && !(item?.column_invisible ? import_utils16.domainHelper.matchDomains(data.context, item?.column_invisible) : item?.invisible ? import_utils16.domainHelper.matchDomains(data.context, item?.invisible) : false);
6997
+ return item?.widget !== "details_Receive_money" && !(item?.column_invisible ? import_utils17.domainHelper.matchDomains(data.context, item?.column_invisible) : item?.invisible ? import_utils17.domainHelper.matchDomains(data.context, item?.invisible) : false);
6992
6998
  })?.map((field) => {
6993
6999
  return {
6994
7000
  name: field?.name,
@@ -7172,7 +7178,7 @@ var tableGroupController = (props) => {
7172
7178
 
7173
7179
  // src/widget/advance/search/controller.ts
7174
7180
  var import_constants3 = require("@fctc/interface-logic/constants");
7175
- var import_utils18 = require("@fctc/interface-logic/utils");
7181
+ var import_utils19 = require("@fctc/interface-logic/utils");
7176
7182
  var import_moment2 = __toESM(require_moment());
7177
7183
  var import_react26 = require("react");
7178
7184
  var searchController = ({
@@ -7189,9 +7195,9 @@ var searchController = ({
7189
7195
  const [selectedTags, setSelectedTags] = (0, import_react26.useState)(null);
7190
7196
  const [searchString, setSearchString] = (0, import_react26.useState)("");
7191
7197
  const [searchMap, setSearchMap] = (0, import_react26.useState)({});
7192
- const actionContext = typeof context === "string" ? (0, import_utils18.evalJSONContext)(context) : context;
7198
+ const actionContext = typeof context === "string" ? (0, import_utils19.evalJSONContext)(context) : context;
7193
7199
  const contextSearch = { ...env.context, ...actionContext };
7194
- const domainAction = domain ? Array.isArray(domain) ? [...domain] : (0, import_utils18.evalJSONDomain)(domain, contextSearch) : [];
7200
+ const domainAction = domain ? Array.isArray(domain) ? [...domain] : (0, import_utils19.evalJSONDomain)(domain, contextSearch) : [];
7195
7201
  const clearSearch = () => {
7196
7202
  setFilterBy([]);
7197
7203
  setGroupBy([]);
@@ -7206,7 +7212,7 @@ var searchController = ({
7206
7212
  const dataModel = viewData?.models?.[model];
7207
7213
  const searchViews = viewData?.views?.search;
7208
7214
  const searchByItems = searchViews?.search_by?.filter(
7209
- (item) => !import_utils18.domainHelper.matchDomains(contextSearch, item.invisible)
7215
+ (item) => !import_utils19.domainHelper.matchDomains(contextSearch, item.invisible)
7210
7216
  )?.map(
7211
7217
  ({ string, name, filter_domain, operator, widget }, index) => ({
7212
7218
  dataIndex: index,
@@ -7219,10 +7225,10 @@ var searchController = ({
7219
7225
  })
7220
7226
  );
7221
7227
  const filterByItems = searchViews?.filter_by.filter((item) => {
7222
- return !import_utils18.domainHelper.matchDomains(contextSearch, item?.invisible);
7228
+ return !import_utils19.domainHelper.matchDomains(contextSearch, item?.invisible);
7223
7229
  })?.map((item) => ({ ...item, active: false }));
7224
7230
  const groupByItems = searchViews?.group_by.filter(
7225
- (item) => !import_utils18.domainHelper.matchDomains(contextSearch, item?.invisible)
7231
+ (item) => !import_utils19.domainHelper.matchDomains(contextSearch, item?.invisible)
7226
7232
  ).map((item) => ({
7227
7233
  ...item,
7228
7234
  string: item.string ?? viewData?.models?.[model]?.[item?.name?.split("group_by_")?.[1]]?.string
@@ -7299,14 +7305,14 @@ var searchController = ({
7299
7305
  }
7300
7306
  let valueDomainItem = value?.value;
7301
7307
  if (value?.modelType === "date") {
7302
- valueDomainItem = (0, import_utils18.validateAndParseDate)(value?.value);
7308
+ valueDomainItem = (0, import_utils19.validateAndParseDate)(value?.value);
7303
7309
  } else if (value?.modelType === "datetime") {
7304
7310
  if (value?.operator === "<=" || value?.operator === "<") {
7305
- const parsedDate = (0, import_utils18.validateAndParseDate)(value?.value, true);
7311
+ const parsedDate = (0, import_utils19.validateAndParseDate)(value?.value, true);
7306
7312
  const hasTime = (0, import_moment2.default)(value?.value).format("HH:mm:ss") !== "00:00:00";
7307
7313
  valueDomainItem = hasTime ? (0, import_moment2.default)(parsedDate).format("YYYY-MM-DD HH:mm:ss") : (0, import_moment2.default)(parsedDate).add(1, "day").subtract(1, "second").format("YYYY-MM-DD HH:mm:ss");
7308
7314
  } else {
7309
- valueDomainItem = (0, import_utils18.validateAndParseDate)(value?.value, true);
7315
+ valueDomainItem = (0, import_utils19.validateAndParseDate)(value?.value, true);
7310
7316
  }
7311
7317
  }
7312
7318
  const operator = value?.modelType === "date" || value?.modelType === "datetime" || value?.modelType === "boolean" || value?.modelType === "integer" ? value?.operator ?? "=" : value.operator ?? "ilike";
@@ -7385,7 +7391,7 @@ var searchController = ({
7385
7391
  }, [searchMap]);
7386
7392
  const handleAddTagSearch = (tag) => {
7387
7393
  const { domain: domain2, groupIndex, value, type, context: context2, dataIndex } = tag;
7388
- const domainFormat = new import_utils18.domainHelper.Domain(domain2);
7394
+ const domainFormat = new import_utils19.domainHelper.Domain(domain2);
7389
7395
  if (type === import_constants3.SearchType.FILTER) {
7390
7396
  addSearchItems(`${import_constants3.SearchType.FILTER}_${groupIndex}`, {
7391
7397
  ...tag,
package/dist/index.mjs CHANGED
@@ -59,7 +59,7 @@ var require_moment = __commonJS({
59
59
  function hasOwnProp(a, b) {
60
60
  return Object.prototype.hasOwnProperty.call(a, b);
61
61
  }
62
- function isObjectEmpty4(obj) {
62
+ function isObjectEmpty5(obj) {
63
63
  if (Object.getOwnPropertyNames) {
64
64
  return Object.getOwnPropertyNames(obj).length === 0;
65
65
  } else {
@@ -2198,7 +2198,7 @@ var require_moment = __commonJS({
2198
2198
  strict = locale2;
2199
2199
  locale2 = void 0;
2200
2200
  }
2201
- if (isObject(input) && isObjectEmpty4(input) || isArray(input) && input.length === 0) {
2201
+ if (isObject(input) && isObjectEmpty5(input) || isArray(input) && input.length === 0) {
2202
2202
  input = void 0;
2203
2203
  }
2204
2204
  c._isAMomentObject = true;
@@ -2617,7 +2617,7 @@ var require_moment = __commonJS({
2617
2617
  return isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === void 0;
2618
2618
  }
2619
2619
  function isMomentInputObject(input) {
2620
- var objectTest = isObject(input) && !isObjectEmpty4(input), propertyTest = false, properties = [
2620
+ var objectTest = isObject(input) && !isObjectEmpty5(input), propertyTest = false, properties = [
2621
2621
  "years",
2622
2622
  "year",
2623
2623
  "y",
@@ -2659,7 +2659,7 @@ var require_moment = __commonJS({
2659
2659
  return arrayTest && dataTypeTest;
2660
2660
  }
2661
2661
  function isCalendarSpec(input) {
2662
- var objectTest = isObject(input) && !isObjectEmpty4(input), propertyTest = false, properties = [
2662
+ var objectTest = isObject(input) && !isObjectEmpty5(input), propertyTest = false, properties = [
2663
2663
  "sameDay",
2664
2664
  "nextDay",
2665
2665
  "lastDay",
@@ -4609,16 +4609,17 @@ var useViewV2 = ({
4609
4609
  }) => {
4610
4610
  const { useGetView: useGetView2 } = (0, provider_exports.useService)();
4611
4611
  const viewParams = useMemo3(() => {
4612
+ if (!model || !views) return void 0;
4612
4613
  return {
4613
4614
  model,
4614
4615
  views,
4615
4616
  context,
4616
4617
  id
4617
4618
  };
4618
- }, [model]);
4619
+ }, [model, views, context, id]);
4619
4620
  const view = useGetView2(
4620
4621
  viewParams || {},
4621
- !!viewParams
4622
+ !!viewParams && !(0, utils_exports.isObjectEmpty)(viewParams)
4622
4623
  );
4623
4624
  return {
4624
4625
  ...view,
@@ -4715,18 +4716,23 @@ var AppProvider = ({
4715
4716
  { ...(0, utils_exports.evalJSONContext)(action?.context) }
4716
4717
  ]);
4717
4718
  }, [menuContext, action?.context, env?.context?.lang]);
4718
- const view = useViewV2({
4719
- context: viewContext,
4720
- views: [
4721
- ...Array.isArray(action?.views) ? action?.views.map(
4719
+ const memoViews = useMemo5(() => {
4720
+ if (!action) return [];
4721
+ return [
4722
+ ...Array.isArray(action?.views) ? action.views.map(
4722
4723
  (view2) => view2[1] === "list" ? [view2[0], "list"] : view2
4723
4724
  ) : [],
4724
4725
  [
4725
- Array.isArray(action?.search_view_id) ? action?.search_view_id[0] : action?.search_view_id,
4726
+ Array.isArray(action?.search_view_id) ? action.search_view_id[0] : action.search_view_id,
4726
4727
  "search"
4727
4728
  ]
4728
- ],
4729
- model: String(action?.res_model)
4729
+ ];
4730
+ }, [action]);
4731
+ const view = useViewV2({
4732
+ context: viewContext,
4733
+ // cũng nên memo nếu thay đổi liên tục
4734
+ views: memoViews,
4735
+ model: action?.res_model ? String(action.res_model) : void 0
4730
4736
  });
4731
4737
  return /* @__PURE__ */ jsx(
4732
4738
  ReactContext.Provider,
@@ -4854,7 +4860,7 @@ import { useMemo as useMemo7, useState as useState5 } from "react";
4854
4860
  import {
4855
4861
  evalJSONDomain,
4856
4862
  formatSortingString,
4857
- isObjectEmpty as isObjectEmpty3
4863
+ isObjectEmpty as isObjectEmpty4
4858
4864
  } from "@fctc/interface-logic/utils";
4859
4865
 
4860
4866
  // src/hooks/utils/use-click-outside.ts
@@ -5030,7 +5036,7 @@ var useListData = ({
5030
5036
  const list = useGetListData2(
5031
5037
  listDataProps,
5032
5038
  [listDataProps],
5033
- !!listDataProps && !!specification && !isObjectEmpty3(specification)
5039
+ !!listDataProps && !!specification && !isObjectEmpty4(specification)
5034
5040
  );
5035
5041
  return {
5036
5042
  ...list,
package/dist/widget.js CHANGED
@@ -55,7 +55,7 @@ var require_moment = __commonJS({
55
55
  function hasOwnProp(a, b) {
56
56
  return Object.prototype.hasOwnProperty.call(a, b);
57
57
  }
58
- function isObjectEmpty4(obj) {
58
+ function isObjectEmpty5(obj) {
59
59
  if (Object.getOwnPropertyNames) {
60
60
  return Object.getOwnPropertyNames(obj).length === 0;
61
61
  } else {
@@ -2194,7 +2194,7 @@ var require_moment = __commonJS({
2194
2194
  strict = locale2;
2195
2195
  locale2 = void 0;
2196
2196
  }
2197
- if (isObject(input) && isObjectEmpty4(input) || isArray(input) && input.length === 0) {
2197
+ if (isObject(input) && isObjectEmpty5(input) || isArray(input) && input.length === 0) {
2198
2198
  input = void 0;
2199
2199
  }
2200
2200
  c._isAMomentObject = true;
@@ -2613,7 +2613,7 @@ var require_moment = __commonJS({
2613
2613
  return isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === void 0;
2614
2614
  }
2615
2615
  function isMomentInputObject(input) {
2616
- var objectTest = isObject(input) && !isObjectEmpty4(input), propertyTest = false, properties = [
2616
+ var objectTest = isObject(input) && !isObjectEmpty5(input), propertyTest = false, properties = [
2617
2617
  "years",
2618
2618
  "year",
2619
2619
  "y",
@@ -2655,7 +2655,7 @@ var require_moment = __commonJS({
2655
2655
  return arrayTest && dataTypeTest;
2656
2656
  }
2657
2657
  function isCalendarSpec(input) {
2658
- var objectTest = isObject(input) && !isObjectEmpty4(input), propertyTest = false, properties = [
2658
+ var objectTest = isObject(input) && !isObjectEmpty5(input), propertyTest = false, properties = [
2659
2659
  "sameDay",
2660
2660
  "nextDay",
2661
2661
  "lastDay",
@@ -4344,7 +4344,7 @@ var import_react11 = require("react");
4344
4344
 
4345
4345
  // src/hooks/core/use-list-data.ts
4346
4346
  var import_react15 = require("react");
4347
- var import_utils4 = require("@fctc/interface-logic/utils");
4347
+ var import_utils5 = require("@fctc/interface-logic/utils");
4348
4348
 
4349
4349
  // src/hooks/utils/use-click-outside.ts
4350
4350
  var import_react12 = require("react");
@@ -4615,18 +4615,18 @@ var many2oneFieldController = (props) => {
4615
4615
  // src/widget/basic/many2one-button-field/controller.ts
4616
4616
  var import_environment2 = require("@fctc/interface-logic/environment");
4617
4617
  var import_hooks6 = require("@fctc/interface-logic/hooks");
4618
- var import_utils7 = require("@fctc/interface-logic/utils");
4618
+ var import_utils8 = require("@fctc/interface-logic/utils");
4619
4619
  var many2oneButtonController = (props) => {
4620
4620
  const { domain, methods, relation, service, xNode } = props;
4621
4621
  const actionDataString = sessionStorage.getItem("actionData");
4622
4622
  const env = (0, import_environment2.getEnv)();
4623
- const domainObject = (0, import_utils7.evalJSONDomain)(domain, methods?.getValues() || {});
4623
+ const domainObject = (0, import_utils8.evalJSONDomain)(domain, methods?.getValues() || {});
4624
4624
  const actionData = actionDataString && actionDataString !== "undefined" ? JSON.parse(actionDataString) : {};
4625
4625
  const { data: dataOfSelection } = (0, import_hooks6.useGetSelection)({
4626
4626
  data: {
4627
4627
  model: relation ?? "",
4628
4628
  domain: domainObject,
4629
- context: { ...env.context, ...(0, import_utils7.evalJSONContext)(actionData?.context) }
4629
+ context: { ...env.context, ...(0, import_utils8.evalJSONContext)(actionData?.context) }
4630
4630
  },
4631
4631
  queryKey: [`data_${relation}`, domainObject],
4632
4632
  service,
@@ -4643,7 +4643,7 @@ var many2oneButtonController = (props) => {
4643
4643
 
4644
4644
  // src/widget/basic/many2many-field/controller.ts
4645
4645
  var import_react17 = require("react");
4646
- var import_utils8 = require("@fctc/interface-logic/utils");
4646
+ var import_utils9 = require("@fctc/interface-logic/utils");
4647
4647
  var many2manyFieldController = (props) => {
4648
4648
  const {
4649
4649
  relation,
@@ -4701,10 +4701,10 @@ var many2manyFieldController = (props) => {
4701
4701
  return null;
4702
4702
  }, [modelInstance]);
4703
4703
  const default_order = viewResponse && viewResponse?.views?.list?.default_order;
4704
- const optionsObject = tab?.options ? (0, import_utils8.evalJSONContext)(tab?.options) : (options ? (0, import_utils8.evalJSONContext)(options) : {}) || {};
4704
+ const optionsObject = tab?.options ? (0, import_utils9.evalJSONContext)(tab?.options) : (options ? (0, import_utils9.evalJSONContext)(options) : {}) || {};
4705
4705
  const fetchData = async () => {
4706
4706
  try {
4707
- const domainParse = typeof domain === "string" ? (0, import_utils8.evalJSONDomain)(domain, contextObject) : Array.isArray(domain) ? domain : [];
4707
+ const domainParse = typeof domain === "string" ? (0, import_utils9.evalJSONDomain)(domain, contextObject) : Array.isArray(domain) ? domain : [];
4708
4708
  setDomainMany2Many(domainParse);
4709
4709
  setPage(0);
4710
4710
  } catch (err) {
@@ -4728,7 +4728,7 @@ var many2manyFieldController = (props) => {
4728
4728
  context: contextObject,
4729
4729
  fields: groupByDomain?.fields,
4730
4730
  groupby: [groupByDomain?.contexts[0]?.group_by],
4731
- sort: order ? order : default_order ? (0, import_utils8.formatSortingString)(default_order) : ""
4731
+ sort: order ? order : default_order ? (0, import_utils9.formatSortingString)(default_order) : ""
4732
4732
  };
4733
4733
  const enabled = enabledCallAPI && !!specification && !!relation && !!domainMany2Many && !!viewResponse;
4734
4734
  const {
@@ -4792,7 +4792,7 @@ var many2manyFieldController = (props) => {
4792
4792
  // src/widget/basic/many2many-tags-field/controller.ts
4793
4793
  var import_react18 = require("react");
4794
4794
  var import_constants2 = require("@fctc/interface-logic/constants");
4795
- var import_utils9 = require("@fctc/interface-logic/utils");
4795
+ var import_utils10 = require("@fctc/interface-logic/utils");
4796
4796
  var many2manyTagsController = (props) => {
4797
4797
  const {
4798
4798
  relation,
@@ -4807,9 +4807,9 @@ var many2manyTagsController = (props) => {
4807
4807
  const isUser = relation === "res.users" || relation === "res.partner";
4808
4808
  const { env } = (0, provider_exports.useEnv)();
4809
4809
  const { useGetSelection: useGetSelection3 } = (0, provider_exports.useService)();
4810
- const addtionalFields = optionsFields ? (0, import_utils9.evalJSONContext)(optionsFields) : null;
4810
+ const addtionalFields = optionsFields ? (0, import_utils10.evalJSONContext)(optionsFields) : null;
4811
4811
  const domainObject = (0, import_react18.useMemo)(
4812
- () => (0, import_utils9.evalJSONDomain)(domain, JSON.parse(JSON.stringify(formValues || {}))),
4812
+ () => (0, import_utils10.evalJSONDomain)(domain, JSON.parse(JSON.stringify(formValues || {}))),
4813
4813
  [domain, formValues]
4814
4814
  );
4815
4815
  const data = {
@@ -4854,7 +4854,7 @@ var many2manyTagsController = (props) => {
4854
4854
 
4855
4855
  // src/widget/basic/status-bar-field/controller.ts
4856
4856
  var import_react19 = require("react");
4857
- var import_utils10 = require("@fctc/interface-logic/utils");
4857
+ var import_utils11 = require("@fctc/interface-logic/utils");
4858
4858
  var durationController = (props) => {
4859
4859
  const { relation, domain, formValues, name, id, model, onRefetch, enabled } = props;
4860
4860
  const specification = {
@@ -4870,7 +4870,7 @@ var durationController = (props) => {
4870
4870
  const listDataProps = {
4871
4871
  model: relation,
4872
4872
  specification,
4873
- domain: (0, import_utils10.evalJSONDomain)(domain, JSON.parse(JSON.stringify(formValues))),
4873
+ domain: (0, import_utils11.evalJSONDomain)(domain, JSON.parse(JSON.stringify(formValues))),
4874
4874
  limit: 10,
4875
4875
  offset: 0,
4876
4876
  fields: "",
@@ -4920,10 +4920,10 @@ var durationController = (props) => {
4920
4920
  };
4921
4921
 
4922
4922
  // src/widget/basic/priority-field/controller.ts
4923
- var import_utils11 = require("@fctc/interface-logic/utils");
4923
+ var import_utils12 = require("@fctc/interface-logic/utils");
4924
4924
  var priorityFieldController = (props) => {
4925
4925
  const { name, model, index, actionData, context, onChange, specification } = props;
4926
- const _context = { ...(0, import_utils11.evalJSONContext)(actionData?.context) };
4926
+ const _context = { ...(0, import_utils12.evalJSONContext)(actionData?.context) };
4927
4927
  const contextObject = { ...context, ..._context };
4928
4928
  const { useSave: useSave3 } = (0, provider_exports.useService)();
4929
4929
  const { mutateAsync: fetchSave } = useSave3();
@@ -5891,12 +5891,12 @@ var dateFieldController = (props) => {
5891
5891
 
5892
5892
  // src/widget/basic/copy-link-button/controller.ts
5893
5893
  var import_react21 = require("react");
5894
- var import_utils12 = require("@fctc/interface-logic/utils");
5894
+ var import_utils13 = require("@fctc/interface-logic/utils");
5895
5895
  var copyLinkButtonController = (props) => {
5896
5896
  const { value, defaultValue } = props;
5897
5897
  const [isCopied, setIsCopied] = (0, import_react21.useState)(false);
5898
5898
  const handleCopyToClipboard = async (value2) => {
5899
- await (0, import_utils12.copyTextToClipboard)(value2);
5899
+ await (0, import_utils13.copyTextToClipboard)(value2);
5900
5900
  setIsCopied(true);
5901
5901
  setTimeout(() => setIsCopied(false), 2e3);
5902
5902
  };
@@ -5909,12 +5909,12 @@ var copyLinkButtonController = (props) => {
5909
5909
  };
5910
5910
 
5911
5911
  // src/widget/basic/color-field/color-controller.ts
5912
- var import_utils13 = require("@fctc/interface-logic/utils");
5912
+ var import_utils14 = require("@fctc/interface-logic/utils");
5913
5913
  var colorFieldController = (props) => {
5914
5914
  const { value, isForm, name, formValues, idForm, model, actionData } = props;
5915
5915
  const { env } = (0, provider_exports.useEnv)();
5916
5916
  const { useSave: useSave3 } = (0, provider_exports.useService)();
5917
- const _context = { ...(0, import_utils13.evalJSONContext)(actionData?.context) || {} };
5917
+ const _context = { ...(0, import_utils14.evalJSONContext)(actionData?.context) || {} };
5918
5918
  const contextObject = { ...env.context, ..._context };
5919
5919
  const idDefault = isForm ? idForm : formValues?.id;
5920
5920
  const { mutate: onSave } = useSave3();
@@ -5943,7 +5943,7 @@ var colorFieldController = (props) => {
5943
5943
 
5944
5944
  // src/widget/basic/binary-field/controller.ts
5945
5945
  var import_react22 = require("react");
5946
- var import_utils14 = require("@fctc/interface-logic/utils");
5946
+ var import_utils15 = require("@fctc/interface-logic/utils");
5947
5947
  var binaryFieldController = (props) => {
5948
5948
  const { name, methods, readonly = false, value } = props;
5949
5949
  const inputId = (0, import_react22.useId)();
@@ -6000,11 +6000,11 @@ var binaryFieldController = (props) => {
6000
6000
  };
6001
6001
  const checkIsImageLink = (url) => {
6002
6002
  const imageExtensions = /\.(jpg|jpeg|png|gif|bmp|webp|svg|tiff|ico)$/i;
6003
- return imageExtensions.test(url) || (0, import_utils14.isBase64Image)(url) || isBlobUrl(url);
6003
+ return imageExtensions.test(url) || (0, import_utils15.isBase64Image)(url) || isBlobUrl(url);
6004
6004
  };
6005
6005
  const getImageBase64WithMimeType = (base64) => {
6006
6006
  if (typeof base64 !== "string" || base64.length < 10) return null;
6007
- if ((0, import_utils14.isBase64Image)(base64)) return base64;
6007
+ if ((0, import_utils15.isBase64Image)(base64)) return base64;
6008
6008
  let mimeType = null;
6009
6009
  if (base64.startsWith("iVBORw0KGgo")) mimeType = "image/png";
6010
6010
  else if (base64.startsWith("/9j/")) mimeType = "image/jpeg";
@@ -6107,7 +6107,7 @@ var tableHeadController = (props) => {
6107
6107
 
6108
6108
  // src/widget/advance/table/table-view/controller.ts
6109
6109
  var import_react24 = require("react");
6110
- var import_utils16 = require("@fctc/interface-logic/utils");
6110
+ var import_utils17 = require("@fctc/interface-logic/utils");
6111
6111
  var tableController = ({ data }) => {
6112
6112
  const [rows, setRows] = (0, import_react24.useState)(null);
6113
6113
  const [columns, setColumns] = (0, import_react24.useState)(null);
@@ -6145,7 +6145,7 @@ var tableController = ({ data }) => {
6145
6145
  let cols = [];
6146
6146
  try {
6147
6147
  cols = mergeFields?.filter((item) => {
6148
- return item?.widget !== "details_Receive_money" && !(item?.column_invisible ? import_utils16.domainHelper.matchDomains(data.context, item?.column_invisible) : item?.invisible ? import_utils16.domainHelper.matchDomains(data.context, item?.invisible) : false);
6148
+ return item?.widget !== "details_Receive_money" && !(item?.column_invisible ? import_utils17.domainHelper.matchDomains(data.context, item?.column_invisible) : item?.invisible ? import_utils17.domainHelper.matchDomains(data.context, item?.invisible) : false);
6149
6149
  })?.map((field) => {
6150
6150
  return {
6151
6151
  name: field?.name,
@@ -6329,7 +6329,7 @@ var tableGroupController = (props) => {
6329
6329
 
6330
6330
  // src/widget/advance/search/controller.ts
6331
6331
  var import_constants3 = require("@fctc/interface-logic/constants");
6332
- var import_utils18 = require("@fctc/interface-logic/utils");
6332
+ var import_utils19 = require("@fctc/interface-logic/utils");
6333
6333
  var import_moment2 = __toESM(require_moment());
6334
6334
  var import_react26 = require("react");
6335
6335
  var searchController = ({
@@ -6346,9 +6346,9 @@ var searchController = ({
6346
6346
  const [selectedTags, setSelectedTags] = (0, import_react26.useState)(null);
6347
6347
  const [searchString, setSearchString] = (0, import_react26.useState)("");
6348
6348
  const [searchMap, setSearchMap] = (0, import_react26.useState)({});
6349
- const actionContext = typeof context === "string" ? (0, import_utils18.evalJSONContext)(context) : context;
6349
+ const actionContext = typeof context === "string" ? (0, import_utils19.evalJSONContext)(context) : context;
6350
6350
  const contextSearch = { ...env.context, ...actionContext };
6351
- const domainAction = domain ? Array.isArray(domain) ? [...domain] : (0, import_utils18.evalJSONDomain)(domain, contextSearch) : [];
6351
+ const domainAction = domain ? Array.isArray(domain) ? [...domain] : (0, import_utils19.evalJSONDomain)(domain, contextSearch) : [];
6352
6352
  const clearSearch = () => {
6353
6353
  setFilterBy([]);
6354
6354
  setGroupBy([]);
@@ -6363,7 +6363,7 @@ var searchController = ({
6363
6363
  const dataModel = viewData?.models?.[model];
6364
6364
  const searchViews = viewData?.views?.search;
6365
6365
  const searchByItems = searchViews?.search_by?.filter(
6366
- (item) => !import_utils18.domainHelper.matchDomains(contextSearch, item.invisible)
6366
+ (item) => !import_utils19.domainHelper.matchDomains(contextSearch, item.invisible)
6367
6367
  )?.map(
6368
6368
  ({ string, name, filter_domain, operator, widget }, index) => ({
6369
6369
  dataIndex: index,
@@ -6376,10 +6376,10 @@ var searchController = ({
6376
6376
  })
6377
6377
  );
6378
6378
  const filterByItems = searchViews?.filter_by.filter((item) => {
6379
- return !import_utils18.domainHelper.matchDomains(contextSearch, item?.invisible);
6379
+ return !import_utils19.domainHelper.matchDomains(contextSearch, item?.invisible);
6380
6380
  })?.map((item) => ({ ...item, active: false }));
6381
6381
  const groupByItems = searchViews?.group_by.filter(
6382
- (item) => !import_utils18.domainHelper.matchDomains(contextSearch, item?.invisible)
6382
+ (item) => !import_utils19.domainHelper.matchDomains(contextSearch, item?.invisible)
6383
6383
  ).map((item) => ({
6384
6384
  ...item,
6385
6385
  string: item.string ?? viewData?.models?.[model]?.[item?.name?.split("group_by_")?.[1]]?.string
@@ -6456,14 +6456,14 @@ var searchController = ({
6456
6456
  }
6457
6457
  let valueDomainItem = value?.value;
6458
6458
  if (value?.modelType === "date") {
6459
- valueDomainItem = (0, import_utils18.validateAndParseDate)(value?.value);
6459
+ valueDomainItem = (0, import_utils19.validateAndParseDate)(value?.value);
6460
6460
  } else if (value?.modelType === "datetime") {
6461
6461
  if (value?.operator === "<=" || value?.operator === "<") {
6462
- const parsedDate = (0, import_utils18.validateAndParseDate)(value?.value, true);
6462
+ const parsedDate = (0, import_utils19.validateAndParseDate)(value?.value, true);
6463
6463
  const hasTime = (0, import_moment2.default)(value?.value).format("HH:mm:ss") !== "00:00:00";
6464
6464
  valueDomainItem = hasTime ? (0, import_moment2.default)(parsedDate).format("YYYY-MM-DD HH:mm:ss") : (0, import_moment2.default)(parsedDate).add(1, "day").subtract(1, "second").format("YYYY-MM-DD HH:mm:ss");
6465
6465
  } else {
6466
- valueDomainItem = (0, import_utils18.validateAndParseDate)(value?.value, true);
6466
+ valueDomainItem = (0, import_utils19.validateAndParseDate)(value?.value, true);
6467
6467
  }
6468
6468
  }
6469
6469
  const operator = value?.modelType === "date" || value?.modelType === "datetime" || value?.modelType === "boolean" || value?.modelType === "integer" ? value?.operator ?? "=" : value.operator ?? "ilike";
@@ -6542,7 +6542,7 @@ var searchController = ({
6542
6542
  }, [searchMap]);
6543
6543
  const handleAddTagSearch = (tag) => {
6544
6544
  const { domain: domain2, groupIndex, value, type, context: context2, dataIndex } = tag;
6545
- const domainFormat = new import_utils18.domainHelper.Domain(domain2);
6545
+ const domainFormat = new import_utils19.domainHelper.Domain(domain2);
6546
6546
  if (type === import_constants3.SearchType.FILTER) {
6547
6547
  addSearchItems(`${import_constants3.SearchType.FILTER}_${groupIndex}`, {
6548
6548
  ...tag,
package/dist/widget.mjs CHANGED
@@ -59,7 +59,7 @@ var require_moment = __commonJS({
59
59
  function hasOwnProp(a, b) {
60
60
  return Object.prototype.hasOwnProperty.call(a, b);
61
61
  }
62
- function isObjectEmpty4(obj) {
62
+ function isObjectEmpty5(obj) {
63
63
  if (Object.getOwnPropertyNames) {
64
64
  return Object.getOwnPropertyNames(obj).length === 0;
65
65
  } else {
@@ -2198,7 +2198,7 @@ var require_moment = __commonJS({
2198
2198
  strict = locale2;
2199
2199
  locale2 = void 0;
2200
2200
  }
2201
- if (isObject(input) && isObjectEmpty4(input) || isArray(input) && input.length === 0) {
2201
+ if (isObject(input) && isObjectEmpty5(input) || isArray(input) && input.length === 0) {
2202
2202
  input = void 0;
2203
2203
  }
2204
2204
  c._isAMomentObject = true;
@@ -2617,7 +2617,7 @@ var require_moment = __commonJS({
2617
2617
  return isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === void 0;
2618
2618
  }
2619
2619
  function isMomentInputObject(input) {
2620
- var objectTest = isObject(input) && !isObjectEmpty4(input), propertyTest = false, properties = [
2620
+ var objectTest = isObject(input) && !isObjectEmpty5(input), propertyTest = false, properties = [
2621
2621
  "years",
2622
2622
  "year",
2623
2623
  "y",
@@ -2659,7 +2659,7 @@ var require_moment = __commonJS({
2659
2659
  return arrayTest && dataTypeTest;
2660
2660
  }
2661
2661
  function isCalendarSpec(input) {
2662
- var objectTest = isObject(input) && !isObjectEmpty4(input), propertyTest = false, properties = [
2662
+ var objectTest = isObject(input) && !isObjectEmpty5(input), propertyTest = false, properties = [
2663
2663
  "sameDay",
2664
2664
  "nextDay",
2665
2665
  "lastDay",
@@ -4400,7 +4400,7 @@ import { useMemo as useMemo7, useState as useState6 } from "react";
4400
4400
  import {
4401
4401
  evalJSONDomain,
4402
4402
  formatSortingString,
4403
- isObjectEmpty as isObjectEmpty3
4403
+ isObjectEmpty as isObjectEmpty4
4404
4404
  } from "@fctc/interface-logic/utils";
4405
4405
 
4406
4406
  // src/hooks/utils/use-click-outside.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fctc/widget-logic",
3
- "version": "2.5.6",
3
+ "version": "2.5.8",
4
4
  "types": "dist/index.d.ts",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",