@geotab/zenith 1.25.1 → 1.25.3-beta.0
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/README.md +10 -1
- package/dist/columnsSelector/columnsSelector.js +1 -1
- package/dist/dataFeed/dataFeed.d.ts +3 -2
- package/dist/dataFeed/dataFeed.js +4 -4
- package/dist/dataFeed/dataFeedColumnsItems.d.ts +3 -2
- package/dist/dataFeed/dataFeedColumnsItems.js +6 -3
- package/dist/dataGrid/cell/cell.js +1 -1
- package/dist/dataGrid/columns/actionsColumn/actionsColumn.d.ts +5 -0
- package/dist/dataGrid/columns/actionsColumn/actionsColumn.js +19 -2
- package/dist/dataGrid/row/row.js +1 -1
- package/dist/dataGrid/withActions/withActions.js +3 -1
- package/dist/index.css +16 -0
- package/dist/table/actions/actionsMenu.d.ts +3 -2
- package/dist/table/actions/actionsMenu.js +49 -2
- package/dist/table/actions/useActions.d.ts +1 -0
- package/dist/table/actions/useActions.js +4 -2
- package/dist/table/table.js +2 -2
- package/dist/utils/localization/translations/cs-json.d.ts +2 -0
- package/dist/utils/localization/translations/cs-json.js +3 -1
- package/dist/utils/localization/translations/de-json.d.ts +2 -0
- package/dist/utils/localization/translations/de-json.js +3 -1
- package/dist/utils/localization/translations/en-json.d.ts +1 -0
- package/dist/utils/localization/translations/en-json.js +2 -1
- package/dist/utils/localization/translations/es-json.d.ts +2 -0
- package/dist/utils/localization/translations/es-json.js +3 -1
- package/dist/utils/localization/translations/fr-FR-json.d.ts +2 -0
- package/dist/utils/localization/translations/fr-FR-json.js +3 -1
- package/dist/utils/localization/translations/fr-json.d.ts +2 -0
- package/dist/utils/localization/translations/fr-json.js +3 -1
- package/dist/utils/localization/translations/id-json.d.ts +2 -0
- package/dist/utils/localization/translations/id-json.js +3 -1
- package/dist/utils/localization/translations/it-json.d.ts +2 -0
- package/dist/utils/localization/translations/it-json.js +3 -1
- package/dist/utils/localization/translations/ja-json.d.ts +2 -0
- package/dist/utils/localization/translations/ja-json.js +3 -1
- package/dist/utils/localization/translations/ms-json.d.ts +2 -0
- package/dist/utils/localization/translations/ms-json.js +3 -1
- package/dist/utils/localization/translations/nl-json.d.ts +2 -0
- package/dist/utils/localization/translations/nl-json.js +3 -1
- package/dist/utils/localization/translations/pl-json.d.ts +2 -0
- package/dist/utils/localization/translations/pl-json.js +3 -1
- package/dist/utils/localization/translations/pt-BR-json.d.ts +2 -0
- package/dist/utils/localization/translations/pt-BR-json.js +3 -1
- package/dist/utils/localization/translations/sv-json.d.ts +2 -0
- package/dist/utils/localization/translations/sv-json.js +3 -1
- package/dist/utils/localization/translations/th-json.d.ts +2 -0
- package/dist/utils/localization/translations/th-json.js +3 -1
- package/dist/utils/localization/translations/tr-json.d.ts +2 -0
- package/dist/utils/localization/translations/tr-json.js +3 -1
- package/dist/utils/localization/translations/zh-Hans-json.d.ts +2 -0
- package/dist/utils/localization/translations/zh-Hans-json.js +3 -1
- package/dist/utils/localization/translations/zh-TW-json.js +7 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -40,7 +40,16 @@ Zenith library provides components defined in Zenith Design System. It includes
|
|
|
40
40
|
|
|
41
41
|
## Change log
|
|
42
42
|
|
|
43
|
-
### 1.25.
|
|
43
|
+
### 1.25.3
|
|
44
|
+
|
|
45
|
+
## 1.25.3
|
|
46
|
+
|
|
47
|
+
* Update translations in `Chart`
|
|
48
|
+
* ColumnsSelector is right-aligned by default
|
|
49
|
+
* Fix width of visible on hover actions in `Table`
|
|
50
|
+
* Promise-based actions in `Table`
|
|
51
|
+
|
|
52
|
+
### 1.25.2
|
|
44
53
|
|
|
45
54
|
* `FiltersBar.DropdownWithCheckbox` has been added
|
|
46
55
|
* `FormStepper` has been added
|
|
@@ -20,7 +20,7 @@ const ColumnsSelector = ({ id, columns = [], onColumnToggle, additionalColumns =
|
|
|
20
20
|
const resetButton = onColumnsReset
|
|
21
21
|
? (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { className: "zen-button--separate zen-columns-filter__item zen-columns-filter__item--button zen-columns-filter__reset", iconPosition: textIconButton_1.ButtonIconPosition.Start, icon: iconRefresh_1.IconRefresh, iconSize: svgIconSize_1.SvgIconSize.Huge, onClick: onColumnsReset, children: translate("Reset to default") })
|
|
22
22
|
: (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
|
|
23
|
-
return (0, jsx_runtime_1.jsxs)(popup_1.Popup, { className: "zen-columns-filter", trigger: triggerButton, children: [resetButton, (0, jsx_runtime_1.jsx)(columnsTab_1.ColumnsTab, { id: id, columns: columns, onColumnToggle: state => onColumnToggle && onColumnToggle(state) }), (0, jsx_runtime_1.jsx)(columnsTabGroup_1.ColumnsTabGroup, { columns: additionalColumns, onColumnToggle: state => onAdditionalColumnToggle && onAdditionalColumnToggle(state) })] });
|
|
23
|
+
return (0, jsx_runtime_1.jsxs)(popup_1.Popup, { className: "zen-columns-filter", trigger: triggerButton, alignment: "bottom-right", children: [resetButton, (0, jsx_runtime_1.jsx)(columnsTab_1.ColumnsTab, { id: id, columns: columns, onColumnToggle: state => onColumnToggle && onColumnToggle(state) }), (0, jsx_runtime_1.jsx)(columnsTabGroup_1.ColumnsTabGroup, { columns: additionalColumns, onColumnToggle: state => onAdditionalColumnToggle && onAdditionalColumnToggle(state) })] });
|
|
24
24
|
};
|
|
25
25
|
exports.ColumnsSelector = ColumnsSelector;
|
|
26
26
|
exports.TRANSLATIONS = [
|
|
@@ -15,13 +15,14 @@ interface IDataFeedOptions {
|
|
|
15
15
|
}
|
|
16
16
|
export interface IDataFeed<T> extends IDataGrid<T> {
|
|
17
17
|
expanded: boolean;
|
|
18
|
-
actions?: IActionWithId<T> | ((e: T) => JSX.Element);
|
|
18
|
+
actions?: IActionWithId<T> | ((e: T) => JSX.Element) | undefined;
|
|
19
|
+
actionsAsync?: IActionWithId<T> | ((e: T) => PromiseLike<JSX.Element>);
|
|
19
20
|
options: IDataFeedOptions;
|
|
20
21
|
itemsPerPage?: number;
|
|
21
22
|
}
|
|
22
23
|
declare const EmptyList: FC<PropsWithChildren>;
|
|
23
24
|
declare const Footer: FC<PropsWithChildren>;
|
|
24
|
-
declare const DataFeedInner: <T extends IEntityWithId>({ entities, columns, className, expanded, options, description, children, actions, itemsPerPage, rowClassName }: IDataFeed<T>, ref: ForwardedRef<HTMLElement>) => import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
declare const DataFeedInner: <T extends IEntityWithId>({ entities, columns, className, expanded, options, description, children, actions, actionsAsync, itemsPerPage, rowClassName }: IDataFeed<T>, ref: ForwardedRef<HTMLElement>) => import("react/jsx-runtime").JSX.Element;
|
|
25
26
|
export interface IDataFeedStaticProps {
|
|
26
27
|
EmptyList: typeof EmptyList;
|
|
27
28
|
Footer: typeof Footer;
|
|
@@ -22,7 +22,7 @@ const checkCloseToTheEnd = (feedContainerElt) => {
|
|
|
22
22
|
return distanceToTheBottom < endOfFeedThreshold;
|
|
23
23
|
};
|
|
24
24
|
const FIRST_RENDERED_ROWS = 50;
|
|
25
|
-
const DataFeedInner = ({ entities, columns, className, expanded, options, description, children, actions, itemsPerPage = 1000, rowClassName }, ref) => {
|
|
25
|
+
const DataFeedInner = ({ entities, columns, className, expanded, options, description, children, actions, actionsAsync, itemsPerPage = 1000, rowClassName }, ref) => {
|
|
26
26
|
const [pages, setPages] = (0, react_1.useState)(1);
|
|
27
27
|
const data = (0, react_1.useMemo)(() => entities.slice(0, itemsPerPage * pages), [entities, itemsPerPage, pages]);
|
|
28
28
|
const initialVisibleRows = (0, react_1.useMemo)(() => data.slice(0, FIRST_RENDERED_ROWS).map(r => r.id), [data]);
|
|
@@ -94,11 +94,11 @@ const DataFeedInner = ({ entities, columns, className, expanded, options, descri
|
|
|
94
94
|
}, true);
|
|
95
95
|
const feedItems = (0, react_1.useMemo)(() => data.map((entity, index) => {
|
|
96
96
|
const entityClassName = (0, getRowClassName_1.getRowClassName)(rowClassName, entity);
|
|
97
|
-
if (!actions) {
|
|
97
|
+
if (!actions && !actionsAsync) {
|
|
98
98
|
return (0, jsx_runtime_1.jsx)(dataFeedColumnsItems_1.FeedItem, { collapsedColumnsQty: collapsedColumnsQty, columnsList: columnsList, visibleColumns: visibleColumns, entity: entity, visibleRows: visibleRows, index: index, expanded: expanded, className: entityClassName }, entity.id);
|
|
99
99
|
}
|
|
100
|
-
return (0, jsx_runtime_1.jsx)(dataFeedColumnsItems_1.ActionFeedItem, { collapsedColumnsQty: collapsedColumnsQty, visibleColumns: visibleColumns, columnsList: columnsList, entity: entity, visibleRows: visibleRows, index: index, expanded: expanded, actions: actions, className: entityClassName }, entity.id);
|
|
101
|
-
}), [data, rowClassName, actions, collapsedColumnsQty, visibleColumns, columnsList, visibleRows, expanded]);
|
|
100
|
+
return (0, jsx_runtime_1.jsx)(dataFeedColumnsItems_1.ActionFeedItem, { collapsedColumnsQty: collapsedColumnsQty, visibleColumns: visibleColumns, columnsList: columnsList, entity: entity, visibleRows: visibleRows, index: index, expanded: expanded, actions: actions, actionsAsync: actionsAsync, className: entityClassName }, entity.id);
|
|
101
|
+
}), [data, rowClassName, actions, actionsAsync, collapsedColumnsQty, visibleColumns, columnsList, visibleRows, expanded]);
|
|
102
102
|
return (0, jsx_runtime_1.jsx)("div", { className: "zen-data-grid-wrapper", children: (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)([
|
|
103
103
|
"zen-data-grid",
|
|
104
104
|
className || ""
|
|
@@ -17,8 +17,9 @@ interface IFeedItem<T extends IEntityWithId> {
|
|
|
17
17
|
className?: string;
|
|
18
18
|
}
|
|
19
19
|
interface IFeedActionItem<T extends IEntityWithId> extends IFeedItem<T> {
|
|
20
|
-
actions: IActionWithId<T> | ((entity: T) => JSX.Element);
|
|
20
|
+
actions: IActionWithId<T> | ((entity: T) => JSX.Element) | undefined;
|
|
21
|
+
actionsAsync?: IActionWithId<T> | ((entity: T) => PromiseLike<JSX.Element>);
|
|
21
22
|
}
|
|
22
23
|
export declare const FeedItem: <T extends IEntityWithId>({ columnsList, expanded, collapsedColumnsQty, visibleColumns, visibleRows, entity, index, className }: IFeedItem<T>) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
-
export declare const ActionFeedItem: <T extends IEntityWithId>({ columnsList, expanded, collapsedColumnsQty, visibleColumns, visibleRows, entity, index, actions, className }: IFeedActionItem<T>) => import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export declare const ActionFeedItem: <T extends IEntityWithId>({ columnsList, expanded, collapsedColumnsQty, visibleColumns, visibleRows, entity, index, actions, actionsAsync, className }: IFeedActionItem<T>) => import("react/jsx-runtime").JSX.Element;
|
|
24
25
|
export {};
|
|
@@ -19,7 +19,7 @@ const FeedItemInner = ({ columnsList, expanded, collapsedColumnsQty, visibleColu
|
|
|
19
19
|
return (0, jsx_runtime_1.jsxs)(feedItem_1.DataFeedItem, { id: entity.id, isLast: false, index: index, isFullList: expanded, className: className, children: [(0, jsx_runtime_1.jsx)(feedItem_1.DataFeedItem.Main, { children: mainColumnsData }), secondaryColumnsMemoized.length ? (0, jsx_runtime_1.jsx)(feedItem_1.DataFeedItem.Secondary, { children: secondaryColumnsData }) : null] });
|
|
20
20
|
};
|
|
21
21
|
exports.FeedItem = (0, react_1.memo)(FeedItemInner);
|
|
22
|
-
const ActionFeedItemInner = ({ columnsList, expanded, collapsedColumnsQty, visibleColumns, visibleRows, entity, index, actions, className }) => {
|
|
22
|
+
const ActionFeedItemInner = ({ columnsList, expanded, collapsedColumnsQty, visibleColumns, visibleRows, entity, index, actions, actionsAsync, className }) => {
|
|
23
23
|
const actionsComp = (0, react_1.useMemo)(() => {
|
|
24
24
|
if (entity.isLoading) {
|
|
25
25
|
return null;
|
|
@@ -27,8 +27,11 @@ const ActionFeedItemInner = ({ columnsList, expanded, collapsedColumnsQty, visib
|
|
|
27
27
|
if (typeof actions === "function") {
|
|
28
28
|
return (0, jsx_runtime_1.jsx)(actionsMenu_1.ActionsMenu, { entity: entity, render: actions });
|
|
29
29
|
}
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
if (actionsAsync && typeof actionsAsync === "function") {
|
|
31
|
+
return (0, jsx_runtime_1.jsx)(actionsMenu_1.ActionsMenu, { entity: entity, renderAsync: actionsAsync });
|
|
32
|
+
}
|
|
33
|
+
return actions ? (0, jsx_runtime_1.jsx)(actionsButton_1.ActionsButton, { action: actions, entity: entity }) : null;
|
|
34
|
+
}, [actions, actionsAsync, entity]);
|
|
32
35
|
return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-data-feed__item-container", className || ""]), children: [(0, jsx_runtime_1.jsx)(exports.FeedItem, { collapsedColumnsQty: collapsedColumnsQty, visibleColumns: visibleColumns, columnsList: columnsList, entity: entity, visibleRows: visibleRows, index: index, expanded: expanded, className: "zen-data-feed__item--no-shadow" }, entity.id), (0, jsx_runtime_1.jsx)("div", { className: "zen-data-feed__action-container", children: actionsComp })] }, entity.id);
|
|
33
36
|
};
|
|
34
37
|
exports.ActionFeedItem = (0, react_1.memo)(ActionFeedItemInner);
|
|
@@ -54,6 +54,6 @@ const Cell = ({ index, limited, visibleOnHover, isVisible, width, column, entity
|
|
|
54
54
|
index === 0 ? "zen-data-grid__row-cell--first" : "",
|
|
55
55
|
visibleOnHover ? "zen-data-grid__row-cell--visible-on-hover" : "",
|
|
56
56
|
limited ? "zen-ellipsis" : ""
|
|
57
|
-
]), style: { minWidth: width, maxWidth: width }, children: content });
|
|
57
|
+
]), style: { minWidth: width || "auto", maxWidth: width || "auto" }, children: content });
|
|
58
58
|
};
|
|
59
59
|
exports.DataGridCell = (0, react_1.memo)(Cell);
|
|
@@ -26,13 +26,17 @@ interface IActionsColumnOptions<T> {
|
|
|
26
26
|
title?: string;
|
|
27
27
|
actions?: IAction<T>[];
|
|
28
28
|
headerActions?: IAction<undefined>[];
|
|
29
|
+
primaryActions?: IAction<T>[];
|
|
29
30
|
render?: (entity: T) => JSX.Element;
|
|
31
|
+
renderAsync?: (entity: T) => PromiseLike<JSX.Element>;
|
|
30
32
|
}
|
|
31
33
|
export declare class ActionsColumn<T extends IEntityWithId> extends BasicColumn<T, unknown> implements IListColumnBasic<T> {
|
|
32
34
|
private actionsOptions;
|
|
33
35
|
private actions;
|
|
34
36
|
private headerActions;
|
|
37
|
+
private primaryActions;
|
|
35
38
|
private renderFn;
|
|
39
|
+
private renderAsyncFn;
|
|
36
40
|
private renderIconActions;
|
|
37
41
|
private updateActions;
|
|
38
42
|
protected renderCell(_: any, entity: T): import("react/jsx-runtime").JSX.Element;
|
|
@@ -41,5 +45,6 @@ export declare class ActionsColumn<T extends IEntityWithId> extends BasicColumn<
|
|
|
41
45
|
get options(): IActionsColumnOptions<T>;
|
|
42
46
|
set options(actionsOptions: IActionsColumnOptions<T>);
|
|
43
47
|
get columnActions(): IActionWithId<T> | ((entity: T) => JSX.Element) | undefined;
|
|
48
|
+
get columnActionsAsync(): ((entity: T) => PromiseLike<JSX.Element>) | undefined;
|
|
44
49
|
}
|
|
45
50
|
export {};
|
|
@@ -15,11 +15,13 @@ class ActionsColumn extends basicColumn_1.BasicColumn {
|
|
|
15
15
|
updateActions(options) {
|
|
16
16
|
this.actions = options.actions ? options.actions.map(action => { var _a; return (Object.assign(Object.assign({}, action), { id: action.id || (0, generateId_1.generateId)(), actions: (_a = action.actions) === null || _a === void 0 ? void 0 : _a.map(a => (Object.assign(Object.assign({}, a), { id: (0, generateId_1.generateId)() }))) })); }) : undefined;
|
|
17
17
|
this.renderFn = options.render;
|
|
18
|
+
this.renderAsyncFn = options.renderAsync;
|
|
18
19
|
this.headerActions = (options.headerActions || []).map(action => { var _a; return (Object.assign(Object.assign({}, action), { id: action.id || (0, generateId_1.generateId)(), actions: (_a = action.actions) === null || _a === void 0 ? void 0 : _a.map(a => (Object.assign(Object.assign({}, a), { id: (0, generateId_1.generateId)() }))) })); });
|
|
20
|
+
this.primaryActions = (options.primaryActions || []).map(action => { var _a; return (Object.assign(Object.assign({}, action), { id: action.id || (0, generateId_1.generateId)(), actions: (_a = action.actions) === null || _a === void 0 ? void 0 : _a.map(a => (Object.assign(Object.assign({}, a), { id: (0, generateId_1.generateId)() }))) })); });
|
|
19
21
|
}
|
|
20
22
|
renderCell(_, entity) {
|
|
21
|
-
if (this.options.render) {
|
|
22
|
-
return (0, jsx_runtime_1.
|
|
23
|
+
if (this.options.render || this.options.renderAsync) {
|
|
24
|
+
return (0, jsx_runtime_1.jsxs)("div", { className: "zen-actions-column", children: [this.primaryActions && this.primaryActions.length > 0 && this.renderIconActions(entity, this.primaryActions), this.options.render && (0, jsx_runtime_1.jsx)(actionsMenu_1.ActionsMenu, { entity: entity, render: this.options.render }), this.options.renderAsync && (0, jsx_runtime_1.jsx)(actionsMenu_1.ActionsMenu, { entity: entity, renderAsync: this.options.renderAsync })] });
|
|
23
25
|
}
|
|
24
26
|
return this.renderIconActions(entity, this.actions || []);
|
|
25
27
|
}
|
|
@@ -46,12 +48,24 @@ class ActionsColumn extends basicColumn_1.BasicColumn {
|
|
|
46
48
|
writable: true,
|
|
47
49
|
value: []
|
|
48
50
|
});
|
|
51
|
+
Object.defineProperty(this, "primaryActions", {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
configurable: true,
|
|
54
|
+
writable: true,
|
|
55
|
+
value: void 0
|
|
56
|
+
});
|
|
49
57
|
Object.defineProperty(this, "renderFn", {
|
|
50
58
|
enumerable: true,
|
|
51
59
|
configurable: true,
|
|
52
60
|
writable: true,
|
|
53
61
|
value: void 0
|
|
54
62
|
});
|
|
63
|
+
Object.defineProperty(this, "renderAsyncFn", {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
configurable: true,
|
|
66
|
+
writable: true,
|
|
67
|
+
value: void 0
|
|
68
|
+
});
|
|
55
69
|
this.updateActions(actionsOptions);
|
|
56
70
|
}
|
|
57
71
|
get options() {
|
|
@@ -64,5 +78,8 @@ class ActionsColumn extends basicColumn_1.BasicColumn {
|
|
|
64
78
|
get columnActions() {
|
|
65
79
|
return (this.actions ? this.actions[0] : undefined) || this.renderFn;
|
|
66
80
|
}
|
|
81
|
+
get columnActionsAsync() {
|
|
82
|
+
return this.renderAsyncFn || undefined;
|
|
83
|
+
}
|
|
67
84
|
}
|
|
68
85
|
exports.ActionsColumn = ActionsColumn;
|
package/dist/dataGrid/row/row.js
CHANGED
|
@@ -47,7 +47,7 @@ const Row = ({ id, entity, columns, visibleRows, flexibleColumnWidth, isLastRow,
|
|
|
47
47
|
if (colspan) {
|
|
48
48
|
acc.colspan = colspan - 1;
|
|
49
49
|
}
|
|
50
|
-
acc.cells.push((0, jsx_runtime_1.jsx)(cell_1.DataGridCell, { column: column, entity: entity, index: index, limited: limited, visibleOnHover: column.meta.visibleOnHover, width: width, isVisible: isVisible, colspan: colspan }, `${entity.id}_${column.name}`));
|
|
50
|
+
acc.cells.push((0, jsx_runtime_1.jsx)(cell_1.DataGridCell, { column: column, entity: entity, index: index, limited: limited, visibleOnHover: column.meta.visibleOnHover, width: column.meta.visibleOnHover ? 0 : width, isVisible: isVisible, colspan: colspan }, `${entity.id}_${column.name}`));
|
|
51
51
|
return acc;
|
|
52
52
|
}, { cells: [], colspan: 0 }).cells;
|
|
53
53
|
return (0, jsx_runtime_1.jsx)("tr", { "data-row-id": id, className: (0, classNames_1.classNames)([
|
|
@@ -13,13 +13,15 @@ const withActions = (DataGridComponent) => (0, react_1.forwardRef)(
|
|
|
13
13
|
function InnerColumnsList(props, ref) {
|
|
14
14
|
const { columns } = props;
|
|
15
15
|
let actions = undefined;
|
|
16
|
+
let actionsAsync = undefined;
|
|
16
17
|
const columnsWithActions = columns.find(el => el.columnComponent instanceof actionsColumn_1.ActionsColumn);
|
|
17
18
|
if (columnsWithActions && columnsWithActions.columnComponent) {
|
|
18
19
|
const colComp = columnsWithActions.columnComponent;
|
|
19
20
|
const colActions = colComp.columnActions;
|
|
20
21
|
actions = colActions ? colActions : undefined;
|
|
22
|
+
actionsAsync = colComp.columnActionsAsync;
|
|
21
23
|
}
|
|
22
24
|
const allColumns = (0, react_1.useMemo)(() => columns.filter(el => !(el.columnComponent instanceof actionsColumn_1.ActionsColumn)).map(column => (Object.assign({}, (0, toBasicColumn_1.toBasicColumn)(Object.assign({}, column))))), [columns]);
|
|
23
|
-
return (0, jsx_runtime_1.jsx)(DataGridComponent, Object.assign({}, props, { columns: [...allColumns], actions: actions, ref: ref }), "grid");
|
|
25
|
+
return (0, jsx_runtime_1.jsx)(DataGridComponent, Object.assign({}, props, { columns: [...allColumns], actions: actions, actionsAsync: actionsAsync, ref: ref }), "grid");
|
|
24
26
|
});
|
|
25
27
|
exports.withActions = withActions;
|
package/dist/index.css
CHANGED
|
@@ -7476,6 +7476,22 @@ button.zen-summary__clickable {
|
|
|
7476
7476
|
width: 100%;
|
|
7477
7477
|
gap: 1rem;
|
|
7478
7478
|
}
|
|
7479
|
+
.zen-actions-column__menu-item-error .zen-menu-button__action-text {
|
|
7480
|
+
color: var(--text-primary);
|
|
7481
|
+
}
|
|
7482
|
+
.zen-actions-column__menu-item-error .zen-icon {
|
|
7483
|
+
fill: var(--text-error-message);
|
|
7484
|
+
}
|
|
7485
|
+
.zen-actions-column__action {
|
|
7486
|
+
flex-shrink: 0;
|
|
7487
|
+
}
|
|
7488
|
+
.zen-actions-column__action_error {
|
|
7489
|
+
background-color: var(--accents-error--main);
|
|
7490
|
+
fill: var(--text-error-message);
|
|
7491
|
+
}
|
|
7492
|
+
.zen-actions-column__waiting {
|
|
7493
|
+
padding: 16px 20px;
|
|
7494
|
+
}
|
|
7479
7495
|
.zen-feed-item {
|
|
7480
7496
|
display: grid;
|
|
7481
7497
|
grid-template-columns: auto 1fr;
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import { IEntityWithId } from "../../commonHelpers/entity";
|
|
3
3
|
interface IActionsMenuProps<T extends IEntityWithId> {
|
|
4
4
|
entity: T;
|
|
5
|
-
render
|
|
5
|
+
render?: (entity: T) => JSX.Element;
|
|
6
|
+
renderAsync?: (entity: T) => PromiseLike<JSX.Element>;
|
|
6
7
|
}
|
|
7
|
-
export declare const ActionsMenu: <T extends IEntityWithId>({ entity, render }: IActionsMenuProps<T>) => import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
export declare const ActionsMenu: <T extends IEntityWithId>({ entity, render, renderAsync }: IActionsMenuProps<T>) => import("react/jsx-runtime").JSX.Element | null;
|
|
8
9
|
export {};
|
|
@@ -7,17 +7,64 @@ const button_1 = require("../../button/button");
|
|
|
7
7
|
const iconDotVertical_1 = require("../../icons/iconDotVertical");
|
|
8
8
|
const useLanguage_1 = require("../../utils/localization/useLanguage");
|
|
9
9
|
const menu_1 = require("../../menu/menu");
|
|
10
|
+
const iconException_1 = require("../../icons/iconException");
|
|
11
|
+
const classNames_1 = require("../../commonHelpers/classNames/classNames");
|
|
12
|
+
const skeletonList_1 = require("../../skeletonList/skeletonList");
|
|
10
13
|
const getMenuItems = (entity, render) => {
|
|
14
|
+
if (!render) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
11
17
|
const result = render(entity);
|
|
12
18
|
if (result.type === menu_1.Menu.Item) {
|
|
13
19
|
return result;
|
|
14
20
|
}
|
|
15
21
|
return result.props.children;
|
|
16
22
|
};
|
|
17
|
-
const ActionsMenu = ({ entity, render }) => {
|
|
23
|
+
const ActionsMenu = ({ entity, render, renderAsync }) => {
|
|
18
24
|
const { translate } = (0, useLanguage_1.useLanguage)();
|
|
19
|
-
const
|
|
25
|
+
const generatedId = (0, react_1.useId)();
|
|
26
|
+
const buttonId = `ariaLabelBy-${entity.id || generatedId} }`;
|
|
27
|
+
const ref = (0, react_1.useRef)(null);
|
|
20
28
|
const menuItems = (0, react_1.useMemo)(() => getMenuItems(entity, render), [entity, render]);
|
|
29
|
+
const [menuItemsAsync, setMenuItemsAsync] = (0, react_1.useState)(null);
|
|
30
|
+
const [isLoading, setIsLoading] = (0, react_1.useState)(false);
|
|
31
|
+
const [isError, setIsError] = (0, react_1.useState)(false);
|
|
32
|
+
const handleClickTrigger = (0, react_1.useCallback)(async () => {
|
|
33
|
+
try {
|
|
34
|
+
if (renderAsync && !menuItemsAsync) {
|
|
35
|
+
setIsLoading(true);
|
|
36
|
+
setIsError(false);
|
|
37
|
+
const resolvedMenuItems = await renderAsync(entity);
|
|
38
|
+
setMenuItemsAsync(resolvedMenuItems);
|
|
39
|
+
if (!resolvedMenuItems.props.children) {
|
|
40
|
+
setIsError(true);
|
|
41
|
+
}
|
|
42
|
+
setIsLoading(false);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
setIsLoading(false);
|
|
47
|
+
setMenuItemsAsync(null);
|
|
48
|
+
setIsError(true);
|
|
49
|
+
}
|
|
50
|
+
}, [entity, menuItemsAsync, renderAsync]);
|
|
51
|
+
const trigger = (0, react_1.useMemo)(() => {
|
|
52
|
+
if (renderAsync) {
|
|
53
|
+
return (0, jsx_runtime_1.jsx)(button_1.Button, { disabled: isLoading, id: buttonId, ref: ref, onClick: handleClickTrigger, type: "tertiary-black", className: (0, classNames_1.classNames)([
|
|
54
|
+
"zen-caption",
|
|
55
|
+
"zen-actions-column__action",
|
|
56
|
+
isError ? "zen-actions-column__action_error" : ""
|
|
57
|
+
]), children: (0, jsx_runtime_1.jsx)(iconDotVertical_1.IconDotVertical, { size: "bigger" }) });
|
|
58
|
+
}
|
|
59
|
+
return (0, jsx_runtime_1.jsx)(button_1.Button, { type: "tertiary-black", className: "zen-caption zen-actions-column__action", children: (0, jsx_runtime_1.jsx)(iconDotVertical_1.IconDotVertical, { size: "bigger" }) });
|
|
60
|
+
}, [buttonId, isLoading, isError, renderAsync, handleClickTrigger]);
|
|
61
|
+
if (renderAsync) {
|
|
62
|
+
return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [trigger, (0, jsx_runtime_1.jsx)(menu_1.Menu, { ariaLabelledBy: buttonId, title: translate("Actions"), triggerRef: ref, alignment: "bottom-right", children: isLoading
|
|
63
|
+
? (0, jsx_runtime_1.jsx)(skeletonList_1.SkeletonList, { className: "zen-actions-column__waiting" })
|
|
64
|
+
: ((menuItemsAsync && menuItemsAsync.props.children)
|
|
65
|
+
? menuItemsAsync.props.children
|
|
66
|
+
: (0, jsx_runtime_1.jsx)(menu_1.Menu.Item, { className: "zen-actions-column__menu-item-error", id: "error", icon: iconException_1.IconException, name: translate("Error Loading Items"), disabled: true })) })] });
|
|
67
|
+
}
|
|
21
68
|
if (!menuItems || menuItems.length === 0) {
|
|
22
69
|
return null;
|
|
23
70
|
}
|
|
@@ -5,4 +5,5 @@ import { IListColumn } from "../table";
|
|
|
5
5
|
export declare const useActions: <T extends IEntityWithId>(columns: IListColumn<T>[], isFeed: boolean) => {
|
|
6
6
|
columnsWithActions: IListColumn<T>[];
|
|
7
7
|
actions: IActionWithId<T> | ((entity: T) => JSX.Element) | undefined;
|
|
8
|
+
actionsAsync: ((entity: T) => PromiseLike<JSX.Element>) | undefined;
|
|
8
9
|
};
|
|
@@ -6,16 +6,18 @@ const actionsColumn_1 = require("../../dataGrid/columns/actionsColumn/actionsCol
|
|
|
6
6
|
const useActions = (columns, isFeed) => {
|
|
7
7
|
const result = (0, react_1.useMemo)(() => {
|
|
8
8
|
if (!isFeed) {
|
|
9
|
-
return { columnsWithActions: [...columns], actions: undefined };
|
|
9
|
+
return { columnsWithActions: [...columns], actions: undefined, actionsAsync: undefined };
|
|
10
10
|
}
|
|
11
11
|
const columnsWithActions = columns.find(el => el.columnComponent instanceof actionsColumn_1.ActionsColumn);
|
|
12
12
|
let actions = undefined;
|
|
13
|
+
let actionsAsync = undefined;
|
|
13
14
|
if (columnsWithActions && columnsWithActions.columnComponent) {
|
|
14
15
|
const colComponent = columnsWithActions.columnComponent;
|
|
15
16
|
actions = colComponent.columnActions;
|
|
17
|
+
actionsAsync = colComponent.columnActionsAsync;
|
|
16
18
|
}
|
|
17
19
|
const columnsWithoutActions = columns.filter(el => !(el.columnComponent instanceof actionsColumn_1.ActionsColumn));
|
|
18
|
-
return { columnsWithActions: columnsWithoutActions, actions };
|
|
20
|
+
return { columnsWithActions: columnsWithoutActions, actions, actionsAsync };
|
|
19
21
|
}, [columns, isFeed]);
|
|
20
22
|
return result;
|
|
21
23
|
};
|
package/dist/table/table.js
CHANGED
|
@@ -59,7 +59,7 @@ const TableInner = ({ entities, columns, selectable, sortable, flexible, isLoadi
|
|
|
59
59
|
const { selectableColumns } = (0, useSelectableRows_1.useSelectableRows)(columns, entities, isMobile, selectMode, setMobileSelectMode, isLoading ? undefined : selectable);
|
|
60
60
|
const { sortableColumns, feedSortControl } = (0, useSortableColumns_1.useSortableColumns)(selectableColumns, sortable, isMobile);
|
|
61
61
|
const { flexibleColumns, columnsPopup } = (0, useFlexibleColumns_1.useFlexibleColumns)(sortableColumns, flexible, gridRef, columnsPopupRef, isMobile);
|
|
62
|
-
const { columnsWithActions, actions } = (0, useActions_1.useActions)(flexibleColumns, isMobile);
|
|
62
|
+
const { columnsWithActions, actions, actionsAsync } = (0, useActions_1.useActions)(flexibleColumns, isMobile);
|
|
63
63
|
const { loadingColumns, loadingEntities } = (0, useLoading_1.useLoading)(columnsWithActions, entities, isLoading, loading);
|
|
64
64
|
const { isFeedExpanded, handleExpanded, isFeedVisible, visibleColumns } = (0, useFeedExpandable_1.useFeedExpandable)(isMobile, feedExpandable);
|
|
65
65
|
const selectionQty = (0, react_1.useMemo)(() => {
|
|
@@ -98,7 +98,7 @@ const TableInner = ({ entities, columns, selectable, sortable, flexible, isLoadi
|
|
|
98
98
|
: null, isMobile ? (0, jsx_runtime_1.jsxs)(dataFeed_1.DataFeed, { columns: loadingColumns, entities: loadingEntities, expanded: isFeedExpanded, options: {
|
|
99
99
|
onFeedEnd: onFeedEnd,
|
|
100
100
|
visibleColumns
|
|
101
|
-
}, actions: actions, ref: gridRef, rowClassName: rowClassName, children: [emptyList || (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {}), footer || (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {})] }) : (0, jsx_runtime_1.jsxs)(dataGrid_1.DataGrid, { columns: loadingColumns, entities: loadingEntities, ref: gridRef, rowClassName: rowClassName, children: [emptyList || (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {}), footer || (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {})] })] }) });
|
|
101
|
+
}, actions: actions, actionsAsync: actionsAsync, ref: gridRef, rowClassName: rowClassName, children: [emptyList || (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {}), footer || (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {})] }) : (0, jsx_runtime_1.jsxs)(dataGrid_1.DataGrid, { columns: loadingColumns, entities: loadingEntities, ref: gridRef, rowClassName: rowClassName, children: [emptyList || (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {}), footer || (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {})] })] }) });
|
|
102
102
|
};
|
|
103
103
|
const Table = (0, react_1.memo)(TableInner);
|
|
104
104
|
exports.Table = Table;
|
|
@@ -227,5 +227,7 @@ exports.translations = {
|
|
|
227
227
|
"Continue": "Lanjutkan",
|
|
228
228
|
"Submit": "Kirimkan",
|
|
229
229
|
"Optional": "Opsional",
|
|
230
|
-
"Step {0} of {1}": "Langkah {0} dari {1}"
|
|
230
|
+
"Step {0} of {1}": "Langkah {0} dari {1}",
|
|
231
|
+
"Y-axis": "Poros y",
|
|
232
|
+
"X-axis": "Sumbu X"
|
|
231
233
|
};
|
|
@@ -226,5 +226,7 @@ exports.translations = {
|
|
|
226
226
|
"Continue": "Teruskan",
|
|
227
227
|
"Submit": "Serah",
|
|
228
228
|
"Optional": "Pilihan",
|
|
229
|
-
"Step {0} of {1}": "Langkah {0} daripada {1}"
|
|
229
|
+
"Step {0} of {1}": "Langkah {0} daripada {1}",
|
|
230
|
+
"Y-axis": "Paksi-Y",
|
|
231
|
+
"X-axis": "Paksi X"
|
|
230
232
|
};
|
|
@@ -181,13 +181,13 @@ exports.translations = {
|
|
|
181
181
|
"This quarter": "本季",
|
|
182
182
|
"This year": "今年",
|
|
183
183
|
"Last year": "去年",
|
|
184
|
-
"ShortMonday": "
|
|
185
|
-
"ShortTuesday": "
|
|
186
|
-
"ShortWednesday": "
|
|
187
|
-
"ShortThursday": "
|
|
188
|
-
"ShortFriday": "
|
|
189
|
-
"ShortSaturday": "
|
|
190
|
-
"ShortSunday": "
|
|
184
|
+
"ShortMonday": "週一",
|
|
185
|
+
"ShortTuesday": "週二",
|
|
186
|
+
"ShortWednesday": "週三",
|
|
187
|
+
"ShortThursday": "週四",
|
|
188
|
+
"ShortFriday": "週五",
|
|
189
|
+
"ShortSaturday": "週六",
|
|
190
|
+
"ShortSunday": "週日",
|
|
191
191
|
"Date range": "日期範圍",
|
|
192
192
|
"Use multiple operators when searching for a specific group. For example, filtering for assets that belong to the Tractor group and the Toronto group displays a list of tractors that belong to the Toronto branch.": "搜尋特定群組時,請使用多個運算子。例如,若篩選屬於牽引機群組和多倫多群組的資產,則會顯示屬於多倫多分公司的牽引機清單。",
|
|
193
193
|
"Select columns": "選取欄",
|