@tap-payments/os-micro-frontend-shared 0.1.372-test.1 → 0.1.372-test.2-test.3

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 (32) hide show
  1. package/build/components/TableHeader/FiltersRow.d.ts +1 -1
  2. package/build/components/TableHeader/FiltersRow.js +3 -3
  3. package/build/components/TableHeader/TableHeader.d.ts +1 -1
  4. package/build/components/TableHeader/TableHeader.js +2 -2
  5. package/build/components/TableHeader/TableView/ViewSelector.d.ts +5 -0
  6. package/build/components/TableHeader/TableView/ViewSelector.js +46 -0
  7. package/build/components/TableHeader/TableView/ViewsDropdown.js +29 -16
  8. package/build/components/TableHeader/TableView/components/ColumnList.js +4 -11
  9. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +4 -11
  10. package/build/components/TableHeader/TableView/hooks/index.d.ts +6 -0
  11. package/build/components/TableHeader/TableView/hooks/index.js +6 -0
  12. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +1 -1
  13. package/build/components/TableHeader/TableView/hooks/useDialogPosition.d.ts +8 -0
  14. package/build/components/TableHeader/TableView/hooks/useDialogPosition.js +16 -0
  15. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.d.ts +6 -0
  16. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.js +18 -0
  17. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.d.ts +8 -0
  18. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.js +43 -0
  19. package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +54 -0
  20. package/build/components/TableHeader/TableView/hooks/useViewSelector.js +110 -0
  21. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +55 -8
  22. package/build/components/TableHeader/TableView/index.d.ts +4 -4
  23. package/build/components/TableHeader/TableView/index.js +3 -3
  24. package/build/components/TableHeader/TableView/types.d.ts +2 -2
  25. package/build/components/TableHeader/TableView/utils.d.ts +5 -1
  26. package/build/components/TableHeader/TableView/utils.js +20 -9
  27. package/build/components/TableHeader/type.d.ts +0 -1
  28. package/package.json +2 -2
  29. package/build/components/TableHeader/TableView/ViewsManager.d.ts +0 -5
  30. package/build/components/TableHeader/TableView/ViewsManager.js +0 -123
  31. package/build/components/TableHeader/TableView/hooks.d.ts +0 -28
  32. package/build/components/TableHeader/TableView/hooks.js +0 -81
@@ -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, viewMode, 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, customViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, 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 { ViewsManager } from './TableView';
7
+ import { ViewSelector } 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, viewMode, 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, customViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, 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(ViewsManager, { onViewChange: onViewChange, setIsViewVisible: setIsViewVisible, tableViews: tableViews, setTableViews: setTableViews, resetTableViews: resetTableViews, customViews: customViews, onCreateCustomView: onCreateCustomView, onEditCustomView: onEditCustomView, onDeleteCustomView: onDeleteCustomView, mode: viewMode, 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
+ (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] }));
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, viewMode, 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, customViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, 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, viewMode, 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", "viewMode", "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, viewMode: viewMode, 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 = [], 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 }));
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);
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import type { ViewSelectorProps } from './types';
3
+ declare function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode, onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, templates, lang, }: ViewSelectorProps): import("react/jsx-runtime").JSX.Element;
4
+ declare const _default: import("react").MemoExoticComponent<typeof ViewSelector>;
5
+ export default _default;
@@ -0,0 +1,46 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { memo } from 'react';
3
+ import { useTranslation } from 'react-i18next';
4
+ import ClickAwayListener from '@mui/material/ClickAwayListener';
5
+ import { Icon, StyledButton } from '../../index.js';
6
+ import { viewIcon } from '../../../constants/index.js';
7
+ import ViewsDropdown from './ViewsDropdown';
8
+ import CreateViewDialog from './CreateViewDialog';
9
+ import { ViewWrapper } from './styles';
10
+ import { useViewsManager } from './hooks';
11
+ import { useViewSelector } from './hooks/useViewSelector';
12
+ function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode = 'default', onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, templates, lang = 'en', }) {
13
+ 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 } = useViewsManager({
17
+ mode,
18
+ layoutData,
19
+ initialTableViews,
20
+ initialCustomViews,
21
+ templates,
22
+ lang,
23
+ });
24
+ const tableViews = externalTableViews !== null && externalTableViews !== void 0 ? externalTableViews : internalTableViews;
25
+ const customViews = externalCustomViews !== null && externalCustomViews !== void 0 ? externalCustomViews : internalCustomViews;
26
+ const { anchorViewEl, defaultViewEl, setDefaultViewElement, isCreateDialogOpen, editingView, selectedViewInfo, shouldUseCurrentState, handleViewButtonClick, handleCloseViewDropdown, handleSelectedViewInfo, handleOpenCreateDialog, handleOpenEditDialog, handleCloseCreateDialog, handleSaveView, handleDeleteView, handleResetViews, handleTableViewsChange, } = useViewSelector({
27
+ mode,
28
+ layoutData,
29
+ onTableViewsChange,
30
+ onCustomViewsChange,
31
+ onCreateCustomView,
32
+ onEditCustomView,
33
+ onDeleteCustomView,
34
+ resetTableViews,
35
+ setTableViews,
36
+ tableViews,
37
+ customViews,
38
+ setInternalCustomViews,
39
+ setInternalTableViews,
40
+ });
41
+ 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) => {
42
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange();
43
+ setDefaultViewElement(defaultViewEl ? null : e.currentTarget);
44
+ }, setViews: handleResetViews, tableViews: tableViews, setTableViews: handleTableViewsChange, onCreateCustomView: handleOpenCreateDialog, customViews: customViews, onEditCustomView: handleOpenEditDialog, defaultColumns: defaultColumns, setDefaultColumns: setDefaultColumns })] })) })), _jsx(CreateViewDialog, { open: isCreateDialogOpen, onClose: handleCloseCreateDialog, availableColumns: defaultColumns, defaultColumns: defaultColumns, onCreate: handleSaveView, editingView: editingView, onDelete: handleDeleteView, tableViews: shouldUseCurrentState ? defaultColumns : undefined, mode: mode })] }));
45
+ }
46
+ export default memo(ViewSelector);
@@ -16,23 +16,28 @@ import { ListStyled, DropdownStyled, MenuItem as StyledMenuItem, Space, SpaceAft
16
16
  import { deepCloneColumns, toggleSingleColumn, toggleSubItem, getSubmenuItems, hasSubmenu, areAllCurrentColumnsSelected, areSomeCurrentColumnsSelected, toggleAllCurrentColumns, areColumnsEqual, } from './utils';
17
17
  function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect, setViews, anchorEl, onCreateCustomView, customViews = [], onEditCustomView, defaultColumns = [], setDefaultColumns, }) {
18
18
  const { t } = useTranslation();
19
- const { hoveredColumn: hoveredItem, anchorEl: submenuAnchorEl, openSubmenu: handleMenuItemHover, closeSubmenu: handleMenuItemLeave, cancelClose: handleSubmenuEnter, forceClose: handleSubmenuLeave, } = useSubmenuHover();
19
+ const { hoveredColumn: hoveredItem, anchorEl: submenuAnchorEl, openSubmenu: handleMenuItemHover, closeSubmenu: handleMenuItemLeave, cancelClose: handleSubmenuEnter, forceClose: forceCloseSubmenu, } = useSubmenuHover();
20
20
  const [hoveredCustomView, setHoveredCustomView] = React.useState(null);
21
21
  const [isDefaultModified, setIsDefaultModified] = React.useState(false);
22
22
  const [baselineColumns, setBaselineColumns] = React.useState([]);
23
+ const [isOkayClicked, setIsOkayClicked] = React.useState(false);
23
24
  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();
34
+ }
35
+ setIsOkayClicked(false);
36
+ forceCloseSubmenu();
37
+ };
24
38
  const { hoveredNestedColumn, nestedSubmenuAnchorEl, openNestedSubmenu, closeNestedSubmenu, cancelNestedClose } = useNestedSubmenu();
