@tap-payments/os-micro-frontend-shared 0.1.372-test.2-test.3-test.4-test.5-test.6 → 0.1.372-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.
Files changed (48) hide show
  1. package/build/components/Sandbox/style.js +2 -3
  2. package/build/components/TableHeader/FiltersRow.d.ts +1 -1
  3. package/build/components/TableHeader/FiltersRow.js +3 -3
  4. package/build/components/TableHeader/TableHeader.d.ts +1 -1
  5. package/build/components/TableHeader/TableHeader.js +2 -2
  6. package/build/components/TableHeader/TableView/CreateViewDialog.d.ts +1 -1
  7. package/build/components/TableHeader/TableView/CreateViewDialog.js +42 -11
  8. package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +1 -1
  9. package/build/components/TableHeader/TableView/ViewsDropdown.js +91 -93
  10. package/build/components/TableHeader/TableView/ViewsMenu.d.ts +5 -0
  11. package/build/components/TableHeader/TableView/ViewsMenu.js +76 -0
  12. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +46 -23
  13. package/build/components/TableHeader/TableView/constants.d.ts +1 -1
  14. package/build/components/TableHeader/TableView/constants.js +1 -1
  15. package/build/components/TableHeader/TableView/hooks/index.d.ts +1 -1
  16. package/build/components/TableHeader/TableView/hooks/index.js +1 -1
  17. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +15 -5
  18. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.js +2 -9
  19. package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +5 -8
  20. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +50 -94
  21. package/build/components/TableHeader/TableView/hooks/useViewsMenu.d.ts +44 -0
  22. package/build/components/TableHeader/TableView/hooks/useViewsMenu.js +177 -0
  23. package/build/components/TableHeader/TableView/index.d.ts +3 -3
  24. package/build/components/TableHeader/TableView/index.js +2 -4
  25. package/build/components/TableHeader/TableView/styles.js +11 -2
  26. package/build/components/TableHeader/TableView/types.d.ts +34 -32
  27. package/build/components/TableHeader/TableView/utils.d.ts +6 -5
  28. package/build/components/TableHeader/TableView/utils.js +56 -13
  29. package/build/components/TableHeader/index.d.ts +1 -0
  30. package/build/components/TableHeader/type.d.ts +2 -8
  31. package/build/components/Toolbar/Toolbar.js +1 -1
  32. package/build/components/VirtualTables/VirtualTable/VirtualTable.d.ts +1 -1
  33. package/build/components/VirtualTables/VirtualTable/VirtualTable.js +4 -3
  34. package/build/constants/apps.js +2 -0
  35. package/build/constants/assets.d.ts +1 -0
  36. package/build/constants/assets.js +1 -0
  37. package/build/types/reports.d.ts +21 -0
  38. package/build/types/table.d.ts +1 -0
  39. package/build/utils/date.js +5 -3
  40. package/build/utils/index.d.ts +1 -0
  41. package/build/utils/index.js +1 -0
  42. package/build/utils/skeletonColumns.d.ts +4 -0
  43. package/build/utils/skeletonColumns.js +17 -0
  44. package/package.json +2 -2
  45. package/build/components/TableHeader/TableView/ViewSelector.d.ts +0 -5
  46. package/build/components/TableHeader/TableView/ViewSelector.js +0 -44
  47. package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +0 -56
  48. package/build/components/TableHeader/TableView/hooks/useViewSelector.js +0 -122
@@ -11,10 +11,8 @@ export const StyledContainer = styled(Box, {
11
11
  }));
12
12
  export const SandBoxWrapper = styled(Box)(() => ({
13
13
  display: 'flex',
14
- flexDirection: 'row-reverse',
15
- justifyContent: 'flex-start',
14
+ justifyContent: 'flex-end',
16
15
  alignItems: 'center',
17
- gap: '0.25rem',
18
16
  }));
