@tap-payments/os-micro-frontend-shared 0.1.373-test.2-test.3-test.4-test.5-test.6-test.7 → 0.1.373-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 (50) hide show
  1. package/build/components/Sandbox/style.js +2 -3
  2. package/build/components/TableHeader/FiltersRow.d.ts +1 -1
  3. package/build/components/TableHeader/FiltersRow.js +3 -3
  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/ViewsDropdown.d.ts +1 -1
  7. package/build/components/TableHeader/TableView/ViewsDropdown.js +116 -197
  8. package/build/components/TableHeader/TableView/ViewsMenu.d.ts +5 -0
  9. package/build/components/TableHeader/TableView/ViewsMenu.js +76 -0
  10. package/build/components/TableHeader/TableView/components/ColumnList.js +4 -4
  11. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +46 -30
  12. package/build/components/TableHeader/TableView/constants.d.ts +5 -0
  13. package/build/components/TableHeader/TableView/constants.js +5 -0
  14. package/build/components/TableHeader/TableView/hooks/index.d.ts +1 -1
  15. package/build/components/TableHeader/TableView/hooks/index.js +1 -1
  16. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +25 -16
  17. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.js +2 -9
  18. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.js +1 -2
  19. package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +6 -8
  20. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +45 -94
  21. package/build/components/TableHeader/TableView/hooks/useViewsMenu.d.ts +44 -0
  22. package/build/components/TableHeader/TableView/hooks/useViewsMenu.js +178 -0
  23. package/build/components/TableHeader/TableView/index.d.ts +3 -3
  24. package/build/components/TableHeader/TableView/index.js +2 -4
  25. package/build/components/TableHeader/TableView/types.d.ts +18 -32
  26. package/build/components/TableHeader/TableView/utils.d.ts +5 -5
  27. package/build/components/TableHeader/TableView/utils.js +23 -13
  28. package/build/components/TableHeader/index.d.ts +1 -0
  29. package/build/components/TableHeader/type.d.ts +2 -9
  30. package/build/components/Toolbar/Toolbar.js +1 -1
  31. package/build/components/VirtualTables/SheetViewVirtualTable/SheetViewVirtualTable.d.ts +1 -1
  32. package/build/components/VirtualTables/SheetViewVirtualTable/SheetViewVirtualTable.js +4 -1
  33. package/build/components/VirtualTables/VirtualTable/VirtualTable.d.ts +1 -1
  34. package/build/components/VirtualTables/VirtualTable/VirtualTable.js +3 -2
  35. package/build/constants/apps.js +2 -0
  36. package/build/constants/assets.d.ts +1 -0
  37. package/build/constants/assets.js +1 -0
  38. package/build/types/column.d.ts +8 -0
  39. package/build/types/reports.d.ts +21 -0
  40. package/build/types/table.d.ts +1 -0
  41. package/build/utils/date.js +5 -3
  42. package/build/utils/index.d.ts +1 -0
  43. package/build/utils/index.js +1 -0
  44. package/build/utils/skeletonColumns.d.ts +8 -0
  45. package/build/utils/skeletonColumns.js +34 -0
  46. package/package.json +2 -2
  47. package/build/components/TableHeader/TableView/ViewSelector.d.ts +0 -5
  48. package/build/components/TableHeader/TableView/ViewSelector.js +0 -46
  49. package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +0 -59
  50. package/build/components/TableHeader/TableView/hooks/useViewSelector.js +0 -193
@@ -1,52 +1,68 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import React from 'react';
2
+ import React, { useMemo } from 'react';
3
3
  import { Box, Typography, Divider, Popper } from '@mui/material';
4
+ import { Reorder } from 'framer-motion';
4
5
  import { Checkbox, MenuItem } from '../../../index.js';
5
6
  import { blackRightArrowIcon } from '../../../../constants/index.js';
6
- import { getColumnCheckState } from '../utils';
7
+ import { getColumnCheckState, isDateColumn } from '../utils';
7
8
  import { ResetHeaderBox, ResetCheckboxSx, ColumnItemsContainer, SubmenuPaper } from '../styles';
8
9
  import { useNestedSubmenu } from '../hooks/useNestedSubmenu';