25
- // Sort custom views: default first, then others
26
- const sortedCustomViews = useMemo(() => {
27
- return [...customViews].sort((a, b) => {
28
- if (a.default && !b.default)
29
- return -1;
30
- if (!a.default && b.default)
31
- return 1;
32
- return 0;
33
- });
34
- }, [customViews]);
35
- const viewList = [...defaultViewList, ...sortedCustomViews];
39
+ // Default templates are merged into built-in Default view, so no need to sort
40
+ const viewList = [...defaultViewList, ...customViews];
36
41
  const toggleColumnSelection = (columnName) => {
37
42
  if (!setDefaultColumns)
38
43
  return;
@@ -82,16 +87,22 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
82
87
  };
83
88
  const handleSaveAsCustomView = (e) => {
84
89
  e.stopPropagation();
85
- handleSubmenuLeave();
90
+ setIsOkayClicked(true); // Mark that a valid action was taken, don't restore on close
91
+ clearOriginalState();
92
+ forceCloseSubmenu();
86
93
  onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(true); // Use current state when saving from submenu
87
94
  };
88
95
  const handleCancel = () => {
89
96
  if (setDefaultColumns && originalColumns.length > 0) {
90
97
  const restoredColumns = deepCloneColumns(originalColumns);
91
98
  setDefaultColumns(restoredColumns);
99
+ // Reset modified state when canceling
100
+ setIsDefaultModified(false);
101
+ setBaselineColumns([]);
92
102
  }
93
103
  clearOriginalState();
94
- handleSubmenuLeave();
104
+ setIsOkayClicked(false);
105
+ forceCloseSubmenu();
95
106
  };
96
107
  const handleOkay = () => {
97
108
  if (originalColumns.length > 0) {
@@ -104,11 +115,13 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
104
115
  setBaselineColumns([]);
105
116
  }
106
117
  }
118
+ setIsOkayClicked(true); // Mark that Okay was clicked so we don't restore on close
107
119
  clearOriginalState();
108
- handleSubmenuLeave();
120
+ forceCloseSubmenu();
109
121
  };
110
122
  const handleOpenSubmenu = (itemId, element) => {
111
123
  saveOriginalState();
124
+ setIsOkayClicked(false); // Reset flag when opening submenu
112
125
  if (itemId === 'default' && baselineColumns.length > 0) {
113
126
  const hasChanges = !areColumnsEqual(defaultColumns, baselineColumns);
114
127
  setIsDefaultModified(hasChanges);
@@ -147,7 +160,7 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
147
160
  } }, { children: [item.id === selectedViewInfo.id ? (_jsx("img", { style: {
148
161
  width: 15,
149
162
  height: 15,
150
- }, 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 && item.default && _jsx("span", Object.assign({ style: Object.assign(Object.assign({}, ModifiedTextSx), { color: '#1F88D0', marginLeft: 4 }) }, { children: "(Default)" }))] })), item.isCustom && hoveredCustomView === item.id && (_jsx("img", { src: editIcon, alt: "edit", style: { width: 12, height: 12, cursor: 'pointer' }, onClick: (e) => {
163
+ }, 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) => {
151
164
  e.stopPropagation();
152
165
  onSelect(e);
153
166
  onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(item);
@@ -46,16 +46,9 @@ export const ColumnList = ({ selectedColumns, columnNames, allSelected, someSele
46
46
  onColumnToggle(column.name);
47
47
  }, onClick: (e) => {
48
48
  e.stopPropagation();
49
- }, disabled: isDate, size: "small", sx: checkboxSx }) })), _jsx(Typography, Object.assign({ sx: { flex: 1, fontSize: 13, fontWeight: 400, color: 'text.primary', ml: 1 } }, { children: column.label || column.name })), hasSubmenu && (_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', ml: 1, flexShrink: 0 } }, { children: _jsx("img", { src: rightArrow, alt: "arrow", style: { width: 12, height: 12 } }) })))] })), hasSubmenu && (_jsx(Popper, Object.assign({ open: hoveredColumn === column.name, anchorEl: anchorEl, placement: "right-start", modifiers: [
50
- {
51
- name: 'offset',
52
- options: {
53
- offset: [0, 0],
54
- },
55
- },
56
- ], sx: { zIndex: 10000 } }, { children: _jsx(Box, Object.assign({ onMouseEnter: onCancelClose, onMouseLeave: onSubmenuLeave, sx: { display: 'flex' } }, { children: _jsx(SubmenuPaper, { children: (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.map((subItem, subItemIndex) => {
57
- var _a, _b;
58
- return (_jsxs(React.Fragment, { children: [_jsx(MenuItem, Object.assign({ isSelected: subItem.selected, onClick: () => onSubItemToggle(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));
59
- }) }) })) })))] }), column.name));
49
+ }, disabled: isDate, size: "small", sx: checkboxSx }) })), _jsx(Typography, Object.assign({ sx: { flex: 1, fontSize: 13, fontWeight: 400, color: 'text.primary', ml: 1 } }, { children: column.label || column.name })), hasSubmenu && (_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', ml: 1, flexShrink: 0 } }, { children: _jsx("img", { src: rightArrow, alt: "arrow", style: { width: 12, height: 12 } }) })))] })), hasSubmenu && (_jsx(Popper, Object.assign({ open: hoveredColumn === column.name, anchorEl: anchorEl, placement: "right-start", sx: { zIndex: 10000 } }, { children: _jsxs(Box, Object.assign({ onMouseEnter: onCancelClose, onMouseLeave: onSubmenuLeave, 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) => {
50
+ var _a, _b;
51
+ return (_jsxs(React.Fragment, { children: [_jsx(MenuItem, Object.assign({ isSelected: subItem.selected, onClick: () => onSubItemToggle(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));
52
+ }) })] })) })))] }), column.name));
60
53
  }) })) }))] }));