19
17
  export const StyledImage = styled('img')(() => ({
20
18
  height: '0.75rem',
@@ -40,6 +38,7 @@ export const StyledText = styled('p', {
40
38
  color: theme.palette.common.orange,
41
39
  fontSize: '0.62rem',
42
40
  fontWeight: 600,
41
+ paddingRight: '0.25rem',
43
42
  opacity: isContentHovered ? 1 : 0,
44
43
  display: isContentHovered ? 'block' : 'none',
45
44
  transition: 'opacity 0.2s ease-in-out',
@@ -1,2 +1,2 @@
1
1
  import type { FilterRowProps } from './type';
2
- export default function FiltersRow({ date, calendarMode, onDateChange, onCalendarModeSwitch, tableReportsComponent, tableFilterComponent, isReportsButtonVisible, onViewChange, onSearchChange, onToggleViewButtonClick, rightActions, leftActions, setTableViews, tableViews, resetTableViews, onToggleTextButtonClick, calendarGroupBy, onCalendarGroupChange, maxDateRange, searchPlaceholder, isAcceptance, tableMode, timezone, browserTimezone, defaultCountryTimezone, onChangeTimezone, segmentCountries, customViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, templates, lang, }: FilterRowProps): import("react/jsx-runtime").JSX.Element;
2
+ export default function FiltersRow({ date, calendarMode, onDateChange, onCalendarModeSwitch, tableReportsComponent, tableFilterComponent, isReportsButtonVisible, onViewChange, onSearchChange, onToggleViewButtonClick, rightActions, leftActions, setTableViews, tableViews, resetTableViews, onToggleTextButtonClick, calendarGroupBy, onCalendarGroupChange, maxDateRange, searchPlaceholder, isAcceptance, tableMode, timezone, browserTimezone, defaultCountryTimezone, onChangeTimezone, segmentCountries, onCreateCustomView, onEditCustomView, onDeleteCustomView, templates, lang, }: FilterRowProps): import("react/jsx-runtime").JSX.Element;
@@ -4,9 +4,9 @@ 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 { ViewSelector } from './TableView';
7
+ import { ViewsMenu } from './TableView';
8
8
  import TableModeButton from './TableModeButton';
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, customViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, templates, lang, }) {
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);
11
11
  const timezoneCountriesCodes = useMemo(() => segmentCountries.map(({ code }) => code), [segmentCountries]);
12
12
  const tableModeButton = useMemo(() => _jsx(TableModeButton, { tableMode: tableMode, onToggle: onToggleTextButtonClick }), [tableMode, onToggleTextButtonClick]);
@@ -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
- (customViews || onCreateCustomView ? (_jsx(ViewSelector, { onViewChange: onViewChange, setIsViewVisible: setIsViewVisible, tableViews: tableViews, setTableViews: setTableViews, resetTableViews: resetTableViews, customViews: customViews, onCreateCustomView: onCreateCustomView, onEditCustomView: onEditCustomView, onDeleteCustomView: onDeleteCustomView, tableMode: tableMode, onTableViewsChange: onTableViewsChange, initialTableViews: initialTableViews, onCustomViewsChange: onCustomViewsChange, initialCustomViews: initialCustomViews, layoutData: layoutData, templates: templates, lang: lang })) : (_jsx(TableView, { onViewChange: onViewChange, setIsViewVisible: setIsViewVisible, tableViews: tableViews, setTableViews: setTableViews, resetTableViews: resetTableViews }))), rightActions && !isViewVisible && rightActions] }));
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 type { TableHeaderProps } from './type';
2
2
  import { type TableHeaderStatus } from '../../types/index.js';
3
- export declare function TableHeader<IStatus extends TableHeaderStatus | TableHeaderStatus[] = undefined>({ date, status, availableStatuses, showMaximizedView, title, calendarMode, tableReportsComponent, tableFilterComponent, onStatusChange, onViewChange, onDateChange, onCalendarModeSwitch, filteredIds, onCancelFilteredIdsClick, isFilteredIdsShown, cardNumber, leftActions, rightActions, isReportsButtonVisible, onSearchChange, onToggleViewButtonClick, leftComponent, tableViews, setTableViews, resetTableViews, onToggleTextButtonClick, calendarGroupBy, onCalendarGroupChange, children, maxDateRange, isAcceptance, startComponent, searchPlaceholder, tableMode, timezone, browserTimezone, defaultCountryTimezone, onChangeTimezone, segmentCountries, customViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, templates, lang, ...StatusBarProps }: TableHeaderProps<IStatus>): import("react/jsx-runtime").JSX.Element;
3
+ export declare function TableHeader<IStatus extends TableHeaderStatus | TableHeaderStatus[] = undefined>({ date, status, availableStatuses, showMaximizedView, title, calendarMode, tableReportsComponent, tableFilterComponent, onStatusChange, onViewChange, onDateChange, onCalendarModeSwitch, filteredIds, onCancelFilteredIdsClick, isFilteredIdsShown, cardNumber, leftActions, rightActions, isReportsButtonVisible, onSearchChange, onToggleViewButtonClick, leftComponent, tableViews, setTableViews, resetTableViews, onToggleTextButtonClick, calendarGroupBy, onCalendarGroupChange, children, maxDateRange, isAcceptance, startComponent, searchPlaceholder, tableMode, timezone, browserTimezone, defaultCountryTimezone, onChangeTimezone, segmentCountries, onCreateCustomView, onEditCustomView, onDeleteCustomView, templates, lang, ...StatusBarProps }: TableHeaderProps<IStatus>): import("react/jsx-runtime").JSX.Element;
4
4
  declare const _default: typeof TableHeader;
5
5
  export default _default;
@@ -15,8 +15,8 @@ import { FilteredIds, StatusBar, TableHeaderWrapper } from '../index.js';
15
15
  import FiltersRow from './FiltersRow';
16
16
  import { StatusButtonsContainer, TitleContainer, TableHeaderTitle, TableHeaderRow } from './style';
