@fctc/widget-logic 2.4.9 → 2.5.0

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.mjs CHANGED
@@ -4373,6 +4373,34 @@ import * as utils_star from "@fctc/interface-logic/utils";
4373
4373
 
4374
4374
  // src/hooks/core/use-view-v2.ts
4375
4375
  import { useMemo as useMemo3 } from "react";
4376
+ var useViewV2 = ({
4377
+ action,
4378
+ context,
4379
+ aid,
4380
+ views,
4381
+ model
4382
+ }) => {
4383
+ const { useGetView: useGetView2 } = (0, provider_exports.useService)();
4384
+ const viewParams = useMemo3(() => {
4385
+ if (!action) {
4386
+ return void 0;
4387
+ }
4388
+ return {
4389
+ model,
4390
+ views,
4391
+ context,
4392
+ id: isNaN(Number(aid)) ? action?.id : aid
4393
+ };
4394
+ }, [action, context, aid]);
4395
+ const view = useGetView2(
4396
+ viewParams || {},
4397
+ !!viewParams
4398
+ );
4399
+ return {
4400
+ ...view,
4401
+ context
4402
+ };
4403
+ };
4376
4404
 
4377
4405
  // src/hooks/core/use-company.ts
4378
4406
  import { useQuery as useQuery3 } from "@tanstack/react-query";
@@ -4388,12 +4416,47 @@ var AppProviderInitialValue = {
4388
4416
  view: {}
4389
4417
  };
4390
4418
  var ReactContext = createContext(AppProviderInitialValue);
4419
+ var useAppProvider = () => {
4420
+ const context = useContext(ReactContext);
4421
+ if (!context) {
4422
+ return AppProviderInitialValue;
4423
+ }
4424
+ return context;
4425
+ };
4391
4426
 
4392
4427
  // src/hooks/core/use-config.ts
4393
4428
  import { useEffect as useEffect6 } from "react";
4394
4429
 
4395
4430
  // src/hooks/core/use-get-specification.ts
4396
4431
  import { useMemo as useMemo6 } from "react";
4432
+ var useGetSpecification = ({
4433
+ model,
4434
+ viewData,
4435
+ fields
4436
+ }) => {
4437
+ const baseModel = useMemo6(
4438
+ () => ({
4439
+ name: String(model),
4440
+ view: viewData || {},
4441
+ fields
4442
+ }),
4443
+ [model, viewData]
4444
+ );
4445
+ const initModel = useModel();
4446
+ const modelInstance = useMemo6(() => {
4447
+ if (viewData) {
4448
+ return initModel.initModel(baseModel);
4449
+ }
4450
+ return null;
4451
+ }, [baseModel, viewData]);
4452
+ const specification = useMemo6(() => {
4453
+ if (modelInstance) {
4454
+ return modelInstance.getSpecification();
4455
+ }
4456
+ return null;
4457
+ }, [modelInstance]);
4458
+ return { specification };
4459
+ };
4397
4460
 
4398
4461
  // src/hooks/core/use-list-data.ts
4399
4462
  import { useMemo as useMemo7, useState as useState6 } from "react";
@@ -4487,6 +4550,95 @@ var useGetRowIds = (tableRef) => {
4487
4550
  return { rowIds, refresh: updateVisibleRowIds };
4488
4551
  };
4489
4552
 
