@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.
@@ -0,0 +1,3 @@
1
+ // generated by gulp
2
+
3
+ export * from './lib/components/XButtonIconMedium';
@@ -0,0 +1,5 @@
1
+ // generated by gulp
2
+
3
+ 'use strict';
4
+
5
+ module.exports = require('./lib/components/XButtonIconMedium.js');
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));
@@ -5,6 +5,7 @@ export interface XDropdownForEntityProps {
5
5
  id?: string;
6
6
  entity: string;
7
7
  displayField: string;
8
+ sortField?: string;
8
9
  value: any | null;
9
10
  onChange: (value: any | null) => void;
10
11
  readOnly?: boolean;
@@ -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 (_a) {
116
- switch (_a.label) {
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 = _a.sent();
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
- react_1.default.createElement("div", { className: "flex justify-content-center" },
625
- react_1.default.createElement(XButton_1.XButton, { icon: this.props.addRowIcon, label: this.props.addRowLabel, onClick: this.onClickAddRow, disabled: readOnly }),
626
- this.props.removeButtonInRow ? undefined : react_1.default.createElement(XButton_1.XButton, { icon: this.props.removeRowIcon, label: this.props.removeRowLabel, onClick: this.onClickRemoveRowBySelection, disabled: readOnly }))));
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
- initSortField?: string;
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 XFilterElementProp = (setFilterItem: XSetFilterItem, options: ColumnFilterElementTemplateOptions) => React.ReactNode;
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 createInitFilters = function () {
121
+ var createAggregateItems = function () {
121
122
  var e_1, _a;
122
- var initFilters = {};
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 (e_1_1) { e_1 = { error: e_1_1 }; }
159
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
137
160
  finally {
138
161
  try {
139
- if (columns_1_1 && !columns_1_1.done && (_a = columns_1.return)) _a.call(columns_1);
162
+ if (columns_2_1 && !columns_2_1.done && (_a = columns_2.return)) _a.call(columns_2);
140
163
  }
141
- finally { if (e_1) throw e_1.error; }
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 _a = __read((0, react_1.useState)({ rowList: [], totalRecords: 0 }), 2), value = _a[0], setValue = _a[1];
179
- var _b = __read((0, react_1.useState)(false), 2), loading = _b[0], setLoading = _b[1];
180
- var _c = __read((0, react_1.useState)(0), 2), first = _c[0], setFirst = _c[1];
181
- var _d = __read((0, react_1.useState)(props.paginator ? props.rows : undefined), 2), rows = _d[0], setRows = _d[1];
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 _e = __read((0, react_1.useState)(filtersInit), 2), filters = _e[0], setFilters = _e[1]; // filtrovanie na "controlled manner" (moze sa sem nainicializovat nejaka hodnota)
192
- var _f = __read((0, react_1.useState)(props.initSortField ? [{ field: props.initSortField, order: 1 }] : []), 2), multiSortMeta = _f[0], setMultiSortMeta = _f[1];
193
- var _g = __read((0, react_1.useState)(null), 2), selectedRow = _g[0], setSelectedRow = _g[1];
194
- var _h = __read((0, react_1.useState)(false), 2), dataLoaded = _h[0], setDataLoaded = _h[1]; // priznak kde si zapiseme, ci uz sme nacitali data
195
- var _j = __read((0, react_1.useState)(false), 2), exportRowsDialogOpened = _j[0], setExportRowsDialogOpened = _j[1];
196
- var _k = __read((0, react_1.useState)(), 2), exportRowsDialogRowCount = _k[0], setExportRowsDialogRowCount = _k[1]; // param pre dialog
197
- var _l = __read((0, react_1.useState)(filtersInit), 2), filtersAfterFiltering = _l[0], setFiltersAfterFiltering = _l[1]; // sem si odkladame stav filtra po kliknuti na button Filter (chceme exportovat presne to co vidno vyfiltrovane)
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 _a, rowList, totalRecords;
273
- return __generator(this, function (_b) {
274
- switch (_b.label) {
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
- _a = _b.sent(), rowList = _a.rowList, totalRecords = _a.totalRecords;
278
- return [2 /*return*/, { rowList: rowList, totalRecords: parseInt(totalRecords) }];
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 e_2, _a;
318
+ var e_3, _a;
286
319
  var fields = [];
287
320
  var columns = dataTableEl.current.props.children;
288
321
  try {
289
- for (var columns_2 = __values(columns), columns_2_1 = columns_2.next(); !columns_2_1.done; columns_2_1 = columns_2.next()) {
290
- var column = columns_2_1.value;
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 (e_2_1) { e_2 = { error: e_2_1 }; }
327
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
295
328
  finally {
296
329
  try {
297
- if (columns_2_1 && !columns_2_1.done && (_a = columns_2.return)) _a.call(columns_2);
330
+ if (columns_3_1 && !columns_3_1.done && (_a = columns_3.return)) _a.call(columns_3);
298
331
  }
299
- finally { if (e_2) throw e_2.error; }
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 e_3, _a;
339
+ var e_4, _a;
307
340
  var headers = [];
308
341
  var columns = dataTableEl.current.props.children;
309
342
  try {
310
- for (var columns_3 = __values(columns), columns_3_1 = columns_3.next(); !columns_3_1.done; columns_3_1 = columns_3.next()) {
311
- var column = columns_3_1.value;
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 (e_3_1) { e_3 = { error: e_3_1 }; }
349
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
317
350
  finally {
318
351
  try {
319
- if (columns_3_1 && !columns_3_1.done && (_a = columns_3.return)) _a.call(columns_3);
352
+ if (columns_4_1 && !columns_4_1.done && (_a = columns_4.return)) _a.call(columns_4);
320
353
  }
321
- finally { if (e_3) throw e_3.error; }
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, e_4, e_5;
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
- e_4 = _a.sent();
374
- XUtils_1.XUtils.showErrorMessage("Remove row failed.", e_4);
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
- e_5 = _a.sent();
397
- XUtils_1.XUtils.showErrorMessage("Remove row failed.", e_5);
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, e_6, fileExt, fileName, respBlob, url, a;
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
- e_6 = _a.sent();
453
- XUtils_1.XUtils.showErrorMessage("Export failed.", e_6);
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
- var paginatorLeft = undefined;
682
- var paginatorRight = undefined;
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
- paginatorLeft = react_1.default.createElement("div", null);
691
- paginatorRight = 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" });
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 -> editMode is undefined - browse is not editable
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 muze byt undefined, preto som pridal "!"
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
- return react_1.default.createElement(column_1.Column, { field: childColumn.props.field, header: header, filter: true, sortable: true, filterElement: filterElement, dataType: dataType, showFilterMenu: showFilterMenu, showClearButton: showClearButton, body: body, headerStyle: headerStyle, align: align });
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: XCustomFilter | undefined, sortField?: string): Promise<any[]>;
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>;
@@ -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 = {}));
@@ -1,4 +1,8 @@
1
+ export interface XAggregateValues {
2
+ [key: string]: any;
3
+ }
1
4
  export interface FindResult {
2
5
  rowList?: any[];
3
6
  totalRecords?: number;
7
+ aggregateValues?: XAggregateValues;
4
8
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michalrakus/x-react-web-lib",
3
- "version": "1.4.1",
3
+ "version": "1.5.1",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "clean": "rimraf lib",