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

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.
@@ -40,7 +40,9 @@ function CreateViewDialog({ open, onClose, onCreate, availableColumns = [], isLo
40
40
  const handleDelete = () => __awaiter(this, void 0, void 0, function* () {
41
41
  if (!editingView)
42
42
  return;
43
- yield (onDelete === null || onDelete === void 0 ? void 0 : onDelete(editingView.id));
43
+ const templateId = editingView.templateId || editingView.id;
44
+ console.log({ templateId });
45
+ yield (onDelete === null || onDelete === void 0 ? void 0 : onDelete(templateId));
44
46
  onClose();
45
47
  });
46
48
  if (!open)
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import type { ViewSelectorProps } from './types';
3
- declare function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode, onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, templates, lang, }: ViewSelectorProps): import("react/jsx-runtime").JSX.Element;
3
+ declare function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode, onTableViewsChange, onCustomViewsChange, templates, lang, }: ViewSelectorProps): import("react/jsx-runtime").JSX.Element;
4
4
  declare const _default: import("react").MemoExoticComponent<typeof ViewSelector>;
5
5
  export default _default;
@@ -9,15 +9,12 @@ import CreateViewDialog from './CreateViewDialog';
9
9
  import { ViewWrapper } from './styles';
10
10
  import { useViewsManager } from './hooks';
11
11
  import { useViewSelector } from './hooks/useViewSelector';
12
- function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode = 'default', onTableViewsChange, initialTableViews, onCustomViewsChange, initialCustomViews, layoutData, templates, lang = 'en', }) {
12
+ function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode = 'default', onTableViewsChange, onCustomViewsChange, templates, lang = 'en', }) {
13
13
  const { t } = useTranslation();
14
14
  // Map tableMode to viewMode: 'sheet' → 'sheet', 'default' → 'advanced'
15
15
  const mode = tableMode === 'sheet' ? 'sheet' : 'advanced';
16
- const { defaultColumns, setDefaultColumns, internalTableViews, setInternalTableViews, internalCustomViews, setInternalCustomViews } = useViewsManager({
16
+ const { defaultColumns, setDefaultColumns, internalTableViews, setInternalTableViews, internalCustomViews, setInternalCustomViews, defaultTemplate, } = useViewsManager({
17
17
  mode,
18
- layoutData,
19
- initialTableViews,
20
- initialCustomViews,
21
18
  templates,
22
19
  lang,
23
20
  });
@@ -25,7 +22,7 @@ function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableView
25
22
  const customViews = externalCustomViews !== null && externalCustomViews !== void 0 ? externalCustomViews : internalCustomViews;
26
23
  const { anchorViewEl, defaultViewEl, setDefaultViewElement, isCreateDialogOpen, editingView, selectedViewInfo, shouldUseCurrentState, handleViewButtonClick, handleCloseViewDropdown, handleSelectedViewInfo, handleOpenCreateDialog, handleOpenEditDialog, handleCloseCreateDialog, handleSaveView, handleDeleteView, handleResetViews, handleTableViewsChange, } = useViewSelector({
27
24
  mode,
28
- layoutData,
25
+ onViewChange,
29
26
  onTableViewsChange,
30
27
  onCustomViewsChange,
31
28
  onCreateCustomView,
@@ -35,11 +32,12 @@ function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableView
35
32
  setTableViews,
36
33
  tableViews,
37
34
  customViews,
35
+ defaultColumns,
36
+ defaultTemplate,
38
37
  setInternalCustomViews,
39
38
  setInternalTableViews,
40
39
  });
41
- return (_jsxs(_Fragment, { children: [_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCloseViewDropdown }, { children: _jsxs(ViewWrapper, Object.assign({ sx: { width: '32px' }, "data-testid": "ViewSelector" }, { children: [_jsx(StyledButton, Object.assign({ title: t('tableView'), "data-testid": "ViewSelector_button", onClick: handleViewButtonClick }, { children: _jsx(Icon, { src: viewIcon, alt: "view", sx: { width: 14, height: 14 } }) })), _jsx(ViewsDropdown, { open: Boolean(defaultViewEl), anchorEl: anchorViewEl, setSelectedViewInfo: handleSelectedViewInfo, selectedViewInfo: selectedViewInfo, onSelect: (e) => {
42
- onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange();
40
+ 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
41
  setDefaultViewElement(defaultViewEl ? null : e.currentTarget);
44
42
  }, setViews: handleResetViews, tableViews: tableViews, setTableViews: handleTableViewsChange, onCreateCustomView: handleOpenCreateDialog, customViews: customViews, onEditCustomView: handleOpenEditDialog, defaultColumns: defaultColumns, setDefaultColumns: setDefaultColumns })] })) })), _jsx(CreateViewDialog, { open: isCreateDialogOpen, onClose: handleCloseCreateDialog, availableColumns: defaultColumns, defaultColumns: defaultColumns, onCreate: handleSaveView, editingView: editingView, onDelete: handleDeleteView, tableViews: shouldUseCurrentState ? defaultColumns : undefined, mode: mode })] }));
