@tap-payments/os-micro-frontend-shared 0.1.376-test.1-test.2 → 0.1.376-test.1-test.2-test.3-test.4-test.5
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/FiltersRow.js +2 -2
- package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +1 -1
- package/build/components/TableHeader/TableView/ViewsDropdown.js +10 -46
- package/build/components/TableHeader/TableView/ViewsMenu.d.ts +5 -0
- package/build/components/TableHeader/TableView/{ViewSelector.js → ViewsMenu.js} +12 -17
- package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +5 -1
- package/build/components/TableHeader/TableView/hooks/index.d.ts +1 -1
- package/build/components/TableHeader/TableView/hooks/index.js +1 -1
- package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +0 -11
- package/build/components/TableHeader/TableView/hooks/useViewsManager.js +0 -34
- package/build/components/TableHeader/TableView/hooks/{useViewSelector.d.ts → useViewsMenu.d.ts} +3 -9
- package/build/components/TableHeader/TableView/hooks/{useViewSelector.js → useViewsMenu.js} +10 -72
- package/build/components/TableHeader/TableView/index.d.ts +2 -2
- package/build/components/TableHeader/TableView/index.js +2 -4
- package/build/components/TableHeader/TableView/types.d.ts +3 -4
- package/build/components/TableHeader/TableView/utils.js +7 -1
- package/package.json +2 -2
- package/build/components/TableHeader/TableView/ViewSelector.d.ts +0 -5
|
@@ -4,7 +4,7 @@ import { SearchButton, StyledButton, Icon, RangeCalender } from '../index.js';
|
|
|
4
4
|
import { viewIcon } from '../../constants/index.js';
|
|
5
5
|
import FiltersRowWrapper from './FiltersRowWrapper';
|
|
6
6
|
import TableView from './TableView';
|
|
7
|
-
import {
|
|
7
|
+
import { ViewsMenu } from './TableView';
|
|
8
8
|
import TableModeButton from './TableModeButton';
|
|
9
9
|
export default function FiltersRow({ date, calendarMode, onDateChange, onCalendarModeSwitch, tableReportsComponent, tableFilterComponent, isReportsButtonVisible, onViewChange, onSearchChange, onToggleViewButtonClick, rightActions, leftActions, setTableViews, tableViews, resetTableViews, onToggleTextButtonClick, calendarGroupBy, onCalendarGroupChange, maxDateRange = 31, searchPlaceholder, isAcceptance, tableMode = 'default', timezone, browserTimezone, defaultCountryTimezone, onChangeTimezone, segmentCountries, onCreateCustomView, onEditCustomView, onDeleteCustomView, templates, lang, }) {
|
|
10
10
|
const [isViewVisible, setIsViewVisible] = useState(false);
|
|
@@ -16,5 +16,5 @@ export default function FiltersRow({ date, calendarMode, onDateChange, onCalenda
|
|
|
16
16
|
onDateChange === null || onDateChange === void 0 ? void 0 : onDateChange([startDate, endDate]);
|
|
17
17
|
}
|
|
18
18
|
}, mode: calendarMode, onCalendarModeSwitch: onCalendarModeSwitch, maxDateRange: maxDateRange, groupBy: calendarGroupBy, onCalendarGroupChange: onCalendarGroupChange, browserTimezone: browserTimezone, defaultCountryTimezone: defaultCountryTimezone, timezone: timezone, onChangeTimezone: onChangeTimezone, timezoneCountriesCodes: timezoneCountriesCodes })), isReportsButtonVisible && tableReportsComponent, onToggleTextButtonClick && isAcceptance && tableModeButton] })), onToggleViewButtonClick && (_jsx(StyledButton, { children: _jsx(Icon, { src: viewIcon, alt: "view", sx: { width: 14, height: 14 } }) })), onViewChange &&
|
|
19
|
-
(templates ? (_jsx(
|
|
19
|
+
(templates ? (_jsx(ViewsMenu, { onViewChange: onViewChange, onCreateCustomView: onCreateCustomView, onEditCustomView: onEditCustomView, onDeleteCustomView: onDeleteCustomView, tableMode: tableMode, templates: templates, lang: lang })) : (_jsx(TableView, { onViewChange: onViewChange, setIsViewVisible: setIsViewVisible, tableViews: tableViews, setTableViews: setTableViews, resetTableViews: resetTableViews }))), rightActions && !isViewVisible && rightActions] }));
|
|
20
20
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { ViewsDropdownProps } from './types';
|
|
3
|
-
declare function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo,
|
|
3
|
+
declare function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, anchorEl, defaultModified, onMarkDefaultModified, onCreateCustomView, customViews, onEditCustomView, onSaveDefaultColumns, defaultColumns, setDefaultColumns, updateSelectedView, mode, defaultTemplate, }: Readonly<ViewsDropdownProps>): import("react/jsx-runtime").JSX.Element;
|
|
4
4
|
declare const _default: React.MemoExoticComponent<typeof ViewsDropdown>;
|
|
5
5
|
export default _default;
|
|
@@ -13,23 +13,14 @@ import { MAX_CUSTOM_VIEWS } from './constants';
|
|
|
13
13
|
import { ViewsSubmenu } from './components/ViewsSubmenu';
|
|
14
14
|
import { ListStyled, DropdownStyled, MenuItem as StyledMenuItem, Space, SpaceAfter, SubmenuContainer, SaveCustomViewBox, SaveCustomViewInnerBox, ButtonsContainer, CancelButtonSx, OkayButtonSx, ModifiedTextSx, } from './styles';
|
|
15
15
|
import { deepCloneColumns, toggleSingleColumn, toggleSubItem, getSubmenuItems, hasSubmenu, areAllCurrentColumnsSelected, areSomeCurrentColumnsSelected, toggleAllCurrentColumns, areColumnsEqual, } from './utils';
|
|
16
|
-
function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo,
|
|
16
|
+
function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, anchorEl, defaultModified = false, onMarkDefaultModified, onCreateCustomView, customViews = [], onEditCustomView, onSaveDefaultColumns, defaultColumns = [], setDefaultColumns, updateSelectedView, mode = 'default', defaultTemplate, }) {
|
|
17
17
|
const { t } = useTranslation();
|
|
18
18
|
const { hoveredColumn: hoveredItem, anchorEl: submenuAnchorEl, openSubmenu: handleMenuItemHover, closeSubmenu: handleMenuItemLeave, cancelClose: handleSubmenuEnter, forceClose: forceCloseSubmenu, } = useSubmenuHover();
|
|
19
19
|
const [hoveredCustomView, setHoveredCustomView] = React.useState(null);
|
|
20
|
-
const [isModified, setIsModified] = React.useState(false);
|
|
21
|
-
// Track original columns when submenu opens
|
|
22
20
|
const { originalColumns, saveOriginalState, clearOriginalState } = useOriginalColumns(defaultColumns);
|
|
23
|
-
// Build the view list (default template + custom views)
|
|
24
|
-
// Use actual defaultTemplate from props instead of static defaultViewList
|
|
25
21
|
const viewList = useMemo(() => {
|
|
26
|
-
|
|
27
|
-
if (defaultTemplate) {
|
|
28
|
-
list.push(defaultTemplate);
|
|
29
|
-
}
|
|
30
|
-
return [...list, ...customViews];
|
|
22
|
+
return defaultTemplate ? [defaultTemplate, ...customViews] : customViews;
|
|
31
23
|
}, [defaultTemplate, customViews]);
|
|
32
|
-
// Get columns for hovered submenu
|
|
33
24
|
const currentSubmenuColumns = useMemo(() => {
|
|
34
25
|
if (!hoveredItem)
|
|
35
26
|
return [];
|
|
@@ -38,13 +29,11 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
|
|
|
38
29
|
}, [hoveredItem, defaultColumns, viewList]);
|
|
39
30
|
const allCurrentSelected = useMemo(() => areAllCurrentColumnsSelected(currentSubmenuColumns), [currentSubmenuColumns]);
|
|
40
31
|
const someCurrentSelected = useMemo(() => areSomeCurrentColumnsSelected(currentSubmenuColumns, allCurrentSelected), [currentSubmenuColumns, allCurrentSelected]);
|
|
41
|
-
// Check if columns have been modified from original
|
|
42
32
|
const hasChanges = useMemo(() => {
|
|
43
33
|
if (originalColumns.length === 0)
|
|
44
34
|
return false;
|
|
45
35
|
return !areColumnsEqual(defaultColumns, originalColumns);
|
|
46
36
|
}, [defaultColumns, originalColumns]);
|
|
47
|
-
// Handle clicking on a view item
|
|
48
37
|
const handleViewClick = (item) => {
|
|
49
38
|
forceCloseSubmenu();
|
|
50
39
|
clearOriginalState();
|
|
@@ -59,21 +48,18 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
|
|
|
59
48
|
}
|
|
60
49
|
setSelectedViewInfo(item, viewToPass);
|
|
61
50
|
};
|
|
62
|
-
// Toggle column selection
|
|
63
51
|
const toggleColumnSelection = (columnName) => {
|
|
64
52
|
if (!setDefaultColumns)
|
|
65
53
|
return;
|
|
66
54
|
const newColumns = toggleSingleColumn(defaultColumns, columnName);
|
|
67
55
|
setDefaultColumns(newColumns);
|
|
68
56
|
};
|
|
69
|
-
// Toggle nested item
|
|
70
57
|
const toggleNestedItem = (columnName, subItemName) => {
|
|
71
58
|
if (!setDefaultColumns)
|
|
72
59
|
return;
|
|
73
60
|
const newColumns = toggleSubItem(defaultColumns, columnName, subItemName);
|
|
74
61
|
setDefaultColumns(newColumns);
|
|
75
62
|
};
|
|
76
|
-
// Reorder columns
|
|
77
63
|
const handleReorder = (reorderedColumnNames) => {
|
|
78
64
|
if (!setDefaultColumns)
|
|
79
65
|
return;
|
|
@@ -82,71 +68,49 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
|
|
|
82
68
|
.filter((column) => Boolean(column));
|
|
83
69
|
setDefaultColumns(reorderedColumns);
|
|
84
70
|
};
|
|
85
|
-
// Select all columns
|
|
86
71
|
const handleSelectAll = () => {
|
|
87
72
|
if (!setDefaultColumns)
|
|
88
73
|
return;
|
|
89
74
|
const newColumns = toggleAllCurrentColumns(defaultColumns, !allCurrentSelected);
|
|
90
75
|
setDefaultColumns(newColumns);
|
|
91
76
|
};
|
|
92
|
-
// Reset to original
|
|
93
77
|
const handleReset = () => {
|
|
94
78
|
if (!setDefaultColumns || originalColumns.length === 0)
|
|
95
79
|
return;
|
|
96
80
|
setDefaultColumns(deepCloneColumns(originalColumns));
|
|
97
81
|
};
|
|
98
|
-
// Open submenu
|
|
99
82
|
const handleOpenSubmenu = (itemId, element) => {
|
|
100
83
|
saveOriginalState();
|
|
101
84
|
handleMenuItemHover(itemId, element);
|
|
102
85
|
};
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
// Restore original columns if not saved
|
|
106
|
-
if (originalColumns.length > 0 && setDefaultColumns) {
|
|
86
|
+
const restoreSubmenu = () => {
|
|
87
|
+
if (setDefaultColumns && originalColumns.length > 0) {
|
|
107
88
|
setDefaultColumns(deepCloneColumns(originalColumns));
|
|
108
89
|
}
|
|
109
90
|
clearOriginalState();
|
|
110
91
|
forceCloseSubmenu();
|
|
111
92
|
};
|
|
112
|
-
|
|
93
|
+
const handleSubmenuLeave = () => {
|
|
94
|
+
restoreSubmenu();
|
|
95
|
+
};
|
|
113
96
|
const handleCancel = () => {
|
|
114
|
-
|
|
115
|
-
setDefaultColumns(deepCloneColumns(originalColumns));
|
|
116
|
-
}
|
|
117
|
-
clearOriginalState();
|
|
118
|
-
forceCloseSubmenu();
|
|
97
|
+
restoreSubmenu();
|
|
119
98
|
};
|
|
120
|
-
// Save changes
|
|
121
99
|
const handleOkay = () => {
|
|
122
|
-
var _a;
|
|
123
|
-
// Check if we're viewing the default template
|
|
124
100
|
const isViewingDefault = selectedViewInfo.id === (defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.id) || selectedViewInfo.id === 'default' || (defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.default) === true;
|
|
125
|
-
console.log('🔵 handleOkay:', {
|
|
126
|
-
isViewingDefault,
|
|
127
|
-
hasChanges,
|
|
128
|
-
selectedViewInfoId: selectedViewInfo.id,
|
|
129
|
-
defaultTemplateId: defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.id,
|
|
130
|
-
columnsCount: defaultColumns.length,
|
|
131
|
-
});
|
|
132
101
|
if (isViewingDefault && defaultTemplate && defaultColumns.length > 0) {
|
|
133
|
-
// Save changes if any
|
|
134
102
|
if (hasChanges) {
|
|
103
|
+
onMarkDefaultModified === null || onMarkDefaultModified === void 0 ? void 0 : onMarkDefaultModified();
|
|
135
104
|
onSaveDefaultColumns === null || onSaveDefaultColumns === void 0 ? void 0 : onSaveDefaultColumns(defaultColumns);
|
|
136
|
-
setIsModified(true);
|
|
137
105
|
}
|
|
138
|
-
// ALWAYS update the selected view to reflect current column state
|
|
139
|
-
// CRITICAL: Create a NEW object with NEW array references to trigger re-renders
|
|
140
106
|
if (updateSelectedView) {
|
|
141
107
|
const updatedView = Object.assign(Object.assign({}, defaultTemplate), { id: defaultTemplate.id + '', submenu: [...deepCloneColumns(defaultColumns)], columns: [...defaultColumns.map((col) => col.name)] });
|
|
142
|
-
console.log('🟢 Calling updateSelectedView with:', (_a = updatedView.submenu) === null || _a === void 0 ? void 0 : _a.length, 'columns');
|
|
143
108
|
updateSelectedView(updatedView);
|
|
144
109
|
}
|
|
145
110
|
}
|
|
146
111
|
clearOriginalState();
|
|
147
112
|
forceCloseSubmenu();
|
|
148
113
|
};
|
|
149
|
-
// Save as custom view
|
|
150
114
|
const handleSaveAsCustomView = (e) => {
|
|
151
115
|
e.stopPropagation();
|
|
152
116
|
clearOriginalState();
|
|
@@ -174,7 +138,7 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
|
|
|
174
138
|
else if (hasSubmenu(item, defaultColumns)) {
|
|
175
139
|
handleMenuItemLeave();
|
|
176
140
|
}
|
|
177
|
-
}, onClick: () => handleViewClick(item), sx: { position: 'relative', cursor: 'pointer', pr: 1.5 } }, { children: [item.id === selectedViewInfo.id ? _jsx("img", { style: { width: 15, height: 15 }, src: smallBlueCheckIcon, alt: "check" }) : _jsx(Space, {}), _jsxs("span", Object.assign({ style: { flex: 1, fontSize: 11 } }, { children: [item.label, item.default &&
|
|
141
|
+
}, onClick: () => handleViewClick(item), sx: { position: 'relative', cursor: 'pointer', pr: 1.5 } }, { children: [item.id === selectedViewInfo.id ? _jsx("img", { style: { width: 15, height: 15 }, src: smallBlueCheckIcon, alt: "check" }) : _jsx(Space, {}), _jsxs("span", Object.assign({ style: { flex: 1, fontSize: 11 } }, { children: [item.label, item.default && defaultModified && _jsx("span", Object.assign({ style: ModifiedTextSx }, { children: "(Modified)" }))] })), item.isCustom && hoveredCustomView === item.id && (_jsx("img", { src: editIcon, alt: "edit", style: { width: 12, height: 12, cursor: 'pointer' }, onClick: (e) => {
|
|
178
142
|
e.stopPropagation();
|
|
179
143
|
onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(item);
|
|
180
144
|
} })), !item.isCustom && hasSubmenu(item, defaultColumns) && _jsx("img", { src: blackRightArrowIcon, alt: "arrow", style: { height: 12 } })] }), item.id))), _jsx(Tooltip, Object.assign({ title: "Limit reached. Delete a view to create a new one.", placement: "left", disableHoverListener: !shouldDimNewCustomView }, { children: _jsxs(StyledMenuItem, Object.assign({ sx: {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { ViewsMenuProps } from './types';
|
|
3
|
+
declare function ViewsMenu({ onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode, templates, lang, }: ViewsMenuProps): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
declare const _default: import("react").MemoExoticComponent<typeof ViewsMenu>;
|
|
5
|
+
export default _default;
|
|
@@ -8,7 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
11
|
-
import { memo, useCallback } from 'react';
|
|
11
|
+
import { memo, useCallback, useState } from 'react';
|
|
12
12
|
import { useTranslation } from 'react-i18next';
|
|
13
13
|
import ClickAwayListener from '@mui/material/ClickAwayListener';
|
|
14
14
|
import { Icon, StyledButton } from '../../index.js';
|
|
@@ -17,23 +17,20 @@ import ViewsDropdown from './ViewsDropdown';
|
|
|
17
17
|
import CreateViewDialog from './CreateViewDialog';
|
|
18
18
|
import { ViewWrapper } from './styles';
|
|
19
19
|
import { useViewsManager } from './hooks';
|
|
20
|
-
import {
|
|
21
|
-
function
|
|
20
|
+
import { useViewsMenu } from './hooks/useViewsMenu';
|
|
21
|
+
function ViewsMenu({ onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode = 'default', templates, lang = 'en', }) {
|
|
22
|
+
var _a;
|
|
22
23
|
const { t } = useTranslation();
|
|
23
|
-
|
|
24
|
-
const { defaultColumns, updateDefaultColumns, defaultTemplate, customViews, allTemplates
|
|
24
|
+
const [modifiedModes, setModifiedModes] = useState({});
|
|
25
|
+
const { defaultColumns, updateDefaultColumns, defaultTemplate, customViews, allTemplates } = useViewsManager({
|
|
25
26
|
tableMode,
|
|
26
27
|
templates,
|
|
27
28
|
lang,
|
|
28
29
|
});
|
|
29
|
-
// Callback when default template is modified and saved
|
|
30
30
|
const handleSaveDefaultColumns = useCallback((columns) => __awaiter(this, void 0, void 0, function* () {
|
|
31
31
|
if (!(defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.templateId))
|
|
32
32
|
return;
|
|
33
|
-
// Update local state first
|
|
34
33
|
updateDefaultColumns(columns);
|
|
35
|
-
// Build layout for API
|
|
36
|
-
// Map TableMode to layout section code: 'default' → 'Advanced', 'sheet' → 'Sheet'
|
|
37
34
|
const layout = {
|
|
38
35
|
code: tableMode === 'sheet' ? 'Sheet' : 'Advanced',
|
|
39
36
|
columns: columns.map((col, idx) => {
|
|
@@ -55,27 +52,25 @@ function ViewSelector({ onViewChange, onCreateCustomView, onEditCustomView, onDe
|
|
|
55
52
|
});
|
|
56
53
|
}),
|
|
57
54
|
};
|
|
58
|
-
// Call parent to persist
|
|
59
55
|
yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(defaultTemplate.templateId, {
|
|
60
56
|
name: defaultTemplate.label,
|
|
61
57
|
selectedColumns: columns,
|
|
62
58
|
layout,
|
|
63
59
|
}));
|
|
60
|
+
setModifiedModes((current) => (Object.assign(Object.assign({}, current), { [tableMode]: true })));
|
|
64
61
|
}), [defaultTemplate, tableMode, lang, onEditCustomView, updateDefaultColumns]);
|
|
65
|
-
const {
|
|
62
|
+
const { anchorEl, isCreateDialogOpen, editingView, selectedViewInfo, shouldUseCurrentState, currentViewColumns, handleViewButtonClick, handleCloseViewDropdown, handleSelectedViewInfo, handleOpenCreateDialog, handleOpenEditDialog, handleCloseCreateDialog, handleSaveView, handleDeleteView, updateSelectedView, } = useViewsMenu({
|
|
66
63
|
mode: tableMode,
|
|
67
64
|
onViewChange,
|
|
68
65
|
onCreateCustomView,
|
|
69
66
|
onEditCustomView,
|
|
70
67
|
onDeleteCustomView,
|
|
71
|
-
customViews,
|
|
72
68
|
defaultColumns,
|
|
73
69
|
defaultTemplate,
|
|
74
70
|
allTemplates,
|
|
75
|
-
setInternalCustomViews,
|
|
76
71
|
});
|
|
77
|
-
return (_jsxs(_Fragment, { children: [_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCloseViewDropdown }, { children: _jsxs(ViewWrapper, Object.assign({ sx: { width: '32px' }, "data-testid": "
|
|
78
|
-
|
|
79
|
-
},
|
|
72
|
+
return (_jsxs(_Fragment, { children: [_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCloseViewDropdown }, { children: _jsxs(ViewWrapper, Object.assign({ sx: { width: '32px' }, "data-testid": "ViewsMenu" }, { children: [_jsx(StyledButton, Object.assign({ title: t('tableView'), "data-testid": "ViewsMenu_button", onClick: handleViewButtonClick }, { children: _jsx(Icon, { src: viewIcon, alt: "view", sx: { width: 14, height: 14 } }) })), _jsx(ViewsDropdown, { open: Boolean(anchorEl), anchorEl: anchorEl, defaultModified: (_a = modifiedModes[tableMode]) !== null && _a !== void 0 ? _a : false, onMarkDefaultModified: () => {
|
|
73
|
+
setModifiedModes((current) => (Object.assign(Object.assign({}, current), { [tableMode]: true })));
|
|
74
|
+
}, setSelectedViewInfo: handleSelectedViewInfo, selectedViewInfo: selectedViewInfo, onCreateCustomView: handleOpenCreateDialog, customViews: customViews, onEditCustomView: handleOpenEditDialog, onSaveDefaultColumns: handleSaveDefaultColumns, defaultColumns: defaultColumns, setDefaultColumns: updateDefaultColumns, updateSelectedView: updateSelectedView, mode: tableMode, defaultTemplate: defaultTemplate })] })) })), _jsx(CreateViewDialog, { open: isCreateDialogOpen, onClose: handleCloseCreateDialog, availableColumns: defaultColumns, defaultColumns: defaultColumns, onCreate: handleSaveView, editingView: editingView, onDelete: handleDeleteView, tableViews: shouldUseCurrentState ? currentViewColumns : undefined, mode: tableMode })] }));
|
|
80
75
|
}
|
|
81
|
-
export default memo(
|
|
76
|
+
export default memo(ViewsMenu);
|
|
@@ -56,7 +56,11 @@ export const ViewsSubmenu = ({ columns, allCurrentSelected, someCurrentSelected,
|
|
|
56
56
|
alignItems: 'center',
|
|
57
57
|
justifyContent: 'space-between',
|
|
58
58
|
width: '100%',
|
|
59
|
-
} }, { children: [_jsx(MenuItem, Object.assign({ isSelected: hasNestedSubmenu ? checked : column.selected, isIndeterminate: hasNestedSubmenu ? indeterminate : false,
|
|
59
|
+
} }, { children: [_jsx(MenuItem, Object.assign({ isSelected: hasNestedSubmenu ? checked : column.selected, isIndeterminate: hasNestedSubmenu ? indeterminate : false, isDisabled: isDate, onClick: () => {
|
|
60
|
+
if (!isDate) {
|
|
61
|
+
onColumnToggle(column.name);
|
|
62
|
+
}
|
|
63
|
+
}, sx: { flex: 1, display: 'flex', alignItems: 'center' } }, { children: _jsx("span", { children: column.label || column.name }) })), hasNestedSubmenu && (_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', pr: 1, pointerEvents: 'none' } }, { children: _jsx("img", { src: blackRightArrowIcon, alt: "arrow", style: { height: 12 } }) })))] })), hasNestedSubmenu && (_jsx(Popper, Object.assign({ open: hoveredNestedColumn === column.name, anchorEl: nestedSubmenuAnchorEl, placement: "right-start", sx: { zIndex: 10000 }, modifiers: [
|
|
60
64
|
{
|
|
61
65
|
name: 'offset',
|
|
62
66
|
options: {
|
|
@@ -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 {
|
|
5
|
+
export { useViewsMenu } from './useViewsMenu';
|
|
6
6
|
export { useSubmenuHover } from './useSubmenuHover';
|
|
7
7
|
export { useOriginalColumns } from './useOriginalColumns';
|
|
8
8
|
export { useNestedSubmenu } from './useNestedSubmenu';
|
|
@@ -2,7 +2,7 @@ export { useSubMenu } from './useSubMenu';
|
|
|
2
2
|
export { useViewColumns } from './useViewColumns';
|
|
3
3
|
export { useColumnItem } from './useColumnItem';
|
|
4
4
|
export { useViewsManager } from './useViewsManager';
|
|
5
|
-
export {
|
|
5
|
+
export { useViewsMenu } from './useViewsMenu';
|
|
6
6
|
export { useSubmenuHover } from './useSubmenuHover';
|
|
7
7
|
export { useOriginalColumns } from './useOriginalColumns';
|
|
8
8
|
export { useNestedSubmenu } from './useNestedSubmenu';
|
|
@@ -1,20 +1,9 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
1
|
import type { ColumnViewProps } from '../../../../types/index.js';
|
|
3
2
|
import type { UseViewsManagerProps, ViewMenuItem } from '../types';
|
|
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
3
|
export declare const useViewsManager: ({ tableMode, templates, lang }: UseViewsManagerProps) => {
|
|
13
4
|
defaultTemplate: ViewMenuItem | undefined;
|
|
14
5
|
customViews: ViewMenuItem[];
|
|
15
6
|
allTemplates: ViewMenuItem[];
|
|
16
7
|
defaultColumns: ColumnViewProps[];
|
|
17
8
|
updateDefaultColumns: (columns: ColumnViewProps[]) => void;
|
|
18
|
-
internalCustomViews: ViewMenuItem[];
|
|
19
|
-
setInternalCustomViews: import("react").Dispatch<import("react").SetStateAction<ViewMenuItem[]>>;
|
|
20
9
|
};
|
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
import { useState, useEffect, useMemo, useCallback } from 'react';
|
|
2
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
3
|
export const useViewsManager = ({ tableMode, templates, lang = 'en' }) => {
|
|
12
|
-
// Parse templates (this just transforms the data, doesn't manage modifications)
|
|
13
4
|
const parsedTemplates = useMemo(() => {
|
|
14
5
|
if (!templates || templates.length === 0) {
|
|
15
6
|
return {
|
|
@@ -20,7 +11,6 @@ export const useViewsManager = ({ tableMode, templates, lang = 'en' }) => {
|
|
|
20
11
|
};
|
|
21
12
|
}
|
|
22
13
|
const { customViews, defaultTemplate } = transformTemplatesToViewMenuItems(templates, tableMode, lang);
|
|
23
|
-
// Combine all templates for easy access
|
|
24
14
|
const allTemplates = defaultTemplate ? [defaultTemplate, ...customViews] : customViews;
|
|
25
15
|
return {
|
|
26
16
|
customViews,
|
|
@@ -29,68 +19,44 @@ export const useViewsManager = ({ tableMode, templates, lang = 'en' }) => {
|
|
|
29
19
|
allTemplates,
|
|
30
20
|
};
|
|
31
21
|
}, [templates, tableMode, lang]);
|
|
32
|
-
// Local state for default columns - this is the working copy that can be modified
|
|
33
22
|
const [defaultColumns, setDefaultColumns] = useState([]);
|
|
34
|
-
// Track if we've initialized for this mode (to avoid resetting user modifications)
|
|
35
23
|
const [initializedMode, setInitializedMode] = useState(null);
|
|
36
|
-
// Initialize defaultColumns when templates load or mode changes
|
|
37
24
|
useEffect(() => {
|
|
38
|
-
// Only initialize if mode changed or we haven't initialized yet
|
|
39
25
|
if (initializedMode !== tableMode && parsedTemplates.templateDefaultColumns.length > 0) {
|
|
40
26
|
setDefaultColumns(deepCloneColumns(parsedTemplates.templateDefaultColumns));
|
|
41
27
|
setInitializedMode(tableMode);
|
|
42
28
|
}
|
|
43
29
|
}, [tableMode, parsedTemplates.templateDefaultColumns, initializedMode]);
|
|
44
|
-
// Custom views state
|
|
45
|
-
const [internalCustomViews, setInternalCustomViews] = useState([]);
|
|
46
|
-
useEffect(() => {
|
|
47
|
-
setInternalCustomViews([...parsedTemplates.customViews]);
|
|
48
|
-
}, [parsedTemplates.customViews]);
|
|
49
|
-
// Function to update default columns (called when user modifies and clicks Okay)
|
|
50
30
|
const updateDefaultColumns = useCallback((columns) => {
|
|
51
31
|
setDefaultColumns(deepCloneColumns(columns));
|
|
52
32
|
}, []);
|
|
53
|
-
// Create an updated default template with current defaultColumns
|
|
54
|
-
// IMPORTANT: When mode just changed (initializedMode !== tableMode), use parsedTemplates
|
|
55
|
-
// directly because defaultColumns state hasn't updated yet
|
|
56
33
|
const updatedDefaultTemplate = useMemo(() => {
|
|
57
34
|
if (!parsedTemplates.defaultTemplate) {
|
|
58
35
|
return parsedTemplates.defaultTemplate;
|
|
59
36
|
}
|
|
60
|
-
// If mode just changed, use the fresh parsed columns, not the stale state
|
|
61
37
|
const columnsToUse = initializedMode !== tableMode ? parsedTemplates.templateDefaultColumns : defaultColumns;
|
|
62
38
|
if (columnsToUse.length === 0) {
|
|
63
39
|
return parsedTemplates.defaultTemplate;
|
|
64
40
|
}
|
|
65
41
|
return Object.assign(Object.assign({}, parsedTemplates.defaultTemplate), { submenu: columnsToUse, columns: columnsToUse.map((col) => col.name) });
|
|
66
42
|
}, [parsedTemplates.defaultTemplate, parsedTemplates.templateDefaultColumns, defaultColumns, initializedMode, tableMode]);
|
|
67
|
-
// Build allTemplates with the updated default template
|
|
68
43
|
const updatedAllTemplates = useMemo(() => {
|
|
69
44
|
if (!updatedDefaultTemplate) {
|
|
70
45
|
return parsedTemplates.customViews;
|
|
71
46
|
}
|
|
72
47
|
return [updatedDefaultTemplate, ...parsedTemplates.customViews];
|
|
73
48
|
}, [updatedDefaultTemplate, parsedTemplates.customViews]);
|
|
74
|
-
// For mode changes, provide the correct columns
|
|
75
|
-
// Key: ALWAYS prefer state columns if they exist (preserves user modifications)
|
|
76
49
|
const effectiveDefaultColumns = useMemo(() => {
|
|
77
|
-
// If mode just changed AND we have no initialized state, use parsed columns
|
|
78
50
|
if (initializedMode !== tableMode && defaultColumns.length === 0) {
|
|
79
51
|
return parsedTemplates.templateDefaultColumns;
|
|
80
52
|
}
|
|
81
|
-
// Otherwise use state columns (which may include user edits)
|
|
82
53
|
return defaultColumns.length > 0 ? defaultColumns : parsedTemplates.templateDefaultColumns;
|
|
83
54
|
}, [initializedMode, tableMode, defaultColumns, parsedTemplates.templateDefaultColumns]);
|
|
84
55
|
return {
|
|
85
|
-
// Template data (with updated default template including modifications)
|
|
86
56
|
defaultTemplate: updatedDefaultTemplate,
|
|
87
57
|
customViews: parsedTemplates.customViews,
|
|
88
58
|
allTemplates: updatedAllTemplates,
|
|
89
|
-
// Default columns - preserves user edits
|
|
90
59
|
defaultColumns: effectiveDefaultColumns,
|
|
91
60
|
updateDefaultColumns,
|
|
92
|
-
// Internal state
|
|
93
|
-
internalCustomViews,
|
|
94
|
-
setInternalCustomViews,
|
|
95
61
|
};
|
|
96
62
|
};
|
package/build/components/TableHeader/TableView/hooks/{useViewSelector.d.ts → useViewsMenu.d.ts}
RENAMED
|
@@ -2,7 +2,7 @@ import { type MouseEvent } from 'react';
|
|
|
2
2
|
import type { ColumnViewProps, TableMode } from '../../../../types/index.js';
|
|
3
3
|
import type { ViewMenuItem, LayoutSection } from '../types';
|
|
4
4
|
import type { ViewOption } from '../../type';
|
|
5
|
-
export interface
|
|
5
|
+
export interface UseViewsMenuProps {
|
|
6
6
|
mode: TableMode;
|
|
7
7
|
onViewChange?: (selectedView?: ViewMenuItem) => void;
|
|
8
8
|
onCreateCustomView?: (data: {
|
|
@@ -16,16 +16,12 @@ export interface UseViewSelectorProps {
|
|
|
16
16
|
layout: LayoutSection;
|
|
17
17
|
}) => Promise<void>;
|
|
18
18
|
onDeleteCustomView?: (viewId: string) => Promise<void>;
|
|
19
|
-
customViews: ViewMenuItem[];
|
|
20
19
|
defaultColumns: ColumnViewProps[];
|
|
21
20
|
defaultTemplate?: ViewMenuItem;
|
|
22
21
|
allTemplates: ViewMenuItem[];
|
|
23
|
-
setInternalCustomViews: (views: ViewMenuItem[]) => void;
|
|
24
22
|
}
|
|
25
|
-
export declare const
|
|
26
|
-
|
|
27
|
-
defaultViewEl: HTMLDivElement | null;
|
|
28
|
-
setDefaultViewElement: import("react").Dispatch<import("react").SetStateAction<HTMLDivElement | null>>;
|
|
23
|
+
export declare const useViewsMenu: ({ mode, onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, defaultColumns, defaultTemplate, allTemplates, }: UseViewsMenuProps) => {
|
|
24
|
+
anchorEl: HTMLDivElement | null;
|
|
29
25
|
isCreateDialogOpen: boolean;
|
|
30
26
|
editingView: ViewMenuItem | null;
|
|
31
27
|
selectedViewInfo: ViewOption;
|
|
@@ -44,7 +40,5 @@ export declare const useViewSelector: ({ mode, onViewChange, onCreateCustomView,
|
|
|
44
40
|
layout: LayoutSection;
|
|
45
41
|
}) => Promise<void>;
|
|
46
42
|
handleDeleteView: (viewId: string) => Promise<void>;
|
|
47
|
-
handleResetViews: () => void;
|
|
48
43
|
updateSelectedView: (updatedView: ViewMenuItem) => void;
|
|
49
|
-
updateCurrentViewColumns: (columns: ColumnViewProps[]) => void;
|
|
50
44
|
};
|
|
@@ -9,24 +9,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { useState, useCallback, useEffect, useRef } from 'react';
|
|
11
11
|
import { deepCloneColumns } from '../utils';
|
|
12
|
-
export const
|
|
13
|
-
const [
|
|
14
|
-
const [defaultViewEl, setDefaultViewElement] = useState(null);
|
|
12
|
+
export const useViewsMenu = ({ mode, onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, defaultColumns, defaultTemplate, allTemplates, }) => {
|
|
13
|
+
const [anchorEl, setAnchorEl] = useState(null);
|
|
15
14
|
const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);
|
|
16
15
|
const [editingView, setEditingView] = useState(null);
|
|
17
16
|
const [selectedViewInfo, setSelectedViewInfo] = useState({ id: 'default', label: 'Default' });
|
|
18
17
|
const [shouldUseCurrentState, setShouldUseCurrentState] = useState(false);
|
|
19
18
|
const [selectedView, setSelectedView] = useState(undefined);
|
|
20
|
-
// Current view columns - this is what gets displayed and can be modified
|
|
21
19
|
const [currentViewColumns, setCurrentViewColumns] = useState([]);
|
|
22
20
|
const hasInitializedRef = useRef(false);
|
|
23
|
-
// Helper: Filter view to only include selected columns for parent
|
|
24
21
|
const getViewForParent = useCallback((view) => {
|
|
25
22
|
var _a;
|
|
26
23
|
const selectedColumns = ((_a = view.submenu) === null || _a === void 0 ? void 0 : _a.filter((col) => col.selected)) || [];
|
|
27
24
|
return Object.assign(Object.assign({}, view), { submenu: selectedColumns, columns: selectedColumns.map((col) => col.name) });
|
|
28
25
|
}, []);
|
|
29
|
-
// Initialize with default template on mount
|
|
30
26
|
useEffect(() => {
|
|
31
27
|
if (hasInitializedRef.current)
|
|
32
28
|
return;
|
|
@@ -37,7 +33,6 @@ export const useViewSelector = ({ mode, onViewChange, onCreateCustomView, onEdit
|
|
|
37
33
|
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(defaultTemplate));
|
|
38
34
|
hasInitializedRef.current = true;
|
|
39
35
|
}, [defaultTemplate, defaultColumns, onViewChange, getViewForParent]);
|
|
40
|
-
// Sync currentViewColumns with defaultColumns when they change (e.g., after save)
|
|
41
36
|
useEffect(() => {
|
|
42
37
|
if (!hasInitializedRef.current)
|
|
43
38
|
return;
|
|
@@ -45,53 +40,40 @@ export const useViewSelector = ({ mode, onViewChange, onCreateCustomView, onEdit
|
|
|
45
40
|
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
46
41
|
}
|
|
47
42
|
}, [defaultColumns, selectedView === null || selectedView === void 0 ? void 0 : selectedView.default]);
|
|
48
|
-
// Track the last mode we successfully synced columns for
|
|
49
43
|
const lastSyncedModeRef = useRef(null);
|
|
50
|
-
// Handle mode changes - sync with allTemplates updates
|
|
51
|
-
// This effect needs to run whenever mode changes OR when defaultColumns/allTemplates update
|
|
52
44
|
useEffect(() => {
|
|
53
45
|
if (!hasInitializedRef.current)
|
|
54
46
|
return;
|
|
55
47
|
if (!selectedView)
|
|
56
48
|
return;
|
|
57
|
-
// Check if we need to sync: either mode changed, or we haven't synced for current mode yet
|
|
58
49
|
const needsSync = lastSyncedModeRef.current !== mode;
|
|
59
50
|
if (!needsSync)
|
|
60
51
|
return;
|
|
61
|
-
// For default template, wait until defaultColumns has data for the new mode
|
|
62
52
|
if (selectedView.default) {
|
|
63
53
|
if (defaultColumns.length === 0)
|
|
64
|
-
return;
|
|
54
|
+
return;
|
|
65
55
|
const newView = Object.assign(Object.assign({}, selectedView), { submenu: deepCloneColumns(defaultColumns), columns: defaultColumns.map((col) => col.name) });
|
|
66
56
|
setSelectedView(newView);
|
|
67
57
|
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
68
|
-
lastSyncedModeRef.current = mode;
|
|
58
|
+
lastSyncedModeRef.current = mode;
|
|
69
59
|
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(newView));
|
|
70
60
|
}
|
|
71
61
|
else {
|
|
72
|
-
// Custom template: find it in allTemplates (which has new mode's columns)
|
|
73
62
|
const updatedTemplate = allTemplates.find((t) => t.templateId === selectedView.templateId || t.id === selectedView.id);
|
|
74
63
|
if (updatedTemplate && updatedTemplate.submenu && updatedTemplate.submenu.length > 0) {
|
|
75
64
|
const newView = Object.assign(Object.assign({}, updatedTemplate), { submenu: deepCloneColumns(updatedTemplate.submenu) });
|
|
76
65
|
setSelectedView(newView);
|
|
77
66
|
setCurrentViewColumns(deepCloneColumns(updatedTemplate.submenu));
|
|
78
|
-
lastSyncedModeRef.current = mode;
|
|
67
|
+
lastSyncedModeRef.current = mode;
|
|
79
68
|
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(newView));
|
|
80
69
|
}
|
|
81
70
|
}
|
|
82
71
|
}, [mode, defaultColumns, selectedView, allTemplates, onViewChange]);
|
|
83
|
-
// Track template updates ref to detect external changes
|
|
84
|
-
const templatesUpdateRef = useRef(0);
|
|
85
|
-
// Sync selected view when templates change (for edits/updates)
|
|
86
|
-
// This ensures that template edits automatically reflect in the selected view
|
|
87
|
-
// ONLY when triggered by explicit save actions (Okay/Update buttons)
|
|
88
72
|
useEffect(() => {
|
|
89
|
-
var _a;
|
|
90
73
|
if (!hasInitializedRef.current)
|
|
91
74
|
return;
|
|
92
75
|
if (!selectedView)
|
|
93
76
|
return;
|
|
94
|
-
// Find the current selected view in updated allTemplates
|
|
95
77
|
const updatedTemplate = allTemplates.find((t) => {
|
|
96
78
|
const templateId = t.templateId || t.id;
|
|
97
79
|
const selectedId = selectedView.templateId || selectedView.id;
|
|
@@ -99,10 +81,8 @@ export const useViewSelector = ({ mode, onViewChange, onCreateCustomView, onEdit
|
|
|
99
81
|
});
|
|
100
82
|
if (!updatedTemplate)
|
|
101
83
|
return;
|
|
102
|
-
// Check if the template has actually changed by comparing submenu
|
|
103
84
|
const currentSubmenu = selectedView.submenu || [];
|
|
104
85
|
const updatedSubmenu = updatedTemplate.submenu || [];
|
|
105
|
-
// Simple check: if lengths differ or selected states differ, update
|
|
106
86
|
const hasChanged = currentSubmenu.length !== updatedSubmenu.length ||
|
|
107
87
|
currentSubmenu.some((col, idx) => {
|
|
108
88
|
const updatedCol = updatedSubmenu[idx];
|
|
@@ -111,64 +91,39 @@ export const useViewSelector = ({ mode, onViewChange, onCreateCustomView, onEdit
|
|
|
111
91
|
return col.selected !== updatedCol.selected || col.name !== updatedCol.name;
|
|
112
92
|
});
|
|
113
93
|
if (hasChanged) {
|
|
114
|
-
console.log('🔄 Template updated, syncing selected view:', selectedView.label);
|
|
115
|
-
console.log(' Old columns count:', currentSubmenu.length, 'New columns count:', updatedSubmenu.length);
|
|
116
|
-
console.log(' Old selected:', currentSubmenu.filter((c) => c.selected).length, 'New selected:', updatedSubmenu.filter((c) => c.selected).length);
|
|
117
|
-
// Store the full view internally (with all columns)
|
|
118
94
|
const fullView = Object.assign(Object.assign({}, updatedTemplate), { submenu: deepCloneColumns(updatedTemplate.submenu || []) });
|
|
119
95
|
setSelectedView(fullView);
|
|
120
96
|
setCurrentViewColumns(deepCloneColumns(updatedTemplate.submenu || []));
|
|
121
|
-
// Pass only selected columns to parent
|
|
122
97
|
const viewForParent = getViewForParent(fullView);
|
|
123
|
-
console.log('✅ Calling onViewChange with', (_a = viewForParent.submenu) === null || _a === void 0 ? void 0 : _a.length, 'selected columns');
|
|
124
98
|
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(viewForParent);
|
|
125
|
-
templatesUpdateRef.current++;
|
|
126
99
|
}
|
|
127
100
|
}, [allTemplates, selectedView, onViewChange]);
|
|
128
101
|
const handleViewButtonClick = useCallback((event) => {
|
|
129
|
-
|
|
130
|
-
setDefaultViewElement(event.currentTarget);
|
|
102
|
+
setAnchorEl((current) => (current ? null : event.currentTarget));
|
|
131
103
|
}, []);
|
|
132
104
|
const handleCloseViewDropdown = useCallback(() => {
|
|
133
|
-
|
|
105
|
+
setAnchorEl(null);
|
|
134
106
|
}, []);
|
|
135
107
|
const handleSelectedViewInfo = useCallback((selected, viewMenuItem) => {
|
|
136
108
|
setSelectedViewInfo(selected);
|
|
137
109
|
const newSelectedView = viewMenuItem || undefined;
|
|
138
110
|
setSelectedView(newSelectedView);
|
|
139
111
|
setCurrentViewColumns(deepCloneColumns((newSelectedView === null || newSelectedView === void 0 ? void 0 : newSelectedView.submenu) || []));
|
|
140
|
-
|
|
141
|
-
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(newSelectedView));
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(undefined);
|
|
145
|
-
}
|
|
112
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newSelectedView ? getViewForParent(newSelectedView) : undefined);
|
|
146
113
|
handleCloseViewDropdown();
|
|
147
114
|
}, [handleCloseViewDropdown, onViewChange, getViewForParent]);
|
|
148
|
-
// Update selected view with modified columns
|
|
149
115
|
const updateSelectedView = useCallback((updatedView) => {
|
|
150
|
-
var _a, _b;
|
|
151
|
-
console.log('🔴 updateSelectedView called:', {
|
|
152
|
-
id: updatedView.id,
|
|
153
|
-
columnsCount: (_a = updatedView.submenu) === null || _a === void 0 ? void 0 : _a.length,
|
|
154
|
-
selectedColumns: (_b = updatedView.submenu) === null || _b === void 0 ? void 0 : _b.filter((c) => c.selected).length,
|
|
155
|
-
});
|
|
156
|
-
// CRITICAL: Force new object/array references to trigger React re-renders
|
|
157
116
|
const viewWithNewRefs = Object.assign(Object.assign({}, updatedView), { submenu: updatedView.submenu ? [...updatedView.submenu] : undefined, columns: updatedView.columns ? [...updatedView.columns] : undefined });
|
|
158
117
|
setSelectedView(viewWithNewRefs);
|
|
159
118
|
setCurrentViewColumns(deepCloneColumns(viewWithNewRefs.submenu || []));
|
|
160
119
|
setSelectedViewInfo({ id: viewWithNewRefs.id, label: viewWithNewRefs.label });
|
|
161
120
|
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(viewWithNewRefs));
|
|
162
121
|
}, [onViewChange, getViewForParent]);
|
|
163
|
-
// Update current view columns (for temporary modifications)
|
|
164
|
-
const updateCurrentViewColumns = useCallback((columns) => {
|
|
165
|
-
setCurrentViewColumns(columns);
|
|
166
|
-
}, []);
|
|
167
122
|
const handleOpenCreateDialog = useCallback((useCurrentState = false) => {
|
|
168
123
|
setEditingView(null);
|
|
169
124
|
setShouldUseCurrentState(useCurrentState);
|
|
170
125
|
setIsCreateDialogOpen(true);
|
|
171
|
-
|
|
126
|
+
setAnchorEl(null);
|
|
172
127
|
}, []);
|
|
173
128
|
const handleOpenEditDialog = useCallback((view) => {
|
|
174
129
|
setEditingView(view);
|
|
@@ -183,25 +138,16 @@ export const useViewSelector = ({ mode, onViewChange, onCreateCustomView, onEdit
|
|
|
183
138
|
const handleSaveView = useCallback((data) => __awaiter(void 0, void 0, void 0, function* () {
|
|
184
139
|
if (editingView) {
|
|
185
140
|
const templateId = editingView.templateId || editingView.id;
|
|
186
|
-
// Call the edit handler - parent will update templates
|
|
187
141
|
yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(templateId, data));
|
|
188
|
-
// After edit completes successfully, the template will be updated externally via templates prop
|
|
189
|
-
// The useEffect watching allTemplates will automatically sync the view
|
|
190
|
-
console.log('✅ View saved - templates will update and trigger sync');
|
|
191
142
|
}
|
|
192
143
|
else {
|
|
193
|
-
// Call the create handler - parent will add new template
|
|
194
144
|
yield (onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(data));
|
|
195
|
-
// After create completes successfully, the new template will be added externally via templates prop
|
|
196
|
-
// The new template will automatically appear in the dropdown
|
|
197
|
-
console.log('✅ View created - new template will appear in dropdown');
|
|
198
145
|
}
|
|
199
146
|
}), [editingView, onEditCustomView, onCreateCustomView]);
|
|
200
147
|
const handleDeleteView = useCallback((viewId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
201
148
|
const viewToDelete = allTemplates.find((view) => view.id === viewId || view.templateId === viewId);
|
|
202
149
|
const templateId = (viewToDelete === null || viewToDelete === void 0 ? void 0 : viewToDelete.templateId) || viewId;
|
|
203
150
|
yield (onDeleteCustomView === null || onDeleteCustomView === void 0 ? void 0 : onDeleteCustomView(templateId));
|
|
204
|
-
// If deleted view was selected, reset to default
|
|
205
151
|
if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.id) === viewId || (selectedView === null || selectedView === void 0 ? void 0 : selectedView.templateId) === viewId) {
|
|
206
152
|
setSelectedView(defaultTemplate);
|
|
207
153
|
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
@@ -210,14 +156,8 @@ export const useViewSelector = ({ mode, onViewChange, onCreateCustomView, onEdit
|
|
|
210
156
|
}
|
|
211
157
|
}
|
|
212
158
|
}), [allTemplates, onDeleteCustomView, selectedView, defaultTemplate, defaultColumns, onViewChange, getViewForParent]);
|
|
213
|
-
// Reset views to default
|
|
214
|
-
const handleResetViews = useCallback(() => {
|
|
215
|
-
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
216
|
-
}, [defaultColumns]);
|
|
217
159
|
return {
|
|
218
|
-
|
|
219
|
-
defaultViewEl,
|
|
220
|
-
setDefaultViewElement,
|
|
160
|
+
anchorEl,
|
|
221
161
|
isCreateDialogOpen,
|
|
222
162
|
editingView,
|
|
223
163
|
selectedViewInfo,
|
|
@@ -232,8 +172,6 @@ export const useViewSelector = ({ mode, onViewChange, onCreateCustomView, onEdit
|
|
|
232
172
|
handleCloseCreateDialog,
|
|
233
173
|
handleSaveView,
|
|
234
174
|
handleDeleteView,
|
|
235
|
-
handleResetViews,
|
|
236
175
|
updateSelectedView,
|
|
237
|
-
updateCurrentViewColumns,
|
|
238
176
|
};
|
|
239
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
|
|
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 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, useViewsManager,
|
|
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
|
|
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, useViewsManager,
|
|
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';
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
1
|
import type { ColumnViewProps, TableMode } from '../../../types/index.js';
|
|
3
2
|
import type { TableHeaderProps, ViewOption } from '../type';
|
|
4
3
|
export interface ViewMenuItem {
|
|
@@ -102,7 +101,7 @@ export interface ColumnCheckState {
|
|
|
102
101
|
checked: boolean;
|
|
103
102
|
indeterminate: boolean;
|
|
104
103
|
}
|
|
105
|
-
export interface
|
|
104
|
+
export interface ViewsMenuProps {
|
|
106
105
|
onViewChange?: TableHeaderProps['onViewChange'];
|
|
107
106
|
onCreateCustomView?: (data: {
|
|
108
107
|
name: string;
|
|
@@ -123,9 +122,9 @@ export interface ViewsDropdownProps {
|
|
|
123
122
|
open: boolean;
|
|
124
123
|
selectedViewInfo: ViewOption;
|
|
125
124
|
setSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
|
|
126
|
-
onSelect: (e: React.MouseEvent<HTMLDivElement>) => void;
|
|
127
|
-
setViews?: (views: string[]) => void;
|
|
128
125
|
anchorEl: Element | null;
|
|
126
|
+
defaultModified?: boolean;
|
|
127
|
+
onMarkDefaultModified?: () => void;
|
|
129
128
|
onCreateCustomView?: (useCurrentState?: boolean) => void;
|
|
130
129
|
customViews?: ViewMenuItem[];
|
|
131
130
|
onEditCustomView?: (view: ViewMenuItem) => void;
|
|
@@ -22,7 +22,7 @@ export const transformLayoutToColumns = (layout, lang = 'en') => {
|
|
|
22
22
|
columns.push({
|
|
23
23
|
name: col.code,
|
|
24
24
|
label,
|
|
25
|
-
selected: (_d = col.default) !== null && _d !== void 0 ? _d : false,
|
|
25
|
+
selected: isDateColumn(col.code) ? true : (_d = col.default) !== null && _d !== void 0 ? _d : false,
|
|
26
26
|
menuItems: (menuItems === null || menuItems === void 0 ? void 0 : menuItems.length) ? menuItems : undefined,
|
|
27
27
|
});
|
|
28
28
|
});
|
|
@@ -329,6 +329,9 @@ export const toggleSingleColumn = (columns, columnName) => {
|
|
|
329
329
|
var _a;
|
|
330
330
|
if (col.name !== columnName)
|
|
331
331
|
return col;
|
|
332
|
+
if (isDateColumn(col.name)) {
|
|
333
|
+
return Object.assign(Object.assign({}, col), { selected: true });
|
|
334
|
+
}
|
|
332
335
|
const newSelected = !col.selected;
|
|
333
336
|
const updatedMenuItems = (_a = col.menuItems) === null || _a === void 0 ? void 0 : _a.map((item) => (Object.assign(Object.assign({}, item), { selected: newSelected })));
|
|
334
337
|
return Object.assign(Object.assign({}, col), { selected: newSelected, menuItems: updatedMenuItems });
|
|
@@ -411,6 +414,9 @@ export const areSomeCurrentColumnsSelected = (columns, allSelected) => {
|
|
|
411
414
|
export const toggleAllCurrentColumns = (columns, shouldSelect) => {
|
|
412
415
|
return columns.map((col) => {
|
|
413
416
|
var _a;
|
|
417
|
+
if (isDateColumn(col.name)) {
|
|
418
|
+
return Object.assign(Object.assign({}, col), { selected: true });
|
|
419
|
+
}
|
|
414
420
|
const updatedMenuItems = (_a = col.menuItems) === null || _a === void 0 ? void 0 : _a.map((item) => (Object.assign(Object.assign({}, item), { selected: shouldSelect })));
|
|
415
421
|
return Object.assign(Object.assign({}, col), { selected: shouldSelect, menuItems: updatedMenuItems });
|
|
416
422
|
});
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tap-payments/os-micro-frontend-shared",
|
|
3
3
|
"description": "Shared components and utilities for Tap Payments micro frontends",
|
|
4
|
-
"version": "0.1.376-test.1-test.2",
|
|
5
|
-
"testVersion":
|
|
4
|
+
"version": "0.1.376-test.1-test.2-test.3-test.4-test.5",
|
|
5
|
+
"testVersion": 5,
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "build/index.js",
|
|
8
8
|
"module": "build/index.js",
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
|
-
import type { ViewSelectorProps } from './types';
|
|
3
|
-
declare function ViewSelector({ onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode, templates, lang, }: ViewSelectorProps): import("react/jsx-runtime").JSX.Element;
|
|
4
|
-
declare const _default: import("react").MemoExoticComponent<typeof ViewSelector>;
|
|
5
|
-
export default _default;
|