61
54
  };
@@ -37,16 +37,9 @@ export const ViewsSubmenu = ({ columns, allCurrentSelected, someCurrentSelected,
37
37
  alignItems: 'center',
38
38
  justifyContent: 'space-between',
39
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", modifiers: [
41
- {
42
- name: 'offset',
43
- options: {
44
- offset: [0, 0],
45
- },
46
- },
47
- ], sx: { zIndex: 10000 } }, { children: _jsx(Box, Object.assign({ onMouseEnter: cancelNestedClose, onMouseLeave: closeNestedSubmenu, sx: { display: 'flex' } }, { children: _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));
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 } }, { 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) => {
41
+ var _a, _b;
42
+ 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));
43
+ }) })] })) })))] })), columnIndex < columns.length - 1 && _jsx(Divider, {})] }, column.name));
51
44
  }) })] }));
52
45
  };
@@ -1,3 +1,9 @@
1
1
  export { useSubMenu } from './useSubMenu';
2
2
  export { useViewColumns } from './useViewColumns';
3
3
  export { useColumnItem } from './useColumnItem';
4
+ export { useViewsManager } from './useViewsManager';
5
+ export { useViewSelector } from './useViewSelector';
6
+ export { useSubmenuHover } from './useSubmenuHover';
7
+ export { useOriginalColumns } from './useOriginalColumns';
8
+ export { useNestedSubmenu } from './useNestedSubmenu';
9
+ export { useCreateViewDialog } from './useCreateViewDialog';
@@ -1,3 +1,9 @@
1
1
  export { useSubMenu } from './useSubMenu';
2
2
  export { useViewColumns } from './useViewColumns';
3
3
  export { useColumnItem } from './useColumnItem';
4
+ export { useViewsManager } from './useViewsManager';
5
+ export { useViewSelector } from './useViewSelector';
6
+ export { useSubmenuHover } from './useSubmenuHover';
7
+ export { useOriginalColumns } from './useOriginalColumns';
8
+ export { useNestedSubmenu } from './useNestedSubmenu';
9
+ export { useCreateViewDialog } from './useCreateViewDialog';
@@ -1,7 +1,7 @@
1
1
  import { useState, useEffect, useMemo, useRef } from 'react';
2
2
  import { DATE_COLUMN_CONFIG, TEMPLATE_NAME_MAX_LENGTH } from '../constants';
3
3
  import { initializeEditingColumns, initializeCreateColumns, initializeCreateColumnsWithCurrentState, resetColumnsToDefault, toggleColumn, toggleSubItem, toggleAllColumns, areAllColumnsSelected, areSomeColumnsSelected, isValidTemplateName, } from '../utils';
