@fctc/widget-logic 2.0.8 → 2.0.10

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/index.mjs CHANGED
@@ -4072,7 +4072,6 @@ __export(index_exports, {
4072
4072
  searchController: () => searchController,
4073
4073
  setStorageItemAsync: () => setStorageItemAsync,
4074
4074
  statusDropdownController: () => statusDropdownController,
4075
- tableBodyController: () => tableBodyController,
4076
4075
  tableController: () => tableController,
4077
4076
  tableGroupController: () => tableGroupController,
4078
4077
  tableHeadController: () => tableHeadController,
@@ -4086,6 +4085,7 @@ __export(index_exports, {
4086
4085
  useGetRowIds: () => useGetRowIds,
4087
4086
  useListData: () => useListData,
4088
4087
  useMenu: () => useMenu,
4088
+ useMenuItem: () => useMenuItem,
4089
4089
  useProfile: () => useProfile,
4090
4090
  useSelectionState: () => useSelectionState,
4091
4091
  useStorageState: () => useStorageState,
@@ -4106,6 +4106,7 @@ __export(hooks_exports, {
4106
4106
  useDetail: () => useDetail,
4107
4107
  useListData: () => useListData,
4108
4108
  useMenu: () => useMenu,
4109
+ useMenuItem: () => useMenuItem,
4109
4110
  useProfile: () => useProfile,
4110
4111
  useUser: () => useUser,
4111
4112
  useViewV2: () => useViewV2
@@ -4888,6 +4889,68 @@ var useAppProvider = () => {
4888
4889
  return context;
4889
4890
  };
4890
4891
 
4892
+ // src/hooks/core/use-menu-item.tsx
4893
+ import { getEnv as getEnv5 } from "@fctc/interface-logic/environment";
4894
+ import { useGetActionDetail } from "@fctc/interface-logic/hooks";
4895
+ import { useState as useState5 } from "react";
4896
+
4897
+ // src/utils.ts
4898
+ var utils_exports = {};
4899
+ __export(utils_exports, {
4900
+ API_APP_URL: () => API_APP_URL,
4901
+ API_PRESCHOOL_URL: () => API_PRESCHOOL_URL,
4902
+ STORAGES: () => STORAGES,
4903
+ combineContexts: () => combineContexts,
4904
+ convertFieldsToArray: () => convertFieldsToArray,
4905
+ countSum: () => countSum,
4906
+ getDateRange: () => getDateRange,
4907
+ languages: () => languages,
4908
+ mergeButtons: () => mergeButtons,
4909
+ setStorageItemAsync: () => setStorageItemAsync,
4910
+ useGetRowIds: () => useGetRowIds,
4911
+ useSelectionState: () => useSelectionState,
4912
+ useStorageState: () => useStorageState
4913
+ });
4914
+ __reExport(utils_exports, utils_star);
4915
+ import * as utils_star from "@fctc/interface-logic/utils";
4916
+
4917
+ // src/hooks/core/use-menu-item.tsx
4918
+ var useMenuItem = (props) => {
4919
+ const { menu, activeMenuId } = props;
4920
+ const model = menu?.action?.res_model;
4921
+ const aid = menu?.action?.id?.id;
4922
+ const id = menu?.id;
4923
+ const context = getEnv5().context;
4924
+ const queryActionDetail = useGetActionDetail({
4925
+ aid,
4926
+ id,
4927
+ model,
4928
+ context,
4929
+ enabled: true,
4930
+ queryKey: [`action-${aid}`]
4931
+ }).data;
4932
+ const [path, setPath] = useState5("");
4933
+ const handleClick = () => {
4934
+ if (location?.pathname === "/list/menu" && activeMenuId === menu?.id) {
4935
+ return;
4936
+ }
4937
+ const hasListView = queryActionDetail.views.some(
4938
+ ([id2, type]) => type === "list"
4939
+ );
4940
+ const viewType = hasListView ? "list" : "form";
4941
+ const isAccountPayment = menu?.action?.res_model === "account.payment" && menu?.action?.id?.id === 1551;
4942
+ const isConvertCurrencyMenu = menu?.action?.res_model === "currency.convert" && menu?.action?.id?.id === 1562;
4943
+ const path2 = (0, utils_exports.formatUrlPath)({
4944
+ viewType,
4945
+ actionPath: isConvertCurrencyMenu ? "menu" : isAccountPayment ? "menu" : menu?.action?.path || "menu",
4946
+ aid: menu?.action?.id?.id,
4947
+ model: queryActionDetail.res_model
4948
+ });
4949
+ setPath(path2);
4950
+ };
4951
+ return { handleClick, path, queryActionDetail };
4952
+ };
4953
+
4891
4954
  // src/hooks/utils/use-click-outside.ts
4892
4955
  import { useEffect as useEffect7, useRef as useRef2 } from "react";
4893
4956
  var DEFAULT_EVENTS = ["mousedown", "touchstart"];
@@ -4920,9 +4983,9 @@ var useClickOutside = ({
4920
4983
  };
4921
4984
 
4922
4985
  // src/hooks/utils/use-debounce.ts
4923
- import { useEffect as useEffect8, useState as useState5 } from "react";
4986
+ import { useEffect as useEffect8, useState as useState6 } from "react";
4924
4987
  function useDebounce(value, delay) {
4925
- const [debouncedValue, setDebouncedValue] = useState5(value);
4988
+ const [debouncedValue, setDebouncedValue] = useState6(value);
4926
4989
  useEffect8(() => {
4927
4990
  const handler = setTimeout(() => {
4928
4991
  setDebouncedValue(value);
@@ -5180,18 +5243,18 @@ var ChevronBottomIcon = ({
5180
5243
  };
5181
5244
 
5182
5245
  // src/widget/basic/status-dropdown-field/controller.ts
5183
- import { useEffect as useEffect9, useRef as useRef3, useState as useState6 } from "react";
5184
- import { getEnv as getEnv5 } from "@fctc/interface-logic/environment";
5246
+ import { useEffect as useEffect9, useRef as useRef3, useState as useState7 } from "react";
5247
+ import { getEnv as getEnv6 } from "@fctc/interface-logic/environment";
5185
5248
  import { useSave } from "@fctc/interface-logic/hooks";
5186
5249
  var statusDropdownController = (props) => {
5187
5250
  const { selection, isForm, id, model, name, state, onRefetch } = props;
5188
- const env = getEnv5();
5251
+ const env = getEnv6();
5189
5252
  const colors = {
5190
5253
  normal: "bg-[#e9ecef]",
5191
5254
  done: "bg-primary",
5192
5255
  blocked: "bg-red-500"
5193
5256
  };
5194
- const [isOpen, setIsOpen] = useState6(false);
5257
+ const [isOpen, setIsOpen] = useState7(false);
5195
5258
  const buttonRef = useRef3(null);
5196
5259
  useEffect9(() => {
5197
5260
  const handleClickOutside = (event) => {
@@ -5234,27 +5297,7 @@ var statusDropdownController = (props) => {
5234
5297
  };
5235
5298
 
5236
5299
  // src/widget/basic/many2one-field/controller.ts
5237
- import { useCallback as useCallback2, useEffect as useEffect10, useMemo as useMemo9, useState as useState7 } from "react";
5238
-
5239
- // src/utils.ts
5240
- var utils_exports = {};
5241
- __export(utils_exports, {
5242
- API_APP_URL: () => API_APP_URL,
5243
- API_PRESCHOOL_URL: () => API_PRESCHOOL_URL,
5244
- STORAGES: () => STORAGES,
5245
- combineContexts: () => combineContexts,
5246
- convertFieldsToArray: () => convertFieldsToArray,
5247
- countSum: () => countSum,
5248
- getDateRange: () => getDateRange,
5249
- languages: () => languages,
5250
- mergeButtons: () => mergeButtons,
5251
- setStorageItemAsync: () => setStorageItemAsync,
5252
- useGetRowIds: () => useGetRowIds,
5253
- useSelectionState: () => useSelectionState,
5254
- useStorageState: () => useStorageState
5255
- });
5256
- __reExport(utils_exports, utils_star2);
5257
- import * as utils_star2 from "@fctc/interface-logic/utils";
5300
+ import { useCallback as useCallback2, useEffect as useEffect10, useMemo as useMemo9, useState as useState8 } from "react";
5258
5301
 
5259
5302
  // src/provider.ts
5260
5303
  var provider_exports = {};
@@ -5276,22 +5319,22 @@ var many2oneFieldController = (props) => {
5276
5319
  options: fieldOptions,
5277
5320
  showDetail
5278
5321
  } = props;
5279
- const [options, setOptions] = useState7([]);
5280
- const [inputValue, setInputValue] = useState7("");
5322
+ const { env } = (0, provider_exports.useEnv)();
5323
+ const [options, setOptions] = useState8([]);
5324
+ const [inputValue, setInputValue] = useState8("");
5281
5325
  const [debouncedInputValue] = useDebounce(inputValue, 1e3);
5282
- const [isShowModalMany2Many, setIsShowModalMany2Many] = useState7(false);
5283
- const [tempSelectedOption, setTempSelectedOption] = useState7(null);
5284
- const [domainModal, setDomainModal] = useState7(null);
5285
- const [domainObject, setDomainObject] = useState7(null);
5326
+ const [isShowModalMany2Many, setIsShowModalMany2Many] = useState8(false);
5327
+ const [tempSelectedOption, setTempSelectedOption] = useState8(null);
5328
+ const [domainModal, setDomainModal] = useState8(null);
5329
+ const [domainObject, setDomainObject] = useState8(null);
5286
5330
  const actionData = sessionStorageUtils.getActionData();
5287
5331
  const { menuList } = (0, store_exports.useAppSelector)(store_exports.selectNavbar);
5288
- const { context } = (0, store_exports.useAppSelector)(store_exports.selectEnv);
5289
5332
  const initValue = methods?.getValues(name);
5290
5333
  const optionsObject = (0, utils_exports.evalJSONContext)(fieldOptions) || {};
5291
5334
  const contextObject = {
5292
5335
  ...(0, utils_exports.evalJSONContext)(actionData?.context) || {},
5293
5336
  ...fieldContext,
5294
- ...context
5337
+ ...env?.context
5295
5338
  };
5296
5339
  const { useGetSelection: useGetSelection2 } = (0, provider_exports.useService)();
5297
5340
  const data = {
@@ -5435,13 +5478,13 @@ var many2oneFieldController = (props) => {
5435
5478
  };
5436
5479
 
5437
5480
  // src/widget/basic/many2one-button-field/controller.ts
5438
- import { getEnv as getEnv6 } from "@fctc/interface-logic/environment";
5481
+ import { getEnv as getEnv7 } from "@fctc/interface-logic/environment";
5439
5482
  import { useGetSelection } from "@fctc/interface-logic/hooks";
5440
5483
  import { evalJSONDomain as evalJSONDomain3, evalJSONContext as evalJSONContext3 } from "@fctc/interface-logic/utils";
5441
5484
  var many2oneButtonController = (props) => {
5442
5485
  const { domain, methods, relation } = props;
5443
5486
  const actionDataString = sessionStorage.getItem("actionData");
5444
- const env = getEnv6();
5487
+ const env = getEnv7();
5445
5488
  const domainObject = evalJSONDomain3(domain, methods?.getValues() || {});
5446
5489
  const actionData = actionDataString && actionDataString !== "undefined" ? JSON.parse(actionDataString) : {};
5447
5490
  const { data: dataOfSelection } = useGetSelection({
@@ -5462,16 +5505,10 @@ var many2oneButtonController = (props) => {
5462
5505
  };
5463
5506
 
5464
5507
  // src/widget/basic/many2many-field/controller.ts
5465
- import { useEffect as useEffect11, useMemo as useMemo10, useState as useState8 } from "react";
5466
- import {
5467
- useAppDispatch as useAppDispatch5,
5468
- setFirstDomain,
5469
- setViewDataStore,
5470
- setPage,
5471
- setGroupByDomain
5472
- } from "@fctc/interface-logic/store";
5508
+ import { useEffect as useEffect11, useMemo as useMemo10, useState as useState9 } from "react";
5473
5509
  import {
5474
5510
  evalJSONContext as evalJSONContext4,
5511
+ evalJSONDomain as evalJSONDomain4,
5475
5512
  formatSortingString as formatSortingString2
5476
5513
  } from "@fctc/interface-logic/utils";
5477
5514
  var many2manyFieldController = (props) => {
@@ -5479,45 +5516,43 @@ var many2manyFieldController = (props) => {
5479
5516
  relation,
5480
5517
  domain,
5481
5518
  context,
5519
+ options,
5482
5520
  tab,
5483
- model,
5484
- aid,
5485
- setSelectedRowKeys: setSelectedRowKeys4,
5486
- fields,
5487
- setFields,
5521
+ setSelectedRowKeys: setSelectedRowKeys3,
5488
5522
  groupByDomain,
5489
- page,
5490
- options,
5491
- sessionStorageUtils
5523
+ enabled: enabledCallAPI,
5524
+ actionData
5492
5525
  } = props;
5493
- const appDispatch = useAppDispatch5();
5494
- const actionData = sessionStorageUtils.getActionData();
5495
- const [debouncedPage] = useDebounce(page, 500);
5496
- const [order, setOrder] = useState8();
5497
- const [isLoadedData, setIsLoadedData] = useState8(false);
5498
- const [domainMany2Many, setDomainMany2Many] = useState8(domain);
5499
5526
  const { env } = (0, provider_exports.useEnv)();
5500
5527
  const { useGetView: useGetView2, useGetListData: useGetListData3, useGetFormView } = (0, provider_exports.useService)();
5528
+ const [order, setOrder] = useState9();
5529
+ const [page, setPage] = useState9(0);
5530
+ const [domainMany2Many, setDomainMany2Many] = useState9(null);
5531
+ const [debouncedPage] = useDebounce(page, 500);
5532
+ const contextObject = {
5533
+ ...env.context,
5534
+ ...context || {}
5535
+ };
5501
5536
  const viewParams = {
5502
5537
  model: relation,
5503
5538
  views: [
5504
5539
  [false, "list"],
5505
5540
  [false, "search"]
5506
5541
  ],
5507
- context
5542
+ context: contextObject
5508
5543
  };
5509
- const { data: viewResponse } = useGetView2(viewParams, actionData);
5544
+ const { data: viewResponse } = useGetView2(viewParams, enabledCallAPI);
5510
5545
  const baseModel = useMemo10(
5511
5546
  () => ({
5512
5547
  name: String(relation),
5513
5548
  view: viewResponse || {},
5514
- actContext: context,
5549
+ actContext: contextObject,
5515
5550
  fields: [
5516
5551
  ...Object.values(viewResponse?.views?.list?.fields ?? {}),
5517
5552
  ...tab?.fields ? tab.fields : []
5518
5553
  ]
5519
5554
  }),
5520
- [model, viewResponse]
5555
+ [relation, viewResponse]
5521
5556
  );
5522
5557
  const initModel = (0, hooks_exports.useModel)();
5523
5558
  const modelInstance = useMemo10(() => {
@@ -5536,26 +5571,15 @@ var many2manyFieldController = (props) => {
5536
5571
  const optionsObject = tab?.options ? evalJSONContext4(tab?.options) : (options ? evalJSONContext4(options) : {}) || {};
5537
5572
  const fetchData = async () => {
5538
5573
  try {
5539
- setDomainMany2Many(domain);
5540
- appDispatch(setFirstDomain(domain));
5541
- appDispatch(setViewDataStore(viewResponse));
5542
- const modalData = viewResponse?.views?.list?.fields.map((field) => ({
5543
- ...viewResponse?.models?.[String(model)]?.[field?.name],
5544
- ...field
5545
- }));
5546
- if (!fields?.[`${aid}_${relation}_popupmany2many`] && modalData) {
5547
- setFields({
5548
- ...fields,
5549
- [`${aid}_${relation}_popupmany2many`]: modalData
5550
- });
5551
- }
5552
- appDispatch(setPage(0));
5574
+ const domainParse = typeof domain === "string" ? evalJSONDomain4(domain, contextObject) : Array.isArray(domain) ? domain : [];
5575
+ setDomainMany2Many(domainParse);
5576
+ setPage(0);
5553
5577
  } catch (err) {
5554
5578
  console.log(err);
5555
5579
  }
5556
5580
  };
5557
5581
  const queryKey = [
5558
- `view-${relation}-${aid}`,
5582
+ `view-${relation}`,
5559
5583
  specification,
5560
5584
  domainMany2Many,
5561
5585
  debouncedPage,
@@ -5568,16 +5592,16 @@ var many2manyFieldController = (props) => {
5568
5592
  domain: domainMany2Many,
5569
5593
  offset: debouncedPage * 10,
5570
5594
  limit: 10,
5571
- context,
5595
+ context: contextObject,
5572
5596
  fields: groupByDomain?.fields,
5573
5597
  groupby: [groupByDomain?.contexts[0]?.group_by],
5574
5598
  sort: order ? order : default_order ? formatSortingString2(default_order) : ""
5575
5599
  };
5576
- const enabled = isLoadedData && !!specification && !!relation && !!domainMany2Many && !!viewResponse;
5600
+ const enabled = enabledCallAPI && !!specification && !!relation && !!domainMany2Many && !!viewResponse;
5577
5601
  const {
5578
5602
  data: dataResponse,
5579
- isLoading: isDataLoading,
5580
- isFetched: isDataResponseFetched,
5603
+ isLoading,
5604
+ isFetched,
5581
5605
  isPlaceholderData
5582
5606
  } = useGetListData3(data, queryKey, enabled);
5583
5607
  useEffect11(() => {
@@ -5585,74 +5609,57 @@ var many2manyFieldController = (props) => {
5585
5609
  fetchData();
5586
5610
  }
5587
5611
  return () => {
5588
- appDispatch(setGroupByDomain(null));
5589
- setFields((prevFields) => ({
5590
- ...prevFields,
5591
- [`${aid}_${relation}_popupmany2many`]: null
5592
- }));
5593
- appDispatch(setPage(0));
5594
- setSelectedRowKeys4([]);
5612
+ setPage(0);
5613
+ setSelectedRowKeys3([]);
5595
5614
  setDomainMany2Many(null);
5596
- setIsLoadedData(false);
5597
5615
  };
5598
5616
  }, [viewResponse]);
5599
- const { rows, columns, typeTable } = tableController({
5617
+ const { rows, columns, typeTable, onToggleColumnOptional } = tableController({
5600
5618
  data: {
5601
- fields: fields?.[`${aid}_${relation}_popupmany2many`] || viewResponse?.views?.list?.fields,
5619
+ fields: viewResponse?.views?.list?.fields,
5602
5620
  records: dataResponse?.records ?? dataResponse?.groups,
5603
5621
  dataModel: viewResponse?.models?.[String(relation)],
5604
- context: { ...env.context, ...context },
5622
+ context: contextObject,
5605
5623
  typeTable: dataResponse?.groups ? "group" : "list"
5606
5624
  }
5607
5625
  });
5608
- const dataFormView = {
5609
- id: null,
5610
- model: relation,
5611
- context
5612
- };
5613
- const {
5614
- refetch,
5615
- data: dataFormViewResponse,
5616
- isSuccess
5617
- } = useGetFormView({
5618
- data: dataFormView,
5619
- queryKey: [`form-view-action-${relation}`],
5620
- enabled: false
5626
+ const searchControllers = searchController({
5627
+ viewData: viewResponse,
5628
+ model: relation ?? "",
5629
+ context: contextObject,
5630
+ domain,
5631
+ fieldsList: [
5632
+ ...columns?.filter(
5633
+ (col) => col?.field?.type_co === "field" && col?.optional !== "hide"
5634
+ )?.map((col) => ({ ...col.field })) ?? []
5635
+ ]
5621
5636
  });
5622
- useEffect11(() => {
5623
- if (isSuccess && dataFormViewResponse) {
5624
- sessionStorage.setItem("actionData", JSON.stringify(dataFormViewResponse));
5625
- window.location.href = `/form/menu?model=${relation}`;
5626
- }
5627
- }, [isSuccess]);
5628
- useEffect11(() => {
5629
- if (domainMany2Many && !isLoadedData) {
5630
- setIsLoadedData(true);
5631
- }
5632
- }, [domainMany2Many]);
5633
5637
  const handleCreateNewOnPage = async () => {
5634
- try {
5635
- refetch();
5636
- } catch (error) {
5637
- console.log(error);
5638
- }
5639
5638
  };
5640
5639
  return {
5641
5640
  handleCreateNewOnPage,
5642
5641
  optionsObject,
5642
+ totalRows: dataResponse?.length ?? 0,
5643
5643
  rows,
5644
5644
  columns,
5645
+ onToggleColumnOptional,
5645
5646
  typeTable,
5646
- isDataLoading,
5647
- isDataResponseFetched,
5648
- isPlaceholderData
5647
+ isLoading,
5648
+ isFetched,
5649
+ isPlaceholderData,
5650
+ setPage,
5651
+ page,
5652
+ viewData: viewResponse,
5653
+ domain: domainMany2Many,
5654
+ setDomain: setDomainMany2Many,
5655
+ searchController: searchControllers
5649
5656
  };
5650
5657
  };
5651
5658
 
5652
5659
  // src/widget/basic/many2many-tags-field/controller.ts
5653
5660
  import { useMemo as useMemo11 } from "react";
5654
5661
  import { WIDGETAVATAR, WIDGETCOLOR } from "@fctc/interface-logic/constants";
5655
- import { evalJSONContext as evalJSONContext5, evalJSONDomain as evalJSONDomain4 } from "@fctc/interface-logic/utils";
5662
+ import { evalJSONContext as evalJSONContext5, evalJSONDomain as evalJSONDomain5 } from "@fctc/interface-logic/utils";
5656
5663
  var many2manyTagsController = (props) => {
5657
5664
  const {
5658
5665
  relation,
@@ -5667,7 +5674,7 @@ var many2manyTagsController = (props) => {
5667
5674
  const { useGetSelection: useGetSelection2 } = (0, provider_exports.useService)();
5668
5675
  const addtionalFields = optionsFields ? evalJSONContext5(optionsFields) : null;
5669
5676
  const domainObject = useMemo11(
5670
- () => evalJSONDomain4(domain, JSON.parse(JSON.stringify(formValues || {}))),
5677
+ () => evalJSONDomain5(domain, JSON.parse(JSON.stringify(formValues || {}))),
5671
5678
  [domain, formValues]
5672
5679
  );
5673
5680
  const data = {
@@ -5708,8 +5715,8 @@ var many2manyTagsController = (props) => {
5708
5715
  };
5709
5716
 
5710
5717
  // src/widget/basic/status-bar-field/controller.ts
5711
- import { useState as useState9 } from "react";
5712
- import { evalJSONDomain as evalJSONDomain5 } from "@fctc/interface-logic/utils";
5718
+ import { useState as useState10 } from "react";
5719
+ import { evalJSONDomain as evalJSONDomain6 } from "@fctc/interface-logic/utils";
5713
5720
  var durationController = (props) => {
5714
5721
  const { relation, domain, formValues, name, id, model, onRefetch, enabled } = props;
5715
5722
  const specification = {
@@ -5719,13 +5726,13 @@ var durationController = (props) => {
5719
5726
  };
5720
5727
  const { useGetListData: useGetListData3, useChangeStatus } = (0, provider_exports.useService)();
5721
5728
  const { env } = (0, provider_exports.useEnv)();
5722
- const [disabled, setDisabled] = useState9(false);
5723
- const [modelStatus, setModalStatus] = useState9(false);
5729
+ const [disabled, setDisabled] = useState10(false);
5730
+ const [modelStatus, setModalStatus] = useState10(false);
5724
5731
  const queryKey = [`data-status-duration`, specification];
5725
5732
  const listDataProps = {
5726
5733
  model: relation,
5727
5734
  specification,
5728
- domain: evalJSONDomain5(domain, JSON.parse(JSON.stringify(formValues))),
5735
+ domain: evalJSONDomain6(domain, JSON.parse(JSON.stringify(formValues))),
5729
5736
  limit: 10,
5730
5737
  offset: 0,
5731
5738
  fields: "",
@@ -5809,10 +5816,10 @@ var priorityFieldController = (props) => {
5809
5816
  };
5810
5817
 
5811
5818
  // src/widget/basic/download-file-field/controller.ts
5812
- import { useId, useState as useState10 } from "react";
5819
+ import { useId, useState as useState11 } from "react";
5813
5820
  var downloadFileController = () => {
5814
5821
  const inputId = useId();
5815
- const [file, setFile] = useState10(null);
5822
+ const [file, setFile] = useState11(null);
5816
5823
  const handleFileChange = (e) => {
5817
5824
  setFile(e.target.files[0]);
5818
5825
  };
@@ -6744,11 +6751,11 @@ var dateFieldController = (props) => {
6744
6751
  };
6745
6752
 
6746
6753
  // src/widget/basic/copy-link-button/controller.ts
6747
- import { useState as useState11 } from "react";
6754
+ import { useState as useState12 } from "react";
6748
6755
  import { copyTextToClipboard } from "@fctc/interface-logic/utils";
6749
6756
  var copyLinkButtonController = (props) => {
6750
6757
  const { value, defaultValue } = props;
6751
- const [isCopied, setIsCopied] = useState11(false);
6758
+ const [isCopied, setIsCopied] = useState12(false);
6752
6759
  const handleCopyToClipboard = async (value2) => {
6753
6760
  await copyTextToClipboard(value2);
6754
6761
  setIsCopied(true);
@@ -6796,14 +6803,14 @@ var colorFieldController = (props) => {
6796
6803
  };
6797
6804
 
6798
6805
  // src/widget/basic/binary-field/controller.ts
6799
- import { useEffect as useEffect12, useId as useId2, useRef as useRef4, useState as useState12 } from "react";
6806
+ import { useEffect as useEffect12, useId as useId2, useRef as useRef4, useState as useState13 } from "react";
6800
6807
  import { isBase64Image } from "@fctc/interface-logic/utils";
6801
6808
  var binaryFieldController = (props) => {
6802
6809
  const { name, methods, readonly = false, value } = props;
6803
6810
  const inputId = useId2();
6804
- const [selectedImage, setSelectedImage] = useState12(null);
6805
- const [initialImage, setInitialImage] = useState12(value || null);
6806
- const [isInsideTable, setIsInsideTable] = useState12(false);
6811
+ const [selectedImage, setSelectedImage] = useState13(null);
6812
+ const [initialImage, setInitialImage] = useState13(value || null);
6813
+ const [isInsideTable, setIsInsideTable] = useState13(false);
6807
6814
  const { setValue } = methods;
6808
6815
  const binaryRef = useRef4(null);
6809
6816
  const convertUrlToBase64 = async (url) => {
@@ -6893,112 +6900,41 @@ var binaryFieldController = (props) => {
6893
6900
  };
6894
6901
  };
6895
6902
 
6896
- // src/widget/advance/table/table-body/controller.ts
6897
- import {
6898
- useAppDispatch as useAppDispatch6,
6899
- setSelectedRowKeys,
6900
- useAppSelector as useAppSelector4,
6901
- selectList as selectList3
6902
- } from "@fctc/interface-logic/store";
6903
- import { useEffect as useEffect13, useMemo as useMemo12 } from "react";
6904
- var tableBodyController = (props) => {
6905
- const {
6906
- checkedAll,
6907
- checkboxRef,
6908
- setIsAutoSelect,
6909
- row,
6910
- isAutoSelect,
6911
- selectedRowKeysRef,
6912
- onClickRow
6913
- } = props;
6914
- const appDispatch = useAppDispatch6();
6915
- const { selectedRowKeys } = useAppSelector4(selectList3);
6916
- const checked = useMemo12(() => {
6917
- if (!row?.id) return false;
6918
- if (selectedRowKeys?.includes(row.id)) {
6919
- return true;
6920
- }
6921
- return checkedAll;
6922
- }, [row?.id, selectedRowKeys, checkedAll]);
6923
- const handleCheckBoxSingle = (event) => {
6924
- event.stopPropagation();
6925
- if (checkedAll) {
6926
- checkboxRef.current = "uncheck";
6927
- setIsAutoSelect(true);
6928
- return;
6929
- }
6930
- const newSelectedRowKeys = selectedRowKeys?.includes(row.id) ? selectedRowKeys?.filter((key) => key !== row.id) : [...selectedRowKeys, row.id];
6931
- appDispatch(setSelectedRowKeys(newSelectedRowKeys));
6932
- };
6933
- const handleClickRow = (col, row2) => {
6934
- onClickRow(col, row2);
6935
- };
6936
- useEffect13(() => {
6937
- if (!row?.id) return;
6938
- if (isAutoSelect) {
6939
- if (checkboxRef?.current === "uncheck") {
6940
- const filtered = selectedRowKeysRef.current.filter(
6941
- (id) => id !== row.id
6942
- );
6943
- selectedRowKeysRef.current = filtered;
6944
- appDispatch(setSelectedRowKeys(filtered));
6945
- } else {
6946
- const unique = Array.from(
6947
- /* @__PURE__ */ new Set([...selectedRowKeysRef?.current, row?.id])
6948
- );
6949
- selectedRowKeysRef.current = unique;
6950
- appDispatch(setSelectedRowKeys(unique));
6951
- }
6952
- }
6953
- }, [isAutoSelect]);
6954
- useEffect13(() => {
6955
- if (!checkedAll) {
6956
- checkboxRef.current = "enabled";
6957
- false;
6958
- }
6959
- }, [checkedAll]);
6960
- return {
6961
- handleCheckBoxSingle,
6962
- checked,
6963
- handleClickRow
6964
- };
6965
- };
6966
-
6967
6903
  // src/widget/advance/table/table-head/controller.ts
6968
6904
  import {
6969
- useAppDispatch as useAppDispatch7,
6970
- useAppSelector as useAppSelector5,
6905
+ useAppDispatch as useAppDispatch5,
6906
+ useAppSelector as useAppSelector4,
6971
6907
  selectSearch as selectSearch3,
6972
- setSelectedRowKeys as setSelectedRowKeys2
6908
+ setSelectedRowKeys
6973
6909
  } from "@fctc/interface-logic/store";
6974
6910
  var tableHeadController = (props) => {
6975
6911
  const { typeTable, rows, selectedRowKeysRef } = props;
6976
- const appDispatch = useAppDispatch7();
6977
- const { groupByDomain } = useAppSelector5(selectSearch3);
6912
+ const appDispatch = useAppDispatch5();
6913
+ const { groupByDomain } = useAppSelector4(selectSearch3);
6978
6914
  const handleCheckBoxAll = (event) => {
6979
6915
  if (event?.target?.checked && typeTable === "list") {
6980
6916
  const allRowKeys = Array.isArray(rows) ? rows.map((record) => record?.id) : [];
6981
- appDispatch(setSelectedRowKeys2(allRowKeys));
6917
+ appDispatch(setSelectedRowKeys(allRowKeys));
6982
6918
  } else if (event?.target?.checked && typeTable === "group") {
6983
6919
  const rowsIDs = document.querySelectorAll("tr[data-row-id]");
6984
6920
  const ids = Array.from(rowsIDs)?.map(
6985
6921
  (row) => Number(row?.getAttribute("data-row-id"))
6986
6922
  );
6987
6923
  if (ids?.length > 0) {
6988
- appDispatch(setSelectedRowKeys2(ids));
6924
+ appDispatch(setSelectedRowKeys(ids));
6989
6925
  } else {
6990
6926
  const sum = countSum(
6991
6927
  rows,
6992
6928
  typeof groupByDomain === "object" ? groupByDomain?.contexts?.[0]?.group_by : void 0
6993
6929
  );
6994
6930
  const keys = Array.from({ length: sum }, (_) => void 0);
6995
- appDispatch(setSelectedRowKeys2(keys));
6931
+ appDispatch(setSelectedRowKeys(keys));
6996
6932
  }
6997
6933
  if (selectedRowKeysRef) {
6998
6934
  selectedRowKeysRef.current = [];
6999
6935
  }
7000
6936
  } else {
7001
- appDispatch(setSelectedRowKeys2([]));
6937
+ appDispatch(setSelectedRowKeys([]));
7002
6938
  }
7003
6939
  };
7004
6940
  return {
@@ -7007,16 +6943,16 @@ var tableHeadController = (props) => {
7007
6943
  };
7008
6944
 
7009
6945
  // src/widget/advance/table/table-view/controller.ts
7010
- import { useEffect as useEffect14, useMemo as useMemo13, useRef as useRef5, useState as useState13 } from "react";
6946
+ import { useEffect as useEffect13, useMemo as useMemo12, useRef as useRef5, useState as useState14 } from "react";
7011
6947
  import {
7012
- useAppSelector as useAppSelector6,
6948
+ useAppSelector as useAppSelector5,
7013
6949
  selectSearch as selectSearch4,
7014
- selectList as selectList4
6950
+ selectList as selectList3
7015
6951
  } from "@fctc/interface-logic/store";
7016
6952
  import { domainHelper } from "@fctc/interface-logic/utils";
7017
6953
  var tableController = ({ data }) => {
7018
- const [rows, setRows] = useState13(data.records || []);
7019
- const [columns, setColumns] = useState13([]);
6954
+ const [rows, setRows] = useState14(data.records || []);
6955
+ const [columns, setColumns] = useState14([]);
7020
6956
  const dataModelFields = data.fields?.map((field) => {
7021
6957
  return {
7022
6958
  ...data.dataModel?.[field?.name],
@@ -7044,7 +6980,7 @@ var tableController = ({ data }) => {
7044
6980
  return item.display_name ? { ...transformedItem, item: item.display_name } : transformedItem;
7045
6981
  });
7046
6982
  };
7047
- useEffect14(() => {
6983
+ useEffect13(() => {
7048
6984
  setRows(transformData(data.records || null));
7049
6985
  }, [data.records]);
7050
6986
  const handleGetColumns = () => {
@@ -7065,7 +7001,7 @@ var tableController = ({ data }) => {
7065
7001
  }
7066
7002
  return cols;
7067
7003
  };
7068
- useEffect14(() => {
7004
+ useEffect13(() => {
7069
7005
  const columns2 = handleGetColumns();
7070
7006
  setColumns(columns2);
7071
7007
  }, [data.records]);
@@ -7090,17 +7026,17 @@ var tableController = ({ data }) => {
7090
7026
  };
7091
7027
 
7092
7028
  // src/widget/advance/table/table-group/controller.ts
7093
- import { useEffect as useEffect15, useMemo as useMemo14, useState as useState14 } from "react";
7029
+ import { useEffect as useEffect14, useMemo as useMemo13, useState as useState15 } from "react";
7094
7030
  import {
7095
7031
  useOdooDataTransform,
7096
7032
  useGetListData as useGetListData2
7097
7033
  } from "@fctc/interface-logic/hooks";
7098
7034
  import {
7099
- useAppSelector as useAppSelector7,
7035
+ useAppSelector as useAppSelector6,
7100
7036
  selectSearch as selectSearch5,
7101
- selectList as selectList5,
7102
- useAppDispatch as useAppDispatch8,
7103
- setSelectedRowKeys as setSelectedRowKeys3
7037
+ selectList as selectList4,
7038
+ useAppDispatch as useAppDispatch6,
7039
+ setSelectedRowKeys as setSelectedRowKeys2
7104
7040
  } from "@fctc/interface-logic/store";
7105
7041
 
7106
7042
  // src/environment.ts
@@ -7129,18 +7065,18 @@ var tableGroupController = (props) => {
7129
7065
  setIsAutoSelect,
7130
7066
  selectedRowKeysRef
7131
7067
  } = props;
7132
- const [pageGroup, setPageGroup] = useState14(0);
7133
- const { groupByDomain, selectedTags } = useAppSelector7(selectSearch5);
7134
- const { selectedRowKeys } = useAppSelector7(selectList5);
7135
- const appDispatch = useAppDispatch8();
7068
+ const [pageGroup, setPageGroup] = useState15(0);
7069
+ const { groupByDomain, selectedTags } = useAppSelector6(selectSearch5);
7070
+ const { selectedRowKeys } = useAppSelector6(selectList4);
7071
+ const appDispatch = useAppDispatch6();
7136
7072
  const { toDataJS } = useOdooDataTransform();
7137
7073
  const initVal = toDataJS(row, viewData, model);
7138
- const [isShowGroup, setIsShowGroup] = useState14(false);
7139
- const [colEmptyGroup, setColEmptyGroup] = useState14({
7074
+ const [isShowGroup, setIsShowGroup] = useState15(false);
7075
+ const [colEmptyGroup, setColEmptyGroup] = useState15({
7140
7076
  fromStart: 1,
7141
7077
  fromEnd: 1
7142
7078
  });
7143
- const processedData = useMemo14(() => {
7079
+ const processedData = useMemo13(() => {
7144
7080
  const calculateColSpanEmpty = () => {
7145
7081
  const startIndex = columns.findIndex(
7146
7082
  (col) => col.field.type === "monetary" && typeof row[col.key] === "number" || col.field.aggregator === "sum"
@@ -7155,7 +7091,7 @@ var tableGroupController = (props) => {
7155
7091
  };
7156
7092
  return calculateColSpanEmpty();
7157
7093
  }, [columns, row]);
7158
- const shouldFetchData = useMemo14(() => {
7094
+ const shouldFetchData = useMemo13(() => {
7159
7095
  return !!isShowGroup;
7160
7096
  }, [isShowGroup]);
7161
7097
  const enabled = shouldFetchData && !!processedData;
@@ -7195,7 +7131,7 @@ var tableGroupController = (props) => {
7195
7131
  }
7196
7132
  });
7197
7133
  const leftPadding = level > 1 ? level * 8 + "px" : "0px";
7198
- useEffect15(() => {
7134
+ useEffect14(() => {
7199
7135
  if (isShowGroup && selectedTags?.length > 0) {
7200
7136
  setIsShowGroup(false);
7201
7137
  }
@@ -7218,24 +7154,24 @@ var tableGroupController = (props) => {
7218
7154
  const filteredIds = selectedRowKeys.filter(
7219
7155
  (id) => !ids.includes(id)
7220
7156
  );
7221
- appDispatch(setSelectedRowKeys3(filteredIds));
7157
+ appDispatch(setSelectedRowKeys2(filteredIds));
7222
7158
  } else if (!isShowGroup && selectedRowKeys?.length > 0 && typeTableGroup === "list" && checkedAll && !allIdsNull && isQueryFetched) {
7223
7159
  const clonedKeys = [...selectedRowKeys];
7224
- appDispatch(setSelectedRowKeys3([...clonedKeys, -1]));
7225
- setTimeout(() => appDispatch(setSelectedRowKeys3(clonedKeys)), 500);
7160
+ appDispatch(setSelectedRowKeys2([...clonedKeys, -1]));
7161
+ setTimeout(() => appDispatch(setSelectedRowKeys2(clonedKeys)), 500);
7226
7162
  } else if (isShowGroup && selectedRowKeys?.length > 0 && typeTableGroup === "list" && !checkedAll && !allIdsNull) {
7227
7163
  const filteredKeys = selectedRowKeys.filter((id) => id > -1);
7228
- appDispatch(setSelectedRowKeys3(filteredKeys));
7164
+ appDispatch(setSelectedRowKeys2(filteredKeys));
7229
7165
  }
7230
7166
  toggleShowGroup();
7231
7167
  };
7232
- useEffect15(() => {
7168
+ useEffect14(() => {
7233
7169
  if (!isQueryFetched || !rowsGroup || !checkedAll || allIdsNull || typeTableGroup === "group") {
7234
7170
  return;
7235
7171
  }
7236
7172
  const clonedKeys = [...selectedRowKeys];
7237
- setSelectedRowKeys3([...clonedKeys, -1]);
7238
- setTimeout(() => setSelectedRowKeys3(clonedKeys), 500);
7173
+ setSelectedRowKeys2([...clonedKeys, -1]);
7174
+ setTimeout(() => setSelectedRowKeys2(clonedKeys), 500);
7239
7175
  }, [isQueryFetched]);
7240
7176
  return {
7241
7177
  handleExpandChildGroup,
@@ -7273,26 +7209,28 @@ var import_moment2 = __toESM(require_moment());
7273
7209
  import { SearchType } from "@fctc/interface-logic/constants";
7274
7210
  import {
7275
7211
  domainHelper as domainHelper2,
7276
- evalJSONDomain as evalJSONDomain6,
7212
+ evalJSONContext as evalJSONContext8,
7213
+ evalJSONDomain as evalJSONDomain7,
7277
7214
  validateAndParseDate
7278
7215
  } from "@fctc/interface-logic/utils";
7279
- import { useCallback as useCallback3, useEffect as useEffect16, useState as useState15 } from "react";
7216
+ import { useCallback as useCallback3, useEffect as useEffect15, useState as useState16 } from "react";
7280
7217
  var searchController = ({
7281
7218
  viewData,
7282
- actionData,
7283
- fieldsList,
7284
- contextSearch,
7285
- setSearchMap,
7286
- searchMap
7219
+ model,
7220
+ domain,
7221
+ context,
7222
+ fieldsList
7287
7223
  }) => {
7288
- const [filterBy, setFilterBy] = useState15(null);
7289
- const [searchBy, setSearchBy] = useState15(null);
7290
- const [groupBy, setGroupBy] = useState15(null);
7291
- const [selectedTags, setSelectedTags] = useState15(null);
7292
- const [searchString, setSearchString] = useState15("");
7293
- const domainAction = actionData?.domain ? Array.isArray(actionData?.domain) ? [...actionData?.domain] : evalJSONDomain6(actionData?.domain, contextSearch) : [];
7294
- const aid = actionData?.id;
7295
- const model = actionData?.res_model;
7224
+ const { env } = (0, provider_exports.useEnv)();
7225
+ const [filterBy, setFilterBy] = useState16(null);
7226
+ const [searchBy, setSearchBy] = useState16(null);
7227
+ const [groupBy, setGroupBy] = useState16(null);
7228
+ const [selectedTags, setSelectedTags] = useState16(null);
7229
+ const [searchString, setSearchString] = useState16("");
7230
+ const [searchMap, setSearchMap] = useState16({});
7231
+ const actionContext = typeof context === "string" ? evalJSONContext8(context) : context;
7232
+ const contextSearch = { ...env.context, ...actionContext };
7233
+ const domainAction = domain ? Array.isArray(domain) ? [...domain] : evalJSONDomain7(domain, contextSearch) : [];
7296
7234
  const clearSearch = () => {
7297
7235
  setFilterBy([]);
7298
7236
  setGroupBy([]);
@@ -7336,10 +7274,9 @@ var searchController = ({
7336
7274
  }
7337
7275
  }
7338
7276
  };
7339
- useEffect16(() => {
7340
- clearSearch();
7277
+ useEffect15(() => {
7341
7278
  fetchData();
7342
- }, [aid, model, viewData]);
7279
+ }, [model, viewData]);
7343
7280
  const onChangeSearchInput = (search_string) => {
7344
7281
  setSearchString(search_string);
7345
7282
  };
@@ -7376,27 +7313,27 @@ var searchController = ({
7376
7313
  };
7377
7314
  const formatDomain = () => {
7378
7315
  if (domainAction) {
7379
- const domain = [];
7316
+ const domain2 = [];
7380
7317
  if (domainAction?.length > 0) {
7381
- if (Object.keys(searchMap).length > 0) {
7382
- domain.push("&");
7318
+ if (Object.keys(searchMap).some((key) => !key.includes(SearchType.GROUP))) {
7319
+ domain2.push("&");
7383
7320
  }
7384
7321
  domainAction.forEach((domainItem) => {
7385
- domain.push(domainItem);
7322
+ domain2.push(domainItem);
7386
7323
  });
7387
7324
  }
7388
7325
  Object.keys(searchMap).forEach((key, keyIndex, keys) => {
7389
7326
  if (!key?.includes(SearchType.GROUP)) {
7390
7327
  if (keys.length > 1 && keyIndex < keys.length - 1) {
7391
- domain.push("&");
7328
+ domain2.push("&");
7392
7329
  }
7393
7330
  const valuesOfKey = searchMap[key];
7394
7331
  valuesOfKey.forEach((value, index) => {
7395
7332
  if (index < valuesOfKey.length - 1) {
7396
- domain.push("|");
7333
+ domain2.push("|");
7397
7334
  }
7398
7335
  if (value.domain) {
7399
- domain.push(...value.domain);
7336
+ domain2.push(...value.domain);
7400
7337
  return;
7401
7338
  }
7402
7339
  let valueDomainItem = value?.value;
@@ -7412,11 +7349,11 @@ var searchController = ({
7412
7349
  }
7413
7350
  }
7414
7351
  const operator = value?.modelType === "date" || value?.modelType === "datetime" || value?.modelType === "boolean" || value?.modelType === "integer" ? value?.operator ?? "=" : value.operator ?? "ilike";
7415
- domain.push([value.name, operator, valueDomainItem]);
7352
+ domain2.push([value.name, operator, valueDomainItem]);
7416
7353
  });
7417
7354
  }
7418
7355
  });
7419
- return [...domain];
7356
+ return [...domain2];
7420
7357
  }
7421
7358
  };
7422
7359
  const setTagSearch = useCallback3(
@@ -7447,16 +7384,16 @@ var searchController = ({
7447
7384
  const contexts = [];
7448
7385
  let groupValues = [];
7449
7386
  objValues?.forEach((objValue) => {
7450
- const { context, value, active, groupIndex: groupIndex2, isDefault } = objValue;
7387
+ const { context: context2, value, active, groupIndex: groupIndex2, isDefault } = objValue;
7451
7388
  const indexAppend = groupIndex2 != null ? groupIndex2 : viewData?.views?.search?.filters_by?.length ?? 0;
7452
7389
  contexts.push(
7453
- ...Array.isArray(context?.group_by) ? context.group_by.map((item) => ({ group_by: item })) : [context]
7390
+ ...Array.isArray(context2?.group_by) ? context2.group_by.map((item) => ({ group_by: item })) : [context2]
7454
7391
  );
7455
7392
  groupValues[indexAppend] = {
7456
7393
  contexts: [
7457
- ...Array.isArray(context?.group_by) ? context.group_by.map((item) => ({
7394
+ ...Array.isArray(context2?.group_by) ? context2.group_by.map((item) => ({
7458
7395
  group_by: item
7459
- })) : [context]
7396
+ })) : [context2]
7460
7397
  ],
7461
7398
  strings: isDefault ? [value] : [...groupValues[indexAppend]?.strings ?? [], value]
7462
7399
  };
@@ -7482,40 +7419,39 @@ var searchController = ({
7482
7419
  },
7483
7420
  [searchMap]
7484
7421
  );
7485
- useEffect16(() => {
7486
- setSelectedTags(null);
7422
+ useEffect15(() => {
7487
7423
  setTagSearch(searchMap);
7488
7424
  }, [searchMap]);
7489
7425
  const handleAddTagSearch = (tag) => {
7490
7426
  const {
7491
- domain,
7427
+ domain: domain2,
7492
7428
  groupIndex,
7493
7429
  value,
7494
7430
  type,
7495
7431
  title,
7496
- context,
7432
+ context: context2,
7497
7433
  active,
7498
7434
  dataIndex
7499
7435
  } = tag;
7500
- const domainFormat = new domainHelper2.Domain(domain);
7436
+ const domainFormat = new domainHelper2.Domain(domain2);
7501
7437
  if (type === SearchType.FILTER) {
7502
7438
  addSearchItems(`${SearchType.FILTER}_${groupIndex}`, {
7503
7439
  ...tag,
7504
- domain: domain ? domainFormat.toList(context) : null
7440
+ domain: domain2 ? domainFormat.toList(context2) : null
7505
7441
  });
7506
7442
  } else if (type === SearchType.SEARCH) {
7507
7443
  addSearchItems(`${SearchType.SEARCH}_${String(dataIndex)}`, {
7508
7444
  ...tag,
7509
- domain: domain ? domainFormat.toList({
7510
- ...context,
7445
+ domain: domain2 ? domainFormat.toList({
7446
+ ...context2,
7511
7447
  self: value
7512
7448
  }) : null
7513
7449
  });
7514
7450
  } else if (type === SearchType.GROUP) {
7515
7451
  addSearchItems(`${SearchType.GROUP}`, {
7516
7452
  ...tag,
7517
- domain: domain ? domainFormat.toList({
7518
- context,
7453
+ domain: domain2 ? domainFormat.toList({
7454
+ context: context2,
7519
7455
  self: value
7520
7456
  }) : null
7521
7457
  });
@@ -7535,7 +7471,8 @@ var searchController = ({
7535
7471
  removeSearchItems,
7536
7472
  onSearchString: onChangeSearchInput,
7537
7473
  handleAddTagSearch,
7538
- domain: formatDomain()
7474
+ domain: formatDomain(),
7475
+ context: contextSearch
7539
7476
  };
7540
7477
  };
7541
7478
 
@@ -7602,7 +7539,6 @@ export {
7602
7539
  searchController,
7603
7540
  setStorageItemAsync,
7604
7541
  statusDropdownController,
7605
- tableBodyController,
7606
7542
  tableController,
7607
7543
  tableGroupController,
7608
7544
  tableHeadController,
@@ -7616,6 +7552,7 @@ export {
7616
7552
  useGetRowIds,
7617
7553
  useListData,
7618
7554
  useMenu,
7555
+ useMenuItem,
7619
7556
  useProfile,
7620
7557
  useSelectionState,
7621
7558
  useStorageState,