@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
|
@@ -1,5 +1,14 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { memo } from 'react';
|
|
11
|
+
import { memo, useCallback } from 'react';
|
|
3
12
|
import { useTranslation } from 'react-i18next';
|
|
4
13
|
import ClickAwayListener from '@mui/material/ClickAwayListener';
|
|
5
14
|
import { Icon, StyledButton } from '../../index.js';
|
|
@@ -11,17 +20,51 @@ import { useViewsManager } from './hooks';
|
|
|
11
20
|
import { useViewSelector } from './hooks/useViewSelector';
|
|
12
21
|
function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode = 'default', onTableViewsChange, onCustomViewsChange, templates, lang = 'en', apiMetadata, }) {
|
|
13
22
|
const { t } = useTranslation();
|
|
14
|
-
//
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
mode,
|
|
23
|
+
// Use tableMode directly - no conversion needed
|
|
24
|
+
const { defaultColumns, updateDefaultColumns, defaultTemplate, customViews: internalCustomViews, allTemplates, setInternalCustomViews, } = useViewsManager({
|
|
25
|
+
tableMode,
|
|
18
26
|
templates,
|
|
19
27
|
lang,
|
|
20
28
|
});
|
|
21
|
-
const tableViews = externalTableViews !== null && externalTableViews !== void 0 ? externalTableViews : internalTableViews;
|
|
22
29
|
const customViews = externalCustomViews !== null && externalCustomViews !== void 0 ? externalCustomViews : internalCustomViews;
|
|
23
|
-
|
|
24
|
-
|
|
30
|
+
// Callback when default template is modified and saved
|
|
31
|
+
const handleSaveDefaultColumns = useCallback((columns) => __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
if (!(defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.templateId))
|
|
33
|
+
return;
|
|
34
|
+
// Update local state first
|
|
35
|
+
updateDefaultColumns(columns);
|
|
36
|
+
// Build layout for API
|
|
37
|
+
// Map TableMode to layout section code: 'default' → 'Advanced', 'sheet' → 'Sheet'
|
|
38
|
+
const layout = {
|
|
39
|
+
code: tableMode === 'sheet' ? 'Sheet' : 'Advanced',
|
|
40
|
+
columns: columns.map((col, idx) => {
|
|
41
|
+
var _a, _b;
|
|
42
|
+
return ({
|
|
43
|
+
code: col.name,
|
|
44
|
+
name: [{ text: typeof col.label === 'string' ? col.label : col.name, lang }],
|
|
45
|
+
order: idx + 1,
|
|
46
|
+
default: (_a = col.selected) !== null && _a !== void 0 ? _a : false,
|
|
47
|
+
fields: (_b = col.menuItems) === null || _b === void 0 ? void 0 : _b.map((item) => {
|
|
48
|
+
var _a;
|
|
49
|
+
return ({
|
|
50
|
+
code: item.name,
|
|
51
|
+
name: [{ text: typeof item.label === 'string' ? item.label : item.name, lang }],
|
|
52
|
+
order: null,
|
|
53
|
+
default: (_a = item.selected) !== null && _a !== void 0 ? _a : false,
|
|
54
|
+
});
|
|
55
|
+
}),
|
|
56
|
+
});
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
59
|
+
// Call parent to persist
|
|
60
|
+
yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(defaultTemplate.templateId, {
|
|
61
|
+
name: defaultTemplate.label,
|
|
62
|
+
selectedColumns: columns,
|
|
63
|
+
layout,
|
|
64
|
+
}));
|
|
65
|
+
}), [defaultTemplate, tableMode, lang, onEditCustomView, updateDefaultColumns]);
|
|
66
|
+
const { anchorViewEl, defaultViewEl, setDefaultViewElement, isCreateDialogOpen, editingView, selectedViewInfo, shouldUseCurrentState, currentViewColumns, handleViewButtonClick, handleCloseViewDropdown, handleSelectedViewInfo, handleOpenCreateDialog, handleOpenEditDialog, handleCloseCreateDialog, handleSaveView, handleDeleteView, handleResetViews, handleTableViewsChange, updateSelectedView, updateCurrentViewColumns, } = useViewSelector({
|
|
67
|
+
mode: tableMode,
|
|
25
68
|
onViewChange,
|
|
26
69
|
onTableViewsChange,
|
|
27
70
|
onCustomViewsChange,
|
|
@@ -30,17 +73,16 @@ function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableView
|
|
|
30
73
|
onDeleteCustomView,
|
|
31
74
|
resetTableViews,
|
|
32
75
|
setTableViews,
|
|
33
|
-
tableViews,
|
|
76
|
+
tableViews: externalTableViews !== null && externalTableViews !== void 0 ? externalTableViews : [],
|
|
34
77
|
customViews,
|
|
35
78
|
defaultColumns,
|
|
36
79
|
defaultTemplate,
|
|
80
|
+
allTemplates,
|
|
37
81
|
setInternalCustomViews,
|
|
38
|
-
setInternalTableViews,
|
|
39
|
-
setDefaultColumns,
|
|
40
82
|
apiMetadata,
|
|
41
83
|
});
|
|
42
|
-
return (_jsxs(_Fragment, { children: [_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCloseViewDropdown }, { children: _jsxs(ViewWrapper, Object.assign({ sx: { width: '32px' }, "data-testid": "ViewSelector" }, { children: [_jsx(StyledButton, Object.assign({ title: t('tableView'), "data-testid": "ViewSelector_button", onClick: handleViewButtonClick }, { children: _jsx(Icon, { src: viewIcon, alt: "view", sx: { width: 14, height: 14 } }) })), _jsx(ViewsDropdown, { open: Boolean(defaultViewEl), anchorEl: anchorViewEl, setSelectedViewInfo: handleSelectedViewInfo, selectedViewInfo: selectedViewInfo, onSelect: (e
|
|
84
|
+
return (_jsxs(_Fragment, { children: [_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCloseViewDropdown }, { children: _jsxs(ViewWrapper, Object.assign({ sx: { width: '32px' }, "data-testid": "ViewSelector" }, { children: [_jsx(StyledButton, Object.assign({ title: t('tableView'), "data-testid": "ViewSelector_button", onClick: handleViewButtonClick }, { children: _jsx(Icon, { src: viewIcon, alt: "view", sx: { width: 14, height: 14 } }) })), _jsx(ViewsDropdown, { open: Boolean(defaultViewEl), anchorEl: anchorViewEl, setSelectedViewInfo: handleSelectedViewInfo, selectedViewInfo: selectedViewInfo, onSelect: (e) => {
|
|
43
85
|
setDefaultViewElement(defaultViewEl ? null : e.currentTarget);
|
|
44
|
-
}, setViews: handleResetViews,
|
|
86
|
+
}, setViews: handleResetViews, 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 })] }));
|
|
45
87
|
}
|
|
46
88
|
export default memo(ViewSelector);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import type { ViewsDropdownProps } from './types';
|
|
3
|
-
declare function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect, setViews, anchorEl, onCreateCustomView, customViews, onEditCustomView, defaultColumns, setDefaultColumns, updateSelectedView, }: Readonly<ViewsDropdownProps>): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
declare function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect, setViews, anchorEl, 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;
|
|
@@ -8,177 +8,136 @@ import Button from '@mui/material/Button';
|
|
|
8
8
|
import { useTranslation } from 'react-i18next';
|
|
9
9
|
import { bluePlusIcon, editIcon, smallBlueCheckIcon, blackRightArrowIcon } from '../../../constants/index.js';
|
|
10
10
|
import { Menu, Tooltip } from '../../index.js';
|
|
11
|
-
import { useSubmenuHover, useOriginalColumns
|
|
11
|
+
import { useSubmenuHover, useOriginalColumns } from './hooks';
|
|
12
12
|
import { MAX_CUSTOM_VIEWS } from './constants';
|
|
13
|
-
import { defaultViewList } from './data';
|
|
14
13
|
import { ViewsSubmenu } from './components/ViewsSubmenu';
|
|
15
14
|
import { ListStyled, DropdownStyled, MenuItem as StyledMenuItem, Space, SpaceAfter, SubmenuContainer, SaveCustomViewBox, SaveCustomViewInnerBox, ButtonsContainer, CancelButtonSx, OkayButtonSx, ModifiedTextSx, } from './styles';
|
|
16
15
|
import { deepCloneColumns, toggleSingleColumn, toggleSubItem, getSubmenuItems, hasSubmenu, areAllCurrentColumnsSelected, areSomeCurrentColumnsSelected, toggleAllCurrentColumns, areColumnsEqual, } from './utils';
|
|
17
|
-
function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect, setViews, anchorEl, onCreateCustomView, customViews = [], onEditCustomView, defaultColumns = [], setDefaultColumns, updateSelectedView, }) {
|
|
16
|
+
function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect, setViews, anchorEl, onCreateCustomView, customViews = [], onEditCustomView, onSaveDefaultColumns, defaultColumns = [], setDefaultColumns, updateSelectedView, mode = 'default', defaultTemplate, }) {
|
|
18
17
|
const { t } = useTranslation();
|
|
19
18
|
const { hoveredColumn: hoveredItem, anchorEl: submenuAnchorEl, openSubmenu: handleMenuItemHover, closeSubmenu: handleMenuItemLeave, cancelClose: handleSubmenuEnter, forceClose: forceCloseSubmenu, } = useSubmenuHover();
|
|
20
19
|
const [hoveredCustomView, setHoveredCustomView] = React.useState(null);
|
|
21
|
-
const [
|
|
22
|
-
|
|
23
|
-
const [isOkayClicked, setIsOkayClicked] = React.useState(false);
|
|
24
|
-
const prevDefaultColumnsRef = React.useRef(defaultColumns);
|
|
20
|
+
const [isModified, setIsModified] = React.useState(false);
|
|
21
|
+
// Track original columns when submenu opens
|
|
25
22
|
const { originalColumns, saveOriginalState, clearOriginalState } = useOriginalColumns(defaultColumns);
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
setBaselineColumns([]);
|
|
33
|
-
clearOriginalState();
|
|
23
|
+
// Build the view list (default template + custom views)
|
|
24
|
+
// Use actual defaultTemplate from props instead of static defaultViewList
|
|
25
|
+
const viewList = useMemo(() => {
|
|
26
|
+
const list = [];
|
|
27
|
+
if (defaultTemplate) {
|
|
28
|
+
list.push(defaultTemplate);
|
|
34
29
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (!
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
30
|
+
return [...list, ...customViews];
|
|
31
|
+
}, [defaultTemplate, customViews]);
|
|
32
|
+
// Get columns for hovered submenu
|
|
33
|
+
const currentSubmenuColumns = useMemo(() => {
|
|
34
|
+
if (!hoveredItem)
|
|
35
|
+
return [];
|
|
36
|
+
const item = viewList.find((i) => i.id === hoveredItem);
|
|
37
|
+
return item ? getSubmenuItems(item, defaultColumns) : [];
|
|
38
|
+
}, [hoveredItem, defaultColumns, viewList]);
|
|
39
|
+
const allCurrentSelected = useMemo(() => areAllCurrentColumnsSelected(currentSubmenuColumns), [currentSubmenuColumns]);
|
|
40
|
+
const someCurrentSelected = useMemo(() => areSomeCurrentColumnsSelected(currentSubmenuColumns, allCurrentSelected), [currentSubmenuColumns, allCurrentSelected]);
|
|
41
|
+
// Check if columns have been modified from original
|
|
42
|
+
const hasChanges = useMemo(() => {
|
|
43
|
+
if (originalColumns.length === 0)
|
|
44
|
+
return false;
|
|
45
|
+
return !areColumnsEqual(defaultColumns, originalColumns);
|
|
46
|
+
}, [defaultColumns, originalColumns]);
|
|
47
|
+
// Handle clicking on a view item
|
|
52
48
|
const handleViewClick = (item) => {
|
|
53
|
-
// Mark as if Okay was clicked to prevent restoring original state
|
|
54
|
-
// When clicking directly on a view item, user wants to apply the view as-is
|
|
55
|
-
setIsOkayClicked(true);
|
|
56
|
-
// Close submenu immediately when clicking on a view (don't wait for hover to end)
|
|
57
49
|
forceCloseSubmenu();
|
|
58
|
-
// Clear original state since we're committing to this view
|
|
59
50
|
clearOriginalState();
|
|
60
|
-
if (item.columns)
|
|
61
|
-
setViews === null || setViews === void 0 ? void 0 : setViews(item.columns);
|
|
62
|
-
// For default view, construct a complete view object with submenu (defaultColumns)
|
|
63
|
-
// For custom views, pass the view object as-is
|
|
64
51
|
let viewToPass;
|
|
65
|
-
if (item.
|
|
66
|
-
//
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
label: item.label,
|
|
70
|
-
submenu: defaultColumns,
|
|
71
|
-
columns: defaultColumns.map((col) => col.name),
|
|
72
|
-
};
|
|
52
|
+
if (item.default) {
|
|
53
|
+
// For default template, use defaultColumns (which is the default template's working copy)
|
|
54
|
+
const columns = defaultColumns.length > 0 ? defaultColumns : (defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.submenu) || [];
|
|
55
|
+
viewToPass = Object.assign(Object.assign({}, item), { submenu: deepCloneColumns(columns), columns: columns.map((col) => col.name) });
|
|
73
56
|
}
|
|
74
57
|
else if (item.isCustom) {
|
|
75
58
|
viewToPass = item;
|
|
76
59
|
}
|
|
77
|
-
else {
|
|
78
|
-
viewToPass = undefined;
|
|
79
|
-
}
|
|
80
|
-
// Update selected view info with the view object - this will trigger view change
|
|
81
60
|
setSelectedViewInfo(item, viewToPass);
|
|
82
61
|
};
|
|
62
|
+
// Toggle column selection
|
|
83
63
|
const toggleColumnSelection = (columnName) => {
|
|
84
64
|
if (!setDefaultColumns)
|
|
85
65
|
return;
|
|
86
66
|
const newColumns = toggleSingleColumn(defaultColumns, columnName);
|
|
87
67
|
setDefaultColumns(newColumns);
|
|
88
68
|
};
|
|
69
|
+
// Toggle nested item
|
|
89
70
|
const toggleNestedItem = (columnName, subItemName) => {
|
|
90
71
|
if (!setDefaultColumns)
|
|
91
72
|
return;
|
|
92
73
|
const newColumns = toggleSubItem(defaultColumns, columnName, subItemName);
|
|
93
74
|
setDefaultColumns(newColumns);
|
|
94
75
|
};
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
76
|
+
// Reorder columns
|
|
77
|
+
const handleReorder = (reorderedColumnNames) => {
|
|
78
|
+
if (!setDefaultColumns)
|
|
79
|
+
return;
|
|
80
|
+
const reorderedColumns = reorderedColumnNames
|
|
81
|
+
.map((name) => defaultColumns.find((column) => column.name === name))
|
|
82
|
+
.filter((column) => Boolean(column));
|
|
83
|
+
setDefaultColumns(reorderedColumns);
|
|
100
84
|
};
|
|
101
|
-
|
|
102
|
-
const originalSubmenuColumns = useMemo(() => {
|
|
103
|
-
if (!hoveredItem || originalColumns.length === 0)
|
|
104
|
-
return [];
|
|
105
|
-
const item = viewList.find((i) => i.id === hoveredItem);
|
|
106
|
-
return item ? getSubmenuItems(item, originalColumns) : [];
|
|
107
|
-
}, [hoveredItem, originalColumns, viewList]);
|
|
108
|
-
const isSubmenuModified = useMemo(() => {
|
|
109
|
-
if (originalSubmenuColumns.length === 0)
|
|
110
|
-
return true;
|
|
111
|
-
return !areColumnsEqual(currentSubmenuColumns, originalSubmenuColumns);
|
|
112
|
-
}, [currentSubmenuColumns, originalSubmenuColumns]);
|
|
113
|
-
const allCurrentSelected = useMemo(() => areAllCurrentColumnsSelected(currentSubmenuColumns), [currentSubmenuColumns]);
|
|
114
|
-
const someCurrentSelected = useMemo(() => areSomeCurrentColumnsSelected(currentSubmenuColumns, allCurrentSelected), [currentSubmenuColumns, allCurrentSelected]);
|
|
85
|
+
// Select all columns
|
|
115
86
|
const handleSelectAll = () => {
|
|
116
87
|
if (!setDefaultColumns)
|
|
117
88
|
return;
|
|
118
|
-
const
|
|
119
|
-
const newColumns = toggleAllCurrentColumns(defaultColumns, shouldSelectAll);
|
|
89
|
+
const newColumns = toggleAllCurrentColumns(defaultColumns, !allCurrentSelected);
|
|
120
90
|
setDefaultColumns(newColumns);
|
|
121
91
|
};
|
|
92
|
+
// Reset to original
|
|
122
93
|
const handleReset = () => {
|
|
123
94
|
if (!setDefaultColumns || originalColumns.length === 0)
|
|
124
95
|
return;
|
|
125
|
-
|
|
126
|
-
setDefaultColumns([...restoredColumns]);
|
|
127
|
-
setIsDefaultModified(false);
|
|
128
|
-
setBaselineColumns([]);
|
|
96
|
+
setDefaultColumns(deepCloneColumns(originalColumns));
|
|
129
97
|
};
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
98
|
+
// Open submenu
|
|
99
|
+
const handleOpenSubmenu = (itemId, element) => {
|
|
100
|
+
saveOriginalState();
|
|
101
|
+
handleMenuItemHover(itemId, element);
|
|
102
|
+
};
|
|
103
|
+
// Close submenu and restore if no changes saved
|
|
104
|
+
const handleSubmenuLeave = () => {
|
|
105
|
+
// Restore original columns if not saved
|
|
106
|
+
if (originalColumns.length > 0 && setDefaultColumns) {
|
|
107
|
+
setDefaultColumns(deepCloneColumns(originalColumns));
|
|
108
|
+
}
|
|
133
109
|
clearOriginalState();
|
|
134
110
|
forceCloseSubmenu();
|
|
135
|
-
onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(true); // Use current state when saving from submenu
|
|
136
111
|
};
|
|
112
|
+
// Cancel changes
|
|
137
113
|
const handleCancel = () => {
|
|
138
114
|
if (setDefaultColumns && originalColumns.length > 0) {
|
|
139
|
-
|
|
140
|
-
setDefaultColumns(restoredColumns);
|
|
141
|
-
// Reset modified state when canceling
|
|
142
|
-
setIsDefaultModified(false);
|
|
143
|
-
setBaselineColumns([]);
|
|
115
|
+
setDefaultColumns(deepCloneColumns(originalColumns));
|
|
144
116
|
}
|
|
145
117
|
clearOriginalState();
|
|
146
|
-
setIsOkayClicked(false);
|
|
147
118
|
forceCloseSubmenu();
|
|
148
119
|
};
|
|
120
|
+
// Save changes
|
|
149
121
|
const handleOkay = () => {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
122
|
+
const isViewingDefault = selectedViewInfo.id === (defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.id);
|
|
123
|
+
if (hasChanges && isViewingDefault) {
|
|
124
|
+
// Save the modified columns
|
|
125
|
+
onSaveDefaultColumns === null || onSaveDefaultColumns === void 0 ? void 0 : onSaveDefaultColumns(defaultColumns);
|
|
126
|
+
setIsModified(true);
|
|
127
|
+
// Update the selected view
|
|
128
|
+
if (updateSelectedView && defaultTemplate) {
|
|
129
|
+
updateSelectedView(Object.assign(Object.assign({}, defaultTemplate), { submenu: deepCloneColumns(defaultColumns), columns: defaultColumns.map((col) => col.name) }));
|
|
158
130
|
}
|
|
159
131
|
}
|
|
160
|
-
// Always update selected view when Okay is clicked to ensure parent re-renders
|
|
161
|
-
if (selectedViewInfo.id === 'default' && defaultColumns.length > 0 && updateSelectedView) {
|
|
162
|
-
const defaultViewWithColumns = {
|
|
163
|
-
id: 'default',
|
|
164
|
-
label: selectedViewInfo.label || 'Default',
|
|
165
|
-
submenu: [...defaultColumns],
|
|
166
|
-
columns: defaultColumns.map((col) => col.name),
|
|
167
|
-
};
|
|
168
|
-
updateSelectedView(defaultViewWithColumns);
|
|
169
|
-
}
|
|
170
|
-
setIsOkayClicked(true); // Mark that Okay was clicked so we don't restore on close
|
|
171
132
|
clearOriginalState();
|
|
172
133
|
forceCloseSubmenu();
|
|
173
134
|
};
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
181
|
-
handleMenuItemHover(itemId, element);
|
|
135
|
+
// Save as custom view
|
|
136
|
+
const handleSaveAsCustomView = (e) => {
|
|
137
|
+
e.stopPropagation();
|
|
138
|
+
clearOriginalState();
|
|
139
|
+
forceCloseSubmenu();
|
|
140
|
+
onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(true);
|
|
182
141
|
};
|
|
183
142
|
const shouldDimNewCustomView = customViews.length >= MAX_CUSTOM_VIEWS;
|
|
184
143
|
return (_jsxs(DropdownStyled, Object.assign({ "data-testid": "ViewsDropdown" }, { children: [_jsx(Popper, Object.assign({ open: open, anchorEl: anchorEl, placement: "bottom-start" }, { children: _jsxs(ListStyled, { children: [_jsx(Typography, Object.assign({ sx: {
|
|
@@ -201,14 +160,7 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
|
|
|
201
160
|
else if (hasSubmenu(item, defaultColumns)) {
|
|
202
161
|
handleMenuItemLeave();
|
|
203
162
|
}
|
|
204
|
-
}, onClick: () => handleViewClick(item), sx: {
|
|
205
|
-
position: 'relative',
|
|
206
|
-
cursor: 'pointer',
|
|
207
|
-
pr: 1.5,
|
|
208
|
-
} }, { children: [item.id === selectedViewInfo.id ? (_jsx("img", { style: {
|
|
209
|
-
width: 15,
|
|
210
|
-
height: 15,
|
|
211
|
-
}, className: "check-icon", src: smallBlueCheckIcon, alt: "check" })) : (_jsx(Space, {})), _jsxs("span", Object.assign({ style: { flex: 1, fontSize: 11 } }, { children: [item.label, item.id === 'default' && isDefaultModified && _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) => {
|
|
163
|
+
}, 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 && item.id === selectedViewInfo.id && isModified && _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) => {
|
|
212
164
|
e.stopPropagation();
|
|
213
165
|
onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(item);
|
|
214
166
|
} })), !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: {
|
|
@@ -222,22 +174,11 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
|
|
|
222
174
|
}
|
|
223
175
|
e.stopPropagation();
|
|
224
176
|
handleSubmenuLeave();
|
|
225
|
-
onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(false);
|
|
226
|
-
} }, { children: [_jsx(Space, {}), _jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 0.5 } }, { children: [_jsx("img", { src: bluePlusIcon, alt: "icon", style: { opacity: shouldDimNewCustomView ? 0.5 : 1, width: 10, height: 10 } }), _jsx("span", Object.assign({ style: { color: shouldDimNewCustomView ? '#999' : '#1F88D0', fontSize: 11, fontWeight: 500 } }, { children: t('New Custom View') }))] })), _jsx(SpaceAfter, {})] })) }))] }) })), hoveredItem && submenuAnchorEl &&
|
|
227
|
-
{
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
},
|
|
232
|
-
},
|
|
233
|
-
{
|
|
234
|
-
name: 'preventOverflow',
|
|
235
|
-
enabled: true,
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
name: 'flip',
|
|
239
|
-
enabled: true,
|
|
240
|
-
},
|
|
241
|
-
] }, { children: _jsxs(SubmenuContainer, { children: [_jsx(ViewsSubmenu, { columns: getHoveredSubmenu(), allCurrentSelected: allCurrentSelected, someCurrentSelected: someCurrentSelected, onSelectAll: handleSelectAll, onReset: handleReset, onColumnToggle: toggleColumnSelection, onNestedItemToggle: toggleNestedItem, anchorEl: submenuAnchorEl, isModified: isSubmenuModified }), _jsx(SaveCustomViewBox, { children: _jsx(Tooltip, Object.assign({ title: "Limit reached. Delete a view to create a new one.", placement: "left", disableHoverListener: !shouldDimNewCustomView }, { children: _jsxs(SaveCustomViewInnerBox, Object.assign({ disabled: shouldDimNewCustomView, onClick: shouldDimNewCustomView ? undefined : handleSaveAsCustomView }, { children: [_jsx(Typography, Object.assign({ sx: { fontSize: 11, color: 'text.secondary' } }, { children: "Save as a custom view" })), _jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 0.5 } }, { children: [_jsx("img", { src: bluePlusIcon, alt: "add", style: { width: 10, height: 10, opacity: shouldDimNewCustomView ? 0.5 : 1 } }), _jsx(Typography, Object.assign({ sx: { fontSize: 10, fontWeight: 600, color: shouldDimNewCustomView ? '#999' : '#1F88D0' } }, { children: "Custom View" }))] }))] })) })) }), _jsxs(ButtonsContainer, { children: [_jsx(Button, Object.assign({ variant: "text", onClick: handleCancel, sx: CancelButtonSx }, { children: "Cancel" })), _jsx(Button, Object.assign({ variant: "contained", onClick: handleOkay, sx: OkayButtonSx }, { children: "Okay" }))] })] }) })))] })));
|
|
177
|
+
onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(false);
|
|
178
|
+
} }, { children: [_jsx(Space, {}), _jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 0.5 } }, { children: [_jsx("img", { src: bluePlusIcon, alt: "icon", style: { opacity: shouldDimNewCustomView ? 0.5 : 1, width: 10, height: 10 } }), _jsx("span", Object.assign({ style: { color: shouldDimNewCustomView ? '#999' : '#1F88D0', fontSize: 11, fontWeight: 500 } }, { children: t('New Custom View') }))] })), _jsx(SpaceAfter, {})] })) }))] }) })), hoveredItem && submenuAnchorEl && currentSubmenuColumns.length > 0 && (_jsx(Menu, Object.assign({ open: Boolean(hoveredItem), anchorEl: submenuAnchorEl, placement: "auto-end", onMouseEnter: handleSubmenuEnter, onMouseLeave: handleSubmenuLeave, modifiers: [
|
|
179
|
+
{ name: 'offset', options: { offset: [-4, 0] } },
|
|
180
|
+
{ name: 'preventOverflow', enabled: true },
|
|
181
|
+
{ name: 'flip', enabled: true },
|
|
182
|
+
] }, { children: _jsxs(SubmenuContainer, { children: [_jsx(ViewsSubmenu, { columns: currentSubmenuColumns, allCurrentSelected: allCurrentSelected, someCurrentSelected: someCurrentSelected, onSelectAll: handleSelectAll, onReset: handleReset, onColumnToggle: toggleColumnSelection, onNestedItemToggle: toggleNestedItem, onReorder: handleReorder, anchorEl: submenuAnchorEl, isModified: hasChanges }), _jsx(SaveCustomViewBox, { children: _jsx(Tooltip, Object.assign({ title: "Limit reached. Delete a view to create a new one.", placement: "left", disableHoverListener: !shouldDimNewCustomView }, { children: _jsxs(SaveCustomViewInnerBox, Object.assign({ disabled: shouldDimNewCustomView, onClick: shouldDimNewCustomView ? undefined : handleSaveAsCustomView }, { children: [_jsx(Typography, Object.assign({ sx: { fontSize: 11, color: 'text.secondary' } }, { children: "Save as a custom view" })), _jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 0.5 } }, { children: [_jsx("img", { src: bluePlusIcon, alt: "add", style: { width: 10, height: 10, opacity: shouldDimNewCustomView ? 0.5 : 1 } }), _jsx(Typography, Object.assign({ sx: { fontSize: 10, fontWeight: 600, color: shouldDimNewCustomView ? '#999' : '#1F88D0' } }, { children: "Custom View" }))] }))] })) })) }), _jsxs(ButtonsContainer, { children: [_jsx(Button, Object.assign({ variant: "text", onClick: handleCancel, sx: CancelButtonSx }, { children: "Cancel" })), _jsx(Button, Object.assign({ variant: "contained", onClick: handleOkay, sx: OkayButtonSx }, { children: "Okay" }))] })] }) })))] })));
|
|
242
183
|
}
|
|
243
184
|
export default React.memo(ViewsDropdown);
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import React from 'react';
|
|
2
|
+
import React, { useMemo } from 'react';
|
|
3
3
|
import { Box, Typography, Divider, Popper } from '@mui/material';
|
|
4
|
+
import { Reorder } from 'framer-motion';
|
|
4
5
|
import { Checkbox, MenuItem } from '../../../index.js';
|
|
5
6
|
import { blackRightArrowIcon } from '../../../../constants/index.js';
|
|
6
|
-
import { getColumnCheckState } from '../utils';
|
|
7
|
+
import { getColumnCheckState, isDateColumn } from '../utils';
|
|
7
8
|
import { ResetHeaderBox, ResetCheckboxSx, ColumnItemsContainer, SubmenuPaper } from '../styles';
|
|
8
9
|
import { useNestedSubmenu } from '../hooks/useNestedSubmenu';
|
|
9
|
-
export const ViewsSubmenu = ({ columns, allCurrentSelected, someCurrentSelected, onSelectAll, onReset, onColumnToggle, onNestedItemToggle, anchorEl, isModified = false, }) => {
|
|
10
|
+
export const ViewsSubmenu = ({ columns, allCurrentSelected, someCurrentSelected, onSelectAll, onReset, onColumnToggle, onNestedItemToggle, onReorder, anchorEl, isModified = false, }) => {
|
|
10
11
|
const { hoveredNestedColumn, nestedSubmenuAnchorEl, openNestedSubmenu, closeNestedSubmenu, cancelNestedClose } = useNestedSubmenu();
|
|
12
|
+
const columnNames = useMemo(() => columns.map((col) => col.name), [columns]);
|
|
11
13
|
return (_jsxs(_Fragment, { children: [_jsxs(ResetHeaderBox, { children: [_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 1 } }, { children: _jsx(Checkbox, { checked: allCurrentSelected, indeterminate: someCurrentSelected, onChange: (e) => {
|
|
12
14
|
e.stopPropagation();
|
|
13
15
|
onSelectAll();
|
|
@@ -28,25 +30,42 @@ export const ViewsSubmenu = ({ columns, allCurrentSelected, someCurrentSelected,
|
|
|
28
30
|
'&:hover': {
|
|
29
31
|
textDecoration: 'underline',
|
|
30
32
|
},
|
|
31
|
-
} }, { children: "Reset" }))] }), _jsx(Divider, {}), _jsx(ColumnItemsContainer, { children: columns.map((column, columnIndex) => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
33
|
+
} }, { children: "Reset" }))] }), _jsx(Divider, {}), _jsx(ColumnItemsContainer, { children: _jsx(Reorder.Group, Object.assign({ axis: "y", onReorder: onReorder, values: columnNames, style: { listStyle: 'none', padding: 0, margin: 0 } }, { children: columns.map((column, columnIndex) => {
|
|
34
|
+
var _a;
|
|
35
|
+
const hasNestedSubmenu = column.menuItems && column.menuItems.length > 0;
|
|
36
|
+
const { checked, indeterminate } = getColumnCheckState(column);
|
|
37
|
+
const isDate = isDateColumn(column.name);
|
|
38
|
+
return (_jsxs(Reorder.Item, Object.assign({ value: column.name, drag: !isDate, dragListener: !isDate, transition: { duration: 0 }, whileDrag: { zIndex: 9999, boxShadow: '0 4px 12px rgba(0,0,0,0.15)', scale: 1.02 }, style: {
|
|
39
|
+
listStyle: 'none',
|
|
40
|
+
margin: 0,
|
|
41
|
+
padding: 0,
|
|
42
|
+
position: 'relative',
|
|
43
|
+
zIndex: 1,
|
|
44
|
+
backgroundColor: '#fff',
|
|
45
|
+
width: '100%',
|
|
46
|
+
willChange: 'transform',
|
|
47
|
+
}, onDragStart: (e) => {
|
|
48
|
+
const target = e.target;
|
|
49
|
+
if (target.closest('[role="checkbox"]') ||
|
|
50
|
+
target.closest('input[type="checkbox"]') ||
|
|
51
|
+
target.closest('[class*="CheckboxWrapper"]')) {
|
|
52
|
+
e.preventDefault();
|
|
53
|
+
}
|
|
54
|
+
} }, { children: [_jsxs(Box, Object.assign({ sx: { position: 'relative' }, onMouseEnter: (e) => hasNestedSubmenu && openNestedSubmenu(column.name, e.currentTarget), onMouseLeave: () => hasNestedSubmenu && closeNestedSubmenu() }, { children: [_jsxs(Box, Object.assign({ sx: {
|
|
55
|
+
display: 'flex',
|
|
56
|
+
alignItems: 'center',
|
|
57
|
+
justifyContent: 'space-between',
|
|
58
|
+
width: '100%',
|
|
59
|
+
} }, { children: [_jsx(MenuItem, Object.assign({ isSelected: hasNestedSubmenu ? checked : column.selected, isIndeterminate: hasNestedSubmenu ? indeterminate : false, onClick: () => onColumnToggle(column.name), sx: { flex: 1, display: 'flex', alignItems: 'center' } }, { children: _jsx("span", { children: column.label || column.name }) })), hasNestedSubmenu && (_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', pr: 1, pointerEvents: 'none' } }, { children: _jsx("img", { src: blackRightArrowIcon, alt: "arrow", style: { height: 12 } }) })))] })), hasNestedSubmenu && (_jsx(Popper, Object.assign({ open: hoveredNestedColumn === column.name, anchorEl: nestedSubmenuAnchorEl, placement: "right-start", sx: { zIndex: 10000 }, modifiers: [
|
|
60
|
+
{
|
|
61
|
+
name: 'offset',
|
|
62
|
+
options: {
|
|
63
|
+
offset: [0, 0],
|
|
64
|
+
},
|
|
45
65
|
},
|
|
46
|
-
},
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}) })] }));
|
|
66
|
+
] }, { children: _jsxs(Box, Object.assign({ onMouseEnter: cancelNestedClose, onMouseLeave: closeNestedSubmenu, sx: { display: 'flex', pl: 0.5 } }, { children: [_jsx(Box, { sx: { width: 8, height: '100%', position: 'absolute', left: -8, top: 0, bottom: 0 } }), _jsx(SubmenuPaper, { children: (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.map((subItem, subItemIndex) => {
|
|
67
|
+
var _a, _b;
|
|
68
|
+
return (_jsxs(React.Fragment, { children: [_jsx(MenuItem, Object.assign({ isSelected: subItem.selected, onClick: () => onNestedItemToggle(column.name, subItem.name) }, { children: subItem.label || subItem.name })), subItemIndex < ((_b = (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1 && _jsx(Divider, {})] }, subItem.name));
|
|
69
|
+
}) })] })) })))] })), columnIndex < columns.length - 1 && _jsx(Divider, {})] }), column.name));
|
|
70
|
+
}) })) })] }));
|
|
52
71
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type MouseEvent } from 'react';
|
|
2
|
-
import type { ColumnViewProps } from '../../../../types/index.js';
|
|
3
|
-
import type { ViewMenuItem, LayoutSection,
|
|
2
|
+
import type { ColumnViewProps, TableMode } from '../../../../types/index.js';
|
|
3
|
+
import type { ViewMenuItem, LayoutSection, TemplateAPIMetadata } from '../types';
|
|
4
4
|
import type { ViewOption } from '../../type';
|
|
5
5
|
export interface UseViewSelectorProps {
|
|
6
|
-
mode:
|
|
6
|
+
mode: TableMode;
|
|
7
7
|
onViewChange?: (selectedView?: ViewMenuItem) => void;
|
|
8
8
|
onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
|
|
9
9
|
onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
|
|
@@ -27,12 +27,11 @@ export interface UseViewSelectorProps {
|
|
|
27
27
|
customViews: ViewMenuItem[];
|
|
28
28
|
defaultColumns: ColumnViewProps[];
|
|
29
29
|
defaultTemplate?: ViewMenuItem;
|
|
30
|
+
allTemplates: ViewMenuItem[];
|
|
30
31
|
setInternalCustomViews: (views: ViewMenuItem[]) => void;
|
|
31
|
-
setInternalTableViews: (views: ColumnViewProps[]) => void;
|
|
32
|
-
setDefaultColumns?: (columns: ColumnViewProps[]) => void;
|
|
33
32
|
apiMetadata?: TemplateAPIMetadata;
|
|
34
33
|
}
|
|
35
|
-
export declare const useViewSelector: ({ mode, onViewChange, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, defaultColumns, defaultTemplate,
|
|
34
|
+
export declare const useViewSelector: ({ mode, onViewChange, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, defaultColumns, defaultTemplate, allTemplates, setInternalCustomViews, apiMetadata, }: UseViewSelectorProps) => {
|
|
36
35
|
anchorViewEl: HTMLDivElement | null;
|
|
37
36
|
defaultViewEl: HTMLDivElement | null;
|
|
38
37
|
setDefaultViewElement: import("react").Dispatch<import("react").SetStateAction<HTMLDivElement | null>>;
|
|
@@ -40,9 +39,10 @@ export declare const useViewSelector: ({ mode, onViewChange, onTableViewsChange,
|
|
|
40
39
|
editingView: ViewMenuItem | null;
|
|
41
40
|
selectedViewInfo: ViewOption;
|
|
42
41
|
shouldUseCurrentState: boolean;
|
|
42
|
+
selectedView: ViewMenuItem | undefined;
|
|
43
|
+
currentViewColumns: ColumnViewProps[];
|
|
43
44
|
handleViewButtonClick: (event: MouseEvent<HTMLDivElement>) => void;
|
|
44
45
|
handleCloseViewDropdown: () => void;
|
|
45
|
-
handleClose: () => void;
|
|
46
46
|
handleSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
|
|
47
47
|
handleOpenCreateDialog: (useCurrentState?: boolean) => void;
|
|
48
48
|
handleOpenEditDialog: (view: ViewMenuItem) => void;
|
|
@@ -56,4 +56,5 @@ export declare const useViewSelector: ({ mode, onViewChange, onTableViewsChange,
|
|
|
56
56
|
handleResetViews: (views: string[]) => void;
|
|
57
57
|
handleTableViewsChange: (newTableViews: ColumnViewProps[]) => void;
|
|
58
58
|
updateSelectedView: (updatedView: ViewMenuItem) => void;
|
|
59
|
+
updateCurrentViewColumns: (columns: ColumnViewProps[]) => void;
|
|
59
60
|
};
|