9
- export const ViewsSubmenu = ({ columns, allCurrentSelected, someCurrentSelected, onSelectAll, onReset, onColumnToggle, onNestedItemToggle, anchorEl, isModified = false, }) => {
10
+ export const ViewsSubmenu = ({ columns, allCurrentSelected, someCurrentSelected, onSelectAll, onReset, onColumnToggle, onNestedItemToggle, onReorder, anchorEl, isModified = false, }) => {
10
11
  const { hoveredNestedColumn, nestedSubmenuAnchorEl, openNestedSubmenu, closeNestedSubmenu, cancelNestedClose } = useNestedSubmenu();
12
+ const columnNames = useMemo(() => columns.map((col) => col.name), [columns]);
11
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) => {
12
14
  e.stopPropagation();
13
15
  onSelectAll();
14
16
  }, onClick: (e) => {
15
17
  e.stopPropagation();
16
- }, sx: ResetCheckboxSx }) })), _jsx(Typography, Object.assign({ component: "button", onClick: (e) => {
18
+ }, sx: ResetCheckboxSx }) })), _jsx(Typography, Object.assign({ component: "button", disabled: !isModified, onClick: (e) => {
17
19
  e.stopPropagation();
18
- onReset();
20
+ if (isModified)
21
+ onReset();
19
22
  }, sx: {
20
23
  fontSize: 11,
21
24
  fontWeight: 500,
22
25
  color: '#1F88D0',
23
26
  background: 'none',
24
27
  border: 'none',
25
- cursor: 'pointer',
28
+ cursor: isModified ? 'pointer' : 'default',
26
29
  padding: 0,
27
30
  opacity: isModified ? 1 : 0.5,
28
- '&:hover': {
29
- textDecoration: 'underline',
30
- },
31
- } }, { children: "Reset" }))] }), _jsx(Divider, {}), _jsx(ColumnItemsContainer, { children: columns.map((column, columnIndex) => {
32
- var _a;
33
- const hasNestedSubmenu = column.menuItems && column.menuItems.length > 0;
34
- const { checked, indeterminate } = getColumnCheckState(column);
35
- return (_jsxs(React.Fragment, { 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: {
36
- display: 'flex',
37
- alignItems: 'center',
38
- justifyContent: 'space-between',
39
- width: '100%',
40
- } }, { 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: [
41
- {
42
- name: 'offset',
43
- options: {
44
- offset: [0, 0],
45
- },
46
- },
47
- ] }, { 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) => {
48
- var _a, _b;
49
- 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));
50
- }) })] })) })))] })), columnIndex < columns.length - 1 && _jsx(Divider, {})] }, column.name));
51
- }) })] }));
31
+ pointerEvents: isModified ? 'auto' : 'none',
32
+ '&:hover': isModified ? { textDecoration: 'underline' } : undefined,
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, _b;
35
+ const isDate = isDateColumn(column.name);
36
+ const hasNestedSubmenu = !isDate && Boolean((_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.length);
37
+ const { checked, indeterminate } = getColumnCheckState(column);
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 } }, { 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: (_b = column.menuItems) === null || _b === void 0 ? void 0 : _b.map((subItem, subItemIndex) => {
64
+ var _a, _b;
65
+ return (_jsxs(React.Fragment, { children: [_jsx(MenuItem, Object.assign({ isSelected: subItem.selected, isDisabled: isDateColumn(subItem.name), onClick: () => !isDateColumn(subItem.name) && 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));
66
+ }) })] })) })))] })), columnIndex < columns.length - 1 && _jsx(Divider, {})] }), column.name));
67
+ }) })) })] }));
52
68
  };
@@ -7,4 +7,9 @@ export declare const DATE_COLUMN_CONFIG: {
7
7
  readonly name: "date";
8
8
  readonly label: "Date";
9
9
  readonly selected: true;
10
+ readonly menuItems: undefined;
11
+ readonly order: 1;
12
+ readonly pinned: "start";
13
+ readonly isDefaultPinned: true;
14
+ readonly pinnable: true;
10
15
  };
@@ -7,4 +7,9 @@ export const DATE_COLUMN_CONFIG = {
7
7
  name: 'date',
8
8
  label: 'Date',
9
9
  selected: true,
10
+ menuItems: undefined,
11
+ order: 1,
12
+ pinned: 'start',
13
+ isDefaultPinned: true,
14
+ pinnable: true,
10
15
  };
