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

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 (71) 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/Sandbox/style.js +3 -2
  6. package/build/components/TableHeader/FiltersRow.d.ts +1 -1
  7. package/build/components/TableHeader/FiltersRow.js +4 -2
  8. package/build/components/TableHeader/TableHeader.d.ts +1 -1
  9. package/build/components/TableHeader/TableHeader.js +2 -2
  10. package/build/components/TableHeader/TableView/CreateViewDialog.d.ts +3 -0
  11. package/build/components/TableHeader/TableView/CreateViewDialog.js +91 -0
  12. package/build/components/TableHeader/TableView/CustomViews.js +1 -1
  13. package/build/components/TableHeader/TableView/TableView.js +0 -1
  14. package/build/components/TableHeader/TableView/ViewSelector.d.ts +5 -0
  15. package/build/components/TableHeader/TableView/ViewSelector.js +88 -0
  16. package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +5 -0
  17. package/build/components/TableHeader/TableView/ViewsDropdown.js +184 -0
  18. package/build/components/TableHeader/TableView/components/ColumnList.d.ts +3 -0
  19. package/build/components/TableHeader/TableView/components/ColumnList.js +70 -0
  20. package/build/components/TableHeader/TableView/components/ViewsSubmenu.d.ts +3 -0
  21. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +71 -0
  22. package/build/components/TableHeader/TableView/components/index.d.ts +2 -0
  23. package/build/components/TableHeader/TableView/components/index.js +2 -0
  24. package/build/components/TableHeader/TableView/constants.d.ts +10 -0
  25. package/build/components/TableHeader/TableView/constants.js +10 -0
  26. package/build/components/TableHeader/TableView/data.d.ts +5 -0
  27. package/build/components/TableHeader/TableView/data.js +48 -0
  28. package/build/components/TableHeader/TableView/hooks/index.d.ts +6 -0
  29. package/build/components/TableHeader/TableView/hooks/index.js +6 -0
  30. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.d.ts +22 -0
  31. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +88 -0
  32. package/build/components/TableHeader/TableView/hooks/useDialogPosition.d.ts +8 -0
  33. package/build/components/TableHeader/TableView/hooks/useDialogPosition.js +16 -0
  34. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.d.ts +7 -0
  35. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.js +34 -0
  36. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.d.ts +6 -0
  37. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.js +18 -0
  38. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.d.ts +8 -0
  39. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.js +43 -0
  40. package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +60 -0
  41. package/build/components/TableHeader/TableView/hooks/useViewSelector.js +175 -0
  42. package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +20 -0
  43. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +89 -0
  44. package/build/components/TableHeader/TableView/index.d.ts +12 -3
  45. package/build/components/TableHeader/TableView/index.js +13 -3
  46. package/build/components/TableHeader/TableView/styles.d.ts +127 -0
  47. package/build/components/TableHeader/TableView/styles.js +426 -0
  48. package/build/components/TableHeader/TableView/types.d.ts +199 -0
  49. package/build/components/TableHeader/TableView/utils.d.ts +121 -0
  50. package/build/components/TableHeader/TableView/utils.js +463 -0
  51. package/build/components/TableHeader/type.d.ts +22 -1
  52. package/build/components/Toolbar/Toolbar.js +1 -1
  53. package/build/components/index.d.ts +0 -1
  54. package/build/components/index.js +0 -1
  55. package/build/constants/apps.js +0 -2
  56. package/build/constants/assets.d.ts +1 -2
  57. package/build/constants/assets.js +1 -2
  58. package/build/types/index.d.ts +0 -1
  59. package/build/types/index.js +0 -1
  60. package/build/types/reports.d.ts +0 -21
  61. package/build/utils/date.d.ts +0 -5
  62. package/build/utils/date.js +0 -37
  63. package/package.json +3 -2
  64. package/build/components/MultiDatakeyDonut/MultiDatakeyDonut.d.ts +0 -12
  65. package/build/components/MultiDatakeyDonut/MultiDatakeyDonut.js +0 -19
  66. package/build/components/MultiDatakeyDonut/index.d.ts +0 -1
  67. package/build/components/MultiDatakeyDonut/index.js +0 -1
  68. package/build/components/MultiDatakeyDonut/style.d.ts +0 -10
  69. package/build/components/MultiDatakeyDonut/style.js +0 -23
  70. package/build/types/toggleOptions.d.ts +0 -2
  71. /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,71 @@
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, onClick: () => onColumnToggle(column.name), 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: [
60
+ {
61
+ name: 'offset',
62
+ options: {
63
+ offset: [0, 0],
64
+ },
65
+ },
66
+ ] }, { 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) => {
67
+ var _a, _b;
68
+ 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));
69
+ }) })] })) })))] })), columnIndex < columns.length - 1 && _jsx(Divider, {})] }), column.name));
70
+ }) })) })] }));
71
+ };
@@ -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 { useViewSelector } from './useViewSelector';
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 { useViewSelector } from './useViewSelector';
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,88 @@
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
22
+ ? editingView.submenu
23
+ : defaultColumns;
24
+ const otherColumns = initializeEditingColumns(savedColumns, availableColumns);
25
+ setSelectedColumns([dateColumn, ...otherColumns]);
26
+ // Ensure templateName is set to editingView.label (fallback to empty string if undefined)
27
+ const nameToSet = ((_a = editingView.label) === null || _a === void 0 ? void 0 : _a.trim()) || '';
28
+ setTemplateName(nameToSet);
29
+ }
30
+ else {
31
+ const otherColumns = tableViews && tableViews.length > 0
32
+ ? initializeCreateColumnsWithCurrentState(availableColumns, tableViews)
33
+ : initializeCreateColumns(availableColumns);
34
+ setSelectedColumns([dateColumn, ...otherColumns]);
35
+ setTemplateName('');
36
+ }
37
+ }
38
+ else if (open && editingView) {
39
+ // Update templateName when editingView changes while dialog is open
40
+ const nameToSet = ((_b = editingView.label) === null || _b === void 0 ? void 0 : _b.trim()) || '';
41
+ setTemplateName(nameToSet);
42
+ }
43
+ previousOpenRef.current = open;
44
+ }, [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]);
45
+ const columnNames = useMemo(() => selectedColumns.map((col) => col.name), [selectedColumns]);
46
+ const allSelected = useMemo(() => areAllColumnsSelected(selectedColumns), [selectedColumns]);
47
+ const someSelected = useMemo(() => areSomeColumnsSelected(selectedColumns, allSelected), [selectedColumns, allSelected]);
48
+ const isNameValid = useMemo(() => isValidTemplateName(templateName, TEMPLATE_NAME_MAX_LENGTH), [templateName]);
49
+ const handleReorder = (reorderedNames) => {
50
+ const reorderedColumns = reorderedNames
51
+ .map((name) => selectedColumns.find((col) => col.name === name))
52
+ .filter((col) => Boolean(col));
53
+ setSelectedColumns(reorderedColumns);
54
+ };
55
+ const handleColumnToggle = (columnName) => {
56
+ setSelectedColumns((prev) => toggleColumn(prev, columnName));
57
+ };
58
+ const handleSubItemToggle = (columnName, subItemName) => {
59
+ setSelectedColumns((prev) => toggleSubItem(prev, columnName, subItemName));
60
+ };
61
+ const handleSelectAll = () => {
62
+ setSelectedColumns((prev) => toggleAllColumns(prev, !allSelected));
63
+ };
64
+ const handleResetToDefault = () => {
65
+ const columnsSource = defaultColumns.length > 0 ? defaultColumns : availableColumns;
66
+ const otherColumns = resetColumnsToDefault(columnsSource);
67
+ setSelectedColumns([dateColumn, ...otherColumns]);
68
+ };
69
+ return {
70
+ templateName,
71
+ setTemplateName,
72
+ selectedColumns,
73
+ columnNames,
74
+ allSelected,
75
+ someSelected,
76
+ isNameValid,
77
+ hoveredColumn,
78
+ anchorEl,
79
+ openSubmenu,
80
+ closeSubmenu,
81
+ cancelClose,
82
+ handleReorder,
83
+ handleColumnToggle,
84
+ handleSubItemToggle,
85
+ handleSelectAll,
86
+ handleResetToDefault,
87
+ };
88
+ };
@@ -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,60 @@
1
+ import { type MouseEvent } from 'react';
2
+ import type { ColumnViewProps, TableMode } from '../../../../types/index.js';
3
+ import type { ViewMenuItem, LayoutSection, TemplateAPIMetadata } from '../types';
4
+ import type { ViewOption } from '../../type';
5
+ export interface UseViewSelectorProps {
6
+ mode: TableMode;
7
+ onViewChange?: (selectedView?: ViewMenuItem) => void;
8
+ onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
9
+ onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
10
+ onCreateCustomView?: (data: {
11
+ name: string;
12
+ selectedColumns: ColumnViewProps[];
13
+ layout: LayoutSection;
14
+ }) => Promise<void>;
15
+ onEditCustomView?: (viewId: string, data: {
16
+ name: string;
17
+ selectedColumns: ColumnViewProps[];
18
+ layout: LayoutSection;
19
+ }) => Promise<void>;
20
+ onDeleteCustomView?: (viewId: string) => Promise<void>;
21
+ resetTableViews?: (view: {
22
+ id: string;
23
+ label: string;
24
+ }) => void;
25
+ setTableViews?: (columns: ColumnViewProps[]) => void;
26
+ tableViews: ColumnViewProps[];
27
+ customViews: ViewMenuItem[];
28
+ defaultColumns: ColumnViewProps[];
29
+ defaultTemplate?: ViewMenuItem;
30
+ allTemplates: ViewMenuItem[];
31
+ setInternalCustomViews: (views: ViewMenuItem[]) => void;
32
+ apiMetadata?: TemplateAPIMetadata;
33
+ }
34
+ export declare const useViewSelector: ({ mode, onViewChange, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, defaultColumns, defaultTemplate, allTemplates, setInternalCustomViews, apiMetadata, }: UseViewSelectorProps) => {
35
+ anchorViewEl: HTMLDivElement | null;
36
+ defaultViewEl: HTMLDivElement | null;
37
+ setDefaultViewElement: import("react").Dispatch<import("react").SetStateAction<HTMLDivElement | null>>;
38
+ isCreateDialogOpen: boolean;
39
+ editingView: ViewMenuItem | null;
40
+ selectedViewInfo: ViewOption;
41
+ shouldUseCurrentState: boolean;
42
+ selectedView: ViewMenuItem | undefined;
43
+ currentViewColumns: ColumnViewProps[];
44
+ handleViewButtonClick: (event: MouseEvent<HTMLDivElement>) => void;
45
+ handleCloseViewDropdown: () => void;
46
+ handleSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
47
+ handleOpenCreateDialog: (useCurrentState?: boolean) => void;
48
+ handleOpenEditDialog: (view: ViewMenuItem) => void;
49
+ handleCloseCreateDialog: () => void;
50
+ handleSaveView: (data: {
51
+ name: string;
52
+ selectedColumns: ColumnViewProps[];
53
+ layout: LayoutSection;
54
+ }) => Promise<void>;
55
+ handleDeleteView: (viewId: string) => Promise<void>;
56
+ handleResetViews: (views: string[]) => void;
57
+ handleTableViewsChange: (newTableViews: ColumnViewProps[]) => void;
58
+ updateSelectedView: (updatedView: ViewMenuItem) => void;
59
+ updateCurrentViewColumns: (columns: ColumnViewProps[]) => void;
60
+ };