4
- import { useSubmenuHover } from '../hooks';
4
+ import { useSubmenuHover } from './useSubmenuHover';
5
5
  export const useCreateViewDialog = ({ open, availableColumns, defaultColumns, editingView, tableViews = [] }) => {
6
6
  const [templateName, setTemplateName] = useState('');
7
7
  const [selectedColumns, setSelectedColumns] = useState([]);
@@ -0,0 +1,8 @@
1
+ export declare const useDialogPosition: (dialogWidth: number, dialogHeight: number) => {
2
+ position: {
3
+ x: number;
4
+ y: number;
5
+ };
6
+ resetPosition: () => void;
7
+ updatePosition: (x: number, y: number) => void;
8
+ };
@@ -0,0 +1,16 @@
1
+ import { useState, useCallback } from 'react';
2
+ export const useDialogPosition = (dialogWidth, dialogHeight) => {
3
+ const [position, setPosition] = useState({ x: 0, y: 0 });
4
+ const resetPosition = useCallback(() => {
5
+ const centerX = window.innerWidth / 2 - dialogWidth / 2;
6
+ const centerY = window.innerHeight / 2 - dialogHeight / 2;
7
+ setPosition({
8
+ x: Math.max(0, centerX),
9
+ y: Math.max(0, centerY),
10
+ });
11
+ }, [dialogWidth, dialogHeight]);
12
+ const updatePosition = useCallback((x, y) => {
13
+ setPosition({ x, y });
14
+ }, []);
15
+ return { position, resetPosition, updatePosition };
16
+ };
@@ -0,0 +1,6 @@
1
+ import type { ColumnViewProps } from '../../../../types/index.js';
2
+ export declare const useOriginalColumns: (defaultColumns: ColumnViewProps[]) => {
3
+ originalColumns: ColumnViewProps[];
4
+ saveOriginalState: () => void;
5
+ clearOriginalState: () => void;
6
+ };
@@ -0,0 +1,18 @@
1
+ import { useState, useCallback } from 'react';
2
+ export const useOriginalColumns = (defaultColumns) => {
3
+ const [originalColumns, setOriginalColumns] = useState([]);
4
+ const saveOriginalState = useCallback(() => {
5
+ setOriginalColumns(defaultColumns.map((col) => {
6
+ var _a;
7
+ return (Object.assign(Object.assign({}, col), { selected: col.selected, menuItems: (_a = col.menuItems) === null || _a === void 0 ? void 0 : _a.map((item) => (Object.assign(Object.assign({}, item), { selected: item.selected }))) }));
8
+ }));
9
+ }, [defaultColumns]);
10
+ const clearOriginalState = useCallback(() => {
11
+ setOriginalColumns([]);
12
+ }, []);
13
+ return {
14
+ originalColumns,
15
+ saveOriginalState,
16
+ clearOriginalState,
17
+ };
18
+ };
@@ -0,0 +1,8 @@
1
+ export declare const useSubmenuHover: () => {
2
+ hoveredColumn: string | null;
3
+ anchorEl: HTMLElement | null;
4
+ openSubmenu: (columnName: string, element: HTMLElement) => void;
5
+ closeSubmenu: () => void;
6
+ cancelClose: () => void;
7
+ forceClose: () => void;
8
+ };
@@ -0,0 +1,43 @@
1
+ import { useState, useRef, useCallback } from 'react';
2
+ import { SUBMENU_CLOSE_DELAY } from '../constants';
3
+ export const useSubmenuHover = () => {
4
+ const [hoveredColumn, setHoveredColumn] = useState(null);
5
+ const [anchorEl, setAnchorEl] = useState(null);
6
+ const closeTimeoutRef = useRef(null);
7
+ const openSubmenu = useCallback((columnName, element) => {
8
+ if (closeTimeoutRef.current) {
9
+ clearTimeout(closeTimeoutRef.current);
10
+ closeTimeoutRef.current = null;
11
+ }
12
+ setHoveredColumn(columnName);
13
+ setAnchorEl(element);
14
+ }, []);
15
+ const closeSubmenu = useCallback(() => {
16
+ closeTimeoutRef.current = setTimeout(() => {
17
+ setHoveredColumn(null);
18
+ setAnchorEl(null);
19
+ }, SUBMENU_CLOSE_DELAY);
20
+ }, []);
21
+ const cancelClose = useCallback(() => {
22
+ if (closeTimeoutRef.current) {
23
+ clearTimeout(closeTimeoutRef.current);
24
+ closeTimeoutRef.current = null;
25
+ }
26
+ }, []);
27
+ const forceClose = useCallback(() => {
28
+ if (closeTimeoutRef.current) {
29
+ clearTimeout(closeTimeoutRef.current);
30
+ closeTimeoutRef.current = null;
31
+ }
32
+ setHoveredColumn(null);
33
+ setAnchorEl(null);
34
+ }, []);
35
+ return {
36
+ hoveredColumn,
37
+ anchorEl,
38
+ openSubmenu,
39
+ closeSubmenu,
40
+ cancelClose,
41
+ forceClose,
42
+ };
43
+ };
@@ -0,0 +1,54 @@
1
+ import { type MouseEvent } from 'react';
2
+ import type { ColumnViewProps } from '../../../../types/index.js';
3
+ import type { ViewMenuItem, LayoutSection, ViewMode } from '../types';
4
+ import type { ViewOption } from '../../type';
5
+ export interface UseViewSelectorProps {
6
+ mode: ViewMode;
7
+ layoutData?: LayoutSection[];
8
+ onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
9
+ onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
10
+ onCreateCustomView?: (data: {
11
+ name: string;
12
+ selectedColumns: ColumnViewProps[];
13
+ layout: LayoutSection;
14
+ }) => Promise<void>;
15
+ onEditCustomView?: (viewId: string, data: {
16
+ name: string;
17
+ selectedColumns: ColumnViewProps[];
18
+ layout: LayoutSection;
19
+ }) => Promise<void>;
20
+ onDeleteCustomView?: (viewId: string) => Promise<void>;
21
+ resetTableViews?: (view: {
22
+ id: string;
23
+ label: string;
24
+ }) => void;
25
+ setTableViews?: (columns: ColumnViewProps[]) => void;
26
+ tableViews: ColumnViewProps[];
27
+ customViews: ViewMenuItem[];
28
+ setInternalCustomViews: (views: ViewMenuItem[]) => void;
29
+ setInternalTableViews: (views: ColumnViewProps[]) => void;
30
+ }
31
+ export declare const useViewSelector: ({ mode, layoutData, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, setInternalCustomViews, setInternalTableViews, }: UseViewSelectorProps) => {
32
+ anchorViewEl: HTMLDivElement | null;
33
+ defaultViewEl: HTMLDivElement | null;
34
+ setDefaultViewElement: import("react").Dispatch<import("react").SetStateAction<HTMLDivElement | null>>;
35
+ isCreateDialogOpen: boolean;
36
+ editingView: ViewMenuItem | null;
37
+ selectedViewInfo: ViewOption;
38
+ shouldUseCurrentState: boolean;
39
+ handleViewButtonClick: (event: MouseEvent<HTMLDivElement>) => void;
40
+ handleCloseViewDropdown: () => void;
41
+ handleClose: () => void;
42
+ handleSelectedViewInfo: (selected: ViewOption) => void;
43
+ handleOpenCreateDialog: (useCurrentState?: boolean) => void;
44
+ handleOpenEditDialog: (view: ViewMenuItem) => void;
45
+ handleCloseCreateDialog: () => void;
46
+ handleSaveView: (data: {
47
+ name: string;
48
+ selectedColumns: ColumnViewProps[];
49
+ layout: LayoutSection;
50
+ }) => Promise<void>;
51
+ handleDeleteView: (viewId: string) => Promise<void>;
52
+ handleResetViews: (views: string[]) => void;
53
+ handleTableViewsChange: (newTableViews: ColumnViewProps[]) => void;
54
+ };
@@ -0,0 +1,110 @@
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 { useState, useCallback } from 'react';
11
+ import { getColumnsByMode, createCustomViewMenuItem } from '../utils';
12
+ export const useViewSelector = ({ mode, layoutData, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, setInternalCustomViews, setInternalTableViews, }) => {
13
+ const [anchorViewEl, setAnchorViewEl] = useState(null);
14
+ const [defaultViewEl, setDefaultViewElement] = useState(null);
15
+ const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);
16
+ const [editingView, setEditingView] = useState(null);
17
+ const [selectedViewInfo, setSelectedViewInfo] = useState({ id: 'default', label: 'Default' });
18
+ const [shouldUseCurrentState, setShouldUseCurrentState] = useState(false);
19
+ const handleTableViewsChange = useCallback((newTableViews) => {
20
+ const setTableViewsState = setTableViews !== null && setTableViews !== void 0 ? setTableViews : setInternalTableViews;
21
+ setTableViewsState(newTableViews);
22
+ onTableViewsChange === null || onTableViewsChange === void 0 ? void 0 : onTableViewsChange(newTableViews);
23
+ }, [setTableViews, setInternalTableViews, onTableViewsChange]);
24
+ const handleCustomViewsChange = useCallback((newCustomViews) => {
25
+ setInternalCustomViews(newCustomViews);
26
+ onCustomViewsChange === null || onCustomViewsChange === void 0 ? void 0 : onCustomViewsChange(newCustomViews);
27
+ }, [setInternalCustomViews, onCustomViewsChange]);
28
+ const handleViewButtonClick = useCallback((event) => {
29
+ setAnchorViewEl(event.currentTarget);
30
+ setDefaultViewElement(event.currentTarget);
31
+ }, []);
32
+ const handleCloseViewDropdown = useCallback(() => {
33
+ setDefaultViewElement(null);
34
+ }, []);
35
+ const handleClose = useCallback(() => {
36
+ setAnchorViewEl(null);
37
+ setDefaultViewElement(null);
38
+ setSelectedViewInfo({ label: 'Default', id: 'default' });
39
+ }, []);
40
+ const handleSelectedViewInfo = useCallback((selected) => {
41
+ setSelectedViewInfo(selected);
42
+ handleCloseViewDropdown();
43
+ }, [handleCloseViewDropdown]);
44
+ const handleOpenCreateDialog = useCallback((useCurrentState = false) => {
45
+ setEditingView(null);
46
+ setShouldUseCurrentState(useCurrentState);
47
+ setIsCreateDialogOpen(true);
48
+ setDefaultViewElement(null);
49
+ }, []);
50
+ const handleOpenEditDialog = useCallback((view) => {
51
+ setEditingView(view);
52
+ setShouldUseCurrentState(true);
53
+ setIsCreateDialogOpen(true);
54
+ }, []);
55
+ const handleCloseCreateDialog = useCallback(() => {
56
+ setIsCreateDialogOpen(false);
57
+ setEditingView(null);
58
+ setShouldUseCurrentState(false);
59
+ }, []);
60
+ const handleSaveView = useCallback((data) => __awaiter(void 0, void 0, void 0, function* () {
61
+ if (editingView) {
62
+ const updatedViews = customViews.map((view) => view.id === editingView.id
63
+ ? Object.assign(Object.assign({}, view), { label: data.name, columns: data.selectedColumns.map((col) => col.name), submenu: data.selectedColumns }) : view);
64
+ handleCustomViewsChange(updatedViews);
65
+ yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(editingView.id, data));
66
+ }
67
+ else {
68
+ const newView = createCustomViewMenuItem(data.name, data.selectedColumns);
69
+ const updatedViews = [...customViews, newView];
70
+ handleCustomViewsChange(updatedViews);
71
+ yield (onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(data));
72
+ }
73
+ }), [editingView, customViews, handleCustomViewsChange, onEditCustomView, onCreateCustomView]);
74
+ const handleDeleteView = useCallback((viewId) => __awaiter(void 0, void 0, void 0, function* () {
75
+ const updatedViews = customViews.filter((view) => view.id !== viewId);
76
+ handleCustomViewsChange(updatedViews);
77
+ yield (onDeleteCustomView === null || onDeleteCustomView === void 0 ? void 0 : onDeleteCustomView(viewId));
78
+ }), [customViews, handleCustomViewsChange, onDeleteCustomView]);
79
+ const handleResetViews = useCallback((views) => {
80
+ if (resetTableViews) {
81
+ resetTableViews({ id: views[0], label: views[0] });
82
+ }
83
+ else {
84
+ const resetColumns = getColumnsByMode(mode, layoutData);
85
+ handleTableViewsChange(resetColumns);
86
+ }
87
+ }, [resetTableViews, mode, layoutData, handleTableViewsChange]);
88
+ return {
89
+ // State
90
+ anchorViewEl,
91
+ defaultViewEl,
92
+ setDefaultViewElement,
93
+ isCreateDialogOpen,
94
+ editingView,
95
+ selectedViewInfo,
96
+ shouldUseCurrentState,
97
+ // Handlers
98
+ handleViewButtonClick,
99
+ handleCloseViewDropdown,
100
+ handleClose,
101
+ handleSelectedViewInfo,
102
+ handleOpenCreateDialog,
103
+ handleOpenEditDialog,
104
+ handleCloseCreateDialog,
105
+ handleSaveView,
106
+ handleDeleteView,
107
+ handleResetViews,
108
+ handleTableViewsChange,
109
+ };
110
+ };
@@ -6,23 +6,70 @@ export const useViewsManager = ({ mode, layoutData, initialTableViews, initialCu
6
6
  if (!templates)
7
7
  return null;
8
8
  const templatesArray = Array.isArray(templates) ? templates : templates.templates;
9
+ const { customViews, defaultTemplateColumns } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
10
+ // Use default template columns if available, otherwise use layoutData from all templates
11
+ const effectiveLayoutData = defaultTemplateColumns
12
+ ? [
13
+ {
14
+ code: mode === 'advanced' ? 'Advanced' : 'Sheet',
15
+ columns: defaultTemplateColumns.map((col, idx) => {
16
+ var _a, _b;
17
+ return ({
18
+ code: col.name,
19
+ name: [{ text: typeof col.label === 'string' ? col.label : col.name, lang }],
20
+ order: idx + 1,
21
+ default: (_a = col.selected) !== null && _a !== void 0 ? _a : false,
22
+ fields: (_b = col.menuItems) === null || _b === void 0 ? void 0 : _b.map((item) => {
23
+ var _a;
24
+ return ({
25
+ code: item.name,
26
+ name: [{ text: typeof item.label === 'string' ? item.label : item.name, lang: '' }],
27
+ default: (_a = item.selected) !== null && _a !== void 0 ? _a : false,
28
+ });
29
+ }),
30
+ });
31
+ }),
32
+ },
33
+ ]
34
+ : getLayoutDataFromTemplates(templatesArray);
9
35
  return {
10
- customViews: transformTemplatesToViewMenuItems(templatesArray, mode, lang),
11
- layoutData: getLayoutDataFromTemplates(templatesArray),
36
+ customViews,
37
+ layoutData: effectiveLayoutData,
38
+ defaultTemplateColumns,
12
39
  };
13
40
  }, [templates, mode, lang]);