4553
+ // src/hooks/core/use-list-data.ts
4554
+ var useListData = ({
4555
+ action,
4556
+ context,
4557
+ viewData,
4558
+ model
4559
+ }) => {
4560
+ const { useGetListData: useGetListData2 } = (0, provider_exports.useService)();
4561
+ const [page, setPage] = useState6(0);
4562
+ const [pageLimit, setPageLimit] = useState6(10);
4563
+ const [groupByList, setGroupByList] = useState6(null);
4564
+ const [domain, setDomain] = useState6(null);
4565
+ const [order, setOrder] = useState6("");
4566
+ const [mode, setMode] = useState6("month");
4567
+ const [type, setType] = useState6("list");
4568
+ const [currentDate, setCurrentDate] = useState6(/* @__PURE__ */ new Date());
4569
+ const [selectedRowKeys, setSelectedRowKeys2] = useState6([]);
4570
+ const [debouncedPage] = useDebounce(page, 500);
4571
+ const [debouncedDomain] = useDebounce(domain, 500);
4572
+ const { specification } = useGetSpecification({
4573
+ model,
4574
+ viewData,
4575
+ fields: viewData?.views?.list?.fields
4576
+ });
4577
+ const listDataProps = useMemo7(() => {
4578
+ if (!viewData || !action || !context) {
4579
+ return null;
4580
+ }
4581
+ const domainParse = type === "calendar" ? getDateRange(currentDate, mode) : action?.domain ? Array.isArray(action?.domain) ? [...action?.domain] : evalJSONDomain(action?.domain, context) : [];
4582
+ const limit = type === "calendar" ? 2500 : pageLimit;
4583
+ const offset = debouncedPage * pageLimit;
4584
+ const fields = type === "calendar" ? convertFieldsToArray(viewData?.views?.calendar?.fields) || [] : typeof groupByList === "object" ? groupByList?.fields : void 0;
4585
+ const groupby = typeof groupByList === "object" ? [groupByList?.contexts?.[0]?.group_by] : [];
4586
+ const sort = order ? order : viewData?.views?.list?.default_order ? formatSortingString(viewData?.views?.list?.default_order) : "";
4587
+ return {
4588
+ model: action.res_model,
4589
+ specification,
4590
+ domain: domainParse,
4591
+ limit,
4592
+ offset,
4593
+ fields,
4594
+ groupby,
4595
+ context,
4596
+ sort,
4597
+ type
4598
+ };
4599
+ }, [
4600
+ action,
4601
+ context,
4602
+ currentDate,
4603
+ groupByList,
4604
+ mode,
4605
+ order,
4606
+ debouncedPage,
4607
+ pageLimit,
4608
+ type,
4609
+ debouncedDomain
4610
+ ]);
4611
+ const list = useGetListData2(
4612
+ listDataProps,
4613
+ [listDataProps],
4614
+ !!listDataProps && !!specification && !isObjectEmpty3(specification)
4615
+ );
4616
+ return {
4617
+ ...list,
4618
+ state: {
4619
+ specification,
4620
+ type,
4621
+ page,
4622
+ mode,
4623
+ order,
4624
+ domain: listDataProps?.domain,
4625
+ pageLimit,
4626
+ groupByList,
4627
+ currentDate,
4628
+ selectedRowKeys,
4629
+ setType,
4630
+ setMode,
4631
+ setPage,
4632
+ setOrder,
4633
+ setDomain,
4634
+ setPageLimit,
4635
+ setGroupByList,
4636
+ setCurrentDate,
4637
+ setSelectedRowKeys: setSelectedRowKeys2
4638
+ }
4639
+ };
4640
+ };
4641
+
4490
4642
  // src/store.ts
4491
4643
  var store_exports = {};
4492
4644
  __reExport(store_exports, store_star);
@@ -4700,69 +4852,27 @@ var many2oneButtonController = (props) => {
4700
4852
  };
4701
4853
 
4702
4854
  // src/widget/basic/many2many-field/controller.ts
