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

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 (34) hide show
  1. package/build/components/TableHeader/FiltersRow.d.ts +1 -1
  2. package/build/components/TableHeader/FiltersRow.js +3 -3
  3. package/build/components/TableHeader/TableHeader.d.ts +1 -1
  4. package/build/components/TableHeader/TableHeader.js +2 -2
  5. package/build/components/TableHeader/TableView/CreateViewDialog.js +3 -1
  6. package/build/components/TableHeader/TableView/ViewSelector.d.ts +5 -0
  7. package/build/components/TableHeader/TableView/ViewSelector.js +43 -0
  8. package/build/components/TableHeader/TableView/ViewsDropdown.js +50 -21
  9. package/build/components/TableHeader/TableView/components/ColumnList.js +4 -11
  10. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +4 -11
  11. package/build/components/TableHeader/TableView/hooks/index.d.ts +6 -0
  12. package/build/components/TableHeader/TableView/hooks/index.js +6 -0
  13. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +1 -1
  14. package/build/components/TableHeader/TableView/hooks/useDialogPosition.d.ts +8 -0
  15. package/build/components/TableHeader/TableView/hooks/useDialogPosition.js +16 -0
  16. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.d.ts +6 -0
  17. package/build/components/TableHeader/TableView/hooks/useOriginalColumns.js +18 -0
  18. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.d.ts +8 -0
  19. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.js +43 -0
  20. package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +54 -0
  21. package/build/components/TableHeader/TableView/hooks/useViewSelector.js +110 -0
  22. package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +1 -1
  23. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +83 -15
  24. package/build/components/TableHeader/TableView/index.d.ts +4 -4
  25. package/build/components/TableHeader/TableView/index.js +5 -3
  26. package/build/components/TableHeader/TableView/types.d.ts +21 -16
  27. package/build/components/TableHeader/TableView/utils.d.ts +10 -2
  28. package/build/components/TableHeader/TableView/utils.js +27 -11
  29. package/build/components/TableHeader/type.d.ts +1 -2
  30. package/package.json +2 -2
  31. package/build/components/TableHeader/TableView/ViewsManager.d.ts +0 -5
  32. package/build/components/TableHeader/TableView/ViewsManager.js +0 -123
  33. package/build/components/TableHeader/TableView/hooks.d.ts +0 -28
  34. package/build/components/TableHeader/TableView/hooks.js +0 -81
@@ -1,7 +1,7 @@
1
1
  /// <reference types="react" />
2
2
  import type { ColumnViewProps } from '../../../../types/index.js';
3
3
  import type { UseViewsManagerProps, ViewMenuItem } from '../types';