@@ -2,7 +2,7 @@ export { useSubMenu } from './useSubMenu';
2
2
  export { useViewColumns } from './useViewColumns';
3
3
  export { useColumnItem } from './useColumnItem';
4
4
  export { useViewsManager } from './useViewsManager';
5
- export { useViewSelector } from './useViewSelector';
5
+ export { useViewsMenu } from './useViewsMenu';
6
6
  export { useSubmenuHover } from './useSubmenuHover';
7
7
  export { useOriginalColumns } from './useOriginalColumns';
8
8
  export { useNestedSubmenu } from './useNestedSubmenu';
@@ -2,7 +2,7 @@ export { useSubMenu } from './useSubMenu';
2
2
  export { useViewColumns } from './useViewColumns';
3
3
  export { useColumnItem } from './useColumnItem';
4
4
  export { useViewsManager } from './useViewsManager';
5
- export { useViewSelector } from './useViewSelector';
5
+ export { useViewsMenu } from './useViewsMenu';
6
6
  export { useSubmenuHover } from './useSubmenuHover';
7
7
  export { useOriginalColumns } from './useOriginalColumns';
8
8
  export { useNestedSubmenu } from './useNestedSubmenu';
@@ -1,15 +1,16 @@
1
1
  import { useState, useEffect, useMemo, useRef } from 'react';
2
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';
3
+ import { isDateColumn, initializeCreateColumns, initializeCreateColumnsWithCurrentState, toggleColumn, toggleSubItem, toggleAllColumns, areAllColumnsSelected, areSomeColumnsSelected, isValidTemplateName, deepCloneColumns as copyColumns, } from '../utils';
4
4
  import { useSubmenuHover } from './useSubmenuHover';