4703
- import { useEffect as useEffect11, useMemo as useMemo9, useState as useState8 } from "react";
4704
- import {
4705
- evalJSONContext as evalJSONContext4,
4706
- evalJSONDomain as evalJSONDomain4,
4707
- formatSortingString as formatSortingString2
4708
- } from "@fctc/interface-logic/utils";
4855
+ import { useEffect as useEffect11, useState as useState8 } from "react";
4856
+ import { evalJSONContext as evalJSONContext4, evalJSONDomain as evalJSONDomain4 } from "@fctc/interface-logic/utils";
4709
4857
  var many2manyFieldController = (props) => {
4710
- const {
4711
- relation,
4712
- domain,
4713
- context,
4714
- options,
4715
- tab,
4716
- setSelectedRowKeys: setSelectedRowKeys2,
4717
- groupByDomain,
4718
- enabled: enabledCallAPI,
4719
- actionData
4720
- } = props;
4858
+ const { relation, domain, context, options, tab, setSelectedRowKeys: setSelectedRowKeys2 } = props;
4721
4859
  const { env } = (0, provider_exports.useEnv)();
4722
- const { useGetView: useGetView2, useGetListData: useGetListData2, useGetFormView: useGetFormView2 } = (0, provider_exports.useService)();
4723
- const [order, setOrder] = useState8();
4860
+ const { useGetFormView: useGetFormView2 } = (0, provider_exports.useService)();
4724
4861
  const [page, setPage] = useState8(0);
4725
4862
  const [domainMany2Many, setDomainMany2Many] = useState8(null);
4726
- const [debouncedPage] = useDebounce(page, 500);
4863
+ const { action } = useAppProvider();
4727
4864
  const contextObject = {
4728
4865
  ...env.context,
4729
4866
  ...context || {}
4730
4867
  };
4731
- const viewParams = {
4732
- model: relation,
4868
+ const { data: viewResponse } = useViewV2({
4869
+ model: String(relation),
4733
4870
  views: [
4734
4871
  [false, "list"],
4735
4872
  [false, "search"]
4736
4873
  ],
4737
4874
  context: contextObject
4738
- };
4739
- const { data: viewResponse } = useGetView2(viewParams, enabledCallAPI);
4740
- const baseModel = useMemo9(
4741
- () => ({
4742
- name: String(relation),
4743
- view: viewResponse || {},
4744
- actContext: contextObject,
4745
- fields: [
4746
- ...Object.values(viewResponse?.views?.list?.fields ?? {}),
4747
- ...tab?.fields ? tab.fields : []
4748
- ]
4749
- }),
4750
- [relation, viewResponse]
4751
- );
4752
- const initModel = useModel();
4753
- const modelInstance = useMemo9(() => {
4754
- if (viewResponse) {
4755
- return initModel.initModel(baseModel);
4756
- }
4757
- return null;
4758
- }, [baseModel, viewResponse]);
4759
- const specification = useMemo9(() => {
4760
- if (modelInstance) {
4761
- return modelInstance.getSpecification();
4762
- }
4763
- return null;
4764
- }, [modelInstance]);
4765
- const default_order = viewResponse && viewResponse?.views?.list?.default_order;
4875
+ });
4766
4876
  const optionsObject = tab?.options ? evalJSONContext4(tab?.options) : (options ? evalJSONContext4(options) : {}) || {};
4767
4877
  const fetchData = async () => {
4768
4878
  try {
@@ -4773,32 +4883,17 @@ var many2manyFieldController = (props) => {
4773
4883
  console.log(err);
4774
4884
  }
4775
4885
  };
4776
- const queryKey = [
4777
- `view-${relation}`,
4778
- specification,
4779
- domainMany2Many,
4780
- debouncedPage,
4781
- groupByDomain,
4782
- order
4783
- ];
4784
- const data = {
4785
- model: relation,
4786
- specification,
4787
- domain: domainMany2Many,
4788
- offset: debouncedPage * 10,
4789
- limit: 10,
4790
- context: contextObject,
4791
- fields: groupByDomain?.fields,
4792
- groupby: [groupByDomain?.contexts[0]?.group_by],
4793
- sort: order ? order : default_order ? formatSortingString2(default_order) : ""
4794
- };
4795
- const enabled = enabledCallAPI && !!specification && !!relation && !!domainMany2Many && !!viewResponse;
4796
4886
  const {
4797
4887
  data: dataResponse,
4798
- isLoading,
4799
4888
  isFetched,
4800
- isPlaceholderData
4801
- } = useGetListData2(data, queryKey, enabled);
4889
+ isPlaceholderData,
4890
+ isLoading
4891
+ } = useListData({
4892
+ action,
4893
+ context,
4894
+ model: String(relation),
4895
+ viewData: viewResponse
4896
+ });
4802
4897
  useEffect11(() => {
4803
4898
  if (viewResponse) {
4804
4899
  fetchData();
@@ -4829,7 +4924,31 @@ var many2manyFieldController = (props) => {
4829
4924
  )?.map((col) => ({ ...col.field })) ?? []
4830
4925
  ]
4831
4926
  });
4927
+ const {
4928
+ refetch,
4929
+ data: dataFormViewResponse,
4930
+ isSuccess
4931
+ } = useGetFormView2({
4932
+ data: {
4933
+ id: null,
4934
+ model: relation ?? "",
4935
+ context: contextObject
4936
+ },
4937
+ queryKey: [`form-view-action-${relation}`],
4938
+ enabled: false
4939
+ });
4940
+ useEffect11(() => {
4941
+ if (isSuccess && dataFormViewResponse) {
4942
+ sessionStorage.setItem("actionData", JSON.stringify(dataFormViewResponse));
4943
+ window.location.href = `/form/menu?model=${relation}`;
4944
+ }
4945
+ }, [isSuccess]);
4832
4946
  const handleCreateNewOnPage = async () => {
4947
+ try {
4948
+ refetch();
4949
+ } catch (error) {
4950
+ console.log(error);
4951
+ }
4833
4952
  };
4834
4953
  return {
4835
4954
  handleCreateNewOnPage,
@@ -4852,7 +4971,7 @@ var many2manyFieldController = (props) => {
4852
4971
  };
4853
4972
 
4854
4973
  // src/widget/basic/many2many-tags-field/controller.ts
4855
- import { useMemo as useMemo10 } from "react";
4974
+ import { useMemo as useMemo9 } from "react";
4856
4975
  import { WIDGETAVATAR, WIDGETCOLOR } from "@fctc/interface-logic/constants";
4857
4976
  import { evalJSONContext as evalJSONContext5, evalJSONDomain as evalJSONDomain5 } from "@fctc/interface-logic/utils";
4858
4977
  var many2manyTagsController = (props) => {
@@ -4870,7 +4989,7 @@ var many2manyTagsController = (props) => {
4870
4989
  const { env } = (0, provider_exports.useEnv)();
4871
4990
  const { useGetSelection: useGetSelection3 } = (0, provider_exports.useService)();
4872
4991
  const addtionalFields = optionsFields ? evalJSONContext5(optionsFields) : null;
4873
- const domainObject = useMemo10(
4992
+ const domainObject = useMemo9(
4874
4993
  () => evalJSONDomain5(domain, JSON.parse(JSON.stringify(formValues || {}))),
4875
4994
  [domain, formValues]
4876
4995
  );
@@ -6102,7 +6221,7 @@ var binaryFieldController = (props) => {
6102
6221
  };
6103
6222
 
6104
6223
  // src/widget/advance/table/table-head/controller.ts
6105
- import { useMemo as useMemo11, useRef as useRef5 } from "react";
6224
+ import { useMemo as useMemo10, useRef as useRef5 } from "react";
6106
6225
  var tableHeadController = (props) => {
6107
6226
  const {
6108
6227
  typeTable,
@@ -6115,19 +6234,19 @@ var tableHeadController = (props) => {
6115
6234
  const { rowIds: recordIds } = useGetRowIds(tableRef);
6116
6235
  const selectedRowKeysRef = useRef5(recordIds);
6117
6236
  const isGroupTable = typeTable === "group";
6118
- const recordsCheckedGroup = useMemo11(() => {
6237
+ const recordsCheckedGroup = useMemo10(() => {
6119
6238
  if (!rows || !groupByList) return 0;
6120
6239
  const groupBy = typeof groupByList === "object" ? groupByList?.contexts?.[0]?.group_by : void 0;
6121
6240
  return countSum(rows, groupBy);
6122
6241
  }, [rows, groupByList]);
6123
- const isAllGroupChecked = useMemo11(() => {
6242
+ const isAllGroupChecked = useMemo10(() => {
6124
6243
  if (!isGroupTable || !selectedRowKeys?.length) return false;
6125
6244
  const selectedLength = selectedRowKeys.filter((id) => id !== -1).length;
6126
6245
  const allRecordsSelected = recordIds.length === selectedRowKeys.length ? recordIds.length === selectedLength : false;
6127
6246
  const allGroupsSelected = recordsCheckedGroup === selectedRowKeys.length;
6128
6247
  return allGroupsSelected || allRecordsSelected;
6129
6248
  }, [isGroupTable, selectedRowKeys, recordIds, recordsCheckedGroup]);
6130
- const isAllNormalChecked = useMemo11(() => {
6249
+ const isAllNormalChecked = useMemo10(() => {
6131
6250
  if (isGroupTable || !selectedRowKeys?.length || !rows?.length) return false;
6132
6251
  return selectedRowKeys.length === rows.length && selectedRowKeys.every(
6133
6252
  (id) => rows.some((record) => record.id === id)
@@ -6257,7 +6376,7 @@ var tableController = ({ data }) => {
6257
6376
  };
6258
6377
 
6259
6378
  // src/widget/advance/table/table-group/controller.ts
6260
- import { useEffect as useEffect14, useMemo as useMemo12, useState as useState14 } from "react";
6379
+ import { useEffect as useEffect14, useMemo as useMemo11, useState as useState14 } from "react";
6261
6380
  import {
6262
6381
  useAppSelector as useAppSelector2,
6263
6382
  selectList
@@ -6285,7 +6404,7 @@ var tableGroupController = (props) => {
6285
6404
  fromEnd: 1
6286
6405
  });
6287
6406
  const domain = row?.__domain;
6288
- const processedData = useMemo12(() => {
6407
+ const processedData = useMemo11(() => {
6289
6408
  const calculateColSpanEmpty = () => {
6290
6409
  const startIndex = columns.findIndex(
6291
6410
  (col) => col.field.type === "monetary" && typeof row[col.key] === "number" || col.field.aggregator === "sum"
@@ -6300,7 +6419,7 @@ var tableGroupController = (props) => {
6300
6419
  };
6301
6420
  return calculateColSpanEmpty();
6302
6421
  }, [columns, row]);
6303
- const shouldFetchData = useMemo12(() => {
6422
+ const shouldFetchData = useMemo11(() => {
6304
6423
  return !!isShowGroup;
6305
6424
  }, [isShowGroup]);
6306
6425
  const enabled = shouldFetchData && !!processedData;
@@ -6363,7 +6482,6 @@ var tableGroupController = (props) => {
6363
6482
  setSelectedRowKeys2([...clonedKeys, -1]);
6364
6483
  setTimeout(() => setSelectedRowKeys2(clonedKeys), 500);
6365
6484
  } else if (isShowGroup && selectedRowKeys?.length > 0 && typeTableGroup === "list" && !checkedAll && !allIdsNull) {
6366
- console.log("abc");
6367
6485
  const filteredKeys = selectedRowKeys.filter((id) => id > -1);
6368
6486
  setSelectedRowKeys2(filteredKeys);
6369
6487
  }
package/package.json CHANGED
@@ -1,96 +1,96 @@
1
- {
2
- "name": "@fctc/widget-logic",
3
- "version": "2.4.9",
4
- "types": "dist/index.d.ts",
5
- "main": "dist/index.cjs",
6
- "module": "dist/index.mjs",
7
- "exports": {
8
- ".": {
9
- "types": "./dist/index.d.ts",
10
- "import": "./dist/index.mjs",
11
- "require": "./dist/index.cjs"
12
- },
13
- "./hooks": {
14
- "types": "./dist/hooks.d.ts",
15
- "import": "./dist/hooks.mjs",
16
- "require": "./dist/hooks.cjs"
17
- },
18
- "./widget": {
19
- "types": "./dist/widget.d.ts",
20
- "import": "./dist/widget.mjs",
21
- "require": "./dist/widget.cjs"
22
- },
23
- "./icons": {
24
- "types": "./dist/icons.d.ts",
25
- "import": "./dist/icons.mjs",
26
- "require": "./dist/icons.cjs"
27
- },
28
- "./utils": {
29
- "types": "./dist/utils.d.ts",
30
- "import": "./dist/utils.mjs",
31
- "require": "./dist/utils.cjs"
32
- },
33
- "./store": {
34
- "types": "./dist/store.d.ts",
35
- "import": "./dist/store.mjs",
36
- "require": "./dist/store.cjs"
37
- },
38
- "./config": {
39
- "types": "./dist/config.d.ts",
40
- "import": "./dist/config.mjs",
41
- "require": "./dist/config.cjs"
42
- },
43
- "./constants": {
44
- "types": "./dist/constants.d.ts",
45
- "import": "./dist/constants.mjs",
46
- "require": "./dist/constants.cjs"
47
- },
48
- "./environment": {
49
- "types": "./dist/environment.d.ts",
50
- "import": "./dist/environment.mjs",
51
- "require": "./dist/environment.cjs"
52
- },
53
- "./provider": {
54
- "types": "./dist/provider.d.ts",
55
- "import": "./dist/provider.mjs",
56
- "require": "./dist/provider.cjs"
57
- },
58
- "./services": {
59
- "types": "./dist/services.d.ts",
60
- "import": "./dist/services.mjs",
61
- "require": "./dist/services.cjs"
62
- },
63
- "./types": {
64
- "types": "./dist/types.d.ts",
65
- "import": "./dist/types.mjs",
66
- "require": "./dist/types.cjs"
67
- }
68
- },
69
- "files": [
70
- "dist"
71
- ],
72
- "scripts": {
73
- "build": "tsup",
74
- "test": "jest"
75
- },
76
- "dependencies": {
77
- "@fctc/interface-logic": "^2.3.5",
78
- "@headlessui/react": "^2.2.6",
79
- "@tanstack/react-query": "^5.84.0",
80
- "i18next": "^25.3.2",
81
- "i18next-browser-languagedetector": "^8.2.0",
82
- "react-i18next": "^15.6.1",
83
- "react-tooltip": "^5.29.1"
84
- },
85
- "devDependencies": {
86
- "@types/react": "^18.3.1",
87
- "jest": "^29.7.0",
88
- "react": "18.0.0",
89
- "tsup": "^8.0.0",
90
- "typescript": "^5.8.2"
91
- },
92
- "packageManager": "yarn@1.22.0",
93
- "peerDependencies": {
94
- "@fctc/interface-logic": "^1.6.9"
95
- }
96
- }
1
+ {
2
+ "name": "@fctc/widget-logic",
3
+ "version": "2.5.0",
4
+ "types": "dist/index.d.ts",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.mjs",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.cjs"
12
+ },
13
+ "./hooks": {
14
+ "types": "./dist/hooks.d.ts",
15
+ "import": "./dist/hooks.mjs",
16
+ "require": "./dist/hooks.cjs"
17
+ },
18
+ "./widget": {
19
+ "types": "./dist/widget.d.ts",
20
+ "import": "./dist/widget.mjs",
21
+ "require": "./dist/widget.cjs"
22
+ },
23
+ "./icons": {
24
+ "types": "./dist/icons.d.ts",
25
+ "import": "./dist/icons.mjs",
26
+ "require": "./dist/icons.cjs"
27
+ },
28
+ "./utils": {
29
+ "types": "./dist/utils.d.ts",
30
+ "import": "./dist/utils.mjs",
31
+ "require": "./dist/utils.cjs"
32
+ },
33
+ "./store": {
34
+ "types": "./dist/store.d.ts",
35
+ "import": "./dist/store.mjs",
36
+ "require": "./dist/store.cjs"
37
+ },
38
+ "./config": {
39
+ "types": "./dist/config.d.ts",
40
+ "import": "./dist/config.mjs",
41
+ "require": "./dist/config.cjs"
42
+ },
43
+ "./constants": {
44
+ "types": "./dist/constants.d.ts",
45
+ "import": "./dist/constants.mjs",
46
+ "require": "./dist/constants.cjs"
47
+ },
48
+ "./environment": {
49
+ "types": "./dist/environment.d.ts",
50
+ "import": "./dist/environment.mjs",
51
+ "require": "./dist/environment.cjs"
52
+ },
53
+ "./provider": {
54
+ "types": "./dist/provider.d.ts",
55
+ "import": "./dist/provider.mjs",
56
+ "require": "./dist/provider.cjs"
57
+ },
58
+ "./services": {
59
+ "types": "./dist/services.d.ts",
60
+ "import": "./dist/services.mjs",
61
+ "require": "./dist/services.cjs"
62
+ },
63
+ "./types": {
64
+ "types": "./dist/types.d.ts",
65
+ "import": "./dist/types.mjs",
66
+ "require": "./dist/types.cjs"
67
+ }
68
+ },
69
+ "files": [
70
+ "dist"
71
+ ],
72
+ "scripts": {
73
+ "build": "tsup",
74
+ "test": "jest"
75
+ },
76
+ "dependencies": {
77
+ "@fctc/interface-logic": "^2.4.7",
78
+ "@headlessui/react": "^2.2.6",
79
+ "@tanstack/react-query": "^5.84.0",
80
+ "i18next": "^25.3.2",
81
+ "i18next-browser-languagedetector": "^8.2.0",
82
+ "react-i18next": "^15.6.1",
83
+ "react-tooltip": "^5.29.1"
84
+ },
85
+ "devDependencies": {
86
+ "@types/react": "^18.3.1",
87
+ "jest": "^29.7.0",
88
+ "react": "18.0.0",
89
+ "tsup": "^8.0.0",
90
+ "typescript": "^5.8.2"
91
+ },
92
+ "packageManager": "yarn@1.22.0",
93
+ "peerDependencies": {
94
+ "@fctc/interface-logic": "^1.6.9"
95
+ }
96
+ }