4
- export declare const useViewsManager: ({ mode, layoutData, initialTableViews, initialCustomViews, templates, lang }: UseViewsManagerProps) => {
4
+ export declare const useViewsManager: ({ mode, templates, lang }: UseViewsManagerProps) => {
5
5
  defaultColumns: ColumnViewProps[];
6
6
  setDefaultColumns: import("react").Dispatch<import("react").SetStateAction<ColumnViewProps[]>>;
7
7
  internalTableViews: ColumnViewProps[];
@@ -1,33 +1,101 @@
1
1
  import { useState, useEffect, useMemo } from 'react';
2
- import { getColumnsByMode, transformTemplatesToViewMenuItems, getLayoutDataFromTemplates } from '../utils';
3
- export const useViewsManager = ({ mode, layoutData, initialTableViews, initialCustomViews, templates, lang = 'en' }) => {
4
- // Transform templates internally if provided
2
+ import { transformTemplatesToViewMenuItems, getLayoutDataFromTemplates, getColumnsByMode } from '../utils';
3
+ export const useViewsManager = ({ mode, templates, lang = 'en' }) => {
4
+ // Transform templates internally - this is the only source of data
5
5
  const transformedTemplates = useMemo(() => {
6
6
  if (!templates)
7
7
  return null;
8
8
  const templatesArray = Array.isArray(templates) ? templates : templates.templates;
9
+ const { customViews, defaultTemplateColumns } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
10
+ // Use default template columns if available, otherwise use layoutData from all templates
11
+ const effectiveLayoutData = defaultTemplateColumns
12
+ ? [
13
+ {
14
+ code: mode === 'advanced' ? 'Advanced' : 'Sheet',
15
+ columns: defaultTemplateColumns.map((col, idx) => {
16
+ var _a, _b;
17
+ return ({
18
+ code: col.name,
19
+ name: [{ text: typeof col.label === 'string' ? col.label : col.name, lang }],
20
+ order: idx + 1,
21
+ default: (_a = col.selected) !== null && _a !== void 0 ? _a : false,
22
+ fields: (_b = col.menuItems) === null || _b === void 0 ? void 0 : _b.map((item) => {
23
+ var _a;
24
+ return ({
25
+ code: item.name,
26
+ name: [{ text: typeof item.label === 'string' ? item.label : item.name, lang: '' }],
27
+ default: (_a = item.selected) !== null && _a !== void 0 ? _a : false,
28
+ });
29
+ }),
30
+ });
31
+ }),
32
+ },
33
+ ]
34
+ : getLayoutDataFromTemplates(templatesArray);
9
35
  return {
10
- customViews: transformTemplatesToViewMenuItems(templatesArray, mode, lang),
11
- layoutData: getLayoutDataFromTemplates(templatesArray),
36
+ customViews,
37
+ layoutData: effectiveLayoutData,
38
+ defaultTemplateColumns,
12
39
  };
13
40
  }, [templates, mode, lang]);
14
- // Use transformed templates or provided props
15
- const effectiveLayoutData = (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.layoutData) || layoutData;
16
- const effectiveCustomViews = (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews) || initialCustomViews;
17
- const [defaultColumns, setDefaultColumns] = useState(() => getColumnsByMode(mode, effectiveLayoutData));
18
- const [internalTableViews, setInternalTableViews] = useState(initialTableViews || getColumnsByMode(mode, effectiveLayoutData) || []);
19
- const [internalCustomViews, setInternalCustomViews] = useState(effectiveCustomViews || []);
41
+ const [defaultColumns, setDefaultColumns] = useState(() => {
42
+ // Only use data from templates - no other sources
43
+ if (templates) {
44
+ const templatesArray = Array.isArray(templates) ? templates : templates.templates;
45
+ const { defaultTemplateColumns } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
46
+ if (defaultTemplateColumns) {
47
+ return defaultTemplateColumns;
48
+ }
49
+ }
50
+ // Return empty array if no templates
51
+ return [];
52
+ });
53
+ const [internalTableViews, setInternalTableViews] = useState(() => {
54
+ // Initialize from templates only
55
+ if (templates) {
56
+ const templatesArray = Array.isArray(templates) ? templates : templates.templates;
57
+ const { defaultTemplateColumns } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
58
+ if (defaultTemplateColumns) {
59
+ return defaultTemplateColumns;
60
+ }
61
+ }
62
+ return [];
63
+ });
64
+ const [internalCustomViews, setInternalCustomViews] = useState(() => {
65
+ // Initialize from templates only
66
+ if (templates) {
67
+ const templatesArray = Array.isArray(templates) ? templates : templates.templates;
68
+ const { customViews } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
69
+ return customViews || [];
70
+ }
71
+ return [];
72
+ });
20
73
  useEffect(() => {
21
- setDefaultColumns(getColumnsByMode(mode, effectiveLayoutData));
22
- if (!initialTableViews && effectiveLayoutData) {
23
- setInternalTableViews(getColumnsByMode(mode, effectiveLayoutData));
74
+ // Only use data from templates
75
+ if (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplateColumns) {
76
+ setDefaultColumns(transformedTemplates.defaultTemplateColumns);
77
+ setInternalTableViews(transformedTemplates.defaultTemplateColumns);
24
78
  }
25
- }, [mode, effectiveLayoutData, initialTableViews]);
79
+ else if ((transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.layoutData) && transformedTemplates.layoutData.length > 0) {
80
+ // Use layoutData from templates
81
+ const columns = getColumnsByMode(mode, transformedTemplates.layoutData);
82
+ setDefaultColumns(columns);
83
+ setInternalTableViews(columns);
84
+ }
85
+ else {
86
+ // No templates - set empty arrays
87
+ setDefaultColumns([]);
88
+ setInternalTableViews([]);
89
+ }
90
+ }, [mode, transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplateColumns, transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.layoutData]);
26
91
  // Update custom views when templates change
27
92
  useEffect(() => {
28
93
  if (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews) {
29
94
  setInternalCustomViews(transformedTemplates.customViews);
30
95
  }
96
+ else {
97
+ setInternalCustomViews([]);
98
+ }
31
99
  }, [transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews]);
32
100
  return {
33
101
  defaultColumns,
@@ -2,11 +2,11 @@ export { default } from './TableView';
2
2
  export { default as TableView } from './TableView';
3
3
  export { default as DefaultViews } from './DefaultViews';
4
4
  export { default as CustomViews } from './CustomViews';
5
- export { default as ViewsManager } from './ViewsManager';
5
+ export { default as ViewSelector } from './ViewSelector';
6
6
  export { default as ViewsDropdown } from './ViewsDropdown';
7
7
  export { default as CreateViewDialog } from './CreateViewDialog';
8
- export type { ViewMenuItem, ViewMode, CreateCustomViewDialogProps, LayoutSection, ColumnItem, FieldItem, TemplateResponse, TemplatesListResponse } from './types';
9
- export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState } from './utils';
10
- export { useSubmenuHover, useDialogPosition } from './hooks';
8
+ export type { ViewMenuItem, ViewMode, CreateCustomViewDialogProps, LayoutSection, ColumnItem, FieldItem, TemplateResponse, TemplatesListResponse, } from './types';
9
+ export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState, } from './utils';
10
+ export { useSubmenuHover } from './hooks';
11
11
  export { DIALOG_WIDTH, DIALOG_HEIGHT, MAX_CUSTOM_VIEWS, TEMPLATE_NAME_MAX_LENGTH } from './constants';
12
12
  export { defaultViewList, advancedColumns, sheetColumns } from './data';
@@ -2,10 +2,12 @@ export { default } from './TableView';
2
2
  export { default as TableView } from './TableView';
3
3
  export { default as DefaultViews } from './DefaultViews';
4
4
  export { default as CustomViews } from './CustomViews';
5
- export { default as ViewsManager } from './ViewsManager';
5
+ export { default as ViewSelector } from './ViewSelector';
6
6
  export { default as ViewsDropdown } from './ViewsDropdown';
7
7
  export { default as CreateViewDialog } from './CreateViewDialog';
8
- export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState } from './utils';
9
- export { useSubmenuHover, useDialogPosition } from './hooks';
8
+ export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState, } from './utils';
9
+ export { useSubmenuHover } from './hooks';
10
10
  export { DIALOG_WIDTH, DIALOG_HEIGHT, MAX_CUSTOM_VIEWS, TEMPLATE_NAME_MAX_LENGTH } from './constants';
