@michalrakus/x-react-web-lib 1.4.1 → 1.5.1
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/XButtonIconMedium.d.ts +3 -0
- package/XButtonIconMedium.js +5 -0
- package/gulpfile.js +1 -0
- package/lib/components/XButtonIconMedium.d.ts +9 -0
- package/lib/components/XButtonIconMedium.js +13 -0
- package/lib/components/XDropdown.d.ts +1 -0
- package/lib/components/XDropdown.js +1 -1
- package/lib/components/XDropdownForEntity.d.ts +1 -0
- package/lib/components/XDropdownForEntity.js +5 -4
- package/lib/components/XFormDataTable2.d.ts +3 -0
- package/lib/components/XFormDataTable2.js +8 -5
- package/lib/components/XLazyDataTable.d.ts +13 -4
- package/lib/components/XLazyDataTable.js +112 -56
- package/lib/components/XUtils.d.ts +1 -1
- package/lib/components/XUtils.js +2 -2
- package/lib/serverApi/FindParam.d.ts +11 -0
- package/lib/serverApi/FindParam.js +8 -1
- package/lib/serverApi/FindResult.d.ts +4 -0
- package/package.json +1 -1
package/gulpfile.js
CHANGED
|
@@ -18,6 +18,7 @@ function generateApi(cb) {
|
|
|
18
18
|
"./lib/components/XAutoCompleteBase",
|
|
19
19
|
"./lib/components/XBrowse",
|
|
20
20
|
"./lib/components/XButton",
|
|
21
|
+
"./lib/components/XButtonIconMedium",
|
|
21
22
|
"./lib/components/XButtonIconNarrow",
|
|
22
23
|
"./lib/components/XButtonIconSmall",
|
|
23
24
|
"./lib/components/XCalendar",
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { ButtonProps } from "primereact/button";
|
|
3
|
+
import { IconType } from "primereact/utils";
|
|
4
|
+
export declare const XButtonIconMedium: (props: {
|
|
5
|
+
icon: IconType<ButtonProps>;
|
|
6
|
+
onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
|
|
7
|
+
disabled?: boolean | undefined;
|
|
8
|
+
tooltip?: any;
|
|
9
|
+
}) => JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.XButtonIconMedium = void 0;
|
|
7
|
+
var react_1 = __importDefault(require("react"));
|
|
8
|
+
var button_1 = require("primereact/button");
|
|
9
|
+
// button trochu mensi (priblizne 30px x 30px) od klasickeho Button, pri pouziti v datatable nastavuje v TD malicky padding (cez css) -> nezvecsuje vysku riadku
|
|
10
|
+
var XButtonIconMedium = function (props) {
|
|
11
|
+
return (react_1.default.createElement(button_1.Button, { icon: props.icon, onClick: props.onClick, disabled: props.disabled, className: 'x-button-icon-medium p-button-sm', tooltip: props.tooltip }));
|
|
12
|
+
};
|
|
13
|
+
exports.XButtonIconMedium = XButtonIconMedium;
|
|
@@ -5,6 +5,7 @@ import { XObject } from "./XObject";
|
|
|
5
5
|
export interface XDropdownProps extends XFormComponentProps<XObject> {
|
|
6
6
|
assocField: string;
|
|
7
7
|
displayField: string;
|
|
8
|
+
sortField?: string;
|
|
8
9
|
filter?: XFilterProp;
|
|
9
10
|
}
|
|
10
11
|
export declare class XDropdown extends XFormComponent<XObject, XDropdownProps> {
|
|
@@ -50,7 +50,7 @@ var XDropdown = /** @class */ (function (_super) {
|
|
|
50
50
|
// planuje sa to riesit bud zavedenim cache pre options alebo vytiahnutim options na uroven XFormBase
|
|
51
51
|
return (react_1.default.createElement("div", { className: "field grid" },
|
|
52
52
|
react_1.default.createElement("label", { htmlFor: this.props.assocField, className: "col-fixed", style: this.getLabelStyle() }, this.getLabel()),
|
|
53
|
-
react_1.default.createElement(XDropdownForEntity_1.XDropdownForEntity, { id: this.props.assocField, entity: this.xAssoc.entityName, displayField: this.props.displayField, value: this.getValue(), onChange: function (value) { return _this.onValueChangeBase(value, _this.props.onChange); }, readOnly: this.isReadOnly(), isNotNull: this.isNotNull(), error: this.getError(), filter: this.getFilterBase(this.props.filter) })));
|
|
53
|
+
react_1.default.createElement(XDropdownForEntity_1.XDropdownForEntity, { id: this.props.assocField, entity: this.xAssoc.entityName, displayField: this.props.displayField, sortField: this.props.sortField, value: this.getValue(), onChange: function (value) { return _this.onValueChangeBase(value, _this.props.onChange); }, readOnly: this.isReadOnly(), isNotNull: this.isNotNull(), error: this.getError(), filter: this.getFilterBase(this.props.filter) })));
|
|
54
54
|
};
|
|
55
55
|
return XDropdown;
|
|
56
56
|
}(XFormComponent_1.XFormComponent));
|
|
@@ -110,13 +110,14 @@ var XDropdownForEntity = /** @class */ (function (_super) {
|
|
|
110
110
|
this.loadOptions();
|
|
111
111
|
};
|
|
112
112
|
XDropdownForEntity.prototype.loadOptions = function () {
|
|
113
|
+
var _a;
|
|
113
114
|
return __awaiter(this, void 0, void 0, function () {
|
|
114
115
|
var options;
|
|
115
|
-
return __generator(this, function (
|
|
116
|
-
switch (
|
|
117
|
-
case 0: return [4 /*yield*/, XUtils_1.XUtils.fetchRows(this.props.entity, this.props.filter, this.props.displayField)];
|
|
116
|
+
return __generator(this, function (_b) {
|
|
117
|
+
switch (_b.label) {
|
|
118
|
+
case 0: return [4 /*yield*/, XUtils_1.XUtils.fetchRows(this.props.entity, this.props.filter, (_a = this.props.sortField) !== null && _a !== void 0 ? _a : this.props.displayField)];
|
|
118
119
|
case 1:
|
|
119
|
-
options =
|
|
120
|
+
options = _b.sent();
|
|
120
121
|
if (this.props.isNotNull === undefined || !this.props.isNotNull) {
|
|
121
122
|
// pridame prazdnu polozku
|
|
122
123
|
options.splice(0, 0, {}); // null polozka
|
|
@@ -24,12 +24,14 @@ export interface XFormDataTableProps {
|
|
|
24
24
|
rows?: number;
|
|
25
25
|
filterDisplay: "menu" | "row" | "none";
|
|
26
26
|
sortable: boolean;
|
|
27
|
+
sortField?: string;
|
|
27
28
|
scrollable: boolean;
|
|
28
29
|
scrollWidth?: string;
|
|
29
30
|
scrollHeight?: string;
|
|
30
31
|
shrinkWidth: boolean;
|
|
31
32
|
label?: string;
|
|
32
33
|
readOnly?: boolean;
|
|
34
|
+
showAddRemoveButtons?: boolean;
|
|
33
35
|
onClickAddRow?: () => void;
|
|
34
36
|
onClickRemoveRow?: (row: any) => void;
|
|
35
37
|
removeButtonInRow: boolean;
|
|
@@ -48,6 +50,7 @@ export declare class XFormDataTable2 extends Component<XFormDataTableProps> {
|
|
|
48
50
|
scrollWidth: string;
|
|
49
51
|
scrollHeight: string;
|
|
50
52
|
shrinkWidth: boolean;
|
|
53
|
+
showAddRemoveButtons: boolean;
|
|
51
54
|
removeButtonInRow: boolean;
|
|
52
55
|
addRowLabel: string;
|
|
53
56
|
removeRowLabel: string;
|
|
@@ -612,7 +612,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
|
|
|
612
612
|
// }
|
|
613
613
|
return react_1.default.createElement(column_1.Column, { field: field, header: header, filter: thisLocal.props.filterDisplay !== "none", sortable: thisLocal.props.sortable, filterElement: filterElement, showFilterMenu: showFilterMenu, showClearButton: showClearButton, headerStyle: headerStyle, align: align, body: function (rowData) { return thisLocal.bodyTemplate(childColumnProps, readOnly, rowData, xEntity); } });
|
|
614
614
|
});
|
|
615
|
-
if (this.props.removeButtonInRow) {
|
|
615
|
+
if (this.props.showAddRemoveButtons && this.props.removeButtonInRow) {
|
|
616
616
|
// je dolezite nastavit sirku header-a, lebo inac ma stlpec sirku 0 a nevidno ho
|
|
617
617
|
columnElemList.push(react_1.default.createElement(column_1.Column, { key: "removeButton", headerStyle: { width: '2rem' }, body: function (rowData) { return react_1.default.createElement(XButtonIconNarrow_1.XButtonIconNarrow, { icon: "pi pi-times", onClick: function () { return _this.removeRow(rowData); }, disabled: readOnly, addMargin: false }); } }));
|
|
618
618
|
}
|
|
@@ -620,10 +620,12 @@ var XFormDataTable2 = /** @class */ (function (_super) {
|
|
|
620
620
|
react_1.default.createElement("div", { className: "flex justify-content-center" },
|
|
621
621
|
react_1.default.createElement("label", null, label)),
|
|
622
622
|
react_1.default.createElement("div", { className: "flex justify-content-center" },
|
|
623
|
-
react_1.default.createElement(datatable_1.DataTable, { ref: function (el) { return _this.dt = el; }, value: valueList, dataKey: this.dataKey, paginator: paginator, rows: rows, totalRecords: valueList.length, filterDisplay: filterDisplay, filters: this.state.filters, onFilter: this.onFilter, sortMode: "multiple", removableSort: true, selectionMode: "single", selection: this.state.selectedRow, onSelectionChange: this.onSelectionChange, className: "p-datatable-sm x-form-datatable", resizableColumns: true, columnResizeMode: "expand", tableStyle: tableStyle, scrollable: this.props.scrollable, scrollHeight: scrollHeight, style: style }, columnElemList)),
|
|
624
|
-
|
|
625
|
-
react_1.default.createElement(
|
|
626
|
-
|
|
623
|
+
react_1.default.createElement(datatable_1.DataTable, { ref: function (el) { return _this.dt = el; }, value: valueList, dataKey: this.dataKey, paginator: paginator, rows: rows, totalRecords: valueList.length, filterDisplay: filterDisplay, filters: this.state.filters, onFilter: this.onFilter, sortMode: "multiple", removableSort: true, multiSortMeta: this.props.sortField !== undefined ? [{ field: this.props.sortField, order: 1 }] : undefined, selectionMode: "single", selection: this.state.selectedRow, onSelectionChange: this.onSelectionChange, className: "p-datatable-sm x-form-datatable", resizableColumns: true, columnResizeMode: "expand", tableStyle: tableStyle, scrollable: this.props.scrollable, scrollHeight: scrollHeight, style: style }, columnElemList)),
|
|
624
|
+
this.props.showAddRemoveButtons ?
|
|
625
|
+
react_1.default.createElement("div", { className: "flex justify-content-center" },
|
|
626
|
+
react_1.default.createElement(XButton_1.XButton, { icon: this.props.addRowIcon, label: this.props.addRowLabel, onClick: this.onClickAddRow, disabled: readOnly }),
|
|
627
|
+
this.props.removeButtonInRow ? undefined : react_1.default.createElement(XButton_1.XButton, { icon: this.props.removeRowIcon, label: this.props.removeRowLabel, onClick: this.onClickRemoveRowBySelection, disabled: readOnly }))
|
|
628
|
+
: undefined));
|
|
627
629
|
};
|
|
628
630
|
XFormDataTable2.defaultProps = {
|
|
629
631
|
filterDisplay: "row",
|
|
@@ -633,6 +635,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
|
|
|
633
635
|
scrollHeight: '200vh',
|
|
634
636
|
// tym ze pouzivame 200vh (max-height pre body), tak realne scrollovanie sa zapne az pri velmi vela riadkoch
|
|
635
637
|
shrinkWidth: true,
|
|
638
|
+
showAddRemoveButtons: true,
|
|
636
639
|
removeButtonInRow: false,
|
|
637
640
|
addRowLabel: 'Add row',
|
|
638
641
|
removeRowLabel: 'Remove row'
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React, { ReactChild } from 'react';
|
|
2
|
-
import { DataTableFilterMetaData, DataTableOperatorFilterMetaData } from 'primereact/datatable';
|
|
2
|
+
import { DataTableFilterMeta, DataTableFilterMetaData, DataTableOperatorFilterMetaData } from 'primereact/datatable';
|
|
3
3
|
import { ColumnBodyOptions, ColumnFilterElementTemplateOptions } from 'primereact/column';
|
|
4
4
|
import { SearchTableParams } from "./SearchTableParams";
|
|
5
|
-
import { XCustomFilter } from "../serverApi/FindParam";
|
|
5
|
+
import { XAggregateType, XCustomFilter } from "../serverApi/FindParam";
|
|
6
6
|
import { XOnSaveOrCancelProp } from "./XFormBase";
|
|
7
7
|
export type XBetweenFilterProp = "row" | "column" | undefined;
|
|
8
8
|
export interface XEditModeHandlers {
|
|
@@ -32,10 +32,12 @@ export interface XLazyDataTableProps {
|
|
|
32
32
|
removeRow?: ((selectedRow: any) => Promise<boolean>) | boolean;
|
|
33
33
|
onRemoveRow?: XOnSaveOrCancelProp;
|
|
34
34
|
appButtons?: any;
|
|
35
|
+
filters?: DataTableFilterMeta;
|
|
35
36
|
customFilter?: XCustomFilter;
|
|
36
|
-
|
|
37
|
+
sortField?: string;
|
|
37
38
|
searchTableParams?: SearchTableParams;
|
|
38
39
|
width?: string;
|
|
40
|
+
dataLoadedState?: [boolean, React.Dispatch<React.SetStateAction<boolean>>];
|
|
39
41
|
editMode?: boolean;
|
|
40
42
|
editModeHandlers?: XEditModeHandlers;
|
|
41
43
|
displayed?: boolean;
|
|
@@ -53,8 +55,14 @@ export declare const XLazyDataTable: {
|
|
|
53
55
|
shrinkWidth: boolean;
|
|
54
56
|
};
|
|
55
57
|
};
|
|
58
|
+
export type XGetFilterItem = (field: string) => DataTableFilterMetaData | DataTableOperatorFilterMetaData;
|
|
56
59
|
export type XSetFilterItem = (field: string, filterItem: DataTableFilterMetaData | DataTableOperatorFilterMetaData) => void;
|
|
57
|
-
export type
|
|
60
|
+
export type XFilterElementParams = {
|
|
61
|
+
getFilterItem: XGetFilterItem;
|
|
62
|
+
setFilterItem: XSetFilterItem;
|
|
63
|
+
options: ColumnFilterElementTemplateOptions;
|
|
64
|
+
};
|
|
65
|
+
export type XFilterElementProp = (params: XFilterElementParams) => React.ReactNode;
|
|
58
66
|
export interface XLazyColumnProps {
|
|
59
67
|
field: string;
|
|
60
68
|
header?: any;
|
|
@@ -63,6 +71,7 @@ export interface XLazyColumnProps {
|
|
|
63
71
|
showFilterMenu?: boolean;
|
|
64
72
|
betweenFilter?: XBetweenFilterProp | "noBetween";
|
|
65
73
|
width?: string;
|
|
74
|
+
aggregateType?: XAggregateType;
|
|
66
75
|
filterElement?: XFilterElementProp;
|
|
67
76
|
body?: React.ReactNode | ((data: any, options: ColumnBodyOptions) => React.ReactNode);
|
|
68
77
|
}
|
|
@@ -115,17 +115,40 @@ var api_1 = require("primereact/api");
|
|
|
115
115
|
var XCalendar_1 = require("./XCalendar");
|
|
116
116
|
var XInputDecimalBase_1 = require("./XInputDecimalBase");
|
|
117
117
|
var XLazyDataTable = function (props) {
|
|
118
|
+
var _a;
|
|
118
119
|
// must be here, is used in createInitFilters()
|
|
119
120
|
var xEntity = XUtilsMetadata_1.XUtilsMetadata.getXEntity(props.entity);
|
|
120
|
-
var
|
|
121
|
+
var createAggregateItems = function () {
|
|
121
122
|
var e_1, _a;
|
|
122
|
-
var
|
|
123
|
-
//let columns = dataTableEl.current.props.children; - does not work
|
|
123
|
+
var aggregateItems = [];
|
|
124
124
|
var columns = props.children;
|
|
125
125
|
try {
|
|
126
126
|
for (var columns_1 = __values(columns), columns_1_1 = columns_1.next(); !columns_1_1.done; columns_1_1 = columns_1.next()) {
|
|
127
127
|
var column = columns_1_1.value;
|
|
128
128
|
var xLazyColumn = column; // nevedel som to krajsie...
|
|
129
|
+
if (xLazyColumn.props.aggregateType) {
|
|
130
|
+
aggregateItems.push({ field: xLazyColumn.props.field, aggregateType: xLazyColumn.props.aggregateType });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
135
|
+
finally {
|
|
136
|
+
try {
|
|
137
|
+
if (columns_1_1 && !columns_1_1.done && (_a = columns_1.return)) _a.call(columns_1);
|
|
138
|
+
}
|
|
139
|
+
finally { if (e_1) throw e_1.error; }
|
|
140
|
+
}
|
|
141
|
+
return aggregateItems;
|
|
142
|
+
};
|
|
143
|
+
var createInitFilters = function () {
|
|
144
|
+
var e_2, _a;
|
|
145
|
+
var initFilters = {};
|
|
146
|
+
//let columns = dataTableEl.current.props.children; - does not work
|
|
147
|
+
var columns = props.children;
|
|
148
|
+
try {
|
|
149
|
+
for (var columns_2 = __values(columns), columns_2_1 = columns_2.next(); !columns_2_1.done; columns_2_1 = columns_2.next()) {
|
|
150
|
+
var column = columns_2_1.value;
|
|
151
|
+
var xLazyColumn = column; // nevedel som to krajsie...
|
|
129
152
|
var field = xLazyColumn.props.field;
|
|
130
153
|
var xField = XUtilsMetadata_1.XUtilsMetadata.getXFieldByPath(xEntity, field);
|
|
131
154
|
// TODO column.props.dropdownInFilter - pre "menu" by bolo fajn mat zoznam "enumov"
|
|
@@ -133,12 +156,12 @@ var XLazyDataTable = function (props) {
|
|
|
133
156
|
initFilters[field] = createFilterItem(props.filterDisplay, { value: null, matchMode: filterMatchMode });
|
|
134
157
|
}
|
|
135
158
|
}
|
|
136
|
-
catch (
|
|
159
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
137
160
|
finally {
|
|
138
161
|
try {
|
|
139
|
-
if (
|
|
162
|
+
if (columns_2_1 && !columns_2_1.done && (_a = columns_2.return)) _a.call(columns_2);
|
|
140
163
|
}
|
|
141
|
-
finally { if (
|
|
164
|
+
finally { if (e_2) throw e_2.error; }
|
|
142
165
|
}
|
|
143
166
|
return initFilters;
|
|
144
167
|
};
|
|
@@ -175,11 +198,15 @@ var XLazyDataTable = function (props) {
|
|
|
175
198
|
// premenne platne pre cely component (obdoba member premennych v class-e)
|
|
176
199
|
var dataTableEl = (0, react_1.useRef)(null);
|
|
177
200
|
var customFilter = props.customFilter;
|
|
178
|
-
var
|
|
179
|
-
var _b = __read((0, react_1.useState)(
|
|
180
|
-
var _c = __read((0, react_1.useState)(
|
|
181
|
-
var _d = __read((0, react_1.useState)(
|
|
201
|
+
var aggregateItems = createAggregateItems();
|
|
202
|
+
var _b = __read((0, react_1.useState)({ rowList: [], totalRecords: 0, aggregateValues: [] }), 2), value = _b[0], setValue = _b[1];
|
|
203
|
+
var _c = __read((0, react_1.useState)(false), 2), loading = _c[0], setLoading = _c[1];
|
|
204
|
+
var _d = __read((0, react_1.useState)(0), 2), first = _d[0], setFirst = _d[1];
|
|
205
|
+
var _e = __read((0, react_1.useState)(props.paginator ? props.rows : undefined), 2), rows = _e[0], setRows = _e[1];
|
|
182
206
|
var filtersInit = createInitFilters();
|
|
207
|
+
if (props.filters) {
|
|
208
|
+
filtersInit = __assign(__assign({}, filtersInit), props.filters); // items from props.filters will replace existing items in filtersInit
|
|
209
|
+
}
|
|
183
210
|
if (props.searchTableParams !== undefined) {
|
|
184
211
|
var displayFieldFilter = props.searchTableParams.displayFieldFilter;
|
|
185
212
|
if (displayFieldFilter !== undefined) {
|
|
@@ -188,13 +215,13 @@ var XLazyDataTable = function (props) {
|
|
|
188
215
|
// ak mame props.searchTableParams.customFilter, pridame ho
|
|
189
216
|
customFilter = XUtils_1.XUtils.filterAnd(customFilter, props.searchTableParams.customFilter);
|
|
190
217
|
}
|
|
191
|
-
var
|
|
192
|
-
var
|
|
193
|
-
var
|
|
194
|
-
var
|
|
195
|
-
var
|
|
196
|
-
var
|
|
197
|
-
var
|
|
218
|
+
var _f = __read((0, react_1.useState)(filtersInit), 2), filters = _f[0], setFilters = _f[1]; // filtrovanie na "controlled manner" (moze sa sem nainicializovat nejaka hodnota)
|
|
219
|
+
var _g = __read((0, react_1.useState)(props.sortField ? [{ field: props.sortField, order: 1 }] : []), 2), multiSortMeta = _g[0], setMultiSortMeta = _g[1];
|
|
220
|
+
var _h = __read((0, react_1.useState)(null), 2), selectedRow = _h[0], setSelectedRow = _h[1];
|
|
221
|
+
var _j = __read((_a = props.dataLoadedState) !== null && _a !== void 0 ? _a : (0, react_1.useState)(false), 2), dataLoaded = _j[0], setDataLoaded = _j[1]; // priznak kde si zapiseme, ci uz sme nacitali data
|
|
222
|
+
var _k = __read((0, react_1.useState)(false), 2), exportRowsDialogOpened = _k[0], setExportRowsDialogOpened = _k[1];
|
|
223
|
+
var _l = __read((0, react_1.useState)(), 2), exportRowsDialogRowCount = _l[0], setExportRowsDialogRowCount = _l[1]; // param pre dialog
|
|
224
|
+
var _m = __read((0, react_1.useState)(filtersInit), 2), filtersAfterFiltering = _m[0], setFiltersAfterFiltering = _m[1]; // sem si odkladame stav filtra po kliknuti na button Filter (chceme exportovat presne to co vidno vyfiltrovane)
|
|
198
225
|
// parameter [] zabezpeci ze sa metoda zavola len po prvom renderingu (a nie po kazdej zmene stavu (zavolani setNieco()))
|
|
199
226
|
(0, react_1.useEffect)(function () {
|
|
200
227
|
// jednoduchy sposob - nepouzivame parameter props.displayed a priznak dataLoaded
|
|
@@ -227,7 +254,7 @@ var XLazyDataTable = function (props) {
|
|
|
227
254
|
return __generator(this, function (_a) {
|
|
228
255
|
//console.log("zavolany onPage");
|
|
229
256
|
setFirst(event.first);
|
|
230
|
-
loadDataBase({ resultType: FindParam_1.ResultType.RowCountAndPagedRows, first: event.first, rows: rows, filters: filters, customFilter: customFilter, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields() });
|
|
257
|
+
loadDataBase({ resultType: FindParam_1.ResultType.RowCountAndPagedRows, first: event.first, rows: rows, filters: filters, customFilter: customFilter, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields(), aggregateItems: aggregateItems });
|
|
231
258
|
return [2 /*return*/];
|
|
232
259
|
});
|
|
233
260
|
}); };
|
|
@@ -241,14 +268,19 @@ var XLazyDataTable = function (props) {
|
|
|
241
268
|
//console.log("zavolany onSort - this.state.multiSortMeta = " + JSON.stringify(multiSortMeta));
|
|
242
269
|
//console.log("zavolany onSort - event.multiSortMeta = " + JSON.stringify(event.multiSortMeta));
|
|
243
270
|
setMultiSortMeta(event.multiSortMeta);
|
|
244
|
-
loadDataBase({ resultType: FindParam_1.ResultType.RowCountAndPagedRows, first: first, rows: rows, filters: filters, customFilter: customFilter, multiSortMeta: event.multiSortMeta, entity: props.entity, fields: getFields() });
|
|
271
|
+
loadDataBase({ resultType: FindParam_1.ResultType.RowCountAndPagedRows, first: first, rows: rows, filters: filters, customFilter: customFilter, multiSortMeta: event.multiSortMeta, entity: props.entity, fields: getFields(), aggregateItems: aggregateItems });
|
|
245
272
|
};
|
|
246
273
|
var onClickFilter = function () {
|
|
247
274
|
//console.log("zavolany onClickFilter");
|
|
248
275
|
loadData();
|
|
249
276
|
};
|
|
277
|
+
var onClickClearFilter = function () {
|
|
278
|
+
// najjednoduchsi sposob - pomeni aj pripadne nastavene matchMode hodnoty
|
|
279
|
+
var filtersInit = createInitFilters();
|
|
280
|
+
setFilters(filtersInit);
|
|
281
|
+
};
|
|
250
282
|
var loadData = function () {
|
|
251
|
-
loadDataBase({ resultType: FindParam_1.ResultType.RowCountAndPagedRows, first: first, rows: rows, filters: filters, customFilter: customFilter, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields() });
|
|
283
|
+
loadDataBase({ resultType: FindParam_1.ResultType.RowCountAndPagedRows, first: first, rows: rows, filters: filters, customFilter: customFilter, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields(), aggregateItems: aggregateItems });
|
|
252
284
|
};
|
|
253
285
|
var loadDataBase = function (findParam) { return __awaiter(void 0, void 0, void 0, function () {
|
|
254
286
|
var findResult;
|
|
@@ -269,56 +301,57 @@ var XLazyDataTable = function (props) {
|
|
|
269
301
|
});
|
|
270
302
|
}); };
|
|
271
303
|
var findByFilter = function (findParam) { return __awaiter(void 0, void 0, void 0, function () {
|
|
272
|
-
var
|
|
273
|
-
return __generator(this, function (
|
|
274
|
-
switch (
|
|
304
|
+
var findResult;
|
|
305
|
+
return __generator(this, function (_a) {
|
|
306
|
+
switch (_a.label) {
|
|
275
307
|
case 0: return [4 /*yield*/, XUtils_1.XUtils.fetchOne('lazyDataTableFindRows', findParam)];
|
|
276
308
|
case 1:
|
|
277
|
-
|
|
278
|
-
|
|
309
|
+
findResult = _a.sent();
|
|
310
|
+
findResult.totalRecords = parseInt(findResult.totalRecords);
|
|
311
|
+
return [2 /*return*/, findResult];
|
|
279
312
|
}
|
|
280
313
|
});
|
|
281
314
|
}); };
|
|
282
315
|
var getFields = function () {
|
|
283
316
|
// krasne zobrazi cely objekt!
|
|
284
317
|
//console.log(dataTableEl.current);
|
|
285
|
-
var
|
|
318
|
+
var e_3, _a;
|
|
286
319
|
var fields = [];
|
|
287
320
|
var columns = dataTableEl.current.props.children;
|
|
288
321
|
try {
|
|
289
|
-
for (var
|
|
290
|
-
var column =
|
|
322
|
+
for (var columns_3 = __values(columns), columns_3_1 = columns_3.next(); !columns_3_1.done; columns_3_1 = columns_3.next()) {
|
|
323
|
+
var column = columns_3_1.value;
|
|
291
324
|
fields.push(column.props.field);
|
|
292
325
|
}
|
|
293
326
|
}
|
|
294
|
-
catch (
|
|
327
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
295
328
|
finally {
|
|
296
329
|
try {
|
|
297
|
-
if (
|
|
330
|
+
if (columns_3_1 && !columns_3_1.done && (_a = columns_3.return)) _a.call(columns_3);
|
|
298
331
|
}
|
|
299
|
-
finally { if (
|
|
332
|
+
finally { if (e_3) throw e_3.error; }
|
|
300
333
|
}
|
|
301
334
|
return fields;
|
|
302
335
|
};
|
|
303
336
|
var getHeaders = function () {
|
|
304
337
|
// krasne zobrazi cely objekt!
|
|
305
338
|
//console.log(dataTableEl.current);
|
|
306
|
-
var
|
|
339
|
+
var e_4, _a;
|
|
307
340
|
var headers = [];
|
|
308
341
|
var columns = dataTableEl.current.props.children;
|
|
309
342
|
try {
|
|
310
|
-
for (var
|
|
311
|
-
var column =
|
|
343
|
+
for (var columns_4 = __values(columns), columns_4_1 = columns_4.next(); !columns_4_1.done; columns_4_1 = columns_4.next()) {
|
|
344
|
+
var column = columns_4_1.value;
|
|
312
345
|
// pozor! headers tahame z primereact DataTable a napr. pri editacii nemusi byt v atribute header string
|
|
313
346
|
headers.push(column.props.header);
|
|
314
347
|
}
|
|
315
348
|
}
|
|
316
|
-
catch (
|
|
349
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
317
350
|
finally {
|
|
318
351
|
try {
|
|
319
|
-
if (
|
|
352
|
+
if (columns_4_1 && !columns_4_1.done && (_a = columns_4.return)) _a.call(columns_4);
|
|
320
353
|
}
|
|
321
|
-
finally { if (
|
|
354
|
+
finally { if (e_4) throw e_4.error; }
|
|
322
355
|
}
|
|
323
356
|
return headers;
|
|
324
357
|
};
|
|
@@ -355,7 +388,7 @@ var XLazyDataTable = function (props) {
|
|
|
355
388
|
}
|
|
356
389
|
};
|
|
357
390
|
var onClickRemoveRow = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
358
|
-
var reread,
|
|
391
|
+
var reread, e_5, e_6;
|
|
359
392
|
return __generator(this, function (_a) {
|
|
360
393
|
switch (_a.label) {
|
|
361
394
|
case 0:
|
|
@@ -370,8 +403,8 @@ var XLazyDataTable = function (props) {
|
|
|
370
403
|
reread = _a.sent();
|
|
371
404
|
return [3 /*break*/, 4];
|
|
372
405
|
case 3:
|
|
373
|
-
|
|
374
|
-
XUtils_1.XUtils.showErrorMessage("Remove row failed.",
|
|
406
|
+
e_5 = _a.sent();
|
|
407
|
+
XUtils_1.XUtils.showErrorMessage("Remove row failed.", e_5);
|
|
375
408
|
return [3 /*break*/, 4];
|
|
376
409
|
case 4:
|
|
377
410
|
if (reread) {
|
|
@@ -393,8 +426,8 @@ var XLazyDataTable = function (props) {
|
|
|
393
426
|
_a.sent();
|
|
394
427
|
return [3 /*break*/, 9];
|
|
395
428
|
case 8:
|
|
396
|
-
|
|
397
|
-
XUtils_1.XUtils.showErrorMessage("Remove row failed.",
|
|
429
|
+
e_6 = _a.sent();
|
|
430
|
+
XUtils_1.XUtils.showErrorMessage("Remove row failed.", e_6);
|
|
398
431
|
return [3 /*break*/, 9];
|
|
399
432
|
case 9:
|
|
400
433
|
loadData();
|
|
@@ -415,7 +448,7 @@ var XLazyDataTable = function (props) {
|
|
|
415
448
|
return __generator(this, function (_a) {
|
|
416
449
|
switch (_a.label) {
|
|
417
450
|
case 0:
|
|
418
|
-
findParam = { resultType: FindParam_1.ResultType.OnlyRowCount, first: first, rows: rows, filters: filtersAfterFiltering, customFilter: customFilter, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields() };
|
|
451
|
+
findParam = { resultType: FindParam_1.ResultType.OnlyRowCount, first: first, rows: rows, filters: filtersAfterFiltering, customFilter: customFilter, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields(), aggregateItems: aggregateItems };
|
|
419
452
|
return [4 /*yield*/, findByFilter(findParam)];
|
|
420
453
|
case 1:
|
|
421
454
|
findResult = _a.sent();
|
|
@@ -427,7 +460,7 @@ var XLazyDataTable = function (props) {
|
|
|
427
460
|
});
|
|
428
461
|
}); };
|
|
429
462
|
var exportRowsDialogOnHide = function (ok, exportType, csvParam) { return __awaiter(void 0, void 0, void 0, function () {
|
|
430
|
-
var path, exportParam, response,
|
|
463
|
+
var path, exportParam, response, e_7, fileExt, fileName, respBlob, url, a;
|
|
431
464
|
return __generator(this, function (_a) {
|
|
432
465
|
switch (_a.label) {
|
|
433
466
|
case 0:
|
|
@@ -449,8 +482,8 @@ var XLazyDataTable = function (props) {
|
|
|
449
482
|
response = _a.sent();
|
|
450
483
|
return [3 /*break*/, 4];
|
|
451
484
|
case 3:
|
|
452
|
-
|
|
453
|
-
XUtils_1.XUtils.showErrorMessage("Export failed.",
|
|
485
|
+
e_7 = _a.sent();
|
|
486
|
+
XUtils_1.XUtils.showErrorMessage("Export failed.", e_7);
|
|
454
487
|
return [2 /*return*/];
|
|
455
488
|
case 4:
|
|
456
489
|
fileExt = exportType;
|
|
@@ -497,6 +530,10 @@ var XLazyDataTable = function (props) {
|
|
|
497
530
|
var filtersCloned = __assign({}, filters);
|
|
498
531
|
setFilters(filtersCloned);
|
|
499
532
|
};
|
|
533
|
+
// vseobecna specialna metodka pouzvana pri custom filtri (XLazyColumn.filterElement)
|
|
534
|
+
var getFilterItem = function (field) {
|
|
535
|
+
return filters[field];
|
|
536
|
+
};
|
|
500
537
|
// vseobecna metodka - nastavi hodnotu do filtra
|
|
501
538
|
// ak je matchMode === undefined, tak zachova povodnu hodnotu matchMode
|
|
502
539
|
var setFilterValue = function (field, value, matchMode) {
|
|
@@ -678,19 +715,22 @@ var XLazyDataTable = function (props) {
|
|
|
678
715
|
if ((props.editMode === true || props.editMode === false) && props.editModeHandlers === undefined) {
|
|
679
716
|
throw "XLazyDataTable: for props.editMode = true/false, props.editModeHandlers must be defined.";
|
|
680
717
|
}
|
|
681
|
-
|
|
682
|
-
|
|
718
|
+
// pouzivame paginatorLeft aj paginatorRight (aj prazdny) pouzivame, aby bol default paginator v strede (bez paginatorLeft je default paginator presunuty dolava a naopak)
|
|
719
|
+
// sirku div-ov este nastavujeme v css na 10rem
|
|
720
|
+
var paginatorLeft = react_1.default.createElement("div", null,
|
|
721
|
+
"Total records: ",
|
|
722
|
+
value.totalRecords);
|
|
723
|
+
var paginatorRight = react_1.default.createElement("div", null);
|
|
683
724
|
if (props.editMode === true) {
|
|
684
|
-
paginatorLeft = react_1.default.createElement("div", null); // paginatorLeft pouzivame, aby bol default paginator v strede (bez paginatorLeft je default paginator presunuty dolava)
|
|
685
725
|
paginatorRight = react_1.default.createElement("div", null,
|
|
686
726
|
react_1.default.createElement(XButtonIconSmall_1.XButtonIconSmall, { icon: "pi pi-save", onClick: function () { var _a; return (_a = props.editModeHandlers) === null || _a === void 0 ? void 0 : _a.onSave(); }, tooltip: "Save form" }),
|
|
687
727
|
react_1.default.createElement(XButtonIconSmall_1.XButtonIconSmall, { icon: "pi pi-times", onClick: function () { var _a; return (_a = props.editModeHandlers) === null || _a === void 0 ? void 0 : _a.onCancel(); }, tooltip: "Cancel editing" }));
|
|
688
728
|
}
|
|
689
729
|
else if (props.editMode === false) {
|
|
690
|
-
|
|
691
|
-
|
|
730
|
+
paginatorRight = react_1.default.createElement("div", null,
|
|
731
|
+
react_1.default.createElement(XButtonIconSmall_1.XButtonIconSmall, { icon: "pi pi-pencil", onClick: function () { var _a; return (_a = props.editModeHandlers) === null || _a === void 0 ? void 0 : _a.onStart(); }, tooltip: "Edit form" }));
|
|
692
732
|
}
|
|
693
|
-
// else
|
|
733
|
+
// else - editMode is undefined - browse is not editable
|
|
694
734
|
// export pre search button-y zatial vypneme
|
|
695
735
|
var exportRows = (props.searchTableParams === undefined);
|
|
696
736
|
// pre lepsiu citatelnost vytvarame stlpce uz tu
|
|
@@ -722,8 +762,8 @@ var XLazyDataTable = function (props) {
|
|
|
722
762
|
var filterElement;
|
|
723
763
|
if (childColumn.props.filterElement !== undefined) {
|
|
724
764
|
filterElement = function (options) {
|
|
725
|
-
// compilator sa stazoval ze childColumn.props.filterElement
|
|
726
|
-
return childColumn.props.filterElement(setFilterItem, options);
|
|
765
|
+
// compilator sa stazoval ze childColumn.props.filterElement moze byt undefined, preto som pridal "!"
|
|
766
|
+
return childColumn.props.filterElement({ getFilterItem: getFilterItem, setFilterItem: setFilterItem, options: options });
|
|
727
767
|
};
|
|
728
768
|
}
|
|
729
769
|
else {
|
|
@@ -825,11 +865,27 @@ var XLazyDataTable = function (props) {
|
|
|
825
865
|
align = "center";
|
|
826
866
|
}
|
|
827
867
|
}
|
|
828
|
-
|
|
868
|
+
// *********** footer ***********
|
|
869
|
+
var footer = undefined;
|
|
870
|
+
if (childColumn.props.aggregateType && value.aggregateValues) {
|
|
871
|
+
var aggregateValue = value.aggregateValues[childColumn.props.field];
|
|
872
|
+
if (aggregateValue !== undefined && aggregateValue !== null) {
|
|
873
|
+
if (xField.type === "decimal" || xField.type === "number") {
|
|
874
|
+
// v json subore su stringy (cislo v ""), konvertujeme aby sme zmenili 123.45 na 123,45
|
|
875
|
+
aggregateValue = (0, XUtilsConversions_1.numberAsUI)((0, XUtilsConversions_1.numberFromModel)(aggregateValue), xField.scale);
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
else {
|
|
879
|
+
aggregateValue = ""; // nemame este nacitane data
|
|
880
|
+
}
|
|
881
|
+
footer = aggregateValue;
|
|
882
|
+
}
|
|
883
|
+
return react_1.default.createElement(column_1.Column, { field: childColumn.props.field, header: header, footer: footer, filter: true, sortable: true, filterElement: filterElement, dataType: dataType, showFilterMenu: showFilterMenu, showClearButton: showClearButton, body: body, headerStyle: headerStyle, align: align });
|
|
829
884
|
});
|
|
830
885
|
return (react_1.default.createElement("div", null,
|
|
831
886
|
react_1.default.createElement("div", { className: "flex justify-content-center" },
|
|
832
|
-
react_1.default.createElement(XButton_1.XButton, { label: "Filter", onClick: onClickFilter })
|
|
887
|
+
react_1.default.createElement(XButton_1.XButton, { label: "Filter", onClick: onClickFilter }),
|
|
888
|
+
react_1.default.createElement(XButton_1.XButton, { label: "Clear filter", onClick: onClickClearFilter })),
|
|
833
889
|
react_1.default.createElement("div", { className: "flex justify-content-center" },
|
|
834
890
|
react_1.default.createElement(datatable_1.DataTable, { value: value.rowList, dataKey: dataKey, paginator: props.paginator, rows: rows, totalRecords: value.totalRecords, lazy: true, first: first, onPage: onPage, loading: loading, filterDisplay: props.filterDisplay, filters: filters, onFilter: onFilter, sortMode: "multiple", removableSort: true, multiSortMeta: multiSortMeta, onSort: onSort, selectionMode: "single", selection: selectedRow, onSelectionChange: onSelectionChange, onRowDoubleClick: onRowDoubleClick, ref: dataTableEl, className: "p-datatable-sm x-lazy-datatable", resizableColumns: true, columnResizeMode: "expand", tableStyle: tableStyle, paginatorLeft: paginatorLeft, paginatorRight: paginatorRight, scrollable: props.scrollable, scrollHeight: scrollHeight, style: style }, columnElemList)),
|
|
835
891
|
react_1.default.createElement("div", { className: "flex justify-content-center" },
|
|
@@ -34,7 +34,7 @@ export declare class XUtils {
|
|
|
34
34
|
static registerAppForm(elem: any, entity: string, formId?: string): void;
|
|
35
35
|
static getAppForm(entity: string, formId?: string): any;
|
|
36
36
|
static fetchMany(path: string, value: any, usePublicToken?: boolean | XToken): Promise<any[]>;
|
|
37
|
-
static fetchRows(entity: string, customFilter
|
|
37
|
+
static fetchRows(entity: string, customFilter?: XCustomFilter | undefined, sortField?: string, fields?: string[]): Promise<any[]>;
|
|
38
38
|
static fetchOne(path: string, value: any, usePublicToken?: boolean | XToken): Promise<any>;
|
|
39
39
|
static fetchString(path: string, value: any): Promise<string>;
|
|
40
40
|
static fetch(path: string, value: any, usePublicToken?: boolean | XToken): Promise<any>;
|
package/lib/components/XUtils.js
CHANGED
|
@@ -254,13 +254,13 @@ var XUtils = /** @class */ (function () {
|
|
|
254
254
|
return XUtils.fetch(path, value, usePublicToken);
|
|
255
255
|
};
|
|
256
256
|
// pomocna metodka pouzivajuca lazyDataTable service
|
|
257
|
-
XUtils.fetchRows = function (entity, customFilter, sortField) {
|
|
257
|
+
XUtils.fetchRows = function (entity, customFilter, sortField, fields) {
|
|
258
258
|
return __awaiter(this, void 0, void 0, function () {
|
|
259
259
|
var findParam, rowList;
|
|
260
260
|
return __generator(this, function (_a) {
|
|
261
261
|
switch (_a.label) {
|
|
262
262
|
case 0:
|
|
263
|
-
findParam = { resultType: FindParam_1.ResultType.AllRows, entity: entity, customFilter: customFilter, multiSortMeta: sortField ? [{ field: sortField, order: 1 }] : undefined };
|
|
263
|
+
findParam = { resultType: FindParam_1.ResultType.AllRows, entity: entity, customFilter: customFilter, multiSortMeta: sortField ? [{ field: sortField, order: 1 }] : undefined, fields: fields };
|
|
264
264
|
return [4 /*yield*/, XUtils.fetchOne('lazyDataTableFindRows', findParam)];
|
|
265
265
|
case 1:
|
|
266
266
|
rowList = (_a.sent()).rowList;
|
|
@@ -11,6 +11,16 @@ export interface XCustomFilter {
|
|
|
11
11
|
filter: string;
|
|
12
12
|
values: XCustomFilterValues;
|
|
13
13
|
}
|
|
14
|
+
export declare enum XAggregateType {
|
|
15
|
+
Min = "MIN",
|
|
16
|
+
Max = "MAX",
|
|
17
|
+
Sum = "SUM",
|
|
18
|
+
Avg = "AVG"
|
|
19
|
+
}
|
|
20
|
+
export interface XAggregateItem {
|
|
21
|
+
field: string;
|
|
22
|
+
aggregateType: XAggregateType;
|
|
23
|
+
}
|
|
14
24
|
export interface FindParam {
|
|
15
25
|
resultType: ResultType;
|
|
16
26
|
first?: number;
|
|
@@ -20,4 +30,5 @@ export interface FindParam {
|
|
|
20
30
|
multiSortMeta?: DataTableSortMeta[];
|
|
21
31
|
entity: string;
|
|
22
32
|
fields?: string[];
|
|
33
|
+
aggregateItems?: XAggregateItem[];
|
|
23
34
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ResultType = void 0;
|
|
3
|
+
exports.XAggregateType = exports.ResultType = void 0;
|
|
4
4
|
// TODO - replaced with DataTableFilterMetaData
|
|
5
5
|
// export interface FilterValue {
|
|
6
6
|
// value : string;
|
|
@@ -21,3 +21,10 @@ var ResultType;
|
|
|
21
21
|
ResultType[ResultType["RowCountAndPagedRows"] = 1] = "RowCountAndPagedRows";
|
|
22
22
|
ResultType[ResultType["AllRows"] = 2] = "AllRows";
|
|
23
23
|
})(ResultType = exports.ResultType || (exports.ResultType = {}));
|
|
24
|
+
var XAggregateType;
|
|
25
|
+
(function (XAggregateType) {
|
|
26
|
+
XAggregateType["Min"] = "MIN";
|
|
27
|
+
XAggregateType["Max"] = "MAX";
|
|
28
|
+
XAggregateType["Sum"] = "SUM";
|
|
29
|
+
XAggregateType["Avg"] = "AVG";
|
|
30
|
+
})(XAggregateType = exports.XAggregateType || (exports.XAggregateType = {}));
|