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

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 (71) hide show
  1. package/build/components/FilterDropdown/FilterDropdown.d.ts +4 -11
  2. package/build/components/FilterDropdown/FilterDropdown.js +4 -18
  3. package/build/components/FilterDropdown/style.js +1 -1
  4. package/build/components/RangeCalender/RangeCalender.js +2 -4
  5. package/build/components/Sandbox/style.js +3 -2
  6. package/build/components/TableHeader/FiltersRow.d.ts +1 -1
  7. package/build/components/TableHeader/FiltersRow.js +4 -2
  8. package/build/components/TableHeader/TableHeader.d.ts +1 -1
  9. package/build/components/TableHeader/TableHeader.js +2 -2
  10. package/build/components/TableHeader/TableView/CreateViewDialog.d.ts +3 -0
  11. package/build/components/TableHeader/TableView/CreateViewDialog.js +91 -0
  12. package/build/components/TableHeader/TableView/CustomViews.js +1 -1
  13. package/build/components/TableHeader/TableView/TableView.js +0 -1
  14. package/build/components/TableHeader/TableView/ViewSelector.d.ts +5 -0
  15. package/build/components/TableHeader/TableView/ViewSelector.js +46 -0
  16. package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +5 -0
  17. package/build/components/TableHeader/TableView/ViewsDropdown.js +243 -0
  18. package/build/components/TableHeader/TableView/components/ColumnList.d.ts +3 -0
  19. package/build/components/TableHeader/TableView/components/ColumnList.js +70 -0
  20. package/build/components/TableHeader/TableView/components/ViewsSubmenu.d.ts +3 -0
  21. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +52 -0
  22. package/build/components/TableHeader/TableView/components/index.d.ts +2 -0
  23. package/build/components/TableHeader/TableView/components/index.js +2 -0
  24. package/build/components/TableHeader/TableView/constants.d.ts +10 -0
  25. package/build/components/TableHeader/TableView/constants.js +10 -0
  26. package/build/components/TableHeader/TableView/data.d.ts +5 -0
  27. package/build/components/TableHeader/TableView/data.js +48 -0
  28. package/build/components/TableHeader/TableView/hooks/index.d.ts +6 -0
  29. package/build/components/TableHeader/TableView/hooks/index.js +6 -0
  30. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.d.ts +22 -0
  31. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +88 -0
  32. package/build/components/TableHeader/TableView/hooks/useDialogPosition.d.ts +8 -0
  33. package/build/components/TableHeader/TableView/hooks/useDialogPosition.js +16 -0
  34. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.d.ts +7 -0
  35. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.js +34 -0
  36. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.d.ts +6 -0
  37. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.js +18 -0
  38. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.d.ts +8 -0
  39. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.js +43 -0
  40. package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +59 -0
  41. package/build/components/TableHeader/TableView/hooks/useViewSelector.js +219 -0
  42. package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +12 -0
  43. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +139 -0
  44. package/build/components/TableHeader/TableView/index.d.ts +12 -3
  45. package/build/components/TableHeader/TableView/index.js +13 -3
  46. package/build/components/TableHeader/TableView/styles.d.ts +127 -0
  47. package/build/components/TableHeader/TableView/styles.js +426 -0
  48. package/build/components/TableHeader/TableView/types.d.ts +198 -0
  49. package/build/components/TableHeader/TableView/utils.d.ts +121 -0
  50. package/build/components/TableHeader/TableView/utils.js +457 -0
  51. package/build/components/TableHeader/type.d.ts +22 -1
  52. package/build/components/Toolbar/Toolbar.js +1 -1
  53. package/build/components/index.d.ts +0 -1
  54. package/build/components/index.js +0 -1
  55. package/build/constants/apps.js +0 -2
  56. package/build/constants/assets.d.ts +1 -2
  57. package/build/constants/assets.js +1 -2
  58. package/build/types/index.d.ts +0 -1
  59. package/build/types/index.js +0 -1
  60. package/build/types/reports.d.ts +0 -21
  61. package/build/utils/date.d.ts +0 -5
  62. package/build/utils/date.js +0 -37
  63. package/package.json +3 -2
  64. package/build/components/MultiDatakeyDonut/MultiDatakeyDonut.d.ts +0 -12
  65. package/build/components/MultiDatakeyDonut/MultiDatakeyDonut.js +0 -19
  66. package/build/components/MultiDatakeyDonut/index.d.ts +0 -1
  67. package/build/components/MultiDatakeyDonut/index.js +0 -1
  68. package/build/components/MultiDatakeyDonut/style.d.ts +0 -10
  69. package/build/components/MultiDatakeyDonut/style.js +0 -23
  70. package/build/types/toggleOptions.d.ts +0 -2
  71. /package/build/{types/toggleOptions.js → components/TableHeader/TableView/types.js} +0 -0
@@ -1,17 +1,10 @@
1
- import { ReactNode } from 'react';
2
- import { BoxProps } from '@mui/material/Box';
3
- import { SxProps } from '@mui/material';
4
- interface FilterDropdownProps extends BoxProps {
1
+ /// <reference types="react" />
2
+ interface FilterDropdownProps {
3
+ children?: React.ReactNode;
5
4
  onConfirm: () => void;
6
5
  onCancel: () => void;
7
6
  isOkayButDisabled?: boolean;
8
7
  isDisabled?: boolean;
9
- icon?: string;
10
- title?: string;
11
- menuStyle?: SxProps;
12
- hideTitle?: boolean;
13
- renderButton?: ReactNode;
14
- onOpenChange?: (isOpen: boolean) => void;
15
8
  }
16
- export default function FilterDropdown({ onConfirm, onCancel, isOkayButDisabled, children, isDisabled, icon, title, menuStyle, hideTitle, renderButton, onOpenChange, ...props }: Readonly<FilterDropdownProps>): import("react/jsx-runtime").JSX.Element;
9
+ export default function FilterDropdown({ onConfirm, onCancel, isOkayButDisabled, children, isDisabled }: Readonly<FilterDropdownProps>): import("react/jsx-runtime").JSX.Element;
17
10
  export {};
@@ -1,24 +1,12 @@
1
- var __rest = (this && this.__rest) || function (s, e) {
2
- var t = {};
3
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
- t[p] = s[p];
5
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
- t[p[i]] = s[p[i]];
9
- }
10
- return t;
11
- };
12
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
- import { useState, useEffect } from 'react';
14
2
  import Box from '@mui/material/Box';
