@tap-payments/os-micro-frontend-shared 0.1.374-test.1-test.2 → 0.1.374-test.1-test.2-test.3-test.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/components/TableHeader/TableView/ViewSelector.js +55 -13
- package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +1 -1
- package/build/components/TableHeader/TableView/ViewsDropdown.js +81 -140
- package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +42 -23
- package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +8 -7
- package/build/components/TableHeader/TableView/hooks/useViewSelector.js +78 -122
- package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +13 -5
- package/build/components/TableHeader/TableView/hooks/useViewsManager.js +72 -122
- package/build/components/TableHeader/TableView/index.d.ts +2 -2
- package/build/components/TableHeader/TableView/index.js +1 -1
- package/build/components/TableHeader/TableView/types.d.ts +9 -8
- package/build/components/TableHeader/TableView/utils.d.ts +5 -5
- package/build/components/TableHeader/TableView/utils.js +9 -3
- package/package.json +2 -2
|
@@ -8,8 +8,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { useState, useCallback, useEffect, useRef } from 'react';
|
|
11
|
-
import {
|
|
12
|
-
export const useViewSelector = ({ mode, onViewChange, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, defaultColumns, defaultTemplate,
|
|
11
|
+
import { deepCloneColumns } from '../utils';
|
|
12
|
+
export const useViewSelector = ({ mode, onViewChange, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, defaultColumns, defaultTemplate, allTemplates, setInternalCustomViews, apiMetadata, }) => {
|
|
13
13
|
const [anchorViewEl, setAnchorViewEl] = useState(null);
|
|
14
14
|
const [defaultViewEl, setDefaultViewElement] = useState(null);
|
|
15
15
|
const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);
|
|
@@ -17,79 +17,63 @@ export const useViewSelector = ({ mode, onViewChange, onTableViewsChange, onCust
|
|
|
17
17
|
const [selectedViewInfo, setSelectedViewInfo] = useState({ id: 'default', label: 'Default' });
|
|
18
18
|
const [shouldUseCurrentState, setShouldUseCurrentState] = useState(false);
|
|
19
19
|
const [selectedView, setSelectedView] = useState(undefined);
|
|
20
|
+
// Current view columns - this is what gets displayed and can be modified
|
|
21
|
+
const [currentViewColumns, setCurrentViewColumns] = useState([]);
|
|
20
22
|
const hasInitializedRef = useRef(false);
|
|
21
|
-
|
|
22
|
-
// Update editingView when customViews changes to ensure it reflects the latest saved state
|
|
23
|
+
// Initialize with default template on mount
|
|
23
24
|
useEffect(() => {
|
|
24
|
-
if (editingView && customViews.length > 0) {
|
|
25
|
-
const updatedView = customViews.find((view) => view.id === editingView.id);
|
|
26
|
-
if (updatedView && updatedView !== editingView) {
|
|
27
|
-
setEditingView(updatedView);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}, [customViews, editingView]);
|
|
31
|
-
// Update selectedView when customViews changes to ensure it reflects the latest saved state
|
|
32
|
-
useEffect(() => {
|
|
33
|
-
if (selectedView && selectedView.isCustom && customViews.length > 0) {
|
|
34
|
-
const updatedView = customViews.find((view) => view.id === selectedView.id);
|
|
35
|
-
if (updatedView) {
|
|
36
|
-
// Compare submenu to detect changes (deep comparison would be better, but this works for now)
|
|
37
|
-
const submenuChanged = JSON.stringify(updatedView.submenu) !== JSON.stringify(selectedView.submenu);
|
|
38
|
-
const labelChanged = updatedView.label !== selectedView.label;
|
|
39
|
-
if (submenuChanged || labelChanged) {
|
|
40
|
-
// Create a new object reference to ensure React detects the change
|
|
41
|
-
const newSelectedView = Object.assign(Object.assign({}, updatedView), { submenu: updatedView.submenu ? [...updatedView.submenu] : undefined });
|
|
42
|
-
setSelectedView(newSelectedView);
|
|
43
|
-
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newSelectedView);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}, [customViews, selectedView, onViewChange]);
|
|
48
|
-
// Notify parent of initial view on mount only
|
|
49
|
-
useEffect(() => {
|
|
50
|
-
// Only initialize once on mount, don't reset if user has already selected a view
|
|
51
25
|
if (hasInitializedRef.current)
|
|
52
26
|
return;
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
setSelectedView(
|
|
56
|
-
|
|
27
|
+
if (!defaultTemplate)
|
|
28
|
+
return;
|
|
29
|
+
setSelectedView(defaultTemplate);
|
|
30
|
+
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
31
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(defaultTemplate);
|
|
57
32
|
hasInitializedRef.current = true;
|
|
58
|
-
}, [defaultTemplate, onViewChange]);
|
|
59
|
-
//
|
|
33
|
+
}, [defaultTemplate, defaultColumns, onViewChange]);
|
|
34
|
+
// Sync currentViewColumns with defaultColumns when they change (e.g., after save)
|
|
60
35
|
useEffect(() => {
|
|
61
|
-
// Skip initial mount
|
|
62
36
|
if (!hasInitializedRef.current)
|
|
63
37
|
return;
|
|
64
|
-
|
|
65
|
-
|
|
38
|
+
if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.default) && defaultColumns.length > 0) {
|
|
39
|
+
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
40
|
+
}
|
|
41
|
+
}, [defaultColumns, selectedView === null || selectedView === void 0 ? void 0 : selectedView.default]);
|
|
42
|
+
// Track the last mode we successfully synced columns for
|
|
43
|
+
const lastSyncedModeRef = useRef(null);
|
|
44
|
+
// Handle mode changes - sync with allTemplates updates
|
|
45
|
+
// This effect needs to run whenever mode changes OR when defaultColumns/allTemplates update
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
if (!hasInitializedRef.current)
|
|
66
48
|
return;
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
49
|
+
if (!selectedView)
|
|
50
|
+
return;
|
|
51
|
+
// Check if we need to sync: either mode changed, or we haven't synced for current mode yet
|
|
52
|
+
const needsSync = lastSyncedModeRef.current !== mode;
|
|
53
|
+
if (!needsSync)
|
|
54
|
+
return;
|
|
55
|
+
// For default template, wait until defaultColumns has data for the new mode
|
|
56
|
+
if (selectedView.default) {
|
|
57
|
+
if (defaultColumns.length === 0)
|
|
58
|
+
return; // Wait for columns to load
|
|
59
|
+
const newView = Object.assign(Object.assign({}, selectedView), { submenu: deepCloneColumns(defaultColumns), columns: defaultColumns.map((col) => col.name) });
|
|
60
|
+
setSelectedView(newView);
|
|
61
|
+
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
62
|
+
lastSyncedModeRef.current = mode; // Mark as synced only after successful update
|
|
63
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newView);
|
|
73
64
|
}
|
|
74
|
-
else
|
|
75
|
-
//
|
|
76
|
-
const
|
|
77
|
-
if (
|
|
78
|
-
const newView = Object.assign(Object.assign({},
|
|
65
|
+
else {
|
|
66
|
+
// Custom template: find it in allTemplates (which has new mode's columns)
|
|
67
|
+
const updatedTemplate = allTemplates.find((t) => t.templateId === selectedView.templateId || t.id === selectedView.id);
|
|
68
|
+
if (updatedTemplate && updatedTemplate.submenu && updatedTemplate.submenu.length > 0) {
|
|
69
|
+
const newView = Object.assign(Object.assign({}, updatedTemplate), { submenu: deepCloneColumns(updatedTemplate.submenu) });
|
|
79
70
|
setSelectedView(newView);
|
|
71
|
+
setCurrentViewColumns(deepCloneColumns(updatedTemplate.submenu));
|
|
72
|
+
lastSyncedModeRef.current = mode; // Mark as synced only after successful update
|
|
80
73
|
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newView);
|
|
81
74
|
}
|
|
82
75
|
}
|
|
83
|
-
}, [mode,
|
|
84
|
-
const handleTableViewsChange = useCallback((newTableViews) => {
|
|
85
|
-
const setTableViewsState = setTableViews !== null && setTableViews !== void 0 ? setTableViews : setInternalTableViews;
|
|
86
|
-
setTableViewsState(newTableViews);
|
|
87
|
-
onTableViewsChange === null || onTableViewsChange === void 0 ? void 0 : onTableViewsChange(newTableViews);
|
|
88
|
-
}, [setTableViews, setInternalTableViews, onTableViewsChange]);
|
|
89
|
-
const handleCustomViewsChange = useCallback((newCustomViews) => {
|
|
90
|
-
setInternalCustomViews(newCustomViews);
|
|
91
|
-
onCustomViewsChange === null || onCustomViewsChange === void 0 ? void 0 : onCustomViewsChange(newCustomViews);
|
|
92
|
-
}, [setInternalCustomViews, onCustomViewsChange]);
|
|
76
|
+
}, [mode, defaultColumns, selectedView, allTemplates, onViewChange]);
|
|
93
77
|
const handleViewButtonClick = useCallback((event) => {
|
|
94
78
|
setAnchorViewEl(event.currentTarget);
|
|
95
79
|
setDefaultViewElement(event.currentTarget);
|
|
@@ -97,26 +81,25 @@ export const useViewSelector = ({ mode, onViewChange, onTableViewsChange, onCust
|
|
|
97
81
|
const handleCloseViewDropdown = useCallback(() => {
|
|
98
82
|
setDefaultViewElement(null);
|
|
99
83
|
}, []);
|
|
100
|
-
const handleClose = useCallback(() => {
|
|
101
|
-
setAnchorViewEl(null);
|
|
102
|
-
setDefaultViewElement(null);
|
|
103
|
-
setSelectedViewInfo({ label: 'Default', id: 'default' });
|
|
104
|
-
}, []);
|
|
105
84
|
const handleSelectedViewInfo = useCallback((selected, viewMenuItem) => {
|
|
106
85
|
setSelectedViewInfo(selected);
|
|
107
|
-
// Update selected view and notify parent
|
|
108
86
|
const newSelectedView = viewMenuItem || undefined;
|
|
109
87
|
setSelectedView(newSelectedView);
|
|
88
|
+
setCurrentViewColumns(deepCloneColumns((newSelectedView === null || newSelectedView === void 0 ? void 0 : newSelectedView.submenu) || []));
|
|
110
89
|
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newSelectedView);
|
|
111
90
|
handleCloseViewDropdown();
|
|
112
91
|
}, [handleCloseViewDropdown, onViewChange]);
|
|
113
|
-
//
|
|
114
|
-
// Used when default columns change via "Okay" button
|
|
92
|
+
// Update selected view with modified columns
|
|
115
93
|
const updateSelectedView = useCallback((updatedView) => {
|
|
116
94
|
setSelectedView(updatedView);
|
|
95
|
+
setCurrentViewColumns(deepCloneColumns(updatedView.submenu || []));
|
|
117
96
|
setSelectedViewInfo({ id: updatedView.id, label: updatedView.label });
|
|
118
97
|
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(updatedView);
|
|
119
|
-
}, [onViewChange
|
|
98
|
+
}, [onViewChange]);
|
|
99
|
+
// Update current view columns (for temporary modifications)
|
|
100
|
+
const updateCurrentViewColumns = useCallback((columns) => {
|
|
101
|
+
setCurrentViewColumns(columns);
|
|
102
|
+
}, []);
|
|
120
103
|
const handleOpenCreateDialog = useCallback((useCurrentState = false) => {
|
|
121
104
|
setEditingView(null);
|
|
122
105
|
setShouldUseCurrentState(useCurrentState);
|
|
@@ -134,67 +117,39 @@ export const useViewSelector = ({ mode, onViewChange, onTableViewsChange, onCust
|
|
|
134
117
|
setShouldUseCurrentState(false);
|
|
135
118
|
}, []);
|
|
136
119
|
const handleSaveView = useCallback((data) => __awaiter(void 0, void 0, void 0, function* () {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const templateId = editingView.templateId || editingView.id;
|
|
141
|
-
yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(templateId, data));
|
|
142
|
-
// Update state after promise resolves successfully
|
|
143
|
-
const updatedView = Object.assign(Object.assign({}, editingView), { label: data.name, columns: data.selectedColumns.map((col) => col.name), submenu: data.selectedColumns });
|
|
144
|
-
const updatedViews = customViews.map((view) => (view.id === editingView.id ? updatedView : view));
|
|
145
|
-
handleCustomViewsChange(updatedViews);
|
|
146
|
-
// If the updated view is currently selected, update selectedView to reflect changes
|
|
147
|
-
// Create a new object reference to ensure React detects the change
|
|
148
|
-
if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.id) === editingView.id) {
|
|
149
|
-
const newSelectedView = Object.assign(Object.assign({}, updatedView), { submenu: [...updatedView.submenu] });
|
|
150
|
-
setSelectedView(newSelectedView);
|
|
151
|
-
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newSelectedView);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
yield (onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(data));
|
|
156
|
-
// Update state after promise resolves successfully
|
|
157
|
-
const newView = createCustomViewMenuItem(data.name, data.selectedColumns);
|
|
158
|
-
const updatedViews = [...customViews, newView];
|
|
159
|
-
handleCustomViewsChange(updatedViews);
|
|
160
|
-
}
|
|
120
|
+
if (editingView) {
|
|
121
|
+
const templateId = editingView.templateId || editingView.id;
|
|
122
|
+
yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(templateId, data));
|
|
161
123
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
throw error;
|
|
124
|
+
else {
|
|
125
|
+
yield (onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(data));
|
|
165
126
|
}
|
|
166
|
-
}), [editingView,
|
|
127
|
+
}), [editingView, onEditCustomView, onCreateCustomView]);
|
|
167
128
|
const handleDeleteView = useCallback((viewId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
// If the deleted view was selected, reset to default
|
|
177
|
-
if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.id) === viewId) {
|
|
178
|
-
setSelectedView(undefined);
|
|
179
|
-
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(undefined);
|
|
180
|
-
}
|
|
129
|
+
const viewToDelete = allTemplates.find((view) => view.id === viewId || view.templateId === viewId);
|
|
130
|
+
const templateId = (viewToDelete === null || viewToDelete === void 0 ? void 0 : viewToDelete.templateId) || viewId;
|
|
131
|
+
yield (onDeleteCustomView === null || onDeleteCustomView === void 0 ? void 0 : onDeleteCustomView(templateId));
|
|
132
|
+
// If deleted view was selected, reset to default
|
|
133
|
+
if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.id) === viewId || (selectedView === null || selectedView === void 0 ? void 0 : selectedView.templateId) === viewId) {
|
|
134
|
+
setSelectedView(defaultTemplate);
|
|
135
|
+
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
136
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(defaultTemplate);
|
|
181
137
|
}
|
|
182
|
-
|
|
183
|
-
// Error will be handled by the toast in CreateViewDialog
|
|
184
|
-
throw error;
|
|
185
|
-
}
|
|
186
|
-
}), [customViews, handleCustomViewsChange, onDeleteCustomView, selectedView, onViewChange]);
|
|
138
|
+
}), [allTemplates, onDeleteCustomView, selectedView, defaultTemplate, defaultColumns, onViewChange]);
|
|
187
139
|
const handleResetViews = useCallback((views) => {
|
|
188
140
|
if (resetTableViews) {
|
|
189
141
|
resetTableViews({ id: views[0], label: views[0] });
|
|
190
142
|
}
|
|
191
143
|
else {
|
|
192
|
-
|
|
193
|
-
handleTableViewsChange([...defaultColumns]);
|
|
144
|
+
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
194
145
|
}
|
|
195
|
-
}, [resetTableViews, defaultColumns
|
|
146
|
+
}, [resetTableViews, defaultColumns]);
|
|
147
|
+
const handleTableViewsChange = useCallback((newTableViews) => {
|
|
148
|
+
setTableViews === null || setTableViews === void 0 ? void 0 : setTableViews(newTableViews);
|
|
149
|
+
onTableViewsChange === null || onTableViewsChange === void 0 ? void 0 : onTableViewsChange(newTableViews);
|
|
150
|
+
setCurrentViewColumns(deepCloneColumns(newTableViews));
|
|
151
|
+
}, [setTableViews, onTableViewsChange]);
|
|
196
152
|
return {
|
|
197
|
-
// State
|
|
198
153
|
anchorViewEl,
|
|
199
154
|
defaultViewEl,
|
|
200
155
|
setDefaultViewElement,
|
|
@@ -202,10 +157,10 @@ export const useViewSelector = ({ mode, onViewChange, onTableViewsChange, onCust
|
|
|
202
157
|
editingView,
|
|
203
158
|
selectedViewInfo,
|
|
204
159
|
shouldUseCurrentState,
|
|
205
|
-
|
|
160
|
+
selectedView,
|
|
161
|
+
currentViewColumns,
|
|
206
162
|
handleViewButtonClick,
|
|
207
163
|
handleCloseViewDropdown,
|
|
208
|
-
handleClose,
|
|
209
164
|
handleSelectedViewInfo,
|
|
210
165
|
handleOpenCreateDialog,
|
|
211
166
|
handleOpenEditDialog,
|
|
@@ -215,5 +170,6 @@ export const useViewSelector = ({ mode, onViewChange, onTableViewsChange, onCust
|
|
|
215
170
|
handleResetViews,
|
|
216
171
|
handleTableViewsChange,
|
|
217
172
|
updateSelectedView,
|
|
173
|
+
updateCurrentViewColumns,
|
|
218
174
|
};
|
|
219
175
|
};
|
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import type { ColumnViewProps } from '../../../../types/index.js';
|
|
3
3
|
import type { UseViewsManagerProps, ViewMenuItem } from '../types';
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Simplified hook for managing templates and views.
|
|
6
|
+
*
|
|
7
|
+
* Key principles:
|
|
8
|
+
* - Templates from parent are parsed into allTemplates
|
|
9
|
+
* - defaultColumns is the local working copy that can be modified
|
|
10
|
+
* - When user modifies default template, we keep changes locally
|
|
11
|
+
*/
|
|
12
|
+
export declare const useViewsManager: ({ tableMode, templates, lang }: UseViewsManagerProps) => {
|
|
13
|
+
defaultTemplate: ViewMenuItem | undefined;
|
|
14
|
+
customViews: ViewMenuItem[];
|
|
15
|
+
allTemplates: ViewMenuItem[];
|
|
5
16
|
defaultColumns: ColumnViewProps[];
|
|
6
|
-
|
|
7
|
-
internalTableViews: ColumnViewProps[];
|
|
8
|
-
setInternalTableViews: import("react").Dispatch<import("react").SetStateAction<ColumnViewProps[]>>;
|
|
17
|
+
updateDefaultColumns: (columns: ColumnViewProps[]) => void;
|
|
9
18
|
internalCustomViews: ViewMenuItem[];
|
|
10
19
|
setInternalCustomViews: import("react").Dispatch<import("react").SetStateAction<ViewMenuItem[]>>;
|
|
11
|
-
defaultTemplate: ViewMenuItem | undefined;
|
|
12
20
|
};
|
|
@@ -1,139 +1,89 @@
|
|
|
1
1
|
import { useState, useEffect, useMemo, useCallback } from 'react';
|
|
2
|
-
import { transformTemplatesToViewMenuItems } from '../utils';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
import { transformTemplatesToViewMenuItems, deepCloneColumns } from '../utils';
|
|
3
|
+
/**
|
|
4
|
+
* Simplified hook for managing templates and views.
|
|
5
|
+
*
|
|
6
|
+
* Key principles:
|
|
7
|
+
* - Templates from parent are parsed into allTemplates
|
|
8
|
+
* - defaultColumns is the local working copy that can be modified
|
|
9
|
+
* - When user modifies default template, we keep changes locally
|
|
10
|
+
*/
|
|
11
|
+
export const useViewsManager = ({ tableMode, templates, lang = 'en' }) => {
|
|
12
|
+
// Parse templates (this just transforms the data, doesn't manage modifications)
|
|
13
|
+
const parsedTemplates = useMemo(() => {
|
|
14
|
+
if (!templates) {
|
|
15
|
+
return {
|
|
16
|
+
customViews: [],
|
|
17
|
+
defaultTemplate: undefined,
|
|
18
|
+
templateDefaultColumns: [],
|
|
19
|
+
allTemplates: [],
|
|
20
|
+
};
|
|
10
21
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return null;
|
|
16
|
-
const templatesArray = Array.isArray(internalTemplates) ? internalTemplates : internalTemplates.templates;
|
|
17
|
-
const { customViews, defaultTemplateColumns, defaultTemplate } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
|
|
18
|
-
// Only use default template columns - no fallback to layout data
|
|
19
|
-
// The default view must come from a template with default: true
|
|
20
|
-
const effectiveLayoutData = defaultTemplateColumns
|
|
21
|
-
? [
|
|
22
|
-
{
|
|
23
|
-
code: mode === 'advanced' ? 'Advanced' : 'Sheet',
|
|
24
|
-
columns: defaultTemplateColumns.map((col, idx) => {
|
|
25
|
-
var _a, _b;
|
|
26
|
-
return ({
|
|
27
|
-
code: col.name,
|
|
28
|
-
name: [{ text: typeof col.label === 'string' ? col.label : col.name, lang }],
|
|
29
|
-
order: idx + 1,
|
|
30
|
-
default: (_a = col.selected) !== null && _a !== void 0 ? _a : false,
|
|
31
|
-
fields: (_b = col.menuItems) === null || _b === void 0 ? void 0 : _b.map((item) => {
|
|
32
|
-
var _a;
|
|
33
|
-
return ({
|
|
34
|
-
code: item.name,
|
|
35
|
-
name: [{ text: typeof item.label === 'string' ? item.label : item.name, lang: '' }],
|
|
36
|
-
default: (_a = item.selected) !== null && _a !== void 0 ? _a : false,
|
|
37
|
-
});
|
|
38
|
-
}),
|
|
39
|
-
});
|
|
40
|
-
}),
|
|
41
|
-
},
|
|
42
|
-
]
|
|
43
|
-
: [];
|
|
22
|
+
const templatesArray = Array.isArray(templates) ? templates : templates.templates;
|
|
23
|
+
const { customViews, defaultTemplate } = transformTemplatesToViewMenuItems(templatesArray, tableMode, lang);
|
|
24
|
+
// Combine all templates for easy access
|
|
25
|
+
const allTemplates = defaultTemplate ? [defaultTemplate, ...customViews] : customViews;
|
|
44
26
|
return {
|
|
45
27
|
customViews,
|
|
46
|
-
layoutData: effectiveLayoutData,
|
|
47
|
-
defaultTemplateColumns,
|
|
48
28
|
defaultTemplate,
|
|
29
|
+
templateDefaultColumns: (defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.submenu) || [],
|
|
30
|
+
allTemplates,
|
|
49
31
|
};
|
|
50
|
-
}, [
|
|
32
|
+
}, [templates, tableMode, lang]);
|
|
33
|
+
// Local state for default columns - this is the working copy that can be modified
|
|
51
34
|
const [defaultColumns, setDefaultColumns] = useState([]);
|
|
52
|
-
|
|
53
|
-
const [
|
|
35
|
+
// Track if we've initialized for this mode (to avoid resetting user modifications)
|
|
36
|
+
const [initializedMode, setInitializedMode] = useState(null);
|
|
37
|
+
// Initialize defaultColumns when templates load or mode changes
|
|
54
38
|
useEffect(() => {
|
|
55
|
-
// Only
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const newColumns = [...transformedTemplates.defaultTemplateColumns];
|
|
60
|
-
setDefaultColumns(newColumns);
|
|
61
|
-
setInternalTableViews(newColumns);
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
// No default template found - set empty arrays
|
|
65
|
-
setDefaultColumns([]);
|
|
66
|
-
setInternalTableViews([]);
|
|
39
|
+
// Only initialize if mode changed or we haven't initialized yet
|
|
40
|
+
if (initializedMode !== tableMode && parsedTemplates.templateDefaultColumns.length > 0) {
|
|
41
|
+
setDefaultColumns(deepCloneColumns(parsedTemplates.templateDefaultColumns));
|
|
42
|
+
setInitializedMode(tableMode);
|
|
67
43
|
}
|
|
68
|
-
}, [
|
|
69
|
-
//
|
|
44
|
+
}, [tableMode, parsedTemplates.templateDefaultColumns, initializedMode]);
|
|
45
|
+
// Custom views state
|
|
46
|
+
const [internalCustomViews, setInternalCustomViews] = useState([]);
|
|
70
47
|
useEffect(() => {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
48
|
+
setInternalCustomViews([...parsedTemplates.customViews]);
|
|
49
|
+
}, [parsedTemplates.customViews]);
|
|
50
|
+
// Function to update default columns (called when user modifies and clicks Okay)
|
|
51
|
+
const updateDefaultColumns = useCallback((columns) => {
|
|
52
|
+
setDefaultColumns(deepCloneColumns(columns));
|
|
53
|
+
}, []);
|
|
54
|
+
// Create an updated default template with current defaultColumns
|
|
55
|
+
// IMPORTANT: When mode just changed (initializedMode !== tableMode), use parsedTemplates
|
|
56
|
+
// directly because defaultColumns state hasn't updated yet
|
|
57
|
+
const updatedDefaultTemplate = useMemo(() => {
|
|
58
|
+
if (!parsedTemplates.defaultTemplate) {
|
|
59
|
+
return parsedTemplates.defaultTemplate;
|
|
60
|
+
}
|
|
61
|
+
// If mode just changed, use the fresh parsed columns, not the stale state
|
|
62
|
+
const columnsToUse = initializedMode !== tableMode ? parsedTemplates.templateDefaultColumns : defaultColumns;
|
|
63
|
+
if (columnsToUse.length === 0) {
|
|
64
|
+
return parsedTemplates.defaultTemplate;
|
|
74
65
|
}
|
|
75
|
-
|
|
76
|
-
|
|
66
|
+
return Object.assign(Object.assign({}, parsedTemplates.defaultTemplate), { submenu: columnsToUse, columns: columnsToUse.map((col) => col.name) });
|
|
67
|
+
}, [parsedTemplates.defaultTemplate, parsedTemplates.templateDefaultColumns, defaultColumns, initializedMode, tableMode]);
|
|
68
|
+
// Build allTemplates with the updated default template
|
|
69
|
+
const updatedAllTemplates = useMemo(() => {
|
|
70
|
+
if (!updatedDefaultTemplate) {
|
|
71
|
+
return parsedTemplates.customViews;
|
|
77
72
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
// Update the internal templates to persist the changes
|
|
83
|
-
setInternalTemplates((prevTemplates) => {
|
|
84
|
-
if (!prevTemplates)
|
|
85
|
-
return prevTemplates;
|
|
86
|
-
const templatesArray = Array.isArray(prevTemplates) ? prevTemplates : prevTemplates.templates;
|
|
87
|
-
const templatesCopy = templatesArray.map((t) => (Object.assign({}, t)));
|
|
88
|
-
// Find the default template
|
|
89
|
-
const defaultTemplateIndex = templatesCopy.findIndex((t) => t.default);
|
|
90
|
-
if (defaultTemplateIndex === -1)
|
|
91
|
-
return prevTemplates;
|
|
92
|
-
const defaultTemplate = Object.assign({}, templatesCopy[defaultTemplateIndex]);
|
|
93
|
-
const layoutCopy = [...defaultTemplate.layout];
|
|
94
|
-
// Find and update the appropriate layout section
|
|
95
|
-
const layoutCode = mode === 'advanced' ? 'Advanced' : 'Sheet';
|
|
96
|
-
const layoutSectionIndex = layoutCopy.findIndex((section) => section.code === layoutCode);
|
|
97
|
-
if (layoutSectionIndex !== -1) {
|
|
98
|
-
// Convert ColumnViewProps back to template format
|
|
99
|
-
const updatedColumns = newColumns.map((col, idx) => {
|
|
100
|
-
var _a, _b;
|
|
101
|
-
return ({
|
|
102
|
-
code: col.name,
|
|
103
|
-
name: [{ text: typeof col.label === 'string' ? col.label : col.name, lang }],
|
|
104
|
-
order: idx + 1,
|
|
105
|
-
default: (_a = col.selected) !== null && _a !== void 0 ? _a : false,
|
|
106
|
-
fields: (_b = col.menuItems) === null || _b === void 0 ? void 0 : _b.map((item) => {
|
|
107
|
-
var _a;
|
|
108
|
-
return ({
|
|
109
|
-
code: item.name,
|
|
110
|
-
name: [{ text: typeof item.label === 'string' ? item.label : item.name, lang }],
|
|
111
|
-
order: null,
|
|
112
|
-
default: (_a = item.selected) !== null && _a !== void 0 ? _a : false,
|
|
113
|
-
});
|
|
114
|
-
}),
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
layoutCopy[layoutSectionIndex] = Object.assign(Object.assign({}, layoutCopy[layoutSectionIndex]), { columns: updatedColumns });
|
|
118
|
-
defaultTemplate.layout = layoutCopy;
|
|
119
|
-
templatesCopy[defaultTemplateIndex] = defaultTemplate;
|
|
120
|
-
}
|
|
121
|
-
// Return updated templates in the same format as the input
|
|
122
|
-
if (Array.isArray(prevTemplates)) {
|
|
123
|
-
return templatesCopy;
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
return Object.assign(Object.assign({}, prevTemplates), { templates: templatesCopy });
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}, [mode, lang]);
|
|
73
|
+
return [updatedDefaultTemplate, ...parsedTemplates.customViews];
|
|
74
|
+
}, [updatedDefaultTemplate, parsedTemplates.customViews]);
|
|
75
|
+
// Also ensure defaultColumns reflects the correct mode (for when mode just changed)
|
|
76
|
+
const effectiveDefaultColumns = initializedMode !== tableMode ? parsedTemplates.templateDefaultColumns : defaultColumns;
|
|
130
77
|
return {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
78
|
+
// Template data (with updated default template including modifications)
|
|
79
|
+
defaultTemplate: updatedDefaultTemplate,
|
|
80
|
+
customViews: parsedTemplates.customViews,
|
|
81
|
+
allTemplates: updatedAllTemplates,
|
|
82
|
+
// Default columns - use effective columns that match current mode
|
|
83
|
+
defaultColumns: effectiveDefaultColumns,
|
|
84
|
+
updateDefaultColumns,
|
|
85
|
+
// Internal state
|
|
135
86
|
internalCustomViews,
|
|
136
87
|
setInternalCustomViews,
|
|
137
|
-
defaultTemplate: transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplate,
|
|
138
88
|
};
|
|
139
89
|
};
|
|
@@ -5,8 +5,8 @@ export { default as CustomViews } from './CustomViews';
|
|
|
5
5
|
export { default as ViewSelector } from './ViewSelector';
|
|
6
6
|
export { default as ViewsDropdown } from './ViewsDropdown';
|
|
7
7
|
export { default as CreateViewDialog } from './CreateViewDialog';
|
|
8
|
-
export type { ViewMenuItem,
|
|
8
|
+
export type { ViewMenuItem, CreateCustomViewDialogProps, LayoutSection, ColumnItem, FieldItem, TemplateResponse, TemplatesListResponse, TemplateAPIMetadata, 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, useViewSelector } 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';
|
|
@@ -6,7 +6,7 @@ export { default as ViewSelector } from './ViewSelector';
|
|
|
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, useViewSelector } from './hooks';
|
|
10
10
|
export { DIALOG_WIDTH, DIALOG_HEIGHT, MAX_CUSTOM_VIEWS, TEMPLATE_NAME_MAX_LENGTH } from './constants';
|
|
11
11
|
// Note: defaultViewList, advancedColumns, sheetColumns are only exported for demo purposes
|
|
12
12
|
// They should not be used as defaults in production - all data should come from API
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
import type { ColumnViewProps } from '../../../types/index.js';
|
|
2
|
+
import type { ColumnViewProps, TableMode } from '../../../types/index.js';
|
|
3
3
|
import type { TableHeaderProps, ViewOption } from '../type';
|
|
4
|
-
export type ViewMode = 'advanced' | 'sheet';
|
|
5
4
|
export interface ViewMenuItem {
|
|
6
5
|
label: string;
|
|
7
6
|
id: string;
|
|
@@ -102,7 +101,7 @@ export interface CreateCustomViewDialogProps {
|
|
|
102
101
|
} | null;
|
|
103
102
|
onDelete?: (viewId: string) => Promise<void>;
|
|
104
103
|
tableViews?: ColumnViewProps[];
|
|
105
|
-
mode?:
|
|
104
|
+
mode?: TableMode;
|
|
106
105
|
}
|
|
107
106
|
export interface ColumnCheckState {
|
|
108
107
|
checked: boolean;
|
|
@@ -126,7 +125,7 @@ export interface ViewSelectorProps {
|
|
|
126
125
|
layout: LayoutSection;
|
|
127
126
|
}) => Promise<void>;
|
|
128
127
|
onDeleteCustomView?: (viewId: string) => Promise<void>;
|
|
129
|
-
tableMode?:
|
|
128
|
+
tableMode?: TableMode;
|
|
130
129
|
onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
|
|
131
130
|
initialTableViews?: ColumnViewProps[];
|
|
132
131
|
onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
|
|
@@ -140,17 +139,18 @@ export interface ViewsDropdownProps {
|
|
|
140
139
|
open: boolean;
|
|
141
140
|
selectedViewInfo: ViewOption;
|
|
142
141
|
setSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
|
|
143
|
-
onSelect: (e: React.MouseEvent<HTMLDivElement
|
|
142
|
+
onSelect: (e: React.MouseEvent<HTMLDivElement>) => void;
|
|
144
143
|
setViews?: (views: string[]) => void;
|
|
145
144
|
anchorEl: Element | null;
|
|
146
|
-
tableViews?: ColumnViewProps[];
|
|
147
|
-
setTableViews?: (columns: ColumnViewProps[]) => void;
|
|
148
145
|
onCreateCustomView?: (useCurrentState?: boolean) => void;
|
|
149
146
|
customViews?: ViewMenuItem[];
|
|
150
147
|
onEditCustomView?: (view: ViewMenuItem) => void;
|
|
148
|
+
onSaveDefaultColumns?: (columns: ColumnViewProps[]) => void;
|
|
151
149
|
defaultColumns?: ColumnViewProps[];
|
|
152
150
|
setDefaultColumns?: (columns: ColumnViewProps[]) => void;
|
|
153
151
|
updateSelectedView?: (view: ViewMenuItem) => void;
|
|
152
|
+
mode?: TableMode;
|
|
153
|
+
defaultTemplate?: ViewMenuItem;
|
|
154
154
|
}
|
|
155
155
|
export interface ColumnListProps {
|
|
156
156
|
selectedColumns: ColumnViewProps[];
|
|
@@ -177,6 +177,7 @@ export interface ViewsSubmenuProps {
|
|
|
177
177
|
onReset: () => void;
|
|
178
178
|
onColumnToggle: (columnName: string) => void;
|
|
179
179
|
onNestedItemToggle: (columnName: string, subItemName: string) => void;
|
|
180
|
+
onReorder: (reorderedColumnNames: string[]) => void;
|
|
180
181
|
anchorEl: HTMLElement | null;
|
|
181
182
|
isModified?: boolean;
|
|
182
183
|
}
|
|
@@ -192,7 +193,7 @@ export interface UseCreateViewDialogProps {
|
|
|
192
193
|
tableViews?: ColumnViewProps[];
|
|
193
194
|
}
|
|
194
195
|
export interface UseViewsManagerProps {
|
|
195
|
-
|
|
196
|
+
tableMode: TableMode;
|
|
196
197
|
templates?: TemplatesListResponse | TemplateResponse[];
|
|
197
198
|
lang?: string;
|
|
198
199
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { ColumnViewProps } from '../../../types/index.js';
|
|
2
|
-
import type { LayoutSection, ViewMenuItem, ColumnCheckState
|
|
1
|
+
import type { ColumnViewProps, TableMode } from '../../../types/index.js';
|
|
2
|
+
import type { LayoutSection, ViewMenuItem, ColumnCheckState } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* Transform API layout response to internal ColumnViewProps format
|
|
5
5
|
*/
|
|
6
6
|
export declare const transformLayoutToColumns: (layout: LayoutSection[], lang?: string) => ColumnViewProps[];
|
|
7
|
-
export declare const getColumnsByMode: (mode:
|
|
7
|
+
export declare const getColumnsByMode: (mode: TableMode, layoutData?: LayoutSection[]) => ColumnViewProps[];
|
|
8
8
|
export declare const isDateColumn: (name: string) => boolean;
|
|
9
9
|
export declare const getColumnCheckState: (column: ColumnViewProps) => ColumnCheckState;
|
|
10
10
|
export declare const createCustomViewMenuItem: (name: string, selectedColumns: ColumnViewProps[], isDefault?: boolean) => ViewMenuItem;
|
|
@@ -33,7 +33,7 @@ export declare const transformTemplatesToViewMenuItems: (templates: Array<{
|
|
|
33
33
|
default: boolean;
|
|
34
34
|
layout: LayoutSection[];
|
|
35
35
|
templateId: string;
|
|
36
|
-
}>, mode?:
|
|
36
|
+
}>, mode?: TableMode, lang?: string) => {
|
|
37
37
|
customViews: ViewMenuItem[];
|
|
38
38
|
defaultTemplateColumns?: ColumnViewProps[] | undefined;
|
|
39
39
|
defaultTemplate?: ViewMenuItem | undefined;
|
|
@@ -41,7 +41,7 @@ export declare const transformTemplatesToViewMenuItems: (templates: Array<{
|
|
|
41
41
|
/**
|
|
42
42
|
* Convert ColumnViewProps back to LayoutSection format for API requests
|
|
43
43
|
*/
|
|
44
|
-
export declare const convertColumnsToLayoutSection: (columns: ColumnViewProps[], mode:
|
|
44
|
+
export declare const convertColumnsToLayoutSection: (columns: ColumnViewProps[], mode: TableMode, lang?: string) => LayoutSection;
|
|
45
45
|
/**
|
|
46
46
|
* Initialize columns for editing mode
|
|
47
47
|
*/
|