17
17
  export function TableHeader(_a) {
18
- var { date, status, availableStatuses, showMaximizedView, title, calendarMode, tableReportsComponent, tableFilterComponent, onStatusChange, onViewChange, onDateChange, onCalendarModeSwitch, filteredIds, onCancelFilteredIdsClick, isFilteredIdsShown, cardNumber, leftActions, rightActions, isReportsButtonVisible, onSearchChange, onToggleViewButtonClick, leftComponent, tableViews, setTableViews, resetTableViews, onToggleTextButtonClick, calendarGroupBy, onCalendarGroupChange, children, maxDateRange, isAcceptance, startComponent, searchPlaceholder, tableMode, timezone, browserTimezone, defaultCountryTimezone, onChangeTimezone, segmentCountries = [], customViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, templates, lang } = _a, StatusBarProps = __rest(_a, ["date", "status", "availableStatuses", "showMaximizedView", "title", "calendarMode", "tableReportsComponent", "tableFilterComponent", "onStatusChange", "onViewChange", "onDateChange", "onCalendarModeSwitch", "filteredIds", "onCancelFilteredIdsClick", "isFilteredIdsShown", "cardNumber", "leftActions", "rightActions", "isReportsButtonVisible", "onSearchChange", "onToggleViewButtonClick", "leftComponent", "tableViews", "setTableViews", "resetTableViews", "onToggleTextButtonClick", "calendarGroupBy", "onCalendarGroupChange", "children", "maxDateRange", "isAcceptance", "startComponent", "searchPlaceholder", "tableMode", "timezone", "browserTimezone", "defaultCountryTimezone", "onChangeTimezone", "segmentCountries", "customViews", "onCreateCustomView", "onEditCustomView", "onDeleteCustomView", "onTableViewsChange", "initialTableViews", "onCustomViewsChange", "initialCustomViews", "layoutData", "templates", "lang"]);
19
- const filtersRow = (_jsx(FiltersRow, { date: date, calendarMode: calendarMode, onDateChange: onDateChange, onCalendarModeSwitch: onCalendarModeSwitch, tableReportsComponent: tableReportsComponent, tableFilterComponent: tableFilterComponent, onViewChange: onViewChange, leftActions: leftActions, rightActions: rightActions, onSearchChange: onSearchChange, onToggleViewButtonClick: onToggleViewButtonClick, isReportsButtonVisible: isReportsButtonVisible, tableViews: tableViews, setTableViews: setTableViews, resetTableViews: resetTableViews, onToggleTextButtonClick: onToggleTextButtonClick, tableMode: tableMode, onCalendarGroupChange: onCalendarGroupChange, calendarGroupBy: calendarGroupBy, maxDateRange: maxDateRange, isAcceptance: isAcceptance, searchPlaceholder: searchPlaceholder, timezone: timezone, browserTimezone: browserTimezone, defaultCountryTimezone: defaultCountryTimezone, onChangeTimezone: onChangeTimezone, segmentCountries: segmentCountries, customViews: customViews, onCreateCustomView: onCreateCustomView, onEditCustomView: onEditCustomView, onDeleteCustomView: onDeleteCustomView, onTableViewsChange: onTableViewsChange, initialTableViews: initialTableViews, onCustomViewsChange: onCustomViewsChange, initialCustomViews: initialCustomViews, layoutData: layoutData, templates: templates, lang: lang }));
18
+ var { date, status, availableStatuses, showMaximizedView, title, calendarMode, tableReportsComponent, tableFilterComponent, onStatusChange, onViewChange, onDateChange, onCalendarModeSwitch, filteredIds, onCancelFilteredIdsClick, isFilteredIdsShown, cardNumber, leftActions, rightActions, isReportsButtonVisible, onSearchChange, onToggleViewButtonClick, leftComponent, tableViews, setTableViews, resetTableViews, onToggleTextButtonClick, calendarGroupBy, onCalendarGroupChange, children, maxDateRange, isAcceptance, startComponent, searchPlaceholder, tableMode, timezone, browserTimezone, defaultCountryTimezone, onChangeTimezone, segmentCountries = [], onCreateCustomView, onEditCustomView, onDeleteCustomView, templates, lang } = _a, StatusBarProps = __rest(_a, ["date", "status", "availableStatuses", "showMaximizedView", "title", "calendarMode", "tableReportsComponent", "tableFilterComponent", "onStatusChange", "onViewChange", "onDateChange", "onCalendarModeSwitch", "filteredIds", "onCancelFilteredIdsClick", "isFilteredIdsShown", "cardNumber", "leftActions", "rightActions", "isReportsButtonVisible", "onSearchChange", "onToggleViewButtonClick", "leftComponent", "tableViews", "setTableViews", "resetTableViews", "onToggleTextButtonClick", "calendarGroupBy", "onCalendarGroupChange", "children", "maxDateRange", "isAcceptance", "startComponent", "searchPlaceholder", "tableMode", "timezone", "browserTimezone", "defaultCountryTimezone", "onChangeTimezone", "segmentCountries", "onCreateCustomView", "onEditCustomView", "onDeleteCustomView", "templates", "lang"]);
19
+ const filtersRow = (_jsx(FiltersRow, { date: date, calendarMode: calendarMode, onDateChange: onDateChange, onCalendarModeSwitch: onCalendarModeSwitch, tableReportsComponent: tableReportsComponent, tableFilterComponent: tableFilterComponent, onViewChange: onViewChange, leftActions: leftActions, rightActions: rightActions, onSearchChange: onSearchChange, onToggleViewButtonClick: onToggleViewButtonClick, isReportsButtonVisible: isReportsButtonVisible, tableViews: tableViews, setTableViews: setTableViews, resetTableViews: resetTableViews, onToggleTextButtonClick: onToggleTextButtonClick, tableMode: tableMode, onCalendarGroupChange: onCalendarGroupChange, calendarGroupBy: calendarGroupBy, maxDateRange: maxDateRange, isAcceptance: isAcceptance, searchPlaceholder: searchPlaceholder, timezone: timezone, browserTimezone: browserTimezone, defaultCountryTimezone: defaultCountryTimezone, onChangeTimezone: onChangeTimezone, segmentCountries: segmentCountries, onCreateCustomView: onCreateCustomView, onEditCustomView: onEditCustomView, onDeleteCustomView: onDeleteCustomView, templates: templates, lang: lang }));
20
20
  return (_jsxs(TableHeaderWrapper, { children: [showMaximizedView && (_jsxs(TitleContainer, { children: [_jsx("span", { children: !!title && _jsx(TableHeaderTitle, { children: title }) }), filtersRow] }, "TitleContainer")), _jsxs(TableHeaderRow, Object.assign({ as: "section" }, { children: [_jsxs(StatusButtonsContainer, Object.assign({ as: "aside" }, { children: [startComponent, _jsx(StatusBar, Object.assign({ status: status, availableStatuses: availableStatuses, onStatusChange: onStatusChange, isFilteredIdsShown: isFilteredIdsShown }, StatusBarProps)), leftComponent, isFilteredIdsShown && (_jsx(FilteredIds, { cardNumber: cardNumber, Ids: filteredIds, isShown: isFilteredIdsShown, onCancelClick: onCancelFilteredIdsClick }, "FilteredIds"))] })), !showMaximizedView && filtersRow] }), "FiltersWrapper"), children] }));
21
21
  }
