@fctc/widget-logic 4.6.6 → 4.6.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/index.mjs CHANGED
@@ -4264,13 +4264,13 @@ import {
4264
4264
  } from "@fctc/interface-logic/hooks";
4265
4265
 
4266
4266
  // src/hooks/core/use-app-provider.tsx
4267
- import { createContext, useContext, useMemo as useMemo6 } from "react";
4267
+ import { createContext, useContext, useMemo as useMemo5 } from "react";
4268
4268
 
4269
4269
  // src/hooks/core/use-menu.ts
4270
- import { useMemo as useMemo2, useState as useState2 } from "react";
4270
+ import { useMemo, useState as useState2 } from "react";
4271
4271
 
4272
4272
  // src/hooks/core/use-call-action.ts
4273
- import { useCallback, useMemo, useState } from "react";
4273
+ import { useCallback, useState } from "react";
4274
4274
 
4275
4275
  // src/provider.ts
4276
4276
  var provider_exports = {};
@@ -4294,12 +4294,8 @@ var useCallAction = () => {
4294
4294
  context
4295
4295
  }) => {
4296
4296
  try {
4297
- const stableEnvContext = useMemo(
4298
- () => env?.context,
4299
- [env?.context?.lang]
4300
- );
4301
4297
  const menuContext = {
4302
- ...stableEnvContext,
4298
+ ...env?.context,
4303
4299
  ...context
4304
4300
  };
4305
4301
  const loadRes = await queryLoadAction.mutateAsync({
@@ -4533,7 +4529,7 @@ var useMenu = ({
4533
4529
  defaultService
4534
4530
  );
4535
4531
  const [menuId, setMenuId] = useState2(void 0);
4536
- const configedIconData = useMemo2(() => {
4532
+ const configedIconData = useMemo(() => {
4537
4533
  const data = menuData.data;
4538
4534
  return data?.map((item) => {
4539
4535
  return {
@@ -4615,7 +4611,7 @@ var useDetail = (sub) => {
4615
4611
 
4616
4612
  // src/hooks/core/use-profile.ts
4617
4613
  import { useQuery as useQuery2 } from "@tanstack/react-query";
4618
- import { useEffect as useEffect3, useMemo as useMemo3 } from "react";
4614
+ import { useEffect as useEffect3, useMemo as useMemo2 } from "react";
4619
4615
  import { useTranslation } from "react-i18next";
4620
4616
  var useProfile = ({ service }) => {
4621
4617
  const { setUid, setLang, setUserInfo, env } = (0, provider_exports.useEnv)();
@@ -4638,7 +4634,7 @@ var useProfile = ({ service }) => {
4638
4634
  i18n2.changeLanguage(userLocale?.id.split("_")[0]);
4639
4635
  }
4640
4636
  }, [userInfoQuery.isFetched]);
4641
- const context = useMemo3(() => {
4637
+ const context = useMemo2(() => {
4642
4638
  if (userInfoQuery.data?.sub && userInfoQuery.data?.locale) {
4643
4639
  return {
4644
4640
  uid: Number(userInfoQuery.data.sub),
@@ -4662,7 +4658,7 @@ var useUser = ({ service }) => {
4662
4658
  };
4663
4659
 
4664
4660
  // src/hooks/core/use-view-v2.ts
4665
- import { useMemo as useMemo4 } from "react";
4661
+ import { useMemo as useMemo3 } from "react";
4666
4662
  var useViewV2 = ({
4667
4663
  action,
4668
4664
  context,
@@ -4671,7 +4667,7 @@ var useViewV2 = ({
4671
4667
  xNode
4672
4668
  }) => {
4673
4669
  const { useGetView: useGetView2 } = (0, provider_exports.useService)();
4674
- const viewParams = useMemo4(() => {
4670
+ const viewParams = useMemo3(() => {
4675
4671
  if (!action || !action?.res_model) {
4676
4672
  return void 0;
4677
4673
  }
@@ -4705,7 +4701,7 @@ var useViewV2 = ({
4705
4701
 
4706
4702
  // src/hooks/core/use-company.ts
4707
4703
  import { useQuery as useQuery3 } from "@tanstack/react-query";
4708
- import { useEffect as useEffect4, useMemo as useMemo5 } from "react";
4704
+ import { useEffect as useEffect4, useMemo as useMemo4 } from "react";
4709
4705
  var useCompany = ({ service }) => {
4710
4706
  const { setAllowCompanies, setCompanies, setDefaultCompany, env } = (0, provider_exports.useEnv)();
4711
4707
  const { useGetCurrentCompany: useGetCurrentCompany2, useGetCompanyInfo: useGetCompanyInfo2 } = (0, provider_exports.useService)();
@@ -4720,7 +4716,7 @@ var useCompany = ({ service }) => {
4720
4716
  queryFn: fetchCurrentCompany,
4721
4717
  enabled: !!env?.defaultCompany
4722
4718
  });
4723
- const current_company_id = useMemo5(() => {
4719
+ const current_company_id = useMemo4(() => {
4724
4720
  return currentCompany.data?.current_company_id;
4725
4721
  }, [currentCompany.data]);
4726
4722
  useEffect4(() => {
@@ -4771,7 +4767,7 @@ var AppProvider = ({
4771
4767
  const { env } = (0, provider_exports.useEnv)();
4772
4768
  const user = useUser({ service: env.default_service });
4773
4769
  const company = useCompany({ service: env.default_service });
4774
- const menuContext = useMemo6(() => {
4770
+ const menuContext = useMemo5(() => {
4775
4771
  return combineContexts([
4776
4772
  {
4777
4773
  ...user?.context,
@@ -4788,10 +4784,10 @@ var AppProvider = ({
4788
4784
  domain: menuParams?.domain,
4789
4785
  defaultService: env.default_service
4790
4786
  });
4791
- const action = useMemo6(() => {
4787
+ const action = useMemo5(() => {
4792
4788
  return menu?.state?.action;
4793
4789
  }, [menu?.state?.action, env?.context?.lang]);
4794
- const viewContext = useMemo6(() => {
4790
+ const viewContext = useMemo5(() => {
4795
4791
  return combineContexts([
4796
4792
  menuContext,
4797
4793
  { ...(0, utils_exports.evalJSONContext)(action?.context) }
@@ -4895,7 +4891,7 @@ var useGetAction = ({
4895
4891
  };
4896
4892
 
4897
4893
  // src/hooks/core/use-get-specification.ts
4898
- import { useMemo as useMemo7 } from "react";
4894
+ import { useMemo as useMemo6 } from "react";
4899
4895
  var useGetSpecification = ({
4900
4896
  model,
4901
4897
  viewData,
@@ -4907,13 +4903,13 @@ var useGetSpecification = ({
4907
4903
  fields
4908
4904
  };
4909
4905
  const initModel = useModel();
4910
- const modelInstance = useMemo7(() => {
4906
+ const modelInstance = useMemo6(() => {
4911
4907
  if (viewData) {
4912
4908
  return initModel.initModel(baseModel);
4913
4909
  }
4914
4910
  return null;
4915
4911
  }, [baseModel, viewData, model]);
4916
- const specification = useMemo7(() => {
4912
+ const specification = useMemo6(() => {
4917
4913
  if (modelInstance) {
4918
4914
  return modelInstance.getSpecification();
4919
4915
  }
@@ -4923,7 +4919,7 @@ var useGetSpecification = ({
4923
4919
  };
4924
4920
 
4925
4921
  // src/hooks/core/use-list-data.ts
4926
- import { useMemo as useMemo8, useState as useState5 } from "react";
4922
+ import { useMemo as useMemo7, useState as useState5 } from "react";
4927
4923
  import {
4928
4924
  evalJSONDomain,
4929
4925
  formatSortingString,
@@ -5067,7 +5063,7 @@ var useListData = ({
5067
5063
  viewData,
5068
5064
  fields: mode === "kanban" ? viewData?.views?.kanban?.fields : viewData?.views?.list?.fields
5069
5065
  });
5070
- const listDataProps = useMemo8(() => {
5066
+ const listDataProps = useMemo7(() => {
5071
5067
  if (!viewData || !action || !context) {
5072
5068
  return null;
5073
5069
  }
@@ -5430,7 +5426,7 @@ var statusDropdownController = (props) => {
5430
5426
  };
5431
5427
 
5432
5428
  // src/widget/basic/many2one-field/controller.ts
5433
- import { useCallback as useCallback4, useEffect as useEffect10, useMemo as useMemo9, useState as useState7 } from "react";
5429
+ import { useCallback as useCallback4, useEffect as useEffect10, useMemo as useMemo8, useState as useState7 } from "react";
5434
5430
  var MANY2ONE_EXTERNAL = "many2one_external";
5435
5431
  var many2oneFieldController = (props) => {
5436
5432
  const {
@@ -5497,7 +5493,7 @@ var many2oneFieldController = (props) => {
5497
5493
  service: widget === MANY2ONE_EXTERNAL ? optionsObject?.service : service,
5498
5494
  xNode
5499
5495
  });
5500
- const selectOptions = useMemo9(() => {
5496
+ const selectOptions = useMemo8(() => {
5501
5497
  return dataOfSelection?.records?.map((val) => ({
5502
5498
  value: val?.id,
5503
5499
  label: val?.display_name || val?.name,
@@ -5508,7 +5504,7 @@ var many2oneFieldController = (props) => {
5508
5504
  setListOptions(selectOptions);
5509
5505
  setDomainModal(domainObject);
5510
5506
  }, [selectOptions]);
5511
- const parsedFormValues = useMemo9(
5507
+ const parsedFormValues = useMemo8(
5512
5508
  () => JSON.parse(
5513
5509
  JSON.stringify({
5514
5510
  ...formValues,
@@ -5865,7 +5861,7 @@ var many2manyFieldController = (props) => {
5865
5861
  };
5866
5862
 
5867
5863
  // src/widget/basic/many2many-tags-field/controller.ts
5868
- import { useCallback as useCallback5, useEffect as useEffect12, useMemo as useMemo10, useState as useState8 } from "react";
5864
+ import { useCallback as useCallback5, useEffect as useEffect12, useMemo as useMemo9, useState as useState8 } from "react";
5869
5865
  import { WIDGETAVATAR, WIDGETCOLOR } from "@fctc/interface-logic/constants";
5870
5866
  import { evalJSONContext as evalJSONContext5, evalJSONDomain as evalJSONDomain4 } from "@fctc/interface-logic/utils";
5871
5867
  var many2manyTagsController = (props) => {
@@ -5897,7 +5893,7 @@ var many2manyTagsController = (props) => {
5897
5893
  ...fieldContext ?? {},
5898
5894
  ...env?.context
5899
5895
  };
5900
- const parsedFormValues = useMemo10(
5896
+ const parsedFormValues = useMemo9(
5901
5897
  () => JSON.parse(
5902
5898
  JSON.stringify({
5903
5899
  ...formValues,
@@ -5938,7 +5934,7 @@ var many2manyTagsController = (props) => {
5938
5934
  xNode,
5939
5935
  enabled: false
5940
5936
  });
5941
- const selectOptions = useMemo10(() => {
5937
+ const selectOptions = useMemo9(() => {
5942
5938
  return dataOfSelection?.records?.map((val) => ({
5943
5939
  value: val.id,
5944
5940
  label: val.name ?? val.display_name,
@@ -6445,7 +6441,7 @@ var binaryFieldController = (props) => {
6445
6441
  };
6446
6442
 
6447
6443
  // src/widget/advance/table/table-head/controller.ts
6448
- import { useMemo as useMemo11, useRef as useRef5 } from "react";
6444
+ import { useMemo as useMemo10, useRef as useRef5 } from "react";
6449
6445
  var tableHeadController = (props) => {
6450
6446
  const {
6451
6447
  typeTable,
@@ -6458,19 +6454,19 @@ var tableHeadController = (props) => {
6458
6454
  const { rowIds: recordIds } = useGetRowIds(tableRef);
6459
6455
  const selectedRowKeysRef = useRef5(recordIds);
6460
6456
  const isGroupTable = typeTable === "group";
6461
- const recordsCheckedGroup = useMemo11(() => {
6457
+ const recordsCheckedGroup = useMemo10(() => {
6462
6458
  if (!rows || !groupByList) return 0;
6463
6459
  const groupBy = typeof groupByList === "object" ? groupByList?.contexts?.[0]?.group_by : void 0;
6464
6460
  return countSum(rows, groupBy);
6465
6461
  }, [rows, groupByList]);
6466
- const isAllGroupChecked = useMemo11(() => {
6462
+ const isAllGroupChecked = useMemo10(() => {
6467
6463
  if (!isGroupTable || !selectedRowKeys?.length) return false;
6468
6464
  const selectedLength = selectedRowKeys.filter((id) => id !== -1).length;
6469
6465
  const allRecordsSelected = recordIds.length === selectedRowKeys.length ? recordIds.length === selectedLength : false;
6470
6466
  const allGroupsSelected = recordsCheckedGroup === selectedRowKeys.length;
6471
6467
  return allGroupsSelected || allRecordsSelected;
6472
6468
  }, [isGroupTable, selectedRowKeys, recordIds, recordsCheckedGroup]);
6473
- const isAllNormalChecked = useMemo11(() => {
6469
+ const isAllNormalChecked = useMemo10(() => {
6474
6470
  if (isGroupTable || !selectedRowKeys?.length || !rows?.length) return false;
6475
6471
  return selectedRowKeys.length === rows.length && selectedRowKeys.every(
6476
6472
  (id) => rows.some((record) => record.id === id)
@@ -6511,19 +6507,19 @@ var tableHeadController = (props) => {
6511
6507
  };
6512
6508
 
6513
6509
  // src/widget/advance/table/table-view/controller.ts
6514
- import { useCallback as useCallback6, useEffect as useEffect14, useMemo as useMemo12, useState as useState13 } from "react";
6510
+ import { useCallback as useCallback6, useEffect as useEffect14, useMemo as useMemo11, useState as useState13 } from "react";
6515
6511
  import { domainHelper } from "@fctc/interface-logic/utils";
6516
6512
  var tableController = ({ data }) => {
6517
6513
  const [rows, setRows] = useState13([]);
6518
6514
  const [columnVisibility, setColumnVisibility] = useState13({});
6519
- const dataModelFields = useMemo12(() => {
6515
+ const dataModelFields = useMemo11(() => {
6520
6516
  return data?.fields?.map((field) => ({
6521
6517
  ...data.dataModel?.[field?.name],
6522
6518
  ...field,
6523
6519
  string: field?.string || data.dataModel?.[field?.name]?.string
6524
6520
  })) ?? [];
6525
6521
  }, [data?.fields, data?.dataModel]);
6526
- const mergeFields = useMemo12(
6522
+ const mergeFields = useMemo11(
6527
6523
  () => mergeButtons(dataModelFields),
6528
6524
  [dataModelFields]
6529
6525
  );
@@ -6552,7 +6548,7 @@ var tableController = ({ data }) => {
6552
6548
  useEffect14(() => {
6553
6549
  setRows(transformData(data?.records));
6554
6550
  }, [data?.records, transformData]);
6555
- const columns = useMemo12(() => {
6551
+ const columns = useMemo11(() => {
6556
6552
  try {
6557
6553
  return mergeFields?.filter((item) => {
6558
6554
  return item?.widget !== "details_Receive_money" && !(item?.column_invisible ? domainHelper.matchDomains(
@@ -6588,7 +6584,7 @@ var tableController = ({ data }) => {
6588
6584
  };
6589
6585
 
6590
6586
  // src/widget/advance/table/table-group/controller.ts
6591
- import { useEffect as useEffect15, useMemo as useMemo13, useState as useState14 } from "react";
6587
+ import { useEffect as useEffect15, useMemo as useMemo12, useState as useState14 } from "react";
6592
6588
  import { useAppSelector, selectList } from "@fctc/interface-logic/store";
6593
6589
  var tableGroupController = (props) => {
6594
6590
  const { env } = (0, provider_exports.useEnv)();
@@ -6613,7 +6609,7 @@ var tableGroupController = (props) => {
6613
6609
  fromEnd: 1
6614
6610
  });
6615
6611
  const domain = row?.__domain;
6616
- const processedData = useMemo13(() => {
6612
+ const processedData = useMemo12(() => {
6617
6613
  const calculateColSpanEmpty = () => {
6618
6614
  const startIndex = columns.findIndex(
6619
6615
  (col) => col.field.type === "monetary" && typeof row[col.key] === "number" || col.field.aggregator === "sum"
@@ -6628,7 +6624,7 @@ var tableGroupController = (props) => {
6628
6624
  };
6629
6625
  return calculateColSpanEmpty();
6630
6626
  }, [columns, row]);
6631
- const shouldFetchData = useMemo13(() => {
6627
+ const shouldFetchData = useMemo12(() => {
6632
6628
  return !!isShowGroup;
6633
6629
  }, [isShowGroup]);
6634
6630
  const enabled = shouldFetchData && !!processedData;
@@ -6723,14 +6719,14 @@ var tableGroupController = (props) => {
6723
6719
 
6724
6720
  // src/widget/advance/search/controller.ts
6725
6721
  var import_moment2 = __toESM(require_moment());
6726
- import { SearchType } from "@fctc/interface-logic/constants";
6727
- import {
6728
- domainHelper as domainHelper2,
6729
- evalJSONContext as evalJSONContext8,
6730
- evalJSONDomain as evalJSONDomain6,
6731
- validateAndParseDate
6732
- } from "@fctc/interface-logic/utils";
6733
6722
  import { useCallback as useCallback7, useEffect as useEffect16, useState as useState15 } from "react";
6723
+
6724
+ // src/constants.ts
6725
+ var constants_exports = {};
6726
+ __reExport(constants_exports, constants_star);
6727
+ import * as constants_star from "@fctc/interface-logic/constants";
6728
+
6729
+ // src/widget/advance/search/controller.ts
6734
6730
  var searchController = ({
6735
6731
  viewData,
6736
6732
  model,
@@ -6745,9 +6741,11 @@ var searchController = ({
6745
6741
  const [selectedTags, setSelectedTags] = useState15(null);
6746
6742
  const [searchString, setSearchString] = useState15("");
6747
6743
  const [searchMap, setSearchMap] = useState15({});
6748
- const actionContext = typeof context === "string" ? evalJSONContext8(context) : context;
6744
+ const [hoveredIndex, setHoveredIndex] = useState15(0);
6745
+ const [hoveredIndexSearchList, setHoveredIndexSearchList] = useState15(0);
6746
+ const actionContext = typeof context === "string" ? (0, utils_exports.evalJSONContext)(context) : context;
6749
6747
  const contextSearch = { ...env.context, ...actionContext };
6750
- const domainAction = domain ? Array.isArray(domain) ? [...domain] : evalJSONDomain6(domain, contextSearch) : [];
6748
+ const domainAction = domain ? Array.isArray(domain) ? [...domain] : (0, utils_exports.evalJSONDomain)(domain, contextSearch) : [];
6751
6749
  const clearSearch = () => {
6752
6750
  setFilterBy([]);
6753
6751
  setGroupBy([]);
@@ -6762,23 +6760,23 @@ var searchController = ({
6762
6760
  const dataModel = viewData?.models?.[model];
6763
6761
  const searchViews = viewData?.views?.search;
6764
6762
  const searchByItems = searchViews?.search_by?.filter(
6765
- (item) => !domainHelper2.matchDomains(contextSearch, item.invisible)
6763
+ (item) => !utils_exports.domainHelper.matchDomains(contextSearch, item.invisible)
6766
6764
  )?.map(
6767
6765
  ({ string, name, filter_domain, operator, widget }, index) => ({
6768
6766
  dataIndex: index,
6769
- title: string ?? dataModel[name]?.string,
6770
- name: name ?? dataModel[name]?.name,
6767
+ title: string ?? dataModel?.[name]?.string,
6768
+ name: name ?? dataModel?.[name]?.name,
6771
6769
  filter_domain,
6772
6770
  operator,
6773
6771
  widget,
6774
- type: dataModel[name]?.type
6772
+ type: dataModel?.[name]?.type
6775
6773
  })
6776
6774
  );
6777
6775
  const filterByItems = searchViews?.filter_by.filter((item) => {
6778
- return !domainHelper2.matchDomains(contextSearch, item?.invisible);
6776
+ return !utils_exports.domainHelper.matchDomains(contextSearch, item?.invisible);
6779
6777
  })?.map((item) => ({ ...item, active: false }));
6780
6778
  const groupByItems = searchViews?.group_by.filter(
6781
- (item) => !domainHelper2.matchDomains(contextSearch, item?.invisible)
6779
+ (item) => !utils_exports.domainHelper.matchDomains(contextSearch, item?.invisible)
6782
6780
  ).map((item) => ({
6783
6781
  ...item,
6784
6782
  string: item.string ?? viewData?.models?.[model]?.[item?.name?.split("group_by_")?.[1]]?.string
@@ -6832,7 +6830,7 @@ var searchController = ({
6832
6830
  if (domainAction) {
6833
6831
  const domain2 = [];
6834
6832
  if (Array.isArray(domainAction) && domainAction.length > 0) {
6835
- if (Object.keys(searchMap).some((key) => !key.includes(SearchType.GROUP))) {
6833
+ if (Object.keys(searchMap).some((key) => !key.includes(constants_exports.SearchType.GROUP))) {
6836
6834
  domain2.push("&");
6837
6835
  }
6838
6836
  domainAction.forEach((domainItem) => {
@@ -6840,7 +6838,7 @@ var searchController = ({
6840
6838
  });
6841
6839
  }
6842
6840
  Object.keys(searchMap).forEach((key, keyIndex, keys) => {
6843
- if (!key?.includes(SearchType.GROUP)) {
6841
+ if (!key?.includes(constants_exports.SearchType.GROUP)) {
6844
6842
  if (keys.length > 1 && keyIndex < keys.length - 1) {
6845
6843
  domain2.push("&");
6846
6844
  }
@@ -6855,14 +6853,14 @@ var searchController = ({
6855
6853
  }
6856
6854
  let valueDomainItem = value?.value;
6857
6855
  if (value?.modelType === "date") {
6858
- valueDomainItem = validateAndParseDate(value?.value);
6856
+ valueDomainItem = (0, utils_exports.validateAndParseDate)(value?.value);
6859
6857
  } else if (value?.modelType === "datetime") {
6860
6858
  if (value?.operator === "<=" || value?.operator === "<") {
6861
- const parsedDate = validateAndParseDate(value?.value, true);
6859
+ const parsedDate = (0, utils_exports.validateAndParseDate)(value?.value, true);
6862
6860
  const hasTime = (0, import_moment2.default)(value?.value).format("HH:mm:ss") !== "00:00:00";
6863
6861
  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");
6864
6862
  } else {
6865
- valueDomainItem = validateAndParseDate(value?.value, true);
6863
+ valueDomainItem = (0, utils_exports.validateAndParseDate)(value?.value, true);
6866
6864
  }
6867
6865
  }
6868
6866
  const operator = value?.modelType === "date" || value?.modelType === "datetime" || value?.modelType === "boolean" || value?.modelType === "integer" ? value?.operator ?? "=" : value.operator ?? "ilike";
@@ -6887,11 +6885,11 @@ var searchController = ({
6887
6885
  modelType,
6888
6886
  dataIndex
6889
6887
  } = objValues[0];
6890
- if (!key?.includes(SearchType.GROUP)) {
6888
+ if (!key?.includes(constants_exports.SearchType.GROUP)) {
6891
6889
  const values = objValues?.map((objValue) => objValue.value);
6892
6890
  return {
6893
6891
  title,
6894
- name: type === SearchType.SEARCH ? `${SearchType.SEARCH}_${String(dataIndex)}` : groupIndex ?? name,
6892
+ name: type === constants_exports.SearchType.SEARCH ? `${constants_exports.SearchType.SEARCH}_${String(dataIndex)}` : groupIndex ?? name,
6895
6893
  values,
6896
6894
  type,
6897
6895
  widget,
@@ -6941,22 +6939,22 @@ var searchController = ({
6941
6939
  }, [searchMap]);
6942
6940
  const handleAddTagSearch = (tag) => {
6943
6941
  const { domain: domain2, groupIndex, value, type, context: context2, dataIndex } = tag;
6944
- const domainFormat = new domainHelper2.Domain(domain2);
6945
- if (type === SearchType.FILTER) {
6946
- addSearchItems(`${SearchType.FILTER}_${groupIndex}`, {
6942
+ const domainFormat = new utils_exports.domainHelper.Domain(domain2);
6943
+ if (type === constants_exports.SearchType.FILTER) {
6944
+ addSearchItems(`${constants_exports.SearchType.FILTER}_${groupIndex}`, {
6947
6945
  ...tag,
6948
6946
  domain: domain2 ? domainFormat.toList(context2) : null
6949
6947
  });
6950
- } else if (type === SearchType.SEARCH) {
6951
- addSearchItems(`${SearchType.SEARCH}_${String(dataIndex)}`, {
6948
+ } else if (type === constants_exports.SearchType.SEARCH) {
6949
+ addSearchItems(`${constants_exports.SearchType.SEARCH}_${String(dataIndex)}`, {
6952
6950
  ...tag,
6953
6951
  domain: domain2 ? domainFormat.toList({
6954
6952
  ...context2,
6955
6953
  self: value
6956
6954
  }) : null
6957
6955
  });
6958
- } else if (type === SearchType.GROUP) {
6959
- addSearchItems(`${SearchType.GROUP}`, {
6956
+ } else if (type === constants_exports.SearchType.GROUP) {
6957
+ addSearchItems(`${constants_exports.SearchType.GROUP}`, {
6960
6958
  ...tag,
6961
6959
  domain: domain2 ? domainFormat.toList({
6962
6960
  context: context2,
@@ -6965,6 +6963,65 @@ var searchController = ({
6965
6963
  });
6966
6964
  }
6967
6965
  };
6966
+ const onKeyDown = (e) => {
6967
+ if (!searchBy || searchBy.length === 0) return;
6968
+ switch (e.key) {
6969
+ case "Backspace": {
6970
+ if (!searchString && selectedTags && selectedTags.length > 0) {
6971
+ const lastTag = selectedTags[selectedTags.length - 1];
6972
+ if (!lastTag) return;
6973
+ const key = lastTag.type === constants_exports.SearchType.GROUP ? constants_exports.SearchType.GROUP : lastTag.name;
6974
+ removeKeyFromSearchMap({ key: String(key) });
6975
+ }
6976
+ break;
6977
+ }
6978
+ case "ArrowDown": {
6979
+ e.preventDefault();
6980
+ setHoveredIndex((prev) => {
6981
+ const maxIndex = searchBy.length - 1;
6982
+ const next = prev < maxIndex ? prev + 1 : prev;
6983
+ setHoveredIndexSearchList(next);
6984
+ return next;
6985
+ });
6986
+ break;
6987
+ }
6988
+ case "ArrowUp": {
6989
+ e.preventDefault();
6990
+ setHoveredIndex((prev) => {
6991
+ const next = prev > 0 ? prev - 1 : prev;
6992
+ setHoveredIndexSearchList(next);
6993
+ return next;
6994
+ });
6995
+ break;
6996
+ }
6997
+ case "Enter": {
6998
+ e.preventDefault();
6999
+ if (!searchString.trim()) return;
7000
+ const head = searchBy[hoveredIndex];
7001
+ if (!head) return;
7002
+ handleAddTagSearch({
7003
+ title: head.title,
7004
+ name: head.name,
7005
+ value: searchString,
7006
+ type: constants_exports.SearchType.SEARCH,
7007
+ domain: head.filter_domain,
7008
+ operator: head.operator,
7009
+ dataIndex: head.dataIndex,
7010
+ widget: head.widget,
7011
+ modelType: head.type
7012
+ });
7013
+ break;
7014
+ }
7015
+ default:
7016
+ break;
7017
+ }
7018
+ };
7019
+ const handleMouseEnter = (index) => {
7020
+ setHoveredIndexSearchList(index);
7021
+ };
7022
+ const handleMouseLeave = () => {
7023
+ setHoveredIndexSearchList(null);
7024
+ };
6968
7025
  return {
6969
7026
  groupBy,
6970
7027
  searchBy,
@@ -6980,7 +7037,11 @@ var searchController = ({
6980
7037
  onSearchString: onChangeSearchInput,
6981
7038
  handleAddTagSearch,
6982
7039
  domain: formatDomain(),
6983
- context: contextSearch
7040
+ context: contextSearch,
7041
+ onKeyDown,
7042
+ handleMouseEnter,
7043
+ handleMouseLeave,
7044
+ hoveredIndexSearchList
6984
7045
  };
6985
7046
  };
6986
7047
 
@@ -6994,13 +7055,6 @@ import * as store_star from "@fctc/interface-logic/store";
6994
7055
 
6995
7056
  // src/index.ts
6996
7057
  __reExport(index_exports, store_exports);
6997
-
6998
- // src/constants.ts
6999
- var constants_exports = {};
7000
- __reExport(constants_exports, constants_star);
7001
- import * as constants_star from "@fctc/interface-logic/constants";
7002
-
7003
- // src/index.ts
7004
7058
  __reExport(index_exports, constants_exports);
7005
7059
 
7006
7060
  // src/environment.ts
package/dist/widget.d.mts CHANGED
@@ -109,6 +109,10 @@ declare const many2manyFieldController: (props: IMany2ManyControllerProps) => {
109
109
  handleAddTagSearch: (tag: any) => void;
110
110
  domain: any[] | undefined;
111
111
  context: any;
112
+ onKeyDown: (e: any) => void;
113
+ handleMouseEnter: (index: number) => void;
114
+ handleMouseLeave: () => void;
115
+ hoveredIndexSearchList: number | null;
112
116
  };
113
117
  handleCreateNewOnPage: () => Promise<void>;
114
118
  specification: Record<string, any> | null;
@@ -306,6 +310,10 @@ declare const searchController: ({ viewData, model, domain, context, fieldsList,
306
310
  handleAddTagSearch: (tag: any) => void;
307
311
  domain: any[] | undefined;
308
312
  context: any;
313
+ onKeyDown: (e: any) => void;
314
+ handleMouseEnter: (index: number) => void;
315
+ handleMouseLeave: () => void;
316
+ hoveredIndexSearchList: number | null;
309
317
  };
310
318
 
311
319
  export { type ISelctionStateProps, type ITableHeadProps, type ITableProps, binaryFieldController, colorFieldController, copyLinkButtonController, dateFieldController, downLoadBinaryController, downloadFileController, durationController, many2manyFieldController, many2manyTagsController, many2oneButtonController, many2oneFieldController, priorityFieldController, searchController, statusDropdownController, tableController, tableGroupController, tableHeadController };
package/dist/widget.d.ts CHANGED
@@ -109,6 +109,10 @@ declare const many2manyFieldController: (props: IMany2ManyControllerProps) => {
109
109
  handleAddTagSearch: (tag: any) => void;
110
110
  domain: any[] | undefined;
111
111
  context: any;
112
+ onKeyDown: (e: any) => void;
113
+ handleMouseEnter: (index: number) => void;
114
+ handleMouseLeave: () => void;
115
+ hoveredIndexSearchList: number | null;
112
116
  };
113
117
  handleCreateNewOnPage: () => Promise<void>;
114
118
  specification: Record<string, any> | null;
@@ -306,6 +310,10 @@ declare const searchController: ({ viewData, model, domain, context, fieldsList,
306
310
  handleAddTagSearch: (tag: any) => void;
307
311
  domain: any[] | undefined;
308
312
  context: any;
313
+ onKeyDown: (e: any) => void;
314
+ handleMouseEnter: (index: number) => void;
315
+ handleMouseLeave: () => void;
316
+ hoveredIndexSearchList: number | null;
309
317
  };
310
318
 
311
319
  export { type ISelctionStateProps, type ITableHeadProps, type ITableProps, binaryFieldController, colorFieldController, copyLinkButtonController, dateFieldController, downLoadBinaryController, downloadFileController, durationController, many2manyFieldController, many2manyTagsController, many2oneButtonController, many2oneFieldController, priorityFieldController, searchController, statusDropdownController, tableController, tableGroupController, tableHeadController };