@tap-payments/os-micro-frontend-shared 0.1.376-test.1 → 0.1.376-test.1-test.2-test.3-test.4-test.5

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 (68) hide show
  1. package/build/components/FilterDropdown/FilterDropdown.d.ts +4 -11
  2. package/build/components/FilterDropdown/FilterDropdown.js +4 -18
  3. package/build/components/FilterDropdown/style.js +1 -1
  4. package/build/components/RangeCalender/RangeCalender.js +2 -4
  5. package/build/components/TableHeader/FiltersRow.d.ts +1 -1
  6. package/build/components/TableHeader/FiltersRow.js +4 -2
  7. package/build/components/TableHeader/TableHeader.d.ts +1 -1
  8. package/build/components/TableHeader/TableHeader.js +2 -2
  9. package/build/components/TableHeader/TableView/CreateViewDialog.d.ts +3 -0
  10. package/build/components/TableHeader/TableView/CreateViewDialog.js +91 -0
  11. package/build/components/TableHeader/TableView/CustomViews.js +1 -1
  12. package/build/components/TableHeader/TableView/TableView.js +0 -1
  13. package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +5 -0
  14. package/build/components/TableHeader/TableView/ViewsDropdown.js +162 -0
  15. package/build/components/TableHeader/TableView/ViewsMenu.d.ts +5 -0
  16. package/build/components/TableHeader/TableView/ViewsMenu.js +76 -0
  17. package/build/components/TableHeader/TableView/components/ColumnList.d.ts +3 -0
  18. package/build/components/TableHeader/TableView/components/ColumnList.js +70 -0
  19. package/build/components/TableHeader/TableView/components/ViewsSubmenu.d.ts +3 -0
  20. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +75 -0
  21. package/build/components/TableHeader/TableView/components/index.d.ts +2 -0
  22. package/build/components/TableHeader/TableView/components/index.js +2 -0
  23. package/build/components/TableHeader/TableView/constants.d.ts +10 -0
  24. package/build/components/TableHeader/TableView/constants.js +10 -0
  25. package/build/components/TableHeader/TableView/data.d.ts +5 -0
  26. package/build/components/TableHeader/TableView/data.js +48 -0
  27. package/build/components/TableHeader/TableView/hooks/index.d.ts +6 -0
  28. package/build/components/TableHeader/TableView/hooks/index.js +6 -0
  29. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.d.ts +22 -0
  30. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +86 -0
  31. package/build/components/TableHeader/TableView/hooks/useDialogPosition.d.ts +8 -0
  32. package/build/components/TableHeader/TableView/hooks/useDialogPosition.js +16 -0
  33. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.d.ts +7 -0
  34. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.js +34 -0
  35. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.d.ts +6 -0
  36. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.js +18 -0
  37. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.d.ts +8 -0
  38. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.js +43 -0
  39. package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +9 -0
  40. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +62 -0
  41. package/build/components/TableHeader/TableView/hooks/useViewsMenu.d.ts +44 -0
  42. package/build/components/TableHeader/TableView/hooks/useViewsMenu.js +177 -0
  43. package/build/components/TableHeader/TableView/index.d.ts +12 -3
  44. package/build/components/TableHeader/TableView/index.js +11 -3
  45. package/build/components/TableHeader/TableView/styles.d.ts +127 -0
  46. package/build/components/TableHeader/TableView/styles.js +426 -0
  47. package/build/components/TableHeader/TableView/types.d.ts +182 -0
  48. package/build/components/TableHeader/TableView/utils.d.ts +121 -0
  49. package/build/components/TableHeader/TableView/utils.js +469 -0
  50. package/build/components/TableHeader/index.d.ts +1 -0
  51. package/build/components/TableHeader/type.d.ts +15 -1
  52. package/build/components/index.d.ts +0 -1
  53. package/build/components/index.js +0 -1
  54. package/build/constants/assets.d.ts +1 -2
  55. package/build/constants/assets.js +1 -2
  56. package/build/types/index.d.ts +0 -1
  57. package/build/types/index.js +0 -1
  58. package/build/utils/date.d.ts +0 -5
  59. package/build/utils/date.js +0 -37
  60. package/package.json +3 -2
  61. package/build/components/MultiDatakeyDonut/MultiDatakeyDonut.d.ts +0 -12
  62. package/build/components/MultiDatakeyDonut/MultiDatakeyDonut.js +0 -19
  63. package/build/components/MultiDatakeyDonut/index.d.ts +0 -1
  64. package/build/components/MultiDatakeyDonut/index.js +0 -1
  65. package/build/components/MultiDatakeyDonut/style.d.ts +0 -10
  66. package/build/components/MultiDatakeyDonut/style.js +0 -23
  67. package/build/types/toggleOptions.d.ts +0 -2
  68. /package/build/{types/toggleOptions.js → components/TableHeader/TableView/types.js} +0 -0
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React from 'react';
3
+ import { Box, Typography, Link, Popper, Divider } from '@mui/material';
4
+ import { Reorder } from 'framer-motion';
5
+ import { dragIcon, rightArrow, viewIcon } from '../../../../constants/index.js';
6
+ import { Checkbox, MenuItem } from '../../../index.js';
7
+ import { isDateColumn, getColumnCheckState } from '../utils';
8
+ import { ColumnListContainer, SelectAllHeader, ColumnItemRow, DragIconWrapper, CheckboxWrapper, SubmenuPaper, checkboxSx } from '../styles';
9
+ export const ColumnList = ({ selectedColumns, columnNames, allSelected, someSelected, hoveredColumn, anchorEl, onReorder, onColumnToggle, onSubItemToggle, onSelectAll, onResetToDefault, onSubmenuEnter, onSubmenuLeave, onCancelClose, }) => {
10
+ return (_jsxs(ColumnListContainer, { children: [_jsxs(SelectAllHeader, { children: [_jsx(DragIconWrapper, { children: _jsx("img", { src: viewIcon, alt: "drag", style: { width: 16, height: 16, opacity: 0.5 } }) }), _jsx(CheckboxWrapper, Object.assign({ onClick: (e) => {
11
+ e.stopPropagation();
12
+ onSelectAll();
13
+ } }, { children: _jsx(Checkbox, { checked: allSelected, indeterminate: someSelected, size: "small", sx: checkboxSx, onChange: (e) => {
14
+ e.stopPropagation();
15
+ onSelectAll();
16
+ }, onClick: (e) => {
17
+ e.stopPropagation();
18
+ } }) })), _jsx(Typography, Object.assign({ onClick: (e) => {
19
+ e.stopPropagation();
20
+ onSelectAll();
21
+ }, sx: { flex: 1, fontSize: 13, fontWeight: 500, color: 'text.primary', ml: 0.75, cursor: 'pointer' } }, { children: "Select All" })), _jsx(Link, Object.assign({ component: "button", type: "button", onClick: (e) => {
22
+ e.stopPropagation();
23
+ onResetToDefault();
24
+ }, underline: "none", sx: { fontSize: 13, fontWeight: 500, cursor: 'pointer', color: 'common.blue' } }, { children: "Reset to default" }))] }), _jsx(Box, Object.assign({ sx: { flex: 1, overflowY: 'auto', minHeight: 0 } }, { children: _jsx(Reorder.Group, Object.assign({ axis: "y", onReorder: onReorder, values: columnNames, style: { listStyle: 'none', padding: 0, margin: 0 } }, { children: selectedColumns.map((column) => {
25
+ var _a;
26
+ const isDate = isDateColumn(column.name);
27
+ const hasSubmenu = column.menuItems && column.menuItems.length > 0;
28
+ const { checked, indeterminate } = getColumnCheckState(column);
29
+ 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 }, style: {
30
+ listStyle: 'none',
31
+ margin: 0,
32
+ padding: 0,
33
+ position: 'relative',
34
+ zIndex: 1,
35
+ backgroundColor: '#fff',
36
+ width: '100%',
37
+ willChange: 'transform',
38
+ }, onDragStart: (e) => {
39
+ const target = e.target;
40
+ if (target.closest('[role="checkbox"]') ||
41
+ target.closest('input[type="checkbox"]') ||
42
+ target.closest('[class*="CheckboxWrapper"]')) {
43
+ e.preventDefault();
44
+ }
45
+ } }, { children: [_jsxs(ColumnItemRow, Object.assign({ isHovered: hoveredColumn === column.name, isDate: isDate, onMouseEnter: (e) => hasSubmenu && onSubmenuEnter(column.name, e.currentTarget), onMouseLeave: () => hasSubmenu && onSubmenuLeave(), onClick: (e) => {
46
+ if (e.target.closest('[role="checkbox"]') || e.target.closest('input[type="checkbox"]')) {
47
+ e.stopPropagation();
48
+ }
49
+ }, sx: { width: '100%', position: 'relative' } }, { children: [_jsx(DragIconWrapper, { children: _jsx("img", { src: dragIcon, alt: "drag", draggable: false, style: { width: 16, height: 16, cursor: isDate ? 'default' : 'grab', pointerEvents: 'none' } }) }), _jsx(CheckboxWrapper, Object.assign({ onMouseDown: (e) => {
50
+ e.stopPropagation();
51
+ }, onPointerDown: (e) => {
52
+ e.stopPropagation();
53
+ } }, { children: _jsx(Checkbox, { checked: checked, indeterminate: indeterminate, onChange: (e) => {
54
+ e.stopPropagation();
55
+ onColumnToggle(column.name);
56
+ }, onClick: (e) => {
57
+ e.stopPropagation();
58
+ }, disabled: isDate, size: "small", sx: checkboxSx }) })), _jsx(Typography, Object.assign({ sx: { flex: 1, fontSize: 13, fontWeight: 400, color: 'text.primary', ml: 1 } }, { children: column.label || column.name })), hasSubmenu && (_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', ml: 1, flexShrink: 0 } }, { children: _jsx("img", { src: rightArrow, alt: "arrow", style: { width: 12, height: 12 } }) })))] })), hasSubmenu && (_jsx(Popper, Object.assign({ open: hoveredColumn === column.name, anchorEl: anchorEl, placement: "right-start", sx: { zIndex: 10000 }, modifiers: [
59
+ {
60
+ name: 'offset',
61
+ options: {
62
+ offset: [0, 0],
63
+ },
64
+ },
65
+ ] }, { children: _jsxs(Box, Object.assign({ onMouseEnter: onCancelClose, onMouseLeave: onSubmenuLeave, 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) => {
66
+ var _a, _b;
67
+ return (_jsxs(React.Fragment, { children: [_jsx(MenuItem, Object.assign({ isSelected: subItem.selected, onClick: () => onSubItemToggle(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));
68
+ }) })] })) })))] }), column.name));
69
+ }) })) }))] }));
70
+ };
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import type { ViewsSubmenuProps } from '../types';
3
+ export declare const ViewsSubmenu: React.FC<ViewsSubmenuProps>;
@@ -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,34 @@
1
+ import { useState, useRef, useCallback } from 'react';
2
+ import { SUBMENU_CLOSE_DELAY } from '../constants';
3
+ export const useNestedSubmenu = () => {
4
+ const [hoveredNestedColumn, setHoveredNestedColumn] = useState(null);
5
+ const [nestedSubmenuAnchorEl, setNestedSubmenuAnchorEl] = useState(null);
6
+ const nestedCloseTimeoutRef = useRef(null);
7
+ const openNestedSubmenu = useCallback((columnName, element) => {
8
+ if (nestedCloseTimeoutRef.current) {
9
+ clearTimeout(nestedCloseTimeoutRef.current);
10
+ nestedCloseTimeoutRef.current = null;
11
+ }
12
+ setHoveredNestedColumn(columnName);
13
+ setNestedSubmenuAnchorEl(element);
14
+ }, []);
15
+ const closeNestedSubmenu = useCallback(() => {
16
+ nestedCloseTimeoutRef.current = setTimeout(() => {
17
+ setHoveredNestedColumn(null);
18
+ setNestedSubmenuAnchorEl(null);
19
+ }, SUBMENU_CLOSE_DELAY);
20
+ }, []);
21
+ const cancelNestedClose = useCallback(() => {
22
+ if (nestedCloseTimeoutRef.current) {
23
+ clearTimeout(nestedCloseTimeoutRef.current);
24
+ nestedCloseTimeoutRef.current = null;
25
+ }
26
+ }, []);
27
+ return {
28
+ hoveredNestedColumn,
29
+ nestedSubmenuAnchorEl,
30
+ openNestedSubmenu,
31
+ closeNestedSubmenu,
32
+ cancelNestedClose,
33
+ };
34
+ };
@@ -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
+ };