@fctc/widget-logic 2.4.3 → 2.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -41,7 +41,7 @@ var require_moment = __commonJS({
41
41
  "use strict";
42
42
  (function(global, factory) {
43
43
  typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.moment = factory();
44
- })(exports, function() {
44
+ })(exports, (function() {
45
45
  "use strict";
46
46
  var hookCallback;
47
47
  function hooks() {
@@ -59,7 +59,7 @@ var require_moment = __commonJS({
59
59
  function hasOwnProp(a, b) {
60
60
  return Object.prototype.hasOwnProperty.call(a, b);
61
61
  }
62
- function isObjectEmpty(obj) {
62
+ function isObjectEmpty4(obj) {
63
63
  if (Object.getOwnPropertyNames) {
64
64
  return Object.getOwnPropertyNames(obj).length === 0;
65
65
  } else {
@@ -2198,7 +2198,7 @@ var require_moment = __commonJS({
2198
2198
  strict = locale2;
2199
2199
  locale2 = void 0;
2200
2200
  }
2201
- if (isObject(input) && isObjectEmpty(input) || isArray(input) && input.length === 0) {
2201
+ if (isObject(input) && isObjectEmpty4(input) || isArray(input) && input.length === 0) {
2202
2202
  input = void 0;
2203
2203
  }
2204
2204
  c._isAMomentObject = true;
@@ -2617,7 +2617,7 @@ var require_moment = __commonJS({
2617
2617
  return isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === void 0;
2618
2618
  }
2619
2619
  function isMomentInputObject(input) {
2620
- var objectTest = isObject(input) && !isObjectEmpty(input), propertyTest = false, properties = [
2620
+ var objectTest = isObject(input) && !isObjectEmpty4(input), propertyTest = false, properties = [
2621
2621
  "years",
2622
2622
  "year",
2623
2623
  "y",
@@ -2659,7 +2659,7 @@ var require_moment = __commonJS({
2659
2659
  return arrayTest && dataTypeTest;
2660
2660
  }
2661
2661
  function isCalendarSpec(input) {
2662
- var objectTest = isObject(input) && !isObjectEmpty(input), propertyTest = false, properties = [
2662
+ var objectTest = isObject(input) && !isObjectEmpty4(input), propertyTest = false, properties = [
2663
2663
  "sameDay",
2664
2664
  "nextDay",
2665
2665
  "lastDay",
@@ -4032,15 +4032,13 @@ var require_moment = __commonJS({
4032
4032
  // <input type="month" />
4033
4033
  };
4034
4034
  return hooks;
4035
- });
4035
+ }));
4036
4036
  }
4037
4037
  });
4038
4038
 
4039
4039
  // src/index.ts
4040
4040
  var index_exports = {};
4041
4041
  __export(index_exports, {
4042
- API_APP_URL: () => API_APP_URL,
4043
- API_PRESCHOOL_URL: () => API_PRESCHOOL_URL,
4044
4042
  AppProvider: () => AppProvider,
4045
4043
  CheckIcon: () => CheckIcon,
4046
4044
  ChevronBottomIcon: () => ChevronBottomIcon,
@@ -4076,136 +4074,277 @@ __export(index_exports, {
4076
4074
  tableGroupController: () => tableGroupController,
4077
4075
  tableHeadController: () => tableHeadController,
4078
4076
  useAppProvider: () => useAppProvider,
4079
- useAuth: () => useAuth,
4077
+ useButton: () => useButton,
4080
4078
  useCallAction: () => useCallAction,
4079
+ useChangeStatus: () => useChangeStatus,
4081
4080
  useClickOutside: () => useClickOutside,
4081
+ useCompany: () => useCompany,
4082
4082
  useConfig: () => useConfig,
4083
4083
  useDebounce: () => useDebounce,
4084
+ useDelete: () => useDelete,
4085
+ useDeleteComment: () => useDeleteComment,
4084
4086
  useDetail: () => useDetail,
4087
+ useDuplicateRecord: () => useDuplicateRecord,
4088
+ useExecuteImport: () => useExecuteImport,
4089
+ useExportExcel: () => useExportExcel,
4090
+ useForgotPassword: () => useForgotPassword,
4091
+ useForgotPasswordSSO: () => useForgotPasswordSSO,
4092
+ useGet2FAMethods: () => useGet2FAMethods,
4093
+ useGetAccessByCode: () => useGetAccessByCode,
4094
+ useGetAction: () => useGetAction,
4095
+ useGetActionDetail: () => useGetActionDetail,
4096
+ useGetAll: () => useGetAll,
4097
+ useGetCalendar: () => useGetCalendar,
4098
+ useGetComment: () => useGetComment,
4099
+ useGetCompanyInfo: () => useGetCompanyInfo,
4100
+ useGetConversionRate: () => useGetConversionRate,
4101
+ useGetCurrency: () => useGetCurrency,
4102
+ useGetCurrentCompany: () => useGetCurrentCompany,
4103
+ useGetDetail: () => useGetDetail,
4104
+ useGetFieldExport: () => useGetFieldExport,
4105
+ useGetFieldOnChange: () => useGetFieldOnChange,
4106
+ useGetFileExcel: () => useGetFileExcel,
4107
+ useGetFormView: () => useGetFormView,
4108
+ useGetGroups: () => useGetGroups,
4109
+ useGetImage: () => useGetImage,
4110
+ useGetListCompany: () => useGetListCompany,
4111
+ useGetListData: () => useGetListData,
4112
+ useGetListMyBankAccount: () => useGetListMyBankAccount,
4113
+ useGetMenu: () => useGetMenu,
4114
+ useGetPrintReport: () => useGetPrintReport,
4115
+ useGetProGressBar: () => useGetProGressBar,
4116
+ useGetProfile: () => useGetProfile,
4117
+ useGetProvider: () => useGetProvider,
4118
+ useGetResequence: () => useGetResequence,
4085
4119
  useGetRowIds: () => useGetRowIds,
4120
+ useGetSelection: () => useGetSelection,
4121
+ useGetSpecification: () => useGetSpecification,
4122
+ useGetUser: () => useGetUser,
4123
+ useGetView: () => useGetView,
4124
+ useGrantAccess: () => useGrantAccess,
4125
+ useIsValidToken: () => useIsValidToken,
4086
4126
  useListData: () => useListData,
4127
+ useLoadAction: () => useLoadAction,
4128
+ useLoadMessage: () => useLoadMessage,
4129
+ useLoginCredential: () => useLoginCredential,
4130
+ useLoginSocial: () => useLoginSocial,
4131
+ useLogout: () => useLogout,
4087
4132
  useMenu: () => useMenu,
4088
- useMenuItem: () => useMenuItem,
4133
+ useModel: () => useModel,
4134
+ useOdooDataTransform: () => useOdooDataTransform,
4135
+ useOnChangeForm: () => useOnChangeForm,
4136
+ useParsePreview: () => useParsePreview,
4137
+ usePrint: () => usePrint,
4089
4138
  useProfile: () => useProfile,
4139
+ useRemoveRow: () => useRemoveRow,
4140
+ useRemoveTotpSetup: () => useRemoveTotpSetup,
4141
+ useRequestSetupTotp: () => useRequestSetupTotp,
4142
+ useResetPassword: () => useResetPassword,
4143
+ useResetPasswordSSO: () => useResetPasswordSSO,
4144
+ useRunAction: () => useRunAction,
4145
+ useSave: () => useSave,
4146
+ useSendComment: () => useSendComment,
4147
+ useSettingsWebRead2fa: () => useSettingsWebRead2fa,
4148
+ useSignInSSO: () => useSignInSSO,
4090
4149
  useStorageState: () => useStorageState,
4150
+ useSwitchLocale: () => useSwitchLocale,
4151
+ useUpdatePassword: () => useUpdatePassword,
4152
+ useUploadFile: () => useUploadFile,
4153
+ useUploadFileExcel: () => useUploadFileExcel,
4154
+ useUploadIdFile: () => useUploadIdFile,
4155
+ useUploadImage: () => useUploadImage,
4091
4156
  useUser: () => useUser,
4157
+ useValidateActionToken: () => useValidateActionToken,
4158
+ useVerify2FA: () => useVerify2FA,
4159
+ useVerifyTotp: () => useVerifyTotp,
4092
4160
  useViewV2: () => useViewV2
4093
4161
  });
4094
4162
 
4095
4163
  // src/hooks.ts
4096
- var hooks_exports = {};
4097
- __export(hooks_exports, {
4098
- AppProvider: () => AppProvider,
4099
- useAppProvider: () => useAppProvider,
4100
- useAuth: () => useAuth,
4101
- useCallAction: () => useCallAction,
4102
- useClickOutside: () => useClickOutside,
4103
- useConfig: () => useConfig,
4104
- useDebounce: () => useDebounce,
4105
- useDetail: () => useDetail,
4106
- useGetRowIds: () => useGetRowIds,
4107
- useListData: () => useListData,
4108
- useMenu: () => useMenu,
4109
- useMenuItem: () => useMenuItem,
4110
- useProfile: () => useProfile,
4111
- useUser: () => useUser,
4112
- useViewV2: () => useViewV2
4113
- });
4164
+ import {
4165
+ useModel,
4166
+ useButton,
4167
+ useChangeStatus,
4168
+ useDelete,
4169
+ useDeleteComment,
4170
+ useDuplicateRecord,
4171
+ useExecuteImport,
4172
+ useExportExcel,
4173
+ useForgotPassword,
4174
+ useForgotPasswordSSO,
4175
+ useGet2FAMethods,
4176
+ useGetAccessByCode,
4177
+ useGetActionDetail,
4178
+ useGetAll,
4179
+ useGetCalendar,
4180
+ useGetComment,
4181
+ useGetCompanyInfo,
4182
+ useGetConversionRate,
4183
+ useGetCurrency,
4184
+ useGetCurrentCompany,
4185
+ useGetDetail,
4186
+ useGetFieldExport,
4187
+ useGetFieldOnChange,
4188
+ useGetFileExcel,
4189
+ useGetFormView,
4190
+ useGetGroups,
4191
+ useGetImage,
4192
+ useGetListCompany,
4193
+ useGetListData,
4194
+ useGetListMyBankAccount,
4195
+ useGetMenu,
4196
+ useGetPrintReport,
4197
+ useGetProGressBar,
4198
+ useGetProfile,
4199
+ useGetProvider,
4200
+ useGetResequence,
4201
+ useGetSelection,
4202
+ useGetUser,
4203
+ useGetView,
4204
+ useGrantAccess,
4205
+ useIsValidToken,
4206
+ useLoadAction,
4207
+ useLoadMessage,
4208
+ useLoginCredential,
4209
+ useLoginSocial,
4210
+ useLogout,
4211
+ useOdooDataTransform,
4212
+ useOnChangeForm,
4213
+ useParsePreview,
4214
+ usePrint,
4215
+ useRemoveRow,
4216
+ useRemoveTotpSetup,
4217
+ useRequestSetupTotp,
4218
+ useResetPassword,
4219
+ useResetPasswordSSO,
4220
+ useRunAction,
4221
+ useSave,
4222
+ useSendComment,
4223
+ useSettingsWebRead2fa,
4224
+ useSignInSSO,
4225
+ useSwitchLocale,
4226
+ useUpdatePassword,
4227
+ useUploadFile,
4228
+ useUploadFileExcel,
4229
+ useUploadIdFile,
4230
+ useUploadImage,
4231
+ useValidateActionToken,
4232
+ useVerify2FA,
4233
+ useVerifyTotp
4234
+ } from "@fctc/interface-logic/hooks";
4235
+
4236
+ // src/hooks/core/use-app-provider.tsx
4237
+ import { createContext, useContext, useMemo as useMemo5 } from "react";
4238
+
4239
+ // src/hooks/core/use-menu.ts
4240
+ import { useMemo, useState as useState2 } from "react";
4241
+
4242
+ // src/hooks/core/use-call-action.ts
4243
+ import { useCallback, useState } from "react";
4244
+
4245
+ // src/provider.ts
4246
+ var provider_exports = {};
4247
+ __reExport(provider_exports, provider_star);
4248
+ import * as provider_star from "@fctc/interface-logic/provider";
4114
4249
 
4115
4250
  // src/hooks/core/use-call-action.ts
4116
- import { useState } from "react";
4117
- import { getEnv } from "@fctc/interface-logic/environment";
4118
- import { useLoadAction, useRunAction } from "@fctc/interface-logic/hooks";
4119
4251
  var useCallAction = () => {
4120
- const queryLoadAction = useLoadAction();
4121
- const queryRunAction = useRunAction();
4122
- const [data, setData] = useState(void 0);
4123
- const callAction = async ({
4124
- aid,
4125
- actionType = "ir.actions.act_window"
4126
- }) => {
4127
- const context = getEnv().context;
4128
- let res = void 0;
4129
- if (actionType === "ir.actions.act_window") {
4130
- res = await queryLoadAction.mutateAsync({
4131
- idAction: aid,
4132
- context
4133
- });
4134
- } else if (actionType === "ir.actions.server") {
4135
- res = await queryRunAction.mutateAsync({
4136
- idAction: aid,
4137
- context
4138
- });
4139
- }
4140
- setData(res);
4141
- return res;
4142
- };
4143
- return [data, callAction];
4252
+ const { env } = (0, provider_exports.useEnv)();
4253
+ const { useLoadAction: useLoadAction2, useRunAction: useRunAction2 } = (0, provider_exports.useService)();
4254
+ const queryLoadAction = useLoadAction2();
4255
+ const queryRunAction = useRunAction2();
4256
+ const [actionData, setActionData] = useState(
4257
+ void 0
4258
+ );
4259
+ const callAction = useCallback(
4260
+ async ({
4261
+ aid
4262
+ }) => {
4263
+ try {
4264
+ const loadRes = await queryLoadAction.mutateAsync({
4265
+ idAction: aid,
4266
+ context: env.context
4267
+ });
4268
+ if (loadRes?.result?.type === "ir.actions.server") {
4269
+ const runRes = await queryRunAction.mutateAsync({
4270
+ idAction: aid,
4271
+ context: env.context
4272
+ });
4273
+ setActionData(runRes?.result);
4274
+ return runRes?.result;
4275
+ } else {
4276
+ setActionData(loadRes?.result);
4277
+ return loadRes?.result;
4278
+ }
4279
+ } catch (err) {
4280
+ console.error("callAction error:", err);
4281
+ return void 0;
4282
+ }
4283
+ },
4284
+ [env?.context?.lang]
4285
+ );
4286
+ return [actionData, callAction];
4144
4287
  };
4145
4288
 
4146
- // src/hooks/core/use-config.ts
4147
- import { useEffect, useMemo } from "react";
4148
- import { getEnv as getEnv2 } from "@fctc/interface-logic/environment";
4149
- import { useAppDispatch, setEnvFile } from "@fctc/interface-logic/store";
4150
- var useConfig = ({ localStorageUtils, sessionStorageUtils }) => {
4151
- const dispatch = useAppDispatch();
4152
- const envConfig = useMemo(() => {
4153
- return {
4154
- mode: "development",
4155
- baseUrl: "https://api.vitrust.app/c2/api/v2",
4156
- config: {
4157
- grantType: "password",
4158
- clientId: "C52foVQSMpnNOcAP2CBIIkupOSfxUarF8nlOPfXM",
4159
- clientSecret: "rColINr4a9QBFQPqQB8YU1XfBjqzwerDMJGBxsFK"
4160
- }
4161
- };
4162
- }, []);
4163
- const config = useMemo(() => {
4164
- return {
4165
- VITE_SIDEBAR_TYPE: "grid/sidebar",
4166
- VITE_APP_DOMAIN: "https://api.vitrust.app/c2/",
4167
- VITE_IS_EDU: true,
4168
- VITE_LOGO_WHITE_LOGIN: "https://static.vitrust.app/vitrust/3a/3a1301f614dea6ee19ebf99b68f57e3fd46011d2.png",
4169
- VITE_LOGO_BLACK_LOGIN: "https://static.vitrust.app/vitrust/32/3223918780da7a439f916faac9abf0bfe98dfa07.png",
4170
- VITE_BACKGROUND_SIDEBAR: "linear-gradient(178deg, rgb(1, 106, 13) -0.89%, rgb(4, 179, 66) 99.46%",
4171
- VITE_BANNER: "https://static.vitrust.app/vitrust/5d/5d20cab0627182b4ed5cba4ee42c58b98b663e5b.svg",
4172
- VITE_BG_BUTTON: "#008F3C",
4173
- VITE_BACKGROUND_PAGE: "#F9FAFB"
4174
- };
4175
- }, []);
4176
- useEffect(() => {
4177
- try {
4178
- const env = getEnv2();
4179
- env.setupEnv({
4180
- baseUrl: envConfig.baseUrl,
4181
- port: 3e3,
4182
- config: {
4183
- grantType: envConfig.config.grantType,
4184
- clientId: envConfig.config.clientId,
4185
- clientSecret: envConfig.config.clientSecret
4186
- },
4187
- db: "preschool",
4188
- localStorageUtils: localStorageUtils(),
4189
- sessionStorageUtils: sessionStorageUtils()
4289
+ // src/hooks/core/use-menu.ts
4290
+ var useMenu = ({
4291
+ context,
4292
+ specification
4293
+ }) => {
4294
+ const { env } = (0, provider_exports.useEnv)();
4295
+ const { useGetMenu: useGetMenu2 } = (0, provider_exports.useService)();
4296
+ const [action, callAction] = useCallAction();
4297
+ const menuData = useGetMenu2(context, specification, !!context);
4298
+ const [menuId, setMenuId] = useState2(void 0);
4299
+ const configedIconData = useMemo(() => {
4300
+ const data = menuData.data;
4301
+ return data?.map((item) => {
4302
+ return {
4303
+ ...item,
4304
+ child_id: item?.child_id?.map((child) => {
4305
+ return {
4306
+ ...child,
4307
+ url_icon: env?.envFile?.VITE_APP_DOMAIN + "/" + child.url_icon
4308
+ };
4309
+ }) ?? [],
4310
+ url_icon: env?.envFile?.VITE_APP_DOMAIN + "/" + item.url_icon
4311
+ };
4312
+ });
4313
+ }, [menuData.data, env?.envFile?.VITE_APP_DOMAIN]);
4314
+ const handleChangeMenu = async ({ menu }) => {
4315
+ const aidMenu = menu?.action?.id?.id;
4316
+ if (menu) {
4317
+ setMenuId(menu.id?.toString() ?? "");
4318
+ }
4319
+ if (aidMenu) {
4320
+ const actionResponse = await callAction({
4321
+ aid: Number(aidMenu)
4190
4322
  });
4191
- dispatch(setEnvFile(config));
4192
- } catch (error) {
4193
- console.error("Error loading env or config:", error);
4323
+ return actionResponse;
4194
4324
  }
4195
- }, [dispatch, envConfig, config]);
4196
- return { envConfig, config };
4325
+ };
4326
+ return {
4327
+ ...menuData,
4328
+ data: configedIconData,
4329
+ action: { handleChangeMenu },
4330
+ state: { menuId, action },
4331
+ context,
4332
+ isLoading: menuData.isLoading,
4333
+ isError: menuData.isError,
4334
+ error: menuData.error,
4335
+ refetch: menuData.refetch
4336
+ };
4197
4337
  };
4198
4338
 
4199
4339
  // src/hooks/core/use-detail.ts
4200
- import { setProfile, useAppDispatch as useAppDispatch2 } from "@fctc/interface-logic/store";
4201
4340
  import { useQuery } from "@tanstack/react-query";
4202
- import { useEffect as useEffect2 } from "react";
4203
- import { useGetDetail } from "@fctc/interface-logic/hooks";
4204
- var useDetail = (accessToken, sub) => {
4205
- const dispatch = useAppDispatch2();
4206
- const fetchGetDetail = useGetDetail();
4341
+ import { useEffect } from "react";
4342
+ var useDetail = (sub) => {
4343
+ const { setUserInfo, env } = (0, provider_exports.useEnv)();
4344
+ const { useGetDetail: useGetDetail2 } = (0, provider_exports.useService)();
4345
+ const fetchGetDetail = useGetDetail2();
4207
4346
  const userDetailQuery = useQuery({
4208
- queryKey: ["userDetailQuery", sub && accessToken],
4347
+ queryKey: ["userDetailQuery", sub],
4209
4348
  queryFn: () => {
4210
4349
  return fetchGetDetail.mutateAsync({
4211
4350
  model: "res.users",
@@ -4213,24 +4352,44 @@ var useDetail = (accessToken, sub) => {
4213
4352
  specification: { image_256: {} }
4214
4353
  });
4215
4354
  },
4216
- enabled: !!sub && !!accessToken
4355
+ enabled: !!sub
4217
4356
  });
4218
- useEffect2(() => {
4357
+ useEffect(() => {
4219
4358
  if (userDetailQuery.data) {
4220
4359
  const userPicture = userDetailQuery.data;
4221
- dispatch(
4222
- setProfile({ ...userPicture, image: userPicture?.[0]?.image_256 })
4223
- );
4360
+ setUserInfo({ ...env?.user, image: userPicture?.[0]?.image_256 });
4224
4361
  }
4225
- }, [userDetailQuery.data, dispatch]);
4226
- return userDetailQuery;
4362
+ }, [userDetailQuery.isFetched]);
4363
+ return { ...userDetailQuery };
4227
4364
  };
4228
4365
 
4229
- // src/hooks/core/use-list-data.ts
4230
- import { useMemo as useMemo2, useState as useState2 } from "react";
4366
+ // src/hooks/core/use-profile.ts
4367
+ import { useQuery as useQuery2 } from "@tanstack/react-query";
4368
+ import { useEffect as useEffect3, useMemo as useMemo2 } from "react";
4369
+ import { useTranslation } from "react-i18next";
4370
+
4371
+ // src/utils.ts
4372
+ var utils_exports = {};
4373
+ __export(utils_exports, {
4374
+ STORAGES: () => STORAGES,
4375
+ combineContexts: () => combineContexts,
4376
+ convertFieldsToArray: () => convertFieldsToArray,
4377
+ countSum: () => countSum,
4378
+ getDateRange: () => getDateRange,
4379
+ languages: () => languages,
4380
+ mergeButtons: () => mergeButtons,
4381
+ setStorageItemAsync: () => setStorageItemAsync,
4382
+ useStorageState: () => useStorageState
4383
+ });
4384
+
4385
+ // src/utils/constants.ts
4386
+ var languages = [
4387
+ { id: "vi_VN", name: "VIE" },
4388
+ { id: "en_US", name: "ENG" }
4389
+ ];
4231
4390
 
4232
4391
  // src/utils/function.ts
4233
- import { useCallback, useEffect as useEffect3, useReducer } from "react";
4392
+ import { useCallback as useCallback2, useEffect as useEffect2, useReducer } from "react";
4234
4393
  var countSum = (data, field) => {
4235
4394
  if (!data || !field) return 0;
4236
4395
  return data.reduce(
@@ -4369,7 +4528,7 @@ async function setStorageItemAsync(key, value) {
4369
4528
  }
4370
4529
  function useStorageState(key) {
4371
4530
  const [state, setState] = useAsyncState();
4372
- useEffect3(() => {
4531
+ useEffect2(() => {
4373
4532
  try {
4374
4533
  const storedValue = localStorage.getItem(key);
4375
4534
  setState(storedValue);
@@ -4377,7 +4536,7 @@ function useStorageState(key) {
4377
4536
  console.error("Local storage is unavailable:", e);
4378
4537
  }
4379
4538
  }, [key]);
4380
- const setValue = useCallback(
4539
+ const setValue = useCallback2(
4381
4540
  (value) => {
4382
4541
  setState(value);
4383
4542
  setStorageItemAsync(key, value);
@@ -4387,187 +4546,32 @@ function useStorageState(key) {
4387
4546
  return [state, setValue];
4388
4547
  }
4389
4548
 
4390
- // src/hooks/core/use-list-data.ts
4391
- import { useModel, useGetListData } from "@fctc/interface-logic/hooks";
4392
- import {
4393
- useAppSelector,
4394
- selectSearch,
4395
- selectList
4396
- } from "@fctc/interface-logic/store";
4397
- import {
4398
- evalJSONDomain,
4399
- formatSortingString
4400
- } from "@fctc/interface-logic/utils";
4401
- var useListData = ({
4402
- action,
4403
- context,
4404
- viewResponse
4405
- }) => {
4406
- const { groupByDomain } = useAppSelector(selectSearch);
4407
- const initModel = useModel();
4408
- const [type, setType] = useState2("list");
4409
- const [mode, setMode] = useState2("month");
4410
- const [currentDate, setCurrentDate] = useState2(/* @__PURE__ */ new Date());
4411
- const { pageLimit, page, order } = useAppSelector(selectList);
4412
- const listDataProps = useMemo2(() => {
4413
- const actData = action?.result;
4414
- if (!viewResponse || !actData || !context) {
4415
- return null;
4416
- }
4417
- const specification = initModel.initModel({
4418
- name: String(actData.res_model),
4419
- view: viewResponse || {},
4420
- actContext: context,
4421
- fields: type === "kanban" ? viewResponse?.views?.kanban?.fields : type === "calendar" ? viewResponse?.views?.calendar?.fields : viewResponse?.views?.list?.fields
4422
- }).getSpecification();
4423
- const domain = type === "calendar" ? getDateRange(currentDate, mode) : actData?.domain ? Array.isArray(actData?.domain) ? [...actData?.domain] : evalJSONDomain(actData?.domain, context) : [];
4424
- const limit = type === "calendar" ? 2500 : pageLimit;
4425
- const offset = page * pageLimit;
4426
- const fields = type === "calendar" ? convertFieldsToArray(viewResponse?.views?.calendar?.fields) || [] : typeof groupByDomain === "object" ? groupByDomain?.fields : void 0;
4427
- const groupby = typeof groupByDomain === "object" ? [groupByDomain?.contexts?.[0]?.group_by] : [];
4428
- const sort = order ? order : viewResponse?.views?.list?.default_order ? formatSortingString(viewResponse?.views?.list?.default_order) : "";
4429
- return {
4430
- model: actData.res_model,
4431
- specification,
4432
- domain,
4433
- limit,
4434
- offset,
4435
- fields,
4436
- groupby,
4437
- context,
4438
- sort,
4439
- type
4440
- };
4441
- }, [
4442
- action?.result,
4443
- context,
4444
- currentDate,
4445
- groupByDomain,
4446
- initModel,
4447
- mode,
4448
- order,
4449
- page,
4450
- pageLimit,
4451
- type,
4452
- viewResponse
4453
- ]);
4454
- const list = useGetListData(
4455
- listDataProps,
4456
- [listDataProps],
4457
- !!listDataProps
4458
- );
4459
- return {
4460
- ...list,
4461
- state: {
4462
- type,
4463
- setType,
4464
- mode,
4465
- setMode,
4466
- currentDate,
4467
- setCurrentDate
4468
- }
4469
- };
4470
- };
4471
-
4472
- // src/hooks/core/use-menu.ts
4473
- import { useEffect as useEffect4, useMemo as useMemo3, useState as useState3 } from "react";
4474
-
4475
- // src/utils/constants.ts
4476
- var languages = [
4477
- { id: "vi_VN", name: "VIE" },
4478
- { id: "en_US", name: "ENG" }
4479
- ];
4480
- var API_PRESCHOOL_URL = {
4481
- baseURL: "https://preschool.vitrust.app"
4482
- };
4483
- var API_APP_URL = {
4484
- baseUrl: "https://api.vitrust.app",
4485
- c2: "https://api.vitrust.app/c2",
4486
- apiV2: "https://api.vitrust.app/c2/api/v2"
4487
- };
4488
-
4489
- // src/hooks/core/use-menu.ts
4490
- import { useGetMenu } from "@fctc/interface-logic/hooks";
4491
- var useMenu = ({ context }) => {
4492
- const menuData = useGetMenu(context, !!context);
4493
- const [menuid, setMenuId] = useState3(void 0);
4494
- const [action, setAction] = useCallAction();
4495
- const configedIconData = useMemo3(() => {
4496
- const data = menuData.data;
4497
- return data?.map((item) => {
4498
- return {
4499
- ...item,
4500
- child_id: item?.child_id?.map((child) => {
4501
- return {
4502
- ...child,
4503
- url_icon: API_APP_URL.c2 + "/" + child.url_icon
4504
- };
4505
- }) ?? [],
4506
- url_icon: API_APP_URL.c2 + "/" + item.url_icon
4507
- };
4508
- });
4509
- }, [menuData.data]);
4510
- const handleChangeMenu = async ({
4511
- menu,
4512
- subMenu
4513
- }) => {
4514
- const aid = subMenu?.action?.id?.id;
4515
- const actionType = subMenu?.action?.type;
4516
- await setAction({
4517
- aid: Number(aid),
4518
- actionType
4519
- });
4520
- if (menu) {
4521
- setMenuId(menu.id?.toString() ?? "");
4522
- }
4523
- };
4524
- useEffect4(() => {
4525
- const firstRecord = configedIconData?.[0];
4526
- const firstChild = firstRecord?.child_id?.[0];
4527
- if (firstChild && firstRecord) {
4528
- handleChangeMenu({ menu: firstRecord, subMenu: firstChild });
4529
- }
4530
- }, [configedIconData]);
4531
- return {
4532
- ...menuData,
4533
- data: configedIconData,
4534
- action: { handleChangeMenu },
4535
- state: { menuid, action },
4536
- context
4537
- };
4538
- };
4549
+ // src/utils.ts
4550
+ __reExport(utils_exports, utils_star);
4551
+ import * as utils_star from "@fctc/interface-logic/utils";
4539
4552
 
4540
4553
  // src/hooks/core/use-profile.ts
4541
- import { useQuery as useQuery2 } from "@tanstack/react-query";
4542
- import { useEffect as useEffect5, useMemo as useMemo4 } from "react";
4543
- import { useTranslation } from "react-i18next";
4544
- import { getEnv as getEnv3 } from "@fctc/interface-logic/environment";
4545
- import { useGetProfile } from "@fctc/interface-logic/hooks";
4546
- import { useAppDispatch as useAppDispatch3, setDataUser } from "@fctc/interface-logic/store";
4547
- var useProfile = (accessToken) => {
4548
- const getProfile = useGetProfile();
4549
- const dispatch = useAppDispatch3();
4554
+ var useProfile = () => {
4555
+ const { setUid, setLang, setUserInfo, env } = (0, provider_exports.useEnv)();
4556
+ const { useGetProfile: useGetProfile2 } = (0, provider_exports.useService)();
4557
+ const getProfile = useGetProfile2();
4550
4558
  const { i18n: i18n2 } = useTranslation();
4551
- const fetchUserProfile = async () => {
4552
- return await getProfile.mutateAsync();
4553
- };
4554
4559
  const userInfoQuery = useQuery2({
4555
- queryKey: ["userInfo", accessToken],
4556
- queryFn: fetchUserProfile,
4557
- enabled: !!accessToken
4560
+ queryKey: ["userInfo"],
4561
+ queryFn: () => getProfile.mutateAsync(),
4562
+ enabled: (0, utils_exports.isObjectEmpty)(env?.user)
4558
4563
  });
4559
- useEffect5(() => {
4564
+ useEffect3(() => {
4560
4565
  if (userInfoQuery.data) {
4561
4566
  const userInfo = userInfoQuery.data;
4562
- const env = getEnv3();
4563
- env.setUid(userInfo?.sub);
4564
- dispatch(setDataUser(userInfo));
4567
+ setUid(userInfo?.sub);
4568
+ setUserInfo(userInfo);
4565
4569
  const userLocale = languages.find((lang) => lang?.id === userInfo?.locale);
4566
- env.setLang(userLocale?.id);
4570
+ setLang(userLocale?.id);
4567
4571
  i18n2.changeLanguage(userLocale?.id.split("_")[0]);
4568
4572
  }
4569
- }, [dispatch, userInfoQuery.data]);
4570
- const context = useMemo4(() => {
4573
+ }, [userInfoQuery.isFetched]);
4574
+ const context = useMemo2(() => {
4571
4575
  if (userInfoQuery.data?.sub && userInfoQuery.data?.locale) {
4572
4576
  return {
4573
4577
  uid: Number(userInfoQuery.data.sub),
@@ -4577,44 +4581,42 @@ var useProfile = (accessToken) => {
4577
4581
  };
4578
4582
  }
4579
4583
  return void 0;
4580
- }, [userInfoQuery.data]);
4584
+ }, [userInfoQuery.isFetched]);
4585
+ if (userInfoQuery.isLoading || !userInfoQuery.data) {
4586
+ return null;
4587
+ }
4581
4588
  return { ...userInfoQuery, context };
4582
4589
  };
4583
4590
 
4584
4591
  // src/hooks/core/use-user.ts
4585
- var useUser = (accessToken) => {
4586
- const userProfile = useProfile(accessToken);
4587
- const userDetail = useDetail(accessToken, userProfile.data?.sub);
4588
- return { userProfile, userDetail, context: userProfile.context };
4592
+ var useUser = () => {
4593
+ const userProfile = useProfile();
4594
+ const userDetail = useDetail(userProfile?.data?.sub);
4595
+ return { userProfile, userDetail, context: userProfile?.context };
4589
4596
  };
4590
4597
 
4591
4598
  // src/hooks/core/use-view-v2.ts
4592
- import { useMemo as useMemo5 } from "react";
4593
- import { useGetView } from "@fctc/interface-logic/hooks";
4599
+ import { useMemo as useMemo3 } from "react";
4594
4600
  var useViewV2 = ({
4595
4601
  action,
4596
- context
4602
+ context,
4603
+ aid,
4604
+ views,
4605
+ model
4597
4606
  }) => {
4598
- const viewParams = useMemo5(() => {
4599
- if (!action?.result) {
4607
+ const { useGetView: useGetView2 } = (0, provider_exports.useService)();
4608
+ const viewParams = useMemo3(() => {
4609
+ if (!action) {
4600
4610
  return void 0;
4601
4611
  }
4602
- const actionResult = action?.result;
4603
4612
  return {
4604
- model: String(actionResult?.res_model),
4605
- views: [
4606
- ...Array.isArray(actionResult?.views) ? actionResult?.views.map(
4607
- (view2) => view2[1] === "list" ? [view2[0], "list"] : view2
4608
- ) : [],
4609
- [
4610
- Array.isArray(actionResult?.search_view_id) ? actionResult?.search_view_id[0] : actionResult?.search_view_id,
4611
- "search"
4612
- ]
4613
- ],
4614
- context
4613
+ model,
4614
+ views,
4615
+ context,
4616
+ id: isNaN(Number(aid)) ? action?.id : aid
4615
4617
  };
4616
- }, [action, context]);
4617
- const view = useGetView(
4618
+ }, [action, context, aid]);
4619
+ const view = useGetView2(
4618
4620
  viewParams || {},
4619
4621
  !!viewParams
4620
4622
  );
@@ -4624,157 +4626,117 @@ var useViewV2 = ({
4624
4626
  };
4625
4627
  };
4626
4628
 
4627
- // src/hooks/core/use-auth.ts
4628
- import { useLoginCredential } from "@fctc/interface-logic/hooks";
4629
- import {
4630
- setDataUser as setDataUser2,
4631
- setMenuList,
4632
- setProfile as setProfile2,
4633
- useAppDispatch as useAppDispatch4
4634
- } from "@fctc/interface-logic/store";
4635
- var useAuth = () => {
4636
- const [[isLoading, accessToken], setAccessToken] = useStorageState("TOKEN");
4637
- const loginMutate = useLoginCredential();
4638
- const dispatch = useAppDispatch4();
4639
- const signIn = async (email, password) => {
4640
- try {
4641
- loginMutate.mutate(
4642
- {
4643
- email,
4644
- password,
4645
- path: "/authentication/oauth2/token"
4646
- },
4647
- {
4648
- onSuccess: (res) => {
4649
- },
4650
- onError: (err) => {
4651
- }
4652
- }
4653
- );
4654
- } catch (error) {
4655
- throw new Error("Login failed");
4656
- }
4657
- };
4658
- const signOut = async () => {
4659
- dispatch(setMenuList([]));
4660
- dispatch(setDataUser2({}));
4661
- dispatch(setProfile2({}));
4662
- setAccessToken(null);
4663
- };
4664
- return {
4665
- signIn,
4666
- signOut,
4667
- accessToken,
4668
- isLoading
4669
- };
4670
- };
4671
-
4672
- // src/hooks/core/use-app-provider.tsx
4673
- import { createContext, useContext, useMemo as useMemo7 } from "react";
4674
-
4675
4629
  // src/hooks/core/use-company.ts
4676
4630
  import { useQuery as useQuery3 } from "@tanstack/react-query";
4677
- import { useEffect as useEffect6, useMemo as useMemo6 } from "react";
4678
- import { getEnv as getEnv4 } from "@fctc/interface-logic/environment";
4679
- import {
4680
- useGetCurrentCompany,
4681
- useGetCompanyInfo
4682
- } from "@fctc/interface-logic/hooks";
4683
- var useCompany = (accessToken) => {
4684
- const getCurrentCompany = useGetCurrentCompany();
4631
+ import { useEffect as useEffect4, useMemo as useMemo4 } from "react";
4632
+ var useCompany = () => {
4633
+ const { setAllowCompanies, setCompanies, setDefaultCompany, env } = (0, provider_exports.useEnv)();
4634
+ const { useGetCurrentCompany: useGetCurrentCompany2, useGetCompanyInfo: useGetCompanyInfo2 } = (0, provider_exports.useService)();
4635
+ const getCurrentCompany = useGetCurrentCompany2();
4685
4636
  const fetchCurrentCompany = async () => {
4686
4637
  return await getCurrentCompany.mutateAsync();
4687
4638
  };
4688
4639
  const currentCompany = useQuery3({
4689
- queryKey: ["currentCompany", accessToken],
4640
+ queryKey: ["currentCompany"],
4690
4641
  queryFn: fetchCurrentCompany,
4691
- enabled: !!accessToken
4642
+ enabled: !!env?.defaultCompany
4692
4643
  });
4693
- const current_company_id = useMemo6(() => {
4644
+ const current_company_id = useMemo4(() => {
4694
4645
  return currentCompany.data?.current_company_id;
4695
4646
  }, [currentCompany.data]);
4696
- useEffect6(() => {
4647
+ useEffect4(() => {
4697
4648
  if (current_company_id) {
4698
4649
  const companyIDs = [current_company_id];
4699
- const env = getEnv4();
4700
- env.setAllowCompanies([...companyIDs]);
4701
- env.setCompanies(companyIDs);
4650
+ setAllowCompanies([...companyIDs]);
4651
+ setCompanies(companyIDs);
4702
4652
  }
4703
4653
  }, [current_company_id]);
4704
- const getCompanyInfo = useGetCompanyInfo();
4654
+ const getCompanyInfo = useGetCompanyInfo2();
4705
4655
  const companyInfo = useQuery3({
4706
- queryKey: ["companyInfoQuery", current_company_id, accessToken],
4656
+ queryKey: ["companyInfoQuery", current_company_id],
4707
4657
  queryFn: () => getCompanyInfo.mutateAsync(Number(current_company_id)),
4708
- enabled: !!current_company_id && !!accessToken
4658
+ enabled: !!current_company_id
4709
4659
  });
4710
- useEffect6(() => {
4660
+ useEffect4(() => {
4711
4661
  if (companyInfo.data) {
4712
4662
  const companyInfoData = companyInfo.data;
4713
4663
  if (companyInfoData?.length) {
4714
- const env = getEnv4();
4715
- env.setDefaultCompany(companyInfoData[0]);
4664
+ setDefaultCompany(companyInfoData[0]);
4716
4665
  }
4717
4666
  }
4718
4667
  }, [companyInfo.data]);
4668
+ if (!companyInfo?.data || !currentCompany?.data) return;
4719
4669
  return {
4720
- currentCompany,
4721
- companyInfo,
4670
+ currentCompany: { ...currentCompany },
4671
+ companyInfo: { ...companyInfo },
4722
4672
  context: { allowed_company_ids: [current_company_id] }
4723
4673
  };
4724
4674
  };
4725
- var use_company_default = useCompany;
4726
4675
 
4727
4676
  // src/hooks/core/use-app-provider.tsx
4728
- import { evalJSONContext } from "@fctc/interface-logic/utils";
4729
4677
  import { jsx } from "react/jsx-runtime";
4730
4678
  var AppProviderInitialValue = {
4731
- config: {},
4732
4679
  user: {},
4733
- auth: {},
4734
4680
  company: {},
4735
4681
  action: {},
4736
4682
  menu: {},
4737
- view: {},
4738
- list: {}
4683
+ view: {}
4739
4684
  };
4740
4685
  var ReactContext = createContext(AppProviderInitialValue);
4741
- var AppProvider = ({ children }) => {
4742
- const config = useConfig({});
4743
- const auth = useAuth();
4744
- const user = useUser(auth.accessToken);
4745
- const company = use_company_default(auth.accessToken);
4746
- const menuContext = useMemo7(() => {
4747
- return combineContexts([user.context, company.context]);
4748
- }, [user.context, company.context]);
4749
- const menu = useMenu({ context: menuContext });
4750
- const action = useMemo7(() => {
4751
- return menu.state.action;
4752
- }, [menu.state.action]);
4753
- const viewContext = useMemo7(() => {
4686
+ var AppProvider = ({
4687
+ children,
4688
+ menuSpecification,
4689
+ aid
4690
+ }) => {
4691
+ const { env } = (0, provider_exports.useEnv)();
4692
+ const user = useUser();
4693
+ const company = useCompany();
4694
+ const menuContext = useMemo5(() => {
4695
+ return combineContexts([
4696
+ {
4697
+ ...user?.context,
4698
+ ...!(0, utils_exports.isObjectEmpty)(env?.user) && company?.context?.allowed_company_ids ? { lang: env?.context?.lang } : {}
4699
+ },
4700
+ company?.context
4701
+ ]);
4702
+ }, [user?.context, company?.context]);
4703
+ const menu = useMenu({
4704
+ context: {
4705
+ ...menuContext
4706
+ },
4707
+ specification: menuSpecification
4708
+ });
4709
+ const action = useMemo5(() => {
4710
+ return menu?.state?.action;
4711
+ }, [menu?.state?.action, env?.context?.lang]);
4712
+ const viewContext = useMemo5(() => {
4754
4713
  return combineContexts([
4755
4714
  menuContext,
4756
- { ...evalJSONContext(action?.result?.context) }
4715
+ { ...(0, utils_exports.evalJSONContext)(action?.context) }
4757
4716
  ]);
4758
- }, [menuContext, action?.result?.context]);
4717
+ }, [menuContext, action?.context, env?.context?.lang]);
4759
4718
  const view = useViewV2({
4760
4719
  action,
4761
- context: viewContext
4762
- });
4763
- const list = useListData({
4764
- action,
4765
- viewResponse: view.data,
4766
- context: viewContext
4720
+ context: viewContext,
4721
+ aid,
4722
+ views: [
4723
+ ...Array.isArray(action?.views) ? action?.views.map(
4724
+ (view2) => view2[1] === "list" ? [view2[0], "list"] : view2
4725
+ ) : [],
4726
+ [
4727
+ Array.isArray(action?.search_view_id) ? action?.search_view_id[0] : action?.search_view_id,
4728
+ "search"
4729
+ ]
4730
+ ],
4731
+ model: String(action?.res_model)
4767
4732
  });
4768
4733
  return /* @__PURE__ */ jsx(
4769
4734
  ReactContext.Provider,
4770
4735
  {
4771
4736
  value: {
4772
- config,
4773
- auth,
4774
4737
  user,
4775
4738
  company,
4776
4739
  menu,
4777
- list,
4778
4740
  action,
4779
4741
  view
4780
4742
  },
@@ -4790,68 +4752,161 @@ var useAppProvider = () => {
4790
4752
  return context;
4791
4753
  };
4792
4754
 
4793
- // src/hooks/core/use-menu-item.tsx
4794
- import { getEnv as getEnv5 } from "@fctc/interface-logic/environment";
4795
- import { useGetActionDetail } from "@fctc/interface-logic/hooks";
4796
- import { useState as useState4 } from "react";
4797
-
4798
- // src/utils.ts
4799
- var utils_exports = {};
4800
- __export(utils_exports, {
4801
- API_APP_URL: () => API_APP_URL,
4802
- API_PRESCHOOL_URL: () => API_PRESCHOOL_URL,
4803
- STORAGES: () => STORAGES,
4804
- combineContexts: () => combineContexts,
4805
- convertFieldsToArray: () => convertFieldsToArray,
4806
- countSum: () => countSum,
4807
- getDateRange: () => getDateRange,
4808
- languages: () => languages,
4809
- mergeButtons: () => mergeButtons,
4810
- setStorageItemAsync: () => setStorageItemAsync,
4811
- useStorageState: () => useStorageState
4812
- });
4813
- __reExport(utils_exports, utils_star);
4814
- import * as utils_star from "@fctc/interface-logic/utils";
4755
+ // src/hooks/core/use-config.ts
4756
+ import { useEffect as useEffect5 } from "react";
4757
+ var useConfig = ({
4758
+ envConfig,
4759
+ config,
4760
+ localStorageUtils,
4761
+ sessionStorageUtils
4762
+ }) => {
4763
+ const { setupEnv, setEnvFile } = (0, provider_exports.useEnv)();
4764
+ useEffect5(() => {
4765
+ try {
4766
+ setupEnv({
4767
+ baseUrl: envConfig.baseUrl,
4768
+ config: envConfig.config,
4769
+ default_service: "",
4770
+ localStorageUtils: localStorageUtils && localStorageUtils(),
4771
+ sessionStorageUtils: localStorageUtils && sessionStorageUtils()
4772
+ });
4773
+ setEnvFile(config);
4774
+ } catch (error) {
4775
+ console.error("Error loading env or config:", error);
4776
+ }
4777
+ }, [envConfig, config]);
4778
+ return { envConfig, config };
4779
+ };
4815
4780
 
4816
- // src/hooks/core/use-menu-item.tsx
4817
- var useMenuItem = (props) => {
4818
- const { menu, activeMenuId } = props;
4819
- const model = menu?.action?.res_model;
4820
- const aid = menu?.action?.id?.id;
4821
- const id = menu?.id;
4822
- const context = getEnv5().context;
4823
- const queryActionDetail = useGetActionDetail({
4824
- aid,
4825
- id,
4826
- model,
4827
- context,
4828
- enabled: true,
4829
- queryKey: [`action-${aid}`]
4830
- }).data;
4831
- const [path, setPath] = useState4("");
4832
- const handleClick = () => {
4833
- if (location?.pathname === "/list/menu" && activeMenuId === menu?.id) {
4834
- return;
4781
+ // src/hooks/core/use-get-action.ts
4782
+ var useGetAction = ({
4783
+ aid,
4784
+ context
4785
+ }) => {
4786
+ const { useLoadAction: useLoadAction2, useRunAction: useRunAction2 } = (0, provider_exports.useService)();
4787
+ const queryLoadAction = useLoadAction2();
4788
+ const queryRunAction = useRunAction2();
4789
+ const handleActionResult = (data) => {
4790
+ if (data && data.result && data.result.views && Array.isArray(data.result.views) && data.result.views.length > 0) {
4835
4791
  }
4836
- const hasListView = queryActionDetail.views.some(
4837
- ([id2, type]) => type === "list"
4792
+ };
4793
+ const onLoadAction = () => {
4794
+ queryLoadAction.mutate(
4795
+ {
4796
+ idAction: aid,
4797
+ context
4798
+ },
4799
+ {
4800
+ onSuccess: (data) => {
4801
+ if (data?.result?.type === "ir.actions.act_window") {
4802
+ handleActionResult(data);
4803
+ } else if (data?.result?.type === "ir.actions.server") {
4804
+ queryRunAction.mutate(
4805
+ {
4806
+ idAction: aid,
4807
+ context
4808
+ },
4809
+ {
4810
+ onSuccess: handleActionResult
4811
+ }
4812
+ );
4813
+ }
4814
+ }
4815
+ }
4838
4816
  );
4839
- const viewType = hasListView ? "list" : "form";
4840
- const isAccountPayment = menu?.action?.res_model === "account.payment" && menu?.action?.id?.id === 1551;
4841
- const isConvertCurrencyMenu = menu?.action?.res_model === "currency.convert" && menu?.action?.id?.id === 1562;
4842
- const path2 = (0, utils_exports.formatUrlPath)({
4843
- viewType,
4844
- actionPath: isConvertCurrencyMenu ? "menu" : isAccountPayment ? "menu" : menu?.action?.path || "menu",
4845
- aid: menu?.action?.id?.id,
4846
- model: queryActionDetail.res_model
4847
- });
4848
- setPath(path2);
4849
4817
  };
4850
- return { handleClick, path, queryActionDetail };
4818
+ return {
4819
+ onLoadAction
4820
+ };
4821
+ };
4822
+
4823
+ // src/hooks/core/use-get-specification.ts
4824
+ import { useMemo as useMemo6 } from "react";
4825
+ var useGetSpecification = ({
4826
+ model,
4827
+ viewData,
4828
+ fields
4829
+ }) => {
4830
+ const baseModel = useMemo6(
4831
+ () => ({
4832
+ name: String(model),
4833
+ view: viewData || {},
4834
+ fields
4835
+ }),
4836
+ [model, viewData]
4837
+ );
4838
+ const initModel = useModel();
4839
+ const modelInstance = useMemo6(() => {
4840
+ if (viewData) {
4841
+ return initModel.initModel(baseModel);
4842
+ }
4843
+ return null;
4844
+ }, [baseModel, viewData]);
4845
+ const specification = useMemo6(() => {
4846
+ if (modelInstance) {
4847
+ return modelInstance.getSpecification();
4848
+ }
4849
+ return null;
4850
+ }, [modelInstance]);
4851
+ return { specification };
4852
+ };
4853
+
4854
+ // src/hooks/core/use-list-data.ts
4855
+ import { useMemo as useMemo7, useState as useState5 } from "react";
4856
+ import {
4857
+ evalJSONDomain,
4858
+ formatSortingString,
4859
+ isObjectEmpty as isObjectEmpty3
4860
+ } from "@fctc/interface-logic/utils";
4861
+
4862
+ // src/hooks/utils/use-click-outside.ts
4863
+ import { useEffect as useEffect6, useRef } from "react";
4864
+ var DEFAULT_EVENTS = ["mousedown", "touchstart"];
4865
+ var useClickOutside = ({
4866
+ handler,
4867
+ events = DEFAULT_EVENTS,
4868
+ nodes = [],
4869
+ refs
4870
+ }) => {
4871
+ const ref = useRef(null);
4872
+ useEffect6(() => {
4873
+ const listener = (event) => {
4874
+ const { target } = event;
4875
+ if (refs && refs?.length > 0 && refs?.some((r) => r.current?.contains(target))) {
4876
+ return;
4877
+ }
4878
+ if (!(target instanceof HTMLElement)) return;
4879
+ const shouldIgnore = target.hasAttribute("data-ignore-outside-clicks") || !document.body.contains(target) && target.tagName !== "HTML";
4880
+ const shouldTrigger = nodes.length > 0 ? nodes.every((node) => node && !event.composedPath().includes(node)) : ref.current && !ref.current.contains(target);
4881
+ if (shouldTrigger && !shouldIgnore) {
4882
+ handler(event);
4883
+ }
4884
+ };
4885
+ events.forEach((event) => document.addEventListener(event, listener));
4886
+ return () => {
4887
+ events.forEach((event) => document.removeEventListener(event, listener));
4888
+ };
4889
+ }, [handler, nodes, events]);
4890
+ return ref;
4851
4891
  };
4852
4892
 
4853
- // src/hooks/core/use-get-rowids.ts
4854
- import { useCallback as useCallback2, useEffect as useEffect7, useRef, useState as useState5 } from "react";
4893
+ // src/hooks/utils/use-debounce.ts
4894
+ import { useEffect as useEffect7, useState as useState3 } from "react";
4895
+ function useDebounce(value, delay) {
4896
+ const [debouncedValue, setDebouncedValue] = useState3(value);
4897
+ useEffect7(() => {
4898
+ const handler = setTimeout(() => {
4899
+ setDebouncedValue(value);
4900
+ }, delay);
4901
+ return () => {
4902
+ clearTimeout(handler);
4903
+ };
4904
+ }, [value, delay]);
4905
+ return [debouncedValue];
4906
+ }
4907
+
4908
+ // src/hooks/utils/use-get-rowids.ts
4909
+ import { useCallback as useCallback3, useEffect as useEffect8, useRef as useRef2, useState as useState4 } from "react";
4855
4910
  var useGetRowIds = (tableRef) => {
4856
4911
  function isElementVisible(el) {
4857
4912
  const style = window.getComputedStyle(el);
@@ -4868,9 +4923,9 @@ var useGetRowIds = (tableRef) => {
4868
4923
  }
4869
4924
  return true;
4870
4925
  }
4871
- const [rowIds, setRowIds] = useState5([]);
4872
- const lastRowIdsRef = useRef([]);
4873
- const updateVisibleRowIds = useCallback2(() => {
4926
+ const [rowIds, setRowIds] = useState4([]);
4927
+ const lastRowIdsRef = useRef2([]);
4928
+ const updateVisibleRowIds = useCallback3(() => {
4874
4929
  const table = tableRef.current;
4875
4930
  if (!table) return;
4876
4931
  const rows = table.querySelectorAll("tr[data-row-id]");
@@ -4888,7 +4943,7 @@ var useGetRowIds = (tableRef) => {
4888
4943
  setRowIds(uniqueIds);
4889
4944
  }
4890
4945
  }, [tableRef]);
4891
- useEffect7(() => {
4946
+ useEffect8(() => {
4892
4947
  const table = tableRef.current;
4893
4948
  if (!table) return;
4894
4949
  const mutationObserver = new MutationObserver(() => {
@@ -4916,59 +4971,95 @@ var useGetRowIds = (tableRef) => {
4916
4971
  return { rowIds, refresh: updateVisibleRowIds };
4917
4972
  };
4918
4973
 
4919
- // src/hooks/utils/use-click-outside.ts
4920
- import { useEffect as useEffect8, useRef as useRef2 } from "react";
4921
- var DEFAULT_EVENTS = ["mousedown", "touchstart"];
4922
- var useClickOutside = ({
4923
- handler,
4924
- events = DEFAULT_EVENTS,
4925
- nodes = [],
4926
- refs
4974
+ // src/hooks/core/use-list-data.ts
4975
+ var useListData = ({
4976
+ action,
4977
+ context,
4978
+ viewData,
4979
+ model
4927
4980
  }) => {
4928
- const ref = useRef2(null);
4929
- useEffect8(() => {
4930
- const listener = (event) => {
4931
- const { target } = event;
4932
- if (refs && refs?.length > 0 && refs?.some((r) => r.current?.contains(target))) {
4933
- return;
4934
- }
4935
- if (!(target instanceof HTMLElement)) return;
4936
- const shouldIgnore = target.hasAttribute("data-ignore-outside-clicks") || !document.body.contains(target) && target.tagName !== "HTML";
4937
- const shouldTrigger = nodes.length > 0 ? nodes.every((node) => node && !event.composedPath().includes(node)) : ref.current && !ref.current.contains(target);
4938
- if (shouldTrigger && !shouldIgnore) {
4939
- handler(event);
4940
- }
4941
- };
4942
- events.forEach((event) => document.addEventListener(event, listener));
4943
- return () => {
4944
- events.forEach((event) => document.removeEventListener(event, listener));
4981
+ const { useGetListData: useGetListData2 } = (0, provider_exports.useService)();
4982
+ const [page, setPage] = useState5(0);
4983
+ const [pageLimit, setPageLimit] = useState5(10);
4984
+ const [groupByList, setGroupByList] = useState5(null);
4985
+ const [domain, setDomain] = useState5(null);
4986
+ const [order, setOrder] = useState5("");
4987
+ const [mode, setMode] = useState5("month");
4988
+ const [type, setType] = useState5("list");
4989
+ const [currentDate, setCurrentDate] = useState5(/* @__PURE__ */ new Date());
4990
+ const [selectedRowKeys, setSelectedRowKeys2] = useState5([]);
4991
+ const [debouncedPage] = useDebounce(page, 500);
4992
+ const [debouncedDomain] = useDebounce(domain, 500);
4993
+ const { specification } = useGetSpecification({
4994
+ model,
4995
+ viewData,
4996
+ fields: viewData?.views?.list?.fields
4997
+ });
4998
+ const listDataProps = useMemo7(() => {
4999
+ if (!viewData || !action || !context) {
5000
+ return null;
5001
+ }
5002
+ const domainParse = type === "calendar" ? getDateRange(currentDate, mode) : action?.domain ? Array.isArray(action?.domain) ? [...action?.domain] : evalJSONDomain(action?.domain, context) : [];
5003
+ const limit = type === "calendar" ? 2500 : pageLimit;
5004
+ const offset = debouncedPage * pageLimit;
5005
+ const fields = type === "calendar" ? convertFieldsToArray(viewData?.views?.calendar?.fields) || [] : typeof groupByList === "object" ? groupByList?.fields : void 0;
5006
+ const groupby = typeof groupByList === "object" ? [groupByList?.contexts?.[0]?.group_by] : [];
5007
+ const sort = order ? order : viewData?.views?.list?.default_order ? formatSortingString(viewData?.views?.list?.default_order) : "";
5008
+ return {
5009
+ model: action.res_model,
5010
+ specification,
5011
+ domain: domainParse,
5012
+ limit,
5013
+ offset,
5014
+ fields,
5015
+ groupby,
5016
+ context,
5017
+ sort,
5018
+ type
4945
5019
  };
4946
- }, [handler, nodes, events]);
4947
- return ref;
5020
+ }, [
5021
+ action,
5022
+ context,
5023
+ currentDate,
5024
+ groupByList,
5025
+ mode,
5026
+ order,
5027
+ debouncedPage,
5028
+ pageLimit,
5029
+ type,
5030
+ debouncedDomain
5031
+ ]);
5032
+ const list = useGetListData2(
5033
+ listDataProps,
5034
+ [listDataProps],
5035
+ !!listDataProps && !!specification && !isObjectEmpty3(specification)
5036
+ );
5037
+ return {
5038
+ ...list,
5039
+ state: {
5040
+ specification,
5041
+ type,
5042
+ page,
5043
+ mode,
5044
+ order,
5045
+ domain: listDataProps?.domain,
5046
+ pageLimit,
5047
+ groupByList,
5048
+ currentDate,
5049
+ selectedRowKeys,
5050
+ setType,
5051
+ setMode,
5052
+ setPage,
5053
+ setOrder,
5054
+ setDomain,
5055
+ setPageLimit,
5056
+ setGroupByList,
5057
+ setCurrentDate,
5058
+ setSelectedRowKeys: setSelectedRowKeys2
5059
+ }
5060
+ };
4948
5061
  };
4949
5062
 
4950
- // src/hooks/utils/use-debounce.ts
4951
- import { useEffect as useEffect9, useState as useState6 } from "react";
4952
- function useDebounce(value, delay) {
4953
- const [debouncedValue, setDebouncedValue] = useState6(value);
4954
- useEffect9(() => {
4955
- const handler = setTimeout(() => {
4956
- setDebouncedValue(value);
4957
- }, delay);
4958
- return () => {
4959
- clearTimeout(handler);
4960
- };
4961
- }, [value, delay]);
4962
- return [debouncedValue];
4963
- }
4964
-
4965
- // src/hooks.ts
4966
- __reExport(hooks_exports, hooks_star);
4967
- import * as hooks_star from "@fctc/interface-logic/hooks";
4968
-
4969
- // src/index.ts
4970
- __reExport(index_exports, hooks_exports);
4971
-
4972
5063
  // src/config.ts
4973
5064
  var config_exports = {};
4974
5065
  __reExport(config_exports, configs_star);
@@ -5208,20 +5299,20 @@ var ChevronBottomIcon = ({
5208
5299
  };
5209
5300
 
5210
5301
  // src/widget/basic/status-dropdown-field/controller.ts
5211
- import { useEffect as useEffect10, useRef as useRef3, useState as useState7 } from "react";
5212
- import { getEnv as getEnv6 } from "@fctc/interface-logic/environment";
5213
- import { useSave } from "@fctc/interface-logic/hooks";
5302
+ import { useEffect as useEffect9, useRef as useRef3, useState as useState6 } from "react";
5303
+ import { getEnv } from "@fctc/interface-logic/environment";
5304
+ import { useSave as useSave2 } from "@fctc/interface-logic/hooks";
5214
5305
  var statusDropdownController = (props) => {
5215
5306
  const { selection, isForm, id, model, name, state, onRefetch } = props;
5216
- const env = getEnv6();
5307
+ const env = getEnv();
5217
5308
  const colors = {
5218
5309
  normal: "bg-[#e9ecef]",
5219
5310
  done: "bg-primary",
5220
5311
  blocked: "bg-red-500"
5221
5312
  };
5222
- const [isOpen, setIsOpen] = useState7(false);
5313
+ const [isOpen, setIsOpen] = useState6(false);
5223
5314
  const buttonRef = useRef3(null);
5224
- useEffect10(() => {
5315
+ useEffect9(() => {
5225
5316
  const handleClickOutside = (event) => {
5226
5317
  if (buttonRef.current && !buttonRef.current.contains(event.target)) {
5227
5318
  setIsOpen(false);
@@ -5232,7 +5323,7 @@ var statusDropdownController = (props) => {
5232
5323
  document.removeEventListener("mousedown", handleClickOutside);
5233
5324
  };
5234
5325
  }, []);
5235
- const { mutate: onSave } = useSave();
5326
+ const { mutate: onSave } = useSave2();
5236
5327
  const handleClick = async (status) => {
5237
5328
  setIsOpen(!isOpen);
5238
5329
  onSave(
@@ -5262,18 +5353,13 @@ var statusDropdownController = (props) => {
5262
5353
  };
5263
5354
 
5264
5355
  // src/widget/basic/many2one-field/controller.ts
5265
- import { useCallback as useCallback3, useEffect as useEffect11, useMemo as useMemo8, useState as useState8 } from "react";
5356
+ import { useCallback as useCallback4, useEffect as useEffect10, useMemo as useMemo8, useState as useState7 } from "react";
5266
5357
 
5267
5358
  // src/store.ts
5268
5359
  var store_exports = {};
5269
5360
  __reExport(store_exports, store_star);
5270
5361
  import * as store_star from "@fctc/interface-logic/store";
5271
5362
 
5272
- // src/provider.ts
5273
- var provider_exports = {};
5274
- __reExport(provider_exports, provider_star);
5275
- import * as provider_star from "@fctc/interface-logic/provider";
5276
-
5277
5363
  // src/widget/basic/many2one-field/controller.ts
5278
5364
  var many2oneFieldController = (props) => {
5279
5365
  const {
@@ -5290,13 +5376,13 @@ var many2oneFieldController = (props) => {
5290
5376
  showDetail
5291
5377
  } = props;
5292
5378
  const { env } = (0, provider_exports.useEnv)();
5293
- const [options, setOptions] = useState8([]);
5294
- const [inputValue, setInputValue] = useState8("");
5379
+ const [options, setOptions] = useState7([]);
5380
+ const [inputValue, setInputValue] = useState7("");
5295
5381
  const [debouncedInputValue] = useDebounce(inputValue, 1e3);
5296
- const [isShowModalMany2Many, setIsShowModalMany2Many] = useState8(false);
5297
- const [tempSelectedOption, setTempSelectedOption] = useState8(null);
5298
- const [domainModal, setDomainModal] = useState8(null);
5299
- const [domainObject, setDomainObject] = useState8(null);
5382
+ const [isShowModalMany2Many, setIsShowModalMany2Many] = useState7(false);
5383
+ const [tempSelectedOption, setTempSelectedOption] = useState7(null);
5384
+ const [domainModal, setDomainModal] = useState7(null);
5385
+ const [domainObject, setDomainObject] = useState7(null);
5300
5386
  const actionData = sessionStorageUtils.getActionData();
5301
5387
  const { menuList } = (0, store_exports.useAppSelector)(store_exports.selectNavbar);
5302
5388
  const initValue = methods?.getValues(name);
@@ -5306,7 +5392,7 @@ var many2oneFieldController = (props) => {
5306
5392
  ...fieldContext,
5307
5393
  ...env?.context
5308
5394
  };
5309
- const { useGetSelection: useGetSelection2 } = (0, provider_exports.useService)();
5395
+ const { useGetSelection: useGetSelection3 } = (0, provider_exports.useService)();
5310
5396
  const data = {
5311
5397
  model: relation,
5312
5398
  domain: domainObject,
@@ -5322,7 +5408,7 @@ var many2oneFieldController = (props) => {
5322
5408
  data: dataOfSelection,
5323
5409
  refetch,
5324
5410
  isFetching
5325
- } = useGetSelection2({
5411
+ } = useGetSelection3({
5326
5412
  data,
5327
5413
  queryKey,
5328
5414
  enabled: false
@@ -5333,12 +5419,12 @@ var many2oneFieldController = (props) => {
5333
5419
  label: val?.display_name || val?.name
5334
5420
  })) || [];
5335
5421
  }, [dataOfSelection]);
5336
- useEffect11(() => {
5422
+ useEffect10(() => {
5337
5423
  setOptions(selectOptions);
5338
5424
  setDomainModal(domainObject);
5339
5425
  if (relation === "student.subject") (0, store_exports.setListSubject)(selectOptions);
5340
5426
  }, [selectOptions]);
5341
- useEffect11(() => {
5427
+ useEffect10(() => {
5342
5428
  setDomainObject(
5343
5429
  (0, utils_exports.evalJSONDomain)(
5344
5430
  domain,
@@ -5346,7 +5432,7 @@ var many2oneFieldController = (props) => {
5346
5432
  )
5347
5433
  );
5348
5434
  }, [domain, formValues]);
5349
- useEffect11(() => {
5435
+ useEffect10(() => {
5350
5436
  if (!propValue && tempSelectedOption) {
5351
5437
  methods.setValue(name, null);
5352
5438
  setTempSelectedOption(null);
@@ -5357,10 +5443,10 @@ var many2oneFieldController = (props) => {
5357
5443
  });
5358
5444
  }
5359
5445
  }, [propValue]);
5360
- const fetchMoreOptions = useCallback3(() => {
5446
+ const fetchMoreOptions = useCallback4(() => {
5361
5447
  refetch();
5362
5448
  }, [refetch]);
5363
- useEffect11(() => {
5449
+ useEffect10(() => {
5364
5450
  if (debouncedInputValue) {
5365
5451
  const filteredDomain = [...domainObject ?? []]?.filter(
5366
5452
  (d) => !(Array.isArray(d) && d[0] === "name" && d[1] === "ilike")
@@ -5375,7 +5461,7 @@ var many2oneFieldController = (props) => {
5375
5461
  }, 50);
5376
5462
  }
5377
5463
  }, [debouncedInputValue]);
5378
- const handleChooseRecord = useCallback3(
5464
+ const handleChooseRecord = useCallback4(
5379
5465
  (idRecord) => {
5380
5466
  const newOption = options.find(
5381
5467
  (option) => option.value === idRecord
@@ -5400,8 +5486,8 @@ var many2oneFieldController = (props) => {
5400
5486
  },
5401
5487
  [options, methods, name, onChange]
5402
5488
  );
5403
- const handleClose = useCallback3(() => setIsShowModalMany2Many(false), []);
5404
- const handleSelectChange = useCallback3(
5489
+ const handleClose = useCallback4(() => setIsShowModalMany2Many(false), []);
5490
+ const handleSelectChange = useCallback4(
5405
5491
  (selectedOption) => {
5406
5492
  if (!selectedOption) {
5407
5493
  methods.setValue(name, null, { shouldDirty: true });
@@ -5448,16 +5534,16 @@ var many2oneFieldController = (props) => {
5448
5534
  };
5449
5535
 
5450
5536
  // src/widget/basic/many2one-button-field/controller.ts
5451
- import { getEnv as getEnv7 } from "@fctc/interface-logic/environment";
5452
- import { useGetSelection } from "@fctc/interface-logic/hooks";
5537
+ import { getEnv as getEnv2 } from "@fctc/interface-logic/environment";
5538
+ import { useGetSelection as useGetSelection2 } from "@fctc/interface-logic/hooks";
5453
5539
  import { evalJSONDomain as evalJSONDomain3, evalJSONContext as evalJSONContext3 } from "@fctc/interface-logic/utils";
5454
5540
  var many2oneButtonController = (props) => {
5455
5541
  const { domain, methods, relation } = props;
5456
5542
  const actionDataString = sessionStorage.getItem("actionData");
5457
- const env = getEnv7();
5543
+ const env = getEnv2();
5458
5544
  const domainObject = evalJSONDomain3(domain, methods?.getValues() || {});
5459
5545
  const actionData = actionDataString && actionDataString !== "undefined" ? JSON.parse(actionDataString) : {};
5460
- const { data: dataOfSelection } = useGetSelection({
5546
+ const { data: dataOfSelection } = useGetSelection2({
5461
5547
  data: {
5462
5548
  model: relation ?? "",
5463
5549
  domain: domainObject,
@@ -5475,7 +5561,7 @@ var many2oneButtonController = (props) => {
5475
5561
  };
5476
5562
 
5477
5563
  // src/widget/basic/many2many-field/controller.ts
5478
- import { useEffect as useEffect12, useMemo as useMemo9, useState as useState9 } from "react";
5564
+ import { useEffect as useEffect11, useMemo as useMemo9, useState as useState8 } from "react";
5479
5565
  import {
5480
5566
  evalJSONContext as evalJSONContext4,
5481
5567
  evalJSONDomain as evalJSONDomain4,
@@ -5488,16 +5574,16 @@ var many2manyFieldController = (props) => {
5488
5574
  context,
5489
5575
  options,
5490
5576
  tab,
5491
- setSelectedRowKeys: setSelectedRowKeys3,
5577
+ setSelectedRowKeys: setSelectedRowKeys2,
5492
5578
  groupByDomain,
5493
5579
  enabled: enabledCallAPI,
5494
5580
  actionData
5495
5581
  } = props;
5496
5582
  const { env } = (0, provider_exports.useEnv)();
5497
- const { useGetView: useGetView2, useGetListData: useGetListData2, useGetFormView } = (0, provider_exports.useService)();
5498
- const [order, setOrder] = useState9();
5499
- const [page, setPage] = useState9(0);
5500
- const [domainMany2Many, setDomainMany2Many] = useState9(null);
5583
+ const { useGetView: useGetView2, useGetListData: useGetListData2, useGetFormView: useGetFormView2 } = (0, provider_exports.useService)();
5584
+ const [order, setOrder] = useState8();
5585
+ const [page, setPage] = useState8(0);
5586
+ const [domainMany2Many, setDomainMany2Many] = useState8(null);
5501
5587
  const [debouncedPage] = useDebounce(page, 500);
5502
5588
  const contextObject = {
5503
5589
  ...env.context,
@@ -5524,7 +5610,7 @@ var many2manyFieldController = (props) => {
5524
5610
  }),
5525
5611
  [relation, viewResponse]
5526
5612
  );
5527
- const initModel = (0, hooks_exports.useModel)();
5613
+ const initModel = useModel();
5528
5614
  const modelInstance = useMemo9(() => {
5529
5615
  if (viewResponse) {
5530
5616
  return initModel.initModel(baseModel);
@@ -5574,13 +5660,13 @@ var many2manyFieldController = (props) => {
5574
5660
  isFetched,
5575
5661
  isPlaceholderData
5576
5662
  } = useGetListData2(data, queryKey, enabled);
5577
- useEffect12(() => {
5663
+ useEffect11(() => {
5578
5664
  if (viewResponse) {
5579
5665
  fetchData();
5580
5666
  }
5581
5667
  return () => {
5582
5668
  setPage(0);
5583
- setSelectedRowKeys3([]);
5669
+ setSelectedRowKeys2([]);
5584
5670
  setDomainMany2Many(null);
5585
5671
  };
5586
5672
  }, [viewResponse]);
@@ -5641,7 +5727,7 @@ var many2manyTagsController = (props) => {
5641
5727
  } = props;
5642
5728
  const isUser = relation === "res.users" || relation === "res.partner";
5643
5729
  const { env } = (0, provider_exports.useEnv)();
5644
- const { useGetSelection: useGetSelection2 } = (0, provider_exports.useService)();
5730
+ const { useGetSelection: useGetSelection3 } = (0, provider_exports.useService)();
5645
5731
  const addtionalFields = optionsFields ? evalJSONContext5(optionsFields) : null;
5646
5732
  const domainObject = useMemo10(
5647
5733
  () => evalJSONDomain5(domain, JSON.parse(JSON.stringify(formValues || {}))),
@@ -5660,7 +5746,7 @@ var many2manyTagsController = (props) => {
5660
5746
  enabled: true,
5661
5747
  context: env.context
5662
5748
  };
5663
- const { data: dataOfSelection } = useGetSelection2({
5749
+ const { data: dataOfSelection } = useGetSelection3({
5664
5750
  data,
5665
5751
  queryKey: [`data_${relation}`, domainObject]
5666
5752
  });
@@ -5685,7 +5771,7 @@ var many2manyTagsController = (props) => {
5685
5771
  };
5686
5772
 
5687
5773
  // src/widget/basic/status-bar-field/controller.ts
5688
- import { useState as useState10 } from "react";
5774
+ import { useState as useState9 } from "react";
5689
5775
  import { evalJSONDomain as evalJSONDomain6 } from "@fctc/interface-logic/utils";
5690
5776
  var durationController = (props) => {
5691
5777
  const { relation, domain, formValues, name, id, model, onRefetch, enabled } = props;
@@ -5694,10 +5780,10 @@ var durationController = (props) => {
5694
5780
  name: "",
5695
5781
  fold: ""
5696
5782
  };
5697
- const { useGetListData: useGetListData2, useChangeStatus } = (0, provider_exports.useService)();
5783
+ const { useGetListData: useGetListData2, useChangeStatus: useChangeStatus2 } = (0, provider_exports.useService)();
5698
5784
  const { env } = (0, provider_exports.useEnv)();
5699
- const [disabled, setDisabled] = useState10(false);
5700
- const [modelStatus, setModalStatus] = useState10(false);
5785
+ const [disabled, setDisabled] = useState9(false);
5786
+ const [modelStatus, setModalStatus] = useState9(false);
5701
5787
  const queryKey = [`data-status-duration`, specification];
5702
5788
  const listDataProps = {
5703
5789
  model: relation,
@@ -5717,7 +5803,7 @@ var durationController = (props) => {
5717
5803
  queryKey,
5718
5804
  enabled
5719
5805
  );
5720
- const { mutate: fetchChangeStatus } = useChangeStatus();
5806
+ const { mutate: fetchChangeStatus } = useChangeStatus2();
5721
5807
  const handleClick = async (stage_id) => {
5722
5808
  setDisabled(true);
5723
5809
  if (stage_id) {
@@ -5757,8 +5843,8 @@ var priorityFieldController = (props) => {
5757
5843
  const { name, model, index, actionData, context, onChange, specification } = props;
5758
5844
  const _context = { ...evalJSONContext6(actionData?.context) };
5759
5845
  const contextObject = { ...context, ..._context };
5760
- const { useSave: useSave2 } = (0, provider_exports.useService)();
5761
- const { mutateAsync: fetchSave } = useSave2();
5846
+ const { useSave: useSave3 } = (0, provider_exports.useService)();
5847
+ const { mutateAsync: fetchSave } = useSave3();
5762
5848
  const savePriorities = async ({
5763
5849
  value,
5764
5850
  resetPriority
@@ -5787,10 +5873,10 @@ var priorityFieldController = (props) => {
5787
5873
  };
5788
5874
 
5789
5875
  // src/widget/basic/download-file-field/controller.ts
5790
- import { useId, useState as useState11 } from "react";
5876
+ import { useId, useState as useState10 } from "react";
5791
5877
  var downloadFileController = () => {
5792
5878
  const inputId = useId();
5793
- const [file, setFile] = useState11(null);
5879
+ const [file, setFile] = useState10(null);
5794
5880
  const handleFileChange = (e) => {
5795
5881
  setFile(e.target.files[0]);
5796
5882
  };
@@ -6722,11 +6808,11 @@ var dateFieldController = (props) => {
6722
6808
  };
6723
6809
 
6724
6810
  // src/widget/basic/copy-link-button/controller.ts
6725
- import { useState as useState12 } from "react";
6811
+ import { useState as useState11 } from "react";
6726
6812
  import { copyTextToClipboard } from "@fctc/interface-logic/utils";
6727
6813
  var copyLinkButtonController = (props) => {
6728
6814
  const { value, defaultValue } = props;
6729
- const [isCopied, setIsCopied] = useState12(false);
6815
+ const [isCopied, setIsCopied] = useState11(false);
6730
6816
  const handleCopyToClipboard = async (value2) => {
6731
6817
  await copyTextToClipboard(value2);
6732
6818
  setIsCopied(true);
@@ -6745,11 +6831,11 @@ import { evalJSONContext as evalJSONContext7 } from "@fctc/interface-logic/utils
6745
6831
  var colorFieldController = (props) => {
6746
6832
  const { value, isForm, name, formValues, idForm, model, actionData } = props;
6747
6833
  const { env } = (0, provider_exports.useEnv)();
6748
- const { useSave: useSave2 } = (0, provider_exports.useService)();
6834
+ const { useSave: useSave3 } = (0, provider_exports.useService)();
6749
6835
  const _context = { ...evalJSONContext7(actionData?.context) || {} };
6750
6836
  const contextObject = { ...env.context, ..._context };
6751
6837
  const idDefault = isForm ? idForm : formValues?.id;
6752
- const { mutate: onSave } = useSave2();
6838
+ const { mutate: onSave } = useSave3();
6753
6839
  const savePickColor = async (colorObject) => {
6754
6840
  const { id } = colorObject;
6755
6841
  if (value === id) return;
@@ -6774,14 +6860,14 @@ var colorFieldController = (props) => {
6774
6860
  };
6775
6861
 
6776
6862
  // src/widget/basic/binary-field/controller.ts
6777
- import { useEffect as useEffect13, useId as useId2, useRef as useRef4, useState as useState13 } from "react";
6863
+ import { useEffect as useEffect12, useId as useId2, useRef as useRef4, useState as useState12 } from "react";
6778
6864
  import { isBase64Image } from "@fctc/interface-logic/utils";
6779
6865
  var binaryFieldController = (props) => {
6780
6866
  const { name, methods, readonly = false, value } = props;
6781
6867
  const inputId = useId2();
6782
- const [selectedImage, setSelectedImage] = useState13(null);
6783
- const [initialImage, setInitialImage] = useState13(value || null);
6784
- const [isInsideTable, setIsInsideTable] = useState13(false);
6868
+ const [selectedImage, setSelectedImage] = useState12(null);
6869
+ const [initialImage, setInitialImage] = useState12(value || null);
6870
+ const [isInsideTable, setIsInsideTable] = useState12(false);
6785
6871
  const { setValue } = methods;
6786
6872
  const binaryRef = useRef4(null);
6787
6873
  const convertUrlToBase64 = async (url) => {
@@ -6845,14 +6931,14 @@ var binaryFieldController = (props) => {
6845
6931
  else if (base64.startsWith("UklGR")) mimeType = "image/webp";
6846
6932
  return mimeType ? `data:${mimeType};base64,${base64}` : null;
6847
6933
  };
6848
- useEffect13(() => {
6934
+ useEffect12(() => {
6849
6935
  return () => {
6850
6936
  if (selectedImage) {
6851
6937
  URL.revokeObjectURL(selectedImage);
6852
6938
  }
6853
6939
  };
6854
6940
  }, [selectedImage]);
6855
- useEffect13(() => {
6941
+ useEffect12(() => {
6856
6942
  if (binaryRef.current) {
6857
6943
  const isInsideTable2 = !!binaryRef.current.closest("table");
6858
6944
  setIsInsideTable(isInsideTable2);
@@ -6872,11 +6958,16 @@ var binaryFieldController = (props) => {
6872
6958
  };
6873
6959
 
6874
6960
  // src/widget/advance/table/table-head/controller.ts
6875
- import { useAppDispatch as useAppDispatch5, setSelectedRowKeys } from "@fctc/interface-logic/store";
6876
6961
  import { useMemo as useMemo11, useRef as useRef5 } from "react";
6877
6962
  var tableHeadController = (props) => {
6878
- const { typeTable, rows, tableRef, groupByList, selectedRowKeys } = props;
6879
- const appDispatch = useAppDispatch5();
6963
+ const {
6964
+ typeTable,
6965
+ rows,
6966
+ tableRef,
6967
+ groupByList,
6968
+ selectedRowKeys,
6969
+ setSelectedRowKeys: setSelectedRowKeys2
6970
+ } = props;
6880
6971
  const { rowIds: recordIds } = useGetRowIds(tableRef);
6881
6972
  const selectedRowKeysRef = useRef5(recordIds);
6882
6973
  const isGroupTable = typeTable === "group";
@@ -6902,27 +6993,27 @@ var tableHeadController = (props) => {
6902
6993
  const handleCheckBoxAll = (event) => {
6903
6994
  if (event?.target?.checked && typeTable === "list") {
6904
6995
  const allRowKeys = Array.isArray(rows) ? rows.map((record) => record?.id) : [];
6905
- appDispatch(setSelectedRowKeys(allRowKeys));
6996
+ setSelectedRowKeys2(allRowKeys);
6906
6997
  } else if (event?.target?.checked && typeTable === "group") {
6907
6998
  const rowsIDs = document.querySelectorAll("tr[data-row-id]");
6908
6999
  const ids = Array.from(rowsIDs)?.map(
6909
7000
  (row) => Number(row?.getAttribute("data-row-id"))
6910
7001
  );
6911
7002
  if (ids?.length > 0) {
6912
- appDispatch(setSelectedRowKeys(ids));
7003
+ setSelectedRowKeys2(ids);
6913
7004
  } else {
6914
7005
  const sum = countSum(
6915
7006
  rows,
6916
7007
  typeof groupByList === "object" ? groupByList?.contexts?.[0]?.group_by : void 0
6917
7008
  );
6918
7009
  const keys = Array.from({ length: sum }, (_) => void 0);
6919
- appDispatch(setSelectedRowKeys(keys));
7010
+ setSelectedRowKeys2(keys);
6920
7011
  }
6921
7012
  if (selectedRowKeysRef) {
6922
7013
  selectedRowKeysRef.current = [];
6923
7014
  }
6924
7015
  } else {
6925
- appDispatch(setSelectedRowKeys([]));
7016
+ setSelectedRowKeys2([]);
6926
7017
  }
6927
7018
  };
6928
7019
  return {
@@ -6933,11 +7024,11 @@ var tableHeadController = (props) => {
6933
7024
  };
6934
7025
 
6935
7026
  // src/widget/advance/table/table-view/controller.ts
6936
- import { useEffect as useEffect14, useState as useState14 } from "react";
7027
+ import { useEffect as useEffect13, useState as useState13 } from "react";
6937
7028
  import { domainHelper } from "@fctc/interface-logic/utils";
6938
7029
  var tableController = ({ data }) => {
6939
- const [rows, setRows] = useState14(null);
6940
- const [columns, setColumns] = useState14(null);
7030
+ const [rows, setRows] = useState13(null);
7031
+ const [columns, setColumns] = useState13(null);
6941
7032
  const dataModelFields = data?.fields?.map((field) => {
6942
7033
  return {
6943
7034
  ...data.dataModel?.[field?.name],
@@ -6965,7 +7056,7 @@ var tableController = ({ data }) => {
6965
7056
  return item.display_name ? { ...transformedItem, item: item.display_name } : transformedItem;
6966
7057
  });
6967
7058
  };
6968
- useEffect14(() => {
7059
+ useEffect13(() => {
6969
7060
  setRows(transformData(data.records));
6970
7061
  }, [data.records]);
6971
7062
  const handleGetColumns = () => {
@@ -6986,7 +7077,7 @@ var tableController = ({ data }) => {
6986
7077
  }
6987
7078
  return cols;
6988
7079
  };
6989
- useEffect14(() => {
7080
+ useEffect13(() => {
6990
7081
  if (!columns) {
6991
7082
  setColumns(handleGetColumns());
6992
7083
  }
@@ -7003,12 +7094,14 @@ var tableController = ({ data }) => {
7003
7094
  });
7004
7095
  setColumns(tempColumn);
7005
7096
  };
7006
- useEffect14(() => {
7007
- setRows(null);
7008
- setColumns(null);
7009
- return () => {
7010
- setRows(null);
7097
+ useEffect13(() => {
7098
+ if (data?.fields != null) {
7011
7099
  setColumns(null);
7100
+ }
7101
+ return () => {
7102
+ if (data?.fields != null) {
7103
+ setColumns(null);
7104
+ }
7012
7105
  };
7013
7106
  }, [data?.fields]);
7014
7107
  return {
@@ -7020,10 +7113,10 @@ var tableController = ({ data }) => {
7020
7113
  };
7021
7114
 
7022
7115
  // src/widget/advance/table/table-group/controller.ts
7023
- import { useEffect as useEffect15, useMemo as useMemo12, useState as useState15 } from "react";
7116
+ import { useEffect as useEffect14, useMemo as useMemo12, useState as useState14 } from "react";
7024
7117
  import {
7025
- useAppSelector as useAppSelector3,
7026
- selectList as selectList2
7118
+ useAppSelector as useAppSelector2,
7119
+ selectList
7027
7120
  } from "@fctc/interface-logic/store";
7028
7121
  var tableGroupController = (props) => {
7029
7122
  const { env } = (0, provider_exports.useEnv)();
@@ -7038,12 +7131,12 @@ var tableGroupController = (props) => {
7038
7131
  context,
7039
7132
  checkedAll,
7040
7133
  groupByList,
7041
- setSelectedRowKeys: setSelectedRowKeys3
7134
+ setSelectedRowKeys: setSelectedRowKeys2
7042
7135
  } = props;
7043
- const [pageGroup, setPageGroup] = useState15(0);
7044
- const { selectedRowKeys } = useAppSelector3(selectList2);
7045
- const [isShowGroup, setIsShowGroup] = useState15(false);
7046
- const [colEmptyGroup, setColEmptyGroup] = useState15({
7136
+ const [pageGroup, setPageGroup] = useState14(0);
7137
+ const { selectedRowKeys } = useAppSelector2(selectList);
7138
+ const [isShowGroup, setIsShowGroup] = useState14(false);
7139
+ const [colEmptyGroup, setColEmptyGroup] = useState14({
7047
7140
  fromStart: 1,
7048
7141
  fromEnd: 1
7049
7142
  });
@@ -7120,25 +7213,25 @@ var tableGroupController = (props) => {
7120
7213
  const filteredIds = selectedRowKeys.filter(
7121
7214
  (id) => !ids.includes(id)
7122
7215
  );
7123
- setSelectedRowKeys3(filteredIds);
7216
+ setSelectedRowKeys2(filteredIds);
7124
7217
  } else if (!isShowGroup && selectedRowKeys?.length > 0 && typeTableGroup === "list" && checkedAll && !allIdsNull) {
7125
7218
  const clonedKeys = [...selectedRowKeys];
7126
- setSelectedRowKeys3([...clonedKeys, -1]);
7127
- setTimeout(() => setSelectedRowKeys3(clonedKeys), 500);
7219
+ setSelectedRowKeys2([...clonedKeys, -1]);
7220
+ setTimeout(() => setSelectedRowKeys2(clonedKeys), 500);
7128
7221
  } else if (isShowGroup && selectedRowKeys?.length > 0 && typeTableGroup === "list" && !checkedAll && !allIdsNull) {
7129
7222
  console.log("abc");
7130
7223
  const filteredKeys = selectedRowKeys.filter((id) => id > -1);
7131
- setSelectedRowKeys3(filteredKeys);
7224
+ setSelectedRowKeys2(filteredKeys);
7132
7225
  }
7133
7226
  toggleShowGroup();
7134
7227
  };
7135
- useEffect15(() => {
7228
+ useEffect14(() => {
7136
7229
  if (!isDataGroupFetched || !rowsGroup || !checkedAll || allIdsNull || typeTableGroup === "group") {
7137
7230
  return;
7138
7231
  }
7139
7232
  const clonedKeys = [...selectedRowKeys];
7140
- setSelectedRowKeys3([...clonedKeys, -1]);
7141
- setTimeout(() => setSelectedRowKeys3(clonedKeys), 500);
7233
+ setSelectedRowKeys2([...clonedKeys, -1]);
7234
+ setTimeout(() => setSelectedRowKeys2(clonedKeys), 500);
7142
7235
  }, [isDataGroupFetched]);
7143
7236
  return {
7144
7237
  onExpandChildGroup,
@@ -7165,7 +7258,7 @@ import {
7165
7258
  evalJSONDomain as evalJSONDomain7,
7166
7259
  validateAndParseDate
7167
7260
  } from "@fctc/interface-logic/utils";
7168
- import { useCallback as useCallback4, useEffect as useEffect16, useState as useState16 } from "react";
7261
+ import { useCallback as useCallback5, useEffect as useEffect15, useState as useState15 } from "react";
7169
7262
  var searchController = ({
7170
7263
  viewData,
7171
7264
  model,
@@ -7174,12 +7267,12 @@ var searchController = ({
7174
7267
  fieldsList
7175
7268
  }) => {
7176
7269
  const { env } = (0, provider_exports.useEnv)();
7177
- const [filterBy, setFilterBy] = useState16(null);
7178
- const [searchBy, setSearchBy] = useState16(null);
7179
- const [groupBy, setGroupBy] = useState16(null);
7180
- const [selectedTags, setSelectedTags] = useState16(null);
7181
- const [searchString, setSearchString] = useState16("");
7182
- const [searchMap, setSearchMap] = useState16({});
7270
+ const [filterBy, setFilterBy] = useState15(null);
7271
+ const [searchBy, setSearchBy] = useState15(null);
7272
+ const [groupBy, setGroupBy] = useState15(null);
7273
+ const [selectedTags, setSelectedTags] = useState15(null);
7274
+ const [searchString, setSearchString] = useState15("");
7275
+ const [searchMap, setSearchMap] = useState15({});
7183
7276
  const actionContext = typeof context === "string" ? evalJSONContext8(context) : context;
7184
7277
  const contextSearch = { ...env.context, ...actionContext };
7185
7278
  const domainAction = domain ? Array.isArray(domain) ? [...domain] : evalJSONDomain7(domain, contextSearch) : [];
@@ -7226,7 +7319,7 @@ var searchController = ({
7226
7319
  }
7227
7320
  }
7228
7321
  };
7229
- useEffect16(() => {
7322
+ useEffect15(() => {
7230
7323
  fetchData();
7231
7324
  }, [model, viewData]);
7232
7325
  const onChangeSearchInput = (search_string) => {
@@ -7308,7 +7401,7 @@ var searchController = ({
7308
7401
  return [...domain2];
7309
7402
  }
7310
7403
  };
7311
- const setTagSearch = useCallback4(
7404
+ const setTagSearch = useCallback5(
7312
7405
  (updatedMap) => {
7313
7406
  if (!updatedMap) return;
7314
7407
  const tagsSearch = Object.entries(updatedMap).map(
@@ -7371,20 +7464,11 @@ var searchController = ({
7371
7464
  },
7372
7465
  [searchMap]
7373
7466
  );
7374
- useEffect16(() => {
7467
+ useEffect15(() => {
7375
7468
  setTagSearch(searchMap);
7376
7469
  }, [searchMap]);
7377
7470
  const handleAddTagSearch = (tag) => {
7378
- const {
7379
- domain: domain2,
7380
- groupIndex,
7381
- value,
7382
- type,
7383
- title,
7384
- context: context2,
7385
- active,
7386
- dataIndex
7387
- } = tag;
7471
+ const { domain: domain2, groupIndex, value, type, context: context2, dataIndex } = tag;
7388
7472
  const domainFormat = new domainHelper2.Domain(domain2);
7389
7473
  if (type === SearchType.FILTER) {
7390
7474
  addSearchItems(`${SearchType.FILTER}_${groupIndex}`, {
@@ -7465,8 +7549,6 @@ import * as types_star from "@fctc/interface-logic/types";
7465
7549
  // src/index.ts
7466
7550
  __reExport(index_exports, types_exports);
7467
7551
  export {
7468
- API_APP_URL,
7469
- API_PRESCHOOL_URL,
7470
7552
  AppProvider,
7471
7553
  CheckIcon,
7472
7554
  ChevronBottomIcon,
@@ -7502,19 +7584,89 @@ export {
7502
7584
  tableGroupController,
7503
7585
  tableHeadController,
7504
7586
  useAppProvider,
7505
- useAuth,
7587
+ useButton,
7506
7588
  useCallAction,
7589
+ useChangeStatus,
7507
7590
  useClickOutside,
7591
+ useCompany,
7508
7592
  useConfig,
7509
7593
  useDebounce,
7594
+ useDelete,
7595
+ useDeleteComment,
7510
7596
  useDetail,
7597
+ useDuplicateRecord,
7598
+ useExecuteImport,
7599
+ useExportExcel,
7600
+ useForgotPassword,
7601
+ useForgotPasswordSSO,
7602
+ useGet2FAMethods,
7603
+ useGetAccessByCode,
7604
+ useGetAction,
7605
+ useGetActionDetail,
7606
+ useGetAll,
7607
+ useGetCalendar,
7608
+ useGetComment,
7609
+ useGetCompanyInfo,
7610
+ useGetConversionRate,
7611
+ useGetCurrency,
7612
+ useGetCurrentCompany,
7613
+ useGetDetail,
7614
+ useGetFieldExport,
7615
+ useGetFieldOnChange,
7616
+ useGetFileExcel,
7617
+ useGetFormView,
7618
+ useGetGroups,
7619
+ useGetImage,
7620
+ useGetListCompany,
7621
+ useGetListData,
7622
+ useGetListMyBankAccount,
7623
+ useGetMenu,
7624
+ useGetPrintReport,
7625
+ useGetProGressBar,
7626
+ useGetProfile,
7627
+ useGetProvider,
7628
+ useGetResequence,
7511
7629
  useGetRowIds,
7630
+ useGetSelection,
7631
+ useGetSpecification,
7632
+ useGetUser,
7633
+ useGetView,
7634
+ useGrantAccess,
7635
+ useIsValidToken,
7512
7636
  useListData,
7637
+ useLoadAction,
7638
+ useLoadMessage,
7639
+ useLoginCredential,
7640
+ useLoginSocial,
7641
+ useLogout,
7513
7642
  useMenu,
7514
- useMenuItem,
7643
+ useModel,
7644
+ useOdooDataTransform,
7645
+ useOnChangeForm,
7646
+ useParsePreview,
7647
+ usePrint,
7515
7648
  useProfile,
7649
+ useRemoveRow,
7650
+ useRemoveTotpSetup,
7651
+ useRequestSetupTotp,
7652
+ useResetPassword,
7653
+ useResetPasswordSSO,
7654
+ useRunAction,
7655
+ useSave,
7656
+ useSendComment,
7657
+ useSettingsWebRead2fa,
7658
+ useSignInSSO,
7516
7659
  useStorageState,
7660
+ useSwitchLocale,
7661
+ useUpdatePassword,
7662
+ useUploadFile,
7663
+ useUploadFileExcel,
7664
+ useUploadIdFile,
7665
+ useUploadImage,
7517
7666
  useUser,
7667
+ useValidateActionToken,
7668
+ useVerify2FA,
7669
+ useVerifyTotp,
7518
7670
  useViewV2
7519
7671
  };
7520
7672
  /*! Bundled license information: