@tap-payments/os-micro-frontend-shared 0.1.372-test.2-test.3-test.4-test.5-test.6 → 0.1.372-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 (48) 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/CreateViewDialog.d.ts +1 -1
  7. package/build/components/TableHeader/TableView/CreateViewDialog.js +42 -11
  8. package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +1 -1
  9. package/build/components/TableHeader/TableView/ViewsDropdown.js +91 -93
  10. package/build/components/TableHeader/TableView/ViewsMenu.d.ts +5 -0
  11. package/build/components/TableHeader/TableView/ViewsMenu.js +76 -0
  12. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +46 -23
  13. package/build/components/TableHeader/TableView/constants.d.ts +1 -1
  14. package/build/components/TableHeader/TableView/constants.js +1 -1
  15. package/build/components/TableHeader/TableView/hooks/index.d.ts +1 -1
  16. package/build/components/TableHeader/TableView/hooks/index.js +1 -1
  17. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +15 -5
  18. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.js +2 -9
  19. package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +5 -8
  20. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +50 -94
  21. package/build/components/TableHeader/TableView/hooks/useViewsMenu.d.ts +44 -0
  22. package/build/components/TableHeader/TableView/hooks/useViewsMenu.js +177 -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/styles.js +11 -2
  26. package/build/components/TableHeader/TableView/types.d.ts +34 -32
  27. package/build/components/TableHeader/TableView/utils.d.ts +6 -5
  28. package/build/components/TableHeader/TableView/utils.js +56 -13
  29. package/build/components/TableHeader/index.d.ts +1 -0
  30. package/build/components/TableHeader/type.d.ts +2 -8
  31. package/build/components/Toolbar/Toolbar.js +1 -1
  32. package/build/components/VirtualTables/VirtualTable/VirtualTable.d.ts +1 -1
  33. package/build/components/VirtualTables/VirtualTable/VirtualTable.js +4 -3
  34. package/build/constants/apps.js +2 -0
  35. package/build/constants/assets.d.ts +1 -0
  36. package/build/constants/assets.js +1 -0
  37. package/build/types/reports.d.ts +21 -0
  38. package/build/types/table.d.ts +1 -0
  39. package/build/utils/date.js +5 -3
  40. package/build/utils/index.d.ts +1 -0
  41. package/build/utils/index.js +1 -0
  42. package/build/utils/skeletonColumns.d.ts +4 -0
  43. package/build/utils/skeletonColumns.js +17 -0
  44. package/package.json +2 -2
  45. package/build/components/TableHeader/TableView/ViewSelector.d.ts +0 -5
  46. package/build/components/TableHeader/TableView/ViewSelector.js +0 -44
  47. package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +0 -56
  48. package/build/components/TableHeader/TableView/hooks/useViewSelector.js +0 -122
@@ -1,13 +1,15 @@
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();
@@ -28,25 +30,46 @@ export const ViewsSubmenu = ({ columns, allCurrentSelected, someCurrentSelected,
28
30
  '&:hover': {
29
31
  textDecoration: 'underline',
30
32
  },
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],
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
+ },
45
69
  },
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
- }) })] }));
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
+ }) })) })] }));
52
75
  };
@@ -5,6 +5,6 @@ export declare const MAX_CUSTOM_VIEWS = 3;
5
5
  export declare const TEMPLATE_NAME_MAX_LENGTH = 20;
6
6
  export declare const DATE_COLUMN_CONFIG: {
7
7
  readonly name: "date";
8
- readonly label: "Date & Time";
8
+ readonly label: "Date";
9
9
  readonly selected: true;
10
10
  };
@@ -5,6 +5,6 @@ export const MAX_CUSTOM_VIEWS = 3;
5
5
  export const TEMPLATE_NAME_MAX_LENGTH = 20;
6
6
  export const DATE_COLUMN_CONFIG = {
7
7
  name: 'date',
8
- label: 'Date & Time',
8
+ label: 'Date',
9
9
  selected: true,
10
10
  };
@@ -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';
@@ -3,12 +3,13 @@ import { DATE_COLUMN_CONFIG, TEMPLATE_NAME_MAX_LENGTH } from '../constants';
3
3
  import { initializeEditingColumns, initializeCreateColumns, initializeCreateColumnsWithCurrentState, resetColumnsToDefault, toggleColumn, toggleSubItem, toggleAllColumns, areAllColumnsSelected, areSomeColumnsSelected, isValidTemplateName, } from '../utils';
