@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.
- package/build/components/TableHeader/FiltersRow.d.ts +1 -1
- package/build/components/TableHeader/FiltersRow.js +3 -3
- package/build/components/TableHeader/TableHeader.d.ts +1 -1
- package/build/components/TableHeader/TableHeader.js +2 -2
- package/build/components/TableHeader/TableView/ViewSelector.d.ts +5 -0
- package/build/components/TableHeader/TableView/ViewSelector.js +46 -0
- package/build/components/TableHeader/TableView/ViewsDropdown.js +29 -16
- package/build/components/TableHeader/TableView/components/ColumnList.js +4 -11
- package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +4 -11
- package/build/components/TableHeader/TableView/hooks/index.d.ts +6 -0
- package/build/components/TableHeader/TableView/hooks/index.js +6 -0
- package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +1 -1
- package/build/components/TableHeader/TableView/hooks/useDialogPosition.d.ts +8 -0
- package/build/components/TableHeader/TableView/hooks/useDialogPosition.js +16 -0
- package/build/components/TableHeader/TableView/hooks/useOriginalColumns.d.ts +6 -0
- package/build/components/TableHeader/TableView/hooks/useOriginalColumns.js +18 -0
- package/build/components/TableHeader/TableView/hooks/useSubmenuHover.d.ts +8 -0
- package/build/components/TableHeader/TableView/hooks/useSubmenuHover.js +43 -0
- package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +54 -0
- package/build/components/TableHeader/TableView/hooks/useViewSelector.js +110 -0
- package/build/components/TableHeader/TableView/hooks/useViewsManager.js +55 -8
- package/build/components/TableHeader/TableView/index.d.ts +4 -4
- package/build/components/TableHeader/TableView/index.js +3 -3
- package/build/components/TableHeader/TableView/types.d.ts +2 -2
- package/build/components/TableHeader/TableView/utils.d.ts +5 -1
- package/build/components/TableHeader/TableView/utils.js +20 -9
- package/build/components/TableHeader/type.d.ts +0 -1
- package/package.json +2 -2
- package/build/components/TableHeader/TableView/ViewsManager.d.ts +0 -5
- package/build/components/TableHeader/TableView/ViewsManager.js +0 -123
- package/build/components/TableHeader/TableView/hooks.d.ts +0 -28
- 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,
|
|
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 {
|
|
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,
|
|
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(
|
|
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,
|
|
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,
|
|
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,
|
|
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:
|
|
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
|
-
//
|
|
26
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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)" }))
|
|
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",
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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",
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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 '
|
|
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,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,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,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
|
|
11
|
-
layoutData:
|
|
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(() =>
|
|
18
|
-
|
|
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
|
-
|
|
22
|
-
if (
|
|
23
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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) =>
|
|
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
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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.
|
|
5
|
-
"testVersion":
|
|
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
|
-
};
|