15
- import ClickAwayListener from '@mui/material/ClickAwayListener';
16
3
  import { useTranslation } from 'react-i18next';
4
+ import { useState, useEffect } from 'react';
5
+ import { ClickAwayListener } from '@mui/material';
17
6
  import { darkFilterIcon } from '../../constants/index.js';
18
7
  import { Menu, CustomBackdrop } from '../index.js';
19
8
  import { CancelButton, FilterButton, Footer, OkayButton, TitleStyled } from './style';
20
- export default function FilterDropdown(_a) {
21
- var { onConfirm, onCancel, isOkayButDisabled, children, isDisabled, icon, title, menuStyle, hideTitle = false, renderButton, onOpenChange } = _a, props = __rest(_a, ["onConfirm", "onCancel", "isOkayButDisabled", "children", "isDisabled", "icon", "title", "menuStyle", "hideTitle", "renderButton", "onOpenChange"]);
9
+ export default function FilterDropdown({ onConfirm, onCancel, isOkayButDisabled, children, isDisabled }) {
22
10
  const [anchorEl, setAnchorEl] = useState(null);
23
11
  const open = Boolean(anchorEl);
24
12
  const { t } = useTranslation();
@@ -44,14 +32,12 @@ export default function FilterDropdown(_a) {
44
32
  return;
45
33
  if (!open) {
46
34
  setAnchorEl(e.currentTarget);
47
- onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(true);
48
35
  return;
49
36
  }
50
37
  onClose();
51
38
  };
52
39
  const onClose = () => {
53
40
  setAnchorEl(null);
54
- onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(false);
55
41
  onCancel();
56
42
  };
57
43
  const handleCancel = () => {
@@ -64,5 +50,5 @@ export default function FilterDropdown(_a) {
64
50
  onConfirm();
65
51
  onClose();
66
52
  };
67
- return (_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCancel }, { children: _jsxs(Box, Object.assign({}, props, { children: [_jsx(FilterButton, Object.assign({ className: "filter-button", isActive: open, onClick: onOpen, sx: Object.assign({}, (isDisabled && Object.assign({ pointerEvents: 'none', opacity: 0.5 }, props.sx))) }, { children: renderButton !== null && renderButton !== void 0 ? renderButton : _jsx(Box, { component: "img", src: icon !== null && icon !== void 0 ? icon : darkFilterIcon, alt: "filter" }) })), _jsxs(Menu, Object.assign({ anchorEl: anchorEl, open: open, sx: Object.assign({ marginTop: '8px', marginBottom: '8px', width: 193 }, menuStyle), placement: "bottom-end" }, { children: [!hideTitle && _jsx(TitleStyled, Object.assign({ component: "span" }, { children: title !== null && title !== void 0 ? title : t('filterBy') })), children, _jsxs(Footer, { children: [_jsx(CancelButton, Object.assign({ onClick: handleCancel }, { children: t('cancel') })), _jsx(OkayButton, Object.assign({ disabled: isOkayButDisabled, onClick: handleConfirm }, { children: t('okay') }))] })] })), open && _jsx(CustomBackdrop, { onClick: onClose })] })) })));
53
+ return (_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCancel }, { children: _jsxs(Box, { children: [_jsx(FilterButton, Object.assign({ isActive: open, onClick: onOpen, sx: Object.assign({}, (isDisabled && { pointerEvents: 'none', opacity: 0.5 })) }, { children: _jsx(Box, { component: "img", src: darkFilterIcon, alt: "filter" }) })), _jsxs(Menu, Object.assign({ anchorEl: anchorEl, open: open, sx: { marginTop: '8px', marginBottom: '8px', width: 193 }, placement: "bottom-end" }, { children: [_jsx(TitleStyled, Object.assign({ component: "span" }, { children: t('filterBy') })), children, _jsxs(Footer, { children: [_jsx(CancelButton, Object.assign({ onClick: handleCancel }, { children: t('cancel') })), _jsx(OkayButton, Object.assign({ disabled: isOkayButDisabled, onClick: handleConfirm }, { children: t('okay') }))] })] })), open && _jsx(CustomBackdrop, { onClick: onClose })] }) })));
68
54
  }
@@ -2,7 +2,7 @@ import Box from '@mui/material/Box';
2
2
  import { styled } from '@mui/material/styles';
3
3
  import Button from '@mui/material/Button';
4
4
  import { Text } from '../index.js';
