@fctc/widget-logic 5.2.7 → 5.2.9

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/widget.js CHANGED
@@ -4042,6 +4042,7 @@ __export(widget_exports, {
4042
4042
  downLoadBinaryController: () => downLoadBinaryController,
4043
4043
  downloadFileController: () => downloadFileController,
4044
4044
  durationController: () => durationController,
4045
+ many2manyBinaryController: () => many2manyBinaryController,
4045
4046
  many2manyFieldController: () => many2manyFieldController,
4046
4047
  many2manyTagsController: () => many2manyTagsController,
4047
4048
  many2oneButtonController: () => many2oneButtonController,
@@ -4147,6 +4148,7 @@ var languages = [
4147
4148
  { id: "vi_VN", name: "VIE" },
4148
4149
  { id: "en_US", name: "ENG" }
4149
4150
  ];
4151
+ var isBlobUrl = (url) => url.startsWith("blob:");
4150
4152
 
4151
4153
  // src/utils/function.ts
4152
4154
  var import_react3 = require("react");
@@ -4375,11 +4377,14 @@ var useGetSpecification = ({
4375
4377
  viewData,
4376
4378
  fields
4377
4379
  }) => {
4378
- const baseModel = {
4379
- name: String(model),
4380
- view: viewData,
4381
- fields
4382
- };
4380
+ const baseModel = (0, import_react11.useMemo)(
4381
+ () => ({
4382
+ name: String(model),
4383
+ view: viewData,
4384
+ fields
4385
+ }),
4386
+ [model, viewData, fields]
4387
+ );
4383
4388
  const initModel = (0, import_hooks3.useModel)();
4384
4389
  const modelInstance = (0, import_react11.useMemo)(() => {
4385
4390
  if (viewData) {
@@ -5577,8 +5582,82 @@ var binaryFieldController = (props) => {
5577
5582
  };
5578
5583
  };
5579
5584
 
5580
- // src/widget/advance/table/table-head/controller.ts
5585
+ // src/widget/basic/many2many-binary-field/controller.tsx
5581
5586
  var import_react23 = require("react");
5587
+ var many2manyBinaryController = (props) => {
5588
+ const {
5589
+ name,
5590
+ methods,
5591
+ value,
5592
+ onChange: handleOnchange,
5593
+ service,
5594
+ xNode,
5595
+ path
5596
+ } = props;
5597
+ const inputId = (0, import_react23.useId)();
5598
+ const { useUploadFile: useUploadFile2 } = (0, provider_exports.useService)();
5599
+ const { mutateAsync } = useUploadFile2();
5600
+ const binaryRef = (0, import_react23.useRef)(null);
5601
+ const [initialFiles, setInitialFiles] = (0, import_react23.useState)(
5602
+ Array.isArray(value) ? value : value ? [value] : []
5603
+ );
5604
+ const checkIsImageLink = (url) => {
5605
+ const imageExtensions = /\.(jpg|jpeg|png|gif|bmp|webp|svg|tiff|ico)$/i;
5606
+ return imageExtensions.test(url) || (0, utils_exports.isBase64Image)(url) || isBlobUrl(url);
5607
+ };
5608
+ const sanitizeForBE = (list) => list.filter((x) => x?.datas && !isBlobUrl(x.datas)).map((x) => ({ name: x.name, datas: x.datas, mimetype: x.mimetype }));
5609
+ const handleFileChange = async (files, e, oldValues) => {
5610
+ try {
5611
+ const uploadedUrls = await Promise.all(
5612
+ files.map(async (f) => {
5613
+ const formData = new FormData();
5614
+ formData.append("file", f);
5615
+ const res = await mutateAsync({ formData, service, xNode, path });
5616
+ return res?.url;
5617
+ })
5618
+ );
5619
+ const uploadedItems = files.map((f, i) => ({
5620
+ name: f.name,
5621
+ datas: uploadedUrls[i] ?? "",
5622
+ mimetype: f.type
5623
+ }));
5624
+ const finalList = [...oldValues, ...uploadedItems];
5625
+ methods?.setValue(name, finalList, { shouldDirty: true });
5626
+ const payloadForBE = sanitizeForBE(finalList);
5627
+ handleOnchange && handleOnchange(name ?? "", payloadForBE);
5628
+ } catch (err) {
5629
+ console.error(err);
5630
+ } finally {
5631
+ e.target.value = "";
5632
+ }
5633
+ };
5634
+ const handleRemoveAt = (idx) => {
5635
+ const current = methods?.getValues(name) || [];
5636
+ const next = current.filter((_, i) => i !== idx);
5637
+ setInitialFiles((p) => p.filter((_, i) => i !== idx));
5638
+ methods?.setValue(name, next.length ? next : null, { shouldDirty: true });
5639
+ const payloadForBE = next.length ? sanitizeForBE(next) : null;
5640
+ handleOnchange && handleOnchange(name ?? "", payloadForBE);
5641
+ };
5642
+ const handleRemoveAll = () => {
5643
+ setInitialFiles([]);
5644
+ methods?.setValue(name, null, { shouldDirty: true });
5645
+ handleOnchange && handleOnchange(name ?? "", null);
5646
+ };
5647
+ return {
5648
+ inputId,
5649
+ initialFiles,
5650
+ binaryRef,
5651
+ handleFileChange,
5652
+ handleRemoveAt,
5653
+ handleRemoveAll,
5654
+ checkIsImageLink,
5655
+ setInitialFiles
5656
+ };
5657
+ };
5658
+
5659
+ // src/widget/advance/table/table-head/controller.ts
5660
+ var import_react24 = require("react");
5582
5661
  var tableHeadController = (props) => {
5583
5662
  const {
5584
5663
  typeTable,
@@ -5589,21 +5668,21 @@ var tableHeadController = (props) => {
5589
5668
  setSelectedRowKeys
5590
5669
  } = props;
5591
5670
  const { rowIds: recordIds } = useGetRowIds(tableRef);
5592
- const selectedRowKeysRef = (0, import_react23.useRef)(recordIds);
5671
+ const selectedRowKeysRef = (0, import_react24.useRef)(recordIds);
5593
5672
  const isGroupTable = typeTable === "group";
5594
- const recordsCheckedGroup = (0, import_react23.useMemo)(() => {
5673
+ const recordsCheckedGroup = (0, import_react24.useMemo)(() => {
5595
5674
  if (!rows || !groupByList) return 0;
5596
5675
  const groupBy = typeof groupByList === "object" ? groupByList?.contexts?.[0]?.group_by : void 0;
5597
5676
  return countSum(rows, groupBy);
5598
5677
  }, [rows, groupByList]);
5599
- const isAllGroupChecked = (0, import_react23.useMemo)(() => {
5678
+ const isAllGroupChecked = (0, import_react24.useMemo)(() => {
5600
5679
  if (!isGroupTable || !selectedRowKeys?.length) return false;
5601
5680
  const selectedLength = selectedRowKeys.filter((id) => id !== -1).length;
5602
5681
  const allRecordsSelected = recordIds.length === selectedRowKeys.length ? recordIds.length === selectedLength : false;
5603
5682
  const allGroupsSelected = recordsCheckedGroup === selectedRowKeys.length;
5604
5683
  return allGroupsSelected || allRecordsSelected;
5605
5684
  }, [isGroupTable, selectedRowKeys, recordIds, recordsCheckedGroup]);
5606
- const isAllNormalChecked = (0, import_react23.useMemo)(() => {
5685
+ const isAllNormalChecked = (0, import_react24.useMemo)(() => {
5607
5686
  if (isGroupTable || !selectedRowKeys?.length || !rows?.length) return false;
5608
5687
  return selectedRowKeys.length === rows.length && selectedRowKeys.every(
5609
5688
  (id) => rows.some((record) => record.id === id)
@@ -5644,23 +5723,23 @@ var tableHeadController = (props) => {
5644
5723
  };
5645
5724
 
5646
5725
  // src/widget/advance/table/table-view/controller.ts
5647
- var import_react24 = require("react");
5648
- var import_utils17 = require("@fctc/interface-logic/utils");
5726
+ var import_react25 = require("react");
5727
+ var import_utils18 = require("@fctc/interface-logic/utils");
5649
5728
  var tableController = ({ data }) => {
5650
- const [rows, setRows] = (0, import_react24.useState)([]);
5651
- const [columnVisibility, setColumnVisibility] = (0, import_react24.useState)({});
5652
- const dataModelFields = (0, import_react24.useMemo)(() => {
5729
+ const [rows, setRows] = (0, import_react25.useState)([]);
5730
+ const [columnVisibility, setColumnVisibility] = (0, import_react25.useState)({});
5731
+ const dataModelFields = (0, import_react25.useMemo)(() => {
5653
5732
  return data?.fields?.map((field) => ({
5654
5733
  ...data.dataModel?.[field?.name],
5655
5734
  ...field,
5656
5735
  string: field?.string || data.dataModel?.[field?.name]?.string
5657
5736
  })) ?? [];
5658
5737
  }, [data?.fields, data?.dataModel]);
5659
- const mergeFields = (0, import_react24.useMemo)(
5738
+ const mergeFields = (0, import_react25.useMemo)(
5660
5739
  () => mergeButtons(dataModelFields),
5661
5740
  [dataModelFields]
5662
5741
  );
5663
- const transformData = (0, import_react24.useCallback)(
5742
+ const transformData = (0, import_react25.useCallback)(
5664
5743
  (dataList) => {
5665
5744
  if (!dataList) return [];
5666
5745
  return dataList.map((item) => {
@@ -5682,16 +5761,16 @@ var tableController = ({ data }) => {
5682
5761
  },
5683
5762
  [data?.typeTable]
5684
5763
  );
5685
- (0, import_react24.useEffect)(() => {
5764
+ (0, import_react25.useEffect)(() => {
5686
5765
  setRows(transformData(data?.records));
5687
5766
  }, [data?.records, transformData]);
5688
- const columns = (0, import_react24.useMemo)(() => {
5767
+ const columns = (0, import_react25.useMemo)(() => {
5689
5768
  try {
5690
5769
  return mergeFields?.filter((item) => {
5691
- return item?.widget !== "details_Receive_money" && !(item?.column_invisible ? import_utils17.domainHelper.matchDomains(
5770
+ return item?.widget !== "details_Receive_money" && !(item?.column_invisible ? import_utils18.domainHelper.matchDomains(
5692
5771
  data.context,
5693
5772
  item?.column_invisible
5694
- ) : item?.invisible ? import_utils17.domainHelper.matchDomains(data.context, item?.invisible) : false);
5773
+ ) : item?.invisible ? import_utils18.domainHelper.matchDomains(data.context, item?.invisible) : false);
5695
5774
  })?.map((field) => {
5696
5775
  const overridden = columnVisibility[field?.name];
5697
5776
  return {
@@ -5706,7 +5785,7 @@ var tableController = ({ data }) => {
5706
5785
  return [];
5707
5786
  }
5708
5787
  }, [mergeFields, data?.context, columnVisibility]);
5709
- const onToggleColumnOptional = (0, import_react24.useCallback)((item) => {
5788
+ const onToggleColumnOptional = (0, import_react25.useCallback)((item) => {
5710
5789
  setColumnVisibility((prev) => ({
5711
5790
  ...prev,
5712
5791
  [item?.name]: item?.optional === "show" ? "hide" : "show"
@@ -5721,7 +5800,7 @@ var tableController = ({ data }) => {
5721
5800
  };
5722
5801
 
5723
5802
  // src/widget/advance/table/table-group/controller.ts
5724
- var import_react25 = require("react");
5803
+ var import_react26 = require("react");
5725
5804
  var import_store = require("@fctc/interface-logic/store");
5726
5805
  var tableGroupController = (props) => {
5727
5806
  const { env } = (0, provider_exports.useEnv)();
@@ -5738,15 +5817,15 @@ var tableGroupController = (props) => {
5738
5817
  groupByList,
5739
5818
  setSelectedRowKeys
5740
5819
  } = props;
5741
- const [pageGroup, setPageGroup] = (0, import_react25.useState)(0);
5820
+ const [pageGroup, setPageGroup] = (0, import_react26.useState)(0);
5742
5821
  const { selectedRowKeys } = (0, import_store.useAppSelector)(import_store.selectList);
5743
- const [isShowGroup, setIsShowGroup] = (0, import_react25.useState)(false);
5744
- const [colEmptyGroup, setColEmptyGroup] = (0, import_react25.useState)({
5822
+ const [isShowGroup, setIsShowGroup] = (0, import_react26.useState)(false);
5823
+ const [colEmptyGroup, setColEmptyGroup] = (0, import_react26.useState)({
5745
5824
  fromStart: 1,
5746
5825
  fromEnd: 1
5747
5826
  });
5748
5827
  const domain = row?.__domain;
5749
- const processedData = (0, import_react25.useMemo)(() => {
5828
+ const processedData = (0, import_react26.useMemo)(() => {
5750
5829
  const calculateColSpanEmpty = () => {
5751
5830
  const startIndex = columns.findIndex(
5752
5831
  (col) => col.field.type === "monetary" && typeof row[col.key] === "number" || col.field.aggregator === "sum"
@@ -5761,7 +5840,7 @@ var tableGroupController = (props) => {
5761
5840
  };
5762
5841
  return calculateColSpanEmpty();
5763
5842
  }, [columns, row]);
5764
- const shouldFetchData = (0, import_react25.useMemo)(() => {
5843
+ const shouldFetchData = (0, import_react26.useMemo)(() => {
5765
5844
  return !!isShowGroup;
5766
5845
  }, [isShowGroup]);
5767
5846
  const enabled = shouldFetchData && !!processedData;
@@ -5830,7 +5909,7 @@ var tableGroupController = (props) => {
5830
5909
  }
5831
5910
  toggleShowGroup();
5832
5911
  };
5833
- (0, import_react25.useEffect)(() => {
5912
+ (0, import_react26.useEffect)(() => {
5834
5913
  if (!isDataGroupFetched || !rowsGroup || !checkedAll || allIdsNull || typeTableGroup === "group") {
5835
5914
  return;
5836
5915
  }
@@ -5856,7 +5935,7 @@ var tableGroupController = (props) => {
5856
5935
 
5857
5936
  // src/widget/advance/search/controller.ts
5858
5937
  var import_moment2 = __toESM(require_moment());
5859
- var import_react26 = require("react");
5938
+ var import_react27 = require("react");
5860
5939
 
5861
5940
  // src/constants.ts
5862
5941
  var constants_exports = {};
@@ -5871,14 +5950,14 @@ var searchController = ({
5871
5950
  fieldsList
5872
5951
  }) => {
5873
5952
  const { env } = (0, provider_exports.useEnv)();
5874
- const [filterBy, setFilterBy] = (0, import_react26.useState)(null);
5875
- const [searchBy, setSearchBy] = (0, import_react26.useState)(null);
5876
- const [groupBy, setGroupBy] = (0, import_react26.useState)(null);
5877
- const [selectedTags, setSelectedTags] = (0, import_react26.useState)(null);
5878
- const [searchString, setSearchString] = (0, import_react26.useState)("");
5879
- const [searchMap, setSearchMap] = (0, import_react26.useState)({});
5880
- const [hoveredIndex, setHoveredIndex] = (0, import_react26.useState)(0);
5881
- const [hoveredIndexSearchList, setHoveredIndexSearchList] = (0, import_react26.useState)(0);
5953
+ const [filterBy, setFilterBy] = (0, import_react27.useState)(null);
5954
+ const [searchBy, setSearchBy] = (0, import_react27.useState)(null);
5955
+ const [groupBy, setGroupBy] = (0, import_react27.useState)(null);
5956
+ const [selectedTags, setSelectedTags] = (0, import_react27.useState)(null);
5957
+ const [searchString, setSearchString] = (0, import_react27.useState)("");
5958
+ const [searchMap, setSearchMap] = (0, import_react27.useState)({});
5959
+ const [hoveredIndex, setHoveredIndex] = (0, import_react27.useState)(0);
5960
+ const [hoveredIndexSearchList, setHoveredIndexSearchList] = (0, import_react27.useState)(0);
5882
5961
  const actionContext = typeof context === "string" ? (0, utils_exports.evalJSONContext)(context) : context;
5883
5962
  const contextSearch = { ...env.context, ...actionContext };
5884
5963
  const domainAction = domain ? Array.isArray(domain) ? [...domain] : (0, utils_exports.evalJSONDomain)(domain, contextSearch) : [];
@@ -5925,7 +6004,7 @@ var searchController = ({
5925
6004
  }
5926
6005
  }
5927
6006
  };
5928
- (0, import_react26.useEffect)(() => {
6007
+ (0, import_react27.useEffect)(() => {
5929
6008
  fetchData();
5930
6009
  }, [model, viewData]);
5931
6010
  const onChangeSearchInput = (search_string) => {
@@ -6007,7 +6086,7 @@ var searchController = ({
6007
6086
  return [...domain2];
6008
6087
  }
6009
6088
  };
6010
- const setTagSearch = (0, import_react26.useCallback)(
6089
+ const setTagSearch = (0, import_react27.useCallback)(
6011
6090
  (updatedMap) => {
6012
6091
  if (!updatedMap) return;
6013
6092
  const tagsSearch = Object.entries(updatedMap).map(
@@ -6070,7 +6149,7 @@ var searchController = ({
6070
6149
  },
6071
6150
  [searchMap]
6072
6151
  );
6073
- (0, import_react26.useEffect)(() => {
6152
+ (0, import_react27.useEffect)(() => {
6074
6153
  setTagSearch(searchMap);
6075
6154
  }, [searchMap]);
6076
6155
  const handleAddTagSearch = (tag) => {
@@ -6189,6 +6268,7 @@ var searchController = ({
6189
6268
  downLoadBinaryController,
6190
6269
  downloadFileController,
6191
6270
  durationController,
6271
+ many2manyBinaryController,
6192
6272
  many2manyFieldController,
6193
6273
  many2manyTagsController,
6194
6274
  many2oneButtonController,
package/dist/widget.mjs CHANGED
@@ -4214,6 +4214,7 @@ var languages = [
4214
4214
  { id: "vi_VN", name: "VIE" },
4215
4215
  { id: "en_US", name: "ENG" }
4216
4216
  ];
4217
+ var isBlobUrl = (url) => url.startsWith("blob:");
4217
4218
 
4218
4219
  // src/utils/function.ts
4219
4220
  import { useCallback as useCallback2, useEffect as useEffect2, useReducer } from "react";
@@ -4443,11 +4444,14 @@ var useGetSpecification = ({
4443
4444
  viewData,
4444
4445
  fields
4445
4446
  }) => {
4446
- const baseModel = {
4447
- name: String(model),
4448
- view: viewData,
4449
- fields
4450
- };
4447
+ const baseModel = useMemo5(
4448
+ () => ({
4449
+ name: String(model),
4450
+ view: viewData,
4451
+ fields
4452
+ }),
4453
+ [model, viewData, fields]
4454
+ );
4451
4455
  const initModel = useModel();
4452
4456
  const modelInstance = useMemo5(() => {
4453
4457
  if (viewData) {
@@ -5649,8 +5653,82 @@ var binaryFieldController = (props) => {
5649
5653
  };
5650
5654
  };
5651
5655
 
5656
+ // src/widget/basic/many2many-binary-field/controller.tsx
5657
+ import { useId as useId2, useRef as useRef4, useState as useState13 } from "react";
5658
+ var many2manyBinaryController = (props) => {
5659
+ const {
5660
+ name,
5661
+ methods,
5662
+ value,
5663
+ onChange: handleOnchange,
5664
+ service,
5665
+ xNode,
5666
+ path
5667
+ } = props;
5668
+ const inputId = useId2();
5669
+ const { useUploadFile: useUploadFile2 } = (0, provider_exports.useService)();
5670
+ const { mutateAsync } = useUploadFile2();
5671
+ const binaryRef = useRef4(null);
5672
+ const [initialFiles, setInitialFiles] = useState13(
5673
+ Array.isArray(value) ? value : value ? [value] : []
5674
+ );
5675
+ const checkIsImageLink = (url) => {
5676
+ const imageExtensions = /\.(jpg|jpeg|png|gif|bmp|webp|svg|tiff|ico)$/i;
5677
+ return imageExtensions.test(url) || (0, utils_exports.isBase64Image)(url) || isBlobUrl(url);
5678
+ };
5679
+ const sanitizeForBE = (list) => list.filter((x) => x?.datas && !isBlobUrl(x.datas)).map((x) => ({ name: x.name, datas: x.datas, mimetype: x.mimetype }));
5680
+ const handleFileChange = async (files, e, oldValues) => {
5681
+ try {
5682
+ const uploadedUrls = await Promise.all(
5683
+ files.map(async (f) => {
5684
+ const formData = new FormData();
5685
+ formData.append("file", f);
5686
+ const res = await mutateAsync({ formData, service, xNode, path });
5687
+ return res?.url;
5688
+ })
5689
+ );
5690
+ const uploadedItems = files.map((f, i) => ({
5691
+ name: f.name,
5692
+ datas: uploadedUrls[i] ?? "",
5693
+ mimetype: f.type
5694
+ }));
5695
+ const finalList = [...oldValues, ...uploadedItems];
5696
+ methods?.setValue(name, finalList, { shouldDirty: true });
5697
+ const payloadForBE = sanitizeForBE(finalList);
5698
+ handleOnchange && handleOnchange(name ?? "", payloadForBE);
5699
+ } catch (err) {
5700
+ console.error(err);
5701
+ } finally {
5702
+ e.target.value = "";
5703
+ }
5704
+ };
5705
+ const handleRemoveAt = (idx) => {
5706
+ const current = methods?.getValues(name) || [];
5707
+ const next = current.filter((_, i) => i !== idx);
5708
+ setInitialFiles((p) => p.filter((_, i) => i !== idx));
5709
+ methods?.setValue(name, next.length ? next : null, { shouldDirty: true });
5710
+ const payloadForBE = next.length ? sanitizeForBE(next) : null;
5711
+ handleOnchange && handleOnchange(name ?? "", payloadForBE);
5712
+ };
5713
+ const handleRemoveAll = () => {
5714
+ setInitialFiles([]);
5715
+ methods?.setValue(name, null, { shouldDirty: true });
5716
+ handleOnchange && handleOnchange(name ?? "", null);
5717
+ };
5718
+ return {
5719
+ inputId,
5720
+ initialFiles,
5721
+ binaryRef,
5722
+ handleFileChange,
5723
+ handleRemoveAt,
5724
+ handleRemoveAll,
5725
+ checkIsImageLink,
5726
+ setInitialFiles
5727
+ };
5728
+ };
5729
+
5652
5730
  // src/widget/advance/table/table-head/controller.ts
5653
- import { useMemo as useMemo10, useRef as useRef4 } from "react";
5731
+ import { useMemo as useMemo10, useRef as useRef5 } from "react";
5654
5732
  var tableHeadController = (props) => {
5655
5733
  const {
5656
5734
  typeTable,
@@ -5661,7 +5739,7 @@ var tableHeadController = (props) => {
5661
5739
  setSelectedRowKeys
5662
5740
  } = props;
5663
5741
  const { rowIds: recordIds } = useGetRowIds(tableRef);
5664
- const selectedRowKeysRef = useRef4(recordIds);
5742
+ const selectedRowKeysRef = useRef5(recordIds);
5665
5743
  const isGroupTable = typeTable === "group";
5666
5744
  const recordsCheckedGroup = useMemo10(() => {
5667
5745
  if (!rows || !groupByList) return 0;
@@ -5716,11 +5794,11 @@ var tableHeadController = (props) => {
5716
5794
  };
5717
5795
 
5718
5796
  // src/widget/advance/table/table-view/controller.ts
5719
- import { useCallback as useCallback6, useEffect as useEffect14, useMemo as useMemo11, useState as useState13 } from "react";
5797
+ import { useCallback as useCallback6, useEffect as useEffect14, useMemo as useMemo11, useState as useState14 } from "react";
5720
5798
  import { domainHelper } from "@fctc/interface-logic/utils";
5721
5799
  var tableController = ({ data }) => {
5722
- const [rows, setRows] = useState13([]);
5723
- const [columnVisibility, setColumnVisibility] = useState13({});
5800
+ const [rows, setRows] = useState14([]);
5801
+ const [columnVisibility, setColumnVisibility] = useState14({});
5724
5802
  const dataModelFields = useMemo11(() => {
5725
5803
  return data?.fields?.map((field) => ({
5726
5804
  ...data.dataModel?.[field?.name],
@@ -5793,7 +5871,7 @@ var tableController = ({ data }) => {
5793
5871
  };
5794
5872
 
5795
5873
  // src/widget/advance/table/table-group/controller.ts
5796
- import { useEffect as useEffect15, useMemo as useMemo12, useState as useState14 } from "react";
5874
+ import { useEffect as useEffect15, useMemo as useMemo12, useState as useState15 } from "react";
5797
5875
  import { useAppSelector, selectList } from "@fctc/interface-logic/store";
5798
5876
  var tableGroupController = (props) => {
5799
5877
  const { env } = (0, provider_exports.useEnv)();
@@ -5810,10 +5888,10 @@ var tableGroupController = (props) => {
5810
5888
  groupByList,
5811
5889
  setSelectedRowKeys
5812
5890
  } = props;
5813
- const [pageGroup, setPageGroup] = useState14(0);
5891
+ const [pageGroup, setPageGroup] = useState15(0);
5814
5892
  const { selectedRowKeys } = useAppSelector(selectList);
5815
- const [isShowGroup, setIsShowGroup] = useState14(false);
5816
- const [colEmptyGroup, setColEmptyGroup] = useState14({
5893
+ const [isShowGroup, setIsShowGroup] = useState15(false);
5894
+ const [colEmptyGroup, setColEmptyGroup] = useState15({
5817
5895
  fromStart: 1,
5818
5896
  fromEnd: 1
5819
5897
  });
@@ -5928,7 +6006,7 @@ var tableGroupController = (props) => {
5928
6006
 
5929
6007
  // src/widget/advance/search/controller.ts
5930
6008
  var import_moment2 = __toESM(require_moment());
5931
- import { useCallback as useCallback7, useEffect as useEffect16, useState as useState15 } from "react";
6009
+ import { useCallback as useCallback7, useEffect as useEffect16, useState as useState16 } from "react";
5932
6010
 
5933
6011
  // src/constants.ts
5934
6012
  var constants_exports = {};
@@ -5944,14 +6022,14 @@ var searchController = ({
5944
6022
  fieldsList
5945
6023
  }) => {
5946
6024
  const { env } = (0, provider_exports.useEnv)();
5947
- const [filterBy, setFilterBy] = useState15(null);
5948
- const [searchBy, setSearchBy] = useState15(null);
5949
- const [groupBy, setGroupBy] = useState15(null);
5950
- const [selectedTags, setSelectedTags] = useState15(null);
5951
- const [searchString, setSearchString] = useState15("");
5952
- const [searchMap, setSearchMap] = useState15({});
5953
- const [hoveredIndex, setHoveredIndex] = useState15(0);
5954
- const [hoveredIndexSearchList, setHoveredIndexSearchList] = useState15(0);
6025
+ const [filterBy, setFilterBy] = useState16(null);
6026
+ const [searchBy, setSearchBy] = useState16(null);
6027
+ const [groupBy, setGroupBy] = useState16(null);
6028
+ const [selectedTags, setSelectedTags] = useState16(null);
6029
+ const [searchString, setSearchString] = useState16("");
6030
+ const [searchMap, setSearchMap] = useState16({});
6031
+ const [hoveredIndex, setHoveredIndex] = useState16(0);
6032
+ const [hoveredIndexSearchList, setHoveredIndexSearchList] = useState16(0);
5955
6033
  const actionContext = typeof context === "string" ? (0, utils_exports.evalJSONContext)(context) : context;
5956
6034
  const contextSearch = { ...env.context, ...actionContext };
5957
6035
  const domainAction = domain ? Array.isArray(domain) ? [...domain] : (0, utils_exports.evalJSONDomain)(domain, contextSearch) : [];
@@ -6261,6 +6339,7 @@ export {
6261
6339
  downLoadBinaryController,
6262
6340
  downloadFileController,
6263
6341
  durationController,
6342
+ many2manyBinaryController,
6264
6343
  many2manyFieldController,
6265
6344
  many2manyTagsController,
6266
6345
  many2oneButtonController,