@tap-payments/os-micro-frontend-shared 0.1.376-test.9 → 0.1.377-test.1

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.
Files changed (59) hide show
  1. package/build/components/TableCells/CustomCells/BalanceCell/BalanceCell.js +8 -3
  2. package/build/components/TableHeader/FiltersRow.d.ts +1 -1
  3. package/build/components/TableHeader/FiltersRow.js +4 -2
  4. package/build/components/TableHeader/TableHeader.d.ts +1 -1
  5. package/build/components/TableHeader/TableHeader.js +2 -2
  6. package/build/components/TableHeader/TableView/CreateViewDialog.d.ts +3 -0
  7. package/build/components/TableHeader/TableView/CreateViewDialog.js +91 -0
  8. package/build/components/TableHeader/TableView/CustomViews.js +1 -1
  9. package/build/components/TableHeader/TableView/TableView.js +0 -1
  10. package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +5 -0
  11. package/build/components/TableHeader/TableView/ViewsDropdown.js +189 -0
  12. package/build/components/TableHeader/TableView/ViewsMenu.d.ts +5 -0
  13. package/build/components/TableHeader/TableView/ViewsMenu.js +76 -0
  14. package/build/components/TableHeader/TableView/components/ColumnList.d.ts +3 -0
  15. package/build/components/TableHeader/TableView/components/ColumnList.js +70 -0
  16. package/build/components/TableHeader/TableView/components/ViewsSubmenu.d.ts +3 -0
  17. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +75 -0
  18. package/build/components/TableHeader/TableView/components/index.d.ts +2 -0
  19. package/build/components/TableHeader/TableView/components/index.js +2 -0
  20. package/build/components/TableHeader/TableView/constants.d.ts +10 -0
  21. package/build/components/TableHeader/TableView/constants.js +10 -0
  22. package/build/components/TableHeader/TableView/data.d.ts +5 -0
  23. package/build/components/TableHeader/TableView/data.js +48 -0
  24. package/build/components/TableHeader/TableView/hooks/index.d.ts +6 -0
  25. package/build/components/TableHeader/TableView/hooks/index.js +6 -0
  26. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.d.ts +22 -0
  27. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +86 -0
  28. package/build/components/TableHeader/TableView/hooks/useDialogPosition.d.ts +8 -0
  29. package/build/components/TableHeader/TableView/hooks/useDialogPosition.js +16 -0
  30. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.d.ts +7 -0
  31. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.js +27 -0
  32. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.d.ts +6 -0
  33. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.js +18 -0
  34. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.d.ts +8 -0
  35. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.js +43 -0
  36. package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +9 -0
  37. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +62 -0
  38. package/build/components/TableHeader/TableView/hooks/useViewsMenu.d.ts +44 -0
  39. package/build/components/TableHeader/TableView/hooks/useViewsMenu.js +177 -0
  40. package/build/components/TableHeader/TableView/index.d.ts +12 -3
  41. package/build/components/TableHeader/TableView/index.js +11 -3
  42. package/build/components/TableHeader/TableView/styles.d.ts +127 -0
  43. package/build/components/TableHeader/TableView/styles.js +426 -0
  44. package/build/components/TableHeader/TableView/types.d.ts +182 -0
  45. package/build/components/TableHeader/TableView/types.js +1 -0
  46. package/build/components/TableHeader/TableView/utils.d.ts +121 -0
  47. package/build/components/TableHeader/TableView/utils.js +469 -0
  48. package/build/components/TableHeader/index.d.ts +1 -0
  49. package/build/components/TableHeader/type.d.ts +15 -1
  50. package/build/components/VirtualTables/VirtualTable/VirtualTable.d.ts +1 -1
  51. package/build/components/VirtualTables/VirtualTable/VirtualTable.js +4 -3
  52. package/build/constants/assets.d.ts +1 -0
  53. package/build/constants/assets.js +1 -0
  54. package/build/types/table.d.ts +1 -0
  55. package/build/utils/index.d.ts +1 -0
  56. package/build/utils/index.js +1 -0
  57. package/build/utils/skeletonColumns.d.ts +4 -0
  58. package/build/utils/skeletonColumns.js +17 -0
  59. package/package.json +3 -2
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import React, { useMemo } from 'react';
3
+ import { Box, Typography, Divider, Popper } from '@mui/material';
4
+ import { Reorder } from 'framer-motion';
5
+ import { Checkbox, MenuItem } from '../../../index.js';
6
+ import { blackRightArrowIcon } from '../../../../constants/index.js';
7
+ import { getColumnCheckState, isDateColumn } from '../utils';
8
+ import { ResetHeaderBox, ResetCheckboxSx, ColumnItemsContainer, SubmenuPaper } from '../styles';
9
+ import { useNestedSubmenu } from '../hooks/useNestedSubmenu';
10
+ export const ViewsSubmenu = ({ columns, allCurrentSelected, someCurrentSelected, onSelectAll, onReset, onColumnToggle, onNestedItemToggle, onReorder, anchorEl, isModified = false, }) => {
11
+ const { hoveredNestedColumn, nestedSubmenuAnchorEl, openNestedSubmenu, closeNestedSubmenu, cancelNestedClose } = useNestedSubmenu();
12
+ const columnNames = useMemo(() => columns.map((col) => col.name), [columns]);
13
+ return (_jsxs(_Fragment, { children: [_jsxs(ResetHeaderBox, { children: [_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 1 } }, { children: _jsx(Checkbox, { checked: allCurrentSelected, indeterminate: someCurrentSelected, onChange: (e) => {
14
+ e.stopPropagation();
15
+ onSelectAll();
16
+ }, onClick: (e) => {
17
+ e.stopPropagation();
18
+ }, sx: ResetCheckboxSx }) })), _jsx(Typography, Object.assign({ component: "button", onClick: (e) => {
19
+ e.stopPropagation();
20
+ onReset();
21
+ }, sx: {
22
+ fontSize: 11,
23
+ fontWeight: 500,
24
+ color: '#1F88D0',
25
+ background: 'none',
26
+ border: 'none',
27
+ cursor: 'pointer',
28
+ padding: 0,
29
+ opacity: isModified ? 1 : 0.5,
30
+ '&:hover': {
31
+ textDecoration: 'underline',
32
+ },
33
+ } }, { children: "Reset" }))] }), _jsx(Divider, {}), _jsx(ColumnItemsContainer, { children: _jsx(Reorder.Group, Object.assign({ axis: "y", onReorder: onReorder, values: columnNames, style: { listStyle: 'none', padding: 0, margin: 0 } }, { children: columns.map((column, columnIndex) => {
34
+ var _a;
35
+ const hasNestedSubmenu = column.menuItems && column.menuItems.length > 0;
36
+ const { checked, indeterminate } = getColumnCheckState(column);
37
+ const isDate = isDateColumn(column.name);
38
+ return (_jsxs(Reorder.Item, Object.assign({ value: column.name, drag: !isDate, dragListener: !isDate, transition: { duration: 0 }, whileDrag: { zIndex: 9999, boxShadow: '0 4px 12px rgba(0,0,0,0.15)', scale: 1.02 }, style: {
39
+ listStyle: 'none',
40
+ margin: 0,
41
+ padding: 0,
42
+ position: 'relative',
43
+ zIndex: 1,
44
+ backgroundColor: '#fff',
45
+ width: '100%',
46
+ willChange: 'transform',
47
+ }, onDragStart: (e) => {
48
+ const target = e.target;
49
+ if (target.closest('[role="checkbox"]') ||
50
+ target.closest('input[type="checkbox"]') ||
51
+ target.closest('[class*="CheckboxWrapper"]')) {
52
+ e.preventDefault();
53
+ }
54
+ } }, { children: [_jsxs(Box, Object.assign({ sx: { position: 'relative' }, onMouseEnter: (e) => hasNestedSubmenu && openNestedSubmenu(column.name, e.currentTarget), onMouseLeave: () => hasNestedSubmenu && closeNestedSubmenu() }, { children: [_jsxs(Box, Object.assign({ sx: {
55
+ display: 'flex',
56
+ alignItems: 'center',
57
+ justifyContent: 'space-between',
58
+ width: '100%',
59
+ } }, { children: [_jsx(MenuItem, Object.assign({ isSelected: hasNestedSubmenu ? checked : column.selected, isIndeterminate: hasNestedSubmenu ? indeterminate : false, isDisabled: isDate, onClick: () => {
60
+ if (!isDate) {
61
+ onColumnToggle(column.name);
62
+ }
63
+ }, sx: { flex: 1, display: 'flex', alignItems: 'center' } }, { children: _jsx("span", { children: column.label || column.name }) })), hasNestedSubmenu && (_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', pr: 1, pointerEvents: 'none' } }, { children: _jsx("img", { src: blackRightArrowIcon, alt: "arrow", style: { height: 12 } }) })))] })), hasNestedSubmenu && (_jsx(Popper, Object.assign({ open: hoveredNestedColumn === column.name, anchorEl: nestedSubmenuAnchorEl, placement: "right-start", sx: { zIndex: 10000 }, modifiers: [
64
+ {
65
+ name: 'offset',
66
+ options: {
67
+ offset: [0, 0],
68
+ },
69
+ },
70
+ ] }, { children: _jsxs(Box, Object.assign({ onMouseEnter: cancelNestedClose, onMouseLeave: closeNestedSubmenu, sx: { display: 'flex', pl: 0.5 } }, { children: [_jsx(Box, { sx: { width: 8, height: '100%', position: 'absolute', left: -8, top: 0, bottom: 0 } }), _jsx(SubmenuPaper, { children: (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.map((subItem, subItemIndex) => {
71
+ var _a, _b;
72
+ return (_jsxs(React.Fragment, { children: [_jsx(MenuItem, Object.assign({ isSelected: subItem.selected, onClick: () => onNestedItemToggle(column.name, subItem.name) }, { children: subItem.label || subItem.name })), subItemIndex < ((_b = (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1 && _jsx(Divider, {})] }, subItem.name));
73
+ }) })] })) })))] })), columnIndex < columns.length - 1 && _jsx(Divider, {})] }), column.name));
74
+ }) })) })] }));
75
+ };
@@ -0,0 +1,2 @@
1
+ export { ColumnList } from './ColumnList';
2
+ export { ViewsSubmenu } from './ViewsSubmenu';
@@ -0,0 +1,2 @@
1
+ export { ColumnList } from './ColumnList';
2
+ export { ViewsSubmenu } from './ViewsSubmenu';
@@ -0,0 +1,10 @@
1
+ export declare const DIALOG_WIDTH = 450;
2
+ export declare const DIALOG_HEIGHT = 600;
3
+ export declare const SUBMENU_CLOSE_DELAY = 150;
4
+ export declare const MAX_CUSTOM_VIEWS = 3;
5
+ export declare const TEMPLATE_NAME_MAX_LENGTH = 20;
6
+ export declare const DATE_COLUMN_CONFIG: {
7
+ readonly name: "date";
8
+ readonly label: "Date";
9
+ readonly selected: true;
10
+ };
@@ -0,0 +1,10 @@
1
+ export const DIALOG_WIDTH = 450;
2
+ export const DIALOG_HEIGHT = 600;
3
+ export const SUBMENU_CLOSE_DELAY = 150;
4
+ export const MAX_CUSTOM_VIEWS = 3;
5
+ export const TEMPLATE_NAME_MAX_LENGTH = 20;
6
+ export const DATE_COLUMN_CONFIG = {
7
+ name: 'date',
8
+ label: 'Date',
9
+ selected: true,
10
+ };
@@ -0,0 +1,5 @@
1
+ import type { ColumnViewProps } from '../../../types/index.js';
2
+ import type { ViewMenuItem } from './types';
3
+ export declare const advancedColumns: ColumnViewProps[];
4
+ export declare const sheetColumns: ColumnViewProps[];
5
+ export declare const defaultViewList: ViewMenuItem[];
@@ -0,0 +1,48 @@
1
+ export const advancedColumns = [
2
+ {
3
+ name: 'customer',
4
+ label: 'Customer',
5
+ selected: true,
6
+ menuItems: [
7
+ { name: 'customer_id', label: 'ID', selected: true },
8
+ { name: 'customer_name', label: 'Name', selected: true },
9
+ { name: 'customer_email', label: 'Email', selected: true },
10
+ { name: 'customer_phone', label: 'Phone', selected: false },
11
+ ],
12
+ },
13
+ {
14
+ name: 'transaction',
15
+ label: 'Transaction',
16
+ selected: true,
17
+ menuItems: [
18
+ { name: 'transaction_id', label: 'Transaction ID', selected: true },
19
+ { name: 'transaction_amount', label: 'Amount', selected: true },
20
+ { name: 'transaction_status', label: 'Status', selected: false },
21
+ { name: 'transaction_type', label: 'Type', selected: false },
22
+ ],
23
+ },
24
+ {
25
+ name: 'payment',
26
+ label: 'Payment',
27
+ selected: false,
28
+ menuItems: [
29
+ { name: 'payment_method', label: 'Method', selected: false },
30
+ { name: 'payment_card', label: 'Card', selected: false },
31
+ { name: 'payment_bank', label: 'Bank', selected: false },
32
+ ],
33
+ },
34
+ ];
35
+ export const sheetColumns = [
36
+ { name: 'customerID', label: 'Customer ID', selected: true },
37
+ { name: 'customerName', label: 'Customer Name', selected: true },
38
+ { name: 'amount', label: 'Amount', selected: true },
39
+ { name: 'status', label: 'Status', selected: false },
40
+ { name: 'currency', label: 'Currency', selected: false },
41
+ { name: 'reference', label: 'Reference', selected: true },
42
+ ];
43
+ export const defaultViewList = [
44
+ {
45
+ label: 'Default',
46
+ id: 'default',
47
+ },
48
+ ];
@@ -1,3 +1,9 @@
1
1
  export { useSubMenu } from './useSubMenu';
