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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/build/components/Sandbox/style.js +2 -3
  2. package/build/components/TableHeader/FiltersRow.d.ts +1 -1
  3. package/build/components/TableHeader/FiltersRow.js +3 -3
  4. package/build/components/TableHeader/TableHeader.d.ts +1 -1
  5. package/build/components/TableHeader/TableHeader.js +2 -2
  6. package/build/components/TableHeader/TableView/CreateViewDialog.js +0 -1
  7. package/build/components/TableHeader/TableView/ViewsDropdown.d.ts +1 -1
  8. package/build/components/TableHeader/TableView/ViewsDropdown.js +120 -185
  9. package/build/components/TableHeader/TableView/ViewsMenu.d.ts +5 -0
  10. package/build/components/TableHeader/TableView/ViewsMenu.js +76 -0
  11. package/build/components/TableHeader/TableView/components/ColumnList.js +4 -4
  12. package/build/components/TableHeader/TableView/components/ViewsSubmenu.js +46 -30
  13. package/build/components/TableHeader/TableView/constants.d.ts +1 -0
  14. package/build/components/TableHeader/TableView/constants.js +1 -0
  15. package/build/components/TableHeader/TableView/hooks/index.d.ts +1 -1
  16. package/build/components/TableHeader/TableView/hooks/index.js +1 -1
  17. package/build/components/TableHeader/TableView/hooks/useCreateViewDialog.js +12 -12
  18. package/build/components/TableHeader/TableView/hooks/useNestedSubmenu.js +2 -9
  19. package/build/components/TableHeader/TableView/hooks/useSubmenuHover.js +1 -2
  20. package/build/components/TableHeader/TableView/hooks/useViewsManager.d.ts +6 -8
  21. package/build/components/TableHeader/TableView/hooks/useViewsManager.js +45 -94
  22. package/build/components/TableHeader/TableView/hooks/useViewsMenu.d.ts +44 -0
  23. package/build/components/TableHeader/TableView/hooks/useViewsMenu.js +182 -0
  24. package/build/components/TableHeader/TableView/index.d.ts +3 -3
  25. package/build/components/TableHeader/TableView/index.js +2 -4
  26. package/build/components/TableHeader/TableView/types.d.ts +18 -32
  27. package/build/components/TableHeader/TableView/utils.d.ts +5 -5
  28. package/build/components/TableHeader/TableView/utils.js +22 -13
  29. package/build/components/TableHeader/index.d.ts +1 -0
  30. package/build/components/TableHeader/type.d.ts +2 -9
  31. package/build/components/Toolbar/Toolbar.js +1 -1
  32. package/build/components/VirtualTables/VirtualTable/VirtualTable.d.ts +1 -1
  33. package/build/components/VirtualTables/VirtualTable/VirtualTable.js +4 -3
  34. package/build/constants/apps.js +2 -0
  35. package/build/constants/assets.d.ts +1 -0
  36. package/build/constants/assets.js +1 -0
  37. package/build/types/reports.d.ts +21 -0
  38. package/build/types/table.d.ts +1 -0
  39. package/build/utils/date.js +5 -3
  40. package/build/utils/index.d.ts +1 -0
  41. package/build/utils/index.js +1 -0
  42. package/build/utils/skeletonColumns.d.ts +4 -0
  43. package/build/utils/skeletonColumns.js +17 -0
  44. package/package.json +2 -2
  45. package/build/components/TableHeader/TableView/ViewSelector.d.ts +0 -5
  46. package/build/components/TableHeader/TableView/ViewSelector.js +0 -46
  47. package/build/components/TableHeader/TableView/hooks/useViewSelector.d.ts +0 -59
  48. package/build/components/TableHeader/TableView/hooks/useViewSelector.js +0 -195
