@fctc/widget-logic 2.3.8 → 2.4.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/hooks.mjs CHANGED
@@ -131,24 +131,10 @@ var useDetail = (accessToken, sub) => {
131
131
  };
132
132
 
133
133
  // src/hooks/core/use-list-data.ts
134
- import { useMemo as useMemo3, useState as useState3 } from "react";
135
-
136
- // src/utils/function.ts
137
- import {
138
- useCallback,
139
- useEffect as useEffect3,
140
- useMemo as useMemo2,
141
- useReducer,
142
- useRef,
143
- useState as useState2
144
- } from "react";
145
-
146
- // src/store.ts
147
- var store_exports = {};
148
- __reExport(store_exports, store_star);
149
- import * as store_star from "@fctc/interface-logic/store";
134
+ import { useMemo as useMemo2, useState as useState2 } from "react";
150
135
 
151
136
  // src/utils/function.ts
137
+ import { useCallback, useEffect as useEffect3, useReducer } from "react";
152
138
  var countSum = (data, field) => {
153
139
  if (!data || !field) return 0;
154
140
  return data.reduce(
@@ -167,91 +153,6 @@ function mergeButtons(fields) {
167
153
  }
168
154
  return others;
169
155
  }
170
- function isElementVisible(el) {
171
- const style = window.getComputedStyle(el);
172
- return style.display !== "none" && style.visibility !== "hidden" && style.opacity !== "0";
173
- }
174
- function arraysAreEqual(a, b) {
175
- if (a.length !== b.length) return false;
176
- const setA = new Set(a);
177
- const setB = new Set(b);
178
- if (setA.size !== setB.size) return false;
179
- for (const val of setA) {
180
- if (!setB.has(val)) return false;
181
- }
182
- return true;
183
- }
184
- function useGetRowIds(tableRef) {
185
- const [rowIds, setRowIds] = useState2([]);
186
- const lastRowIdsRef = useRef([]);
187
- const updateVisibleRowIds = useCallback(() => {
188
- const table = tableRef?.current;
189
- if (!table) return;
190
- const rows = table.querySelectorAll("tr[data-row-id]");
191
- const ids = [];
192
- rows.forEach((row) => {
193
- const el = row;
194
- if (isElementVisible(el)) {
195
- const id = el.getAttribute("data-row-id");
196
- if (id) ids.push(id);
197
- }
198
- });
199
- const uniqueIds = Array.from(new Set(ids));
200
- if (!arraysAreEqual(lastRowIdsRef.current, uniqueIds)) {
201
- lastRowIdsRef.current = uniqueIds;
202
- setRowIds(uniqueIds);
203
- }
204
- }, [tableRef]);
205
- useEffect3(() => {
206
- const table = tableRef?.current;
207
- if (!table) return;
208
- const observer = new MutationObserver(() => {
209
- updateVisibleRowIds();
210
- });
211
- observer.observe(table, {
212
- childList: true,
213
- subtree: true,
214
- attributes: true,
215
- attributeFilter: ["style", "class"]
216
- });
217
- updateVisibleRowIds();
218
- return () => {
219
- observer.disconnect();
220
- };
221
- }, [updateVisibleRowIds, tableRef]);
222
- return { rowIds, refresh: updateVisibleRowIds };
223
- }
224
- var useSelectionState = ({
225
- typeTable,
226
- tableRef,
227
- rows
228
- }) => {
229
- const { groupByDomain } = (0, store_exports.useAppSelector)(store_exports.selectSearch);
230
- const { selectedRowKeys } = (0, store_exports.useAppSelector)(store_exports.selectList);
231
- const { rowIds: recordIds } = useGetRowIds(tableRef);
232
- const selectedRowKeysRef = useRef(recordIds);
233
- const isGroupTable = typeTable === "group";
234
- const recordsCheckedGroup = useMemo2(() => {
235
- if (!rows || !groupByDomain) return 0;
236
- const groupBy = typeof groupByDomain === "object" ? groupByDomain?.contexts?.[0]?.group_by : void 0;
237
- return countSum(rows, groupBy);
238
- }, [rows, groupByDomain]);
239
- const isAllGroupChecked = useMemo2(() => {
240
- if (!isGroupTable || !selectedRowKeys?.length) return false;
241
- const selectedLength = selectedRowKeys.filter((id) => id !== -1).length;
242
- const allRecordsSelected = recordIds.length === selectedRowKeys.length ? recordIds.length === selectedLength : false;
243
- const allGroupsSelected = recordsCheckedGroup === selectedRowKeys.length;
244
- return allGroupsSelected || allRecordsSelected;
245
- }, [isGroupTable, selectedRowKeys, recordIds, recordsCheckedGroup]);
246
- const isAllNormalChecked = useMemo2(() => {
247
- if (isGroupTable || !selectedRowKeys?.length || !rows?.length) return false;
248
- return selectedRowKeys.length === rows.length && selectedRowKeys.every(
249
- (id) => rows.some((record) => record.id === id)
250
- );
251
- }, [isGroupTable, selectedRowKeys, rows]);
252
- const checkedAll = isAllGroupChecked || isAllNormalChecked;
253
- return { checkedAll, selectedRowKeysRef };
254
- };
255
156
  var getDateRange = (currentDate, unit) => {
256
157
  const date = new Date(currentDate);
257
158
  let dateStart, dateEnd;
@@ -393,9 +294,9 @@ function useStorageState(key) {
393
294
  // src/hooks/core/use-list-data.ts
394
295
  import { useModel, useGetListData } from "@fctc/interface-logic/hooks";
395
296
  import {
396
- useAppSelector as useAppSelector2,
397
- selectSearch as selectSearch2,
398
- selectList as selectList2
297
+ useAppSelector,
298
+ selectSearch,
299
+ selectList
399
300
  } from "@fctc/interface-logic/store";
400
301
  import {
401
302
  evalJSONDomain,
@@ -406,13 +307,13 @@ var useListData = ({
406
307
  context,
407
308
  viewResponse
408
309
  }) => {
409
- const { groupByDomain } = useAppSelector2(selectSearch2);
310
+ const { groupByDomain } = useAppSelector(selectSearch);
410
311
  const initModel = useModel();
411
- const [type, setType] = useState3("list");
412
- const [mode, setMode] = useState3("month");
413
- const [currentDate, setCurrentDate] = useState3(/* @__PURE__ */ new Date());
414
- const { pageLimit, page, order } = useAppSelector2(selectList2);
415
- const listDataProps = useMemo3(() => {
312
+ const [type, setType] = useState2("list");
313
+ const [mode, setMode] = useState2("month");
314
+ const [currentDate, setCurrentDate] = useState2(/* @__PURE__ */ new Date());
315
+ const { pageLimit, page, order } = useAppSelector(selectList);
316
+ const listDataProps = useMemo2(() => {
416
317
  const actData = action?.result;
417
318
  if (!viewResponse || !actData || !context) {
418
319
  return null;
@@ -473,7 +374,7 @@ var useListData = ({
473
374
  };
474
375
 
475
376
  // src/hooks/core/use-menu.ts
476
- import { useEffect as useEffect4, useMemo as useMemo4, useState as useState4 } from "react";
377
+ import { useEffect as useEffect4, useMemo as useMemo3, useState as useState3 } from "react";
477
378
 
478
379
  // src/utils/constants.ts
479
380
  var languages = [
@@ -493,9 +394,9 @@ var API_APP_URL = {
493
394
  import { useGetMenu } from "@fctc/interface-logic/hooks";
494
395
  var useMenu = ({ context }) => {
495
396
  const menuData = useGetMenu(context, !!context);
496
- const [menuid, setMenuId] = useState4(void 0);
397
+ const [menuid, setMenuId] = useState3(void 0);
497
398
  const [action, setAction] = useCallAction();
498
- const configedIconData = useMemo4(() => {
399
+ const configedIconData = useMemo3(() => {
499
400
  const data = menuData.data;
500
401
  return data?.map((item) => {
501
402
  return {
@@ -542,7 +443,7 @@ var useMenu = ({ context }) => {
542
443
 
543
444
  // src/hooks/core/use-profile.ts
544
445
  import { useQuery as useQuery2 } from "@tanstack/react-query";
545
- import { useEffect as useEffect5, useMemo as useMemo5 } from "react";
446
+ import { useEffect as useEffect5, useMemo as useMemo4 } from "react";
546
447
  import { useTranslation } from "react-i18next";
547
448
  import { getEnv as getEnv3 } from "@fctc/interface-logic/environment";
548
449
  import { useGetProfile } from "@fctc/interface-logic/hooks";
@@ -570,7 +471,7 @@ var useProfile = (accessToken) => {
570
471
  i18n.changeLanguage(userLocale?.id.split("_")[0]);
571
472
  }
572
473
  }, [dispatch, userInfoQuery.data]);
573
- const context = useMemo5(() => {
474
+ const context = useMemo4(() => {
574
475
  if (userInfoQuery.data?.sub && userInfoQuery.data?.locale) {
575
476
  return {
576
477
  uid: Number(userInfoQuery.data.sub),
@@ -592,13 +493,13 @@ var useUser = (accessToken) => {
592
493
  };
593
494
 
594
495
  // src/hooks/core/use-view-v2.ts
595
- import { useMemo as useMemo6 } from "react";
496
+ import { useMemo as useMemo5 } from "react";
596
497
  import { useGetView } from "@fctc/interface-logic/hooks";
597
498
  var useViewV2 = ({
598
499
  action,
599
500
  context
600
501
  }) => {
601
- const viewParams = useMemo6(() => {
502
+ const viewParams = useMemo5(() => {
602
503
  if (!action?.result) {
603
504
  return void 0;
604
505
  }
@@ -673,11 +574,12 @@ var useAuth = () => {
673
574
  };
674
575
 
675
576
  // src/hooks/core/use-app-provider.tsx
676
- import { createContext, useContext, useMemo as useMemo8 } from "react";
577
+ import { createContext, useContext, useMemo as useMemo7 } from "react";
578
+ import { evalJSONContext } from "@fctc/interface-logic/utils";
677
579
 
678
580
  // src/hooks/core/use-company.ts
679
581
  import { useQuery as useQuery3 } from "@tanstack/react-query";
680
- import { useEffect as useEffect6, useMemo as useMemo7 } from "react";
582
+ import { useEffect as useEffect6, useMemo as useMemo6 } from "react";
681
583
  import { getEnv as getEnv4 } from "@fctc/interface-logic/environment";
682
584
  import {
683
585
  useGetCurrentCompany,
@@ -693,7 +595,7 @@ var useCompany = (accessToken) => {
693
595
  queryFn: fetchCurrentCompany,
694
596
  enabled: !!accessToken
695
597
  });
696
- const current_company_id = useMemo7(() => {
598
+ const current_company_id = useMemo6(() => {
697
599
  return currentCompany.data?.current_company_id;
698
600
  }, [currentCompany.data]);
699
601
  useEffect6(() => {
@@ -725,10 +627,8 @@ var useCompany = (accessToken) => {
725
627
  context: { allowed_company_ids: [current_company_id] }
726
628
  };
727
629
  };
728
- var use_company_default = useCompany;
729
630
 
730
631
  // src/hooks/core/use-app-provider.tsx
731
- import { evalJSONContext } from "@fctc/interface-logic/utils";
732
632
  import { jsx } from "react/jsx-runtime";
733
633
  var AppProviderInitialValue = {
734
634
  config: {},
@@ -745,15 +645,15 @@ var AppProvider = ({ children }) => {
745
645
  const config = useConfig({});
746
646
  const auth = useAuth();
747
647
  const user = useUser(auth.accessToken);
748
- const company = use_company_default(auth.accessToken);
749
- const menuContext = useMemo8(() => {
648
+ const company = useCompany(auth.accessToken);
649
+ const menuContext = useMemo7(() => {
750
650
  return combineContexts([user.context, company.context]);
751
651
  }, [user.context, company.context]);
752
652
  const menu = useMenu({ context: menuContext });
753
- const action = useMemo8(() => {
653
+ const action = useMemo7(() => {
754
654
  return menu.state.action;
755
655
  }, [menu.state.action]);
756
- const viewContext = useMemo8(() => {
656
+ const viewContext = useMemo7(() => {
757
657
  return combineContexts([
758
658
  menuContext,
759
659
  { ...evalJSONContext(action?.result?.context) }
@@ -796,7 +696,7 @@ var useAppProvider = () => {
796
696
  // src/hooks/core/use-menu-item.tsx
797
697
  import { getEnv as getEnv5 } from "@fctc/interface-logic/environment";
798
698
  import { useGetActionDetail } from "@fctc/interface-logic/hooks";
799
- import { useState as useState5 } from "react";
699
+ import { useState as useState4 } from "react";
800
700
 
801
701
  // src/utils.ts
802
702
  var utils_exports = {};
@@ -811,8 +711,6 @@ __export(utils_exports, {
811
711
  languages: () => languages,
812
712
  mergeButtons: () => mergeButtons,
813
713
  setStorageItemAsync: () => setStorageItemAsync,
814
- useGetRowIds: () => useGetRowIds,
815
- useSelectionState: () => useSelectionState,
816
714
  useStorageState: () => useStorageState
817
715
  });
818
716
  __reExport(utils_exports, utils_star);
@@ -833,7 +731,7 @@ var useMenuItem = (props) => {
833
731
  enabled: true,
834
732
  queryKey: [`action-${aid}`]
835
733
  }).data;
836
- const [path, setPath] = useState5("");
734
+ const [path, setPath] = useState4("");
837
735
  const handleClick = () => {
838
736
  if (location?.pathname === "/list/menu" && activeMenuId === menu?.id) {
839
737
  return;
@@ -855,8 +753,74 @@ var useMenuItem = (props) => {
855
753
  return { handleClick, path, queryActionDetail };
856
754
  };
857
755
 
756
+ // src/hooks/core/use-get-rowids.ts
757
+ import { useCallback as useCallback2, useEffect as useEffect7, useRef, useState as useState5 } from "react";
758
+ var useGetRowIds = (tableRef) => {
759
+ function isElementVisible(el) {
760
+ const style = window.getComputedStyle(el);
761
+ return style.display !== "none" && style.visibility !== "hidden" && style.opacity !== "0";
762
+ }
763
+ function arraysAreEqual(a, b) {
764
+ if (a.length !== b.length) return false;
765
+ if (a.length === 0 && b.length === 0) return true;
766
+ const setA = new Set(a);
767
+ const setB = new Set(b);
768
+ if (setA.size !== setB.size) return false;
769
+ for (const val of setA) {
770
+ if (!setB.has(val)) return false;
771
+ }
772
+ return true;
773
+ }
774
+ const [rowIds, setRowIds] = useState5([]);
775
+ const lastRowIdsRef = useRef([]);
776
+ const updateVisibleRowIds = useCallback2(() => {
777
+ const table = tableRef.current;
778
+ if (!table) return;
779
+ const rows = table.querySelectorAll("tr[data-row-id]");
780
+ const ids = [];
781
+ rows.forEach((row) => {
782
+ const el = row;
783
+ if (isElementVisible(el)) {
784
+ const id = el.getAttribute("data-row-id");
785
+ if (id) ids.push(id);
786
+ }
787
+ });
788
+ const uniqueIds = Array.from(new Set(ids));
789
+ if (!arraysAreEqual(lastRowIdsRef.current, uniqueIds)) {
790
+ lastRowIdsRef.current = uniqueIds;
791
+ setRowIds(uniqueIds);
792
+ }
793
+ }, [tableRef]);
794
+ useEffect7(() => {
795
+ const table = tableRef.current;
796
+ if (!table) return;
797
+ const mutationObserver = new MutationObserver(() => {
798
+ updateVisibleRowIds();
799
+ });
800
+ mutationObserver.observe(table, {
801
+ childList: true,
802
+ subtree: true,
803
+ attributes: true,
804
+ attributeFilter: ["style", "class"]
805
+ });
806
+ const resizeObserver = new ResizeObserver(() => {
807
+ updateVisibleRowIds();
808
+ });
809
+ resizeObserver.observe(table);
810
+ const handleScroll = () => updateVisibleRowIds();
811
+ table.addEventListener("scroll", handleScroll, true);
812
+ updateVisibleRowIds();
813
+ return () => {
814
+ mutationObserver.disconnect();
815
+ resizeObserver.disconnect();
816
+ table.removeEventListener("scroll", handleScroll, true);
817
+ };
818
+ }, [updateVisibleRowIds, tableRef?.current]);
819
+ return { rowIds, refresh: updateVisibleRowIds };
820
+ };
821
+
858
822
  // src/hooks/utils/use-click-outside.ts
859
- import { useEffect as useEffect7, useRef as useRef2 } from "react";
823
+ import { useEffect as useEffect8, useRef as useRef2 } from "react";
860
824
  var DEFAULT_EVENTS = ["mousedown", "touchstart"];
861
825
  var useClickOutside = ({
862
826
  handler,
@@ -865,7 +829,7 @@ var useClickOutside = ({
865
829
  refs
866
830
  }) => {
867
831
  const ref = useRef2(null);
868
- useEffect7(() => {
832
+ useEffect8(() => {
869
833
  const listener = (event) => {
870
834
  const { target } = event;
871
835
  if (refs && refs?.length > 0 && refs?.some((r) => r.current?.contains(target))) {
@@ -887,10 +851,10 @@ var useClickOutside = ({
887
851
  };
888
852
 
889
853
  // src/hooks/utils/use-debounce.ts
890
- import { useEffect as useEffect8, useState as useState6 } from "react";
854
+ import { useEffect as useEffect9, useState as useState6 } from "react";
891
855
  function useDebounce(value, delay) {
892
856
  const [debouncedValue, setDebouncedValue] = useState6(value);
893
- useEffect8(() => {
857
+ useEffect9(() => {
894
858
  const handler = setTimeout(() => {
895
859
  setDebouncedValue(value);
896
860
  }, delay);
@@ -912,6 +876,7 @@ export {
912
876
  useConfig,
913
877
  useDebounce,
914
878
  useDetail,
879
+ useGetRowIds,
915
880
  useListData,
916
881
  useMenu,
917
882
  useMenuItem,
package/dist/index.d.mts CHANGED
@@ -1,11 +1,11 @@
1
- export { ActionResultType, AppProvider, ContextProfile, Record, ViewResponse, useAppProvider, useAuth, useAuthType, useCallAction, useCallActionType, useClickOutside, useConfig, useConfigType, useDebounce, useDetail, useListData, useListDataType, useMenu, useMenuItem, useMenuType, useProfile, useUser, useUserType, useViewV2, useViewV2Type } from './hooks.mjs';
1
+ export { ActionResultType, AppProvider, ContextProfile, Record, ViewResponse, useAppProvider, useAuth, useAuthType, useCallAction, useCallActionType, useClickOutside, useConfig, useConfigType, useDebounce, useDetail, useGetRowIds, useListData, useListDataType, useMenu, useMenuItem, useMenuType, useProfile, useUser, useUserType, useViewV2, useViewV2Type } from './hooks.mjs';
2
2
  export * from '@fctc/interface-logic/hooks';
3
3
  export * from '@fctc/interface-logic/configs';
4
4
  export { CheckIcon, ChevronBottomIcon, CloseIcon, EyeIcon, FilterIcon, GroupByIcon, LoadingIcon, SearchIcon } from './icons.mjs';
5
5
  export { ISelctionStateProps, ITableHeadProps, ITableProps, binaryFieldController, colorFieldController, copyLinkButtonController, dateFieldController, downLoadBinaryController, downloadFileController, durationController, many2manyFieldController, many2manyTagsController, many2oneButtonController, many2oneFieldController, priorityFieldController, searchController, statusDropdownController, tableController, tableGroupController, tableHeadController } from './widget.mjs';
6
6
  export * from '@fctc/interface-logic/types';
7
7
  export { IInputFieldProps, ValuePropsType } from './types.mjs';
8
- export { API_APP_URL, API_PRESCHOOL_URL, STORAGES, combineContexts, convertFieldsToArray, countSum, getDateRange, languages, mergeButtons, setStorageItemAsync, useGetRowIds, useSelectionState, useStorageState } from './utils.mjs';
8
+ export { API_APP_URL, API_PRESCHOOL_URL, STORAGES, combineContexts, convertFieldsToArray, countSum, getDateRange, languages, mergeButtons, setStorageItemAsync, useStorageState } from './utils.mjs';
9
9
  export * from '@fctc/interface-logic/utils';
10
10
  export * from '@fctc/interface-logic/store';
11
11
  export * from '@fctc/interface-logic/constants';
package/dist/index.d.ts CHANGED
@@ -1,11 +1,11 @@
1
- export { ActionResultType, AppProvider, ContextProfile, Record, ViewResponse, useAppProvider, useAuth, useAuthType, useCallAction, useCallActionType, useClickOutside, useConfig, useConfigType, useDebounce, useDetail, useListData, useListDataType, useMenu, useMenuItem, useMenuType, useProfile, useUser, useUserType, useViewV2, useViewV2Type } from './hooks.js';
1
+ export { ActionResultType, AppProvider, ContextProfile, Record, ViewResponse, useAppProvider, useAuth, useAuthType, useCallAction, useCallActionType, useClickOutside, useConfig, useConfigType, useDebounce, useDetail, useGetRowIds, useListData, useListDataType, useMenu, useMenuItem, useMenuType, useProfile, useUser, useUserType, useViewV2, useViewV2Type } from './hooks.js';
2
2
  export * from '@fctc/interface-logic/hooks';
3
3
  export * from '@fctc/interface-logic/configs';
4
4
  export { CheckIcon, ChevronBottomIcon, CloseIcon, EyeIcon, FilterIcon, GroupByIcon, LoadingIcon, SearchIcon } from './icons.js';
5
5
  export { ISelctionStateProps, ITableHeadProps, ITableProps, binaryFieldController, colorFieldController, copyLinkButtonController, dateFieldController, downLoadBinaryController, downloadFileController, durationController, many2manyFieldController, many2manyTagsController, many2oneButtonController, many2oneFieldController, priorityFieldController, searchController, statusDropdownController, tableController, tableGroupController, tableHeadController } from './widget.js';
6
6
  export * from '@fctc/interface-logic/types';
7
7
  export { IInputFieldProps, ValuePropsType } from './types.js';
8
- export { API_APP_URL, API_PRESCHOOL_URL, STORAGES, combineContexts, convertFieldsToArray, countSum, getDateRange, languages, mergeButtons, setStorageItemAsync, useGetRowIds, useSelectionState, useStorageState } from './utils.js';
8
+ export { API_APP_URL, API_PRESCHOOL_URL, STORAGES, combineContexts, convertFieldsToArray, countSum, getDateRange, languages, mergeButtons, setStorageItemAsync, useStorageState } from './utils.js';
9
9
  export * from '@fctc/interface-logic/utils';
10
10
  export * from '@fctc/interface-logic/store';
11
11
  export * from '@fctc/interface-logic/constants';