11
+ // Note: defaultViewList, advancedColumns, sheetColumns are only exported for demo purposes
12
+ // They should not be used as defaults in production - all data should come from API
11
13
  export { defaultViewList, advancedColumns, sheetColumns } from './data';
@@ -5,6 +5,7 @@ export type ViewMode = 'advanced' | 'sheet';
5
5
  export interface ViewMenuItem {
6
6
  label: string;
7
7
  id: string;
8
+ templateId?: string;
8
9
  columns?: string[];
9
10
  submenu?: ColumnViewProps[];
10
11
  isCustom?: boolean;
@@ -16,6 +17,7 @@ export interface FieldItem {
16
17
  text: string;
17
18
  lang: string;
18
19
  }[];
20
+ order?: number | null;
19
21
  default?: boolean;
20
22
  }
21
23
  export interface ColumnItem {
@@ -33,23 +35,28 @@ export interface LayoutSection {
33
35
  columns: ColumnItem[];
34
36
  }
35
37
  export interface TemplateResponse {
36
- id: string;
37
- object: string;
38
- master: boolean;
39
- live_mode: boolean;
40
- api_version: string;
41
- feature_version: string;
42
- created: number;
43
- updated: number;
38
+ templateId: string;
44
39
  segment: string;
45
40
  app: string;
46
41
  service: string;
42
+ name: string;
43
+ layout: LayoutSection[];
44
+ id: {
45
+ timestamp: number;
46
+ date: string;
47
+ };
48
+ masterTemplateId: string;
47
49
  user: {
48
50
  id: string;
49
51
  };
50
- name: string;
52
+ created: number;
53
+ updated: number;
51
54
  default: boolean;
52
- layout: LayoutSection[];
55
+ object?: string;
56
+ master?: boolean;
57
+ live_mode?: boolean;
58
+ api_version?: string;
59
+ feature_version?: string;
53
60
  }
54
61
  export interface TemplatesListResponse {
55
62
  object: string;
@@ -74,6 +81,7 @@ export interface CreateCustomViewDialogProps {
74
81
  editingView?: {
75
82
  id: string;
76
83
  label: string;
84
+ templateId?: string;
77
85
  submenu?: ColumnViewProps[];
78
86
  } | null;
79
87
  onDelete?: (viewId: string) => Promise<void>;
@@ -84,7 +92,7 @@ export interface ColumnCheckState {
84
92
  checked: boolean;
85
93
  indeterminate: boolean;
86
94
  }
87
- export interface ViewsManagerProps {
95
+ export interface ViewSelectorProps {
88
96
  onViewChange?: TableHeaderProps['onViewChange'];
89
97
  setIsViewVisible: (visible: boolean) => void;
90
98
  setTableViews?: TableHeaderProps['setTableViews'];
@@ -102,7 +110,7 @@ export interface ViewsManagerProps {
102
110
  layout: LayoutSection;
103
111
  }) => Promise<void>;
104
112
  onDeleteCustomView?: (viewId: string) => Promise<void>;
105
- mode?: ViewMode;
113
+ tableMode?: import('../../../types/index.js').TableMode;
106
114
  onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
107
115
  initialTableViews?: ColumnViewProps[];
108
116
  onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
@@ -115,7 +123,7 @@ export interface ViewsDropdownProps {
115
123
  open: boolean;
116
124
  selectedViewInfo: ViewOption;
117
125
  setSelectedViewInfo: (selected: ViewOption) => void;
118
- onSelect: (e: React.MouseEvent<HTMLDivElement>) => void;
126
+ onSelect: (e: React.MouseEvent<HTMLDivElement>, templateId?: string) => void;
119
127
  setViews?: (views: string[]) => void;
120
128
  anchorEl: Element | null;
121
129
  tableViews?: ColumnViewProps[];
@@ -167,9 +175,6 @@ export interface UseCreateViewDialogProps {
167
175
  }
168
176
  export interface UseViewsManagerProps {
169
177
  mode: ViewMode;
170
- layoutData?: LayoutSection[];
171
- initialTableViews?: ColumnViewProps[];
172
- initialCustomViews?: ViewMenuItem[];
173
178
  templates?: TemplatesListResponse | TemplateResponse[];
174
179
  lang?: string;
175
180
  }
@@ -22,13 +22,21 @@ 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
- id: string;
28
+ id: string | {
29
+ timestamp: number;
30
+ date: string;
31
+ };
28
32
  name: string;
29
33
  default: boolean;
30
34
  layout: LayoutSection[];
31
- }>, mode?: ViewMode, lang?: string) => ViewMenuItem[];
35
+ templateId: string;
36
+ }>, mode?: ViewMode, lang?: string) => {
37
+ customViews: ViewMenuItem[];
38
+ defaultTemplateColumns?: ColumnViewProps[] | undefined;
39
+ };
32
40
  /**
33
41
  * Convert ColumnViewProps back to LayoutSection format for API requests
34
42
  */
@@ -1,4 +1,4 @@
1
- import { advancedColumns, sheetColumns } from './data';
1
+ // Note: advancedColumns and sheetColumns are only used in demo - not imported here to avoid default data
2
2
  /**
3
3
  * Transform API layout response to internal ColumnViewProps format
4
4
  */
@@ -35,7 +35,8 @@ export const getColumnsByMode = (mode, layoutData) => {
35
35
  return transformLayoutToColumns([section]);
36
36
  }
37
37
  }