14
41
  // Use transformed templates or provided props
15
42
  const effectiveLayoutData = (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.layoutData) || layoutData;
16
43
  const effectiveCustomViews = (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews) || initialCustomViews;
17
- const [defaultColumns, setDefaultColumns] = useState(() => getColumnsByMode(mode, effectiveLayoutData));
18
- const [internalTableViews, setInternalTableViews] = useState(initialTableViews || getColumnsByMode(mode, effectiveLayoutData) || []);
44
+ const [defaultColumns, setDefaultColumns] = useState(() => {
45
+ // If we have default template columns from templates, use them; otherwise use layoutData
46
+ if (templates) {
47
+ const templatesArray = Array.isArray(templates) ? templates : templates.templates;
48
+ const { defaultTemplateColumns } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
49
+ if (defaultTemplateColumns) {
50
+ return defaultTemplateColumns;
51
+ }
52
+ }
53
+ return getColumnsByMode(mode, layoutData || []);
54
+ });
55
+ const [internalTableViews, setInternalTableViews] = useState(initialTableViews || defaultColumns || []);
19
56
  const [internalCustomViews, setInternalCustomViews] = useState(effectiveCustomViews || []);
20
57
  useEffect(() => {
21
- setDefaultColumns(getColumnsByMode(mode, effectiveLayoutData));
22
- if (!initialTableViews && effectiveLayoutData) {
23
- setInternalTableViews(getColumnsByMode(mode, effectiveLayoutData));
58
+ // If we have default template columns, use them; otherwise use layoutData
59
+ if (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplateColumns) {
60
+ setDefaultColumns(transformedTemplates.defaultTemplateColumns);
61
+ if (!initialTableViews) {
62
+ setInternalTableViews(transformedTemplates.defaultTemplateColumns);
63
+ }
64
+ }
65
+ else {
66
+ const columns = getColumnsByMode(mode, effectiveLayoutData);
67
+ setDefaultColumns(columns);
68
+ if (!initialTableViews && effectiveLayoutData) {
69
+ setInternalTableViews(columns);
70
+ }
24
71
  }
25
- }, [mode, effectiveLayoutData, initialTableViews]);
72
+ }, [mode, effectiveLayoutData, initialTableViews, transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplateColumns]);
26
73
  // Update custom views when templates change