22
22
  export default memo(TableHeader);
@@ -1,3 +1,3 @@
1
1
  import type { CreateCustomViewDialogProps } from './types';
2
- declare function CreateViewDialog({ open, onClose, onCreate, availableColumns, isLoading, defaultColumns, editingView, onDelete, tableViews, mode, }: Readonly<CreateCustomViewDialogProps>): import("react/jsx-runtime").JSX.Element | null;
2
+ declare function CreateViewDialog({ open, onClose, onCreate, availableColumns, defaultColumns, editingView, onDelete, tableViews, mode, }: Readonly<CreateCustomViewDialogProps>): import("react/jsx-runtime").JSX.Element | null;
3
3
  export default CreateViewDialog;
@@ -8,10 +8,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
11
+ import React, { useState } from 'react';
11
12
  import { Box, Typography, CircularProgress, Dialog } from '@mui/material';
12
13
  import { useTranslation } from 'react-i18next';
13
14
  import Draggable from 'react-draggable';
14
15
  import { InputBase } from '../../index.js';
16
+ import { useToast } from '../../../hooks/index.js';
15
17
  import Toolbar, { StyledHeaderWrapperStyled } from '../../Toolbar';
16
18
  import { CloseIcon } from '../../ToolbarIcon';
17
19
  import { TEMPLATE_NAME_MAX_LENGTH } from './constants';
@@ -20,8 +22,18 @@ import { DIALOG_WIDTH, DIALOG_HEIGHT } from './constants';
20
22
  import { useCreateViewDialog } from './hooks';
21
23
  import { ColumnList } from './components/ColumnList';
22
24
  import { convertColumnsToLayoutSection } from './utils';
