@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.
@@ -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 { createCustomViewMenuItem } from '../utils';
12
- export const useViewSelector = ({ mode, onViewChange, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, defaultColumns, defaultTemplate, setInternalCustomViews, setInternalTableViews, setDefaultColumns, apiMetadata, }) => {
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
- const prevModeRef = useRef(mode);
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
- // Use defaultTemplate if available, otherwise undefined (built-in default view)
54
- const initialView = defaultTemplate || undefined;
55
- setSelectedView(initialView);
56
- onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(initialView);
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
- // Update selected view when mode changes
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
- // Only run if mode actually changed
65
- if (prevModeRef.current === mode)
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
- prevModeRef.current = mode;
68
- if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.id) === 'default' && defaultTemplate) {
69
- // Mode has changed, update with new default template columns
70
- const updatedView = Object.assign(Object.assign({}, defaultTemplate), { submenu: defaultTemplate.submenu ? [...defaultTemplate.submenu] : undefined });
71
- setSelectedView(updatedView);
72
- onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(updatedView);
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 if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.isCustom) && customViews.length > 0) {
75
- // If viewing a custom view, update it with the new columns for this mode
76
- const updatedCustomView = customViews.find((view) => view.id === selectedView.id);
77
- if (updatedCustomView) {
78
- const newView = Object.assign(Object.assign({}, updatedCustomView), { submenu: updatedCustomView.submenu ? [...updatedCustomView.submenu] : undefined });
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, defaultTemplate, customViews, selectedView, onViewChange]);
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
- // Internal function to update selected view and notify parent
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, setSelectedViewInfo]);
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
- try {
138
- if (editingView) {
139
- // Use templateId for API calls, not the internal view id
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
- catch (error) {
163
- // Error will be handled by the toast in CreateViewDialog
164
- throw error;
124
+ else {
125
+ yield (onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(data));
165
126
  }
166
- }), [editingView, customViews, handleCustomViewsChange, onEditCustomView, onCreateCustomView, selectedView, onViewChange]);
127
+ }), [editingView, onEditCustomView, onCreateCustomView]);
167
128
  const handleDeleteView = useCallback((viewId) => __awaiter(void 0, void 0, void 0, function* () {
168
- try {
169
- // Find the view to get its templateId
170
- const viewToDelete = customViews.find((view) => view.id === viewId);
171
- const templateId = (viewToDelete === null || viewToDelete === void 0 ? void 0 : viewToDelete.templateId) || viewId;
172
- yield (onDeleteCustomView === null || onDeleteCustomView === void 0 ? void 0 : onDeleteCustomView(templateId));
173
- // Update state after promise resolves successfully
174
- const updatedViews = customViews.filter((view) => view.id !== viewId);
175
- handleCustomViewsChange(updatedViews);
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
- catch (error) {
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
- // Reset to default columns from templates
193
- handleTableViewsChange([...defaultColumns]);
144
+ setCurrentViewColumns(deepCloneColumns(defaultColumns));
194
145
  }
195
- }, [resetTableViews, defaultColumns, handleTableViewsChange]);
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
- // Handlers
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
- export declare const useViewsManager: ({ mode, templates, lang }: UseViewsManagerProps) => {
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
- setDefaultColumns: (newColumns: ColumnViewProps[]) => void;
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
- export const useViewsManager = ({ mode, templates, lang = 'en' }) => {
4
- // Maintain internal templates state that can be modified
5
- const [internalTemplates, setInternalTemplates] = useState(() => templates);
6
- // Update internal templates when external templates prop changes
7
- useEffect(() => {
8
- if (templates) {
9
- setInternalTemplates(templates);
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
- }, [templates]);
12
- // Transform templates internally - this is the only source of data
13
- const transformedTemplates = useMemo(() => {
14
- if (!internalTemplates)
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
- }, [internalTemplates, mode, lang]);
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
- const [internalTableViews, setInternalTableViews] = useState([]);
53
- const [internalCustomViews, setInternalCustomViews] = useState([]);
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 use default template columns from template with default: true
56
- // No fallback to layout data - default must come from templates array
57
- if (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplateColumns) {
58
- // Create new array references to ensure state updates
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
- }, [mode, transformedTemplates]);
69
- // Update custom views when templates/mode change
44
+ }, [tableMode, parsedTemplates.templateDefaultColumns, initializedMode]);
45
+ // Custom views state
46
+ const [internalCustomViews, setInternalCustomViews] = useState([]);
70
47
  useEffect(() => {
71
- if (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews) {
72
- // Create new array reference to ensure state updates
73
- setInternalCustomViews([...transformedTemplates.customViews]);
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
- else {
76
- setInternalCustomViews([]);
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
- }, [mode, transformedTemplates]);
79
- // Custom setDefaultColumns that also updates the internal templates
80
- const setDefaultColumnsWithTemplateUpdate = useCallback((newColumns) => {
81
- setDefaultColumns(newColumns);
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
- defaultColumns,
132
- setDefaultColumns: setDefaultColumnsWithTemplateUpdate,
133
- internalTableViews,
134
- setInternalTableViews,
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, ViewMode, CreateCustomViewDialogProps, LayoutSection, ColumnItem, FieldItem, TemplateResponse, TemplatesListResponse, TemplateAPIMetadata, CreateTemplatePayload, UpdateTemplatePayload, } from './types';
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?: ViewMode;
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?: import('../../../types/index.js').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>, selectedView?: ViewMenuItem) => void;
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
- mode: ViewMode;
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, ViewMode } from './types';
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: ViewMode, layoutData?: LayoutSection[]) => ColumnViewProps[];
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?: ViewMode, lang?: string) => {
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: ViewMode, lang?: string) => LayoutSection;
44
+ export declare const convertColumnsToLayoutSection: (columns: ColumnViewProps[], mode: TableMode, lang?: string) => LayoutSection;
45
45
  /**
46
46
  * Initialize columns for editing mode
47
47
  */