45
43
  }
@@ -38,6 +38,19 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
38
38
  const { hoveredNestedColumn, nestedSubmenuAnchorEl, openNestedSubmenu, closeNestedSubmenu, cancelNestedClose } = useNestedSubmenu();
39
39
  // Default templates are merged into built-in Default view, so no need to sort
40
40
  const viewList = [...defaultViewList, ...customViews];
41
+ const handleViewClick = (item) => {
42
+ if (item.columns)
43
+ setViews === null || setViews === void 0 ? void 0 : setViews(item.columns);
44
+ // Call onSelect with the full view object
45
+ const syntheticEvent = {
46
+ currentTarget: anchorEl || document.createElement('div'),
47
+ };
48
+ // Pass the full view object for custom views, undefined for default view
49
+ const viewToPass = item.isCustom ? item : undefined;
50
+ onSelect(syntheticEvent, viewToPass);
51
+ // Update selected view info with the view object
52
+ setSelectedViewInfo(item, viewToPass);
53
+ };
41
54
  const toggleColumnSelection = (columnName) => {
42
55
  if (!setDefaultColumns)
43
56
  return;
@@ -149,11 +162,7 @@ function ViewsDropdown({ open, selectedViewInfo, setSelectedViewInfo, onSelect,
149
162
  else if (hasSubmenu(item, defaultColumns)) {
150
163
  handleMenuItemLeave();
151
164
  }
152
- }, onClick: () => {
153
- setSelectedViewInfo(item);
154
- if (item.columns)
155
- setViews === null || setViews === void 0 ? void 0 : setViews(item.columns);
156
- }, sx: {
165
+ }, onClick: () => handleViewClick(item), sx: {
157
166
  position: 'relative',
158
167
  cursor: 'pointer',
159
168
  pr: 1.5,
@@ -26,7 +26,16 @@ export const ColumnList = ({ selectedColumns, columnNames, allSelected, someSele
26
26
  const isDate = isDateColumn(column.name);
27
27
  const hasSubmenu = column.menuItems && column.menuItems.length > 0;
28
28
  const { checked, indeterminate } = getColumnCheckState(column);
29
- return (_jsxs(Reorder.Item, Object.assign({ value: column.name, drag: !isDate, dragListener: !isDate, transition: { duration: 0 }, whileDrag: { zIndex: 9999, boxShadow: '0 4px 12px rgba(0,0,0,0.15)' }, style: { listStyle: 'none', margin: 0, padding: 0, position: 'relative', zIndex: 1, backgroundColor: '#fff' }, onDragStart: (e) => {
29
+ return (_jsxs(Reorder.Item, Object.assign({ value: column.name, drag: !isDate, dragListener: !isDate, transition: { duration: 0 }, whileDrag: { zIndex: 9999, boxShadow: '0 4px 12px rgba(0,0,0,0.15)', scale: 1 }, style: {
30
+ listStyle: 'none',
31
+ margin: 0,
32
+ padding: 0,
33
+ position: 'relative',
34
+ zIndex: 1,
35
+ backgroundColor: '#fff',
36
+ width: '100%',
37
+ willChange: 'transform',
38
+ }, onDragStart: (e) => {
30
39
  const target = e.target;
31
40
  if (target.closest('[role="checkbox"]') ||
32
41
  target.closest('input[type="checkbox"]') ||
@@ -37,7 +46,7 @@ export const ColumnList = ({ selectedColumns, columnNames, allSelected, someSele
37
46
  if (e.target.closest('[role="checkbox"]') || e.target.closest('input[type="checkbox"]')) {
38
47
  e.stopPropagation();
39
48
  }
40
- } }, { children: [_jsx(DragIconWrapper, { children: _jsx("img", { src: dragIcon, alt: "drag", draggable: false, style: { width: 16, height: 16, cursor: isDate ? 'default' : 'grab', pointerEvents: 'none' } }) }), _jsx(CheckboxWrapper, Object.assign({ onMouseDown: (e) => {
49
+ }, sx: { width: '100%', position: 'relative' } }, { children: [_jsx(DragIconWrapper, { children: _jsx("img", { src: dragIcon, alt: "drag", draggable: false, style: { width: 16, height: 16, cursor: isDate ? 'default' : 'grab', pointerEvents: 'none' } }) }), _jsx(CheckboxWrapper, Object.assign({ onMouseDown: (e) => {
41
50
  e.stopPropagation();
42
51
  }, onPointerDown: (e) => {
43
52
  e.stopPropagation();
@@ -46,7 +55,14 @@ export const ColumnList = ({ selectedColumns, columnNames, allSelected, someSele
46
55
  onColumnToggle(column.name);
47
56
  }, onClick: (e) => {
48
57
  e.stopPropagation();
49
- }, disabled: isDate, size: "small", sx: checkboxSx }) })), _jsx(Typography, Object.assign({ sx: { flex: 1, fontSize: 13, fontWeight: 400, color: 'text.primary', ml: 1 } }, { children: column.label || column.name })), hasSubmenu && (_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', ml: 1, flexShrink: 0 } }, { children: _jsx("img", { src: rightArrow, alt: "arrow", style: { width: 12, height: 12 } }) })))] })), hasSubmenu && (_jsx(Popper, Object.assign({ open: hoveredColumn === column.name, anchorEl: anchorEl, placement: "right-start", sx: { zIndex: 10000 } }, { children: _jsxs(Box, Object.assign({ onMouseEnter: onCancelClose, onMouseLeave: onSubmenuLeave, sx: { display: 'flex', pl: 0.5 } }, { children: [_jsx(Box, { sx: { width: 8, height: '100%', position: 'absolute', left: -8, top: 0, bottom: 0 } }), _jsx(SubmenuPaper, { children: (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.map((subItem, subItemIndex) => {
58
+ }, disabled: isDate, size: "small", sx: checkboxSx }) })), _jsx(Typography, Object.assign({ sx: { flex: 1, fontSize: 13, fontWeight: 400, color: 'text.primary', ml: 1 } }, { children: column.label || column.name })), hasSubmenu && (_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', ml: 1, flexShrink: 0 } }, { children: _jsx("img", { src: rightArrow, alt: "arrow", style: { width: 12, height: 12 } }) })))] })), hasSubmenu && (_jsx(Popper, Object.assign({ open: hoveredColumn === column.name, anchorEl: anchorEl, placement: "right-start", sx: { zIndex: 10000 }, modifiers: [
59
+ {
60
+ name: 'offset',
61
+ options: {
62
+ offset: [0, 0],
63
+ },
64
+ },
65
+ ] }, { children: _jsxs(Box, Object.assign({ onMouseEnter: onCancelClose, onMouseLeave: onSubmenuLeave, sx: { display: 'flex', pl: 0.5 } }, { children: [_jsx(Box, { sx: { width: 8, height: '100%', position: 'absolute', left: -8, top: 0, bottom: 0 } }), _jsx(SubmenuPaper, { children: (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.map((subItem, subItemIndex) => {
50
66
  var _a, _b;
51
67
  return (_jsxs(React.Fragment, { children: [_jsx(MenuItem, Object.assign({ isSelected: subItem.selected, onClick: () => onSubItemToggle(column.name, subItem.name) }, { children: subItem.label || subItem.name })), subItemIndex < ((_b = (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1 && _jsx(Divider, {})] }, subItem.name));
52
68
  }) })] })) })))] }), column.name));
@@ -37,7 +37,14 @@ export const ViewsSubmenu = ({ columns, allCurrentSelected, someCurrentSelected,
37
37
  alignItems: 'center',
38
38
  justifyContent: 'space-between',
39
39
  width: '100%',
40
- } }, { children: [_jsx(MenuItem, Object.assign({ isSelected: hasNestedSubmenu ? checked : column.selected, isIndeterminate: hasNestedSubmenu ? indeterminate : false, onClick: () => onColumnToggle(column.name), sx: { flex: 1, display: 'flex', alignItems: 'center' } }, { children: _jsx("span", { children: column.label || column.name }) })), hasNestedSubmenu && (_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', pr: 1, pointerEvents: 'none' } }, { children: _jsx("img", { src: blackRightArrowIcon, alt: "arrow", style: { height: 12 } }) })))] })), hasNestedSubmenu && (_jsx(Popper, Object.assign({ open: hoveredNestedColumn === column.name, anchorEl: nestedSubmenuAnchorEl, placement: "right-start", sx: { zIndex: 10000 } }, { children: _jsxs(Box, Object.assign({ onMouseEnter: cancelNestedClose, onMouseLeave: closeNestedSubmenu, sx: { display: 'flex', pl: 0.5 } }, { children: [_jsx(Box, { sx: { width: 8, height: '100%', position: 'absolute', left: -8, top: 0, bottom: 0 } }), _jsx(SubmenuPaper, { children: (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.map((subItem, subItemIndex) => {
40
+ } }, { children: [_jsx(MenuItem, Object.assign({ isSelected: hasNestedSubmenu ? checked : column.selected, isIndeterminate: hasNestedSubmenu ? indeterminate : false, onClick: () => onColumnToggle(column.name), sx: { flex: 1, display: 'flex', alignItems: 'center' } }, { children: _jsx("span", { children: column.label || column.name }) })), hasNestedSubmenu && (_jsx(Box, Object.assign({ sx: { display: 'flex', alignItems: 'center', pr: 1, pointerEvents: 'none' } }, { children: _jsx("img", { src: blackRightArrowIcon, alt: "arrow", style: { height: 12 } }) })))] })), hasNestedSubmenu && (_jsx(Popper, Object.assign({ open: hoveredNestedColumn === column.name, anchorEl: nestedSubmenuAnchorEl, placement: "right-start", sx: { zIndex: 10000 }, modifiers: [
41
+ {
42
+ name: 'offset',
43
+ options: {
44
+ offset: [0, 0],
45
+ },
46
+ },
47
+ ] }, { children: _jsxs(Box, Object.assign({ onMouseEnter: cancelNestedClose, onMouseLeave: closeNestedSubmenu, sx: { display: 'flex', pl: 0.5 } }, { children: [_jsx(Box, { sx: { width: 8, height: '100%', position: 'absolute', left: -8, top: 0, bottom: 0 } }), _jsx(SubmenuPaper, { children: (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.map((subItem, subItemIndex) => {
41
48
  var _a, _b;
42
49
  return (_jsxs(React.Fragment, { children: [_jsx(MenuItem, Object.assign({ isSelected: subItem.selected, onClick: () => onNestedItemToggle(column.name, subItem.name) }, { children: subItem.label || subItem.name })), subItemIndex < ((_b = (_a = column.menuItems) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) - 1 && _jsx(Divider, {})] }, subItem.name));
43
50
  }) })] })) })))] })), columnIndex < columns.length - 1 && _jsx(Divider, {})] }, column.name));
@@ -4,7 +4,7 @@ import type { ViewMenuItem, LayoutSection, ViewMode } from '../types';
4
4
  import type { ViewOption } from '../../type';
5
5
  export interface UseViewSelectorProps {
6
6
  mode: ViewMode;
7
- layoutData?: LayoutSection[];
7
+ onViewChange?: (selectedView?: ViewMenuItem) => void;
8
8
  onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
9
9
  onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
10
10
  onCreateCustomView?: (data: {
@@ -25,10 +25,12 @@ export interface UseViewSelectorProps {
25
25
  setTableViews?: (columns: ColumnViewProps[]) => void;
26
26
  tableViews: ColumnViewProps[];
27
27
  customViews: ViewMenuItem[];
28
+ defaultColumns: ColumnViewProps[];
29
+ defaultTemplate?: ViewMenuItem;
28
30
  setInternalCustomViews: (views: ViewMenuItem[]) => void;
29
31
  setInternalTableViews: (views: ColumnViewProps[]) => void;
30
32
  }
31
- export declare const useViewSelector: ({ mode, layoutData, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, setInternalCustomViews, setInternalTableViews, }: UseViewSelectorProps) => {
33
+ export declare const useViewSelector: ({ mode, onViewChange, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, defaultColumns, defaultTemplate, setInternalCustomViews, setInternalTableViews, }: UseViewSelectorProps) => {
32
34
  anchorViewEl: HTMLDivElement | null;
33
35
  defaultViewEl: HTMLDivElement | null;
34
36
  setDefaultViewElement: import("react").Dispatch<import("react").SetStateAction<HTMLDivElement | null>>;
@@ -39,7 +41,7 @@ export declare const useViewSelector: ({ mode, layoutData, onTableViewsChange, o
39
41
  handleViewButtonClick: (event: MouseEvent<HTMLDivElement>) => void;
40
42
  handleCloseViewDropdown: () => void;
41
43
  handleClose: () => void;
42
- handleSelectedViewInfo: (selected: ViewOption) => void;
44
+ handleSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
43
45
  handleOpenCreateDialog: (useCurrentState?: boolean) => void;
44
46
  handleOpenEditDialog: (view: ViewMenuItem) => void;
45
47
  handleCloseCreateDialog: () => void;
@@ -7,15 +7,23 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { useState, useCallback } from 'react';
11
- import { getColumnsByMode, createCustomViewMenuItem } from '../utils';
12
- export const useViewSelector = ({ mode, layoutData, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, setInternalCustomViews, setInternalTableViews, }) => {
10
+ import { useState, useCallback, useEffect } from 'react';
11
+ import { createCustomViewMenuItem } from '../utils';
12
+ export const useViewSelector = ({ mode, onViewChange, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, defaultColumns, defaultTemplate, setInternalCustomViews, setInternalTableViews, }) => {
13
13
  const [anchorViewEl, setAnchorViewEl] = useState(null);
14
14
  const [defaultViewEl, setDefaultViewElement] = useState(null);
15
15
  const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);
16
16
  const [editingView, setEditingView] = useState(null);
17
17
  const [selectedViewInfo, setSelectedViewInfo] = useState({ id: 'default', label: 'Default' });
18
18
  const [shouldUseCurrentState, setShouldUseCurrentState] = useState(false);
19
+ const [selectedView, setSelectedView] = useState(undefined);
20
+ // Notify parent of initial view on mount
21
+ useEffect(() => {
22
+ // Use defaultTemplate if available, otherwise undefined (built-in default view)
23
+ const initialView = defaultTemplate || undefined;
24
+ setSelectedView(initialView);
25
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(initialView);
26
+ }, [onViewChange, defaultTemplate]);
19
27
  const handleTableViewsChange = useCallback((newTableViews) => {
20
28
  const setTableViewsState = setTableViews !== null && setTableViews !== void 0 ? setTableViews : setInternalTableViews;
21
29
  setTableViewsState(newTableViews);
@@ -37,10 +45,14 @@ export const useViewSelector = ({ mode, layoutData, onTableViewsChange, onCustom
37
45
  setDefaultViewElement(null);
38
46
  setSelectedViewInfo({ label: 'Default', id: 'default' });
39
47
  }, []);
40
- const handleSelectedViewInfo = useCallback((selected) => {
48
+ const handleSelectedViewInfo = useCallback((selected, viewMenuItem) => {
41
49
  setSelectedViewInfo(selected);
50
+ // Update selected view and notify parent
51
+ const newSelectedView = viewMenuItem || undefined;
52
+ setSelectedView(newSelectedView);
53
+ onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newSelectedView);
42
54
  handleCloseViewDropdown();
43
- }, [handleCloseViewDropdown]);
55
+ }, [handleCloseViewDropdown, onViewChange]);
44
56
  const handleOpenCreateDialog = useCallback((useCurrentState = false) => {
45
57
  setEditingView(null);
46
58
  setShouldUseCurrentState(useCurrentState);
@@ -81,10 +93,10 @@ export const useViewSelector = ({ mode, layoutData, onTableViewsChange, onCustom
81
93
  resetTableViews({ id: views[0], label: views[0] });
82
94
  }
83
95
  else {
84
- const resetColumns = getColumnsByMode(mode, layoutData);
85
- handleTableViewsChange(resetColumns);
96
+ // Reset to default columns from templates
97
+ handleTableViewsChange([...defaultColumns]);
86
98
  }
87
- }, [resetTableViews, mode, layoutData, handleTableViewsChange]);
99
+ }, [resetTableViews, defaultColumns, handleTableViewsChange]);
88
100
  return {
89
101
  // State
90
102
  anchorViewEl,
@@ -1,11 +1,12 @@
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[];
8
8
  setInternalTableViews: import("react").Dispatch<import("react").SetStateAction<ColumnViewProps[]>>;
9
9
  internalCustomViews: ViewMenuItem[];
10
10
  setInternalCustomViews: import("react").Dispatch<import("react").SetStateAction<ViewMenuItem[]>>;
11
+ defaultTemplate: ViewMenuItem | undefined;
11
12
  };
@@ -1,13 +1,14 @@
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 } 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
9
+ const { customViews, defaultTemplateColumns, defaultTemplate } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
10
+ // Only use default template columns - no fallback to layout data
11
+ // The default view must come from a template with default: true
11
12
  const effectiveLayoutData = defaultTemplateColumns
12
13
  ? [
13
14
  {
@@ -31,18 +32,16 @@ export const useViewsManager = ({ mode, layoutData, initialTableViews, initialCu
31
32
  }),
32
33
  },
33
34
  ]
34
- : getLayoutDataFromTemplates(templatesArray);
35
+ : [];
35
36
  return {
36
37
  customViews,
37
38
  layoutData: effectiveLayoutData,
38
39
  defaultTemplateColumns,
40
+ defaultTemplate,
39
41
  };
40
42
  }, [templates, mode, lang]);
41
- // Use transformed templates or provided props
42
- const effectiveLayoutData = (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.layoutData) || layoutData;
43
- const effectiveCustomViews = (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews) || initialCustomViews;
44
43
  const [defaultColumns, setDefaultColumns] = useState(() => {
45
- // If we have default template columns from templates, use them; otherwise use layoutData
44
+ // Only use data from templates - no other sources
46
45
  if (templates) {
47
46
  const templatesArray = Array.isArray(templates) ? templates : templates.templates;
48
47
  const { defaultTemplateColumns } = transformTemplatesToViewMenuItems(templatesArray, mode, lang);
@@ -50,31 +49,50 @@ export const useViewsManager = ({ mode, layoutData, initialTableViews, initialCu
50
49
  return defaultTemplateColumns;
51
50
  }
52
51
  }
53
- return getColumnsByMode(mode, layoutData || []);
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 [];
54
74
  });
55
- const [internalTableViews, setInternalTableViews] = useState(initialTableViews || defaultColumns || []);
56
- const [internalCustomViews, setInternalCustomViews] = useState(effectiveCustomViews || []);
57
75
  useEffect(() => {
58
- // If we have default template columns, use them; otherwise use layoutData
76
+ // Only use default template columns from template with default: true
77
+ // No fallback to layout data - default must come from templates array
59
78
  if (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplateColumns) {
60
79
  setDefaultColumns(transformedTemplates.defaultTemplateColumns);
61
- if (!initialTableViews) {
62
- setInternalTableViews(transformedTemplates.defaultTemplateColumns);
63
- }
80
+ setInternalTableViews(transformedTemplates.defaultTemplateColumns);
64
81
  }
65
82
  else {
66
- const columns = getColumnsByMode(mode, effectiveLayoutData);
67
- setDefaultColumns(columns);
68
- if (!initialTableViews && effectiveLayoutData) {
69
- setInternalTableViews(columns);
70
- }
83
+ // No default template found - set empty arrays
84
+ setDefaultColumns([]);
85
+ setInternalTableViews([]);
71
86
  }
72
- }, [mode, effectiveLayoutData, initialTableViews, transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplateColumns]);
87
+ }, [mode, transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplateColumns]);
73
88
  // Update custom views when templates change
74
89
  useEffect(() => {
75
90
  if (transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews) {
76
91
  setInternalCustomViews(transformedTemplates.customViews);
77
92
  }
93
+ else {
94
+ setInternalCustomViews([]);
95
+ }
78
96
  }, [transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.customViews]);
79
97
  return {
80
98
  defaultColumns,
@@ -83,5 +101,6 @@ export const useViewsManager = ({ mode, layoutData, initialTableViews, initialCu
83
101
  setInternalTableViews,
84
102
  internalCustomViews,
85
103
  setInternalCustomViews,
104
+ defaultTemplate: transformedTemplates === null || transformedTemplates === void 0 ? void 0 : transformedTemplates.defaultTemplate,
86
105
  };
87
106
  };
@@ -8,4 +8,6 @@ export { default as CreateViewDialog } from './CreateViewDialog';
8
8
  export { transformLayoutToColumns, getColumnsByMode, createCustomViewMenuItem, setViewAsDefault, transformTemplatesToViewMenuItems, convertColumnsToLayoutSection, isDateColumn, getColumnCheckState, } from './utils';
9
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>;
@@ -114,8 +122,8 @@ export interface ViewSelectorProps {
114
122
  export interface ViewsDropdownProps {
115
123
  open: boolean;
116
124
  selectedViewInfo: ViewOption;
117
- setSelectedViewInfo: (selected: ViewOption) => void;
118
- onSelect: (e: React.MouseEvent<HTMLDivElement>) => void;
125
+ setSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
126
+ onSelect: (e: React.MouseEvent<HTMLDivElement>, selectedView?: ViewMenuItem) => 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
  }
@@ -25,13 +25,18 @@ export declare const setViewAsDefault: (views: ViewMenuItem[], viewId: string) =
25
25
  * Separates default templates (to be merged into built-in Default view) from custom views
26
26
  */
27
27
  export declare const transformTemplatesToViewMenuItems: (templates: Array<{
28
- id: string;
28
+ id: string | {
29
+ timestamp: number;
30
+ date: string;
31
+ };
29
32
  name: string;
30
33
  default: boolean;
31
34
  layout: LayoutSection[];
35
+ templateId: string;
32
36
  }>, mode?: ViewMode, lang?: string) => {
33
37
  customViews: ViewMenuItem[];
34
38
  defaultTemplateColumns?: ColumnViewProps[] | undefined;
39
+ defaultTemplate?: ViewMenuItem | undefined;
35
40
  };
36
41
  /**
37
42
  * Convert ColumnViewProps back to LayoutSection format for API requests
@@ -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';
@@ -98,18 +99,33 @@ export const setViewAsDefault = (views, viewId) => {
98
99
  export const transformTemplatesToViewMenuItems = (templates, mode = 'sheet', lang = 'en') => {
99
100
  const customViews = [];
100
101
  let defaultTemplateColumns;
102
+ let defaultTemplate;
101
103
  templates.forEach((template) => {
102
104
  // Get columns for the specified mode
103
105
  const section = template.layout.find((s) => s.code.toLowerCase() === mode.toLowerCase());
104
106
  const columns = section ? transformLayoutToColumns([section], lang) : [];
107
+ // Handle id as either string or object
108
+ const templateIdString = typeof template.id === 'string' ? template.id : template.templateId;
109
+ const viewId = typeof template.id === 'string' ? template.id : template.templateId;
105
110
  if (template.default) {
106
111
  // Store default template columns to merge into built-in Default view
107
112
  defaultTemplateColumns = columns;
113
+ // Also create a ViewMenuItem for the default template
114
+ defaultTemplate = {
115
+ id: 'default',
116
+ templateId: template.templateId,
117
+ label: template.name,
118
+ isCustom: false,
119
+ default: true,
120
+ columns: columns.map((col) => col.name),
121
+ submenu: columns,
122
+ };
108
123
  }
109
124
  else {
110
125
  // Add non-default templates as custom views
111
126
  customViews.push({
112
- id: template.id,
127
+ id: viewId,
128
+ templateId: template.templateId,
113
129
  label: template.name,
114
130
  isCustom: true,
115
131
  default: false,
@@ -118,7 +134,7 @@ export const transformTemplatesToViewMenuItems = (templates, mode = 'sheet', lan
118
134
  });
119
135
  }
120
136
  });
121
- return { customViews, defaultTemplateColumns };
137
+ return { customViews, defaultTemplateColumns, defaultTemplate };
122
138
  };
123
139
  /**
124
140
  * 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?: (selectedView?: ViewMenuItem) => void;
27
27
  onDateChange?: (date: Date | [Date, Date]) => void;
28
28
  tableReportsComponent?: React.ReactNode;
29
29
  tableFilterComponent?: React.ReactNode;
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.2-test.3",
5
- "testVersion": 3,
4
+ "version": "0.1.372-test.2-test.3-test.4-test.5-test.6",
5
+ "testVersion": 6,
6
6
  "type": "module",
7
7
  "main": "build/index.js",
8
8
  "module": "build/index.js",