2
2
  export { useViewColumns } from './useViewColumns';
3
3
  export { useColumnItem } from './useColumnItem';
4
+ export { useViewsManager } from './useViewsManager';
5
+ export { useViewsMenu } from './useViewsMenu';
6
+ export { useSubmenuHover } from './useSubmenuHover';
7
+ export { useOriginalColumns } from './useOriginalColumns';
8
+ export { useNestedSubmenu } from './useNestedSubmenu';
9
+ export { useCreateViewDialog } from './useCreateViewDialog';
@@ -1,3 +1,9 @@
1
1
  export { useSubMenu } from './useSubMenu';
2
2
  export { useViewColumns } from './useViewColumns';
3
3
  export { useColumnItem } from './useColumnItem';
4
+ export { useViewsManager } from './useViewsManager';
5
+ export { useViewsMenu } from './useViewsMenu';
6
+ export { useSubmenuHover } from './useSubmenuHover';
7
+ export { useOriginalColumns } from './useOriginalColumns';
8
+ export { useNestedSubmenu } from './useNestedSubmenu';
9
+ export { useCreateViewDialog } from './useCreateViewDialog';
@@ -0,0 +1,22 @@
1
+ /// <reference types="react" />
2
+ import type { ColumnViewProps } from '../../../../types/index.js';
3
+ import type { UseCreateViewDialogProps } from '../types';
4
+ export declare const useCreateViewDialog: ({ open, availableColumns, defaultColumns, editingView, tableViews }: UseCreateViewDialogProps) => {
5
+ templateName: string;
6
+ setTemplateName: import("react").Dispatch<import("react").SetStateAction<string>>;
7
+ selectedColumns: ColumnViewProps[];
8
+ columnNames: string[];
9
+ allSelected: boolean;
10
+ someSelected: boolean;
11
+ isNameValid: boolean;
12
+ hoveredColumn: string | null;
13
+ anchorEl: HTMLElement | null;
14
+ openSubmenu: (columnName: string, element: HTMLElement) => void;
15
+ closeSubmenu: () => void;
16
+ cancelClose: () => void;
17
+ handleReorder: (reorderedNames: string[]) => void;
18
+ handleColumnToggle: (columnName: string) => void;
19
+ handleSubItemToggle: (columnName: string, subItemName: string) => void;
20
+ handleSelectAll: () => void;
21
+ handleResetToDefault: () => void;
22
+ };
@@ -0,0 +1,86 @@
1
+ import { useState, useEffect, useMemo, useRef } from 'react';
2
+ import { DATE_COLUMN_CONFIG, TEMPLATE_NAME_MAX_LENGTH } from '../constants';
3
+ import { initializeEditingColumns, initializeCreateColumns, initializeCreateColumnsWithCurrentState, resetColumnsToDefault, toggleColumn, toggleSubItem, toggleAllColumns, areAllColumnsSelected, areSomeColumnsSelected, isValidTemplateName, } from '../utils';
4
+ import { useSubmenuHover } from './useSubmenuHover';
5
+ export const useCreateViewDialog = ({ open, availableColumns, defaultColumns, editingView, tableViews = [] }) => {
6
+ const [templateName, setTemplateName] = useState(() => (editingView === null || editingView === void 0 ? void 0 : editingView.label) || '');
7
+ const [selectedColumns, setSelectedColumns] = useState([]);
8
+ const previousOpenRef = useRef(false);
9
+ const { hoveredColumn, anchorEl, openSubmenu, closeSubmenu, cancelClose } = useSubmenuHover();
10
+ const dateColumn = DATE_COLUMN_CONFIG;
11
+ useEffect(() => {
12
+ var _a, _b;
13
+ if (!open) {
14
+ previousOpenRef.current = false;
15
+ return;
16
+ }
17
+ const wasClosed = !previousOpenRef.current;
18
+ if (wasClosed && open) {
19
+ if (editingView) {
20
+ // Use the saved submenu from editingView if available, otherwise fall back to defaultColumns
21
+ const savedColumns = editingView.submenu && editingView.submenu.length > 0 ? editingView.submenu : defaultColumns;
22
+ const otherColumns = initializeEditingColumns(savedColumns, availableColumns);
23
+ setSelectedColumns([dateColumn, ...otherColumns]);
24
+ // Ensure templateName is set to editingView.label (fallback to empty string if undefined)
25
+ const nameToSet = ((_a = editingView.label) === null || _a === void 0 ? void 0 : _a.trim()) || '';
26
+ setTemplateName(nameToSet);
27
+ }
28
+ else {
29
+ const otherColumns = tableViews && tableViews.length > 0
30
+ ? initializeCreateColumnsWithCurrentState(availableColumns, tableViews)
31
+ : initializeCreateColumns(availableColumns);
32
+ setSelectedColumns([dateColumn, ...otherColumns]);
33
+ setTemplateName('');
34
+ }
35
+ }
36
+ else if (open && editingView) {
37
+ // Update templateName when editingView changes while dialog is open
38
+ const nameToSet = ((_b = editingView.label) === null || _b === void 0 ? void 0 : _b.trim()) || '';
39
+ setTemplateName(nameToSet);
40
+ }
41
+ previousOpenRef.current = open;
42
+ }, [open, editingView === null || editingView === void 0 ? void 0 : editingView.id, editingView === null || editingView === void 0 ? void 0 : editingView.label, editingView === null || editingView === void 0 ? void 0 : editingView.submenu, availableColumns, defaultColumns, tableViews, dateColumn]);
43
+ const columnNames = useMemo(() => selectedColumns.map((col) => col.name), [selectedColumns]);
44
+ const allSelected = useMemo(() => areAllColumnsSelected(selectedColumns), [selectedColumns]);
45
+ const someSelected = useMemo(() => areSomeColumnsSelected(selectedColumns, allSelected), [selectedColumns, allSelected]);
46
+ const isNameValid = useMemo(() => isValidTemplateName(templateName, TEMPLATE_NAME_MAX_LENGTH), [templateName]);
47
+ const handleReorder = (reorderedNames) => {
48
+ const reorderedColumns = reorderedNames
49
+ .map((name) => selectedColumns.find((col) => col.name === name))
50
+ .filter((col) => Boolean(col));
51
+ setSelectedColumns(reorderedColumns);
52
+ };
53
+ const handleColumnToggle = (columnName) => {
54
+ setSelectedColumns((prev) => toggleColumn(prev, columnName));
55
+ };
56
+ const handleSubItemToggle = (columnName, subItemName) => {
57
+ setSelectedColumns((prev) => toggleSubItem(prev, columnName, subItemName));
58
+ };
59
+ const handleSelectAll = () => {
60
+ setSelectedColumns((prev) => toggleAllColumns(prev, !allSelected));
61
+ };
62
+ const handleResetToDefault = () => {
63
+ const columnsSource = defaultColumns.length > 0 ? defaultColumns : availableColumns;
64
+ const otherColumns = resetColumnsToDefault(columnsSource);
65
+ setSelectedColumns([dateColumn, ...otherColumns]);
66
+ };
67
+ return {
68
+ templateName,
69
+ setTemplateName,
70
+ selectedColumns,
71
+ columnNames,
72
+ allSelected,
73
+ someSelected,
74
+ isNameValid,
75
+ hoveredColumn,
76
+ anchorEl,
77
+ openSubmenu,
78
+ closeSubmenu,
79
+ cancelClose,
80
+ handleReorder,
81
+ handleColumnToggle,
82
+ handleSubItemToggle,
83
+ handleSelectAll,
84
+ handleResetToDefault,
85
+ };
86
+ };
@@ -0,0 +1,8 @@
1
+ export declare const useDialogPosition: (dialogWidth: number, dialogHeight: number) => {
2
+ position: {
3
+ x: number;
4
+ y: number;
5
+ };
6
+ resetPosition: () => void;
7
+ updatePosition: (x: number, y: number) => void;
8
+ };
@@ -0,0 +1,16 @@
1
+ import { useState, useCallback } from 'react';
2
+ export const useDialogPosition = (dialogWidth, dialogHeight) => {
3
+ const [position, setPosition] = useState({ x: 0, y: 0 });
4
+ const resetPosition = useCallback(() => {
5
+ const centerX = window.innerWidth / 2 - dialogWidth / 2;
6
+ const centerY = window.innerHeight / 2 - dialogHeight / 2;
7
+ setPosition({
8
+ x: Math.max(0, centerX),
9
+ y: Math.max(0, centerY),
10
+ });
11
+ }, [dialogWidth, dialogHeight]);
12
+ const updatePosition = useCallback((x, y) => {
13
+ setPosition({ x, y });
14
+ }, []);
15
+ return { position, resetPosition, updatePosition };
16
+ };
@@ -0,0 +1,7 @@
1
+ export declare const useNestedSubmenu: () => {
2
+ hoveredNestedColumn: string | null;
3
+ nestedSubmenuAnchorEl: HTMLElement | null;
4
+ openNestedSubmenu: (columnName: string, element: HTMLElement) => void;
5
+ closeNestedSubmenu: () => void;
6
+ cancelNestedClose: () => void;
7
+ };
@@ -0,0 +1,27 @@
1
+ import { useState, useRef, useCallback } from 'react';
2
+ export const useNestedSubmenu = () => {
3
+ const [hoveredNestedColumn, setHoveredNestedColumn] = useState(null);
4
+ const [nestedSubmenuAnchorEl, setNestedSubmenuAnchorEl] = useState(null);
5
+ const nestedCloseTimeoutRef = useRef(null);
6
+ const openNestedSubmenu = useCallback((columnName, element) => {
7
+ setHoveredNestedColumn(columnName);
8
+ setNestedSubmenuAnchorEl(element);
9
+ }, []);
10
+ const closeNestedSubmenu = useCallback(() => {
11
+ setHoveredNestedColumn(null);
12
+ setNestedSubmenuAnchorEl(null);
13
+ }, []);
14
+ const cancelNestedClose = useCallback(() => {
15
+ if (nestedCloseTimeoutRef.current) {
16
+ clearTimeout(nestedCloseTimeoutRef.current);
17
+ nestedCloseTimeoutRef.current = null;
18
+ }
19
+ }, []);
20
+ return {
21
+ hoveredNestedColumn,
22
+ nestedSubmenuAnchorEl,
23
+ openNestedSubmenu,
24
+ closeNestedSubmenu,
25
+ cancelNestedClose,
26
+ };
27
+ };
@@ -0,0 +1,6 @@
1
+ import type { ColumnViewProps } from '../../../../types/index.js';
2
+ export declare const useOriginalColumns: (defaultColumns: ColumnViewProps[]) => {
3
+ originalColumns: ColumnViewProps[];
4
+ saveOriginalState: () => void;
5
+ clearOriginalState: () => void;
6
+ };
@@ -0,0 +1,18 @@
1
+ import { useState, useCallback } from 'react';
2
+ export const useOriginalColumns = (defaultColumns) => {
3
+ const [originalColumns, setOriginalColumns] = useState([]);
4
+ const saveOriginalState = useCallback(() => {
5
+ setOriginalColumns(defaultColumns.map((col) => {
6
+ var _a;
7
+ return (Object.assign(Object.assign({}, col), { selected: col.selected, menuItems: (_a = col.menuItems) === null || _a === void 0 ? void 0 : _a.map((item) => (Object.assign(Object.assign({}, item), { selected: item.selected }))) }));
8
+ }));
9
+ }, [defaultColumns]);
10
+ const clearOriginalState = useCallback(() => {
11
+ setOriginalColumns([]);
12
+ }, []);
13
+ return {
14
+ originalColumns,
15
+ saveOriginalState,
16
+ clearOriginalState,
17
+ };
18
+ };
@@ -0,0 +1,8 @@
1
+ export declare const useSubmenuHover: () => {
2
+ hoveredColumn: string | null;
3
+ anchorEl: HTMLElement | null;
4
+ openSubmenu: (columnName: string, element: HTMLElement) => void;
5
+ closeSubmenu: () => void;
6
+ cancelClose: () => void;
7
+ forceClose: () => void;
8
+ };
@@ -0,0 +1,43 @@
1
+ import { useState, useRef, useCallback } from 'react';
2
+ import { SUBMENU_CLOSE_DELAY } from '../constants';
3
+ export const useSubmenuHover = () => {
4
+ const [hoveredColumn, setHoveredColumn] = useState(null);
5
+ const [anchorEl, setAnchorEl] = useState(null);
6
+ const closeTimeoutRef = useRef(null);
7
+ const openSubmenu = useCallback((columnName, element) => {
8
+ if (closeTimeoutRef.current) {
9
+ clearTimeout(closeTimeoutRef.current);
10
+ closeTimeoutRef.current = null;
11
+ }
12
+ setHoveredColumn(columnName);
13
+ setAnchorEl(element);
14
+ }, []);
15
+ const closeSubmenu = useCallback(() => {
16
+ closeTimeoutRef.current = setTimeout(() => {
17
+ setHoveredColumn(null);
18
+ setAnchorEl(null);
19
+ }, SUBMENU_CLOSE_DELAY);
20
+ }, []);
21
+ const cancelClose = useCallback(() => {
22
+ if (closeTimeoutRef.current) {
23
+ clearTimeout(closeTimeoutRef.current);
24
+ closeTimeoutRef.current = null;
25
+ }
26
+ }, []);
27
+ const forceClose = useCallback(() => {
28
+ if (closeTimeoutRef.current) {
29
+ clearTimeout(closeTimeoutRef.current);
30
+ closeTimeoutRef.current = null;
31
+ }
32
+ setHoveredColumn(null);
33
+ setAnchorEl(null);
34
+ }, []);
35
+ return {
36
+ hoveredColumn,
37
+ anchorEl,
38
+ openSubmenu,
39
+ closeSubmenu,
40
+ cancelClose,
41
+ forceClose,
42
+ };
43
+ };
@@ -0,0 +1,9 @@
1
+ import type { ColumnViewProps } from '../../../../types/index.js';
2
+ import type { UseViewsManagerProps, ViewMenuItem } from '../types';
3
+ export declare const useViewsManager: ({ tableMode, templates, lang }: UseViewsManagerProps) => {
4
+ defaultTemplate: ViewMenuItem | undefined;
5
+ customViews: ViewMenuItem[];
6
+ allTemplates: ViewMenuItem[];
7
+ defaultColumns: ColumnViewProps[];
8
+ updateDefaultColumns: (columns: ColumnViewProps[]) => void;
9
+ };
@@ -0,0 +1,62 @@
1
+ import { useState, useEffect, useMemo, useCallback } from 'react';
2
+ import { transformTemplatesToViewMenuItems, deepCloneColumns } from '../utils';
3
+ export const useViewsManager = ({ tableMode, templates, lang = 'en' }) => {
4
+ const parsedTemplates = useMemo(() => {
5
+ if (!templates || templates.length === 0) {
6
+ return {
7
+ customViews: [],
8
+ defaultTemplate: undefined,
9
+ templateDefaultColumns: [],
10
+ allTemplates: [],
11
+ };
12
+ }
13
+ const { customViews, defaultTemplate } = transformTemplatesToViewMenuItems(templates, tableMode, lang);
14
+ const allTemplates = defaultTemplate ? [defaultTemplate, ...customViews] : customViews;
15
+ return {
16
+ customViews,
17
+ defaultTemplate,
18
+ templateDefaultColumns: (defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.submenu) || [],
19
+ allTemplates,
20
+ };
21
+ }, [templates, tableMode, lang]);
22
+ const [defaultColumns, setDefaultColumns] = useState([]);
23
+ const [initializedMode, setInitializedMode] = useState(null);
24
+ useEffect(() => {
25
+ if (initializedMode !== tableMode && parsedTemplates.templateDefaultColumns.length > 0) {
26
+ setDefaultColumns(deepCloneColumns(parsedTemplates.templateDefaultColumns));
27
+ setInitializedMode(tableMode);
28
+ }
29
+ }, [tableMode, parsedTemplates.templateDefaultColumns, initializedMode]);
30
+ const updateDefaultColumns = useCallback((columns) => {
31
+ setDefaultColumns(deepCloneColumns(columns));
32
+ }, []);
33
+ const updatedDefaultTemplate = useMemo(() => {
34
+ if (!parsedTemplates.defaultTemplate) {
35
+ return parsedTemplates.defaultTemplate;
36
+ }
37
+ const columnsToUse = initializedMode !== tableMode ? parsedTemplates.templateDefaultColumns : defaultColumns;
38
+ if (columnsToUse.length === 0) {
39
+ return parsedTemplates.defaultTemplate;
40
+ }
41
+ return Object.assign(Object.assign({}, parsedTemplates.defaultTemplate), { submenu: columnsToUse, columns: columnsToUse.map((col) => col.name) });
42
+ }, [parsedTemplates.defaultTemplate, parsedTemplates.templateDefaultColumns, defaultColumns, initializedMode, tableMode]);
43
+ const updatedAllTemplates = useMemo(() => {
44
+ if (!updatedDefaultTemplate) {
45
+ return parsedTemplates.customViews;
46
+ }
47
+ return [updatedDefaultTemplate, ...parsedTemplates.customViews];
48
+ }, [updatedDefaultTemplate, parsedTemplates.customViews]);
49
+ const effectiveDefaultColumns = useMemo(() => {
50
+ if (initializedMode !== tableMode && defaultColumns.length === 0) {
51
+ return parsedTemplates.templateDefaultColumns;
52
+ }
53
+ return defaultColumns.length > 0 ? defaultColumns : parsedTemplates.templateDefaultColumns;
54
+ }, [initializedMode, tableMode, defaultColumns, parsedTemplates.templateDefaultColumns]);
55
+ return {
56
+ defaultTemplate: updatedDefaultTemplate,
57
+ customViews: parsedTemplates.customViews,
58
+ allTemplates: updatedAllTemplates,
59
+ defaultColumns: effectiveDefaultColumns,
60
+ updateDefaultColumns,
61
+ };
62
+ };
@@ -0,0 +1,44 @@
1
+ import { type MouseEvent } from 'react';
2
+ import type { ColumnViewProps, TableMode } from '../../../../types/index.js';
3
+ import type { ViewMenuItem, LayoutSection } from '../types';
4
+ import type { ViewOption } from '../../type';
5
+ export interface UseViewsMenuProps {
6
+ mode: TableMode;
7
+ onViewChange?: (selectedView?: ViewMenuItem) => void;
8
+ onCreateCustomView?: (data: {
9
+ name: string;
10
+ selectedColumns: ColumnViewProps[];
11
+ layout: LayoutSection;
12
+ }) => Promise<void>;
13
+ onEditCustomView?: (viewId: string, data: {
14
+ name: string;
15
+ selectedColumns: ColumnViewProps[];
16
+ layout: LayoutSection;
17
+ }) => Promise<void>;
18
+ onDeleteCustomView?: (viewId: string) => Promise<void>;
19
+ defaultColumns: ColumnViewProps[];
20
+ defaultTemplate?: ViewMenuItem;
21
+ allTemplates: ViewMenuItem[];
22
+ }
23
+ export declare const useViewsMenu: ({ mode, onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, defaultColumns, defaultTemplate, allTemplates, }: UseViewsMenuProps) => {
24
+ anchorEl: HTMLDivElement | null;
25
+ isCreateDialogOpen: boolean;
26
+ editingView: ViewMenuItem | null;
27
+ selectedViewInfo: ViewOption;
28
+ shouldUseCurrentState: boolean;
29
+ selectedView: ViewMenuItem | undefined;
30
+ currentViewColumns: ColumnViewProps[];
31
+ handleViewButtonClick: (event: MouseEvent<HTMLDivElement>) => void;
32
+ handleCloseViewDropdown: () => void;
33
+ handleSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
34
+ handleOpenCreateDialog: (useCurrentState?: boolean) => void;
35
+ handleOpenEditDialog: (view: ViewMenuItem) => void;
36
+ handleCloseCreateDialog: () => void;
37
+ handleSaveView: (data: {
38
+ name: string;
39
+ selectedColumns: ColumnViewProps[];
40
+ layout: LayoutSection;
41
+ }) => Promise<void>;
42
+ handleDeleteView: (viewId: string) => Promise<void>;
43
+ updateSelectedView: (updatedView: ViewMenuItem) => void;
44
+ };