38
- return mode === 'advanced' ? [...advancedColumns] : [...sheetColumns];
38
+ // Return empty array - all data should come from API
39
+ return [];
39
40
  };
40
41
  export const isDateColumn = (name) => {
41
42
  return name.toLowerCase() === 'date';
@@ -93,21 +94,36 @@ export const setViewAsDefault = (views, viewId) => {
93
94
  /**
94
95
  * Transform API templates response to ViewMenuItem array
95
96
  * Filters templates by mode and only shows the section matching the current mode
97
+ * Separates default templates (to be merged into built-in Default view) from custom views
96
98
  */
97
99
  export const transformTemplatesToViewMenuItems = (templates, mode = 'sheet', lang = 'en') => {
98
- return templates.map((template) => {
100
+ const customViews = [];
101
+ let defaultTemplateColumns;
102
+ templates.forEach((template) => {
99
103
  // Get columns for the specified mode
100
104
  const section = template.layout.find((s) => s.code.toLowerCase() === mode.toLowerCase());
101
105
  const columns = section ? transformLayoutToColumns([section], lang) : [];
102
- return {
103
- id: template.id,
104
- label: template.name,
105
- isCustom: true,
106
- default: template.default,
107
- columns: columns.map((col) => col.name),
108
- submenu: columns,
109
- };
106
+ // Handle id as either string or object
107
+ const templateIdString = typeof template.id === 'string' ? template.id : template.templateId;
108
+ const viewId = typeof template.id === 'string' ? template.id : template.templateId;
109
+ if (template.default) {
110
+ // Store default template columns to merge into built-in Default view
111
+ defaultTemplateColumns = columns;
112
+ }
113
+ else {
114
+ // Add non-default templates as custom views
115
+ customViews.push({
116
+ id: viewId,
117
+ templateId: template.templateId,
118
+ label: template.name,
119
+ isCustom: true,
120
+ default: false,
121
+ columns: columns.map((col) => col.name),
122
+ submenu: columns,
123
+ });
124
+ }
110
125
  });
126
+ return { customViews, defaultTemplateColumns };
111
127
  };
112
128
  /**
113
129
  * Convert ColumnViewProps back to LayoutSection format for API requests
@@ -23,7 +23,7 @@ export interface TableHeaderProps<IStatus extends TableHeaderStatus | TableHeade
23
23
  calendarMode?: CalenderMode;
24
24
  onStatusChange?: <T extends IStatus>(status?: T) => void;
25
25
  onSearch?: (search: string) => void;
26
- onViewChange?: () => void;
26
+ onViewChange?: (templateId?: string) => void;
27
27
  onDateChange?: (date: Date | [Date, Date]) => void;
28
28
  tableReportsComponent?: React.ReactNode;
29
29
  tableFilterComponent?: React.ReactNode;
@@ -57,7 +57,6 @@ export interface TableHeaderProps<IStatus extends TableHeaderStatus | TableHeade
57
57
  layout: LayoutSection;
58
58
  }) => Promise<void>;
59
59
  onDeleteCustomView?: (viewId: string) => Promise<void>;
60
- viewMode?: 'advanced' | 'sheet';
61
60
  onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
62
61
  initialTableViews?: ColumnViewProps[];
63
62
  onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@tap-payments/os-micro-frontend-shared",
3
3
  "description": "Shared components and utilities for Tap Payments micro frontends",
4
- "version": "0.1.372-test.1",
5
- "testVersion": 1,
4
+ "version": "0.1.372-test.2-test.3-test.4-test.5",
5
+ "testVersion": 5,
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
- };