@fctc/widget-logic 5.3.7-beta.16 → 5.3.7-beta.18

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.js ADDED
@@ -0,0 +1,977 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/hooks.ts
22
+ var hooks_exports = {};
23
+ __export(hooks_exports, {
24
+ AppProvider: () => AppProvider,
25
+ useAddEntity: () => import_hooks2.useAddEntity,
26
+ useAppProvider: () => useAppProvider,
27
+ useButton: () => import_hooks2.useButton,
28
+ useCallAction: () => useCallAction,
29
+ useChangeOrderPreparationState: () => import_hooks2.useChangeOrderPreparationState,
30
+ useChangeStatus: () => import_hooks2.useChangeStatus,
31
+ useCheckPayment: () => import_hooks2.useCheckPayment,
32
+ useCompany: () => useCompany,
33
+ useConfig: () => useConfig,
34
+ useCreateEntity: () => import_hooks2.useCreateEntity,
35
+ useCreatePosConfig: () => import_hooks2.useCreatePosConfig,
36
+ useCreateSession: () => import_hooks2.useCreateSession,
37
+ useDebounce: () => useDebounce,
38
+ useDelete: () => import_hooks2.useDelete,
39
+ useDeleteComment: () => import_hooks2.useDeleteComment,
40
+ useDeleteEntity: () => import_hooks2.useDeleteEntity,
41
+ useDetail: () => useDetail,
42
+ useDuplicateRecord: () => import_hooks2.useDuplicateRecord,
43
+ useExecuteImport: () => import_hooks2.useExecuteImport,
44
+ useExportExcel: () => import_hooks2.useExportExcel,
45
+ useForgotPassword: () => import_hooks2.useForgotPassword,
46
+ useForgotPasswordSSO: () => import_hooks2.useForgotPasswordSSO,
47
+ useGenSerialNumber: () => import_hooks2.useGenSerialNumber,
48
+ useGeneratePaymentQrInfo: () => import_hooks2.useGeneratePaymentQrInfo,
49
+ useGet2FAMethods: () => import_hooks2.useGet2FAMethods,
50
+ useGetASession: () => import_hooks2.useGetASession,
51
+ useGetAccessByCode: () => import_hooks2.useGetAccessByCode,
52
+ useGetAction: () => useGetAction,
53
+ useGetActionDetail: () => import_hooks2.useGetActionDetail,
54
+ useGetAll: () => import_hooks2.useGetAll,
55
+ useGetCalendar: () => import_hooks2.useGetCalendar,
56
+ useGetComment: () => import_hooks2.useGetComment,
57
+ useGetCompanyInfo: () => import_hooks2.useGetCompanyInfo,
58
+ useGetConversionRate: () => import_hooks2.useGetConversionRate,
59
+ useGetCurrency: () => import_hooks2.useGetCurrency,
60
+ useGetCurrentCompany: () => import_hooks2.useGetCurrentCompany,
61
+ useGetDetail: () => import_hooks2.useGetDetail,
62
+ useGetExternalTabs: () => import_hooks2.useGetExternalTabs,
63
+ useGetFieldExport: () => import_hooks2.useGetFieldExport,
64
+ useGetFieldOnChange: () => import_hooks2.useGetFieldOnChange,
65
+ useGetFileExcel: () => import_hooks2.useGetFileExcel,
66
+ useGetFormView: () => import_hooks2.useGetFormView,
67
+ useGetGroups: () => import_hooks2.useGetGroups,
68
+ useGetList: () => import_hooks2.useGetList,
69
+ useGetListCompany: () => import_hooks2.useGetListCompany,
70
+ useGetListData: () => import_hooks2.useGetListData,
71
+ useGetListMyBankAccount: () => import_hooks2.useGetListMyBankAccount,
72
+ useGetMenu: () => import_hooks2.useGetMenu,
73
+ useGetOrderLine: () => import_hooks2.useGetOrderLine,
74
+ useGetPinCode: () => import_hooks2.useGetPinCode,
75
+ useGetPrintReport: () => import_hooks2.useGetPrintReport,
76
+ useGetProGressBar: () => import_hooks2.useGetProGressBar,
77
+ useGetProfile: () => import_hooks2.useGetProfile,
78
+ useGetProvider: () => import_hooks2.useGetProvider,
79
+ useGetResequence: () => import_hooks2.useGetResequence,
80
+ useGetRowIds: () => useGetRowIds,
81
+ useGetSelection: () => import_hooks2.useGetSelection,
82
+ useGetSpecification: () => useGetSpecification,
83
+ useGetUser: () => import_hooks2.useGetUser,
84
+ useGetView: () => import_hooks2.useGetView,
85
+ useGrantAccess: () => import_hooks2.useGrantAccess,
86
+ useIsValidToken: () => import_hooks2.useIsValidToken,
87
+ useListData: () => useListData,
88
+ useLoadAction: () => import_hooks2.useLoadAction,
89
+ useLoadMessage: () => import_hooks2.useLoadMessage,
90
+ useLoginCredential: () => import_hooks2.useLoginCredential,
91
+ useLoginSocial: () => import_hooks2.useLoginSocial,
92
+ useLogout: () => import_hooks2.useLogout,
93
+ useMenu: () => useMenu,
94
+ useModel: () => import_hooks2.useModel,
95
+ useOdooDataTransform: () => import_hooks2.useOdooDataTransform,
96
+ useOnChangeForm: () => import_hooks2.useOnChangeForm,
97
+ useParsePreview: () => import_hooks2.useParsePreview,
98
+ usePrint: () => import_hooks2.usePrint,
99
+ useProfile: () => useProfile,
100
+ useReadGroup: () => import_hooks2.useReadGroup,
101
+ useRemoveRow: () => import_hooks2.useRemoveRow,
102
+ useRemoveTotpSetup: () => import_hooks2.useRemoveTotpSetup,
103
+ useRequestSetupTotp: () => import_hooks2.useRequestSetupTotp,
104
+ useResetPassword: () => import_hooks2.useResetPassword,
105
+ useResetPasswordSSO: () => import_hooks2.useResetPasswordSSO,
106
+ useRunAction: () => import_hooks2.useRunAction,
107
+ useSave: () => import_hooks2.useSave,
108
+ useSendComment: () => import_hooks2.useSendComment,
109
+ useSettingsWebRead2fa: () => import_hooks2.useSettingsWebRead2fa,
110
+ useSignInSSO: () => import_hooks2.useSignInSSO,
111
+ useSwitchLocale: () => import_hooks2.useSwitchLocale,
112
+ useUpdatePassword: () => import_hooks2.useUpdatePassword,
113
+ useUploadFile: () => import_hooks2.useUploadFile,
114
+ useUploadFileExcel: () => import_hooks2.useUploadFileExcel,
115
+ useUploadIdFile: () => import_hooks2.useUploadIdFile,
116
+ useUploadImage: () => import_hooks2.useUploadImage,
117
+ useUser: () => useUser,
118
+ useValidateActionToken: () => import_hooks2.useValidateActionToken,
119
+ useVerify2FA: () => import_hooks2.useVerify2FA,
120
+ useVerifyTotp: () => import_hooks2.useVerifyTotp,
121
+ useViewV2: () => useViewV2
122
+ });
123
+ module.exports = __toCommonJS(hooks_exports);
124
+ var import_hooks2 = require("@fctc/interface-logic/hooks");
125
+
126
+ // src/hooks/core/use-app-provider.tsx
127
+ var import_react8 = require("react");
128
+
129
+ // src/hooks/core/use-menu.ts
130
+ var import_react3 = require("react");
131
+
132
+ // src/hooks/core/use-call-action.ts
133
+ var import_react = require("react");
134
+
135
+ // src/provider.ts
136
+ var provider_exports = {};
137
+ __reExport(provider_exports, require("@fctc/interface-logic/provider"));
138
+
139
+ // src/hooks/core/use-call-action.ts
140
+ var useCallAction = () => {
141
+ const { env } = (0, provider_exports.useEnv)();
142
+ const { useLoadAction: useLoadAction2, useRunAction: useRunAction2 } = (0, provider_exports.useService)();
143
+ const queryLoadAction = useLoadAction2();
144
+ const queryRunAction = useRunAction2();
145
+ const [actionData, setActionData] = (0, import_react.useState)(
146
+ void 0
147
+ );
148
+ const callAction = (0, import_react.useCallback)(
149
+ async ({
150
+ aid,
151
+ service,
152
+ xNode,
153
+ context
154
+ }) => {
155
+ try {
156
+ const menuContext = {
157
+ ...env?.context,
158
+ ...context
159
+ };
160
+ const loadRes = await queryLoadAction.mutateAsync({
161
+ idAction: aid,
162
+ context: menuContext,
163
+ service,
164
+ xNode
165
+ });
166
+ if (loadRes?.result?.type === "ir.actions.server") {
167
+ const runRes = await queryRunAction.mutateAsync({
168
+ idAction: aid,
169
+ context: menuContext,
170
+ service,
171
+ xNode
172
+ });
173
+ setActionData(runRes?.result);
174
+ return runRes?.result;
175
+ } else {
176
+ setActionData(loadRes?.result);
177
+ return loadRes?.result;
178
+ }
179
+ } catch (err) {
180
+ console.error("callAction error:", err);
181
+ return void 0;
182
+ }
183
+ },
184
+ [env?.context?.lang]
185
+ );
186
+ return [actionData, callAction];
187
+ };
188
+
189
+ // src/utils.ts
190
+ var utils_exports = {};
191
+ __export(utils_exports, {
192
+ STORAGES: () => STORAGES,
193
+ countSum: () => countSum,
194
+ guessTypeFromUrl: () => guessTypeFromUrl,
195
+ isObjectEmpty: () => isObjectEmpty,
196
+ languages: () => languages,
197
+ mergeButtons: () => mergeButtons,
198
+ setStorageItemAsync: () => setStorageItemAsync,
199
+ useStorageState: () => useStorageState
200
+ });
201
+
202
+ // src/utils/constants.ts
203
+ var languages = [
204
+ { id: "vi_VN", name: "VIE" },
205
+ { id: "en_US", name: "ENG" }
206
+ ];
207
+
208
+ // src/utils/function.ts
209
+ var import_react2 = require("react");
210
+ var countSum = (data, field) => {
211
+ if (!data || !field) return 0;
212
+ return data.reduce(
213
+ (total, item) => total + (item?.[`${field}_count`] || 0),
214
+ 0
215
+ );
216
+ };
217
+ var isObjectEmpty = (obj) => {
218
+ return Object.keys(obj).length === 0;
219
+ };
220
+ function mergeButtons(fields) {
221
+ const buttons = fields?.filter((f) => f.type_co === "button");
222
+ const others = fields?.filter((f) => f.type_co !== "button");
223
+ if (buttons?.length) {
224
+ others.push({
225
+ type_co: "buttons",
226
+ buttons
227
+ });
228
+ }
229
+ return others;
230
+ }
231
+ var STORAGES = {
232
+ TOKEN: "accessToken",
233
+ USER_INFO: "USER_INFO"
234
+ };
235
+ function useAsyncState(initialValue = [true, null]) {
236
+ return (0, import_react2.useReducer)(
237
+ (_state, action = null) => [false, action],
238
+ initialValue
239
+ );
240
+ }
241
+ async function setStorageItemAsync(key, value) {
242
+ try {
243
+ if (value === null) {
244
+ localStorage.removeItem(key);
245
+ } else {
246
+ localStorage.setItem(key, value);
247
+ }
248
+ } catch (e) {
249
+ console.error("Local storage is unavailable:", e);
250
+ }
251
+ }
252
+ function useStorageState(key) {
253
+ const [state, setState] = useAsyncState();
254
+ (0, import_react2.useEffect)(() => {
255
+ try {
256
+ const storedValue = localStorage.getItem(key);
257
+ setState(storedValue);
258
+ } catch (e) {
259
+ console.error("Local storage is unavailable:", e);
260
+ }
261
+ }, [key]);
262
+ const setValue = (0, import_react2.useCallback)(
263
+ (value) => {
264
+ setState(value);
265
+ setStorageItemAsync(key, value);
266
+ },
267
+ [key]
268
+ );
269
+ return [state, setValue];
270
+ }
271
+ var guessTypeFromUrl = (url) => {
272
+ const ext = url.split(".").pop()?.toLowerCase();
273
+ if (!ext) return null;
274
+ const map = {
275
+ jpg: "image/jpeg",
276
+ jpeg: "image/jpeg",
277
+ png: "image/png",
278
+ webp: "image/webp",
279
+ gif: "image/gif",
280
+ svg: "image/svg+xml",
281
+ bmp: "image/bmp",
282
+ tiff: "image/tiff",
283
+ pdf: "application/pdf",
284
+ zip: "application/zip",
285
+ rar: "application/x-rar-compressed",
286
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
287
+ xls: "application/vnd.ms-excel",
288
+ mp4: "video/mp4",
289
+ mov: "video/quicktime"
290
+ };
291
+ return map[ext] || null;
292
+ };
293
+
294
+ // src/utils.ts
295
+ __reExport(utils_exports, require("@fctc/interface-logic/utils"));
296
+
297
+ // src/hooks/core/use-menu.ts
298
+ var useMenu = ({
299
+ context,
300
+ specification,
301
+ domain,
302
+ defaultService
303
+ }) => {
304
+ const { useGetMenu: useGetMenu2 } = (0, provider_exports.useService)();
305
+ const [action, callAction] = useCallAction();
306
+ const [service, setService] = (0, import_react3.useState)("");
307
+ const [xNode, setXNode] = (0, import_react3.useState)("");
308
+ const menuData = useGetMenu2(
309
+ context,
310
+ specification,
311
+ !!context && !isObjectEmpty(context) && !!context?.uid && !!context?.lang,
312
+ domain,
313
+ defaultService
314
+ );
315
+ const [menuId, setMenuId] = (0, import_react3.useState)(void 0);
316
+ const handleChangeMenu = async ({
317
+ menu,
318
+ service: service2,
319
+ xNode: xNode2,
320
+ context: context2
321
+ }) => {
322
+ const aidMenu = menu?.action?.external_xml_id || menu?.action?.id?.id;
323
+ if (menu) {
324
+ setMenuId(menu.id?.toString() ?? "");
325
+ }
326
+ if (aidMenu) {
327
+ const actionResponse = await callAction({
328
+ aid: aidMenu,
329
+ service: service2 ?? "",
330
+ xNode: xNode2,
331
+ context: context2
332
+ });
333
+ setService(service2 ?? "");
334
+ setXNode(xNode2 ?? "");
335
+ return actionResponse;
336
+ }
337
+ };
338
+ return {
339
+ ...menuData,
340
+ service,
341
+ xNode,
342
+ data: menuData?.data,
343
+ action: { handleChangeMenu },
344
+ state: { menuId, action },
345
+ context,
346
+ isLoading: menuData.isLoading,
347
+ isError: menuData.isError,
348
+ error: menuData.error,
349
+ refetch: menuData.refetch
350
+ };
351
+ };
352
+
353
+ // src/hooks/core/use-detail.ts
354
+ var import_react_query = require("@tanstack/react-query");
355
+ var import_react4 = require("react");
356
+ var useDetail = (sub) => {
357
+ const { setUserInfo, env } = (0, provider_exports.useEnv)();
358
+ const { useGetDetail: useGetDetail2 } = (0, provider_exports.useService)();
359
+ const fetchGetDetail = useGetDetail2();
360
+ const userDetailQuery = (0, import_react_query.useQuery)({
361
+ queryKey: ["userDetailQuery", sub],
362
+ queryFn: () => {
363
+ return fetchGetDetail.mutateAsync({
364
+ model: "res.users",
365
+ ids: [sub],
366
+ specification: { image_256: {} },
367
+ service: env?.default_service
368
+ });
369
+ },
370
+ enabled: !!sub
371
+ });
372
+ (0, import_react4.useEffect)(() => {
373
+ if (userDetailQuery.data) {
374
+ const userPicture = userDetailQuery.data;
375
+ setUserInfo({ ...env?.user, image: userPicture?.[0]?.image_256 });
376
+ }
377
+ }, [userDetailQuery.isFetched]);
378
+ return { ...userDetailQuery };
379
+ };
380
+
381
+ // src/hooks/core/use-profile.ts
382
+ var import_react_query2 = require("@tanstack/react-query");
383
+ var import_react5 = require("react");
384
+ var useProfile = ({
385
+ service,
386
+ i18n
387
+ }) => {
388
+ const { setUid, setLang, setUserInfo, env } = (0, provider_exports.useEnv)();
389
+ const { useGetProfile: useGetProfile2 } = (0, provider_exports.useService)();
390
+ const getProfile = useGetProfile2(service);
391
+ const userInfoQuery = (0, import_react_query2.useQuery)({
392
+ queryKey: ["userInfo"],
393
+ queryFn: () => getProfile.mutateAsync(),
394
+ enabled: isObjectEmpty(env?.user)
395
+ });
396
+ (0, import_react5.useEffect)(() => {
397
+ if (userInfoQuery.data) {
398
+ const userInfo = userInfoQuery.data;
399
+ utils_exports.sessionStorageUtils.setXNode(userInfo?.x_node);
400
+ setUid(userInfo?.sub);
401
+ setUserInfo(userInfo);
402
+ const userLocale = languages.find((lang) => lang?.id === userInfo?.locale);
403
+ setLang(userLocale?.id);
404
+ i18n.changeLanguage(userLocale?.id.split("_")[0]);
405
+ }
406
+ }, [userInfoQuery.isFetched]);
407
+ const context = (0, import_react5.useMemo)(() => {
408
+ if (userInfoQuery.data?.sub && userInfoQuery.data?.locale) {
409
+ return {
410
+ uid: Number(userInfoQuery.data.sub),
411
+ lang: String(userInfoQuery.data.locale),
412
+ tz: "Asia/Saigon"
413
+ };
414
+ }
415
+ return void 0;
416
+ }, [userInfoQuery.isFetched]);
417
+ if (userInfoQuery.isLoading || !userInfoQuery.data) {
418
+ return null;
419
+ }
420
+ return {
421
+ ...userInfoQuery,
422
+ context
423
+ };
424
+ };
425
+
426
+ // src/hooks/core/use-user.ts
427
+ var useUser = ({ service, i18n }) => {
428
+ const userProfile = useProfile({ service, i18n });
429
+ const userDetail = useDetail(userProfile?.data?.sub);
430
+ return { userProfile, userDetail, context: userProfile?.context };
431
+ };
432
+
433
+ // src/hooks/core/use-view-v2.ts
434
+ var import_react6 = require("react");
435
+ var useViewV2 = ({
436
+ action,
437
+ context,
438
+ aid,
439
+ service,
440
+ xNode
441
+ }) => {
442
+ const { useGetView: useGetView2 } = (0, provider_exports.useService)();
443
+ const viewParams = (0, import_react6.useMemo)(() => {
444
+ if (!action || !action?.res_model) {
445
+ return void 0;
446
+ }
447
+ const actionResult = action;
448
+ return {
449
+ aid,
450
+ model: String(actionResult?.res_model),
451
+ views: [
452
+ ...Array.isArray(actionResult?.views) ? actionResult?.views.map(
453
+ (view2) => view2[1] === "list" ? [view2[0], "list"] : view2
454
+ ) : [],
455
+ [
456
+ Array.isArray(actionResult?.search_view_id) ? actionResult?.search_view_id[0] : actionResult?.search_view_id,
457
+ "search"
458
+ ]
459
+ ],
460
+ context,
461
+ id: isNaN(Number(aid)) ? action?.id : aid,
462
+ service,
463
+ xNode
464
+ };
465
+ }, [action, context, aid]);
466
+ const view = useGetView2({
467
+ viewParams: viewParams ?? {},
468
+ enabled: !!viewParams
469
+ });
470
+ return {
471
+ ...view,
472
+ context
473
+ };
474
+ };
475
+
476
+ // src/hooks/core/use-company.ts
477
+ var import_react_query3 = require("@tanstack/react-query");
478
+ var import_react7 = require("react");
479
+ var useCompany = ({ service }) => {
480
+ const { setCompanies, setDefaultCompany, env } = (0, provider_exports.useEnv)();
481
+ const { useGetCurrentCompany: useGetCurrentCompany2, useGetCompanyInfo: useGetCompanyInfo2 } = (0, provider_exports.useService)();
482
+ const getCurrentCompany = useGetCurrentCompany2();
483
+ const fetchCurrentCompany = async () => {
484
+ return await getCurrentCompany.mutateAsync({
485
+ service
486
+ });
487
+ };
488
+ const currentCompany = (0, import_react_query3.useQuery)({
489
+ queryKey: ["currentCompany"],
490
+ queryFn: fetchCurrentCompany,
491
+ enabled: !!env?.defaultCompany
492
+ });
493
+ const current_company_id = (0, import_react7.useMemo)(() => {
494
+ return currentCompany.data?.current_company_id;
495
+ }, [currentCompany.data]);
496
+ (0, import_react7.useEffect)(() => {
497
+ if (current_company_id) {
498
+ const companyIDs = [current_company_id];
499
+ setCompanies(companyIDs);
500
+ }
501
+ }, [current_company_id]);
502
+ const getCompanyInfo = useGetCompanyInfo2();
503
+ const companyInfo = (0, import_react_query3.useQuery)({
504
+ queryKey: ["companyInfoQuery", current_company_id],
505
+ queryFn: () => getCompanyInfo.mutateAsync({
506
+ service,
507
+ id: Number(current_company_id)
508
+ }),
509
+ enabled: !!current_company_id
510
+ });
511
+ (0, import_react7.useEffect)(() => {
512
+ if (companyInfo.data) {
513
+ const companyInfoData = companyInfo.data;
514
+ if (companyInfoData?.length) {
515
+ setDefaultCompany(companyInfoData[0]);
516
+ }
517
+ }
518
+ }, [companyInfo.data]);
519
+ if (!companyInfo?.data || !currentCompany?.data) return;
520
+ return {
521
+ currentCompany: { ...currentCompany },
522
+ companyInfo: { ...companyInfo }
523
+ };
524
+ };
525
+
526
+ // src/hooks/core/use-app-provider.tsx
527
+ var import_jsx_runtime = require("react/jsx-runtime");
528
+ var AppProviderInitialValue = {
529
+ user: {},
530
+ company: {},
531
+ action: {},
532
+ menu: {},
533
+ view: {}
534
+ };
535
+ var ReactContext = (0, import_react8.createContext)(AppProviderInitialValue);
536
+ var AppProvider = ({
537
+ children,
538
+ menuParams,
539
+ aid,
540
+ i18n
541
+ }) => {
542
+ const { env } = (0, provider_exports.useEnv)();
543
+ const user = useUser({ service: env.default_service, i18n });
544
+ const company = useCompany({ service: env.default_service });
545
+ const menuContext = (0, import_react8.useMemo)(() => {
546
+ return (0, utils_exports.combineContexts)([
547
+ {
548
+ ...user?.context,
549
+ ...!isObjectEmpty(env?.user) ? { lang: env?.context?.lang } : {},
550
+ ...menuParams?.context ?? {}
551
+ }
552
+ ]);
553
+ }, [user?.context, company?.companyInfo?.isFetched, env?.context?.lang]);
554
+ const menu = useMenu({
555
+ context: {
556
+ ...menuContext
557
+ },
558
+ specification: menuParams?.specification,
559
+ domain: menuParams?.domain,
560
+ defaultService: env.default_service
561
+ });
562
+ const action = (0, import_react8.useMemo)(() => {
563
+ return menu?.state?.action;
564
+ }, [menu?.state?.action, env?.context?.lang]);
565
+ const viewContext = (0, import_react8.useMemo)(() => {
566
+ return (0, utils_exports.combineContexts)([
567
+ menuContext,
568
+ { ...(0, utils_exports.evalJSONContext)(action?.context) }
569
+ ]);
570
+ }, [menuContext, action?.context, env?.context?.lang]);
571
+ const view = useViewV2({
572
+ action,
573
+ context: viewContext,
574
+ aid,
575
+ service: menu?.service,
576
+ xNode: menu?.xNode
577
+ });
578
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
579
+ ReactContext.Provider,
580
+ {
581
+ value: {
582
+ user,
583
+ company,
584
+ menu,
585
+ action,
586
+ view
587
+ },
588
+ children
589
+ }
590
+ );
591
+ };
592
+ var useAppProvider = () => {
593
+ const context = (0, import_react8.useContext)(ReactContext);
594
+ if (!context) {
595
+ return AppProviderInitialValue;
596
+ }
597
+ return context;
598
+ };
599
+
600
+ // src/hooks/core/use-config.ts
601
+ var import_react9 = require("react");
602
+ var useConfig = ({
603
+ envConfig,
604
+ config,
605
+ localStorageUtils,
606
+ sessionStorageUtils: sessionStorageUtils2
607
+ }) => {
608
+ const { setupEnv, setEnvFile } = (0, provider_exports.useEnv)();
609
+ (0, import_react9.useEffect)(() => {
610
+ try {
611
+ setupEnv({
612
+ baseUrl: envConfig.baseUrl,
613
+ config: envConfig.config,
614
+ default_service: "",
615
+ localStorageUtils: localStorageUtils && localStorageUtils(),
616
+ sessionStorageUtils: localStorageUtils && sessionStorageUtils2()
617
+ });
618
+ setEnvFile(config);
619
+ } catch (error) {
620
+ console.error("Error loading env or config:", error);
621
+ }
622
+ }, [envConfig, config]);
623
+ return { envConfig, config };
624
+ };
625
+
626
+ // src/hooks/core/use-get-action.ts
627
+ var useGetAction = ({
628
+ aid,
629
+ context
630
+ }) => {
631
+ const { useLoadAction: useLoadAction2, useRunAction: useRunAction2 } = (0, provider_exports.useService)();
632
+ const queryLoadAction = useLoadAction2();
633
+ const queryRunAction = useRunAction2();
634
+ const handleActionResult = (data) => {
635
+ if (data && data.result && data.result.views && Array.isArray(data.result.views) && data.result.views.length > 0) {
636
+ }
637
+ };
638
+ const onLoadAction = () => {
639
+ queryLoadAction.mutate(
640
+ {
641
+ idAction: aid,
642
+ context
643
+ },
644
+ {
645
+ onSuccess: (data) => {
646
+ if (data?.result?.type === "ir.actions.act_window") {
647
+ handleActionResult(data);
648
+ } else if (data?.result?.type === "ir.actions.server") {
649
+ queryRunAction.mutate(
650
+ {
651
+ idAction: aid,
652
+ context
653
+ },
654
+ {
655
+ onSuccess: handleActionResult
656
+ }
657
+ );
658
+ }
659
+ }
660
+ }
661
+ );
662
+ };
663
+ return {
664
+ onLoadAction
665
+ };
666
+ };
667
+
668
+ // src/hooks/core/use-get-specification.ts
669
+ var import_react10 = require("react");
670
+ var useGetSpecification = ({
671
+ model,
672
+ viewData,
673
+ fields
674
+ }) => {
675
+ const baseModel = (0, import_react10.useMemo)(
676
+ () => ({
677
+ name: String(model),
678
+ view: viewData,
679
+ fields
680
+ }),
681
+ [model, viewData, fields]
682
+ );
683
+ const initModel = (0, import_hooks2.useModel)();
684
+ const modelInstance = (0, import_react10.useMemo)(() => {
685
+ if (viewData) {
686
+ return initModel.initModel(baseModel);
687
+ }
688
+ return null;
689
+ }, [baseModel, viewData, model]);
690
+ const specification = (0, import_react10.useMemo)(() => {
691
+ if (modelInstance) {
692
+ return modelInstance.getSpecification();
693
+ }
694
+ return null;
695
+ }, [modelInstance, model]);
696
+ return { specification };
697
+ };
698
+
699
+ // src/hooks/core/use-list-data.ts
700
+ var import_react13 = require("react");
701
+
702
+ // src/hooks/utils/use-debounce.ts
703
+ var import_react11 = require("react");
704
+ function useDebounce(value, delay) {
705
+ const [debouncedValue, setDebouncedValue] = (0, import_react11.useState)(value);
706
+ (0, import_react11.useEffect)(() => {
707
+ const handler = setTimeout(() => {
708
+ setDebouncedValue(value);
709
+ }, delay);
710
+ return () => {
711
+ clearTimeout(handler);
712
+ };
713
+ }, [value, delay]);
714
+ return [debouncedValue];
715
+ }
716
+
717
+ // src/hooks/utils/use-get-rowids.ts
718
+ var import_react12 = require("react");
719
+ var useGetRowIds = (tableRef) => {
720
+ function isElementVisible(el) {
721
+ const style = window.getComputedStyle(el);
722
+ return style.display !== "none" && style.visibility !== "hidden" && style.opacity !== "0";
723
+ }
724
+ function arraysAreEqual(a, b) {
725
+ if (a.length !== b.length) return false;
726
+ if (a.length === 0 && b.length === 0) return true;
727
+ const setA = new Set(a);
728
+ const setB = new Set(b);
729
+ if (setA.size !== setB.size) return false;
730
+ for (const val of setA) {
731
+ if (!setB.has(val)) return false;
732
+ }
733
+ return true;
734
+ }
735
+ const [rowIds, setRowIds] = (0, import_react12.useState)([]);
736
+ const lastRowIdsRef = (0, import_react12.useRef)([]);
737
+ const updateVisibleRowIds = (0, import_react12.useCallback)(() => {
738
+ const table = tableRef.current;
739
+ if (!table) return;
740
+ const rows = table.querySelectorAll("tr[data-row-id]");
741
+ const ids = [];
742
+ rows.forEach((row) => {
743
+ const el = row;
744
+ if (isElementVisible(el)) {
745
+ const id = el.getAttribute("data-row-id");
746
+ if (id) ids.push(id);
747
+ }
748
+ });
749
+ const uniqueIds = Array.from(new Set(ids));
750
+ if (!arraysAreEqual(lastRowIdsRef.current, uniqueIds)) {
751
+ lastRowIdsRef.current = uniqueIds;
752
+ setRowIds(uniqueIds);
753
+ }
754
+ }, [tableRef]);
755
+ (0, import_react12.useEffect)(() => {
756
+ const table = tableRef.current;
757
+ if (!table) return;
758
+ const mutationObserver = new MutationObserver(() => {
759
+ updateVisibleRowIds();
760
+ });
761
+ mutationObserver.observe(table, {
762
+ childList: true,
763
+ subtree: true,
764
+ attributes: true,
765
+ attributeFilter: ["style", "class"]
766
+ });
767
+ const resizeObserver = new ResizeObserver(() => {
768
+ updateVisibleRowIds();
769
+ });
770
+ resizeObserver.observe(table);
771
+ const handleScroll = () => updateVisibleRowIds();
772
+ table.addEventListener("scroll", handleScroll, true);
773
+ updateVisibleRowIds();
774
+ return () => {
775
+ mutationObserver.disconnect();
776
+ resizeObserver.disconnect();
777
+ table.removeEventListener("scroll", handleScroll, true);
778
+ };
779
+ }, [updateVisibleRowIds, tableRef?.current]);
780
+ return { rowIds, refresh: updateVisibleRowIds };
781
+ };
782
+
783
+ // src/hooks/core/use-list-data.ts
784
+ var useListData = ({
785
+ action,
786
+ context,
787
+ viewData,
788
+ model,
789
+ service,
790
+ xNode,
791
+ mode,
792
+ limit = 10
793
+ }) => {
794
+ const { useGetListData: useGetListData2 } = (0, provider_exports.useService)();
795
+ const [page, setPage] = (0, import_react13.useState)(0);
796
+ const [pageLimit, setPageLimit] = (0, import_react13.useState)(limit);
797
+ const [groupByList, setGroupByList] = (0, import_react13.useState)(null);
798
+ const [domain, setDomain] = (0, import_react13.useState)(null);
799
+ const [order, setOrder] = (0, import_react13.useState)("");
800
+ const [selectedRowKeys, setSelectedRowKeys] = (0, import_react13.useState)([]);
801
+ const [debouncedPage] = useDebounce(page, 500);
802
+ const [debouncedDomain] = useDebounce(domain, 500);
803
+ const { specification } = useGetSpecification({
804
+ model,
805
+ viewData,
806
+ fields: mode === "kanban" ? viewData?.views?.kanban?.fields : viewData?.views?.list?.fields
807
+ });
808
+ const listDataProps = (0, import_react13.useMemo)(() => {
809
+ if (!viewData || !action || !context) {
810
+ return null;
811
+ }
812
+ const domainParse = domain ? [...domain] : action?.domain ? Array.isArray(action?.domain) ? [...action?.domain] : (0, utils_exports.evalJSONDomain)(action?.domain, context) : [];
813
+ const limit2 = pageLimit;
814
+ const offset = debouncedPage * pageLimit;
815
+ const fields = typeof groupByList === "object" ? groupByList?.fields : void 0;
816
+ const groupby = typeof groupByList === "object" ? [groupByList?.contexts?.[0]?.group_by] : [];
817
+ const sort = order ?? (0, utils_exports.formatSortingString)(
818
+ (mode === "kanban" ? viewData?.views?.kanban : viewData?.views?.list)?.default_order
819
+ ) ?? "";
820
+ return {
821
+ model: action?.res_model,
822
+ specification,
823
+ domain: domainParse,
824
+ limit: limit2,
825
+ offset,
826
+ fields,
827
+ groupby,
828
+ context,
829
+ sort,
830
+ mode
831
+ };
832
+ }, [
833
+ action,
834
+ groupByList,
835
+ order,
836
+ debouncedPage,
837
+ pageLimit,
838
+ debouncedDomain,
839
+ context,
840
+ model
841
+ ]);
842
+ const list = useGetListData2(
843
+ { ...listDataProps },
844
+ [
845
+ listDataProps?.domain,
846
+ listDataProps?.groupby,
847
+ listDataProps?.limit,
848
+ listDataProps?.offset,
849
+ listDataProps?.sort,
850
+ listDataProps?.context,
851
+ listDataProps?.specification,
852
+ listDataProps?.mode
853
+ ],
854
+ !!listDataProps && !!specification && !isObjectEmpty(specification) && !!domain,
855
+ service,
856
+ xNode
857
+ );
858
+ return {
859
+ ...list,
860
+ state: {
861
+ specification,
862
+ page,
863
+ order,
864
+ domain: listDataProps?.domain,
865
+ pageLimit,
866
+ groupByList,
867
+ selectedRowKeys,
868
+ setPage,
869
+ setOrder,
870
+ setDomain,
871
+ setPageLimit,
872
+ setGroupByList,
873
+ setSelectedRowKeys
874
+ }
875
+ };
876
+ };
877
+ // Annotate the CommonJS export names for ESM import in node:
878
+ 0 && (module.exports = {
879
+ AppProvider,
880
+ useAddEntity,
881
+ useAppProvider,
882
+ useButton,
883
+ useCallAction,
884
+ useChangeOrderPreparationState,
885
+ useChangeStatus,
886
+ useCheckPayment,
887
+ useCompany,
888
+ useConfig,
889
+ useCreateEntity,
890
+ useCreatePosConfig,
891
+ useCreateSession,
892
+ useDebounce,
893
+ useDelete,
894
+ useDeleteComment,
895
+ useDeleteEntity,
896
+ useDetail,
897
+ useDuplicateRecord,
898
+ useExecuteImport,
899
+ useExportExcel,
900
+ useForgotPassword,
901
+ useForgotPasswordSSO,
902
+ useGenSerialNumber,
903
+ useGeneratePaymentQrInfo,
904
+ useGet2FAMethods,
905
+ useGetASession,
906
+ useGetAccessByCode,
907
+ useGetAction,
908
+ useGetActionDetail,
909
+ useGetAll,
910
+ useGetCalendar,
911
+ useGetComment,
912
+ useGetCompanyInfo,
913
+ useGetConversionRate,
914
+ useGetCurrency,
915
+ useGetCurrentCompany,
916
+ useGetDetail,
917
+ useGetExternalTabs,
918
+ useGetFieldExport,
919
+ useGetFieldOnChange,
920
+ useGetFileExcel,
921
+ useGetFormView,
922
+ useGetGroups,
923
+ useGetList,
924
+ useGetListCompany,
925
+ useGetListData,
926
+ useGetListMyBankAccount,
927
+ useGetMenu,
928
+ useGetOrderLine,
929
+ useGetPinCode,
930
+ useGetPrintReport,
931
+ useGetProGressBar,
932
+ useGetProfile,
933
+ useGetProvider,
934
+ useGetResequence,
935
+ useGetRowIds,
936
+ useGetSelection,
937
+ useGetSpecification,
938
+ useGetUser,
939
+ useGetView,
940
+ useGrantAccess,
941
+ useIsValidToken,
942
+ useListData,
943
+ useLoadAction,
944
+ useLoadMessage,
945
+ useLoginCredential,
946
+ useLoginSocial,
947
+ useLogout,
948
+ useMenu,
949
+ useModel,
950
+ useOdooDataTransform,
951
+ useOnChangeForm,
952
+ useParsePreview,
953
+ usePrint,
954
+ useProfile,
955
+ useReadGroup,
956
+ useRemoveRow,
957
+ useRemoveTotpSetup,
958
+ useRequestSetupTotp,
959
+ useResetPassword,
960
+ useResetPasswordSSO,
961
+ useRunAction,
962
+ useSave,
963
+ useSendComment,
964
+ useSettingsWebRead2fa,
965
+ useSignInSSO,
966
+ useSwitchLocale,
967
+ useUpdatePassword,
968
+ useUploadFile,
969
+ useUploadFileExcel,
970
+ useUploadIdFile,
971
+ useUploadImage,
972
+ useUser,
973
+ useValidateActionToken,
974
+ useVerify2FA,
975
+ useVerifyTotp,
976
+ useViewV2
977
+ });