23
- function CreateViewDialog({ open, onClose, onCreate, availableColumns = [], isLoading = false, defaultColumns = [], editingView, onDelete, tableViews = [], mode = 'sheet', }) {
25
+ function CreateViewDialog({ open, onClose, onCreate, availableColumns = [], defaultColumns = [], editingView, onDelete, tableViews = [], mode = 'sheet', }) {
24
26
  const { t } = useTranslation();
27
+ const toast = useToast();
28
+ const [isDeleting, setIsDeleting] = useState(false);
29
+ const [isLoading, setIsLoading] = useState(false);
30
+ // Reset loading state when dialog closes
31
+ React.useEffect(() => {
32
+ if (!open) {
33
+ setIsDeleting(false);
34
+ setIsLoading(false);
35
+ }
36
+ }, [open]);
25
37
  const { templateName, setTemplateName, selectedColumns, columnNames, allSelected, someSelected, isNameValid, hoveredColumn, anchorEl, openSubmenu, closeSubmenu, cancelClose, handleReorder, handleColumnToggle, handleSubItemToggle, handleSelectAll, handleResetToDefault, } = useCreateViewDialog({
26
38
  open,
27
39
  availableColumns,
@@ -30,20 +42,39 @@ function CreateViewDialog({ open, onClose, onCreate, availableColumns = [], isLo
30
42
  tableViews,
31
43
  });
32
44
  const handleCreate = () => __awaiter(this, void 0, void 0, function* () {
33
- if (!isNameValid)
45
+ if (!isNameValid || isLoading || isDeleting)
34
46
  return;
35
- const columnsToCreate = selectedColumns.filter((col) => col.selected);
36
- const layout = convertColumnsToLayoutSection(columnsToCreate, mode);
37
- yield (onCreate === null || onCreate === void 0 ? void 0 : onCreate({ name: templateName, selectedColumns: columnsToCreate, layout }));
38
- onClose();
47
+ setIsLoading(true);
48
+ try {
49
+ const columnsToCreate = selectedColumns.filter((col) => col.selected);
50
+ const layout = convertColumnsToLayoutSection(columnsToCreate, mode);
51
+ yield (onCreate === null || onCreate === void 0 ? void 0 : onCreate({ name: templateName, selectedColumns: columnsToCreate, layout }));
52
+ onClose();
53
+ }
54
+ catch (error) {
55
+ const errorMessage = error instanceof Error ? error.message : 'Failed to save view. Please try again.';
56
+ toast.error(errorMessage);
57
+ }
58
+ finally {
59
+ setIsLoading(false);
60
+ }
39
61
  });
40
62
  const handleDelete = () => __awaiter(this, void 0, void 0, function* () {
41
- if (!editingView)
63
+ if (!editingView || isDeleting || isLoading)
42
64
  return;
43
65
  const templateId = editingView.templateId || editingView.id;
44
- console.log({ templateId });
45
- yield (onDelete === null || onDelete === void 0 ? void 0 : onDelete(templateId));
46
- onClose();
66
+ setIsDeleting(true);
67
+ try {
68
+ yield (onDelete === null || onDelete === void 0 ? void 0 : onDelete(templateId));
69
+ onClose();
70
+ }
71
+ catch (error) {
72
+ const errorMessage = error instanceof Error ? error.message : 'Failed to delete view. Please try again.';
73
+ toast.error(errorMessage);
74
+ }
75
+ finally {
76
+ setIsDeleting(false);
77
+ }
47
78
  });
48
79
  if (!open)
49
80
  return null;
@@ -55,6 +86,6 @@ function CreateViewDialog({ open, onClose, onCreate, availableColumns = [], isLo
55
86
  transition: 'none',
56
87
  },
57
88
  },
58
- } }, { children: [_jsx(StyledHeaderWrapperStyled, Object.assign({ id: "draggable-dialog-title", style: { cursor: 'move' } }, { children: _jsx(Toolbar, { isHovered: true, title: editingView ? 'Edit Custom View' : t('createCustomView') || 'Create Custom View', leftActions: _jsx(CloseIcon, { onClick: onClose }) }) })), _jsxs(DialogContentWrapper, { children: [_jsxs(ScrollableContent, { children: [_jsxs(TitleSection, { children: [_jsxs(Box, { children: [_jsx(Typography, Object.assign({ sx: { fontSize: 24, fontWeight: 700, color: '#9F9F9F', lineHeight: '0.7' } }, { children: "Custom" })), _jsx(Typography, Object.assign({ sx: { fontSize: 24, fontWeight: 700, color: '#20232B', lineHeight: 1.2 } }, { children: "View" }))] }), editingView && _jsx(DeleteButton, Object.assign({ onClick: handleDelete }, { children: "Delete View" }))] }), _jsx(Box, Object.assign({ sx: { mb: 3 } }, { children: _jsx(InputBase, { name: "templateName", label: "Name", value: templateName, onChange: (value) => setTemplateName(value), hasError: false, inputProps: { maxLength: TEMPLATE_NAME_MAX_LENGTH }, required: true }) })), _jsx(ColumnList, { selectedColumns: selectedColumns, columnNames: columnNames, allSelected: allSelected, someSelected: someSelected, hoveredColumn: hoveredColumn, anchorEl: anchorEl, onReorder: handleReorder, onColumnToggle: handleColumnToggle, onSubItemToggle: handleSubItemToggle, onSelectAll: handleSelectAll, onResetToDefault: handleResetToDefault, onSubmenuEnter: openSubmenu, onSubmenuLeave: closeSubmenu, onCancelClose: cancelClose })] }), _jsx(FooterBar, {}), _jsx(CreateButtonWrapper, { children: _jsx(CreateButton, Object.assign({ variant: "contained", onClick: handleCreate, disabled: !isNameValid || isLoading }, { children: isLoading ? (_jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 1 } }, { children: [_jsx(CircularProgress, { size: 14, color: "inherit" }), _jsx("span", { children: editingView ? 'Saving...' : 'Creating...' })] }))) : editingView ? ('Update View') : ('Create View') })) })] })] })) })));
89
+ } }, { children: [_jsx(StyledHeaderWrapperStyled, Object.assign({ id: "draggable-dialog-title", style: { cursor: 'move' } }, { children: _jsx(Toolbar, { isHovered: true, title: editingView ? 'Edit Custom View' : t('createCustomView') || 'Create Custom View', leftActions: _jsx(CloseIcon, { onClick: onClose }) }) })), _jsxs(DialogContentWrapper, { children: [_jsxs(ScrollableContent, { children: [_jsxs(TitleSection, { children: [_jsxs(Box, { children: [_jsx(Typography, Object.assign({ sx: { fontSize: 24, fontWeight: 700, color: '#9F9F9F', lineHeight: '0.7' } }, { children: "Custom" })), _jsx(Typography, Object.assign({ sx: { fontSize: 24, fontWeight: 700, color: '#20232B', lineHeight: 1.2 } }, { children: "View" }))] }), editingView && (_jsx(DeleteButton, Object.assign({ onClick: handleDelete, disabled: isDeleting || isLoading }, { children: isDeleting ? (_jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 1 } }, { children: [_jsx(CircularProgress, { size: 14, color: "inherit" }), _jsx("span", { children: "Deleting..." })] }))) : ('Delete View') })))] }), _jsx(Box, Object.assign({ sx: { mb: 3 } }, { children: _jsx(InputBase, { name: "templateName", label: "Name", value: templateName, onChange: (value) => setTemplateName(value), hasError: false, inputProps: { maxLength: TEMPLATE_NAME_MAX_LENGTH }, required: true }) })), _jsx(ColumnList, { selectedColumns: selectedColumns, columnNames: columnNames, allSelected: allSelected, someSelected: someSelected, hoveredColumn: hoveredColumn, anchorEl: anchorEl, onReorder: handleReorder, onColumnToggle: handleColumnToggle, onSubItemToggle: handleSubItemToggle, onSelectAll: handleSelectAll, onResetToDefault: handleResetToDefault, onSubmenuEnter: openSubmenu, onSubmenuLeave: closeSubmenu, onCancelClose: cancelClose })] }), _jsx(FooterBar, {}), _jsx(CreateButtonWrapper, { children: _jsx(CreateButton, Object.assign({ variant: "contained", onClick: handleCreate, disabled: !isNameValid || isLoading || isDeleting, title: !isNameValid ? `Name is required. Current: "${templateName}"` : undefined }, { children: isLoading ? (_jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 1 } }, { children: [_jsx(CircularProgress, { size: 14, color: "inherit" }), _jsx("span", { children: editingView ? 'Saving...' : 'Creating...' })] }))) : editingView ? ('Update View') : ('Create View') })) })] })] })) })));
59
90
  }
