@tap-payments/os-micro-frontend-shared 0.1.372-test.2-test.3-test.4-test.5-test.6-test.7 → 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 (45) 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.js +1 -2
  7. package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +1 -1
  8. package/build/components/TableHeader/TableView/ViewsDropdown.js +91 -108
  9. package/build/components/TableHeader/TableView/ViewsMenu.d.ts +5 -0
  10. package/build/components/TableHeader/TableView/ViewsMenu.js +76 -0
  11. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +46 -23
  12. package/build/components/TableHeader/TableView/hooks/index.d.ts +1 -1
  13. package/build/components/TableHeader/TableView/hooks/index.js +1 -1
  14. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +1 -3
  15. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.js +2 -9
  16. package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +5 -8
  17. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +50 -94
  18. package/build/components/TableHeader/TableView/hooks/useViewsMenu.d.ts +44 -0
  19. package/build/components/TableHeader/TableView/hooks/useViewsMenu.js +177 -0
  20. package/build/components/TableHeader/TableView/index.d.ts +3 -3
  21. package/build/components/TableHeader/TableView/index.js +2 -4
  22. package/build/components/TableHeader/TableView/styles.js +11 -2
  23. package/build/components/TableHeader/TableView/types.d.ts +34 -31
  24. package/build/components/TableHeader/TableView/utils.d.ts +5 -5
  25. package/build/components/TableHeader/TableView/utils.js +16 -4
  26. package/build/components/TableHeader/index.d.ts +1 -0
  27. package/build/components/TableHeader/type.d.ts +2 -8
  28. package/build/components/Toolbar/Toolbar.js +1 -1
  29. package/build/components/VirtualTables/VirtualTable/VirtualTable.d.ts +1 -1
  30. package/build/components/VirtualTables/VirtualTable/VirtualTable.js +4 -3
  31. package/build/constants/apps.js +2 -0
  32. package/build/constants/assets.d.ts +1 -0
  33. package/build/constants/assets.js +1 -0
  34. package/build/types/reports.d.ts +21 -0
  35. package/build/types/table.d.ts +1 -0
  36. package/build/utils/date.js +5 -3
  37. package/build/utils/index.d.ts +1 -0
  38. package/build/utils/index.js +1 -0
  39. package/build/utils/skeletonColumns.d.ts +4 -0
  40. package/build/utils/skeletonColumns.js +17 -0
  41. package/package.json +2 -2
  42. package/build/components/TableHeader/TableView/ViewSelector.d.ts +0 -5
  43. package/build/components/TableHeader/TableView/ViewSelector.js +0 -44
  44. package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +0 -56
  45. package/build/components/TableHeader/TableView/hooks/useViewSelector.js +0 -177
