@mkt-loitd/react-table-grid-custom 1.4.2 → 1.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.css CHANGED
@@ -55,3 +55,4 @@ div[aria-sort] > span {
55
55
  position: sticky !important;
56
56
  right: 0 !important;
57
57
  }
58
+ /*# sourceMappingURL=index.css.map */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/component/ui/Table/ReactTableGridCustom.css"],"sourcesContent":[":root {\n --mkt-border-color: #dee2e6a6;\n}\n\n.rdg::-webkit-scrollbar {\n width: 7px;\n height: 7px;\n}\n\n/* Track */\n:is(.rdg)::-webkit-scrollbar-track {\n border-radius: 4px;\n background-color: transparent;\n}\n\n/* Handle */\n:is(.rdg)::-webkit-scrollbar-thumb {\n border-radius: 4px;\n background-color: #dadada;\n}\n\n/* custom table */\ndiv[aria-selected='true'] {\n outline: none !important;\n}\n\n.wapper_table {\n border: 1px solid var(--mkt-border-color);\n}\n\n.wapper_pagination {\n border-top: 1px solid var(--mkt-border-color);\n margin-top: 2px;\n}\n\ndiv[role='row']:not(:last-child) > div {\n border-bottom: 1px solid var(--mkt-border-color);\n}\n\ndiv[role='row'] > div:not(:last-child) {\n border-right: 1px solid var(--mkt-border-color);\n}\n\n.page_size-table[data-combobox-disabled] {\n cursor: default;\n}\n\n.custom_input_table.mantine-Input-input:focus {\n outline: none !important;\n --input-bd: inherit;\n}\n\n.custom_input_table.mantine-Input-input {\n --height: 30px;\n min-height: var(--height);\n height: var(--height);\n line-height: var(--height);\n text-align: center;\n}\n\n.fill-grid {\n block-size: 100%;\n}\n\ndiv[aria-sort] > span {\n display: flex;\n align-items: center;\n}\n\n.RIGHT_COLUMN_FROZEN_CLASS {\n position: sticky !important;\n right: 0 !important;\n}\n"],"mappings":";AAAA;AACE,sBAAoB;AACtB;AAEA,CAAC,GAAG;AACF,SAAO;AACP,UAAQ;AACV;AAGA,IAAI,CANH,IAMQ;AACP,iBAAe;AACf,oBAAkB;AACpB;AAGA,IAAI,CAZH,IAYQ;AACP,iBAAe;AACf,oBAAkB;AACpB;AAGA,GAAG,CAAC;AACF,WAAS;AACX;AAEA,CAAC;AACC,UAAQ,IAAI,MAAM,IAAI;AACxB;AAEA,CAAC;AACC,cAAY,IAAI,MAAM,IAAI;AAC1B,cAAY;AACd;AAEA,GAAG,CAAC,SAAW,KAAK,aAAa,EAAE;AACjC,iBAAe,IAAI,MAAM,IAAI;AAC/B;AAEA,GAAG,CAAC,UAAY,EAAE,GAAG,KAAK;AACxB,gBAAc,IAAI,MAAM,IAAI;AAC9B;AAEA,CAAC,eAAe,CAAC;AACf,UAAQ;AACV;AAEA,CAAC,kBAAkB,CAAC,mBAAmB;AACrC,WAAS;AACT,cAAY;AACd;AAEA,CALC,kBAKkB,CALC;AAMlB,YAAU;AACV,cAAY,IAAI;AAChB,UAAQ,IAAI;AACZ,eAAa,IAAI;AACjB,cAAY;AACd;AAEA,CAAC;AACC,cAAY;AACd;AAEA,GAAG,CAAC,WAAW,EAAE;AACf,WAAS;AACT,eAAa;AACf;AAEA,CAAC;AACC,YAAU;AACV,SAAO;AACT;","names":[]}
package/dist/index.d.mts CHANGED
@@ -1,6 +1,7 @@
1
- import { Dispatch, SetStateAction, Key, FC, ReactNode } from 'react';
1
+ import * as react from 'react';
2
+ import { Dispatch, SetStateAction, Key, ReactNode } from 'react';
2
3
  import { ColumnOrColumnGroup, SortColumn } from 'react-data-grid';
3
- export { Column, ColumnOrColumnGroup, DataGridProps } from 'react-data-grid';
4
+ export { Column, ColumnOrColumnGroup } from 'react-data-grid';
4
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
6
 
6
7
  type TColumnsTable<T = unknown, SR = unknown> = readonly ColumnOrColumnGroup<NoInfer<T>, NoInfer<SR>>[];
@@ -49,10 +50,8 @@ interface TableStyleWapperProps {
49
50
  clsTablecustom?: string;
50
51
  idWapper?: string;
51
52
  }
52
- interface TableStyleContextMenuWapperComponent extends FC<TableStyleWapperProps> {
53
- getIdFromOutside?: (externalId?: string) => string;
54
- }
55
- declare const TableStyleContextMenuWapper: TableStyleContextMenuWapperComponent;
53
+ declare const TableStyleContextWapper: react.NamedExoticComponent<TableStyleWapperProps>;
54
+ declare const getTableStyleWapperId: (externalId?: string) => string;
56
55
 
57
56
  interface IPaginationParams {
58
57
  pageSize?: number;
@@ -60,4 +59,4 @@ interface IPaginationParams {
60
59
  }
61
60
  type Maybe<T> = T | undefined | null;
62
61
 
63
- export { type IPaginationParams, type IReactTableGridCustom, type Maybe, ReactTableGridCustom, type TColumnsTable, TableStyleContextMenuWapper, type TableStyleWapperProps, useShowHideColumn };
62
+ export { type IPaginationParams, type IReactTableGridCustom, type Maybe, ReactTableGridCustom, type TColumnsTable, TableStyleContextWapper, type TableStyleWapperProps, getTableStyleWapperId, useShowHideColumn };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { Dispatch, SetStateAction, Key, FC, ReactNode } from 'react';
1
+ import * as react from 'react';
2
+ import { Dispatch, SetStateAction, Key, ReactNode } from 'react';
2
3
  import { ColumnOrColumnGroup, SortColumn } from 'react-data-grid';
3
- export { Column, ColumnOrColumnGroup, DataGridProps } from 'react-data-grid';
4
+ export { Column, ColumnOrColumnGroup } from 'react-data-grid';
4
5
  import * as react_jsx_runtime from 'react/jsx-runtime';
5
6
 
6
7
  type TColumnsTable<T = unknown, SR = unknown> = readonly ColumnOrColumnGroup<NoInfer<T>, NoInfer<SR>>[];
@@ -49,10 +50,8 @@ interface TableStyleWapperProps {
49
50
  clsTablecustom?: string;
50
51
  idWapper?: string;
51
52
  }
52
- interface TableStyleContextMenuWapperComponent extends FC<TableStyleWapperProps> {
53
- getIdFromOutside?: (externalId?: string) => string;
54
- }
55
- declare const TableStyleContextMenuWapper: TableStyleContextMenuWapperComponent;
53
+ declare const TableStyleContextWapper: react.NamedExoticComponent<TableStyleWapperProps>;
54
+ declare const getTableStyleWapperId: (externalId?: string) => string;
56
55
 
57
56
  interface IPaginationParams {
58
57
  pageSize?: number;
@@ -60,4 +59,4 @@ interface IPaginationParams {
60
59
  }
61
60
  type Maybe<T> = T | undefined | null;
62
61
 
63
- export { type IPaginationParams, type IReactTableGridCustom, type Maybe, ReactTableGridCustom, type TColumnsTable, TableStyleContextMenuWapper, type TableStyleWapperProps, useShowHideColumn };
62
+ export { type IPaginationParams, type IReactTableGridCustom, type Maybe, ReactTableGridCustom, type TColumnsTable, TableStyleContextWapper, type TableStyleWapperProps, getTableStyleWapperId, useShowHideColumn };
package/dist/index.js CHANGED
@@ -31,7 +31,8 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  ReactTableGridCustom: () => ReactTableGridCustom,
34
- TableStyleContextMenuWapper: () => TableStyleContextMenuWapper,
34
+ TableStyleContextWapper: () => TableStyleContextWapper,
35
+ getTableStyleWapperId: () => getTableStyleWapperId,
35
36
  useShowHideColumn: () => useShowHideColumn
36
37
  });
37
38
  module.exports = __toCommonJS(index_exports);
@@ -250,30 +251,94 @@ var ReactTableGridCustomInner = (props) => {
250
251
  onRowDoubleClick
251
252
  } = props;
252
253
  const isSelectRow = enableSelectRow && selectedRows !== void 0;
254
+ const customRowKeyGetter = (0, import_react2.useCallback)(
255
+ (row) => {
256
+ if (typeof rowKeyGetter === "function") {
257
+ return rowKeyGetter(row);
258
+ }
259
+ return (0, import_lodash3.get)(row, rowKeyGetter);
260
+ },
261
+ [rowKeyGetter]
262
+ );
263
+ const selectColumn = (0, import_react2.useMemo)(
264
+ () => ({
265
+ key: "__select__",
266
+ name: "",
267
+ width: 44,
268
+ frozen: true,
269
+ sortable: false,
270
+ resizable: false,
271
+ renderHeaderCell: () => {
272
+ if (!onSelectedRowsChange) return null;
273
+ const allSelected = (selectedRows == null ? void 0 : selectedRows.size) === data.length && data.length > 0;
274
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
275
+ "input",
276
+ {
277
+ type: "checkbox",
278
+ checked: allSelected,
279
+ onChange: (e) => {
280
+ if (e.target.checked) {
281
+ onSelectedRowsChange(
282
+ new Set(data.map(customRowKeyGetter))
283
+ );
284
+ } else {
285
+ onSelectedRowsChange(/* @__PURE__ */ new Set());
286
+ }
287
+ }
288
+ }
289
+ );
290
+ },
291
+ renderCell: ({ row }) => {
292
+ const key = customRowKeyGetter(row);
293
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
294
+ "input",
295
+ {
296
+ type: "checkbox",
297
+ checked: selectedRows == null ? void 0 : selectedRows.has(key),
298
+ onChange: () => {
299
+ if (!onSelectedRowsChange) return;
300
+ const next = new Set(selectedRows);
301
+ if (next.has(key)) {
302
+ next.delete(key);
303
+ } else {
304
+ next.add(key);
305
+ }
306
+ onSelectedRowsChange(next);
307
+ }
308
+ }
309
+ );
310
+ }
311
+ }),
312
+ [
313
+ customRowKeyGetter,
314
+ data,
315
+ selectedRows,
316
+ onSelectedRowsChange
317
+ ]
318
+ );
253
319
  const newColumns = (0, import_react2.useMemo)(() => {
254
320
  const cols = [...columns];
255
321
  if (isSelectRow) {
256
- cols.unshift(import_react_data_grid.SelectColumn);
322
+ cols.unshift(selectColumn);
257
323
  }
258
324
  if (!hiddenSTT) {
259
325
  cols.unshift({
260
326
  key: "__index__",
261
327
  name: "STT",
262
328
  width: 80,
329
+ sortable: false,
263
330
  renderCell: ({ rowIdx }) => STT({ page, pageSize }, rowIdx)
264
331
  });
265
332
  }
266
333
  return cols;
267
- }, [columns, hiddenSTT, isSelectRow, page, pageSize]);
268
- const customRowKeyGetter = (0, import_react2.useCallback)(
269
- (row) => {
270
- if (typeof rowKeyGetter === "function") {
271
- return rowKeyGetter(row);
272
- }
273
- return (0, import_lodash3.get)(row, rowKeyGetter);
274
- },
275
- [rowKeyGetter]
276
- );
334
+ }, [
335
+ columns,
336
+ hiddenSTT,
337
+ isSelectRow,
338
+ page,
339
+ pageSize,
340
+ selectColumn
341
+ ]);
277
342
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
278
343
  "div",