4
4
  import { useSubmenuHover } from './useSubmenuHover';
5
5
  export const useCreateViewDialog = ({ open, availableColumns, defaultColumns, editingView, tableViews = [] }) => {
6
- const [templateName, setTemplateName] = useState('');
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
9
  const { hoveredColumn, anchorEl, openSubmenu, closeSubmenu, cancelClose } = useSubmenuHover();
10
10
  const dateColumn = DATE_COLUMN_CONFIG;
11
11
  useEffect(() => {
12
+ var _a, _b;
12
13
  if (!open) {
13
14
  previousOpenRef.current = false;
14
15
  return;
@@ -16,9 +17,13 @@ export const useCreateViewDialog = ({ open, availableColumns, defaultColumns, ed
16
17
  const wasClosed = !previousOpenRef.current;
17
18
  if (wasClosed && open) {
18
19
  if (editingView) {
19
- const otherColumns = initializeEditingColumns(defaultColumns, availableColumns);
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);
20
23
  setSelectedColumns([dateColumn, ...otherColumns]);
21
- setTemplateName(editingView.label);
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);
22
27
  }
23
28
  else {
24
29
  const otherColumns = tableViews && tableViews.length > 0
@@ -28,12 +33,17 @@ export const useCreateViewDialog = ({ open, availableColumns, defaultColumns, ed
28
33
  setTemplateName('');
29
34
  }
30
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
+ }
31
41
  previousOpenRef.current = open;
32
- }, [open, editingView, availableColumns, defaultColumns, tableViews, dateColumn]);
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]);
33
43
  const columnNames = useMemo(() => selectedColumns.map((col) => col.name), [selectedColumns]);
34
44
  const allSelected = useMemo(() => areAllColumnsSelected(selectedColumns), [selectedColumns]);
35
45
  const someSelected = useMemo(() => areSomeColumnsSelected(selectedColumns, allSelected), [selectedColumns, allSelected]);
36
- const isNameValid = isValidTemplateName(templateName, TEMPLATE_NAME_MAX_LENGTH);
46
+ const isNameValid = useMemo(() => isValidTemplateName(templateName, TEMPLATE_NAME_MAX_LENGTH), [templateName]);
37
47
  const handleReorder = (reorderedNames) => {
38
48
  const reorderedColumns = reorderedNames
39
49
  .map((name) => selectedColumns.find((col) => col.name === name))
@@ -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,12 +1,9 @@
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
+ updateDefaultColumns: (columns: ColumnViewProps[]) => void;
12
9
  };
@@ -1,106 +1,62 @@
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 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;
36
15
  return {
37
16
  customViews,
38
- layoutData: effectiveLayoutData,
39
- defaultTemplateColumns,
40
17
  defaultTemplate,
18
+ templateDefaultColumns: (defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.submenu) || [],
19
+ allTemplates,
41
20
  };
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
- });
21
+ }, [templates, tableMode, lang]);
22
+ const [defaultColumns, setDefaultColumns] = useState([]);
23
+ const [initializedMode, setInitializedMode] = useState(null);
75
24
  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);
25
+ if (initializedMode !== tableMode && parsedTemplates.templateDefaultColumns.length > 0) {
26
+ setDefaultColumns(deepCloneColumns(parsedTemplates.templateDefaultColumns));
27
+ setInitializedMode(tableMode);
81
28
  }
82
- else {
83
- // No default template found - set empty arrays
84
- setDefaultColumns([]);
85
- setInternalTableViews([]);
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;
86
36
  }
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);
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;
92
46
  }
93
- else {
94
- setInternalCustomViews([]);
47
+ return [updatedDefaultTemplate, ...parsedTemplates.customViews];
48
+ }, [updatedDefaultTemplate, parsedTemplates.customViews]);
49
+ const effectiveDefaultColumns = useMemo(() => {
50
+ if (initializedMode !== tableMode && defaultColumns.length === 0) {
51
+ return parsedTemplates.templateDefaultColumns;
95
52
  }
96
- }, [transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews]);
53
+ return defaultColumns.length > 0 ? defaultColumns : parsedTemplates.templateDefaultColumns;
54
+ }, [initializedMode, tableMode, defaultColumns, parsedTemplates.templateDefaultColumns]);
97
55
  return {
98
- defaultColumns,
99
- setDefaultColumns,
100
- internalTableViews,
101
- setInternalTableViews,
102
- internalCustomViews,
103
- setInternalCustomViews,
104
- defaultTemplate: transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplate,
56
+ defaultTemplate: updatedDefaultTemplate,
57
+ customViews: parsedTemplates.customViews,
58
+ allTemplates: updatedAllTemplates,
59
+ defaultColumns: effectiveDefaultColumns,
60
+ updateDefaultColumns,
105
61
  };