@@ -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';
@@ -18,9 +18,7 @@ export const useCreateViewDialog = ({ open, availableColumns, defaultColumns, ed
18
18
  if (wasClosed && open) {
19
19
  if (editingView) {
20
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;
21
+ const savedColumns = editingView.submenu && editingView.submenu.length > 0 ? editingView.submenu : defaultColumns;
24
22
  const otherColumns = initializeEditingColumns(savedColumns, availableColumns);
25
23
  setSelectedColumns([dateColumn, ...otherColumns]);
26
24
  // Ensure templateName is set to editingView.label (fallback to empty string if undefined)
@@ -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';
@@ -2,12 +2,10 @@ 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
8
  export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState, } from './utils';
9
- export { useSubmenuHover } from './hooks';
9
+ export { useSubmenuHover, useViewsManager, useViewsMenu } from './hooks';
10
10
  export { DIALOG_WIDTH, DIALOG_HEIGHT, MAX_CUSTOM_VIEWS, TEMPLATE_NAME_MAX_LENGTH } from './constants';
11
- // Note: defaultViewList, advancedColumns, sheetColumns are only exported for demo purposes
12
- // They should not be used as defaults in production - all data should come from API
13
11
  export { defaultViewList, advancedColumns, sheetColumns } from './data';
@@ -350,18 +350,24 @@ export const ResetCheckboxSx = {
350
350
  };
351
351
  export const SubmenuContainer = styled(Box)(() => ({
352
352
  minWidth: 200,
353
+ display: 'flex',
354
+ flexDirection: 'column',
355
+ maxHeight: '80vh',
356
+ overflow: 'hidden',
353
357
  }));
354
358
  export const ColumnItemsContainer = styled(Box)(() => ({
355
- maxHeight: 300,
359
+ flex: 1,
356
360
  overflowY: 'auto',
357
361
  paddingLeft: 6,
358
362
  paddingRight: 6,
363
+ minHeight: 0,
359
364
  }));
360
365
  export const SaveCustomViewBox = styled(Box)(() => ({
361
366
  paddingLeft: 8,
362
367
  paddingRight: 8,
363
368
  paddingTop: 8,
364
369
  paddingBottom: 8,
370
+ flexShrink: 0,
365
371
  }));
366
372
  export const SaveCustomViewInnerBox = styled(Box)(({ disabled }) => ({
367
373
  width: '100%',
@@ -376,7 +382,7 @@ export const SaveCustomViewInnerBox = styled(Box)(({ disabled }) => ({
376
382
  cursor: disabled ? 'not-allowed' : 'pointer',
377
383
  opacity: disabled ? 0.5 : 1,
378
384
  }));
379
- export const ButtonsContainer = styled(Box)(() => ({
385
+ export const ButtonsContainer = styled(Box)(({ theme }) => ({
380
386
  display: 'flex',
381
387
  justifyContent: 'flex-end',
382
388
  gap: 12,
@@ -384,6 +390,9 @@ export const ButtonsContainer = styled(Box)(() => ({
384
390
  paddingBottom: 8,
385
391
  paddingLeft: 12,
386
392
  paddingRight: 12,
393
+ flexShrink: 0,
394
+ borderTop: '1px solid',
395
+ borderColor: theme.palette.divider,
387
396
  }));
388
397
  export const CancelButtonSx = {
389
398
  fontSize: 11,
@@ -1,7 +1,5 @@
1
- /// <reference types="react" />
2
- import type { ColumnViewProps } from '../../../types/index.js';
1
+ import type { ColumnViewProps, TableMode } from '../../../types/index.js';
3
2
  import type { TableHeaderProps, ViewOption } from '../type';
4
- export type ViewMode = 'advanced' | 'sheet';
5
3
  export interface ViewMenuItem {
6
4
  label: string;
7
5
  id: string;
@@ -34,7 +32,24 @@ export interface LayoutSection {
34
32
  code: string;
35
33
  columns: ColumnItem[];
36
34
  }
37
- export interface TemplateResponse {
35
+ export interface TemplateAPIMetadata {
36
+ segment: string;
37
+ app: string;
38
+ service: string;
39
+ user: {
40
+ id: string;
41
+ };
42
+ master_template_id?: string;
43
+ }
44
+ export interface CreateTemplatePayload extends TemplateAPIMetadata {
45
+ name: string;
46
+ layout: LayoutSection[];
47
+ }
48
+ export interface UpdateTemplatePayload extends TemplateAPIMetadata {
49
+ name: string;
50
+ layout: LayoutSection[];
51
+ }
52
+ export interface Template {
38
53
  templateId: string;
39
54
  segment: string;
40
55
  app: string;
@@ -52,20 +67,15 @@ export interface TemplateResponse {
52
67
  created: number;
53
68
  updated: number;
54
69
  default: boolean;
55
- object?: string;
56
- master?: boolean;
57
- live_mode?: boolean;
58
- api_version?: string;
59
- feature_version?: string;
60
70
  }
61
- export interface TemplatesListResponse {
71
+ export interface TemplatesList {
62
72
  object: string;
63
73
  live_mode: boolean;
64
74
  api_version: string;
65
75
  feature_version: string;
66
76
  count: number;
67
77
  has_more: boolean;
68
- templates: TemplateResponse[];
78
+ templates: Template[];
69
79
  }
70
80
  export interface CreateCustomViewDialogProps {
71
81
  open: boolean;
@@ -85,19 +95,14 @@ export interface CreateCustomViewDialogProps {
85
95
  } | null;
86
96
  onDelete?: (viewId: string) => Promise<void>;
87
97
  tableViews?: ColumnViewProps[];
88
- mode?: ViewMode;
98
+ mode?: TableMode;
89
99
  }
90
100
  export interface ColumnCheckState {
91
101
  checked: boolean;
92
102
  indeterminate: boolean;
93
103
  }
94
- export interface ViewSelectorProps {
104
+ export interface ViewsMenuProps {
95
105
  onViewChange?: TableHeaderProps['onViewChange'];
96
- setIsViewVisible: (visible: boolean) => void;
97
- setTableViews?: TableHeaderProps['setTableViews'];
98
- tableViews?: TableHeaderProps['tableViews'];
99
- resetTableViews?: TableHeaderProps['resetTableViews'];
100
- customViews?: ViewMenuItem[];
101
106
  onCreateCustomView?: (data: {
102
107
  name: string;
103
108
  selectedColumns: ColumnViewProps[];
@@ -109,29 +114,26 @@ export interface ViewSelectorProps {
109
114
  layout: LayoutSection;
110
115
  }) => Promise<void>;
111
116
  onDeleteCustomView?: (viewId: string) => Promise<void>;
112
- tableMode?: import('../../../types/index.js').TableMode;
113
- onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
114
- initialTableViews?: ColumnViewProps[];
115
- onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
116
- initialCustomViews?: ViewMenuItem[];
117
- layoutData?: LayoutSection[];
118
- templates?: TemplatesListResponse | TemplateResponse[];
117
+ tableMode?: TableMode;
118
+ templates: Template[];
119
119
  lang?: string;
120
120
  }
121
121
  export interface ViewsDropdownProps {
122
122
  open: boolean;
123
123
  selectedViewInfo: ViewOption;
124
124
  setSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
125
- onSelect: (e: React.MouseEvent<HTMLDivElement>, selectedView?: ViewMenuItem) => void;
126
- setViews?: (views: string[]) => void;
127
125
  anchorEl: Element | null;
128
- tableViews?: ColumnViewProps[];
129
- setTableViews?: (columns: ColumnViewProps[]) => void;
126
+ defaultModified?: boolean;
127
+ onMarkDefaultModified?: () => void;
130
128
  onCreateCustomView?: (useCurrentState?: boolean) => void;
131
129
  customViews?: ViewMenuItem[];
132
130
  onEditCustomView?: (view: ViewMenuItem) => void;
131
+ onSaveDefaultColumns?: (columns: ColumnViewProps[]) => void;
133
132
  defaultColumns?: ColumnViewProps[];
134
133
  setDefaultColumns?: (columns: ColumnViewProps[]) => void;
134
+ updateSelectedView?: (view: ViewMenuItem) => void;
135
+ mode?: TableMode;
136
+ defaultTemplate?: ViewMenuItem;
135
137
  }
136
138
  export interface ColumnListProps {
137
139
  selectedColumns: ColumnViewProps[];
@@ -158,6 +160,7 @@ export interface ViewsSubmenuProps {
158
160
  onReset: () => void;
159
161
  onColumnToggle: (columnName: string) => void;
160
162
  onNestedItemToggle: (columnName: string, subItemName: string) => void;
163
+ onReorder: (reorderedColumnNames: string[]) => void;
161
164
  anchorEl: HTMLElement | null;
162
165
  isModified?: boolean;
163
166
  }
@@ -173,7 +176,7 @@ export interface UseCreateViewDialogProps {
173
176
  tableViews?: ColumnViewProps[];
174
177
  }
175
178
  export interface UseViewsManagerProps {
176
- mode: ViewMode;
177
- templates?: TemplatesListResponse | TemplateResponse[];
179
+ tableMode: TableMode;
180
+ templates: Template[];
178
181
  lang?: string;
179
182
  }