279
344
  {
@@ -309,17 +374,16 @@ var ReactTableGridCustom = (0, import_react2.memo)(
309
374
  var import_react3 = require("react");
310
375
  var import_jsx_runtime3 = require("react/jsx-runtime");
311
376
  var isClient = typeof window !== "undefined";
312
- var TableStyleContextWapper = ({
377
+ var TableStyleContextWapperInner = ({
313
378
  children,
314
- // contextMenuProps,
315
379
  clsTablecustom,
316
- // renderContext,
317
380
  idWapper: externalId
318
381
  }) => {
319
382
  if (!isClient) {
320
383
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_jsx_runtime3.Fragment, { children });
321
384
  }
322
- const idWapper = externalId != null ? externalId : "12";
385
+ const reactId = (0, import_react3.useId)();
386
+ const idWapper = externalId != null ? externalId : reactId;
323
387
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
324
388
  "div",
325
389
  {
@@ -329,15 +393,15 @@ var TableStyleContextWapper = ({
329
393
  }
330
394
  );
331
395
  };
332
- var TableStyleContextMenuWapper = (0, import_react3.memo)(
333
- TableStyleContextWapper
396
+ var TableStyleContextWapper = (0, import_react3.memo)(
397
+ TableStyleContextWapperInner
334
398
  );
335
- TableStyleContextMenuWapper.getIdFromOutside = (externalId) => {
336
- return `wapper_menu_context-${externalId != null ? externalId : "default-id"}`;
337
- };
399
+ var getTableStyleWapperId = (externalId) => `wapper_menu_context-${externalId != null ? externalId : "default"}`;
338
400
  // Annotate the CommonJS export names for ESM import in node:
339
401
  0 && (module.exports = {
340
402
  ReactTableGridCustom,
341
- TableStyleContextMenuWapper,
403
+ TableStyleContextWapper,
404
+ getTableStyleWapperId,
342
405
  useShowHideColumn
343
406
  });
407
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/helpers/functions.ts","../src/helpers/table.ts","../src/utils.ts","../src/hooks/useShowHideColumn.ts","../src/type/table.ts","../src/component/ui/Table/ReactTableGridCustom.tsx","../src/component/Icons.tsx","../src/component/ui/Table/TableStyleContextWapper.tsx"],"sourcesContent":["/* =========================\n * Common types\n * ========================= */\nexport interface IPaginationParams {\n pageSize?: number\n page?: number\n}\n\nexport type Maybe<T> = T | undefined | null\n\n/* =========================\n * Hooks\n * ========================= */\nexport { useShowHideColumn } from './hooks/useShowHideColumn'\n\n/* =========================\n * Components (runtime-safe)\n * ========================= */\nexport { ReactTableGridCustom } \nfrom './component/ui/Table/ReactTableGridCustom'\n\n/* =========================\n * EXPORT TYPES (100% SAFE)\n * ========================= */\n\n// table\nexport type {\n IReactTableGridCustom\n} from './component/ui/Table/table-type'\n\n// columns\nexport type {\n TColumnsTable\n} from './type/table-type'\n\n// react-data-grid (types only)\nexport type {\n Column,\n ColumnOrColumnGroup\n} from 'react-data-grid'\n\n/* =========================\n * TableStyleContextWapper\n * ========================= */\nexport { TableStyleContextWapper }\nfrom './component/ui/Table/TableStyleContextWapper'\n\nexport type { TableStyleWapperProps }\nfrom './component/ui/Table/TableStyleContextWapper'\n\nexport { getTableStyleWapperId }\nfrom './component/ui/Table/TableStyleContextWapper'\n\n","import { deleteDB, IDBPDatabase, openDB } from 'idb'\nimport { pickBy } from 'lodash'\nimport moment from 'moment'\nimport { optionSelect } from '../type/preload-stubs'\nimport { IObjectParams, IToggleValues } from '../type/renderer'\nexport const setLocalStore = (key: string, value: string): void => {\n if (typeof window !== 'undefined') {\n localStorage.setItem(key, value)\n }\n}\n\nexport const getLocalStore = (key: string): string | null => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(key)\n } else {\n return null\n }\n}\n\nexport function convertViToEn(str: string, toUpperCase = false): string {\n str = str.toLowerCase()\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a')\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e')\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i')\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o')\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u')\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y')\n str = str.replace(/đ/g, 'd')\n // Some system encode vietnamese combining accent as individual utf-8 characters\n str = str.replace(/\\u0300|\\u0301|\\u0303|\\u0309|\\u0323/g, '') // Huyền sắc hỏi ngã nặng\n str = str.replace(/\\u02C6|\\u0306|\\u031B/g, '') // Â, Ê, Ă, Ơ, Ư\n\n return toUpperCase ? str.toUpperCase() : str\n}\n\nexport const convertNumber = (value: number | string): { value: number; check: boolean } => {\n let num = 0\n if (value) {\n value = value.toString().replace(/[.]/g, '')\n value = value.trim()\n num = Number(value)\n }\n\n const regex = /^-?\\d*$/\n const check = regex.test(num.toString())\n return {\n value: num,\n check\n }\n}\n\nexport const changeTitleDocmemt = (title?: string): void => {\n document.title = `${title} - Phần Mềm MKT`\n}\n\nexport const numberConvert = (num: string | number): string => {\n let t = '0'\n if (num) {\n if (typeof num === 'string') {\n num = Number(num)\n }\n t = num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\n }\n return t\n}\n\nexport const pickBySearch = <T extends Record<string, unknown>>(obj: T): Partial<T> => {\n const filteredObj = pickBy(obj, (value) => value !== '')\n return filteredObj as Partial<T>\n}\n\nexport const getValueSelected = (value?: unknown, options?: optionSelect[]): optionSelect[] => {\n const currentValue = (options ?? [])?.filter((otp) => {\n return Array.isArray(value) ? value?.includes(otp.value) : otp?.value === value\n })\n return currentValue\n}\n\nexport const toggleValues = ({ array, value }: IToggleValues): string[] => {\n if (array.includes(value)) {\n return array.filter((item) => item !== value)\n } else {\n return [...array, value]\n }\n}\n\nexport const arrayLocal = (array?: string): string[] => {\n try {\n const data = array ? JSON.parse(array) : []\n return Array.isArray(data) ? data : []\n } catch {\n return []\n }\n}\n\nexport const formatDate = (\n date?: string | number | Date,\n format: string = 'DD/MM/YYYY HH:mm:ss A'\n): string => {\n return moment(date).format(format)\n}\n\nexport const parseObject = (obj?: string): object => {\n try {\n const data = obj ? JSON.parse(obj) : {}\n return typeof data === 'object' ? data : {}\n } catch {\n return {}\n }\n}\nexport const bufferToBlob = (buffer: ArrayBuffer | Uint8Array, type: string): Blob => {\n return new Blob([buffer as BlobPart], { type })\n}\nconst DB_NAME = 'appDB'\nconst DB_VERSION = 5\nconst STORE_NAME = 'selectedRecords'\nconst HISTORY_STORE = 'recordHistory'\ninterface SelectedRecordEntry {\n actionType: string\n selectedRecords: string[]\n}\n\ninterface RecordHistoryEntry {\n id: string\n previousAction: string[]\n}\n\ntype AppDBSchema = {\n selectedRecords: SelectedRecordEntry\n recordHistory: RecordHistoryEntry\n}\n\nconst requiredStores = [STORE_NAME, HISTORY_STORE]\n\nconst createAppDB = async (): Promise<IDBPDatabase<AppDBSchema>> => {\n return openDB<AppDBSchema>(DB_NAME, DB_VERSION, {\n upgrade(db) {\n for (const storeName of Array.from(db.objectStoreNames)) {\n db.deleteObjectStore(storeName)\n }\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, {\n keyPath: 'actionType'\n })\n store.createIndex('by_actionType', 'actionType')\n }\n\n if (!db.objectStoreNames.contains(HISTORY_STORE)) {\n db.createObjectStore(HISTORY_STORE, { keyPath: 'id' })\n }\n }\n })\n}\n\nexport const openAppDB = async (): Promise<IDBPDatabase<AppDBSchema>> => {\n try {\n const db = await createAppDB()\n const hasAllStores = requiredStores.every((store) => db.objectStoreNames.contains(store))\n if (!hasAllStores) {\n console.warn('[IndexedDB] Missing required stores. Resetting DB...')\n db.close()\n await deleteDB(DB_NAME)\n return await createAppDB()\n }\n return db\n } catch (error) {\n if ((error as { name: string })?.name === 'VersionError') {\n console.warn('[IndexedDB] Version downgrade detected. Resetting DB...')\n await deleteDB(DB_NAME)\n return await createAppDB()\n }\n\n console.error('[IndexedDB] Failed to open DB:', error)\n throw error\n }\n}\n\nexport const saveSelectedRecords = async (\n ACTION_TYPE: string,\n selectedRecords: Set<string>\n): Promise<void> => {\n const db = await openAppDB()\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const store = tx.objectStore(STORE_NAME)\n\n const data: SelectedRecordEntry = {\n actionType: ACTION_TYPE,\n selectedRecords: Array.from(selectedRecords)\n }\n\n await store.put(data)\n await tx.done\n}\n\nexport const getSelectedRecords = async (ACTION_TYPE: string): Promise<Set<string>> => {\n const db = await openAppDB()\n const store = db.transaction(STORE_NAME).objectStore(STORE_NAME)\n\n const record = await store.get(ACTION_TYPE)\n\n return new Set(record?.selectedRecords ?? [])\n}\nexport const removeUidsFromAllPathsAndSaveHistory = async (uids: string[]): Promise<void> => {\n const db = await openAppDB()\n const tx = db.transaction([STORE_NAME, HISTORY_STORE], 'readwrite')\n const store = tx.objectStore(STORE_NAME)\n const historyStore = tx.objectStore(HISTORY_STORE)\n\n const allRecords = await store.getAll()\n\n const historyMap: Record<string, string[]> = {}\n\n for (const uid of uids) {\n historyMap[uid] = []\n }\n\n for (const record of allRecords) {\n let updated = false\n\n for (const uid of uids) {\n if (record.selectedRecords.includes(uid)) {\n record.selectedRecords = record.selectedRecords.filter((id: string) => id !== uid)\n historyMap[uid].push(record.actionType)\n updated = true\n }\n }\n\n if (updated) {\n await store.put(record)\n }\n }\n\n // Ghi lại lịch sử path đã bị xóa cho từng UID\n for (const [uid, paths] of Object.entries(historyMap)) {\n if (paths.length > 0) {\n await historyStore.put({ id: uid, previousAction: paths })\n }\n }\n\n await tx.done\n}\n\nexport const restoreUidsToPreviousPaths = async (uids: string[]): Promise<void> => {\n const db = await openAppDB()\n const tx = db.transaction([STORE_NAME, HISTORY_STORE], 'readwrite')\n const store = tx.objectStore(STORE_NAME)\n const historyStore = tx.objectStore(HISTORY_STORE)\n\n for (const uid of uids) {\n const history = await historyStore.get(uid)\n if (history?.previousAction?.length) {\n for (const actionType of history.previousAction) {\n const record = (await store.get(actionType)) || {\n actionType,\n selectedRecords: []\n }\n\n if (!record.selectedRecords.includes(uid)) {\n record.selectedRecords.push(uid)\n }\n\n await store.put(record)\n }\n\n await historyStore.delete(uid)\n }\n }\n\n await tx.done\n}\nexport const deleteUidsCompletely = async (uids: string[]): Promise<void> => {\n const db = await openAppDB()\n const tx = db.transaction(['selectedRecords', 'recordHistory'], 'readwrite')\n const store = tx.objectStore('selectedRecords')\n const historyStore = tx.objectStore('recordHistory')\n\n const allRecords = await store.getAll()\n\n for (const record of allRecords) {\n const originalLength = record.selectedRecords.length\n record.selectedRecords = record.selectedRecords.filter((id: string) => !uids.includes(id))\n\n if (record.selectedRecords.length !== originalLength) {\n await store.put(record)\n }\n }\n for (const uid of uids) {\n await historyStore.delete(uid)\n }\n\n await tx.done\n}\n\nexport const getSelectedCategoryDataByPath = (): string[] => {\n try {\n const saved = localStorage.getItem('selectedCategoryData')\n if (saved) {\n const data = JSON.parse(saved)\n const localPath = window.location.hash.replace(/^#/, '') || '/'\n const categoryData = data[localPath]\n if (categoryData && Array.isArray(categoryData.categoryIds)) {\n return categoryData.categoryIds\n }\n }\n } catch (err) {\n console.warn('Failed to parse localStorage category data:', err)\n }\n\n return []\n}\n\nexport const handleAsyncConfigSearchInitialValue = (): IObjectParams => {\n const defaultConfig: IObjectParams = {\n page: 1,\n pageSize: 1000,\n filterType: 'all'\n }\n\n const categoryIds = getSelectedCategoryDataByPath()\n if (categoryIds.length > 0) {\n return {\n ...defaultConfig,\n categoryId: categoryIds\n }\n }\n\n return defaultConfig\n}\n","import { ICalculatorTotalPage, IPaginationParams } from \"../type/table-type\"\n\nexport const calculatorTotalPage = ({ total = 0, pageSize = 0 }: ICalculatorTotalPage): number => {\n if (!pageSize || (pageSize && pageSize <= 0)) return 0\n return Math.ceil(total / pageSize)\n}\n\nexport const STT = (data?: IPaginationParams, index?: number): number => {\n let stt = 1\n let current_page = 0\n let per_page = 0\n\n if (data?.page !== undefined && data?.pageSize !== undefined) {\n current_page = data.page\n per_page = data.pageSize\n }\n\n let i = (current_page - 1) * per_page\n i = isNaN(i) ? 0 : i\n stt = i + (index ?? 0) + 1\n\n return stt\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","import { arrayLocal, getLocalStore, setLocalStore, toggleValues } from '../helpers'\nimport { useCallback, useMemo, useState } from 'react'\nimport { Column } from 'react-data-grid'\nimport { TColumnsTable, useShowHideColumnParameter, useShowHideColumnReturn } from '../type/table-type'\nimport { uniq } from 'lodash'\nimport { isColumn } from '../type/table'\n\nconst useShowHideColumn = <T, SR = unknown>({\n nameLocal = 'table',\n columns,\n ignoreColumns\n}: useShowHideColumnParameter<T, SR>): useShowHideColumnReturn<T, SR> => {\n const nameLocalLocation = `${nameLocal}_location`\n const [locationColumns, setLocationColumns] = useState<string[]>(() => {\n const dataLocal = getLocalStore(nameLocalLocation)\n if (dataLocal) {\n return arrayLocal(dataLocal)\n }\n return []\n })\n const [hiddenColumns, setHiddenColumns] = useState<string[]>(() => {\n const dataLocal = getLocalStore(nameLocal)\n if (dataLocal) {\n return arrayLocal(dataLocal)\n }\n return []\n })\n\n const handleFindLocation = useCallback(\n (filterColumns: TColumnsTable<T, SR>, arrLoctions = locationColumns) => {\n return arrLoctions?.length > 0\n ? arrLoctions?.reduce(\n (total, current) => {\n const currentColumns = filterColumns?.find((item) => {\n const newItem = item as Column<T>\n return newItem?.key === current\n })\n\n if (currentColumns) {\n total = [...total, currentColumns]\n }\n return total\n },\n [] as TColumnsTable<T, SR>\n )\n : filterColumns\n },\n [locationColumns]\n )\n\n const newCloumnKeys = useMemo(\n () =>\n columns\n ?.filter(isColumn)\n .map(column => column.key),\n [columns]\n )\n\n\n const newColumns = useMemo(() => {\n const filterColumns: TColumnsTable<T, SR> =\n columns?.filter(column => {\n if (!isColumn(column)) return true\n\n const key = column.key\n\n if (ignoreColumns?.includes(key)) return true\n if (hiddenColumns?.includes(key)) return false\n\n return true\n }) ?? []\n\n return handleFindLocation(filterColumns)\n }, [columns, hiddenColumns, locationColumns, ignoreColumns])\n\n const newShowhideColumns = useMemo(() => {\n if (!ignoreColumns) return columns\n\n return (\n columns?.filter(column => {\n if (!isColumn(column)) return true\n return !ignoreColumns.includes(column.key)\n }) ?? []\n )\n }, [columns, ignoreColumns])\n\n const changeHiddenColumn = useCallback(\n (key: string | string[]) => {\n let newData = [...hiddenColumns]\n if (typeof key === 'string') {\n newData = toggleValues({\n array: newData,\n value: key\n })\n } else {\n newData = key\n }\n setLocalStore(nameLocal, JSON.stringify(newData))\n setHiddenColumns(newData)\n },\n [hiddenColumns, nameLocalLocation]\n )\n\n const handleChangeLocation = useCallback(\n (key: string[]) => {\n let newKey = key\n newKey = uniq([...key, ...newCloumnKeys])\n setLocationColumns(newKey)\n setLocalStore(nameLocalLocation, JSON.stringify(newKey))\n },\n [newCloumnKeys]\n )\n\n return {\n hiddenColumns,\n setHiddenColumns,\n columnsTable: newColumns,\n changeHiddenColumn,\n newShowhideColumns,\n locationColumns,\n handleFindLocation,\n handleChangeLocation\n }\n}\n\nexport { useShowHideColumn }\n","import { UseMutateFunction } from '@tanstack/react-query'\nimport { FormikProps } from 'formik'\nimport { Dispatch, HTMLAttributes, ReactNode, SetStateAction } from 'react'\nimport { Props } from 'react-select'\nimport type { IFieldUpdateAndCheck, IMainResponse, ISettingSystem } from './preload-stubs'\nimport type { JobDetail, Proxy } from './vitechgroup-stubs'\n\nimport type { Column, ColumnOrColumnGroup } from 'react-data-grid'\n\nexport function isColumn<T, SR>(\n column: ColumnOrColumnGroup<T, SR>\n): column is Column<T, SR> {\n return 'key' in column\n}\n\nexport interface ITableData {\n t: any\n dataJobDetail?: JobDetail[]\n totalAction?: number\n settingSystem?: ISettingSystem\n readProxyByField?: UseMutateFunction<\n IMainResponse<Proxy[]>,\n Error,\n IFieldUpdateAndCheck<Proxy, undefined, string[]>[],\n unknown\n >\n}\n\nexport interface CustomSelectProps<T> extends Props, Omit<WapperLabelFormProps, 'children'> {\n className?: string\n height?: string\n name: string\n formik?: FormikProps<T>\n msgError?: string\n changeSelected?: (selected?: Record<string, string>) => void\n setValueSearch?: Dispatch<SetStateAction<string>>\n positionMenu?: string\n}\n\nexport interface WapperLabelFormProps {\n classWapper?: HTMLAttributes<HTMLDivElement>['className']\n label?: string\n clsLabelWrapper?: string\n isRequired?: boolean\n children?: ReactNode\n isVertical?: boolean\n}\n","'use client'\n\nimport { get } from 'lodash'\nimport {\n Key,\n memo,\n useCallback,\n useMemo\n} from 'react'\nimport {\n DataGrid,\n type Column,\n type ColumnOrColumnGroup\n} from 'react-data-grid'\nimport 'react-data-grid/lib/styles.css'\n\nimport { cn } from '../../../helpers'\nimport { STT } from '../../../helpers/table'\nimport { LoadingIcon } from '../../Icons'\nimport type { IReactTableGridCustom } from './table-type'\nimport './ReactTableGridCustom.css'\n\nconst ReactTableGridCustomInner = <\n T,\n SR = unknown,\n K extends Key = Key\n>(\n props: IReactTableGridCustom<T, SR, K>\n) => {\n const {\n classNameWapperTable,\n hiddenSTT,\n data,\n page,\n pageSize,\n columns,\n rowKeyGetter = 'uid',\n\n enableSelectRow,\n selectedRows,\n onSelectedRowsChange,\n\n sortColumns,\n onSortColumnsChange,\n\n fetching,\n onRowClick,\n onRowDoubleClick\n } = props\n\n const isSelectRow =\n enableSelectRow && selectedRows !== undefined\n\n /* =========================\n * Row key\n * ========================= */\n const customRowKeyGetter = useCallback(\n (row: T): K => {\n if (typeof rowKeyGetter === 'function') {\n return rowKeyGetter(row)\n }\n return get(row, rowKeyGetter) as K\n },\n [rowKeyGetter]\n )\n\n /* =========================\n * Select column (CUSTOM)\n * ========================= */\n const selectColumn = useMemo<Column<T, SR>>(\n () => ({\n key: '__select__',\n name: '',\n width: 44,\n frozen: true,\n sortable: false,\n resizable: false,\n\n renderHeaderCell: () => {\n if (!onSelectedRowsChange) return null\n\n const allSelected =\n selectedRows?.size === data.length && data.length > 0\n\n return (\n <input\n type=\"checkbox\"\n checked={allSelected}\n onChange={(e) => {\n if (e.target.checked) {\n onSelectedRowsChange(\n new Set(data.map(customRowKeyGetter))\n )\n } else {\n onSelectedRowsChange(new Set())\n }\n }}\n />\n )\n },\n\n renderCell: ({ row }) => {\n const key = customRowKeyGetter(row)\n\n return (\n <input\n type=\"checkbox\"\n checked={selectedRows?.has(key)}\n onChange={() => {\n if (!onSelectedRowsChange) return\n\n const next = new Set(selectedRows)\n if (next.has(key)) {\n next.delete(key)\n } else {\n next.add(key)\n }\n onSelectedRowsChange(next)\n }}\n />\n )\n }\n }),\n [\n customRowKeyGetter,\n data,\n selectedRows,\n onSelectedRowsChange\n ]\n )\n\n /* =========================\n * Columns\n * ========================= */\n const newColumns = useMemo<\n readonly ColumnOrColumnGroup<T, SR>[]\n >(() => {\n const cols = [...columns]\n\n if (isSelectRow) {\n cols.unshift(selectColumn)\n }\n\n if (!hiddenSTT) {\n cols.unshift({\n key: '__index__',\n name: 'STT',\n width: 80,\n sortable: false,\n renderCell: ({ rowIdx }) =>\n STT({ page, pageSize }, rowIdx)\n })\n }\n\n return cols\n }, [\n columns,\n hiddenSTT,\n isSelectRow,\n page,\n pageSize,\n selectColumn\n ])\n\n return (\n <div\n className={cn(\n 'wapper_table flex flex-col h-full min-h-0 relative',\n classNameWapperTable\n )}\n >\n <DataGrid<T, SR, K>\n rows={data}\n columns={newColumns}\n selectedRows={selectedRows}\n onSelectedRowsChange={onSelectedRowsChange}\n rowKeyGetter={isSelectRow ? customRowKeyGetter : undefined}\n sortColumns={sortColumns}\n onSortColumnsChange={onSortColumnsChange}\n onCellClick={({ row, rowIdx }) =>\n onRowClick?.(row, rowIdx)\n }\n onCellDoubleClick={({ row, rowIdx }) =>\n onRowDoubleClick?.(row, rowIdx)\n }\n />\n\n {fetching && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/60 z-10\">\n <LoadingIcon isSpin />\n </div>\n )}\n </div>\n )\n}\n\n/* =========================\n * Export\n * ========================= */\nexport const ReactTableGridCustom = memo(\n ReactTableGridCustomInner\n) as typeof ReactTableGridCustomInner\n","import { JSX } from \"react\"\n\nexport const LoadingIcon = ({\n isSpin = false,\n h = 30,\n w = 30,\n size = 30,\n className\n}: {\n isSpin?: boolean\n w?: number\n h?: number\n size?: number\n className?: string\n}): JSX.Element => {\n return (\n <svg\n className={`${isSpin ? 'animate-spin' : ''} ${className ?? ''}`}\n viewBox=\"0 0 1024 1024\"\n focusable=\"false\"\n data-icon=\"loading\"\n width={size || w}\n height={size || h}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z\"></path>\n </svg>\n )\n}\n\nexport const ArrowIcon = ({\n h,\n w,\n size,\n className\n}: {\n w?: number\n h?: number\n size?: number\n className?: string\n}): JSX.Element => {\n return (\n <svg\n className={className}\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 16 16\"\n height={size ?? h}\n width={size ?? w}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8 4a.5.5 0 0 1 .5.5v5.793l2.146-2.147a.5.5 0 0 1 .708.708l-3 3a.5.5 0 0 1-.708 0l-3-3a.5.5 0 1 1 .708-.708L7.5 10.293V4.5A.5.5 0 0 1 8 4\"\n ></path>\n </svg>\n )\n}\n","import { FC, memo, ReactNode, useId } from 'react'\n\n/* =========================\n * Props\n * ========================= */\nexport interface TableStyleWapperProps {\n children?: ReactNode\n clsTablecustom?: string\n idWapper?: string // có thể truyền id từ ngoài\n}\n\n/* =========================\n * Client guard\n * ========================= */\nconst isClient = typeof window !== 'undefined'\n\n/* =========================\n * Component\n * ========================= */\nconst TableStyleContextWapperInner: FC<TableStyleWapperProps> = ({\n children,\n clsTablecustom,\n idWapper: externalId\n}) => {\n // server / electron preload → render children\n if (!isClient) {\n return <>{children}</>\n }\n\n // ƯU TIÊN: id ngoài → useId → fallback\n const reactId = useId()\n const idWapper = externalId ?? reactId\n\n return (\n <div\n id={`wapper_menu_context-${idWapper}`}\n className={`border border-[#dedede] rounded-xl overflow-hidden bg-white flex-1 h-full flex flex-col min-h-[360px] ${clsTablecustom ?? ''}`}\n >\n {children}\n </div>\n )\n}\n\n/* =========================\n * Export component (SAFE)\n * ========================= */\nexport const TableStyleContextWapper = memo(\n TableStyleContextWapperInner\n)\n\n/* =========================\n * Helper (EXPORT RIÊNG – SAFE)\n * ========================= */\nexport const getTableStyleWapperId = (externalId?: string) =>\n `wapper_menu_context-${externalId ?? 'default'}`\n"],"mappings":"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","names":["import_lodash","import_lodash","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}
package/dist/index.mjs CHANGED
@@ -168,8 +168,7 @@ import {
168
168
  useMemo as useMemo2
169
169
  } from "react";
170
170
  import {
171
- DataGrid,
172
- SelectColumn
171
+ DataGrid
173
172
  } from "react-data-grid";
174
173
  import "react-data-grid/lib/styles.css";
175
174
 
@@ -219,30 +218,94 @@ var ReactTableGridCustomInner = (props) => {
219
218
  onRowDoubleClick
220
219
  } = props;
221
220
  const isSelectRow = enableSelectRow && selectedRows !== void 0;
221
+ const customRowKeyGetter = useCallback2(
222
+ (row) => {
223
+ if (typeof rowKeyGetter === "function") {
224
+ return rowKeyGetter(row);
225
+ }
226
+ return get(row, rowKeyGetter);
227
+ },
228
+ [rowKeyGetter]
229
+ );
230
+ const selectColumn = useMemo2(
231
+ () => ({
232
+ key: "__select__",
233
+ name: "",
234
+ width: 44,
235
+ frozen: true,
236
+ sortable: false,
237
+ resizable: false,
238
+ renderHeaderCell: () => {
239
+ if (!onSelectedRowsChange) return null;
240
+ const allSelected = (selectedRows == null ? void 0 : selectedRows.size) === data.length && data.length > 0;
241
+ return /* @__PURE__ */ jsx2(
242
+ "input",
243
+ {
244
+ type: "checkbox",
245
+ checked: allSelected,
246
+ onChange: (e) => {
247
+ if (e.target.checked) {
248
+ onSelectedRowsChange(
249
+ new Set(data.map(customRowKeyGetter))
250
+ );
251
+ } else {
252
+ onSelectedRowsChange(/* @__PURE__ */ new Set());
253
+ }
254
+ }
255
+ }
256
+ );
257
+ },
258
+ renderCell: ({ row }) => {
259
+ const key = customRowKeyGetter(row);
260
+ return /* @__PURE__ */ jsx2(
261
+ "input",
262
+ {
263
+ type: "checkbox",
264
+ checked: selectedRows == null ? void 0 : selectedRows.has(key),
265
+ onChange: () => {
266
+ if (!onSelectedRowsChange) return;
267
+ const next = new Set(selectedRows);
268
+ if (next.has(key)) {
269
+ next.delete(key);
270
+ } else {
271
+ next.add(key);
272
+ }
273
+ onSelectedRowsChange(next);
274
+ }
275
+ }
276
+ );
277
+ }
278
+ }),
279
+ [
280
+ customRowKeyGetter,
281
+ data,
282
+ selectedRows,
283
+ onSelectedRowsChange
284
+ ]
285
+ );
222
286
  const newColumns = useMemo2(() => {
223
287
  const cols = [...columns];
224
288
  if (isSelectRow) {
225
- cols.unshift(SelectColumn);
289
+ cols.unshift(selectColumn);
226
290
  }
227
291
  if (!hiddenSTT) {
228
292
  cols.unshift({
229
293
  key: "__index__",
230
294
  name: "STT",
231
295
  width: 80,
296
+ sortable: false,
232
297
  renderCell: ({ rowIdx }) => STT({ page, pageSize }, rowIdx)
233
298
  });
234
299
  }
235
300
  return cols;
236
- }, [columns, hiddenSTT, isSelectRow, page, pageSize]);
237
- const customRowKeyGetter = useCallback2(
238
- (row) => {
239
- if (typeof rowKeyGetter === "function") {
240
- return rowKeyGetter(row);
241
- }
242
- return get(row, rowKeyGetter);
243
- },
244
- [rowKeyGetter]
245
- );
301
+ }, [
302
+ columns,
303
+ hiddenSTT,
304
+ isSelectRow,
305
+ page,
306
+ pageSize,
307
+ selectColumn
308
+ ]);
246
309
  return /* @__PURE__ */ jsxs(
247
310
  "div",
248
311
  {
@@ -275,20 +338,19 @@ var ReactTableGridCustom = memo(
275
338
  );
276
339
 
277
340
  // src/component/ui/Table/TableStyleContextWapper.tsx
278
- import { memo as memo2 } from "react";
341
+ import { memo as memo2, useId } from "react";
279
342
  import { Fragment, jsx as jsx3 } from "react/jsx-runtime";
280
343
  var isClient = typeof window !== "undefined";
281
- var TableStyleContextWapper = ({
344
+ var TableStyleContextWapperInner = ({
282
345
  children,
283
- // contextMenuProps,
284
346
  clsTablecustom,
285
- // renderContext,
286
347
  idWapper: externalId
287
348
  }) => {
288
349
  if (!isClient) {
289
350
  return /* @__PURE__ */ jsx3(Fragment, { children });
290
351
  }
291
- const idWapper = externalId != null ? externalId : "12";
352
+ const reactId = useId();
353
+ const idWapper = externalId != null ? externalId : reactId;
292
354
  return /* @__PURE__ */ jsx3(
293
355
  "div",
294
356
  {
@@ -298,14 +360,14 @@ var TableStyleContextWapper = ({
298
360
  }
299
361
  );
300
362
  };
301
- var TableStyleContextMenuWapper = memo2(
302
- TableStyleContextWapper
363
+ var TableStyleContextWapper = memo2(
364
+ TableStyleContextWapperInner
303
365
  );
304
- TableStyleContextMenuWapper.getIdFromOutside = (externalId) => {
305
- return `wapper_menu_context-${externalId != null ? externalId : "default-id"}`;
306
- };
366
+ var getTableStyleWapperId = (externalId) => `wapper_menu_context-${externalId != null ? externalId : "default"}`;
307
367
  export {
308
368
  ReactTableGridCustom,
309
- TableStyleContextMenuWapper,
369
+ TableStyleContextWapper,
370
+ getTableStyleWapperId,
310
371
  useShowHideColumn
311
372
  };
373
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/functions.ts","../src/helpers/table.ts","../src/utils.ts","../src/hooks/useShowHideColumn.ts","../src/type/table.ts","../src/component/ui/Table/ReactTableGridCustom.tsx","../src/component/Icons.tsx","../src/component/ui/Table/TableStyleContextWapper.tsx"],"sourcesContent":["import { deleteDB, IDBPDatabase, openDB } from 'idb'\nimport { pickBy } from 'lodash'\nimport moment from 'moment'\nimport { optionSelect } from '../type/preload-stubs'\nimport { IObjectParams, IToggleValues } from '../type/renderer'\nexport const setLocalStore = (key: string, value: string): void => {\n if (typeof window !== 'undefined') {\n localStorage.setItem(key, value)\n }\n}\n\nexport const getLocalStore = (key: string): string | null => {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(key)\n } else {\n return null\n }\n}\n\nexport function convertViToEn(str: string, toUpperCase = false): string {\n str = str.toLowerCase()\n str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a')\n str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ/g, 'e')\n str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i')\n str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o')\n str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u')\n str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y')\n str = str.replace(/đ/g, 'd')\n // Some system encode vietnamese combining accent as individual utf-8 characters\n str = str.replace(/\\u0300|\\u0301|\\u0303|\\u0309|\\u0323/g, '') // Huyền sắc hỏi ngã nặng\n str = str.replace(/\\u02C6|\\u0306|\\u031B/g, '') // Â, Ê, Ă, Ơ, Ư\n\n return toUpperCase ? str.toUpperCase() : str\n}\n\nexport const convertNumber = (value: number | string): { value: number; check: boolean } => {\n let num = 0\n if (value) {\n value = value.toString().replace(/[.]/g, '')\n value = value.trim()\n num = Number(value)\n }\n\n const regex = /^-?\\d*$/\n const check = regex.test(num.toString())\n return {\n value: num,\n check\n }\n}\n\nexport const changeTitleDocmemt = (title?: string): void => {\n document.title = `${title} - Phần Mềm MKT`\n}\n\nexport const numberConvert = (num: string | number): string => {\n let t = '0'\n if (num) {\n if (typeof num === 'string') {\n num = Number(num)\n }\n t = num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\n }\n return t\n}\n\nexport const pickBySearch = <T extends Record<string, unknown>>(obj: T): Partial<T> => {\n const filteredObj = pickBy(obj, (value) => value !== '')\n return filteredObj as Partial<T>\n}\n\nexport const getValueSelected = (value?: unknown, options?: optionSelect[]): optionSelect[] => {\n const currentValue = (options ?? [])?.filter((otp) => {\n return Array.isArray(value) ? value?.includes(otp.value) : otp?.value === value\n })\n return currentValue\n}\n\nexport const toggleValues = ({ array, value }: IToggleValues): string[] => {\n if (array.includes(value)) {\n return array.filter((item) => item !== value)\n } else {\n return [...array, value]\n }\n}\n\nexport const arrayLocal = (array?: string): string[] => {\n try {\n const data = array ? JSON.parse(array) : []\n return Array.isArray(data) ? data : []\n } catch {\n return []\n }\n}\n\nexport const formatDate = (\n date?: string | number | Date,\n format: string = 'DD/MM/YYYY HH:mm:ss A'\n): string => {\n return moment(date).format(format)\n}\n\nexport const parseObject = (obj?: string): object => {\n try {\n const data = obj ? JSON.parse(obj) : {}\n return typeof data === 'object' ? data : {}\n } catch {\n return {}\n }\n}\nexport const bufferToBlob = (buffer: ArrayBuffer | Uint8Array, type: string): Blob => {\n return new Blob([buffer as BlobPart], { type })\n}\nconst DB_NAME = 'appDB'\nconst DB_VERSION = 5\nconst STORE_NAME = 'selectedRecords'\nconst HISTORY_STORE = 'recordHistory'\ninterface SelectedRecordEntry {\n actionType: string\n selectedRecords: string[]\n}\n\ninterface RecordHistoryEntry {\n id: string\n previousAction: string[]\n}\n\ntype AppDBSchema = {\n selectedRecords: SelectedRecordEntry\n recordHistory: RecordHistoryEntry\n}\n\nconst requiredStores = [STORE_NAME, HISTORY_STORE]\n\nconst createAppDB = async (): Promise<IDBPDatabase<AppDBSchema>> => {\n return openDB<AppDBSchema>(DB_NAME, DB_VERSION, {\n upgrade(db) {\n for (const storeName of Array.from(db.objectStoreNames)) {\n db.deleteObjectStore(storeName)\n }\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n const store = db.createObjectStore(STORE_NAME, {\n keyPath: 'actionType'\n })\n store.createIndex('by_actionType', 'actionType')\n }\n\n if (!db.objectStoreNames.contains(HISTORY_STORE)) {\n db.createObjectStore(HISTORY_STORE, { keyPath: 'id' })\n }\n }\n })\n}\n\nexport const openAppDB = async (): Promise<IDBPDatabase<AppDBSchema>> => {\n try {\n const db = await createAppDB()\n const hasAllStores = requiredStores.every((store) => db.objectStoreNames.contains(store))\n if (!hasAllStores) {\n console.warn('[IndexedDB] Missing required stores. Resetting DB...')\n db.close()\n await deleteDB(DB_NAME)\n return await createAppDB()\n }\n return db\n } catch (error) {\n if ((error as { name: string })?.name === 'VersionError') {\n console.warn('[IndexedDB] Version downgrade detected. Resetting DB...')\n await deleteDB(DB_NAME)\n return await createAppDB()\n }\n\n console.error('[IndexedDB] Failed to open DB:', error)\n throw error\n }\n}\n\nexport const saveSelectedRecords = async (\n ACTION_TYPE: string,\n selectedRecords: Set<string>\n): Promise<void> => {\n const db = await openAppDB()\n const tx = db.transaction(STORE_NAME, 'readwrite')\n const store = tx.objectStore(STORE_NAME)\n\n const data: SelectedRecordEntry = {\n actionType: ACTION_TYPE,\n selectedRecords: Array.from(selectedRecords)\n }\n\n await store.put(data)\n await tx.done\n}\n\nexport const getSelectedRecords = async (ACTION_TYPE: string): Promise<Set<string>> => {\n const db = await openAppDB()\n const store = db.transaction(STORE_NAME).objectStore(STORE_NAME)\n\n const record = await store.get(ACTION_TYPE)\n\n return new Set(record?.selectedRecords ?? [])\n}\nexport const removeUidsFromAllPathsAndSaveHistory = async (uids: string[]): Promise<void> => {\n const db = await openAppDB()\n const tx = db.transaction([STORE_NAME, HISTORY_STORE], 'readwrite')\n const store = tx.objectStore(STORE_NAME)\n const historyStore = tx.objectStore(HISTORY_STORE)\n\n const allRecords = await store.getAll()\n\n const historyMap: Record<string, string[]> = {}\n\n for (const uid of uids) {\n historyMap[uid] = []\n }\n\n for (const record of allRecords) {\n let updated = false\n\n for (const uid of uids) {\n if (record.selectedRecords.includes(uid)) {\n record.selectedRecords = record.selectedRecords.filter((id: string) => id !== uid)\n historyMap[uid].push(record.actionType)\n updated = true\n }\n }\n\n if (updated) {\n await store.put(record)\n }\n }\n\n // Ghi lại lịch sử path đã bị xóa cho từng UID\n for (const [uid, paths] of Object.entries(historyMap)) {\n if (paths.length > 0) {\n await historyStore.put({ id: uid, previousAction: paths })\n }\n }\n\n await tx.done\n}\n\nexport const restoreUidsToPreviousPaths = async (uids: string[]): Promise<void> => {\n const db = await openAppDB()\n const tx = db.transaction([STORE_NAME, HISTORY_STORE], 'readwrite')\n const store = tx.objectStore(STORE_NAME)\n const historyStore = tx.objectStore(HISTORY_STORE)\n\n for (const uid of uids) {\n const history = await historyStore.get(uid)\n if (history?.previousAction?.length) {\n for (const actionType of history.previousAction) {\n const record = (await store.get(actionType)) || {\n actionType,\n selectedRecords: []\n }\n\n if (!record.selectedRecords.includes(uid)) {\n record.selectedRecords.push(uid)\n }\n\n await store.put(record)\n }\n\n await historyStore.delete(uid)\n }\n }\n\n await tx.done\n}\nexport const deleteUidsCompletely = async (uids: string[]): Promise<void> => {\n const db = await openAppDB()\n const tx = db.transaction(['selectedRecords', 'recordHistory'], 'readwrite')\n const store = tx.objectStore('selectedRecords')\n const historyStore = tx.objectStore('recordHistory')\n\n const allRecords = await store.getAll()\n\n for (const record of allRecords) {\n const originalLength = record.selectedRecords.length\n record.selectedRecords = record.selectedRecords.filter((id: string) => !uids.includes(id))\n\n if (record.selectedRecords.length !== originalLength) {\n await store.put(record)\n }\n }\n for (const uid of uids) {\n await historyStore.delete(uid)\n }\n\n await tx.done\n}\n\nexport const getSelectedCategoryDataByPath = (): string[] => {\n try {\n const saved = localStorage.getItem('selectedCategoryData')\n if (saved) {\n const data = JSON.parse(saved)\n const localPath = window.location.hash.replace(/^#/, '') || '/'\n const categoryData = data[localPath]\n if (categoryData && Array.isArray(categoryData.categoryIds)) {\n return categoryData.categoryIds\n }\n }\n } catch (err) {\n console.warn('Failed to parse localStorage category data:', err)\n }\n\n return []\n}\n\nexport const handleAsyncConfigSearchInitialValue = (): IObjectParams => {\n const defaultConfig: IObjectParams = {\n page: 1,\n pageSize: 1000,\n filterType: 'all'\n }\n\n const categoryIds = getSelectedCategoryDataByPath()\n if (categoryIds.length > 0) {\n return {\n ...defaultConfig,\n categoryId: categoryIds\n }\n }\n\n return defaultConfig\n}\n","import { ICalculatorTotalPage, IPaginationParams } from \"../type/table-type\"\n\nexport const calculatorTotalPage = ({ total = 0, pageSize = 0 }: ICalculatorTotalPage): number => {\n if (!pageSize || (pageSize && pageSize <= 0)) return 0\n return Math.ceil(total / pageSize)\n}\n\nexport const STT = (data?: IPaginationParams, index?: number): number => {\n let stt = 1\n let current_page = 0\n let per_page = 0\n\n if (data?.page !== undefined && data?.pageSize !== undefined) {\n current_page = data.page\n per_page = data.pageSize\n }\n\n let i = (current_page - 1) * per_page\n i = isNaN(i) ? 0 : i\n stt = i + (index ?? 0) + 1\n\n return stt\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","import { arrayLocal, getLocalStore, setLocalStore, toggleValues } from '../helpers'\nimport { useCallback, useMemo, useState } from 'react'\nimport { Column } from 'react-data-grid'\nimport { TColumnsTable, useShowHideColumnParameter, useShowHideColumnReturn } from '../type/table-type'\nimport { uniq } from 'lodash'\nimport { isColumn } from '../type/table'\n\nconst useShowHideColumn = <T, SR = unknown>({\n nameLocal = 'table',\n columns,\n ignoreColumns\n}: useShowHideColumnParameter<T, SR>): useShowHideColumnReturn<T, SR> => {\n const nameLocalLocation = `${nameLocal}_location`\n const [locationColumns, setLocationColumns] = useState<string[]>(() => {\n const dataLocal = getLocalStore(nameLocalLocation)\n if (dataLocal) {\n return arrayLocal(dataLocal)\n }\n return []\n })\n const [hiddenColumns, setHiddenColumns] = useState<string[]>(() => {\n const dataLocal = getLocalStore(nameLocal)\n if (dataLocal) {\n return arrayLocal(dataLocal)\n }\n return []\n })\n\n const handleFindLocation = useCallback(\n (filterColumns: TColumnsTable<T, SR>, arrLoctions = locationColumns) => {\n return arrLoctions?.length > 0\n ? arrLoctions?.reduce(\n (total, current) => {\n const currentColumns = filterColumns?.find((item) => {\n const newItem = item as Column<T>\n return newItem?.key === current\n })\n\n if (currentColumns) {\n total = [...total, currentColumns]\n }\n return total\n },\n [] as TColumnsTable<T, SR>\n )\n : filterColumns\n },\n [locationColumns]\n )\n\n const newCloumnKeys = useMemo(\n () =>\n columns\n ?.filter(isColumn)\n .map(column => column.key),\n [columns]\n )\n\n\n const newColumns = useMemo(() => {\n const filterColumns: TColumnsTable<T, SR> =\n columns?.filter(column => {\n if (!isColumn(column)) return true\n\n const key = column.key\n\n if (ignoreColumns?.includes(key)) return true\n if (hiddenColumns?.includes(key)) return false\n\n return true\n }) ?? []\n\n return handleFindLocation(filterColumns)\n }, [columns, hiddenColumns, locationColumns, ignoreColumns])\n\n const newShowhideColumns = useMemo(() => {\n if (!ignoreColumns) return columns\n\n return (\n columns?.filter(column => {\n if (!isColumn(column)) return true\n return !ignoreColumns.includes(column.key)\n }) ?? []\n )\n }, [columns, ignoreColumns])\n\n const changeHiddenColumn = useCallback(\n (key: string | string[]) => {\n let newData = [...hiddenColumns]\n if (typeof key === 'string') {\n newData = toggleValues({\n array: newData,\n value: key\n })\n } else {\n newData = key\n }\n setLocalStore(nameLocal, JSON.stringify(newData))\n setHiddenColumns(newData)\n },\n [hiddenColumns, nameLocalLocation]\n )\n\n const handleChangeLocation = useCallback(\n (key: string[]) => {\n let newKey = key\n newKey = uniq([...key, ...newCloumnKeys])\n setLocationColumns(newKey)\n setLocalStore(nameLocalLocation, JSON.stringify(newKey))\n },\n [newCloumnKeys]\n )\n\n return {\n hiddenColumns,\n setHiddenColumns,\n columnsTable: newColumns,\n changeHiddenColumn,\n newShowhideColumns,\n locationColumns,\n handleFindLocation,\n handleChangeLocation\n }\n}\n\nexport { useShowHideColumn }\n","import { UseMutateFunction } from '@tanstack/react-query'\nimport { FormikProps } from 'formik'\nimport { Dispatch, HTMLAttributes, ReactNode, SetStateAction } from 'react'\nimport { Props } from 'react-select'\nimport type { IFieldUpdateAndCheck, IMainResponse, ISettingSystem } from './preload-stubs'\nimport type { JobDetail, Proxy } from './vitechgroup-stubs'\n\nimport type { Column, ColumnOrColumnGroup } from 'react-data-grid'\n\nexport function isColumn<T, SR>(\n column: ColumnOrColumnGroup<T, SR>\n): column is Column<T, SR> {\n return 'key' in column\n}\n\nexport interface ITableData {\n t: any\n dataJobDetail?: JobDetail[]\n totalAction?: number\n settingSystem?: ISettingSystem\n readProxyByField?: UseMutateFunction<\n IMainResponse<Proxy[]>,\n Error,\n IFieldUpdateAndCheck<Proxy, undefined, string[]>[],\n unknown\n >\n}\n\nexport interface CustomSelectProps<T> extends Props, Omit<WapperLabelFormProps, 'children'> {\n className?: string\n height?: string\n name: string\n formik?: FormikProps<T>\n msgError?: string\n changeSelected?: (selected?: Record<string, string>) => void\n setValueSearch?: Dispatch<SetStateAction<string>>\n positionMenu?: string\n}\n\nexport interface WapperLabelFormProps {\n classWapper?: HTMLAttributes<HTMLDivElement>['className']\n label?: string\n clsLabelWrapper?: string\n isRequired?: boolean\n children?: ReactNode\n isVertical?: boolean\n}\n","'use client'\n\nimport { get } from 'lodash'\nimport {\n Key,\n memo,\n useCallback,\n useMemo\n} from 'react'\nimport {\n DataGrid,\n type Column,\n type ColumnOrColumnGroup\n} from 'react-data-grid'\nimport 'react-data-grid/lib/styles.css'\n\nimport { cn } from '../../../helpers'\nimport { STT } from '../../../helpers/table'\nimport { LoadingIcon } from '../../Icons'\nimport type { IReactTableGridCustom } from './table-type'\nimport './ReactTableGridCustom.css'\n\nconst ReactTableGridCustomInner = <\n T,\n SR = unknown,\n K extends Key = Key\n>(\n props: IReactTableGridCustom<T, SR, K>\n) => {\n const {\n classNameWapperTable,\n hiddenSTT,\n data,\n page,\n pageSize,\n columns,\n rowKeyGetter = 'uid',\n\n enableSelectRow,\n selectedRows,\n onSelectedRowsChange,\n\n sortColumns,\n onSortColumnsChange,\n\n fetching,\n onRowClick,\n onRowDoubleClick\n } = props\n\n const isSelectRow =\n enableSelectRow && selectedRows !== undefined\n\n /* =========================\n * Row key\n * ========================= */\n const customRowKeyGetter = useCallback(\n (row: T): K => {\n if (typeof rowKeyGetter === 'function') {\n return rowKeyGetter(row)\n }\n return get(row, rowKeyGetter) as K\n },\n [rowKeyGetter]\n )\n\n /* =========================\n * Select column (CUSTOM)\n * ========================= */\n const selectColumn = useMemo<Column<T, SR>>(\n () => ({\n key: '__select__',\n name: '',\n width: 44,\n frozen: true,\n sortable: false,\n resizable: false,\n\n renderHeaderCell: () => {\n if (!onSelectedRowsChange) return null\n\n const allSelected =\n selectedRows?.size === data.length && data.length > 0\n\n return (\n <input\n type=\"checkbox\"\n checked={allSelected}\n onChange={(e) => {\n if (e.target.checked) {\n onSelectedRowsChange(\n new Set(data.map(customRowKeyGetter))\n )\n } else {\n onSelectedRowsChange(new Set())\n }\n }}\n />\n )\n },\n\n renderCell: ({ row }) => {\n const key = customRowKeyGetter(row)\n\n return (\n <input\n type=\"checkbox\"\n checked={selectedRows?.has(key)}\n onChange={() => {\n if (!onSelectedRowsChange) return\n\n const next = new Set(selectedRows)\n if (next.has(key)) {\n next.delete(key)\n } else {\n next.add(key)\n }\n onSelectedRowsChange(next)\n }}\n />\n )\n }\n }),\n [\n customRowKeyGetter,\n data,\n selectedRows,\n onSelectedRowsChange\n ]\n )\n\n /* =========================\n * Columns\n * ========================= */\n const newColumns = useMemo<\n readonly ColumnOrColumnGroup<T, SR>[]\n >(() => {\n const cols = [...columns]\n\n if (isSelectRow) {\n cols.unshift(selectColumn)\n }\n\n if (!hiddenSTT) {\n cols.unshift({\n key: '__index__',\n name: 'STT',\n width: 80,\n sortable: false,\n renderCell: ({ rowIdx }) =>\n STT({ page, pageSize }, rowIdx)\n })\n }\n\n return cols\n }, [\n columns,\n hiddenSTT,\n isSelectRow,\n page,\n pageSize,\n selectColumn\n ])\n\n return (\n <div\n className={cn(\n 'wapper_table flex flex-col h-full min-h-0 relative',\n classNameWapperTable\n )}\n >\n <DataGrid<T, SR, K>\n rows={data}\n columns={newColumns}\n selectedRows={selectedRows}\n onSelectedRowsChange={onSelectedRowsChange}\n rowKeyGetter={isSelectRow ? customRowKeyGetter : undefined}\n sortColumns={sortColumns}\n onSortColumnsChange={onSortColumnsChange}\n onCellClick={({ row, rowIdx }) =>\n onRowClick?.(row, rowIdx)\n }\n onCellDoubleClick={({ row, rowIdx }) =>\n onRowDoubleClick?.(row, rowIdx)\n }\n />\n\n {fetching && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-white/60 z-10\">\n <LoadingIcon isSpin />\n </div>\n )}\n </div>\n )\n}\n\n/* =========================\n * Export\n * ========================= */\nexport const ReactTableGridCustom = memo(\n ReactTableGridCustomInner\n) as typeof ReactTableGridCustomInner\n","import { JSX } from \"react\"\n\nexport const LoadingIcon = ({\n isSpin = false,\n h = 30,\n w = 30,\n size = 30,\n className\n}: {\n isSpin?: boolean\n w?: number\n h?: number\n size?: number\n className?: string\n}): JSX.Element => {\n return (\n <svg\n className={`${isSpin ? 'animate-spin' : ''} ${className ?? ''}`}\n viewBox=\"0 0 1024 1024\"\n focusable=\"false\"\n data-icon=\"loading\"\n width={size || w}\n height={size || h}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M988 548c-19.9 0-36-16.1-36-36 0-59.4-11.6-117-34.6-171.3a440.45 440.45 0 00-94.3-139.9 437.71 437.71 0 00-139.9-94.3C629 83.6 571.4 72 512 72c-19.9 0-36-16.1-36-36s16.1-36 36-36c69.1 0 136.2 13.5 199.3 40.3C772.3 66 827 103 874 150c47 47 83.9 101.8 109.7 162.7 26.7 63.1 40.2 130.2 40.2 199.3.1 19.9-16 36-35.9 36z\"></path>\n </svg>\n )\n}\n\nexport const ArrowIcon = ({\n h,\n w,\n size,\n className\n}: {\n w?: number\n h?: number\n size?: number\n className?: string\n}): JSX.Element => {\n return (\n <svg\n className={className}\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 16 16\"\n height={size ?? h}\n width={size ?? w}\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M8 4a.5.5 0 0 1 .5.5v5.793l2.146-2.147a.5.5 0 0 1 .708.708l-3 3a.5.5 0 0 1-.708 0l-3-3a.5.5 0 1 1 .708-.708L7.5 10.293V4.5A.5.5 0 0 1 8 4\"\n ></path>\n </svg>\n )\n}\n","import { FC, memo, ReactNode, useId } from 'react'\n\n/* =========================\n * Props\n * ========================= */\nexport interface TableStyleWapperProps {\n children?: ReactNode\n clsTablecustom?: string\n idWapper?: string // có thể truyền id từ ngoài\n}\n\n/* =========================\n * Client guard\n * ========================= */\nconst isClient = typeof window !== 'undefined'\n\n/* =========================\n * Component\n * ========================= */\nconst TableStyleContextWapperInner: FC<TableStyleWapperProps> = ({\n children,\n clsTablecustom,\n idWapper: externalId\n}) => {\n // server / electron preload → render children\n if (!isClient) {\n return <>{children}</>\n }\n\n // ƯU TIÊN: id ngoài → useId → fallback\n const reactId = useId()\n const idWapper = externalId ?? reactId\n\n return (\n <div\n id={`wapper_menu_context-${idWapper}`}\n className={`border border-[#dedede] rounded-xl overflow-hidden bg-white flex-1 h-full flex flex-col min-h-[360px] ${clsTablecustom ?? ''}`}\n >\n {children}\n </div>\n )\n}\n\n/* =========================\n * Export component (SAFE)\n * ========================= */\nexport const TableStyleContextWapper = memo(\n TableStyleContextWapperInner\n)\n\n/* =========================\n * Helper (EXPORT RIÊNG – SAFE)\n * ========================= */\nexport const getTableStyleWapperId = (externalId?: string) =>\n `wapper_menu_context-${externalId ?? 'default'}`\n"],"mappings":"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","names":["useCallback","useMemo","jsx","useCallback","useMemo","memo","jsx"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mkt-loitd/react-table-grid-custom",
3
- "version": "1.4.2",
3
+ "version": "1.4.6",
4
4
  "description": "React Table Grid Custom component",
5
5
  "license": "ISC",
6
6
  "private": false,
@@ -21,36 +21,30 @@
21
21
  "dist",
22
22
  "README.md"
23
23
  ],
24
- "sideEffects": false,
24
+ "sideEffects": [
25
+ "*.css"
26
+ ],
25
27
  "scripts": {
26
- "dev": "tsup src/index.ts --watch --format esm,cjs --dts",
28
+ "dev": "tsup --watch",
27
29
  "build": "tsup src/index.ts --format esm,cjs --dts",
28
30
  "prebuild": "node scripts/prebuild.js",
29
31
  "release:patch": "npm version patch --no-git-tag-version"
30
32
  },
31
33
  "peerDependencies": {
32
- "@tanstack/react-query": "^5.0.0",
33
- "@tanstack/query-core": "^5.0.0",
34
+ "idb": "^8.0.0",
34
35
  "react": ">=18",
35
- "react-dom": ">=18"
36
+ "react-dom": ">=18",
37
+ "@mantine/core": "^8",
38
+ "react-data-grid": "^7.0.0-beta",
39
+ "@tanstack/react-query": "^5"
36
40
  },
37
41
  "dependencies": {
38
- "@mantine/core": "^8.3.10",
39
- "@tippyjs/react": "^4.2.6",
40
42
  "clsx": "^2.1.1",
41
- "formik": "^2.4.9",
42
- "idb": "^8.0.3",
43
43
  "lodash": "^4.17.21",
44
44
  "moment": "^2.30.1",
45
- "react-data-grid": "^7.0.0-beta.59",
46
- "react-icons": "^5.5.0",
47
- "react-select": "^5.10.2",
48
- "tailwind-merge": "^3.4.0",
49
- "typeorm": "^0.3.28"
45
+ "tailwind-merge": "^3.4.0"
50
46
  },
51
47
  "devDependencies": {
52
- "@tanstack/react-query": "^5.0.0",
53
- "@tanstack/query-core": "^5.0.0",
54
48
  "@types/lodash": "^4.17.21",
55
49
  "@types/react": ">=18",
56
50
  "@types/react-dom": ">=18",