60
91
  export default CreateViewDialog;
@@ -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, }: Readonly<ViewsDropdownProps>): import("react/jsx-runtime").JSX.Element;
3
+ declare function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, 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,138 +8,145 @@ 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, }) {
16
+ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, 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);
20
+ const [isModified, setIsModified] = React.useState(false);
21
+ // Track original columns when submenu opens
24
22
  const { originalColumns, saveOriginalState, clearOriginalState } = useOriginalColumns(defaultColumns);
25
- // Wrapper to restore state when submenu closes without clicking Okay
26
- const handleSubmenuLeave = () => {
27
- // If submenu closes without clicking Okay, restore original state
28
- if (!isOkayClicked && originalColumns.length > 0 && setDefaultColumns) {
29
- const restoredColumns = deepCloneColumns(originalColumns);
30
- setDefaultColumns(restoredColumns);
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
- setIsOkayClicked(false);
36
- forceCloseSubmenu();
37
- };
38
- const { hoveredNestedColumn, nestedSubmenuAnchorEl, openNestedSubmenu, closeNestedSubmenu, cancelNestedClose } = useNestedSubmenu();
39
- // Default templates are merged into built-in Default view, so no need to sort
40
- 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
41
48
  const handleViewClick = (item) => {
42
- if (item.columns)
43
- setViews === null || setViews === void 0 ? void 0 : setViews(item.columns);
44
- // Call onSelect with the full view object
45
- const syntheticEvent = {
46
- currentTarget: anchorEl || document.createElement('div'),
47
- };
48
- // Pass the full view object for custom views, undefined for default view
49
- const viewToPass = item.isCustom ? item : undefined;
50
- onSelect(syntheticEvent, viewToPass);
51
- // Update selected view info with the view object
49
+ forceCloseSubmenu();
50
+ clearOriginalState();
51
+ let viewToPass;
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) });
56
+ }
57
+ else if (item.isCustom) {
58
+ viewToPass = item;
59
+ }
52
60
  setSelectedViewInfo(item, viewToPass);
53
61
  };
62
+ // Toggle column selection
54
63
  const toggleColumnSelection = (columnName) => {
55
64
  if (!setDefaultColumns)
56
65
  return;
57
66
  const newColumns = toggleSingleColumn(defaultColumns, columnName);
58
67
  setDefaultColumns(newColumns);
59
68
  };
69
+ // Toggle nested item
60
70
  const toggleNestedItem = (columnName, subItemName) => {
61
71
  if (!setDefaultColumns)
62
72
  return;
63
73
  const newColumns = toggleSubItem(defaultColumns, columnName, subItemName);
64
74
  setDefaultColumns(newColumns);
65
75
  };
