@fctc/widget-logic 2.3.7 → 2.3.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/hooks.mjs CHANGED
@@ -131,10 +131,24 @@ var useDetail = (accessToken, sub) => {
131
131
  };
132
132
 
133
133
  // src/hooks/core/use-list-data.ts
134
- import { useMemo as useMemo2, useState as useState2 } from "react";
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";
135
150
 
136
151
  // src/utils/function.ts
137
- import { useCallback, useEffect as useEffect3, useReducer } from "react";
138
152
  var countSum = (data, field) => {
139
153
  if (!data || !field) return 0;
140
154
  return data.reduce(
@@ -153,6 +167,91 @@ function mergeButtons(fields) {
153
167
  }
154
168
  return others;
155
169
  }
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
+ };
156
255
  var getDateRange = (currentDate, unit) => {
157
256
  const date = new Date(currentDate);
158
257
  let dateStart, dateEnd;
@@ -294,9 +393,9 @@ function useStorageState(key) {
294
393
  // src/hooks/core/use-list-data.ts
295
394
  import { useModel, useGetListData } from "@fctc/interface-logic/hooks";
296
395
  import {
297
- useAppSelector,
298
- selectSearch,
299
- selectList
396
+ useAppSelector as useAppSelector2,
397
+ selectSearch as selectSearch2,
398
+ selectList as selectList2
300
399
  } from "@fctc/interface-logic/store";
301
400
  import {
302
401
  evalJSONDomain,
@@ -307,13 +406,13 @@ var useListData = ({
307
406
  context,
308
407
  viewResponse
309
408
  }) => {
310
- const { groupByDomain } = useAppSelector(selectSearch);
409
+ const { groupByDomain } = useAppSelector2(selectSearch2);
311
410
  const initModel = useModel();
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(() => {
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(() => {
317
416
  const actData = action?.result;
318
417
  if (!viewResponse || !actData || !context) {
319
418
  return null;
@@ -374,7 +473,7 @@ var useListData = ({
374
473
  };
375
474
 
376
475
  // src/hooks/core/use-menu.ts
377
- import { useEffect as useEffect4, useMemo as useMemo3, useState as useState3 } from "react";
476
+ import { useEffect as useEffect4, useMemo as useMemo4, useState as useState4 } from "react";
378
477
 
379
478
  // src/utils/constants.ts
380
479
  var languages = [
@@ -394,9 +493,9 @@ var API_APP_URL = {
394
493
  import { useGetMenu } from "@fctc/interface-logic/hooks";
395
494
  var useMenu = ({ context }) => {
396
495
  const menuData = useGetMenu(context, !!context);
397
- const [menuid, setMenuId] = useState3(void 0);
496
+ const [menuid, setMenuId] = useState4(void 0);
398
497
  const [action, setAction] = useCallAction();
399
- const configedIconData = useMemo3(() => {
498
+ const configedIconData = useMemo4(() => {
400
499
  const data = menuData.data;
401
500
  return data?.map((item) => {
402
501
  return {
@@ -443,7 +542,7 @@ var useMenu = ({ context }) => {
443
542
 
444
543
  // src/hooks/core/use-profile.ts
445
544
  import { useQuery as useQuery2 } from "@tanstack/react-query";
446
- import { useEffect as useEffect5, useMemo as useMemo4 } from "react";
545
+ import { useEffect as useEffect5, useMemo as useMemo5 } from "react";
447
546
  import { useTranslation } from "react-i18next";
448
547
  import { getEnv as getEnv3 } from "@fctc/interface-logic/environment";
449
548
  import { useGetProfile } from "@fctc/interface-logic/hooks";
@@ -471,7 +570,7 @@ var useProfile = (accessToken) => {
471
570
  i18n.changeLanguage(userLocale?.id.split("_")[0]);
472
571
  }
473
572
  }, [dispatch, userInfoQuery.data]);
474
- const context = useMemo4(() => {
573
+ const context = useMemo5(() => {
475
574
  if (userInfoQuery.data?.sub && userInfoQuery.data?.locale) {
476
575
  return {
477
576
  uid: Number(userInfoQuery.data.sub),
@@ -493,13 +592,13 @@ var useUser = (accessToken) => {
493
592
  };
494
593
 
495
594
  // src/hooks/core/use-view-v2.ts
496
- import { useMemo as useMemo5 } from "react";
595
+ import { useMemo as useMemo6 } from "react";
497
596
  import { useGetView } from "@fctc/interface-logic/hooks";
498
597
  var useViewV2 = ({
499
598
  action,
500
599
  context
501
600
  }) => {
502
- const viewParams = useMemo5(() => {
601
+ const viewParams = useMemo6(() => {
503
602
  if (!action?.result) {
504
603
  return void 0;
505
604
  }
@@ -574,11 +673,11 @@ var useAuth = () => {
574
673
  };
575
674
 
576
675
  // src/hooks/core/use-app-provider.tsx
577
- import { createContext, useContext, useMemo as useMemo7 } from "react";
676
+ import { createContext, useContext, useMemo as useMemo8 } from "react";
578
677
 
579
678
  // src/hooks/core/use-company.ts
580
679
  import { useQuery as useQuery3 } from "@tanstack/react-query";
581
- import { useEffect as useEffect6, useMemo as useMemo6 } from "react";
680
+ import { useEffect as useEffect6, useMemo as useMemo7 } from "react";
582
681
  import { getEnv as getEnv4 } from "@fctc/interface-logic/environment";
583
682
  import {
584
683
  useGetCurrentCompany,
@@ -594,7 +693,7 @@ var useCompany = (accessToken) => {
594
693
  queryFn: fetchCurrentCompany,
595
694
  enabled: !!accessToken
596
695
  });
597
- const current_company_id = useMemo6(() => {
696
+ const current_company_id = useMemo7(() => {
598
697
  return currentCompany.data?.current_company_id;
599
698
  }, [currentCompany.data]);
600
699
  useEffect6(() => {
@@ -647,14 +746,14 @@ var AppProvider = ({ children }) => {
647
746
  const auth = useAuth();
648
747
  const user = useUser(auth.accessToken);
649
748
  const company = use_company_default(auth.accessToken);
650
- const menuContext = useMemo7(() => {
749
+ const menuContext = useMemo8(() => {
651
750
  return combineContexts([user.context, company.context]);
652
751
  }, [user.context, company.context]);
653
752
  const menu = useMenu({ context: menuContext });
654
- const action = useMemo7(() => {
753
+ const action = useMemo8(() => {
655
754
  return menu.state.action;
656
755
  }, [menu.state.action]);
657
- const viewContext = useMemo7(() => {
756
+ const viewContext = useMemo8(() => {
658
757
  return combineContexts([
659
758
  menuContext,
660
759
  { ...evalJSONContext(action?.result?.context) }
@@ -697,7 +796,7 @@ var useAppProvider = () => {
697
796
  // src/hooks/core/use-menu-item.tsx
698
797
  import { getEnv as getEnv5 } from "@fctc/interface-logic/environment";
699
798
  import { useGetActionDetail } from "@fctc/interface-logic/hooks";
700
- import { useState as useState4 } from "react";
799
+ import { useState as useState5 } from "react";
701
800
 
702
801
  // src/utils.ts
703
802
  var utils_exports = {};
@@ -712,6 +811,8 @@ __export(utils_exports, {
712
811
  languages: () => languages,
713
812
  mergeButtons: () => mergeButtons,
714
813
  setStorageItemAsync: () => setStorageItemAsync,
814
+ useGetRowIds: () => useGetRowIds,
815
+ useSelectionState: () => useSelectionState,
715
816
  useStorageState: () => useStorageState
716
817
  });
717
818
  __reExport(utils_exports, utils_star);
@@ -732,7 +833,7 @@ var useMenuItem = (props) => {
732
833
  enabled: true,
733
834
  queryKey: [`action-${aid}`]
734
835
  }).data;
735
- const [path, setPath] = useState4("");
836
+ const [path, setPath] = useState5("");
736
837
  const handleClick = () => {
737
838
  if (location?.pathname === "/list/menu" && activeMenuId === menu?.id) {
738
839
  return;
@@ -754,74 +855,8 @@ var useMenuItem = (props) => {
754
855
  return { handleClick, path, queryActionDetail };
755
856
  };
756
857
 
757
- // src/hooks/core/use-get-rowids.ts
758
- import { useCallback as useCallback2, useEffect as useEffect7, useRef, useState as useState5 } from "react";
759
- var useGetRowIds = (tableRef) => {
760
- function isElementVisible(el) {
761
- const style = window.getComputedStyle(el);
762
- return style.display !== "none" && style.visibility !== "hidden" && style.opacity !== "0";
763
- }
764
- function arraysAreEqual(a, b) {
765
- if (a.length !== b.length) return false;
766
- if (a.length === 0 && b.length === 0) return true;
767
- const setA = new Set(a);
768
- const setB = new Set(b);
769
- if (setA.size !== setB.size) return false;
770
- for (const val of setA) {
771
- if (!setB.has(val)) return false;
772
- }
773
- return true;
774
- }
775
- const [rowIds, setRowIds] = useState5([]);
776
- const lastRowIdsRef = useRef([]);
777
- const updateVisibleRowIds = useCallback2(() => {
778
- const table = tableRef.current;
779
- if (!table) return;
780
- const rows = table.querySelectorAll("tr[data-row-id]");
781
- const ids = [];
782
- rows.forEach((row) => {
783
- const el = row;
784
- if (isElementVisible(el)) {
785
- const id = el.getAttribute("data-row-id");
786
- if (id) ids.push(id);
787
- }
788
- });
789
- const uniqueIds = Array.from(new Set(ids));
790
- if (!arraysAreEqual(lastRowIdsRef.current, uniqueIds)) {
791
- lastRowIdsRef.current = uniqueIds;
792
- setRowIds(uniqueIds);
793
- }
794
- }, [tableRef]);
795
- useEffect7(() => {
796
- const table = tableRef.current;
797
- if (!table) return;
798
- const mutationObserver = new MutationObserver(() => {
799
- updateVisibleRowIds();
800
- });
801
- mutationObserver.observe(table, {
802
- childList: true,
803
- subtree: true,
804
- attributes: true,
805
- attributeFilter: ["style", "class"]
806
- });
807
- const resizeObserver = new ResizeObserver(() => {
808
- updateVisibleRowIds();
809
- });
810
- resizeObserver.observe(table);
811
- const handleScroll = () => updateVisibleRowIds();
812
- table.addEventListener("scroll", handleScroll, true);
813
- updateVisibleRowIds();
814
- return () => {
815
- mutationObserver.disconnect();
816
- resizeObserver.disconnect();
817
- table.removeEventListener("scroll", handleScroll, true);
818
- };
819
- }, [updateVisibleRowIds, tableRef?.current]);
820
- return { rowIds, refresh: updateVisibleRowIds };
821
- };
822
-
823
858
  // src/hooks/utils/use-click-outside.ts
824
- import { useEffect as useEffect8, useRef as useRef2 } from "react";
859
+ import { useEffect as useEffect7, useRef as useRef2 } from "react";
825
860
  var DEFAULT_EVENTS = ["mousedown", "touchstart"];
826
861
  var useClickOutside = ({
827
862
  handler,
@@ -830,7 +865,7 @@ var useClickOutside = ({
830
865
  refs
831
866
  }) => {
832
867
  const ref = useRef2(null);
833
- useEffect8(() => {
868
+ useEffect7(() => {
834
869
  const listener = (event) => {
835
870
  const { target } = event;
836
871
  if (refs && refs?.length > 0 && refs?.some((r) => r.current?.contains(target))) {
@@ -852,10 +887,10 @@ var useClickOutside = ({
852
887
  };
853
888
 
854
889
  // src/hooks/utils/use-debounce.ts
855
- import { useEffect as useEffect9, useState as useState6 } from "react";
890
+ import { useEffect as useEffect8, useState as useState6 } from "react";
856
891
  function useDebounce(value, delay) {
857
892
  const [debouncedValue, setDebouncedValue] = useState6(value);
858
- useEffect9(() => {
893
+ useEffect8(() => {
859
894
  const handler = setTimeout(() => {
860
895
  setDebouncedValue(value);
861
896
  }, delay);
@@ -877,7 +912,6 @@ export {
877
912
  useConfig,
878
913
  useDebounce,
879
914
  useDetail,
880
- useGetRowIds,
881
915
  useListData,
882
916
  useMenu,
883
917
  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, useGetRowIds, 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, 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, useStorageState } from './utils.mjs';
8
+ export { API_APP_URL, API_PRESCHOOL_URL, STORAGES, combineContexts, convertFieldsToArray, countSum, getDateRange, languages, mergeButtons, setStorageItemAsync, useGetRowIds, useSelectionState, 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, useGetRowIds, 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, 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, useStorageState } from './utils.js';
8
+ export { API_APP_URL, API_PRESCHOOL_URL, STORAGES, combineContexts, convertFieldsToArray, countSum, getDateRange, languages, mergeButtons, setStorageItemAsync, useGetRowIds, useSelectionState, 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';