5
5
  export const useCreateViewDialog = ({ open, availableColumns, defaultColumns, editingView, tableViews = [] }) => {
6
6
  const [templateName, setTemplateName] = useState(() => (editingView === null || editingView === void 0 ? void 0 : editingView.label) || '');
7
7
  const [selectedColumns, setSelectedColumns] = useState([]);
8
8
  const previousOpenRef = useRef(false);
9
+ const initialColumnsRef = useRef([]);
9
10
  const { hoveredColumn, anchorEl, openSubmenu, closeSubmenu, cancelClose } = useSubmenuHover();
10
11
  const dateColumn = DATE_COLUMN_CONFIG;
11
12
  useEffect(() => {
12
- var _a, _b;
13
+ var _a, _b, _c;
13
14
  if (!open) {
14
15
  previousOpenRef.current = false;
15
16
  return;
@@ -17,27 +18,35 @@ export const useCreateViewDialog = ({ open, availableColumns, defaultColumns, ed
17
18
  const wasClosed = !previousOpenRef.current;
18
19
  if (wasClosed && open) {
19
20
  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()) || '';
21
+ // Use template's submenu as source of truth so selection state is preserved (don't rely on name matching vs availableColumns)
22
+ const submenu = ((_a = editingView.submenu) === null || _a === void 0 ? void 0 : _a.length) ? copyColumns(editingView.submenu) : [];
23
+ const templateNonDate = submenu.filter((c) => !isDateColumn(c.name));
24
+ const templateWithDateFirst = [dateColumn, ...templateNonDate];
25
+ const templateNames = new Set(templateWithDateFirst.map((c) => c.name));
26
+ const missingFromAvailable = availableColumns
27
+ .filter((col) => !isDateColumn(col.name) && !templateNames.has(col.name))
28
+ .map((col) => {
29
+ var _a;
30
+ return (Object.assign(Object.assign({}, col), { selected: false, menuItems: (_a = col.menuItems) === null || _a === void 0 ? void 0 : _a.map((item) => (Object.assign(Object.assign({}, item), { selected: false }))) }));
31
+ });
32
+ const columnsToSet = [...templateWithDateFirst, ...missingFromAvailable];
33
+ setSelectedColumns(columnsToSet);
34
+ initialColumnsRef.current = copyColumns(columnsToSet);
35
+ const nameToSet = ((_b = editingView.label) === null || _b === void 0 ? void 0 : _b.trim()) || '';
28
36
  setTemplateName(nameToSet);
29
37
  }
30
38
  else {
31
39
  const otherColumns = tableViews && tableViews.length > 0
32
40
  ? initializeCreateColumnsWithCurrentState(availableColumns, tableViews)
33
41
  : initializeCreateColumns(availableColumns);
34
- setSelectedColumns([dateColumn, ...otherColumns]);
42
+ const columnsToSet = [dateColumn, ...otherColumns];
43
+ setSelectedColumns(columnsToSet);
44
+ initialColumnsRef.current = copyColumns(columnsToSet);
35
45
  setTemplateName('');
36
46
  }
37
47
  }
38
48
  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()) || '';
49
+ const nameToSet = ((_c = editingView.label) === null || _c === void 0 ? void 0 : _c.trim()) || '';
41
50
  setTemplateName(nameToSet);
42
51
  }
43
52
  previousOpenRef.current = open;
@@ -62,9 +71,9 @@ export const useCreateViewDialog = ({ open, availableColumns, defaultColumns, ed
62
71
  setSelectedColumns((prev) => toggleAllColumns(prev, !allSelected));
63
72
  };
64
73
  const handleResetToDefault = () => {
65
- const columnsSource = defaultColumns.length > 0 ? defaultColumns : availableColumns;
66
- const otherColumns = resetColumnsToDefault(columnsSource);
67
- setSelectedColumns([dateColumn, ...otherColumns]);
74
+ if (initialColumnsRef.current.length > 0) {
75
+ setSelectedColumns(copyColumns(initialColumnsRef.current));
76
+ }
68
77
  };
69
78
  return {
70
79
  templateName,
@@ -1,22 +1,15 @@
1
1
  import { useState, useRef, useCallback } from 'react';
2
- import { SUBMENU_CLOSE_DELAY } from '../constants';
3
2
  export const useNestedSubmenu = () => {
4
3
  const [hoveredNestedColumn, setHoveredNestedColumn] = useState(null);
5
4
  const [nestedSubmenuAnchorEl, setNestedSubmenuAnchorEl] = useState(null);
6
5
  const nestedCloseTimeoutRef = useRef(null);
7
6
  const openNestedSubmenu = useCallback((columnName, element) => {
8
- if (nestedCloseTimeoutRef.current) {
9
- clearTimeout(nestedCloseTimeoutRef.current);
10
- nestedCloseTimeoutRef.current = null;
11
- }
12
7
  setHoveredNestedColumn(columnName);
13
8
  setNestedSubmenuAnchorEl(element);
14
9
  }, []);
15
10
  const closeNestedSubmenu = useCallback(() => {
16
- nestedCloseTimeoutRef.current = setTimeout(() => {
17
- setHoveredNestedColumn(null);
18
- setNestedSubmenuAnchorEl(null);
19
- }, SUBMENU_CLOSE_DELAY);
11
+ setHoveredNestedColumn(null);
12
+ setNestedSubmenuAnchorEl(null);
20
13
  }, []);
21
14
  const cancelNestedClose = useCallback(() => {
22
15
  if (nestedCloseTimeoutRef.current) {
@@ -1,5 +1,4 @@
1
1
  import { useState, useRef, useCallback } from 'react';
2
- import { SUBMENU_CLOSE_DELAY } from '../constants';
3
2
  export const useSubmenuHover = () => {
4
3
  const [hoveredColumn, setHoveredColumn] = useState(null);
5
4
  const [anchorEl, setAnchorEl] = useState(null);
@@ -16,7 +15,7 @@ export const useSubmenuHover = () => {
16
15
  closeTimeoutRef.current = setTimeout(() => {
17
16
  setHoveredColumn(null);
18
17
  setAnchorEl(null);
19
- }, SUBMENU_CLOSE_DELAY);
18
+ }, 0);
20
19
  }, []);
21
20
  const cancelClose = useCallback(() => {
22
21
  if (closeTimeoutRef.current) {
@@ -1,12 +1,10 @@
1
- /// <reference types="react" />
2
1
  import type { ColumnViewProps } from '../../../../types/index.js';
3
2
  import type { UseViewsManagerProps, ViewMenuItem } from '../types';
4
- export declare const useViewsManager: ({ mode, templates, lang }: UseViewsManagerProps) => {
5
- defaultColumns: ColumnViewProps[];
6
- setDefaultColumns: import("react").Dispatch<import("react").SetStateAction<ColumnViewProps[]>>;
7
- internalTableViews: ColumnViewProps[];
8
- setInternalTableViews: import("react").Dispatch<import("react").SetStateAction<ColumnViewProps[]>>;
9
- internalCustomViews: ViewMenuItem[];
10
- setInternalCustomViews: import("react").Dispatch<import("react").SetStateAction<ViewMenuItem[]>>;
3
+ export declare const useViewsManager: ({ tableMode, templates, lang }: UseViewsManagerProps) => {
11
4
  defaultTemplate: ViewMenuItem | undefined;
5
+ customViews: ViewMenuItem[];
6
+ allTemplates: ViewMenuItem[];
7
+ defaultColumns: ColumnViewProps[];
8
+ baseDefaultColumns: ColumnViewProps[];
9
+ updateDefaultColumns: (columns: ColumnViewProps[]) => void;
12
10
  };
@@ -1,106 +1,57 @@
1
- import { useState, useEffect, useMemo } from 'react';
2
- import { transformTemplatesToViewMenuItems } from '../utils';
3
- export const useViewsManager = ({ mode, templates, lang = 'en' }) => {
4
- // Transform templates internally - this is the only source of data
5
- const transformedTemplates = useMemo(() => {
6
- if (!templates)
7
- return null;
8
- const templatesArray = Array.isArray(templates) ? templates : templates.templates;
9
- const { customViews, defaultTemplateColumns, defaultTemplate } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
10
- // Only use default template columns - no fallback to layout data
11
- // The default view must come from a template with default: true
12
- const effectiveLayoutData = defaultTemplateColumns
13
- ? [
14
- {
15
- code: mode === 'advanced' ? 'Advanced' : 'Sheet',
16
- columns: defaultTemplateColumns.map((col, idx) => {
17
- var _a, _b;
18
- return ({
19
- code: col.name,
20
- name: [{ text: typeof col.label === 'string' ? col.label : col.name, lang }],
21
- order: idx + 1,
22
- default: (_a = col.selected) !== null && _a !== void 0 ? _a : false,
23
- fields: (_b = col.menuItems) === null || _b === void 0 ? void 0 : _b.map((item) => {
24
- var _a;
25
- return ({
26
- code: item.name,
27
- name: [{ text: typeof item.label === 'string' ? item.label : item.name, lang: '' }],
28
- default: (_a = item.selected) !== null && _a !== void 0 ? _a : false,
29
- });
30
- }),
31
- });
32
- }),
33
- },
34
- ]
35
- : [];
1
+ import { useState, useEffect, useMemo, useCallback } from 'react';
2
+ import { transformTemplatesToViewMenuItems, deepCloneColumns } from '../utils';
3
+ export const useViewsManager = ({ tableMode, templates, lang = 'en' }) => {
4
+ const viewMenuFromTemplates = useMemo(() => {
5
+ var _a, _b;
6
+ const { customViews, defaultTemplate, defaultTemplateColumns } = transformTemplatesToViewMenuItems(templates !== null && templates !== void 0 ? templates : [], tableMode, lang);
7
+ const templateColumns = (_b = (_a = defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.submenu) !== null && _a !== void 0 ? _a : defaultTemplateColumns) !== null && _b !== void 0 ? _b : [];
8
+ const allTemplates = defaultTemplate ? [defaultTemplate, ...customViews] : customViews;
36
9
  return {
37
10
  customViews,
38
- layoutData: effectiveLayoutData,
39
- defaultTemplateColumns,
40
11
  defaultTemplate,
12
+ templateDefaultColumns: templateColumns,
13
+ allTemplates,
41
14
  };
42
- }, [templates, mode, lang]);
43
- const [defaultColumns, setDefaultColumns] = useState(() => {
44
- // Only use data from templates - no other sources
45
- if (templates) {
46
- const templatesArray = Array.isArray(templates) ? templates : templates.templates;
47
- const { defaultTemplateColumns } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
48
- if (defaultTemplateColumns) {
49
- return defaultTemplateColumns;
50
- }
51
- }
52
- // Return empty array if no templates
53
- return [];
54
- });
55
- const [internalTableViews, setInternalTableViews] = useState(() => {
56
- // Initialize from templates only
57
- if (templates) {
58
- const templatesArray = Array.isArray(templates) ? templates : templates.templates;
59
- const { defaultTemplateColumns } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
60
- if (defaultTemplateColumns) {
61
- return defaultTemplateColumns;
62
- }
63
- }
64
- return [];
65
- });
66
- const [internalCustomViews, setInternalCustomViews] = useState(() => {
67
- // Initialize from templates only
68
- if (templates) {
69
- const templatesArray = Array.isArray(templates) ? templates : templates.templates;
70
- const { customViews } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
71
- return customViews || [];
72
- }
73
- return [];
74
- });
15
+ }, [templates, tableMode, lang]);
16
+ const [defaultColumns, setDefaultColumns] = useState([]);
17
+ const [initializedMode, setInitializedMode] = useState(null);
75
18
  useEffect(() => {
76
- // Only use default template columns from template with default: true
77
- // No fallback to layout data - default must come from templates array
78
- if (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplateColumns) {
79
- setDefaultColumns(transformedTemplates.defaultTemplateColumns);
80
- setInternalTableViews(transformedTemplates.defaultTemplateColumns);
19
+ if (initializedMode !== tableMode && viewMenuFromTemplates.templateDefaultColumns.length > 0) {
20
+ setDefaultColumns(deepCloneColumns(viewMenuFromTemplates.templateDefaultColumns));
21
+ setInitializedMode(tableMode);
81
22
  }
82
- else {
83
- // No default template found - set empty arrays
84
- setDefaultColumns([]);
85
- setInternalTableViews([]);
23
+ }, [tableMode, viewMenuFromTemplates.templateDefaultColumns, initializedMode]);
24
+ const updateDefaultColumns = useCallback((columns) => {
25
+ setDefaultColumns(deepCloneColumns(columns));
26
+ }, []);
27
+ const updatedDefaultTemplate = useMemo(() => {
28
+ if (!viewMenuFromTemplates.defaultTemplate) {
29
+ return viewMenuFromTemplates.defaultTemplate;
86
30
  }
87
- }, [mode, transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplateColumns]);
88
- // Update custom views when templates change
89
- useEffect(() => {
90
- if (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews) {
91
- setInternalCustomViews(transformedTemplates.customViews);
31
+ const columnsToUse = initializedMode !== tableMode ? viewMenuFromTemplates.templateDefaultColumns : defaultColumns;
32
+ if (columnsToUse.length === 0) {
33
+ return viewMenuFromTemplates.defaultTemplate;
34
+ }
35
+ return Object.assign(Object.assign({}, viewMenuFromTemplates.defaultTemplate), { submenu: columnsToUse, columns: columnsToUse.map((col) => col.name) });
36
+ }, [viewMenuFromTemplates.defaultTemplate, viewMenuFromTemplates.templateDefaultColumns, defaultColumns, initializedMode, tableMode]);
37
+ const updatedAllTemplates = useMemo(() => {
38
+ if (!updatedDefaultTemplate) {
39
+ return viewMenuFromTemplates.customViews;
92
40
  }
93
- else {
94
- setInternalCustomViews([]);
41
+ return [updatedDefaultTemplate, ...viewMenuFromTemplates.customViews];
42
+ }, [updatedDefaultTemplate, viewMenuFromTemplates.customViews]);
43
+ const currentDefaultColumns = useMemo(() => {
44
+ if (initializedMode !== tableMode && defaultColumns.length === 0) {
45
+ return viewMenuFromTemplates.templateDefaultColumns;
95
46
  }
96
- }, [transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews]);
47
+ return defaultColumns.length > 0 ? defaultColumns : viewMenuFromTemplates.templateDefaultColumns;
48
+ }, [initializedMode, tableMode, defaultColumns, viewMenuFromTemplates.templateDefaultColumns]);
97
49
  return {
98
- defaultColumns,
99
- setDefaultColumns,
100
- internalTableViews,
101
- setInternalTableViews,
102
- internalCustomViews,
103
- setInternalCustomViews,
104
- defaultTemplate: transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplate,
50
+ defaultTemplate: updatedDefaultTemplate,
51
+ customViews: viewMenuFromTemplates.customViews,
52
+ allTemplates: updatedAllTemplates,
53
+ defaultColumns: currentDefaultColumns,
54
+ baseDefaultColumns: viewMenuFromTemplates.templateDefaultColumns,
55
+ updateDefaultColumns,
105
56
  };
106
57
  };
@@ -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
+ };