66
- const getHoveredSubmenu = () => {
67
- if (!hoveredItem)
68
- return [];
69
- const item = viewList.find((i) => i.id === hoveredItem);
70
- 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);
71
84
  };
72
- const currentSubmenuColumns = useMemo(() => getHoveredSubmenu(), [hoveredItem, defaultColumns, viewList]);
73
- const originalSubmenuColumns = useMemo(() => {
74
- if (!hoveredItem || originalColumns.length === 0)
75
- return [];
76
- const item = viewList.find((i) => i.id === hoveredItem);
77
- return item ? getSubmenuItems(item, originalColumns) : [];
78
- }, [hoveredItem, originalColumns, viewList]);
79
- const isSubmenuModified = useMemo(() => {
80
- if (originalSubmenuColumns.length === 0)
81
- return true;
82
- return !areColumnsEqual(currentSubmenuColumns, originalSubmenuColumns);
83
- }, [currentSubmenuColumns, originalSubmenuColumns]);
84
- const allCurrentSelected = useMemo(() => areAllCurrentColumnsSelected(currentSubmenuColumns), [currentSubmenuColumns]);
85
- const someCurrentSelected = useMemo(() => areSomeCurrentColumnsSelected(currentSubmenuColumns, allCurrentSelected), [currentSubmenuColumns, allCurrentSelected]);
85
+ // Select all columns
86
86
  const handleSelectAll = () => {
87
87
  if (!setDefaultColumns)
88
88
  return;
89
- const shouldSelectAll = !allCurrentSelected;
90
- const newColumns = toggleAllCurrentColumns(defaultColumns, shouldSelectAll);
89
+ const newColumns = toggleAllCurrentColumns(defaultColumns, !allCurrentSelected);
91
90
  setDefaultColumns(newColumns);
92
91
  };
92
+ // Reset to original
93
93
  const handleReset = () => {
94
94
  if (!setDefaultColumns || originalColumns.length === 0)
95
95
  return;
96
- const restoredColumns = deepCloneColumns(originalColumns);
97
- setDefaultColumns([...restoredColumns]);
98
- setIsDefaultModified(false);
99
- setBaselineColumns([]);
96
+ setDefaultColumns(deepCloneColumns(originalColumns));
100
97
  };
101
- const handleSaveAsCustomView = (e) => {
102
- e.stopPropagation();
103
- 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
+ }
104
109
  clearOriginalState();
105
110
  forceCloseSubmenu();
106
- onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(true); // Use current state when saving from submenu
107
111
  };
112
+ // Cancel changes
108
113
  const handleCancel = () => {
109
114
  if (setDefaultColumns && originalColumns.length > 0) {
110
- const restoredColumns = deepCloneColumns(originalColumns);
111
- setDefaultColumns(restoredColumns);
112
- // Reset modified state when canceling
113
- setIsDefaultModified(false);
114
- setBaselineColumns([]);
115
+ setDefaultColumns(deepCloneColumns(originalColumns));
115
116
  }
116
117
  clearOriginalState();
117
- setIsOkayClicked(false);
118
118
  forceCloseSubmenu();
119
119
  };
120
+ // Save changes
120
121
  const handleOkay = () => {
121
- if (originalColumns.length > 0) {
122
- const hasChanges = !areColumnsEqual(defaultColumns, originalColumns);
123
- setIsDefaultModified(hasChanges);
122
+ // Check if we're viewing the default template
123
+ 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;
124
+ console.log('🔵 handleOkay:', {
125
+ isViewingDefault,
126
+ hasChanges,
127
+ selectedViewInfoId: selectedViewInfo.id,
128
+ defaultTemplateId: defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.id,
129
+ columnsCount: defaultColumns.length,
130
+ });
131
+ if (isViewingDefault && defaultTemplate && defaultColumns.length > 0) {
124
132
  if (hasChanges) {
125
- setBaselineColumns(deepCloneColumns(originalColumns));
133
+ onSaveDefaultColumns === null || onSaveDefaultColumns === void 0 ? void 0 : onSaveDefaultColumns(defaultColumns);
134
+ setIsModified(true);
126
135
  }
127
- else {
128
- setBaselineColumns([]);
136
+ if (updateSelectedView) {
137
+ const updatedView = Object.assign(Object.assign({}, defaultTemplate), { id: defaultTemplate.id + '', submenu: [...deepCloneColumns(defaultColumns)], columns: [...defaultColumns.map((col) => col.name)] });
138
+ updateSelectedView(updatedView);
129
139
  }
130
140
  }
131
- setIsOkayClicked(true); // Mark that Okay was clicked so we don't restore on close
132
141
  clearOriginalState();
133
142
  forceCloseSubmenu();
134
143
  };
135
- const handleOpenSubmenu = (itemId, element) => {
136
- saveOriginalState();
137
- setIsOkayClicked(false); // Reset flag when opening submenu
138
- if (itemId === 'default' && baselineColumns.length > 0) {
139
- const hasChanges = !areColumnsEqual(defaultColumns, baselineColumns);
140
- setIsDefaultModified(hasChanges);
141
- }
142
- handleMenuItemHover(itemId, element);
144
+ // Save as custom view
145
+ const handleSaveAsCustomView = (e) => {
146
+ e.stopPropagation();
147
+ clearOriginalState();
148
+ forceCloseSubmenu();
149
+ onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(true);
143
150
  };
144
151
  const shouldDimNewCustomView = customViews.length >= MAX_CUSTOM_VIEWS;
145
152
  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: {
@@ -162,16 +169,8 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
162
169
  else if (hasSubmenu(item, defaultColumns)) {
163
170
  handleMenuItemLeave();
164
171
  }
165
- }, onClick: () => handleViewClick(item), sx: {
166
- position: 'relative',
167
- cursor: 'pointer',
168
- pr: 1.5,
169
- } }, { children: [item.id === selectedViewInfo.id ? (_jsx("img", { style: {
170
- width: 15,
171
- height: 15,
172
- }, 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) => {
172
+ }, 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) => {
173
173
  e.stopPropagation();
174
- onSelect(e);
175
174
  onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(item);
176
175
  } })), !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: {
177
176
  border: 'none',
@@ -184,8 +183,7 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
184
183
  }
185
184
  e.stopPropagation();
186
185
  handleSubmenuLeave();
187
- onSelect(e);
188
- onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(false); // Don't use current state for "New Custom View"
189
- } }, { 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: "right-start", onMouseEnter: handleSubmenuEnter, onMouseLeave: handleSubmenuLeave }, { 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" }))] })] }) })))] })));
186
+ onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(false);
187
+ } }, { 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 }, { 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" }))] })] }) })))] })));
190
188
  }
