@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.
@@ -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
- // Map tableMode to viewMode: 'sheet' 'sheet', 'default' → 'advanced'
15
- const mode = tableMode === 'sheet' ? 'sheet' : 'advanced';
16
- const { defaultColumns, setDefaultColumns, internalTableViews, setInternalTableViews, internalCustomViews, setInternalCustomViews, defaultTemplate, } = useViewsManager({
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
- const { anchorViewEl, defaultViewEl, setDefaultViewElement, isCreateDialogOpen, editingView, selectedViewInfo, shouldUseCurrentState, handleViewButtonClick, handleCloseViewDropdown, handleSelectedViewInfo, handleOpenCreateDialog, handleOpenEditDialog, handleCloseCreateDialog, handleSaveView, handleDeleteView, handleResetViews, handleTableViewsChange, updateSelectedView, } = useViewSelector({
24
- mode,
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, selectedView) => {
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, tableViews: tableViews, setTableViews: handleTableViewsChange, onCreateCustomView: handleOpenCreateDialog, customViews: customViews, onEditCustomView: handleOpenEditDialog, defaultColumns: defaultColumns, setDefaultColumns: setDefaultColumns, updateSelectedView: updateSelectedView })] })) })), _jsx(CreateViewDialog, { open: isCreateDialogOpen, onClose: handleCloseCreateDialog, availableColumns: defaultColumns, defaultColumns: defaultColumns, onCreate: handleSaveView, editingView: editingView, onDelete: handleDeleteView, tableViews: shouldUseCurrentState ? defaultColumns : undefined, mode: mode })] }));
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, useNestedSubmenu } from './hooks';
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 [isDefaultModified, setIsDefaultModified] = React.useState(false);
22
- const [baselineColumns, setBaselineColumns] = React.useState([]);
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
- // Reset modification state when defaultColumns change (e.g., mode change)
27
- React.useEffect(() => {
28
- // Check if defaultColumns actually changed (new reference or different content)
29
- if (prevDefaultColumnsRef.current !== defaultColumns) {
30
- prevDefaultColumnsRef.current = defaultColumns;
31
- setIsDefaultModified(false);
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
- }, [defaultColumns, clearOriginalState]);
36
- // Wrapper to restore state when submenu closes without clicking Okay
37
- const handleSubmenuLeave = () => {
38
- // If submenu closes without clicking Okay, restore original state
39
- if (!isOkayClicked && originalColumns.length > 0 && setDefaultColumns) {
40
- const restoredColumns = deepCloneColumns(originalColumns);
41
- setDefaultColumns(restoredColumns);
42
- setIsDefaultModified(false);
43
- setBaselineColumns([]);
44
- clearOriginalState();
45
- }
46
- setIsOkayClicked(false);
47
- forceCloseSubmenu();
48
- };
49
- const { hoveredNestedColumn, nestedSubmenuAnchorEl, openNestedSubmenu, closeNestedSubmenu, cancelNestedClose } = useNestedSubmenu();
50
- // Default templates are merged into built-in Default view, so no need to sort
51
- const viewList = [...defaultViewList, ...customViews];
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.id === 'default') {
66
- // Create a complete default view with current default columns
67
- viewToPass = {
68
- id: 'default',
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
- const getHoveredSubmenu = () => {
96
- if (!hoveredItem)
97
- return [];
98
- const item = viewList.find((i) => i.id === hoveredItem);
99
- return item ? getSubmenuItems(item, defaultColumns) : [];
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
- const currentSubmenuColumns = useMemo(() => getHoveredSubmenu(), [hoveredItem, defaultColumns, viewList]);
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 shouldSelectAll = !allCurrentSelected;
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
- const restoredColumns = deepCloneColumns(originalColumns);
126
- setDefaultColumns([...restoredColumns]);
127
- setIsDefaultModified(false);
128
- setBaselineColumns([]);
96
+ setDefaultColumns(deepCloneColumns(originalColumns));
129
97
  };
130
- const handleSaveAsCustomView = (e) => {
131
- e.stopPropagation();
132
- setIsOkayClicked(true); // Mark that a valid action was taken, don't restore on close
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
- const restoredColumns = deepCloneColumns(originalColumns);
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
- if (originalColumns.length > 0) {
151
- const hasChanges = !areColumnsEqual(defaultColumns, originalColumns);
152
- setIsDefaultModified(hasChanges);
153
- if (hasChanges) {
154
- setBaselineColumns(deepCloneColumns(originalColumns));
155
- }
156
- else {
157
- setBaselineColumns([]);
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
- const handleOpenSubmenu = (itemId, element) => {
175
- saveOriginalState();
176
- setIsOkayClicked(false); // Reset flag when opening submenu
177
- if (itemId === 'default' && baselineColumns.length > 0) {
178
- const hasChanges = !areColumnsEqual(defaultColumns, baselineColumns);
179
- setIsDefaultModified(hasChanges);
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); // Don't use current state for "New Custom View"
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 && getHoveredSubmenu().length > 0 && (_jsx(Menu, Object.assign({ open: Boolean(hoveredItem), anchorEl: submenuAnchorEl, placement: "auto-end", onMouseEnter: handleSubmenuEnter, onMouseLeave: handleSubmenuLeave, modifiers: [
227
- {
228
- name: 'offset',
229
- options: {
230
- offset: [-4, 0],
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
- var _a;
33
- const hasNestedSubmenu = column.menuItems && column.menuItems.length > 0;
34
- const { checked, indeterminate } = getColumnCheckState(column);
35
- return (_jsxs(React.Fragment, { 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: {
36
- display: 'flex',
37
- alignItems: 'center',
38
- justifyContent: 'space-between',
39
- width: '100%',
40
- } }, { 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: [
41
- {
42
- name: 'offset',
43
- options: {
44
- offset: [0, 0],
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
- ] }, { 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) => {
48
- var _a, _b;
49
- 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));
50
- }) })] })) })))] })), columnIndex < columns.length - 1 && _jsx(Divider, {})] }, column.name));
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, ViewMode, TemplateAPIMetadata } from '../types';
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: ViewMode;
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, setInternalCustomViews, setInternalTableViews, setDefaultColumns, apiMetadata, }: UseViewSelectorProps) => {
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
  };