@@ -0,0 +1,4 @@
1
+ import type { IColumnProps } from '../types/index.js';
2
+ export declare const DEFAULT_SKELETON_WIDTHS: string[];
3
+ export declare const generateSkeletonColumns: (staticWidths?: string[]) => IColumnProps[];
4
+ export declare const getProcessedColumns: <T = unknown>(columns: readonly IColumnProps<T>[], isLoading: boolean, defaultSkeleton: boolean) => IColumnProps<T>[];
@@ -0,0 +1,17 @@
1
+ export const DEFAULT_SKELETON_WIDTHS = ['120px', '180px', '100px', '150px', '200px', '140px', '160px', '110px', '190px', '130px'];
2
+ export const generateSkeletonColumns = (staticWidths = DEFAULT_SKELETON_WIDTHS) => {
3
+ return staticWidths.map((width, index) => ({
4
+ id: `skeleton-col-${index}`,
5
+ header: '',
6
+ width,
7
+ order: index,
8
+ hidden: false,
9
+ sortable: false,
10
+ }));
11
+ };
12
+ export const getProcessedColumns = (columns, isLoading, defaultSkeleton) => {
13
+ if (defaultSkeleton && isLoading) {
14
+ return generateSkeletonColumns();
15
+ }
16
+ return [...columns];
17
+ };
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.373-test.2-test.3-test.4-test.5-test.6",
5
- "testVersion": 6,
4
+ "version": "0.1.373-test.2",
5
+ "testVersion": 2,
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 { ViewSelectorProps } from './types';
3
- declare function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode, onTableViewsChange, onCustomViewsChange, templates, lang, apiMetadata, }: ViewSelectorProps): import("react/jsx-runtime").JSX.Element;
4
- declare const _default: import("react").MemoExoticComponent<typeof ViewSelector>;
5
- export default _default;
@@ -1,46 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { memo } from 'react';
3
- import { useTranslation } from 'react-i18next';
4
- import ClickAwayListener from '@mui/material/ClickAwayListener';
5
- import { Icon, StyledButton } from '../../index.js';
6
- import { viewIcon } from '../../../constants/index.js';
7
- import ViewsDropdown from './ViewsDropdown';
8
- import CreateViewDialog from './CreateViewDialog';
9
- import { ViewWrapper } from './styles';
10
- import { useViewsManager } from './hooks';
11
- import { useViewSelector } from './hooks/useViewSelector';
12
- function ViewSelector({ onViewChange, setIsViewVisible, setTableViews, tableViews: externalTableViews, resetTableViews, customViews: externalCustomViews, onCreateCustomView, onEditCustomView, onDeleteCustomView, tableMode = 'default', onTableViewsChange, onCustomViewsChange, templates, lang = 'en', apiMetadata, }) {
13
- const { t } = useTranslation();
14
- // Map tableMode to viewMode: 'sheet' → 'sheet', 'default' → 'advanced'
15
- const mode = tableMode === 'sheet' ? 'sheet' : 'advanced';
16
- const { defaultColumns, setDefaultColumns, internalTableViews, setInternalTableViews, internalCustomViews, setInternalCustomViews, defaultTemplate, } = useViewsManager({
17
- mode,
18
- templates,
19
- lang,
20
- });
21
- const tableViews = externalTableViews !== null && externalTableViews !== void 0 ? externalTableViews : internalTableViews;
22
- const customViews = externalCustomViews !== null && externalCustomViews !== void 0 ? externalCustomViews : internalCustomViews;
23
- const { anchorViewEl, defaultViewEl, setDefaultViewElement, isCreateDialogOpen, editingView, selectedViewInfo, shouldUseCurrentState, handleViewButtonClick, handleCloseViewDropdown, handleSelectedViewInfo, handleOpenCreateDialog, handleOpenEditDialog, handleCloseCreateDialog, handleSaveView, handleDeleteView, handleResetViews, handleTableViewsChange, updateSelectedView, } = useViewSelector({
24
- mode,
25
- onViewChange,
26
- onTableViewsChange,
27
- onCustomViewsChange,
28
- onCreateCustomView,
29
- onEditCustomView,
30
- onDeleteCustomView,
31
- resetTableViews,
32
- setTableViews,
33
- tableViews,
34
- customViews,
35
- defaultColumns,
36
- defaultTemplate,
37
- setInternalCustomViews,
38
- setInternalTableViews,
39
- setDefaultColumns,
40
- apiMetadata,
41
- });
42
- return (_jsxs(_Fragment, { children: [_jsx(ClickAwayListener, Object.assign({ onClickAway: handleCloseViewDropdown }, { children: _jsxs(ViewWrapper, Object.assign({ sx: { width: '32px' }, "data-testid": "ViewSelector" }, { children: [_jsx(StyledButton, Object.assign({ title: t('tableView'), "data-testid": "ViewSelector_button", onClick: handleViewButtonClick }, { children: _jsx(Icon, { src: viewIcon, alt: "view", sx: { width: 14, height: 14 } }) })), _jsx(ViewsDropdown, { open: Boolean(defaultViewEl), anchorEl: anchorViewEl, setSelectedViewInfo: handleSelectedViewInfo, selectedViewInfo: selectedViewInfo, onSelect: (e, selectedView) => {
43
- setDefaultViewElement(defaultViewEl ? null : e.currentTarget);
44
- }, setViews: handleResetViews, tableViews: tableViews, setTableViews: handleTableViewsChange, onCreateCustomView: handleOpenCreateDialog, customViews: customViews, onEditCustomView: handleOpenEditDialog, defaultColumns: defaultColumns, setDefaultColumns: setDefaultColumns, updateSelectedView: updateSelectedView })] })) })), _jsx(CreateViewDialog, { open: isCreateDialogOpen, onClose: handleCloseCreateDialog, availableColumns: defaultColumns, defaultColumns: defaultColumns, onCreate: handleSaveView, editingView: editingView, onDelete: handleDeleteView, tableViews: shouldUseCurrentState ? defaultColumns : undefined, mode: mode })] }));
45
- }
46
- export default memo(ViewSelector);
@@ -1,59 +0,0 @@
1
- import { type MouseEvent } from 'react';
2
- import type { ColumnViewProps } from '../../../../types/index.js';
3
- import type { ViewMenuItem, LayoutSection, ViewMode, TemplateAPIMetadata } from '../types';
4
- import type { ViewOption } from '../../type';
5
- export interface UseViewSelectorProps {
6
- mode: ViewMode;
7
- onViewChange?: (selectedView?: ViewMenuItem) => void;
8
- onTableViewsChange?: (tableViews: ColumnViewProps[]) => void;
9
- onCustomViewsChange?: (customViews: ViewMenuItem[]) => void;
10
- onCreateCustomView?: (data: {
11
- name: string;
12
- selectedColumns: ColumnViewProps[];
13
- layout: LayoutSection;
14
- }) => Promise<void>;
15
- onEditCustomView?: (viewId: string, data: {
16
- name: string;
17
- selectedColumns: ColumnViewProps[];
18
- layout: LayoutSection;
19
- }) => Promise<void>;
20
- onDeleteCustomView?: (viewId: string) => Promise<void>;
21
- resetTableViews?: (view: {
22
- id: string;
23
- label: string;
24
- }) => void;
25
- setTableViews?: (columns: ColumnViewProps[]) => void;
26
- tableViews: ColumnViewProps[];
27
- customViews: ViewMenuItem[];
28
- defaultColumns: ColumnViewProps[];
29
- defaultTemplate?: ViewMenuItem;
30
- setInternalCustomViews: (views: ViewMenuItem[]) => void;
31
- setInternalTableViews: (views: ColumnViewProps[]) => void;
32
- setDefaultColumns?: (columns: ColumnViewProps[]) => void;
33
- apiMetadata?: TemplateAPIMetadata;
34
- }
35
- export declare const useViewSelector: ({ mode, onViewChange, onTableViewsChange, onCustomViewsChange, onCreateCustomView, onEditCustomView, onDeleteCustomView, resetTableViews, setTableViews, tableViews, customViews, defaultColumns, defaultTemplate, setInternalCustomViews, setInternalTableViews, setDefaultColumns, apiMetadata, }: UseViewSelectorProps) => {
36
- anchorViewEl: HTMLDivElement | null;
37
- defaultViewEl: HTMLDivElement | null;
38
- setDefaultViewElement: import("react").Dispatch<import("react").SetStateAction<HTMLDivElement | null>>;
39
- isCreateDialogOpen: boolean;
40
- editingView: ViewMenuItem | null;
41
- selectedViewInfo: ViewOption;
42
- shouldUseCurrentState: boolean;
43
- handleViewButtonClick: (event: MouseEvent<HTMLDivElement>) => void;
44
- handleCloseViewDropdown: () => void;
45
- handleClose: () => void;
46
- handleSelectedViewInfo: (selected: ViewOption, viewMenuItem?: ViewMenuItem) => void;
47
- handleOpenCreateDialog: (useCurrentState?: boolean) => void;
48
- handleOpenEditDialog: (view: ViewMenuItem) => void;
49
- handleCloseCreateDialog: () => void;
50
- handleSaveView: (data: {
51
- name: string;
52
- selectedColumns: ColumnViewProps[];
53
- layout: LayoutSection;
54
- }) => Promise<void>;
55
- handleDeleteView: (viewId: string) => Promise<void>;
56
- handleResetViews: (views: string[]) => void;
57
- handleTableViewsChange: (newTableViews: ColumnViewProps[]) => void;
58
- updateSelectedView: (updatedView: ViewMenuItem) => void;
59
- };
@@ -1,195 +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 { useState, useCallback, useEffect, useRef } 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, setDefaultColumns, apiMetadata, }) => {
13
- const [anchorViewEl, setAnchorViewEl] = useState(null);
14
- const [defaultViewEl, setDefaultViewElement] = useState(null);
15
- const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false);
16
- const [editingView, setEditingView] = useState(null);
17
- const [selectedViewInfo, setSelectedViewInfo] = useState({ id: 'default', label: 'Default' });
18
- const [shouldUseCurrentState, setShouldUseCurrentState] = useState(false);
19
- const [selectedView, setSelectedView] = useState(undefined);
20
- const hasInitializedRef = useRef(false);
21
- // Update editingView when customViews changes to ensure it reflects the latest saved state
22
- useEffect(() => {
23
- if (editingView && customViews.length > 0) {
24
- const updatedView = customViews.find((view) => view.id === editingView.id);
25
- if (updatedView && updatedView !== editingView) {
26
- setEditingView(updatedView);
27
- }
28
- }
29
- }, [customViews, editingView]);
30
- // Update selectedView when customViews changes to ensure it reflects the latest saved state
31
- useEffect(() => {
32
- if (selectedView && selectedView.isCustom && customViews.length > 0) {
33
- const updatedView = customViews.find((view) => view.id === selectedView.id);
34
- if (updatedView) {
35
- // Compare submenu to detect changes (deep comparison would be better, but this works for now)
36
- const submenuChanged = JSON.stringify(updatedView.submenu) !== JSON.stringify(selectedView.submenu);
37
- const labelChanged = updatedView.label !== selectedView.label;
38
- if (submenuChanged || labelChanged) {
39
- // Create a new object reference to ensure React detects the change
40
- const newSelectedView = Object.assign(Object.assign({}, updatedView), { submenu: updatedView.submenu ? [...updatedView.submenu] : undefined });
41
- setSelectedView(newSelectedView);
42
- onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newSelectedView);
43
- }
44
- }
45
- }
46
- }, [customViews, selectedView, onViewChange]);
47
- // Notify parent of initial view on mount only
48
- useEffect(() => {
49
- // Only initialize once on mount, don't reset if user has already selected a view
50
- if (hasInitializedRef.current)
51
- return;
52
- // Use defaultTemplate if available, otherwise undefined (built-in default view)
53
- const initialView = defaultTemplate || undefined;
54
- console.log('initialView', initialView);
55
- setSelectedView(initialView);
56
- onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(initialView);
57
- hasInitializedRef.current = true;
58
- }, [defaultTemplate, onViewChange]);
59
- const handleTableViewsChange = useCallback((newTableViews) => {
60
- const setTableViewsState = setTableViews !== null && setTableViews !== void 0 ? setTableViews : setInternalTableViews;
61
- setTableViewsState(newTableViews);
62
- onTableViewsChange === null || onTableViewsChange === void 0 ? void 0 : onTableViewsChange(newTableViews);
63
- }, [setTableViews, setInternalTableViews, onTableViewsChange]);
64
- const handleCustomViewsChange = useCallback((newCustomViews) => {
65
- setInternalCustomViews(newCustomViews);
66
- onCustomViewsChange === null || onCustomViewsChange === void 0 ? void 0 : onCustomViewsChange(newCustomViews);
67
- }, [setInternalCustomViews, onCustomViewsChange]);
68
- const handleViewButtonClick = useCallback((event) => {
69
- setAnchorViewEl(event.currentTarget);
70
- setDefaultViewElement(event.currentTarget);
71
- }, []);
72
- const handleCloseViewDropdown = useCallback(() => {
73
- setDefaultViewElement(null);
74
- }, []);
75
- const handleClose = useCallback(() => {
76
- setAnchorViewEl(null);
77
- setDefaultViewElement(null);
78
- setSelectedViewInfo({ label: 'Default', id: 'default' });
79
- }, []);
80
- const handleSelectedViewInfo = useCallback((selected, viewMenuItem) => {
81
- setSelectedViewInfo(selected);
82
- // Update selected view and notify parent
83
- const newSelectedView = viewMenuItem || undefined;
84
- console.log('newSelectedView', newSelectedView);
85
- setSelectedView(newSelectedView);
86
- onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newSelectedView);
87
- handleCloseViewDropdown();
88
- }, [handleCloseViewDropdown, onViewChange]);
89
- // Internal function to update selected view and notify parent
90
- // Used when default columns change via "Okay" button
91
- const updateSelectedView = useCallback((updatedView) => {
92
- setSelectedView(updatedView);
93
- setSelectedViewInfo({ id: updatedView.id, label: updatedView.label });
94
- onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(updatedView);
95
- }, [onViewChange, setSelectedViewInfo]);
96
- const handleOpenCreateDialog = useCallback((useCurrentState = false) => {
97
- setEditingView(null);
98
- setShouldUseCurrentState(useCurrentState);
99
- setIsCreateDialogOpen(true);
100
- setDefaultViewElement(null);
101
- }, []);
102
- const handleOpenEditDialog = useCallback((view) => {
103
- setEditingView(view);
104
- setShouldUseCurrentState(true);
105
- setIsCreateDialogOpen(true);
106
- }, []);
107
- const handleCloseCreateDialog = useCallback(() => {
108
- setIsCreateDialogOpen(false);
109
- setEditingView(null);
110
- setShouldUseCurrentState(false);
111
- }, []);
112
- const handleSaveView = useCallback((data) => __awaiter(void 0, void 0, void 0, function* () {
113
- try {
114
- if (editingView) {
115
- // Use templateId for API calls, not the internal view id
116
- const templateId = editingView.templateId || editingView.id;
117
- yield (onEditCustomView === null || onEditCustomView === void 0 ? void 0 : onEditCustomView(templateId, data));
118
- // Update state after promise resolves successfully
119
- const updatedView = Object.assign(Object.assign({}, editingView), { label: data.name, columns: data.selectedColumns.map((col) => col.name), submenu: data.selectedColumns });
120
- const updatedViews = customViews.map((view) => (view.id === editingView.id ? updatedView : view));
121
- handleCustomViewsChange(updatedViews);
122
- // If the updated view is currently selected, update selectedView to reflect changes
123
- // Create a new object reference to ensure React detects the change
124
- if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.id) === editingView.id) {
125
- const newSelectedView = Object.assign(Object.assign({}, updatedView), { submenu: [...updatedView.submenu] });
126
- setSelectedView(newSelectedView);
127
- onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(newSelectedView);
128
- }
129
- }
130
- else {
131
- yield (onCreateCustomView === null || onCreateCustomView === void 0 ? void 0 : onCreateCustomView(data));
132
- // Update state after promise resolves successfully
133
- const newView = createCustomViewMenuItem(data.name, data.selectedColumns);
134
- const updatedViews = [...customViews, newView];
135
- handleCustomViewsChange(updatedViews);
136
- }
137
- }
138
- catch (error) {
139
- // Error will be handled by the toast in CreateViewDialog
140
- throw error;
141
- }
142
- }), [editingView, customViews, handleCustomViewsChange, onEditCustomView, onCreateCustomView, selectedView, onViewChange]);
143
- const handleDeleteView = useCallback((viewId) => __awaiter(void 0, void 0, void 0, function* () {
144
- try {
145
- // Find the view to get its templateId
146
- const viewToDelete = customViews.find((view) => view.id === viewId);
147
- const templateId = (viewToDelete === null || viewToDelete === void 0 ? void 0 : viewToDelete.templateId) || viewId;
148
- yield (onDeleteCustomView === null || onDeleteCustomView === void 0 ? void 0 : onDeleteCustomView(templateId));
149
- // Update state after promise resolves successfully
150
- const updatedViews = customViews.filter((view) => view.id !== viewId);
151
- handleCustomViewsChange(updatedViews);
152
- // If the deleted view was selected, reset to default
153
- if ((selectedView === null || selectedView === void 0 ? void 0 : selectedView.id) === viewId) {
154
- setSelectedView(undefined);
155
- onViewChange === null || onViewChange === void 0 ? void 0 : onViewChange(undefined);
156
- }
157
- }
158
- catch (error) {
159
- // Error will be handled by the toast in CreateViewDialog
160
- throw error;
161
- }
162
- }), [customViews, handleCustomViewsChange, onDeleteCustomView, selectedView, onViewChange]);
163
- const handleResetViews = useCallback((views) => {
164
- if (resetTableViews) {
165
- resetTableViews({ id: views[0], label: views[0] });
166
- }
167
- else {
168
- // Reset to default columns from templates
169
- handleTableViewsChange([...defaultColumns]);
170
- }
171
- }, [resetTableViews, defaultColumns, handleTableViewsChange]);
172
- return {
173
- // State
174
- anchorViewEl,
175
- defaultViewEl,
176
- setDefaultViewElement,
177
- isCreateDialogOpen,
178
- editingView,
179
- selectedViewInfo,
180
- shouldUseCurrentState,
181
- // Handlers
182
- handleViewButtonClick,
183
- handleCloseViewDropdown,
184
- handleClose,
185
- handleSelectedViewInfo,
186
- handleOpenCreateDialog,
187
- handleOpenEditDialog,
188
- handleCloseCreateDialog,
189
- handleSaveView,
190
- handleDeleteView,
191
- handleResetViews,
192
- handleTableViewsChange,
193
- updateSelectedView,
194
- };
195
- };