191
189
  export default React.memo(ViewsDropdown);
@@ -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;
@@ -0,0 +1,76 @@
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
+ };
10
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
11
+ import { memo, useCallback, useState } from 'react';
12
+ import { useTranslation } from 'react-i18next';
13
+ import ClickAwayListener from '@mui/material/ClickAwayListener';
14
+ import { Icon, StyledButton } from '../../index.js';
15
+ import { viewIcon } from '../../../constants/index.js';
16
+ import ViewsDropdown from './ViewsDropdown';
17
+ import CreateViewDialog from './CreateViewDialog';
18
+ import { ViewWrapper } from './styles';
19
+ import { useViewsManager } from './hooks';
20
+ import { useViewsMenu } from './hooks/useViewsMenu';
21
+ function ViewsMenu({ onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode = 'default', templates, lang = 'en', }) {
22
+ var _a;
23
+ const { t } = useTranslation();
24
+ const [modifiedModes, setModifiedModes] = useState({});
25
+ const { defaultColumns, updateDefaultColumns, defaultTemplate, customViews, allTemplates } = useViewsManager({
26
+ tableMode,
27
+ templates,
28
+ lang,
29
+ });
30
+ const handleSaveDefaultColumns = useCallback((columns) => __awaiter(this, void 0, void 0, function* () {
31
+ if (!(defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.templateId))
32
+ return;
33
+ updateDefaultColumns(columns);
34
+ const layout = {
35
+ code: tableMode === 'sheet' ? 'Sheet' : 'Advanced',
36
+ columns: columns.map((col, idx) => {
37
+ var _a, _b;
38
+ return ({
39
+ code: col.name,
40
+ name: [{ text: typeof col.label === 'string' ? col.label : col.name, lang }],
41
+ order: idx + 1,
42
+ default: (_a = col.selected) !== null && _a !== void 0 ? _a : false,
43
+ fields: (_b = col.menuItems) === null || _b === void 0 ? void 0 : _b.map((item) => {
44
+ var _a;
45
+ return ({
46
+ code: item.name,
47
+ name: [{ text: typeof item.label === 'string' ? item.label : item.name, lang }],
48
+ order: null,
49
+ default: (_a = item.selected) !== null && _a !== void 0 ? _a : false,
50
+ });
51
+ }),
52
+ });
53
+ }),
54
+ };
55
+ yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(defaultTemplate.templateId, {
56
+ name: defaultTemplate.label,
57
+ selectedColumns: columns,
58
+ layout,
59
+ }));
60
+ setModifiedModes((current) => (Object.assign(Object.assign({}, current), { [tableMode]: true })));
61
+ }), [defaultTemplate, tableMode, lang, onEditCustomView, updateDefaultColumns]);
62
+ const { anchorEl, isCreateDialogOpen, editingView, selectedViewInfo, shouldUseCurrentState, currentViewColumns, handleViewButtonClick, handleCloseViewDropdown, handleSelectedViewInfo, handleOpenCreateDialog, handleOpenEditDialog, handleCloseCreateDialog, handleSaveView, handleDeleteView, updateSelectedView, } = useViewsMenu({
63
+ mode: tableMode,
64
+ onViewChange,
65
+ onCreateCustomView,
66
+ onEditCustomView,
67
+ onDeleteCustomView,
68
+ defaultColumns,
69
+ defaultTemplate,
70
+ allTemplates,
71
+ });
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 })] }));
75
+ }
76
+ export default memo(ViewsMenu);