106
62
  };
@@ -0,0 +1,44 @@
1
+ import { type MouseEvent } from 'react';
2
+ import type { ColumnViewProps, TableMode } from '../../../../types/index.js';
3
+ import type { ViewMenuItem, LayoutSection } from '../types';
4
+ import type { ViewOption } from '../../type';
5
+ export interface UseViewsMenuProps {
6
+ mode: TableMode;
7
+ onViewChange?: (selectedView?: ViewMenuItem) => void;
8
+ onCreateCustomView?: (data: {
9
+ name: string;
10
+ selectedColumns: ColumnViewProps[];
11
+ layout: LayoutSection;
12
+ }) => Promise<void>;
13
+ onEditCustomView?: (viewId: string, data: {
14
+ name: string;
15
+ selectedColumns: ColumnViewProps[];
16
+ layout: LayoutSection;
17
+ }) => Promise<void>;
18
+ onDeleteCustomView?: (viewId: string) => Promise<void>;
19
+ defaultColumns: ColumnViewProps[];
20
+ defaultTemplate?: ViewMenuItem;
21
+ allTemplates: ViewMenuItem[];
22
+ }
23
+ export declare const useViewsMenu: ({ mode, onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, defaultColumns, defaultTemplate, allTemplates, }: UseViewsMenuProps) => {
24
+ anchorEl: HTMLDivElement | null;
25
+ isCreateDialogOpen: boolean;
26
+ editingView: ViewMenuItem | null;
27
+ selectedViewInfo: ViewOption;
28
+ shouldUseCurrentState: boolean;
29
+ selectedView: ViewMenuItem | undefined;
30
+ currentViewColumns: ColumnViewProps[];
31
+ handleViewButtonClick: (event: MouseEvent<HTMLDivElement>) => void;
32
+ handleCloseViewDropdown: () => void;
33
+ handleSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
34
+ handleOpenCreateDialog: (useCurrentState?: boolean) => void;
35
+ handleOpenEditDialog: (view: ViewMenuItem) => void;
36
+ handleCloseCreateDialog: () => void;
37
+ handleSaveView: (data: {
38
+ name: string;
39
+ selectedColumns: ColumnViewProps[];
40
+ layout: LayoutSection;
41
+ }) => Promise<void>;
42
+ handleDeleteView: (viewId: string) => Promise<void>;
43
+ updateSelectedView: (updatedView: ViewMenuItem) => void;
44
+ };
@@ -0,0 +1,177 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { useState, useCallback, useEffect, useRef } from 'react';
11
+ import { deepCloneColumns } from '../utils';
12
+ export const useViewsMenu = ({ mode, onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, defaultColumns, defaultTemplate, allTemplates, }) => {
13
+ const [anchorEl, setAnchorEl] = useState(null);
14
+ const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);
15
+ const [editingView, setEditingView] = useState(null);
16
+ const [selectedViewInfo, setSelectedViewInfo] = useState({ id: 'default', label: 'Default' });
17
+ const [shouldUseCurrentState, setShouldUseCurrentState] = useState(false);
18
+ const [selectedView, setSelectedView] = useState(undefined);
19
+ const [currentViewColumns, setCurrentViewColumns] = useState([]);
20
+ const hasInitializedRef = useRef(false);
21
+ const getViewForParent = useCallback((view) => {
22
+ var _a;
23
+ const selectedColumns = ((_a = view.submenu) === null || _a === void 0 ? void 0 : _a.filter((col) => col.selected)) || [];
24
+ return Object.assign(Object.assign({}, view), { submenu: selectedColumns, columns: selectedColumns.map((col) => col.name) });
25
+ }, []);
26
+ useEffect(() => {
27
+ if (hasInitializedRef.current)
28
+ return;
29
+ if (!defaultTemplate)
30
+ return;
31
+ setSelectedView(defaultTemplate);
32
+ setCurrentViewColumns(deepCloneColumns(defaultColumns));
33
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(defaultTemplate));
34
+ hasInitializedRef.current = true;
35
+ }, [defaultTemplate, defaultColumns, onViewChange, getViewForParent]);
36
+ useEffect(() => {
37
+ if (!hasInitializedRef.current)
38
+ return;
39
+ if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.default) && defaultColumns.length > 0) {
40
+ setCurrentViewColumns(deepCloneColumns(defaultColumns));
41
+ }
42
+ }, [defaultColumns, selectedView === null || selectedView === void 0 ? void 0 : selectedView.default]);
43
+ const lastSyncedModeRef = useRef(null);
44
+ useEffect(() => {
45
+ if (!hasInitializedRef.current)
46
+ return;
47
+ if (!selectedView)
48
+ return;
49
+ const needsSync = lastSyncedModeRef.current !== mode;
50
+ if (!needsSync)
51
+ return;
52
+ if (selectedView.default) {
53
+ if (defaultColumns.length === 0)
54
+ return;
55
+ const newView = Object.assign(Object.assign({}, selectedView), { submenu: deepCloneColumns(defaultColumns), columns: defaultColumns.map((col) => col.name) });
56
+ setSelectedView(newView);
57
+ setCurrentViewColumns(deepCloneColumns(defaultColumns));
58
+ lastSyncedModeRef.current = mode;
59
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(newView));
60
+ }
61
+ else {
62
+ const updatedTemplate = allTemplates.find((t) => t.templateId === selectedView.templateId || t.id === selectedView.id);
63
+ if (updatedTemplate && updatedTemplate.submenu && updatedTemplate.submenu.length > 0) {
64
+ const newView = Object.assign(Object.assign({}, updatedTemplate), { submenu: deepCloneColumns(updatedTemplate.submenu) });
65
+ setSelectedView(newView);
66
+ setCurrentViewColumns(deepCloneColumns(updatedTemplate.submenu));
67
+ lastSyncedModeRef.current = mode;
68
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(newView));
69
+ }
70
+ }
71
+ }, [mode, defaultColumns, selectedView, allTemplates, onViewChange]);
72
+ useEffect(() => {
73
+ if (!hasInitializedRef.current)
74
+ return;
75
+ if (!selectedView)
76
+ return;
77
+ const updatedTemplate = allTemplates.find((t) => {
78
+ const templateId = t.templateId || t.id;
79
+ const selectedId = selectedView.templateId || selectedView.id;
80
+ return templateId === selectedId;
81
+ });
82
+ if (!updatedTemplate)
83
+ return;
84
+ const currentSubmenu = selectedView.submenu || [];
85
+ const updatedSubmenu = updatedTemplate.submenu || [];
86
+ const hasChanged = currentSubmenu.length !== updatedSubmenu.length ||
87
+ currentSubmenu.some((col, idx) => {
88
+ const updatedCol = updatedSubmenu[idx];
89
+ if (!updatedCol)
90
+ return true;
91
+ return col.selected !== updatedCol.selected || col.name !== updatedCol.name;
92
+ });
93
+ if (hasChanged) {
94
+ const fullView = Object.assign(Object.assign({}, updatedTemplate), { submenu: deepCloneColumns(updatedTemplate.submenu || []) });
95
+ setSelectedView(fullView);
96
+ setCurrentViewColumns(deepCloneColumns(updatedTemplate.submenu || []));
97
+ const viewForParent = getViewForParent(fullView);
98
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(viewForParent);
99
+ }
100
+ }, [allTemplates, selectedView, onViewChange]);
101
+ const handleViewButtonClick = useCallback((event) => {
102
+ setAnchorEl((current) => (current ? null : event.currentTarget));
103
+ }, []);
104
+ const handleCloseViewDropdown = useCallback(() => {
105
+ setAnchorEl(null);
106
+ }, []);
107
+ const handleSelectedViewInfo = useCallback((selected, viewMenuItem) => {
108
+ setSelectedViewInfo(selected);
109
+ const newSelectedView = viewMenuItem || undefined;
110
+ setSelectedView(newSelectedView);
111
+ setCurrentViewColumns(deepCloneColumns((newSelectedView === null || newSelectedView === void 0 ? void 0 : newSelectedView.submenu) || []));
112
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newSelectedView ? getViewForParent(newSelectedView) : undefined);
113
+ handleCloseViewDropdown();
114
+ }, [handleCloseViewDropdown, onViewChange, getViewForParent]);
115
+ const updateSelectedView = useCallback((updatedView) => {
116
+ const viewWithNewRefs = Object.assign(Object.assign({}, updatedView), { submenu: updatedView.submenu ? [...updatedView.submenu] : undefined, columns: updatedView.columns ? [...updatedView.columns] : undefined });
117
+ setSelectedView(viewWithNewRefs);
118
+ setCurrentViewColumns(deepCloneColumns(viewWithNewRefs.submenu || []));
119
+ setSelectedViewInfo({ id: viewWithNewRefs.id, label: viewWithNewRefs.label });
120
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(viewWithNewRefs));
121
+ }, [onViewChange, getViewForParent]);
122
+ const handleOpenCreateDialog = useCallback((useCurrentState = false) => {
123
+ setEditingView(null);
124
+ setShouldUseCurrentState(useCurrentState);
125
+ setIsCreateDialogOpen(true);
126
+ setAnchorEl(null);
127
+ }, []);
128
+ const handleOpenEditDialog = useCallback((view) => {
129
+ setEditingView(view);
130
+ setShouldUseCurrentState(true);
131
+ setIsCreateDialogOpen(true);
132
+ }, []);
133
+ const handleCloseCreateDialog = useCallback(() => {
134
+ setIsCreateDialogOpen(false);
135
+ setEditingView(null);
136
+ setShouldUseCurrentState(false);
137
+ }, []);
138
+ const handleSaveView = useCallback((data) => __awaiter(void 0, void 0, void 0, function* () {
139
+ if (editingView) {
140
+ const templateId = editingView.templateId || editingView.id;
141
+ yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(templateId, data));
142
+ }
143
+ else {
144
+ yield (onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(data));
145
+ }
146
+ }), [editingView, onEditCustomView, onCreateCustomView]);
147
+ const handleDeleteView = useCallback((viewId) => __awaiter(void 0, void 0, void 0, function* () {
148
+ const viewToDelete = allTemplates.find((view) => view.id === viewId || view.templateId === viewId);
149
+ const templateId = (viewToDelete === null || viewToDelete === void 0 ? void 0 : viewToDelete.templateId) || viewId;
150
+ yield (onDeleteCustomView === null || onDeleteCustomView === void 0 ? void 0 : onDeleteCustomView(templateId));
151
+ if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.id) === viewId || (selectedView === null || selectedView === void 0 ? void 0 : selectedView.templateId) === viewId) {
152
+ setSelectedView(defaultTemplate);
153
+ setCurrentViewColumns(deepCloneColumns(defaultColumns));
154
+ if (defaultTemplate) {
155
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(defaultTemplate));
156
+ }
157
+ }
158
+ }), [allTemplates, onDeleteCustomView, selectedView, defaultTemplate, defaultColumns, onViewChange, getViewForParent]);
159
+ return {
160
+ anchorEl,
161
+ isCreateDialogOpen,
162
+ editingView,
163
+ selectedViewInfo,
164
+ shouldUseCurrentState,
165
+ selectedView,
166
+ currentViewColumns,
167
+ handleViewButtonClick,
168
+ handleCloseViewDropdown,
169
+ handleSelectedViewInfo,
170
+ handleOpenCreateDialog,
171
+ handleOpenEditDialog,
172
+ handleCloseCreateDialog,
173
+ handleSaveView,
174
+ handleDeleteView,
175
+ updateSelectedView,
176
+ };
177
+ };
@@ -2,11 +2,11 @@ export { default } from './TableView';
2
2
  export { default as TableView } from './TableView';
3
3
  export { default as DefaultViews } from './DefaultViews';
4
4
  export { default as CustomViews } from './CustomViews';
5
- export { default as ViewSelector } from './ViewSelector';
5
+ export { default as ViewsMenu } from './ViewsMenu';
6
6
  export { default as ViewsDropdown } from './ViewsDropdown';
7
7
  export { default as CreateViewDialog } from './CreateViewDialog';
8
- export type { ViewMenuItem, ViewMode, CreateCustomViewDialogProps, LayoutSection, ColumnItem, FieldItem, TemplateResponse, TemplatesListResponse, } from './types';
8
+ export type { ViewMenuItem, CreateCustomViewDialogProps, LayoutSection, ColumnItem, FieldItem, Template, CreateTemplatePayload, UpdateTemplatePayload, } from './types';
9
9
  export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState, } from './utils';
10
- export { useSubmenuHover } from './hooks';
10
+ export { useSubmenuHover, useViewsManager, useViewsMenu } from './hooks';
11
11
  export { DIALOG_WIDTH, DIALOG_HEIGHT, MAX_CUSTOM_VIEWS, TEMPLATE_NAME_MAX_LENGTH } from './constants';
12
12
  export { defaultViewList, advancedColumns, sheetColumns } from './data';