@tap-payments/os-micro-frontend-shared 0.1.372-test.2-test.3-test.4-test.5-test.6-test.7 → 0.1.372-test.2-test.3-test.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/components/Sandbox/style.js +2 -3
- 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/CreateViewDialog.js +1 -2
- package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +1 -1
- package/build/components/TableHeader/TableView/ViewsDropdown.js +91 -108
- package/build/components/TableHeader/TableView/ViewsMenu.d.ts +5 -0
- package/build/components/TableHeader/TableView/ViewsMenu.js +76 -0
- package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +46 -23
- package/build/components/TableHeader/TableView/hooks/index.d.ts +1 -1
- package/build/components/TableHeader/TableView/hooks/index.js +1 -1
- package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +1 -3
- package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.js +2 -9
- package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +5 -8
- package/build/components/TableHeader/TableView/hooks/useViewsManager.js +50 -94
- package/build/components/TableHeader/TableView/hooks/useViewsMenu.d.ts +44 -0
- package/build/components/TableHeader/TableView/hooks/useViewsMenu.js +177 -0
- package/build/components/TableHeader/TableView/index.d.ts +3 -3
- package/build/components/TableHeader/TableView/index.js +2 -4
- package/build/components/TableHeader/TableView/styles.js +11 -2
- package/build/components/TableHeader/TableView/types.d.ts +34 -31
- package/build/components/TableHeader/TableView/utils.d.ts +5 -5
- package/build/components/TableHeader/TableView/utils.js +16 -4
- package/build/components/TableHeader/index.d.ts +1 -0
- package/build/components/TableHeader/type.d.ts +2 -8
- package/build/components/Toolbar/Toolbar.js +1 -1
- package/build/components/VirtualTables/VirtualTable/VirtualTable.d.ts +1 -1
- package/build/components/VirtualTables/VirtualTable/VirtualTable.js +4 -3
- package/build/constants/apps.js +2 -0
- package/build/constants/assets.d.ts +1 -0
- package/build/constants/assets.js +1 -0
- package/build/types/reports.d.ts +21 -0
- package/build/types/table.d.ts +1 -0
- package/build/utils/date.js +5 -3
- package/build/utils/index.d.ts +1 -0
- package/build/utils/index.js +1 -0
- package/build/utils/skeletonColumns.d.ts +4 -0
- package/build/utils/skeletonColumns.js +17 -0
- package/package.json +2 -2
- package/build/components/TableHeader/TableView/ViewSelector.d.ts +0 -5
- package/build/components/TableHeader/TableView/ViewSelector.js +0 -44
- package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +0 -56
- package/build/components/TableHeader/TableView/hooks/useViewSelector.js +0 -177
|
@@ -2,7 +2,7 @@ export { useSubMenu } from './useSubMenu';
|
|
|
2
2
|
export { useViewColumns } from './useViewColumns';
|
|
3
3
|
export { useColumnItem } from './useColumnItem';
|
|
4
4
|
export { useViewsManager } from './useViewsManager';
|
|
5
|
-
export {
|
|
5
|
+
export { useViewsMenu } from './useViewsMenu';
|
|
6
6
|
export { useSubmenuHover } from './useSubmenuHover';
|
|
7
7
|
export { useOriginalColumns } from './useOriginalColumns';
|
|
8
8
|
export { useNestedSubmenu } from './useNestedSubmenu';
|
|
@@ -18,9 +18,7 @@ export const useCreateViewDialog = ({ open, availableColumns, defaultColumns, ed
|
|
|
18
18
|
if (wasClosed && open) {
|
|
19
19
|
if (editingView) {
|
|
20
20
|
// Use the saved submenu from editingView if available, otherwise fall back to defaultColumns
|
|
21
|
-
const savedColumns = editingView.submenu && editingView.submenu.length > 0
|
|
22
|
-
? editingView.submenu
|
|
23
|
-
: defaultColumns;
|
|
21
|
+
const savedColumns = editingView.submenu && editingView.submenu.length > 0 ? editingView.submenu : defaultColumns;
|
|
24
22
|
const otherColumns = initializeEditingColumns(savedColumns, availableColumns);
|
|
25
23
|
setSelectedColumns([dateColumn, ...otherColumns]);
|
|
26
24
|
// Ensure templateName is set to editingView.label (fallback to empty string if undefined)
|
|
@@ -1,22 +1,15 @@
|
|
|
1
1
|
import { useState, useRef, useCallback } from 'react';
|
|
2
|
-
import { SUBMENU_CLOSE_DELAY } from '../constants';
|
|
3
2
|
export const useNestedSubmenu = () => {
|
|
4
3
|
const [hoveredNestedColumn, setHoveredNestedColumn] = useState(null);
|
|
5
4
|
const [nestedSubmenuAnchorEl, setNestedSubmenuAnchorEl] = useState(null);
|
|
6
5
|
const nestedCloseTimeoutRef = useRef(null);
|
|
7
6
|
const openNestedSubmenu = useCallback((columnName, element) => {
|
|
8
|
-
if (nestedCloseTimeoutRef.current) {
|
|
9
|
-
clearTimeout(nestedCloseTimeoutRef.current);
|
|
10
|
-
nestedCloseTimeoutRef.current = null;
|
|
11
|
-
}
|
|
12
7
|
setHoveredNestedColumn(columnName);
|
|
13
8
|
setNestedSubmenuAnchorEl(element);
|
|
14
9
|
}, []);
|
|
15
10
|
const closeNestedSubmenu = useCallback(() => {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
setNestedSubmenuAnchorEl(null);
|
|
19
|
-
}, SUBMENU_CLOSE_DELAY);
|
|
11
|
+
setHoveredNestedColumn(null);
|
|
12
|
+
setNestedSubmenuAnchorEl(null);
|
|
20
13
|
}, []);
|
|
21
14
|
const cancelNestedClose = useCallback(() => {
|
|
22
15
|
if (nestedCloseTimeoutRef.current) {
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
1
|
import type { ColumnViewProps } from '../../../../types/index.js';
|
|
3
2
|
import type { UseViewsManagerProps, ViewMenuItem } from '../types';
|
|
4
|
-
export declare const useViewsManager: ({
|
|
5
|
-
defaultColumns: ColumnViewProps[];
|
|
6
|
-
setDefaultColumns: import("react").Dispatch<import("react").SetStateAction<ColumnViewProps[]>>;
|
|
7
|
-
internalTableViews: ColumnViewProps[];
|
|
8
|
-
setInternalTableViews: import("react").Dispatch<import("react").SetStateAction<ColumnViewProps[]>>;
|
|
9
|
-
internalCustomViews: ViewMenuItem[];
|
|
10
|
-
setInternalCustomViews: import("react").Dispatch<import("react").SetStateAction<ViewMenuItem[]>>;
|
|
3
|
+
export declare const useViewsManager: ({ tableMode, templates, lang }: UseViewsManagerProps) => {
|
|
11
4
|
defaultTemplate: ViewMenuItem | undefined;
|
|
5
|
+
customViews: ViewMenuItem[];
|
|
6
|
+
allTemplates: ViewMenuItem[];
|
|
7
|
+
defaultColumns: ColumnViewProps[];
|
|
8
|
+
updateDefaultColumns: (columns: ColumnViewProps[]) => void;
|
|
12
9
|
};
|
|
@@ -1,106 +1,62 @@
|
|
|
1
|
-
import { useState, useEffect, useMemo } from 'react';
|
|
2
|
-
import { transformTemplatesToViewMenuItems } from '../utils';
|
|
3
|
-
export const useViewsManager = ({
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
code: mode === 'advanced' ? 'Advanced' : 'Sheet',
|
|
16
|
-
columns: defaultTemplateColumns.map((col, idx) => {
|
|
17
|
-
var _a, _b;
|
|
18
|
-
return ({
|
|
19
|
-
code: col.name,
|
|
20
|
-
name: [{ text: typeof col.label === 'string' ? col.label : col.name, lang }],
|
|
21
|
-
order: idx + 1,
|
|
22
|
-
default: (_a = col.selected) !== null && _a !== void 0 ? _a : false,
|
|
23
|
-
fields: (_b = col.menuItems) === null || _b === void 0 ? void 0 : _b.map((item) => {
|
|
24
|
-
var _a;
|
|
25
|
-
return ({
|
|
26
|
-
code: item.name,
|
|
27
|
-
name: [{ text: typeof item.label === 'string' ? item.label : item.name, lang: '' }],
|
|
28
|
-
default: (_a = item.selected) !== null && _a !== void 0 ? _a : false,
|
|
29
|
-
});
|
|
30
|
-
}),
|
|
31
|
-
});
|
|
32
|
-
}),
|
|
33
|
-
},
|
|
34
|
-
]
|
|
35
|
-
: [];
|
|
1
|
+
import { useState, useEffect, useMemo, useCallback } from 'react';
|
|
2
|
+
import { transformTemplatesToViewMenuItems, deepCloneColumns } from '../utils';
|
|
3
|
+
export const useViewsManager = ({ tableMode, templates, lang = 'en' }) => {
|
|
4
|
+
const parsedTemplates = useMemo(() => {
|
|
5
|
+
if (!templates || templates.length === 0) {
|
|
6
|
+
return {
|
|
7
|
+
customViews: [],
|
|
8
|
+
defaultTemplate: undefined,
|
|
9
|
+
templateDefaultColumns: [],
|
|
10
|
+
allTemplates: [],
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const { customViews, defaultTemplate } = transformTemplatesToViewMenuItems(templates, tableMode, lang);
|
|
14
|
+
const allTemplates = defaultTemplate ? [defaultTemplate, ...customViews] : customViews;
|
|
36
15
|
return {
|
|
37
16
|
customViews,
|
|
38
|
-
layoutData: effectiveLayoutData,
|
|
39
|
-
defaultTemplateColumns,
|
|
40
17
|
defaultTemplate,
|
|
18
|
+
templateDefaultColumns: (defaultTemplate === null || defaultTemplate === void 0 ? void 0 : defaultTemplate.submenu) || [],
|
|
19
|
+
allTemplates,
|
|
41
20
|
};
|
|
42
|
-
}, [templates,
|
|
43
|
-
const [defaultColumns, setDefaultColumns] = useState(
|
|
44
|
-
|
|
45
|
-
if (templates) {
|
|
46
|
-
const templatesArray = Array.isArray(templates) ? templates : templates.templates;
|
|
47
|
-
const { defaultTemplateColumns } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
|
|
48
|
-
if (defaultTemplateColumns) {
|
|
49
|
-
return defaultTemplateColumns;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// Return empty array if no templates
|
|
53
|
-
return [];
|
|
54
|
-
});
|
|
55
|
-
const [internalTableViews, setInternalTableViews] = useState(() => {
|
|
56
|
-
// Initialize from templates only
|
|
57
|
-
if (templates) {
|
|
58
|
-
const templatesArray = Array.isArray(templates) ? templates : templates.templates;
|
|
59
|
-
const { defaultTemplateColumns } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
|
|
60
|
-
if (defaultTemplateColumns) {
|
|
61
|
-
return defaultTemplateColumns;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return [];
|
|
65
|
-
});
|
|
66
|
-
const [internalCustomViews, setInternalCustomViews] = useState(() => {
|
|
67
|
-
// Initialize from templates only
|
|
68
|
-
if (templates) {
|
|
69
|
-
const templatesArray = Array.isArray(templates) ? templates : templates.templates;
|
|
70
|
-
const { customViews } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
|
|
71
|
-
return customViews || [];
|
|
72
|
-
}
|
|
73
|
-
return [];
|
|
74
|
-
});
|
|
21
|
+
}, [templates, tableMode, lang]);
|
|
22
|
+
const [defaultColumns, setDefaultColumns] = useState([]);
|
|
23
|
+
const [initializedMode, setInitializedMode] = useState(null);
|
|
75
24
|
useEffect(() => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
setDefaultColumns(transformedTemplates.defaultTemplateColumns);
|
|
80
|
-
setInternalTableViews(transformedTemplates.defaultTemplateColumns);
|
|
25
|
+
if (initializedMode !== tableMode && parsedTemplates.templateDefaultColumns.length > 0) {
|
|
26
|
+
setDefaultColumns(deepCloneColumns(parsedTemplates.templateDefaultColumns));
|
|
27
|
+
setInitializedMode(tableMode);
|
|
81
28
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
29
|
+
}, [tableMode, parsedTemplates.templateDefaultColumns, initializedMode]);
|
|
30
|
+
const updateDefaultColumns = useCallback((columns) => {
|
|
31
|
+
setDefaultColumns(deepCloneColumns(columns));
|
|
32
|
+
}, []);
|
|
33
|
+
const updatedDefaultTemplate = useMemo(() => {
|
|
34
|
+
if (!parsedTemplates.defaultTemplate) {
|
|
35
|
+
return parsedTemplates.defaultTemplate;
|
|
86
36
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
37
|
+
const columnsToUse = initializedMode !== tableMode ? parsedTemplates.templateDefaultColumns : defaultColumns;
|
|
38
|
+
if (columnsToUse.length === 0) {
|
|
39
|
+
return parsedTemplates.defaultTemplate;
|
|
40
|
+
}
|
|
41
|
+
return Object.assign(Object.assign({}, parsedTemplates.defaultTemplate), { submenu: columnsToUse, columns: columnsToUse.map((col) => col.name) });
|
|
42
|
+
}, [parsedTemplates.defaultTemplate, parsedTemplates.templateDefaultColumns, defaultColumns, initializedMode, tableMode]);
|
|
43
|
+
const updatedAllTemplates = useMemo(() => {
|
|
44
|
+
if (!updatedDefaultTemplate) {
|
|
45
|
+
return parsedTemplates.customViews;
|
|
92
46
|
}
|
|
93
|
-
|
|
94
|
-
|
|
47
|
+
return [updatedDefaultTemplate, ...parsedTemplates.customViews];
|
|
48
|
+
}, [updatedDefaultTemplate, parsedTemplates.customViews]);
|
|
49
|
+
const effectiveDefaultColumns = useMemo(() => {
|
|
50
|
+
if (initializedMode !== tableMode && defaultColumns.length === 0) {
|
|
51
|
+
return parsedTemplates.templateDefaultColumns;
|
|
95
52
|
}
|
|
96
|
-
|
|
53
|
+
return defaultColumns.length > 0 ? defaultColumns : parsedTemplates.templateDefaultColumns;
|
|
54
|
+
}, [initializedMode, tableMode, defaultColumns, parsedTemplates.templateDefaultColumns]);
|
|
97
55
|
return {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
setInternalCustomViews,
|
|
104
|
-
defaultTemplate: transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplate,
|
|
56
|
+
defaultTemplate: updatedDefaultTemplate,
|
|
57
|
+
customViews: parsedTemplates.customViews,
|
|
58
|
+
allTemplates: updatedAllTemplates,
|
|
59
|
+
defaultColumns: effectiveDefaultColumns,
|
|
60
|
+
updateDefaultColumns,
|
|
105
61
|
};
|
|
106
62
|
};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type MouseEvent } from 'react';
|
|
2
|
+
import type { ColumnViewProps, TableMode } from '../../../../types/index.js';
|
|
3
|
+
import type { ViewMenuItem, LayoutSection } from '../types';
|
|
4
|
+
import type { ViewOption } from '../../type';
|
|
5
|
+
export interface UseViewsMenuProps {
|
|
6
|
+
mode: TableMode;
|
|
7
|
+
onViewChange?: (selectedView?: ViewMenuItem) => void;
|
|
8
|
+
onCreateCustomView?: (data: {
|
|
9
|
+
name: string;
|
|
10
|
+
selectedColumns: ColumnViewProps[];
|
|
11
|
+
layout: LayoutSection;
|
|
12
|
+
}) => Promise<void>;
|
|
13
|
+
onEditCustomView?: (viewId: string, data: {
|
|
14
|
+
name: string;
|
|
15
|
+
selectedColumns: ColumnViewProps[];
|
|
16
|
+
layout: LayoutSection;
|
|
17
|
+
}) => Promise<void>;
|
|
18
|
+
onDeleteCustomView?: (viewId: string) => Promise<void>;
|
|
19
|
+
defaultColumns: ColumnViewProps[];
|
|
20
|
+
defaultTemplate?: ViewMenuItem;
|
|
21
|
+
allTemplates: ViewMenuItem[];
|
|
22
|
+
}
|
|
23
|
+
export declare const useViewsMenu: ({ mode, onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, defaultColumns, defaultTemplate, allTemplates, }: UseViewsMenuProps) => {
|
|
24
|
+
anchorEl: HTMLDivElement | null;
|
|
25
|
+
isCreateDialogOpen: boolean;
|
|
26
|
+
editingView: ViewMenuItem | null;
|
|
27
|
+
selectedViewInfo: ViewOption;
|
|
28
|
+
shouldUseCurrentState: boolean;
|
|
29
|
+
selectedView: ViewMenuItem | undefined;
|
|
30
|
+
currentViewColumns: ColumnViewProps[];
|
|
31
|
+
handleViewButtonClick: (event: MouseEvent<HTMLDivElement>) => void;
|
|
32
|
+
handleCloseViewDropdown: () => void;
|
|
33
|
+
handleSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
|
|
34
|
+
handleOpenCreateDialog: (useCurrentState?: boolean) => void;
|
|
35
|
+
handleOpenEditDialog: (view: ViewMenuItem) => void;
|
|
36
|
+
handleCloseCreateDialog: () => void;
|
|
37
|
+
handleSaveView: (data: {
|
|
38
|
+
name: string;
|
|
39
|
+
selectedColumns: ColumnViewProps[];
|
|
40
|
+
layout: LayoutSection;
|
|
41
|
+
}) => Promise<void>;
|
|
42
|
+
handleDeleteView: (viewId: string) => Promise<void>;
|
|
43
|
+
updateSelectedView: (updatedView: ViewMenuItem) => void;
|
|
44
|
+
};
|
|
@@ -0,0 +1,177 @@
|
|
|
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, useEffect, useRef } from 'react';
|
|
11
|
+
import { deepCloneColumns } from '../utils';
|
|
12
|
+
export const useViewsMenu = ({ mode, onViewChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, defaultColumns, defaultTemplate, allTemplates, }) => {
|
|
13
|
+
const [anchorEl, setAnchorEl] = useState(null);
|
|
14
|
+
const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);
|
|
15
|
+
const [editingView, setEditingView] = useState(null);
|
|
16
|
+
const [selectedViewInfo, setSelectedViewInfo] = useState({ id: 'default', label: 'Default' });
|
|
17
|
+
const [shouldUseCurrentState, setShouldUseCurrentState] = useState(false);
|
|
18
|
+
const [selectedView, setSelectedView] = useState(undefined);
|
|
19
|
+
const [currentViewColumns, setCurrentViewColumns] = useState([]);
|
|
20
|
+
const hasInitializedRef = useRef(false);
|
|
21
|
+
const getViewForParent = useCallback((view) => {
|
|
22
|
+
var _a;
|
|
23
|
+
const selectedColumns = ((_a = view.submenu) === null || _a === void 0 ? void 0 : _a.filter((col) => col.selected)) || [];
|
|
24
|
+
return Object.assign(Object.assign({}, view), { submenu: selectedColumns, columns: selectedColumns.map((col) => col.name) });
|
|
25
|
+
}, []);
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
if (hasInitializedRef.current)
|
|
28
|
+
return;
|
|
29
|
+
if (!defaultTemplate)
|
|
30
|
+
return;
|
|
31
|
+
setSelectedView(defaultTemplate);
|
|
32
|
+
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
33
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(defaultTemplate));
|
|
34
|
+
hasInitializedRef.current = true;
|
|
35
|
+
}, [defaultTemplate, defaultColumns, onViewChange, getViewForParent]);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
if (!hasInitializedRef.current)
|
|
38
|
+
return;
|
|
39
|
+
if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.default) && defaultColumns.length > 0) {
|
|
40
|
+
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
41
|
+
}
|
|
42
|
+
}, [defaultColumns, selectedView === null || selectedView === void 0 ? void 0 : selectedView.default]);
|
|
43
|
+
const lastSyncedModeRef = useRef(null);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (!hasInitializedRef.current)
|
|
46
|
+
return;
|
|
47
|
+
if (!selectedView)
|
|
48
|
+
return;
|
|
49
|
+
const needsSync = lastSyncedModeRef.current !== mode;
|
|
50
|
+
if (!needsSync)
|
|
51
|
+
return;
|
|
52
|
+
if (selectedView.default) {
|
|
53
|
+
if (defaultColumns.length === 0)
|
|
54
|
+
return;
|
|
55
|
+
const newView = Object.assign(Object.assign({}, selectedView), { submenu: deepCloneColumns(defaultColumns), columns: defaultColumns.map((col) => col.name) });
|
|
56
|
+
setSelectedView(newView);
|
|
57
|
+
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
58
|
+
lastSyncedModeRef.current = mode;
|
|
59
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(newView));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const updatedTemplate = allTemplates.find((t) => t.templateId === selectedView.templateId || t.id === selectedView.id);
|
|
63
|
+
if (updatedTemplate && updatedTemplate.submenu && updatedTemplate.submenu.length > 0) {
|
|
64
|
+
const newView = Object.assign(Object.assign({}, updatedTemplate), { submenu: deepCloneColumns(updatedTemplate.submenu) });
|
|
65
|
+
setSelectedView(newView);
|
|
66
|
+
setCurrentViewColumns(deepCloneColumns(updatedTemplate.submenu));
|
|
67
|
+
lastSyncedModeRef.current = mode;
|
|
68
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(newView));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}, [mode, defaultColumns, selectedView, allTemplates, onViewChange]);
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
if (!hasInitializedRef.current)
|
|
74
|
+
return;
|
|
75
|
+
if (!selectedView)
|
|
76
|
+
return;
|
|
77
|
+
const updatedTemplate = allTemplates.find((t) => {
|
|
78
|
+
const templateId = t.templateId || t.id;
|
|
79
|
+
const selectedId = selectedView.templateId || selectedView.id;
|
|
80
|
+
return templateId === selectedId;
|
|
81
|
+
});
|
|
82
|
+
if (!updatedTemplate)
|
|
83
|
+
return;
|
|
84
|
+
const currentSubmenu = selectedView.submenu || [];
|
|
85
|
+
const updatedSubmenu = updatedTemplate.submenu || [];
|
|
86
|
+
const hasChanged = currentSubmenu.length !== updatedSubmenu.length ||
|
|
87
|
+
currentSubmenu.some((col, idx) => {
|
|
88
|
+
const updatedCol = updatedSubmenu[idx];
|
|
89
|
+
if (!updatedCol)
|
|
90
|
+
return true;
|
|
91
|
+
return col.selected !== updatedCol.selected || col.name !== updatedCol.name;
|
|
92
|
+
});
|
|
93
|
+
if (hasChanged) {
|
|
94
|
+
const fullView = Object.assign(Object.assign({}, updatedTemplate), { submenu: deepCloneColumns(updatedTemplate.submenu || []) });
|
|
95
|
+
setSelectedView(fullView);
|
|
96
|
+
setCurrentViewColumns(deepCloneColumns(updatedTemplate.submenu || []));
|
|
97
|
+
const viewForParent = getViewForParent(fullView);
|
|
98
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(viewForParent);
|
|
99
|
+
}
|
|
100
|
+
}, [allTemplates, selectedView, onViewChange]);
|
|
101
|
+
const handleViewButtonClick = useCallback((event) => {
|
|
102
|
+
setAnchorEl((current) => (current ? null : event.currentTarget));
|
|
103
|
+
}, []);
|
|
104
|
+
const handleCloseViewDropdown = useCallback(() => {
|
|
105
|
+
setAnchorEl(null);
|
|
106
|
+
}, []);
|
|
107
|
+
const handleSelectedViewInfo = useCallback((selected, viewMenuItem) => {
|
|
108
|
+
setSelectedViewInfo(selected);
|
|
109
|
+
const newSelectedView = viewMenuItem || undefined;
|
|
110
|
+
setSelectedView(newSelectedView);
|
|
111
|
+
setCurrentViewColumns(deepCloneColumns((newSelectedView === null || newSelectedView === void 0 ? void 0 : newSelectedView.submenu) || []));
|
|
112
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newSelectedView ? getViewForParent(newSelectedView) : undefined);
|
|
113
|
+
handleCloseViewDropdown();
|
|
114
|
+
}, [handleCloseViewDropdown, onViewChange, getViewForParent]);
|
|
115
|
+
const updateSelectedView = useCallback((updatedView) => {
|
|
116
|
+
const viewWithNewRefs = Object.assign(Object.assign({}, updatedView), { submenu: updatedView.submenu ? [...updatedView.submenu] : undefined, columns: updatedView.columns ? [...updatedView.columns] : undefined });
|
|
117
|
+
setSelectedView(viewWithNewRefs);
|
|
118
|
+
setCurrentViewColumns(deepCloneColumns(viewWithNewRefs.submenu || []));
|
|
119
|
+
setSelectedViewInfo({ id: viewWithNewRefs.id, label: viewWithNewRefs.label });
|
|
120
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(viewWithNewRefs));
|
|
121
|
+
}, [onViewChange, getViewForParent]);
|
|
122
|
+
const handleOpenCreateDialog = useCallback((useCurrentState = false) => {
|
|
123
|
+
setEditingView(null);
|
|
124
|
+
setShouldUseCurrentState(useCurrentState);
|
|
125
|
+
setIsCreateDialogOpen(true);
|
|
126
|
+
setAnchorEl(null);
|
|
127
|
+
}, []);
|
|
128
|
+
const handleOpenEditDialog = useCallback((view) => {
|
|
129
|
+
setEditingView(view);
|
|
130
|
+
setShouldUseCurrentState(true);
|
|
131
|
+
setIsCreateDialogOpen(true);
|
|
132
|
+
}, []);
|
|
133
|
+
const handleCloseCreateDialog = useCallback(() => {
|
|
134
|
+
setIsCreateDialogOpen(false);
|
|
135
|
+
setEditingView(null);
|
|
136
|
+
setShouldUseCurrentState(false);
|
|
137
|
+
}, []);
|
|
138
|
+
const handleSaveView = useCallback((data) => __awaiter(void 0, void 0, void 0, function* () {
|
|
139
|
+
if (editingView) {
|
|
140
|
+
const templateId = editingView.templateId || editingView.id;
|
|
141
|
+
yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(templateId, data));
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
yield (onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(data));
|
|
145
|
+
}
|
|
146
|
+
}), [editingView, onEditCustomView, onCreateCustomView]);
|
|
147
|
+
const handleDeleteView = useCallback((viewId) => __awaiter(void 0, void 0, void 0, function* () {
|
|
148
|
+
const viewToDelete = allTemplates.find((view) => view.id === viewId || view.templateId === viewId);
|
|
149
|
+
const templateId = (viewToDelete === null || viewToDelete === void 0 ? void 0 : viewToDelete.templateId) || viewId;
|
|
150
|
+
yield (onDeleteCustomView === null || onDeleteCustomView === void 0 ? void 0 : onDeleteCustomView(templateId));
|
|
151
|
+
if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.id) === viewId || (selectedView === null || selectedView === void 0 ? void 0 : selectedView.templateId) === viewId) {
|
|
152
|
+
setSelectedView(defaultTemplate);
|
|
153
|
+
setCurrentViewColumns(deepCloneColumns(defaultColumns));
|
|
154
|
+
if (defaultTemplate) {
|
|
155
|
+
onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(getViewForParent(defaultTemplate));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}), [allTemplates, onDeleteCustomView, selectedView, defaultTemplate, defaultColumns, onViewChange, getViewForParent]);
|
|
159
|
+
return {
|
|
160
|
+
anchorEl,
|
|
161
|
+
isCreateDialogOpen,
|
|
162
|
+
editingView,
|
|
163
|
+
selectedViewInfo,
|
|
164
|
+
shouldUseCurrentState,
|
|
165
|
+
selectedView,
|
|
166
|
+
currentViewColumns,
|
|
167
|
+
handleViewButtonClick,
|
|
168
|
+
handleCloseViewDropdown,
|
|
169
|
+
handleSelectedViewInfo,
|
|
170
|
+
handleOpenCreateDialog,
|
|
171
|
+
handleOpenEditDialog,
|
|
172
|
+
handleCloseCreateDialog,
|
|
173
|
+
handleSaveView,
|
|
174
|
+
handleDeleteView,
|
|
175
|
+
updateSelectedView,
|
|
176
|
+
};
|
|
177
|
+
};
|
|
@@ -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 ViewsMenu } from './ViewsMenu';
|
|
6
6
|
export { default as ViewsDropdown } from './ViewsDropdown';
|
|
7
7
|
export { default as CreateViewDialog } from './CreateViewDialog';
|
|
8
|
-
export type { ViewMenuItem,
|
|
8
|
+
export type { ViewMenuItem, CreateCustomViewDialogProps, LayoutSection, ColumnItem, FieldItem, Template, CreateTemplatePayload, UpdateTemplatePayload, } from './types';
|
|
9
9
|
export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState, } from './utils';
|
|
10
|
-
export { useSubmenuHover } from './hooks';
|
|
10
|
+
export { useSubmenuHover, useViewsManager, useViewsMenu } 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,12 +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 ViewsMenu } from './ViewsMenu';
|
|
6
6
|
export { default as ViewsDropdown } from './ViewsDropdown';
|
|
7
7
|
export { default as CreateViewDialog } from './CreateViewDialog';
|
|
8
8
|
export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState, } from './utils';
|
|
9
|
-
export { useSubmenuHover } from './hooks';
|
|
9
|
+
export { useSubmenuHover, useViewsManager, useViewsMenu } 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
|
|
13
11
|
export { defaultViewList, advancedColumns, sheetColumns } from './data';
|
|
@@ -350,18 +350,24 @@ export const ResetCheckboxSx = {
|
|
|
350
350
|
};
|
|
351
351
|
export const SubmenuContainer = styled(Box)(() => ({
|
|
352
352
|
minWidth: 200,
|
|
353
|
+
display: 'flex',
|
|
354
|
+
flexDirection: 'column',
|
|
355
|
+
maxHeight: '80vh',
|
|
356
|
+
overflow: 'hidden',
|
|
353
357
|
}));
|
|
354
358
|
export const ColumnItemsContainer = styled(Box)(() => ({
|
|
355
|
-
|
|
359
|
+
flex: 1,
|
|
356
360
|
overflowY: 'auto',
|
|
357
361
|
paddingLeft: 6,
|
|
358
362
|
paddingRight: 6,
|
|
363
|
+
minHeight: 0,
|
|
359
364
|
}));
|
|
360
365
|
export const SaveCustomViewBox = styled(Box)(() => ({
|
|
361
366
|
paddingLeft: 8,
|
|
362
367
|
paddingRight: 8,
|
|
363
368
|
paddingTop: 8,
|
|
364
369
|
paddingBottom: 8,
|
|
370
|
+
flexShrink: 0,
|
|
365
371
|
}));
|
|
366
372
|
export const SaveCustomViewInnerBox = styled(Box)(({ disabled }) => ({
|
|
367
373
|
width: '100%',
|
|
@@ -376,7 +382,7 @@ export const SaveCustomViewInnerBox = styled(Box)(({ disabled }) => ({
|
|
|
376
382
|
cursor: disabled ? 'not-allowed' : 'pointer',
|
|
377
383
|
opacity: disabled ? 0.5 : 1,
|
|
378
384
|
}));
|
|
379
|
-
export const ButtonsContainer = styled(Box)(() => ({
|
|
385
|
+
export const ButtonsContainer = styled(Box)(({ theme }) => ({
|
|
380
386
|
display: 'flex',
|
|
381
387
|
justifyContent: 'flex-end',
|
|
382
388
|
gap: 12,
|
|
@@ -384,6 +390,9 @@ export const ButtonsContainer = styled(Box)(() => ({
|
|
|
384
390
|
paddingBottom: 8,
|
|
385
391
|
paddingLeft: 12,
|
|
386
392
|
paddingRight: 12,
|
|
393
|
+
flexShrink: 0,
|
|
394
|
+
borderTop: '1px solid',
|
|
395
|
+
borderColor: theme.palette.divider,
|
|
387
396
|
}));
|
|
388
397
|
export const CancelButtonSx = {
|
|
389
398
|
fontSize: 11,
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import type { ColumnViewProps } from '../../../types/index.js';
|
|
1
|
+
import type { ColumnViewProps, TableMode } from '../../../types/index.js';
|
|
3
2
|
import type { TableHeaderProps, ViewOption } from '../type';
|
|
4
|
-
export type ViewMode = 'advanced' | 'sheet';
|
|
5
3
|
export interface ViewMenuItem {
|
|
6
4
|
label: string;
|
|
7
5
|
id: string;
|
|
@@ -34,7 +32,24 @@ export interface LayoutSection {
|
|
|
34
32
|
code: string;
|
|
35
33
|
columns: ColumnItem[];
|
|
36
34
|
}
|
|
37
|
-
export interface
|
|
35
|
+
export interface TemplateAPIMetadata {
|
|
36
|
+
segment: string;
|
|
37
|
+
app: string;
|
|
38
|
+
service: string;
|
|
39
|
+
user: {
|
|
40
|
+
id: string;
|
|
41
|
+
};
|
|
42
|
+
master_template_id?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface CreateTemplatePayload extends TemplateAPIMetadata {
|
|
45
|
+
name: string;
|
|
46
|
+
layout: LayoutSection[];
|
|
47
|
+
}
|
|
48
|
+
export interface UpdateTemplatePayload extends TemplateAPIMetadata {
|
|
49
|
+
name: string;
|
|
50
|
+
layout: LayoutSection[];
|
|
51
|
+
}
|
|
52
|
+
export interface Template {
|
|
38
53
|
templateId: string;
|
|
39
54
|
segment: string;
|
|
40
55
|
app: string;
|
|
@@ -52,20 +67,15 @@ export interface TemplateResponse {
|
|
|
52
67
|
created: number;
|
|
53
68
|
updated: number;
|
|
54
69
|
default: boolean;
|
|
55
|
-
object?: string;
|
|
56
|
-
master?: boolean;
|
|
57
|
-
live_mode?: boolean;
|
|
58
|
-
api_version?: string;
|
|
59
|
-
feature_version?: string;
|
|
60
70
|
}
|
|
61
|
-
export interface
|
|
71
|
+
export interface TemplatesList {
|
|
62
72
|
object: string;
|
|
63
73
|
live_mode: boolean;
|
|
64
74
|
api_version: string;
|
|
65
75
|
feature_version: string;
|
|
66
76
|
count: number;
|
|
67
77
|
has_more: boolean;
|
|
68
|
-
templates:
|
|
78
|
+
templates: Template[];
|
|
69
79
|
}
|
|
70
80
|
export interface CreateCustomViewDialogProps {
|
|
71
81
|
open: boolean;
|
|
@@ -85,19 +95,14 @@ export interface CreateCustomViewDialogProps {
|
|
|
85
95
|
} | null;
|
|
86
96
|
onDelete?: (viewId: string) => Promise<void>;
|
|
87
97
|
tableViews?: ColumnViewProps[];
|
|
88
|
-
mode?:
|
|
98
|
+
mode?: TableMode;
|
|
89
99
|
}
|
|
90
100
|
export interface ColumnCheckState {
|
|
91
101
|
checked: boolean;
|
|
92
102
|
indeterminate: boolean;
|
|
93
103
|
}
|
|
94
|
-
export interface
|
|
104
|
+
export interface ViewsMenuProps {
|
|
95
105
|
onViewChange?: TableHeaderProps['onViewChange'];
|
|
96
|
-
setIsViewVisible: (visible: boolean) => void;
|
|
97
|
-
setTableViews?: TableHeaderProps['setTableViews'];
|
|
98
|
-
tableViews?: TableHeaderProps['tableViews'];
|
|
99
|
-
resetTableViews?: TableHeaderProps['resetTableViews'];
|
|
100
|
-
customViews?: ViewMenuItem[];
|
|
101
106
|
onCreateCustomView?: (data: {
|
|
102
107
|
name: string;
|
|
103
108
|
selectedColumns: ColumnViewProps[];
|
|
@@ -109,29 +114,26 @@ export interface ViewSelectorProps {
|
|
|
109
114
|
layout: LayoutSection;
|
|
110
115
|
}) => Promise<void>;
|
|
111
116
|
onDeleteCustomView?: (viewId: string) => Promise<void>;
|
|
112
|
-
tableMode?:
|
|
113
|
-
|
|
114
|
-
initialTableViews?: ColumnViewProps[];
|
|
115
|
-
onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
|
|
116
|
-
initialCustomViews?: ViewMenuItem[];
|
|
117
|
-
layoutData?: LayoutSection[];
|
|
118
|
-
templates?: TemplatesListResponse | TemplateResponse[];
|
|
117
|
+
tableMode?: TableMode;
|
|
118
|
+
templates: Template[];
|
|
119
119
|
lang?: string;
|
|
120
120
|
}
|
|
121
121
|
export interface ViewsDropdownProps {
|
|
122
122
|
open: boolean;
|
|
123
123
|
selectedViewInfo: ViewOption;
|
|
124
124
|
setSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
|
|
125
|
-
onSelect: (e: React.MouseEvent<HTMLDivElement>, selectedView?: ViewMenuItem) => void;
|
|
126
|
-
setViews?: (views: string[]) => void;
|
|
127
125
|
anchorEl: Element | null;
|
|
128
|
-
|
|
129
|
-
|
|
126
|
+
defaultModified?: boolean;
|
|
127
|
+
onMarkDefaultModified?: () => void;
|
|
130
128
|
onCreateCustomView?: (useCurrentState?: boolean) => void;
|
|
131
129
|
customViews?: ViewMenuItem[];
|
|
132
130
|
onEditCustomView?: (view: ViewMenuItem) => void;
|
|
131
|
+
onSaveDefaultColumns?: (columns: ColumnViewProps[]) => void;
|
|
133
132
|
defaultColumns?: ColumnViewProps[];
|
|
134
133
|
setDefaultColumns?: (columns: ColumnViewProps[]) => void;
|
|
134
|
+
updateSelectedView?: (view: ViewMenuItem) => void;
|
|
135
|
+
mode?: TableMode;
|
|
136
|
+
defaultTemplate?: ViewMenuItem;
|
|
135
137
|
}
|
|
136
138
|
export interface ColumnListProps {
|
|
137
139
|
selectedColumns: ColumnViewProps[];
|
|
@@ -158,6 +160,7 @@ export interface ViewsSubmenuProps {
|
|
|
158
160
|
onReset: () => void;
|
|
159
161
|
onColumnToggle: (columnName: string) => void;
|
|
160
162
|
onNestedItemToggle: (columnName: string, subItemName: string) => void;
|
|
163
|
+
onReorder: (reorderedColumnNames: string[]) => void;
|
|
161
164
|
anchorEl: HTMLElement | null;
|
|
162
165
|
isModified?: boolean;
|
|
163
166
|
}
|
|
@@ -173,7 +176,7 @@ export interface UseCreateViewDialogProps {
|
|
|
173
176
|
tableViews?: ColumnViewProps[];
|
|
174
177
|
}
|
|
175
178
|
export interface UseViewsManagerProps {
|
|
176
|
-
|
|
177
|
-
templates
|
|
179
|
+
tableMode: TableMode;
|
|
180
|
+
templates: Template[];
|
|
178
181
|
lang?: string;
|
|
179
182
|
}
|