5
- export const FilterButton = styled(Box, { shouldForwardProp: (props) => props !== 'isActive' })(({ theme, isActive }) => (Object.assign({ borderRadius: '4px', border: `1px solid ${theme.palette.divider}`, minHeight: 32, minWidth: 30, display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', backgroundColor: theme.palette.common.white, ':hover': {
5
+ export const FilterButton = styled(Box, { shouldForwardProp: (props) => props !== 'isActive' })(({ theme, isActive }) => (Object.assign({ borderRadius: '4px', border: `1px solid ${theme.palette.divider}`, height: 32, width: 30, display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', backgroundColor: theme.palette.common.white, ':hover': {
6
6
  opacity: 0.7,
7
7
  } }, (isActive && {
8
8
  boxShadow: `0px 0px 4px 0px ${theme.palette.info.dark}80`,
@@ -58,10 +58,8 @@ function RangeCalender({ defaultDate, onDateChange, mode = 'gregorian', onCalend
58
58
  onChangeTimezone === null || onChangeTimezone === void 0 ? void 0 : onChangeTimezone(selectedTimezone);
59
59
  };
60
60
  const getSelectedDate = () => {
61
- const nowYear = dayjs().year();
62
- const formatDate = (date) => (date.year === nowYear ? date.format('MMM D') : date.format('MMM D YYYY'));
63
- const startSelectedTime = formatDate(dates[0]);
64
- const endSelectedTime = dates[1] ? formatDate(dates[1]) : formatDate(dates[0]);
61
+ const startSelectedTime = dates[0].format('MMM D');
62
+ const endSelectedTime = dates[1] ? dates[1].format('MMM D') : dates[0].format('MMM D');
65
63
  return startSelectedTime === endSelectedTime && !noTimezone ? startSelectedTime : `${startSelectedTime} - ${endSelectedTime}`;
66
64
  };
67
65
  const onChange = (newDate) => {
@@ -11,8 +11,10 @@ export const StyledContainer = styled(Box, {
11
11
  }));
12
12
  export const SandBoxWrapper = styled(Box)(() => ({
13
13
  display: 'flex',
14
- justifyContent: 'flex-end',
14
+ flexDirection: 'row-reverse',
15
+ justifyContent: 'flex-start',
15
16
  alignItems: 'center',
17
+ gap: '0.25rem',
16
18
  }));
17
19
  export const StyledImage = styled('img')(() => ({
18
20
  height: '0.75rem',
@@ -38,7 +40,6 @@ export const StyledText = styled('p', {
38
40
  color: theme.palette.common.orange,
39
41
  fontSize: '0.62rem',
40
42
  fontWeight: 600,
41
- paddingRight: '0.25rem',
42
43
  opacity: isContentHovered ? 1 : 0,
43
44
  display: isContentHovered ? 'block' : 'none',
44
45
  transition: 'opacity 0.2s ease-in-out',
@@ -1,2 +1,2 @@
1
1
  import type { FilterRowProps } from './type';
2
- export default function FiltersRow({ date, calendarMode, onDateChange, onCalendarModeSwitch, tableReportsComponent, tableFilterComponent, isReportsButtonVisible, onViewChange, onSearchChange, onToggleViewButtonClick, rightActions, leftActions, setTableViews, tableViews, resetTableViews, onToggleTextButtonClick, calendarGroupBy, onCalendarGroupChange, maxDateRange, searchPlaceholder, isAcceptance, tableMode, timezone, browserTimezone, defaultCountryTimezone, onChangeTimezone, segmentCountries, }: 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, apiMetadata, }: FilterRowProps): import("react/jsx-runtime").JSX.Element;
@@ -4,8 +4,9 @@ import { SearchButton, StyledButton, Icon, RangeCalender } from '../index.js';
4
4
  import { viewIcon } from '../../constants/index.js';
5
5
  import FiltersRowWrapper from './FiltersRowWrapper';
6
6
  import TableView from './TableView';
7
+ import { ViewSelector } from './TableView';
7
8
  import TableModeButton from './TableModeButton';
8
- 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, }) {
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, apiMetadata, }) {
9
10
  const [isViewVisible, setIsViewVisible] = useState(false);
10
11
  const timezoneCountriesCodes = useMemo(() => segmentCountries.map(({ code }) => code), [segmentCountries]);
11
12
  const tableModeButton = useMemo(() => _jsx(TableModeButton, { tableMode: tableMode, onToggle: onToggleTextButtonClick }), [tableMode, onToggleTextButtonClick]);
@@ -14,5 +15,6 @@ export default function FiltersRow({ date, calendarMode, onDateChange, onCalenda
14
15
  if (startDate && endDate) {
15
16
  onDateChange === null || onDateChange === void 0 ? void 0 : onDateChange([startDate, endDate]);
16
17
  }
17
- }, 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 && (_jsx(TableView, { onViewChange: onViewChange, setIsViewVisible: setIsViewVisible, tableViews: tableViews, setTableViews: setTableViews, resetTableViews: resetTableViews })), rightActions && !isViewVisible && rightActions] }));
18
+ }, mode: calendarMode, onCalendarModeSwitch: onCalendarModeSwitch, maxDateRange: maxDateRange, groupBy: calendarGroupBy, onCalendarGroupChange: onCalendarGroupChange, browserTimezone: browserTimezone, defaultCountryTimezone: defaultCountryTimezone, timezone: timezone, onChangeTimezone: onChangeTimezone, timezoneCountriesCodes: timezoneCountriesCodes })), isReportsButtonVisible && tableReportsComponent, onToggleTextButtonClick && isAcceptance && tableModeButton] })), onToggleViewButtonClick && (_jsx(StyledButton, { children: _jsx(Icon, { src: viewIcon, alt: "view", sx: { width: 14, height: 14 } }) })), onViewChange &&
19
+ (customViews || onCreateCustomView ? (_jsx(ViewSelector, { onViewChange: onViewChange, setIsViewVisible: setIsViewVisible, tableViews: tableViews, setTableViews: setTableViews, resetTableViews: resetTableViews, customViews: customViews, onCreateCustomView: onCreateCustomView, onEditCustomView: onEditCustomView, onDeleteCustomView: onDeleteCustomView, tableMode: tableMode, onTableViewsChange: onTableViewsChange, initialTableViews: initialTableViews, onCustomViewsChange: onCustomViewsChange, initialCustomViews: initialCustomViews, layoutData: layoutData, templates: templates, lang: lang, apiMetadata: apiMetadata })) : (_jsx(TableView, { onViewChange: onViewChange, setIsViewVisible: setIsViewVisible, tableViews: tableViews, setTableViews: setTableViews, resetTableViews: resetTableViews }))), rightActions && !isViewVisible && rightActions] }));
18
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, ...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, apiMetadata, ...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 = [] } = _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"]);
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 }));
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, apiMetadata } = _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", "apiMetadata"]);
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, apiMetadata: apiMetadata }));
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,3 @@
1
+ import type { CreateCustomViewDialogProps } from './types';
2
+ declare function CreateViewDialog({ open, onClose, onCreate, availableColumns, defaultColumns, editingView, onDelete, tableViews, mode, }: Readonly<CreateCustomViewDialogProps>): import("react/jsx-runtime").JSX.Element | null;
3
+ export default CreateViewDialog;
@@ -0,0 +1,91 @@
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 } from "react/jsx-runtime";
11
+ import React, { useState } from 'react';
12
+ import { Box, Typography, CircularProgress, Dialog } from '@mui/material';
13
+ import { useTranslation } from 'react-i18next';
14
+ import Draggable from 'react-draggable';
15
+ import { InputBase } from '../../index.js';
16
+ import { useToast } from '../../../hooks/index.js';
17
+ import Toolbar, { StyledHeaderWrapperStyled } from '../../Toolbar';
18
+ import { CloseIcon } from '../../ToolbarIcon';
19
+ import { TEMPLATE_NAME_MAX_LENGTH } from './constants';
20
+ import { DialogContentWrapper, ScrollableContent, TitleSection, FooterBar, CreateButtonWrapper, DeleteButton, CreateButton, getDialogPaperStyle, dialogSx, } from './styles';
21
+ import { DIALOG_WIDTH, DIALOG_HEIGHT } from './constants';
22
+ import { useCreateViewDialog } from './hooks';
23
+ import { ColumnList } from './components/ColumnList';
24
+ import { convertColumnsToLayoutSection } from './utils';
25
+ function CreateViewDialog({ open, onClose, onCreate, availableColumns = [], defaultColumns = [], editingView, onDelete, tableViews = [], mode = 'sheet', }) {
26
+ const { t } = useTranslation();
27
+ const toast = useToast();
28
+ const [isDeleting, setIsDeleting] = useState(false);
29
+ const [isLoading, setIsLoading] = useState(false);
30
+ // Reset loading state when dialog closes
31
+ React.useEffect(() => {
32
+ if (!open) {
33
+ setIsDeleting(false);
34
+ setIsLoading(false);
35
+ }
36
+ }, [open]);
37
+ const { templateName, setTemplateName, selectedColumns, columnNames, allSelected, someSelected, isNameValid, hoveredColumn, anchorEl, openSubmenu, closeSubmenu, cancelClose, handleReorder, handleColumnToggle, handleSubItemToggle, handleSelectAll, handleResetToDefault, } = useCreateViewDialog({
38
+ open,
39
+ availableColumns,
40
+ defaultColumns,
41
+ editingView,
42
+ tableViews,
43
+ });
44
+ const handleCreate = () => __awaiter(this, void 0, void 0, function* () {
45
+ if (!isNameValid || isLoading || isDeleting)
46
+ return;
47
+ setIsLoading(true);
48
+ try {
49
+ const columnsToCreate = selectedColumns.filter((col) => col.selected);
50
+ const layout = convertColumnsToLayoutSection(columnsToCreate, mode);
51
+ yield (onCreate === null || onCreate === void 0 ? void 0 : onCreate({ name: templateName, selectedColumns: columnsToCreate, layout }));
52
+ onClose();
53
+ }
54
+ catch (error) {
55
+ const errorMessage = error instanceof Error ? error.message : 'Failed to save view. Please try again.';
56
+ toast.error(errorMessage);
57
+ }
58
+ finally {
59
+ setIsLoading(false);
60
+ }
61
+ });
62
+ const handleDelete = () => __awaiter(this, void 0, void 0, function* () {
63
+ if (!editingView || isDeleting || isLoading)
64
+ return;
65
+ const templateId = editingView.templateId || editingView.id;
66
+ setIsDeleting(true);
67
+ try {
68
+ yield (onDelete === null || onDelete === void 0 ? void 0 : onDelete(templateId));
69
+ onClose();
70
+ }
71
+ catch (error) {
72
+ const errorMessage = error instanceof Error ? error.message : 'Failed to delete view. Please try again.';
73
+ toast.error(errorMessage);
74
+ }
75
+ finally {
76
+ setIsDeleting(false);
77
+ }
78
+ });
79
+ if (!open)
80
+ return null;
81
+ return (_jsx(Draggable, Object.assign({ handle: "#draggable-dialog-title", cancel: '[class*="MuiDialogContent-root"]' }, { children: _jsxs(Dialog, Object.assign({ disableEnforceFocus: true, open: open, onClose: onClose, hideBackdrop: true, PaperProps: { style: getDialogPaperStyle(DIALOG_WIDTH, DIALOG_HEIGHT) }, sx: dialogSx, TransitionProps: {
82
+ timeout: 0,
83
+ }, slotProps: {
84
+ backdrop: {
85
+ sx: {
86
+ transition: 'none',
87
+ },
88
+ },
89
+ } }, { children: [_jsx(StyledHeaderWrapperStyled, Object.assign({ id: "draggable-dialog-title", style: { cursor: 'move' } }, { children: _jsx(Toolbar, { isHovered: true, title: editingView ? 'Edit Custom View' : t('createCustomView') || 'Create Custom View', leftActions: _jsx(CloseIcon, { onClick: onClose }) }) })), _jsxs(DialogContentWrapper, { children: [_jsxs(ScrollableContent, { children: [_jsxs(TitleSection, { children: [_jsxs(Box, { children: [_jsx(Typography, Object.assign({ sx: { fontSize: 24, fontWeight: 700, color: '#9F9F9F', lineHeight: '0.7' } }, { children: "Custom" })), _jsx(Typography, Object.assign({ sx: { fontSize: 24, fontWeight: 700, color: '#20232B', lineHeight: 1.2 } }, { children: "View" }))] }), editingView && (_jsx(DeleteButton, Object.assign({ onClick: handleDelete, disabled: isDeleting || isLoading }, { children: isDeleting ? (_jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 1 } }, { children: [_jsx(CircularProgress, { size: 14, color: "inherit" }), _jsx("span", { children: "Deleting..." })] }))) : ('Delete View') })))] }), _jsx(Box, Object.assign({ sx: { mb: 3 } }, { children: _jsx(InputBase, { name: "templateName", label: "Name", value: templateName, onChange: (value) => setTemplateName(value), hasError: false, inputProps: { maxLength: TEMPLATE_NAME_MAX_LENGTH }, required: true }) })), _jsx(ColumnList, { selectedColumns: selectedColumns, columnNames: columnNames, allSelected: allSelected, someSelected: someSelected, hoveredColumn: hoveredColumn, anchorEl: anchorEl, onReorder: handleReorder, onColumnToggle: handleColumnToggle, onSubItemToggle: handleSubItemToggle, onSelectAll: handleSelectAll, onResetToDefault: handleResetToDefault, onSubmenuEnter: openSubmenu, onSubmenuLeave: closeSubmenu, onCancelClose: cancelClose })] }), _jsx(FooterBar, {}), _jsx(CreateButtonWrapper, { children: _jsx(CreateButton, Object.assign({ variant: "contained", onClick: handleCreate, disabled: !isNameValid || isLoading || isDeleting, title: !isNameValid ? `Name is required. Current: "${templateName}"` : undefined }, { children: isLoading ? (_jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 1 } }, { children: [_jsx(CircularProgress, { size: 14, color: "inherit" }), _jsx("span", { children: editingView ? 'Saving...' : 'Creating...' })] }))) : editingView ? ('Update View') : ('Create View') })) })] })] })) })));
90
+ }
91
+ export default CreateViewDialog;
@@ -4,7 +4,7 @@ import { useTranslation } from 'react-i18next';
4
4
  import { Reorder } from 'framer-motion';