27
74
  useEffect(() => {
28
75
  if (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews) {
@@ -2,11 +2,11 @@ export { default } from './TableView';
2
2
  export { default as TableView } from './TableView';
3
3
  export { default as DefaultViews } from './DefaultViews';
4
4
  export { default as CustomViews } from './CustomViews';
5
- export { default as ViewsManager } from './ViewsManager';
5
+ export { default as ViewSelector } from './ViewSelector';
6
6
  export { default as ViewsDropdown } from './ViewsDropdown';
7
7
  export { default as CreateViewDialog } from './CreateViewDialog';
8
- export type { ViewMenuItem, ViewMode, CreateCustomViewDialogProps, LayoutSection, ColumnItem, FieldItem, TemplateResponse, TemplatesListResponse } from './types';
9
- export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState } from './utils';
10
- export { useSubmenuHover, useDialogPosition } from './hooks';
8
+ export type { ViewMenuItem, ViewMode, CreateCustomViewDialogProps, LayoutSection, ColumnItem, FieldItem, TemplateResponse, TemplatesListResponse, } from './types';
9
+ export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState, } from './utils';
10
+ export { useSubmenuHover } from './hooks';
11
11
  export { DIALOG_WIDTH, DIALOG_HEIGHT, MAX_CUSTOM_VIEWS, TEMPLATE_NAME_MAX_LENGTH } from './constants';
12
12
  export { defaultViewList, advancedColumns, sheetColumns } from './data';
@@ -2,10 +2,10 @@ export { default } from './TableView';
2
2
  export { default as TableView } from './TableView';
3
3
  export { default as DefaultViews } from './DefaultViews';
4
4
  export { default as CustomViews } from './CustomViews';
5
- export { default as ViewsManager } from './ViewsManager';
5
+ export { default as ViewSelector } from './ViewSelector';
6
6
  export { default as ViewsDropdown } from './ViewsDropdown';
7
7
  export { default as CreateViewDialog } from './CreateViewDialog';
8
- export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState } from './utils';
9
- export { useSubmenuHover, useDialogPosition } from './hooks';
8
+ export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState, } from './utils';
9
+ export { useSubmenuHover } from './hooks';
10
10
  export { DIALOG_WIDTH, DIALOG_HEIGHT, MAX_CUSTOM_VIEWS, TEMPLATE_NAME_MAX_LENGTH } from './constants';
11
11
  export { defaultViewList, advancedColumns, sheetColumns } from './data';
@@ -84,7 +84,7 @@ export interface ColumnCheckState {
84
84
  checked: boolean;
85
85
  indeterminate: boolean;
86
86
  }
87
- export interface ViewsManagerProps {
87
+ export interface ViewSelectorProps {
88
88
  onViewChange?: TableHeaderProps['onViewChange'];
89
89
  setIsViewVisible: (visible: boolean) => void;
90
90
  setTableViews?: TableHeaderProps['setTableViews'];
@@ -102,7 +102,7 @@ export interface ViewsManagerProps {
102
102
  layout: LayoutSection;
103
103
  }) => Promise<void>;
104
104
  onDeleteCustomView?: (viewId: string) => Promise<void>;
105
- mode?: ViewMode;
105
+ tableMode?: import('../../../types/index.js').TableMode;
106
106
  onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
107
107
  initialTableViews?: ColumnViewProps[];
108
108
  onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
@@ -22,13 +22,17 @@ export declare const setViewAsDefault: (views: ViewMenuItem[], viewId: string) =
22
22
  /**
23
23
  * Transform API templates response to ViewMenuItem array
24
24
  * Filters templates by mode and only shows the section matching the current mode
25
+ * Separates default templates (to be merged into built-in Default view) from custom views
25
26
  */
26
27
  export declare const transformTemplatesToViewMenuItems: (templates: Array<{
27
28
  id: string;
28
29
  name: string;
29
30
  default: boolean;
30
31
  layout: LayoutSection[];
31
- }>, mode?: ViewMode, lang?: string) => ViewMenuItem[];
32
+ }>, mode?: ViewMode, lang?: string) => {
33
+ customViews: ViewMenuItem[];
34
+ defaultTemplateColumns?: ColumnViewProps[] | undefined;
35
+ };
32
36
  /**
33
37
  * Convert ColumnViewProps back to LayoutSection format for API requests
34
38
  */
