@michalrakus/x-react-web-lib 1.20.0 → 1.21.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.
@@ -0,0 +1,3 @@
1
+ // generated by gulp
2
+
3
+ export * from './lib/administration/XParamBrowse';
@@ -0,0 +1,5 @@
1
+ // generated by gulp
2
+
3
+ 'use strict';
4
+
5
+ module.exports = require('./lib/administration/XParamBrowse.js');
@@ -0,0 +1,3 @@
1
+ // generated by gulp
2
+
3
+ export * from './lib/administration/XParamForm';
package/XParamForm.js ADDED
@@ -0,0 +1,5 @@
1
+ // generated by gulp
2
+
3
+ 'use strict';
4
+
5
+ module.exports = require('./lib/administration/XParamForm.js');
package/gulpfile.js CHANGED
@@ -13,10 +13,12 @@ function generateApi(cb) {
13
13
  const fs = require('fs');
14
14
 
15
15
  const apiFileList = [
16
- "./lib/administration/XUserBrowse",
17
- "./lib/administration/XUserForm",
18
16
  "./lib/administration/XBrowseMetaBrowse",
19
17
  "./lib/administration/XBrowseMetaForm",
18
+ "./lib/administration/XParamBrowse",
19
+ "./lib/administration/XParamForm",
20
+ "./lib/administration/XUserBrowse",
21
+ "./lib/administration/XUserForm",
20
22
 
21
23
  "./lib/components/XFormRowCol/XFormCol",
22
24
  "./lib/components/XFormRowCol/XFormInlineRow",
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ import { XBrowseProps } from "../components/XLazyDataTable/XLazyDataTable";
3
+ import { XCustomFilter } from "../serverApi/FindParam";
4
+ export declare const XParamBrowse: (props: XBrowseProps & {
5
+ customFilter?: XCustomFilter;
6
+ }) => JSX.Element;
@@ -0,0 +1,25 @@
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.XParamBrowse = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var XLazyDataTable_1 = require("../components/XLazyDataTable/XLazyDataTable");
9
+ var XParamForm_1 = require("./XParamForm");
10
+ var XParamBrowse = function (props) {
11
+ var onAddRow = function () {
12
+ // openForm pridavame automaticky v XFormNavigator3 pri renderovani komponentu
13
+ props.openForm(react_1.default.createElement(XParamForm_1.XParamForm, null));
14
+ };
15
+ var onEdit = function (selectedRow) {
16
+ // openForm pridavame automaticky v XFormNavigator3 pri renderovani komponentu
17
+ props.openForm(react_1.default.createElement(XParamForm_1.XParamForm, { id: selectedRow.id }));
18
+ };
19
+ return (react_1.default.createElement(XLazyDataTable_1.XLazyDataTable, { entity: "XParam", sortField: "id", rows: 30, customFilter: props.customFilter, onAddRow: onAddRow, onEdit: onEdit, removeRow: true, displayed: props.displayed },
20
+ react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "id", header: "ID", width: "8rem" }),
21
+ react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "code", header: "Code", width: "16rem" }),
22
+ react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "name", header: "Name", width: "45rem" }),
23
+ react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "value", header: "Value", width: "16rem" })));
24
+ };
25
+ exports.XParamBrowse = XParamBrowse;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { XFormBaseModif } from "../components/XFormBaseModif";
3
+ import { XObject } from "../components/XObject";
4
+ export declare class XParamForm extends XFormBaseModif {
5
+ createNewObject(): XObject;
6
+ render(): JSX.Element;
7
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
18
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
19
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
20
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
21
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
22
+ };
23
+ var __importDefault = (this && this.__importDefault) || function (mod) {
24
+ return (mod && mod.__esModule) ? mod : { "default": mod };
25
+ };
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.XParamForm = void 0;
28
+ var react_1 = __importDefault(require("react"));
29
+ var XFormBaseModif_1 = require("../components/XFormBaseModif");
30
+ var XFormBase_1 = require("../components/XFormBase");
31
+ var XInputDecimal_1 = require("../components/XInputDecimal");
32
+ var XInputDate_1 = require("../components/XInputDate");
33
+ var XInputText_1 = require("../components/XInputText");
34
+ var XFormFooter_1 = require("../components/XFormFooter");
35
+ var XParamForm = /** @class */ (function (_super) {
36
+ __extends(XParamForm, _super);
37
+ function XParamForm() {
38
+ return _super !== null && _super.apply(this, arguments) || this;
39
+ }
40
+ XParamForm.prototype.createNewObject = function () {
41
+ return { version: 0 };
42
+ };
43
+ XParamForm.prototype.render = function () {
44
+ return (react_1.default.createElement("div", null,
45
+ react_1.default.createElement("div", { className: "x-form-row" },
46
+ react_1.default.createElement("div", { className: "x-form-col" },
47
+ react_1.default.createElement(XInputDecimal_1.XInputDecimal, { form: this, field: "id", label: "ID", readOnly: true }),
48
+ react_1.default.createElement(XInputDate_1.XInputDate, { form: this, field: "modifDate", label: "Modified at", readOnly: true }),
49
+ react_1.default.createElement(XInputText_1.XInputText, { form: this, field: "modifXUser.name", label: "Modified by", inputStyle: { width: '12.5rem' } }),
50
+ react_1.default.createElement(XInputText_1.XInputText, { form: this, field: "code", label: "Code", inputStyle: { width: '16rem' } }),
51
+ react_1.default.createElement(XInputText_1.XInputText, { form: this, field: "name", label: "Name", inputStyle: { width: '45rem' } }),
52
+ react_1.default.createElement(XInputText_1.XInputText, { form: this, field: "value", label: "Value", inputStyle: { width: '45rem' } }))),
53
+ react_1.default.createElement(XFormFooter_1.XFormFooter, { form: this })));
54
+ };
55
+ XParamForm = __decorate([
56
+ (0, XFormBase_1.Form)("XParam")
57
+ ], XParamForm);
58
+ return XParamForm;
59
+ }(XFormBaseModif_1.XFormBaseModif));
60
+ exports.XParamForm = XParamForm;
@@ -614,39 +614,12 @@ var XAutoCompleteBase = /** @class */ (function (_super) {
614
614
  return itemTemplate;
615
615
  };
616
616
  XAutoCompleteBase.prototype.computeDefaultDisplayValue = function (suggestion) {
617
- var e_2, _a;
618
- var displayValue = "";
617
+ var displayValue;
619
618
  if (XAutoCompleteBase.isMoreSuggestions(suggestion)) {
620
619
  displayValue = suggestion;
621
620
  }
622
621
  else {
623
- try {
624
- for (var _b = __values(this.getFields()), _c = _b.next(); !_c.done; _c = _b.next()) {
625
- var field = _c.value;
626
- // TODO - konverzie na spravny typ/string
627
- var _d = __read(XUtilsCommon_1.XUtilsCommon.getPrefixAndField(field), 2), prefix = _d[0], fieldOnly = _d[1];
628
- var value = XUtilsCommon_1.XUtilsCommon.getValueByPath(suggestion, fieldOnly);
629
- if (value !== null && value !== undefined) {
630
- var valueStr = value.toString(); // TODO - spravnu konverziu
631
- if (valueStr !== "") {
632
- if (displayValue !== "") {
633
- displayValue += " ";
634
- }
635
- if (prefix) {
636
- displayValue += prefix;
637
- }
638
- displayValue += valueStr;
639
- }
640
- }
641
- }
642
- }
643
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
644
- finally {
645
- try {
646
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
647
- }
648
- finally { if (e_2) throw e_2.error; }
649
- }
622
+ displayValue = XUtilsCommon_1.XUtilsCommon.createDisplayValue(suggestion, this.getFields());
650
623
  }
651
624
  return displayValue;
652
625
  };
@@ -11,6 +11,7 @@ export interface XFormComponentProps<T> {
11
11
  form: XFormBase;
12
12
  label?: string;
13
13
  tooltip?: string;
14
+ placeholder?: string;
14
15
  readOnly?: XReadOnlyProp;
15
16
  labelStyle?: React.CSSProperties;
16
17
  inline?: boolean;
@@ -63,7 +63,7 @@ var XInputText = /** @class */ (function (_super) {
63
63
  var label = this.getLabel();
64
64
  return (react_1.default.createElement("div", { className: "field grid" },
65
65
  label !== undefined ? react_1.default.createElement("label", { htmlFor: this.props.field, className: "col-fixed", style: this.getLabelStyle() }, label) : null,
66
- react_1.default.createElement(inputtext_1.InputText, __assign({ id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), maxLength: this.xField.length, size: size, style: this.props.inputStyle }, this.getClassNameTooltip(), { onBlur: this.onBlur }))));
66
+ react_1.default.createElement(inputtext_1.InputText, __assign({ id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), maxLength: this.xField.length, size: size, style: this.props.inputStyle }, this.getClassNameTooltip(), { onBlur: this.onBlur, placeholder: this.props.placeholder }))));
67
67
  };