5
5
  import { CustomBackdrop, Menu } from '../../index.js';
6
6
  import { downArrowIcon } from '../../../constants/index.js';
7
- import { ButtonStyled, ListStyled, DropdownStyled } from './style';
7
+ import { ButtonStyled, ListStyled, DropdownStyled } from './styles';
8
8
  import { useSubMenu, useViewColumns } from './hooks';
9
9
  import ColumnItem from './ColumnItem';
10
10
  function CustomViews({ open, onSelect, setTableViews, tableViews, anchorEl, onClose }) {
@@ -28,7 +28,6 @@ function TableView({ onViewChange, setIsViewVisible, setTableViews, tableViews,
28
28
  const onClose = () => {
29
29
  setAnchorViewEl(null);
30
30
  setIsViewVisible(false);
31
- // to be removed
32
31
  setSelectedViewInfo({ label: 'Default', id: 'default' });
33
32
  };
34
33
  const handleSelectedViewInfo = (selected) => {
@@ -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, onCustomViewsChange, templates, lang, apiMetadata, }: 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, onCustomViewsChange, templates, lang = 'en', apiMetadata, }) {
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, defaultTemplate, } = useViewsManager({
17
+ mode,
18
+ templates,
19
+ lang,
20
+ });
21
+ const tableViews = externalTableViews !== null && externalTableViews !== void 0 ? externalTableViews : internalTableViews;
22
+ const customViews = externalCustomViews !== null && externalCustomViews !== void 0 ? externalCustomViews : internalCustomViews;
23
+ const { anchorViewEl, defaultViewEl, setDefaultViewElement, isCreateDialogOpen, editingView, selectedViewInfo, shouldUseCurrentState, handleViewButtonClick, handleCloseViewDropdown, handleSelectedViewInfo, handleOpenCreateDialog, handleOpenEditDialog, handleCloseCreateDialog, handleSaveView, handleDeleteView, handleResetViews, handleTableViewsChange, updateSelectedView, } = useViewSelector({
24
+ mode,
25
+ onViewChange,
26
+ onTableViewsChange,
27
+ onCustomViewsChange,
28
+ onCreateCustomView,
29
+ onEditCustomView,
30
+ onDeleteCustomView,
31
+ resetTableViews,
32
+ setTableViews,
33
+ tableViews,
34
+ customViews,
35
+ defaultColumns,
36
+ defaultTemplate,
37
+ setInternalCustomViews,
38
+ setInternalTableViews,
39
+ setDefaultColumns,
40
+ apiMetadata,
41
+ });
42
+ return (_jsxs(_Fragment, { children: [_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCloseViewDropdown }, { children: _jsxs(ViewWrapper, Object.assign({ sx: { width: '32px' }, "data-testid": "ViewSelector" }, { children: [_jsx(StyledButton, Object.assign({ title: t('tableView'), "data-testid": "ViewSelector_button", onClick: handleViewButtonClick }, { children: _jsx(Icon, { src: viewIcon, alt: "view", sx: { width: 14, height: 14 } }) })), _jsx(ViewsDropdown, { open: Boolean(defaultViewEl), anchorEl: anchorViewEl, setSelectedViewInfo: handleSelectedViewInfo, selectedViewInfo: selectedViewInfo, onSelect: (e, selectedView) => {
43
+ setDefaultViewElement(defaultViewEl ? null : e.currentTarget);
44
+ }, setViews: handleResetViews, tableViews: tableViews, setTableViews: handleTableViewsChange, onCreateCustomView: handleOpenCreateDialog, customViews: customViews, onEditCustomView: handleOpenEditDialog, defaultColumns: defaultColumns, setDefaultColumns: setDefaultColumns, updateSelectedView: updateSelectedView })] })) })), _jsx(CreateViewDialog, { open: isCreateDialogOpen, onClose: handleCloseCreateDialog, availableColumns: defaultColumns, defaultColumns: defaultColumns, onCreate: handleSaveView, editingView: editingView, onDelete: handleDeleteView, tableViews: shouldUseCurrentState ? defaultColumns : undefined, mode: mode })] }));
45
+ }
46
+ export default memo(ViewSelector);
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ import type { ViewsDropdownProps } from './types';
3
+ declare function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect, setViews, anchorEl, onCreateCustomView, customViews, onEditCustomView, defaultColumns, setDefaultColumns, updateSelectedView, }: Readonly<ViewsDropdownProps>): import("react/jsx-runtime").JSX.Element;
4
+ declare const _default: React.MemoExoticComponent<typeof ViewsDropdown>;
5
+ export default _default;
@@ -0,0 +1,243 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useMemo } from 'react';
3
+ import Popper from '@mui/material/Popper';
4
+ import Box from '@mui/material/Box';
5
+ import Typography from '@mui/material/Typography';
6
+ import Divider from '@mui/material/Divider';
7
+ import Button from '@mui/material/Button';
8
+ import { useTranslation } from 'react-i18next';
9
+ import { bluePlusIcon, editIcon, smallBlueCheckIcon, blackRightArrowIcon } from '../../../constants/index.js';
10
+ import { Menu, Tooltip } from '../../index.js';
11
+ import { useSubmenuHover, useOriginalColumns, useNestedSubmenu } from './hooks';
12
+ import { MAX_CUSTOM_VIEWS } from './constants';
13
+ import { defaultViewList } from './data';
14
+ import { ViewsSubmenu } from './components/ViewsSubmenu';
15
+ import { ListStyled, DropdownStyled, MenuItem as StyledMenuItem, Space, SpaceAfter, SubmenuContainer, SaveCustomViewBox, SaveCustomViewInnerBox, ButtonsContainer, CancelButtonSx, OkayButtonSx, ModifiedTextSx, } from './styles';
16
+ import { deepCloneColumns, toggleSingleColumn, toggleSubItem, getSubmenuItems, hasSubmenu, areAllCurrentColumnsSelected, areSomeCurrentColumnsSelected, toggleAllCurrentColumns, areColumnsEqual, } from './utils';
17
+ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect, setViews, anchorEl, onCreateCustomView, customViews = [], onEditCustomView, defaultColumns = [], setDefaultColumns, updateSelectedView, }) {
18
+ const { t } = useTranslation();
19
+ const { hoveredColumn: hoveredItem, anchorEl: submenuAnchorEl, openSubmenu: handleMenuItemHover, closeSubmenu: handleMenuItemLeave, cancelClose: handleSubmenuEnter, forceClose: forceCloseSubmenu, } = useSubmenuHover();
20
+ const [hoveredCustomView, setHoveredCustomView] = React.useState(null);
21
+ const [isDefaultModified, setIsDefaultModified] = React.useState(false);
22
+ const [baselineColumns, setBaselineColumns] = React.useState([]);
23
+ const [isOkayClicked, setIsOkayClicked] = React.useState(false);
24
+ const prevDefaultColumnsRef = React.useRef(defaultColumns);
25
+ const { originalColumns, saveOriginalState, clearOriginalState } = useOriginalColumns(defaultColumns);
26
+ // Reset modification state when defaultColumns change (e.g., mode change)
27
+ React.useEffect(() => {
28
+ // Check if defaultColumns actually changed (new reference or different content)
29
+ if (prevDefaultColumnsRef.current !== defaultColumns) {
30
+ prevDefaultColumnsRef.current = defaultColumns;
31
+ setIsDefaultModified(false);
32
+ setBaselineColumns([]);
33
+ clearOriginalState();
34
+ }
35
+ }, [defaultColumns, clearOriginalState]);
36
+ // Wrapper to restore state when submenu closes without clicking Okay
37
+ const handleSubmenuLeave = () => {
38
+ // If submenu closes without clicking Okay, restore original state
39
+ if (!isOkayClicked && originalColumns.length > 0 && setDefaultColumns) {
40
+ const restoredColumns = deepCloneColumns(originalColumns);
41
+ setDefaultColumns(restoredColumns);
42
+ setIsDefaultModified(false);
43
+ setBaselineColumns([]);
44
+ clearOriginalState();
45
+ }
46
+ setIsOkayClicked(false);
47
+ forceCloseSubmenu();
48
+ };
49
+ const { hoveredNestedColumn, nestedSubmenuAnchorEl, openNestedSubmenu, closeNestedSubmenu, cancelNestedClose } = useNestedSubmenu();
50
+ // Default templates are merged into built-in Default view, so no need to sort
51
+ const viewList = [...defaultViewList, ...customViews];
52
+ const handleViewClick = (item) => {
53
+ // Mark as if Okay was clicked to prevent restoring original state
54
+ // When clicking directly on a view item, user wants to apply the view as-is
55
+ setIsOkayClicked(true);
56
+ // Close submenu immediately when clicking on a view (don't wait for hover to end)
57
+ forceCloseSubmenu();
58
+ // Clear original state since we're committing to this view
59
+ clearOriginalState();
60
+ if (item.columns)
61
+ setViews === null || setViews === void 0 ? void 0 : setViews(item.columns);
62
+ // For default view, construct a complete view object with submenu (defaultColumns)
63
+ // For custom views, pass the view object as-is
64
+ let viewToPass;
65
+ if (item.id === 'default') {
66
+ // Create a complete default view with current default columns
67
+ viewToPass = {
68
+ id: 'default',
69
+ label: item.label,
70
+ submenu: defaultColumns,
71
+ columns: defaultColumns.map((col) => col.name),
72
+ };
73
+ }
74
+ else if (item.isCustom) {
75
+ viewToPass = item;
76
+ }
77
+ else {
78
+ viewToPass = undefined;
79
+ }
80
+ // Update selected view info with the view object - this will trigger view change
81
+ setSelectedViewInfo(item, viewToPass);
82
+ };
83
+ const toggleColumnSelection = (columnName) => {
84
+ if (!setDefaultColumns)
85
+ return;
86
+ const newColumns = toggleSingleColumn(defaultColumns, columnName);
87
+ setDefaultColumns(newColumns);
88
+ };
89
+ const toggleNestedItem = (columnName, subItemName) => {
90
+ if (!setDefaultColumns)
91
+ return;
92
+ const newColumns = toggleSubItem(defaultColumns, columnName, subItemName);
93
+ setDefaultColumns(newColumns);
94
+ };
95
+ const getHoveredSubmenu = () => {
96
+ if (!hoveredItem)
97
+ return [];
98
+ const item = viewList.find((i) => i.id === hoveredItem);
99
+ return item ? getSubmenuItems(item, defaultColumns) : [];
100
+ };
101
+ const currentSubmenuColumns = useMemo(() => getHoveredSubmenu(), [hoveredItem, defaultColumns, viewList]);
102
+ const originalSubmenuColumns = useMemo(() => {
103
+ if (!hoveredItem || originalColumns.length === 0)
104
+ return [];
105
+ const item = viewList.find((i) => i.id === hoveredItem);
106
+ return item ? getSubmenuItems(item, originalColumns) : [];
107
+ }, [hoveredItem, originalColumns, viewList]);
108
+ const isSubmenuModified = useMemo(() => {
109
+ if (originalSubmenuColumns.length === 0)
110
+ return true;
111
+ return !areColumnsEqual(currentSubmenuColumns, originalSubmenuColumns);
112
+ }, [currentSubmenuColumns, originalSubmenuColumns]);
113
+ const allCurrentSelected = useMemo(() => areAllCurrentColumnsSelected(currentSubmenuColumns), [currentSubmenuColumns]);
114
+ const someCurrentSelected = useMemo(() => areSomeCurrentColumnsSelected(currentSubmenuColumns, allCurrentSelected), [currentSubmenuColumns, allCurrentSelected]);
115
+ const handleSelectAll = () => {
116
+ if (!setDefaultColumns)
117
+ return;
118
+ const shouldSelectAll = !allCurrentSelected;
119
+ const newColumns = toggleAllCurrentColumns(defaultColumns, shouldSelectAll);
120
+ setDefaultColumns(newColumns);
121
+ };
122
+ const handleReset = () => {
123
+ if (!setDefaultColumns || originalColumns.length === 0)
124
+ return;
125
+ const restoredColumns = deepCloneColumns(originalColumns);
126
+ setDefaultColumns([...restoredColumns]);
127
+ setIsDefaultModified(false);
128
+ setBaselineColumns([]);
129
+ };
130
+ const handleSaveAsCustomView = (e) => {
131
+ e.stopPropagation();
132
+ setIsOkayClicked(true); // Mark that a valid action was taken, don't restore on close
133
+ clearOriginalState();
134
+ forceCloseSubmenu();
135
+ onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(true); // Use current state when saving from submenu
136
+ };
137
+ const handleCancel = () => {
138
+ if (setDefaultColumns && originalColumns.length > 0) {
139
+ const restoredColumns = deepCloneColumns(originalColumns);
140
+ setDefaultColumns(restoredColumns);
141
+ // Reset modified state when canceling
142
+ setIsDefaultModified(false);
143
+ setBaselineColumns([]);
144
+ }
145
+ clearOriginalState();
146
+ setIsOkayClicked(false);
147
+ forceCloseSubmenu();
148
+ };
149
+ const handleOkay = () => {
150
+ if (originalColumns.length > 0) {
151
+ const hasChanges = !areColumnsEqual(defaultColumns, originalColumns);
152
+ setIsDefaultModified(hasChanges);
153
+ if (hasChanges) {
154
+ setBaselineColumns(deepCloneColumns(originalColumns));
155
+ }
156
+ else {
157
+ setBaselineColumns([]);
158
+ }
159
+ }
160
+ // Always update selected view when Okay is clicked to ensure parent re-renders
161
+ if (selectedViewInfo.id === 'default' && defaultColumns.length > 0 && updateSelectedView) {
162
+ const defaultViewWithColumns = {
163
+ id: 'default',
164
+ label: selectedViewInfo.label || 'Default',
165
+ submenu: [...defaultColumns],
166
+ columns: defaultColumns.map((col) => col.name),
167
+ };
168
+ updateSelectedView(defaultViewWithColumns);
169
+ }
170
+ setIsOkayClicked(true); // Mark that Okay was clicked so we don't restore on close
171
+ clearOriginalState();
172
+ forceCloseSubmenu();
173
+ };
174
+ const handleOpenSubmenu = (itemId, element) => {
175
+ saveOriginalState();
176
+ setIsOkayClicked(false); // Reset flag when opening submenu
177
+ if (itemId === 'default' && baselineColumns.length > 0) {
178
+ const hasChanges = !areColumnsEqual(defaultColumns, baselineColumns);
179
+ setIsDefaultModified(hasChanges);
180
+ }
181
+ handleMenuItemHover(itemId, element);
182
+ };
183
+ const shouldDimNewCustomView = customViews.length >= MAX_CUSTOM_VIEWS;
184
+ return (_jsxs(DropdownStyled, Object.assign({ "data-testid": "ViewsDropdown" }, { children: [_jsx(Popper, Object.assign({ open: open, anchorEl: anchorEl, placement: "bottom-start" }, { children: _jsxs(ListStyled, { children: [_jsx(Typography, Object.assign({ sx: {
185
+ paddingX: 1.25,
186
+ py: 1.1,
187
+ fontWeight: 500,
188
+ fontSize: 11,
189
+ color: '#8D8D94',
190
+ } }, { children: "View" })), _jsx(Divider, {}), viewList.map((item) => (_jsxs(StyledMenuItem, Object.assign({ onMouseEnter: (e) => {
191
+ if (item.isCustom) {
192
+ setHoveredCustomView(item.id);
193
+ }
194
+ else if (hasSubmenu(item, defaultColumns)) {
195
+ handleOpenSubmenu(item.id, e.currentTarget);
196
+ }
197
+ }, onMouseLeave: () => {
198
+ if (item.isCustom) {
199
+ setHoveredCustomView(null);
200
+ }
201
+ else if (hasSubmenu(item, defaultColumns)) {
202
+ handleMenuItemLeave();
203
+ }
204
+ }, onClick: () => handleViewClick(item), sx: {
205
+ position: 'relative',
206
+ cursor: 'pointer',
207
+ pr: 1.5,
208
+ } }, { children: [item.id === selectedViewInfo.id ? (_jsx("img", { style: {
209
+ width: 15,
210
+ height: 15,
211
+ }, className: "check-icon", src: smallBlueCheckIcon, alt: "check" })) : (_jsx(Space, {})), _jsxs("span", Object.assign({ style: { flex: 1, fontSize: 11 } }, { children: [item.label, item.id === 'default' && isDefaultModified && _jsx("span", Object.assign({ style: ModifiedTextSx }, { children: "(Modified)" }))] })), item.isCustom && hoveredCustomView === item.id && (_jsx("img", { src: editIcon, alt: "edit", style: { width: 12, height: 12, cursor: 'pointer' }, onClick: (e) => {
212
+ e.stopPropagation();
213
+ onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(item);
214
+ } })), !item.isCustom && hasSubmenu(item, defaultColumns) && _jsx("img", { src: blackRightArrowIcon, alt: "arrow", style: { height: 12 } })] }), item.id))), _jsx(Tooltip, Object.assign({ title: "Limit reached. Delete a view to create a new one.", placement: "left", disableHoverListener: !shouldDimNewCustomView }, { children: _jsxs(StyledMenuItem, Object.assign({ sx: {
215
+ border: 'none',
216
+ opacity: shouldDimNewCustomView ? 0.5 : 1,
217
+ cursor: shouldDimNewCustomView ? 'not-allowed' : 'pointer',
218
+ }, onClick: (e) => {
219
+ if (shouldDimNewCustomView) {
220
+ e.stopPropagation();
221
+ return;
222
+ }
223
+ e.stopPropagation();
224
+ handleSubmenuLeave();
225
+ onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(false); // Don't use current state for "New Custom View"
226
+ } }, { children: [_jsx(Space, {}), _jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 0.5 } }, { children: [_jsx("img", { src: bluePlusIcon, alt: "icon", style: { opacity: shouldDimNewCustomView ? 0.5 : 1, width: 10, height: 10 } }), _jsx("span", Object.assign({ style: { color: shouldDimNewCustomView ? '#999' : '#1F88D0', fontSize: 11, fontWeight: 500 } }, { children: t('New Custom View') }))] })), _jsx(SpaceAfter, {})] })) }))] }) })), hoveredItem && submenuAnchorEl && getHoveredSubmenu().length > 0 && (_jsx(Menu, Object.assign({ open: Boolean(hoveredItem), anchorEl: submenuAnchorEl, placement: "auto-end", onMouseEnter: handleSubmenuEnter, onMouseLeave: handleSubmenuLeave, modifiers: [
227
+ {
228
+ name: 'offset',
229
+ options: {
230
+ offset: [-4, 0],
231
+ },
232
+ },
233
+ {
234
+ name: 'preventOverflow',
235
+ enabled: true,
236
+ },
237
+ {
238
+ name: 'flip',
239
+ enabled: true,
240
+ },
241
+ ] }, { children: _jsxs(SubmenuContainer, { children: [_jsx(ViewsSubmenu, { columns: getHoveredSubmenu(), allCurrentSelected: allCurrentSelected, someCurrentSelected: someCurrentSelected, onSelectAll: handleSelectAll, onReset: handleReset, onColumnToggle: toggleColumnSelection, onNestedItemToggle: toggleNestedItem, anchorEl: submenuAnchorEl, isModified: isSubmenuModified }), _jsx(SaveCustomViewBox, { children: _jsx(Tooltip, Object.assign({ title: "Limit reached. Delete a view to create a new one.", placement: "left", disableHoverListener: !shouldDimNewCustomView }, { children: _jsxs(SaveCustomViewInnerBox, Object.assign({ disabled: shouldDimNewCustomView, onClick: shouldDimNewCustomView ? undefined : handleSaveAsCustomView }, { children: [_jsx(Typography, Object.assign({ sx: { fontSize: 11, color: 'text.secondary' } }, { children: "Save as a custom view" })), _jsxs(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', gap: 0.5 } }, { children: [_jsx("img", { src: bluePlusIcon, alt: "add", style: { width: 10, height: 10, opacity: shouldDimNewCustomView ? 0.5 : 1 } }), _jsx(Typography, Object.assign({ sx: { fontSize: 10, fontWeight: 600, color: shouldDimNewCustomView ? '#999' : '#1F88D0' } }, { children: "Custom View" }))] }))] })) })) }), _jsxs(ButtonsContainer, { children: [_jsx(Button, Object.assign({ variant: "text", onClick: handleCancel, sx: CancelButtonSx }, { children: "Cancel" })), _jsx(Button, Object.assign({ variant: "contained", onClick: handleOkay, sx: OkayButtonSx }, { children: "Okay" }))] })] }) })))] })));
242
+ }
243
+ export default React.memo(ViewsDropdown);
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import type { ColumnListProps } from '../types';
3
+ export declare const ColumnList: React.FC<ColumnListProps>;