@@ -93,21 +93,32 @@ export const setViewAsDefault = (views, viewId) => {
93
93
  /**
94
94
  * Transform API templates response to ViewMenuItem array
95
95
  * Filters templates by mode and only shows the section matching the current mode
96
+ * Separates default templates (to be merged into built-in Default view) from custom views
96
97
  */
97
98
  export const transformTemplatesToViewMenuItems = (templates, mode = 'sheet', lang = 'en') => {
98
- return templates.map((template) => {
99
+ const customViews = [];
100
+ let defaultTemplateColumns;
101
+ templates.forEach((template) => {
99
102
  // Get columns for the specified mode
100
103
  const section = template.layout.find((s) => s.code.toLowerCase() === mode.toLowerCase());
101
104
  const columns = section ? transformLayoutToColumns([section], lang) : [];
102
- return {
103
- id: template.id,
104
- label: template.name,
105
- isCustom: true,
106
- default: template.default,
107
- columns: columns.map((col) => col.name),
108
- submenu: columns,
109
- };
105
+ if (template.default) {
106
+ // Store default template columns to merge into built-in Default view
107
+ defaultTemplateColumns = columns;
108
+ }
109
+ else {
110
+ // Add non-default templates as custom views
111
+ customViews.push({
112
+ id: template.id,
113
+ label: template.name,
114
+ isCustom: true,
115
+ default: false,
116
+ columns: columns.map((col) => col.name),
117
+ submenu: columns,
118
+ });
119
+ }
110
120
  });
121
+ return { customViews, defaultTemplateColumns };
111
122
  };
112
123
  /**
113
124
  * Convert ColumnViewProps back to LayoutSection format for API requests
@@ -57,7 +57,6 @@ export interface TableHeaderProps<IStatus extends TableHeaderStatus | TableHeade
57
57
  layout: LayoutSection;
58
58
  }) => Promise<void>;
59
59
  onDeleteCustomView?: (viewId: string) => Promise<void>;
60
- viewMode?: 'advanced' | 'sheet';
61
60
  onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
62
61
  initialTableViews?: ColumnViewProps[];
63
62
  onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@tap-payments/os-micro-frontend-shared",
3
3
  "description": "Shared components and utilities for Tap Payments micro frontends",
4
- "version": "0.1.372-test.1",
5
- "testVersion": 1,
4
+ "version": "0.1.372-test.2-test.3",
5
+ "testVersion": 3,
6
6
  "type": "module",
7
7
  "main": "build/index.js",
8
8
  "module": "build/index.js",
@@ -1,5 +0,0 @@
1
- /// <reference types="react" />
2
- import type { ViewsManagerProps } from './types';
3
- declare function ViewsManager({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, mode, onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, templates, lang, }: Readonly<ViewsManagerProps>): import("react/jsx-runtime").JSX.Element;
4
- declare const _default: import("react").MemoExoticComponent<typeof ViewsManager>;
5
- export default _default;
@@ -1,123 +0,0 @@
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, useState, useEffect } 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 { getColumnsByMode, createCustomViewMenuItem } from './utils';
19
- import { ViewWrapper } from './styles';
20
- import { useViewsManager } from './hooks';
21
- function ViewsManager({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, mode = 'sheet', onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, templates, lang = 'en', }) {
22
- const { t } = useTranslation();
23
- const [anchorViewEl, setAnchorViewEl] = useState(null);
24
- const [defaultViewEl, setDefaultViewElement] = useState(null);
25
- const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);
26
- const [editingView, setEditingView] = useState(null);
27
- const [selectedViewInfo, setSelectedViewInfo] = useState({ id: 'default', label: 'Default' });
28
- const [shouldUseCurrentState, setShouldUseCurrentState] = useState(false);
29
- const { defaultColumns, setDefaultColumns, internalTableViews, setInternalTableViews, internalCustomViews, setInternalCustomViews } = useViewsManager({
30
- mode,
31
- layoutData,
32
- initialTableViews,
33
- initialCustomViews,
34
- templates,
35
- lang,
36
- });
37
- const tableViews = externalTableViews !== null && externalTableViews !== void 0 ? externalTableViews : internalTableViews;
38
- const setTableViewsState = setTableViews !== null && setTableViews !== void 0 ? setTableViews : setInternalTableViews;
39
- const handleTableViewsChange = (newTableViews) => {
40
- setTableViewsState(newTableViews);
41
- onTableViewsChange === null || onTableViewsChange === void 0 ? void 0 : onTableViewsChange(newTableViews);
42
- };
43
- const customViews = externalCustomViews !== null && externalCustomViews !== void 0 ? externalCustomViews : internalCustomViews;
44
- // Auto-select default template when custom views are loaded
45
- useEffect(() => {
46
- if (customViews.length > 0) {
47
- const defaultView = customViews.find((view) => view.default);
48
- if (defaultView && selectedViewInfo.id === 'default') {
49
- setSelectedViewInfo(defaultView);
50
- if (defaultView.submenu) {
51
- handleTableViewsChange(defaultView.submenu);
52
- }
53
- }
54
- }
55
- // eslint-disable-next-line react-hooks/exhaustive-deps
56
- }, [customViews]);
57
- const handleCustomViewsChange = (newCustomViews) => {
58
- setInternalCustomViews(newCustomViews);
59
- onCustomViewsChange === null || onCustomViewsChange === void 0 ? void 0 : onCustomViewsChange(newCustomViews);
60
- };
61
- const handleViewButtonClick = (event) => {
62
- onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange();
63
- setAnchorViewEl(event.currentTarget);
64
- setDefaultViewElement(event.currentTarget);
65
- };
66
- const handleCloseViewDropdown = () => {
67
- setDefaultViewElement(null);
68
- };
69
- const handleClose = () => {
70
- setAnchorViewEl(null);
71
- setDefaultViewElement(null);
72
- setSelectedViewInfo({ label: 'Default', id: 'default' });
73
- };
74
- const handleSelectedViewInfo = (selected) => {
75
- setSelectedViewInfo(selected);
76
- handleCloseViewDropdown();
77
- };
78
- const handleOpenCreateDialog = (useCurrentState = false) => {
79
- setEditingView(null);
80
- setShouldUseCurrentState(useCurrentState);
81
- setIsCreateDialogOpen(true);
82
- setDefaultViewElement(null);
83
- };
84
- const handleOpenEditDialog = (view) => {
85
- setEditingView(view);
86
- setShouldUseCurrentState(true);
87
- setIsCreateDialogOpen(true);
88
- };
89
- const handleCloseCreateDialog = () => {
90
- setIsCreateDialogOpen(false);
91
- setEditingView(null);
92
- setShouldUseCurrentState(false);
93
- };
94
- const handleSaveView = (data) => __awaiter(this, void 0, void 0, function* () {
95
- if (editingView) {
96
- const updatedViews = customViews.map((view) => view.id === editingView.id
97
- ? Object.assign(Object.assign({}, view), { label: data.name, columns: data.selectedColumns.map((col) => col.name), submenu: data.selectedColumns }) : view);
98
- handleCustomViewsChange(updatedViews);
99
- yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(editingView.id, data));
100
- }
101
- else {
102
- const newView = createCustomViewMenuItem(data.name, data.selectedColumns);
103
- const updatedViews = [...customViews, newView];
104
- handleCustomViewsChange(updatedViews);
105
- yield (onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(data));
106
- }
107
- });
108
- const handleDeleteView = (viewId) => __awaiter(this, void 0, void 0, function* () {
109
- const updatedViews = customViews.filter((view) => view.id !== viewId);
110
- handleCustomViewsChange(updatedViews);
111
- yield (onDeleteCustomView === null || onDeleteCustomView === void 0 ? void 0 : onDeleteCustomView(viewId));
112
- });
113
- return (_jsxs(_Fragment, { children: [_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCloseViewDropdown }, { children: _jsxs(ViewWrapper, Object.assign({ sx: { width: '32px' }, "data-testid": "ViewsManager" }, { children: [_jsx(StyledButton, Object.assign({ title: t('tableView'), "data-testid": "ViewsManager_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) => setDefaultViewElement(defaultViewEl ? null : e.currentTarget), setViews: (views) => {
114
- if (resetTableViews) {
115
- resetTableViews({ id: views[0], label: views[0] });
116
- }
117
- else {
118
- const resetColumns = getColumnsByMode(mode, layoutData);
119
- handleTableViewsChange(resetColumns);
120
- }
121
- }, tableViews: tableViews, setTableViews: handleTableViewsChange, onCreateCustomView: (useCurrentState) => handleOpenCreateDialog(useCurrentState), customViews: customViews, onEditCustomView: handleOpenEditDialog, defaultColumns: defaultColumns, setDefaultColumns: setDefaultColumns })] })) })), _jsx(CreateViewDialog, { open: isCreateDialogOpen, onClose: handleCloseCreateDialog, availableColumns: defaultColumns, defaultColumns: defaultColumns, onCreate: handleSaveView, editingView: editingView, onDelete: handleDeleteView, tableViews: shouldUseCurrentState ? defaultColumns : undefined, mode: mode })] }));
122
- }
123
- export default memo(ViewsManager);
@@ -1,28 +0,0 @@
1
- import type { ColumnViewProps } from '../../../types/index.js';
2
- export { useSubMenu } from './hooks/useSubMenu';
3
- export { useViewColumns } from './hooks/useViewColumns';
4
- export { useColumnItem } from './hooks/useColumnItem';
5
- export { useCreateViewDialog } from './hooks/useCreateViewDialog';
6
- export { useNestedSubmenu } from './hooks/useNestedSubmenu';
7
- export { useViewsManager } from './hooks/useViewsManager';
8
- export declare const useSubmenuHover: () => {
9
- hoveredColumn: string | null;
10
- anchorEl: HTMLElement | null;
11
- openSubmenu: (columnName: string, element: HTMLElement) => void;
12
- closeSubmenu: () => void;
13
- cancelClose: () => void;
14
- forceClose: () => void;
15
- };
16
- export declare const useDialogPosition: (dialogWidth: number, dialogHeight: number) => {
17
- position: {
18
- x: number;
19
- y: number;
20
- };
21
- resetPosition: () => void;
22
- updatePosition: (x: number, y: number) => void;
23
- };
24
- export declare const useOriginalColumns: (defaultColumns: ColumnViewProps[]) => {
25
- originalColumns: ColumnViewProps[];
26
- saveOriginalState: () => void;
27
- clearOriginalState: () => void;
28
- };
@@ -1,81 +0,0 @@
1
- import { useState, useRef, useCallback } from 'react';
2
- import { SUBMENU_CLOSE_DELAY } from './constants';
3
- export { useSubMenu } from './hooks/useSubMenu';
4
- export { useViewColumns } from './hooks/useViewColumns';
5
- export { useColumnItem } from './hooks/useColumnItem';
6
- export { useCreateViewDialog } from './hooks/useCreateViewDialog';
7
- export { useNestedSubmenu } from './hooks/useNestedSubmenu';
8
- export { useViewsManager } from './hooks/useViewsManager';
9
- export const useSubmenuHover = () => {
10
- const [hoveredColumn, setHoveredColumn] = useState(null);
11
- const [anchorEl, setAnchorEl] = useState(null);
12
- const closeTimeoutRef = useRef(null);
13
- const openSubmenu = useCallback((columnName, element) => {
14
- if (closeTimeoutRef.current) {
15
- clearTimeout(closeTimeoutRef.current);
16
- closeTimeoutRef.current = null;
17
- }
18
- setHoveredColumn(columnName);
19
- setAnchorEl(element);
20
- }, []);
21
- const closeSubmenu = useCallback(() => {
22
- closeTimeoutRef.current = setTimeout(() => {
23
- setHoveredColumn(null);
24
- setAnchorEl(null);
25
- }, SUBMENU_CLOSE_DELAY);
26
- }, []);
27
- const cancelClose = useCallback(() => {
28
- if (closeTimeoutRef.current) {
29
- clearTimeout(closeTimeoutRef.current);
30
- closeTimeoutRef.current = null;
31
- }
32
- }, []);
33
- const forceClose = useCallback(() => {
34
- if (closeTimeoutRef.current) {
35
- clearTimeout(closeTimeoutRef.current);
36
- closeTimeoutRef.current = null;
37
- }
38
- setHoveredColumn(null);
39
- setAnchorEl(null);
40
- }, []);
41
- return {
42
- hoveredColumn,
43
- anchorEl,
44
- openSubmenu,
45
- closeSubmenu,
46
- cancelClose,
47
- forceClose,
48
- };
49
- };
50
- export const useDialogPosition = (dialogWidth, dialogHeight) => {
51
- const [position, setPosition] = useState({ x: 0, y: 0 });
52
- const resetPosition = useCallback(() => {
53
- const centerX = window.innerWidth / 2 - dialogWidth / 2;
54
- const centerY = window.innerHeight / 2 - dialogHeight / 2;
55
- setPosition({
56
- x: Math.max(0, centerX),
57
- y: Math.max(0, centerY),
58
- });
59
- }, [dialogWidth, dialogHeight]);
60
- const updatePosition = useCallback((x, y) => {
61
- setPosition({ x, y });
62
- }, []);
63
- return { position, resetPosition, updatePosition };
64
- };
65
- export const useOriginalColumns = (defaultColumns) => {
66
- const [originalColumns, setOriginalColumns] = useState([]);
67
- const saveOriginalState = useCallback(() => {
68
- setOriginalColumns(defaultColumns.map((col) => {
69
- var _a;
70
- return (Object.assign(Object.assign({}, col), { selected: col.selected, menuItems: (_a = col.menuItems) === null || _a === void 0 ? void 0 : _a.map((item) => (Object.assign(Object.assign({}, item), { selected: item.selected }))) }));
71
- }));
72
- }, [defaultColumns]);
73
- const clearOriginalState = useCallback(() => {
74
- setOriginalColumns([]);
75
- }, []);
76
- return {
77
- originalColumns,
78
- saveOriginalState,
79
- clearOriginalState,
80
- };
81
- };