68
68
  return XInputText;
69
69
  }(XInput_1.XInput));
@@ -15,6 +15,10 @@ export interface XAppButtonForRow {
15
15
  label: string;
16
16
  onClick: (selectedRow: any) => void;
17
17
  }
18
+ export interface XOptionalCustomFilter {
19
+ label: string;
20
+ filter: XCustomFilter;
21
+ }
18
22
  export interface XEditModeHandlers {
19
23
  onStart: () => void;
20
24
  onSave: () => void;
@@ -52,6 +56,7 @@ export interface XLazyDataTableProps {
52
56
  appButtons?: any;
53
57
  filters?: DataTableFilterMeta;
54
58
  customFilter?: XCustomFilter;
59
+ optionalCustomFilters?: XOptionalCustomFilter[];
55
60
  sortField?: string | DataTableSortMeta[];
56
61
  fullTextSearch: boolean | string[];
57
62
  fields?: string[];
@@ -62,6 +67,7 @@ export interface XLazyDataTableProps {
62
67
  width?: string;
63
68
  rowClassName?: (data: any) => object | string | undefined;
64
69
  dataLoadedState?: [boolean, React.Dispatch<React.SetStateAction<boolean>>];
70
+ exportFieldsToDuplicateValues?: string[];
65
71
  editMode?: boolean;
66
72
  editModeHandlers?: XEditModeHandlers;
67
73
  displayed?: boolean;
@@ -130,6 +130,7 @@ var editor_1 = require("primereact/editor");
130
130
  var XMultilineSwitch_1 = require("./XMultilineSwitch");
131
131
  var XMultilineRenderer_1 = require("./XMultilineRenderer");
132
132
  var XHtmlRenderer_1 = require("./XHtmlRenderer");
133
+ var XOcfDropdown_1 = require("./XOcfDropdown");
133
134
  var XLazyDataTable = function (props) {
134
135
  var _a;
135
136
  // must be here, is used in createInitFilters()
@@ -239,14 +240,16 @@ var XLazyDataTable = function (props) {
239
240
  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)
240
241
  var initFtsInputValue = props.fullTextSearch ? createInitFtsInputValue() : undefined;
241
242
  var _g = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValue = _g[0], setFtsInputValue = _g[1];
242
- var _h = __read((0, react_1.useState)(props.multilineSwitchInitValue), 2), multilineSwitchValue = _h[0], setMultilineSwitchValue = _h[1];
243
- var _j = __read((0, react_1.useState)(XUtils_1.XUtils.createMultiSortMeta(props.sortField)), 2), multiSortMeta = _j[0], setMultiSortMeta = _j[1];
244
- var _k = __read((0, react_1.useState)(null), 2), selectedRow = _k[0], setSelectedRow = _k[1];
245
- var _l = __read((_a = props.dataLoadedState) !== null && _a !== void 0 ? _a : (0, react_1.useState)(false), 2), dataLoaded = _l[0], setDataLoaded = _l[1]; // priznak kde si zapiseme, ci uz sme nacitali data
246
- var _m = __read((0, react_1.useState)(false), 2), exportRowsDialogOpened = _m[0], setExportRowsDialogOpened = _m[1];
247
- var _o = __read((0, react_1.useState)(), 2), exportRowsDialogRowCount = _o[0], setExportRowsDialogRowCount = _o[1]; // param pre dialog
248
- var _p = __read((0, react_1.useState)(filtersInit), 2), filtersAfterFiltering = _p[0], setFiltersAfterFiltering = _p[1]; // sem si odkladame stav filtra po kliknuti na button Filter (chceme exportovat presne to co vidno vyfiltrovane)
249
- var _q = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValueAfterFiltering = _q[0], setFtsInputValueAfterFiltering = _q[1]; // tak isto ako filtersAfterFiltering
243
+ var _h = __read((0, react_1.useState)(undefined), 2), optionalCustomFilter = _h[0], setOptionalCustomFilter = _h[1];
244
+ var _j = __read((0, react_1.useState)(props.multilineSwitchInitValue), 2), multilineSwitchValue = _j[0], setMultilineSwitchValue = _j[1];
245
+ var _k = __read((0, react_1.useState)(XUtils_1.XUtils.createMultiSortMeta(props.sortField)), 2), multiSortMeta = _k[0], setMultiSortMeta = _k[1];
246
+ var _l = __read((0, react_1.useState)(null), 2), selectedRow = _l[0], setSelectedRow = _l[1];
247
+ var _m = __read((_a = props.dataLoadedState) !== null && _a !== void 0 ? _a : (0, react_1.useState)(false), 2), dataLoaded = _m[0], setDataLoaded = _m[1]; // priznak kde si zapiseme, ci uz sme nacitali data
248
+ var _o = __read((0, react_1.useState)(false), 2), exportRowsDialogOpened = _o[0], setExportRowsDialogOpened = _o[1];
249
+ var _p = __read((0, react_1.useState)(), 2), exportRowsDialogRowCount = _p[0], setExportRowsDialogRowCount = _p[1]; // param pre dialog
250
+ var _q = __read((0, react_1.useState)(filtersInit), 2), filtersAfterFiltering = _q[0], setFiltersAfterFiltering = _q[1]; // sem si odkladame stav filtra po kliknuti na button Filter (chceme exportovat presne to co vidno vyfiltrovane)
251
+ var _r = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValueAfterFiltering = _r[0], setFtsInputValueAfterFiltering = _r[1]; // tak isto ako filtersAfterFiltering
252
+ var _s = __read((0, react_1.useState)(undefined), 2), optionalCustomFilterAfterFiltering = _s[0], setOptionalCustomFilterAfterFiltering = _s[1]; // tak isto ako filtersAfterFiltering
250
253
  // parameter [] zabezpeci ze sa metoda zavola len po prvom renderingu (a nie po kazdej zmene stavu (zavolani setNieco()))
251
254
  (0, react_1.useEffect)(function () {
252
255
  // jednoduchy sposob - nepouzivame parameter props.displayed a priznak dataLoaded
@@ -276,10 +279,13 @@ var XLazyDataTable = function (props) {
276
279
  // TODO - preco je to tu? presunut dole ak sa da...
277
280
  var dataKey = props.dataKey !== undefined ? props.dataKey : XUtilsMetadataCommon_1.XUtilsMetadataCommon.getXEntity(props.entity).idField;
278
281
  var onPage = function (event) { return __awaiter(void 0, void 0, void 0, function () {
282
+ var findParam;
279
283
  return __generator(this, function (_a) {
280
284
  //console.log("zavolany onPage");
281
285
  setFirst(event.first);
282
- loadDataBase({ resultType: FindParam_1.ResultType.RowCountAndPagedRows, first: event.first, rows: rows, filters: filters, fullTextSearch: createXFullTextSearch(ftsInputValue), customFilterItems: customFilterItems, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields(), aggregateItems: aggregateItems });
286
+ findParam = createFindParam();
287
+ findParam.first = event.first; // prepiseme first, lebo je tam stara hodnota (volanie setFirst nezmeni first hned)
288
+ loadDataBase(findParam);
283
289
  return [2 /*return*/];
284
290
  });
285
291
  }); };
@@ -293,7 +299,9 @@ var XLazyDataTable = function (props) {
293
299
  //console.log("zavolany onSort - this.state.multiSortMeta = " + JSON.stringify(multiSortMeta));
294
300
  //console.log("zavolany onSort - event.multiSortMeta = " + JSON.stringify(event.multiSortMeta));
295
301
  setMultiSortMeta(event.multiSortMeta);
296
- loadDataBase({ resultType: FindParam_1.ResultType.RowCountAndPagedRows, first: first, rows: rows, filters: filters, fullTextSearch: createXFullTextSearch(ftsInputValue), customFilterItems: customFilterItems, multiSortMeta: event.multiSortMeta, entity: props.entity, fields: getFields(), aggregateItems: aggregateItems });
302
+ var findParam = createFindParam();
303
+ findParam.multiSortMeta = event.multiSortMeta; // prepiseme multiSortMeta, lebo je tam stara hodnota (volanie setMultiSortMeta nezmeni multiSortMeta hned)
304
+ loadDataBase(findParam);
297
305
  };
298
306
  var onClickFilter = function () {
299
307
  //console.log("zavolany onClickFilter");
@@ -306,9 +314,26 @@ var XLazyDataTable = function (props) {
306
314
  if (ftsInputValue) {
307
315
  setFtsInputValue(createInitFtsInputValue());
308
316
  }
317
+ if (props.optionalCustomFilters) {
318
+ setOptionalCustomFilter(undefined);
319
+ }
309
320
  };
310
321
  var loadData = function () {
311
- loadDataBase({ resultType: FindParam_1.ResultType.RowCountAndPagedRows, first: first, rows: rows, filters: filters, fullTextSearch: createXFullTextSearch(ftsInputValue), customFilterItems: customFilterItems, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields(), aggregateItems: aggregateItems });
322
+ loadDataBase(createFindParam());
323
+ };
324
+ var createFindParam = function () {
325
+ return {
326
+ resultType: FindParam_1.ResultType.RowCountAndPagedRows,
327
+ first: first,
328
+ rows: rows,
329
+ filters: filters,
330
+ fullTextSearch: createXFullTextSearch(ftsInputValue),
331
+ customFilterItems: createXCustomFilterItems(customFilterItems, optionalCustomFilter),
332
+ multiSortMeta: multiSortMeta,
333
+ entity: props.entity,
334
+ fields: getFields(true),
335
+ aggregateItems: aggregateItems
336
+ };
312
337
  };
313
338
  var loadDataBase = function (findParam) { return __awaiter(void 0, void 0, void 0, function () {
314
339
  var findResult;
@@ -325,6 +350,7 @@ var XLazyDataTable = function (props) {
325
350
  // odlozime si filter hodnoty pre pripadny export - deep cloning vyzera ze netreba
326
351
  setFiltersAfterFiltering(filters);
327
352
  setFtsInputValueAfterFiltering(ftsInputValue ? __assign({}, ftsInputValue) : undefined);
353
+ setOptionalCustomFilterAfterFiltering(optionalCustomFilter);
328
354
  return [2 /*return*/];
329
355
  }
330
356
  });
@@ -353,7 +379,10 @@ var XLazyDataTable = function (props) {
353
379
  }
354
380
  return xFullTextSearch;
355
381
  };
356
- var getFields = function () {
382
+ var createXCustomFilterItems = function (customFilterItems, optionalCustomFilter) {
383
+ return XUtils_1.XUtils.filterAnd(customFilterItems, optionalCustomFilter === null || optionalCustomFilter === void 0 ? void 0 : optionalCustomFilter.filter);
384
+ };
385
+ var getFields = function (addPropsFields) {
357
386
  // krasne zobrazi cely objekt!
358
387
  //console.log(dataTableEl.current);
359
388
  var e_3, _a;
@@ -372,8 +401,10 @@ var XLazyDataTable = function (props) {
372
401
  }
373
402
  finally { if (e_3) throw e_3.error; }
374
403
  }
375
- if (props.fields) {
376
- fields.push.apply(fields, __spreadArray([], __read(props.fields), false));
404
+ if (addPropsFields) {
405
+ if (props.fields) {
406
+ fields.push.apply(fields, __spreadArray([], __read(props.fields), false));
407
+ }
377
408
  }
378
409
  return fields;
379
410
  };
@@ -504,7 +535,18 @@ var XLazyDataTable = function (props) {
504
535
  return __generator(this, function (_a) {
505
536
  switch (_a.label) {
506
537
  case 0:
507
- findParam = { resultType: FindParam_1.ResultType.OnlyRowCount, first: first, rows: rows, filters: filtersAfterFiltering, fullTextSearch: createXFullTextSearch(ftsInputValueAfterFiltering), customFilterItems: customFilterItems, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields(), aggregateItems: aggregateItems };
538
+ findParam = {
539
+ resultType: FindParam_1.ResultType.OnlyRowCount,
540
+ first: first,
541
+ rows: rows,
542
+ filters: filtersAfterFiltering,
543
+ fullTextSearch: createXFullTextSearch(ftsInputValueAfterFiltering),
544
+ customFilterItems: createXCustomFilterItems(customFilterItems, optionalCustomFilterAfterFiltering),
545
+ multiSortMeta: multiSortMeta,
546
+ entity: props.entity,
547
+ fields: getFields(false),
548
+ aggregateItems: aggregateItems
549
+ };
508
550
  return [4 /*yield*/, findByFilter(findParam)];
509
551
  case 1:
510
552
  findResult = _a.sent();
@@ -516,7 +558,15 @@ var XLazyDataTable = function (props) {
516
558
  });
517
559
  }); };
518
560
  var createExportParams = function () {
519
- var queryParam = { filters: filtersAfterFiltering, fullTextSearch: createXFullTextSearch(ftsInputValueAfterFiltering), customFilterItems: customFilterItems, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields() };
561
+ var queryParam = {
562
+ filters: filtersAfterFiltering,
563
+ fullTextSearch: createXFullTextSearch(ftsInputValueAfterFiltering),
564
+ customFilterItems: createXCustomFilterItems(customFilterItems, optionalCustomFilterAfterFiltering),
565
+ multiSortMeta: multiSortMeta,
566
+ entity: props.entity,
567
+ fields: getFields(false),
568
+ fieldsToDuplicateValues: props.exportFieldsToDuplicateValues
569
+ };
520
570
  return {
521
571
  path: "x-lazy-data-table-export",
522
572
  queryParam: queryParam,
@@ -902,12 +952,13 @@ var XLazyDataTable = function (props) {
902
952
  }
903
953
  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 });
904
954
  });
905
- // align-items-center centruje vertikalne (posuva smerom doulu do stredu)
955
+ // align-items-center centruje vertikalne (posuva smerom dolu do stredu)
906
956
  return (react_1.default.createElement("div", null,
907
957
  react_1.default.createElement("div", { className: "flex justify-content-center align-items-center" },
908
958
  ftsInputValue ? react_1.default.createElement(XFtsInput_1.XFtsInput, { value: ftsInputValue, onChange: function (value) { return setFtsInputValue(value); } }) : null,
909
959
  react_1.default.createElement(XButton_1.XButton, { key: "filter", label: (0, XLocale_1.xLocaleOption)('filter'), onClick: onClickFilter }),
910
960
  react_1.default.createElement(XButton_1.XButton, { key: "clearFilter", label: (0, XLocale_1.xLocaleOption)('clearFilter'), onClick: onClickClearFilter }),
961
+ props.optionalCustomFilters ? react_1.default.createElement(XOcfDropdown_1.XOcfDropdown, { optionalCustomFilters: props.optionalCustomFilters, value: optionalCustomFilter, onChange: function (value) { return setOptionalCustomFilter(value); }, className: "m-1" }) : null,
911
962
  props.multilineSwitch ? react_1.default.createElement(XMultilineSwitch_1.XMultilineSwitch, { value: multilineSwitchValue, onChange: function (value) { return setMultilineSwitchValue(value); }, className: "m-1" }) : null),
912
963
  react_1.default.createElement("div", { className: "flex justify-content-center" },
913
964
  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, rowClassName: props.rowClassName, 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)),
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { XOptionalCustomFilter } from "./XLazyDataTable";
3
+ export declare const XOcfDropdown: (props: {
4
+ optionalCustomFilters: XOptionalCustomFilter[];
5
+ value: XOptionalCustomFilter | undefined;
6
+ onChange: (value: XOptionalCustomFilter | undefined) => void;
7
+ className?: string | undefined;
8
+ }) => JSX.Element;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __read = (this && this.__read) || function (o, n) {
3
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
4
+ if (!m) return o;
5
+ var i = m.call(o), r, ar = [], e;
6
+ try {
7
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
8
+ }
9
+ catch (error) { e = { error: error }; }
10
+ finally {
11
+ try {
12
+ if (r && !r.done && (m = i["return"])) m.call(i);
13
+ }
14
+ finally { if (e) throw e.error; }
15
+ }
16
+ return ar;
17
+ };
18
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
19
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
20
+ if (ar || !(i in from)) {
21
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
22
+ ar[i] = from[i];
23
+ }
24
+ }
25
+ return to.concat(ar || Array.prototype.slice.call(from));
26
+ };
27
+ var __importDefault = (this && this.__importDefault) || function (mod) {
28
+ return (mod && mod.__esModule) ? mod : { "default": mod };
29
+ };
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.XOcfDropdown = void 0;
32
+ var react_1 = __importDefault(require("react"));
33
+ var dropdown_1 = require("primereact/dropdown");
34
+ var XOcfDropdown = function (props) {
35
+ var onChange = function (e) {
36
+ var value;
37
+ // specialna null polozka nema ziadne atributy
38
+ if (Object.keys(e.value).length === 0) {
39
+ value = undefined;
40
+ }
41
+ else {
42
+ value = e.value;
43
+ }
44
+ props.onChange(value);
45
+ };
46
+ // pridame prazdnu polozku
47
+ // polozku pridavame do kopie zoznamu, lebo inac sa nam "polozka" v props.optionalCustomFilters "mnozi"
48
+ var options = __spreadArray([], __read(props.optionalCustomFilters), false);
49
+ options.splice(0, 0, {});
50
+ return (react_1.default.createElement(dropdown_1.Dropdown, { options: options, optionLabel: "label", value: props.value, onChange: onChange, className: props.className }));
51
+ };
52
+ exports.XOcfDropdown = XOcfDropdown;
@@ -16,6 +16,7 @@ export interface LazyDataTableQueryParam {
16
16
  multiSortMeta?: DataTableSortMeta[];
17
17
  entity: string;
18
18
  fields: string[];
19
+ fieldsToDuplicateValues?: string[];
19
20
  }
20
21
  export declare enum CsvSeparator {
21
22
  Semicolon = ";",
@@ -9,10 +9,14 @@ export declare class XUtilsCommon {
9
9
  static getPathToAssocAndField(path: string): [string | null, string];
10
10
  static isSingleField(path: string): boolean;
11
11
  static getPrefixAndField(path: string): [string | null, string];
12
+ static createDisplayValue(object: any, fields: string[]): string;
12
13
  static objectAsJSON(value: any): string;
13
14
  static arrayCreateMap<ID, T>(array: T[], idField: string): Map<ID, T>;
14
15
  static getDayName(date: Date | null | undefined): string | undefined;
15
16
  static dateAddDays(date: Date | null, days: number): Date | null;
17
+ static dateAddMonths(date: Date | null, months: number): Date | null;
18
+ static dateEquals(date1: Date | null, date2: Date | null): boolean;
19
+ static dateDiffInYears(dateOld: Date | null, dateNew: Date | null): number | null;
16
20
  static findFirstMatch(pattern: RegExp, value: string): string | null;
17
21
  static sqlMaxDateIfNull(sqlExp: string): string;
18
22
  static today(): Date;
@@ -168,6 +168,38 @@ var XUtilsCommon = /** @class */ (function () {
168
168
  return [prefix, pathOnly];
169
169
  }
170
170
  };
171
+ XUtilsCommon.createDisplayValue = function (object, fields) {
172
+ var e_2, _a;
173
+ var displayValue = "";
174
+ try {
175
+ for (var fields_1 = __values(fields), fields_1_1 = fields_1.next(); !fields_1_1.done; fields_1_1 = fields_1.next()) {
176
+ var field = fields_1_1.value;
177
+ // TODO - konverzie na spravny typ/string
178
+ var _b = __read(XUtilsCommon.getPrefixAndField(field), 2), prefix = _b[0], fieldOnly = _b[1];
179
+ var value = XUtilsCommon.getValueByPath(object, fieldOnly);
180
+ if (value !== null && value !== undefined) {
181
+ var valueStr = value.toString(); // TODO - spravnu konverziu
182
+ if (valueStr !== "") {
183
+ if (displayValue !== "") {
184
+ displayValue += " ";
185
+ }
186
+ if (prefix) {
187
+ displayValue += prefix;
188
+ }
189
+ displayValue += valueStr;
190
+ }
191
+ }
192
+ }
193
+ }
194
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
195
+ finally {
196
+ try {
197
+ if (fields_1_1 && !fields_1_1.done && (_a = fields_1.return)) _a.call(fields_1);
198
+ }
199
+ finally { if (e_2) throw e_2.error; }
200
+ }
201
+ return displayValue;
202
+ };
171
203
  XUtilsCommon.objectAsJSON = function (value) {
172
204
  // sem treba dat nejaku pre nas vhodnu serializaciu
173
205
  // zatial provizorne robene cez antipatern - modifikaciu prototype funcii primitivnych typov
@@ -191,7 +223,7 @@ var XUtilsCommon = /** @class */ (function () {
191
223
  return json;
192
224
  };
193
225
  XUtilsCommon.arrayCreateMap = function (array, idField) {
194
- var e_2, _a;
226
+ var e_3, _a;
195
227
  var idRowMap = new Map();
196
228
  try {
197
229
  for (var array_1 = __values(array), array_1_1 = array_1.next(); !array_1_1.done; array_1_1 = array_1.next()) {
@@ -201,12 +233,12 @@ var XUtilsCommon = /** @class */ (function () {
201
233
  }
202
234
  }
203
235
  }
204
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
236
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
205
237
  finally {
206
238
  try {
207
239
  if (array_1_1 && !array_1_1.done && (_a = array_1.return)) _a.call(array_1);
208
240
  }
209
- finally { if (e_2) throw e_2.error; }
241
+ finally { if (e_3) throw e_3.error; }
210
242
  }
211
243
  return idRowMap;
212
244
  };
@@ -222,6 +254,49 @@ var XUtilsCommon = /** @class */ (function () {
222
254
  }
223
255
  return result;
224
256
  };
257
+ XUtilsCommon.dateAddMonths = function (date, months) {
258
+ var result = null;
259
+ if (date !== null) {
260
+ result = new Date(date);
261
+ result.setMonth(result.getMonth() + months);
262
+ }
263
+ return result;
264
+ };
265
+ // helper method, because date1 === date2 compares pointers, not values (Date is not primitive type like string or number)
266
+ XUtilsCommon.dateEquals = function (date1, date2) {
267
+ var result = false;
268
+ if (date1 === null && date2 === null) {
269
+ result = true;
270
+ }
271
+ else if (date1 !== null && date2 !== null) {
272
+ result = (date1.getTime() === date2.getTime());
273
+ }
274
+ return result;
275
+ };
276
+ // solution from internet
277
+ XUtilsCommon.dateDiffInYears = function (dateOld, dateNew) {
278
+ var diff = null;
279
+ if (dateOld !== null && dateNew !== null) {
280
+ var yearNew = dateNew.getFullYear();
281
+ var monthNew = dateNew.getMonth();
282
+ var dayNew = dateNew.getDate();
283
+ var yearOld = dateOld.getFullYear();
284
+ var monthOld = dateOld.getMonth();
285
+ var dayOld = dateOld.getDate();
286
+ diff = yearNew - yearOld;
287
+ if (monthOld > monthNew) {
288
+ diff--;
289
+ }
290
+ else {
291
+ if (monthOld === monthNew) {
292
+ if (dayOld > dayNew) {
293
+ diff--;
294
+ }
295
+ }
296
+ }
297
+ }
298
+ return diff;
299
+ };
225
300
  XUtilsCommon.findFirstMatch = function (pattern, value) {
226
301
  var match = pattern.exec(value);
227
302
  return match != null ? match[0] : null;
@@ -19,7 +19,8 @@ export declare function intervalAsUI(valueInterval: IPostgresInterval | null): s
19
19
  export declare function booleanAsUIText(value: boolean | null): string;
20
20
  export declare enum AsUIType {
21
21
  Form = 1,
22
- Text = 2
22
+ Text = 2,
23
+ Excel = 3
23
24
  }
24
25
  /**
25
26
  * converts values of object
@@ -31,3 +32,4 @@ export declare enum AsUIType {
31
32
  */
32
33
  export declare function convertObject(entity: string, object: any, fromModel: boolean, asUI: AsUIType | undefined): void;
33
34
  export declare function convertValue(xField: XField, value: any, fromModel: boolean, asUI: AsUIType | undefined): any;
35
+ export declare function convertValueBase(fieldType: string, fractionDigits: number | undefined, value: any, fromModel: boolean, asUI: AsUIType | undefined): any;
@@ -27,7 +27,7 @@ var __read = (this && this.__read) || function (o, n) {
27
27
  return ar;
28
28
  };
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.convertValue = exports.convertObject = exports.AsUIType = exports.booleanAsUIText = exports.intervalAsUI = exports.intervalFromUI = exports.datetimeFormatUI = exports.dateFormatCalendar = exports.dateFormatUI = exports.timeFromModel = exports.datetimeAsUI = exports.dateAsUI = exports.dateFromUI = exports.dateFromModel = exports.numberFromModel = exports.numberAsUI = exports.intFromUI = exports.stringAsDB = exports.stringAsUI = exports.stringFromUI = void 0;
30
+ exports.convertValueBase = exports.convertValue = exports.convertObject = exports.AsUIType = exports.booleanAsUIText = exports.intervalAsUI = exports.intervalFromUI = exports.datetimeFormatUI = exports.dateFormatCalendar = exports.dateFormatUI = exports.timeFromModel = exports.datetimeAsUI = exports.dateAsUI = exports.dateFromUI = exports.dateFromModel = exports.numberFromModel = exports.numberAsUI = exports.intFromUI = exports.stringAsDB = exports.stringAsUI = exports.stringFromUI = void 0;
31
31
  var XUtilsCommon_1 = require("./XUtilsCommon");
32
32
  var XLocale_1 = require("../components/XLocale");
33
33
  var XUtilsMetadataCommon_1 = require("./XUtilsMetadataCommon");
@@ -284,7 +284,8 @@ exports.booleanAsUIText = booleanAsUIText;
284
284
  var AsUIType;
285
285
  (function (AsUIType) {
286
286
  AsUIType[AsUIType["Form"] = 1] = "Form";
287
- AsUIType[AsUIType["Text"] = 2] = "Text"; // reporty - boolean sa konvertuje na ano/nie
287
+ AsUIType[AsUIType["Text"] = 2] = "Text";
288
+ AsUIType[AsUIType["Excel"] = 3] = "Excel"; // excel - nie vsetko konvertujeme do string-u, vecsinou zostavame pri typoch number, Date
288
289
  })(AsUIType = exports.AsUIType || (exports.AsUIType = {}));
289
290
  /**
290
291
  * converts values of object
@@ -345,23 +346,27 @@ function convertObject(entity, object, fromModel, asUI) {
345
346
  }
346
347
  exports.convertObject = convertObject;
347
348
  function convertValue(xField, value, fromModel, asUI) {
348
- if (xField.type === "decimal") {
349
+ return convertValueBase(xField.type, xField.scale, value, fromModel, asUI);
350
+ }
351
+ exports.convertValue = convertValue;
352
+ function convertValueBase(fieldType, fractionDigits, value, fromModel, asUI) {
353
+ if (fieldType === "decimal") {
349
354
  if (fromModel) {
350
355
  value = numberFromModel(value);
351
356
  }
352
- if (asUI) {
353
- value = numberAsUI(value, xField.scale);
357
+ if (asUI && asUI !== AsUIType.Excel) {
358
+ value = numberAsUI(value, fractionDigits);
354
359
  }
355
360
  }
356
- else if (xField.type === "date") {
361
+ else if (fieldType === "date") {
357
362
  if (fromModel) {
358
363
  value = dateFromModel(value);
359
364
  }
360
- if (asUI) {
365
+ if (asUI && asUI !== AsUIType.Excel) {
361
366
  value = dateAsUI(value);
362
367
  }
363
368
  }
364
- else if (xField.type === "datetime") {
369
+ else if (fieldType === "datetime") {
365
370
  if (fromModel) {
366
371
  value = dateFromModel(value);
367
372
  }
@@ -369,25 +374,25 @@ function convertValue(xField, value, fromModel, asUI) {
369
374
  value = datetimeAsUI(value);
370
375
  }
371
376
  }
372
- else if (xField.type === "interval") {
377
+ else if (fieldType === "interval") {
373
378
  // konverziu z modelu (json objekt-u) netreba
374
379
  if (asUI) {
375
380
  value = intervalAsUI(value);
376
381
  }
377
382
  }
378
- else if (xField.type === "boolean") {
383
+ else if (fieldType === "boolean") {
379
384
  // konverziu z modelu (json objekt-u) netreba
380
385
  // pre AsUIType.Form ponechame typ boolean (spracujeme neskor)
381
- if (asUI === AsUIType.Text) {
386
+ if (asUI === AsUIType.Text || asUI === AsUIType.Excel) {
382
387
  value = booleanAsUIText(value);
383
388
  }
384
389
  }
385
390
  else {
386
391
  // vsetko ostatne
387
- if (asUI) {
388
- value = value ? value.toString() : "";
392
+ if (asUI && asUI !== AsUIType.Excel) {
393
+ value = (value !== null && value !== undefined) ? value.toString() : "";
389
394
  }
390
395
  }
391
396
  return value;
392
397
  }
393
- exports.convertValue = convertValue;
398
+ exports.convertValueBase = convertValueBase;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michalrakus/x-react-web-lib",
3
- "version": "1.20.0",
3
+ "version": "1.21.0",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "clean": "rimraf lib",