@michalrakus/x-react-web-lib 1.19.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.
Files changed (64) hide show
  1. package/XEditor.d.ts +3 -0
  2. package/XEditor.js +5 -0
  3. package/XEditorBase.d.ts +3 -0
  4. package/XEditorBase.js +5 -0
  5. package/XExportRowsDialog.d.ts +1 -1
  6. package/XExportRowsDialog.js +1 -1
  7. package/XHtmlRenderer.d.ts +3 -0
  8. package/XHtmlRenderer.js +5 -0
  9. package/XLazyDataTable.d.ts +1 -1
  10. package/XLazyDataTable.js +1 -1
  11. package/XMultilineRenderer.d.ts +3 -0
  12. package/XMultilineRenderer.js +5 -0
  13. package/XParamBrowse.d.ts +3 -0
  14. package/XParamBrowse.js +5 -0
  15. package/XParamForm.d.ts +3 -0
  16. package/XParamForm.js +5 -0
  17. package/gulpfile.js +11 -4
  18. package/lib/administration/XBrowseMetaBrowse.d.ts +1 -1
  19. package/lib/administration/XBrowseMetaBrowse.js +1 -1
  20. package/lib/administration/XParamBrowse.d.ts +6 -0
  21. package/lib/administration/XParamBrowse.js +25 -0
  22. package/lib/administration/XParamForm.d.ts +7 -0
  23. package/lib/administration/XParamForm.js +60 -0
  24. package/lib/administration/XUserBrowse.d.ts +1 -1
  25. package/lib/administration/XUserBrowse.js +1 -1
  26. package/lib/components/XAutoComplete.d.ts +2 -0
  27. package/lib/components/XAutoComplete.js +1 -1
  28. package/lib/components/XAutoCompleteBase.d.ts +5 -1
  29. package/lib/components/XAutoCompleteBase.js +35 -36
  30. package/lib/components/XAutoCompleteDT.d.ts +4 -2
  31. package/lib/components/XAutoCompleteDT.js +1 -1
  32. package/lib/components/XEditBrowse.js +1 -1
  33. package/lib/components/XEditor.d.ts +15 -0
  34. package/lib/components/XEditor.js +64 -0
  35. package/lib/components/XEditorBase.d.ts +9 -0
  36. package/lib/components/XEditorBase.js +91 -0
  37. package/lib/components/XFormBase.d.ts +1 -0
  38. package/lib/components/XFormBase.js +19 -4
  39. package/lib/components/XFormComponent.d.ts +1 -0
  40. package/lib/components/XInputText.js +1 -1
  41. package/lib/components/XInputTextareaBase.js +3 -4
  42. package/lib/components/{XExportRowsDialog.d.ts → XLazyDataTable/XExportRowsDialog.d.ts} +1 -1
  43. package/lib/components/{XExportRowsDialog.js → XLazyDataTable/XExportRowsDialog.js} +5 -5
  44. package/lib/components/XLazyDataTable/XHtmlRenderer.d.ts +7 -0
  45. package/lib/components/XLazyDataTable/XHtmlRenderer.js +78 -0
  46. package/lib/components/{XLazyDataTable.d.ts → XLazyDataTable/XLazyDataTable.d.ts} +22 -6
  47. package/lib/components/{XLazyDataTable.js → XLazyDataTable/XLazyDataTable.js} +112 -48
  48. package/lib/components/XLazyDataTable/XMultilineRenderer.d.ts +8 -0
  49. package/lib/components/XLazyDataTable/XMultilineRenderer.js +80 -0
  50. package/lib/components/XLazyDataTable/XMultilineSwitch.d.ts +7 -0
  51. package/lib/components/XLazyDataTable/XMultilineSwitch.js +20 -0
  52. package/lib/components/XLazyDataTable/XOcfDropdown.d.ts +8 -0
  53. package/lib/components/XLazyDataTable/XOcfDropdown.js +52 -0
  54. package/lib/components/XUtilsMetadata.d.ts +1 -1
  55. package/lib/serverApi/ExportImportParam.d.ts +1 -0
  56. package/lib/serverApi/XUtilsCommon.d.ts +5 -0
  57. package/lib/serverApi/XUtilsCommon.js +101 -1
  58. package/lib/serverApi/XUtilsConversions.d.ts +3 -1
  59. package/lib/serverApi/XUtilsConversions.js +19 -14
  60. package/lib/serverApi/XUtilsMetadataCommon.d.ts +1 -0
  61. package/lib/serverApi/XUtilsMetadataCommon.js +16 -0
  62. package/lib/serverApi/x-lib-api.d.ts +6 -0
  63. package/lib/serverApi/x-lib-api.js +3 -0
  64. package/package.json +2 -1
@@ -110,23 +110,27 @@ exports.XLazyColumn = exports.XLazyDataTable = void 0;
110
110
  var react_1 = __importStar(require("react"));
111
111
  var datatable_1 = require("primereact/datatable");
112
112
  var column_1 = require("primereact/column");
113
- var XButton_1 = require("./XButton");
114
- var XUtils_1 = require("./XUtils");
115
- var XUtilsMetadata_1 = require("./XUtilsMetadata");
116
- var XDropdownDTFilter_1 = require("./XDropdownDTFilter");
117
- var XUtilsConversions_1 = require("../serverApi/XUtilsConversions");
118
- var FindParam_1 = require("../serverApi/FindParam");
119
- var XButtonIconSmall_1 = require("./XButtonIconSmall");
113
+ var XButton_1 = require("../XButton");
114
+ var XUtils_1 = require("../XUtils");
115
+ var XUtilsMetadata_1 = require("../XUtilsMetadata");
116
+ var XDropdownDTFilter_1 = require("../XDropdownDTFilter");
117
+ var XUtilsConversions_1 = require("../../serverApi/XUtilsConversions");
118
+ var FindParam_1 = require("../../serverApi/FindParam");
119
+ var XButtonIconSmall_1 = require("../XButtonIconSmall");
120
120
  var tristatecheckbox_1 = require("primereact/tristatecheckbox");
121
- var XUtilsCommon_1 = require("../serverApi/XUtilsCommon");
121
+ var XUtilsCommon_1 = require("../../serverApi/XUtilsCommon");
122
122
  var XExportRowsDialog_1 = require("./XExportRowsDialog");
123
123
  var api_1 = require("primereact/api");
124
- var XCalendar_1 = require("./XCalendar");
125
- var XInputDecimalBase_1 = require("./XInputDecimalBase");
126
- var XLocale_1 = require("./XLocale");
127
- var XFtsInput_1 = require("./XFtsInput");
128
- var XUtilsMetadataCommon_1 = require("../serverApi/XUtilsMetadataCommon");
129
- var inputswitch_1 = require("primereact/inputswitch");
124
+ var XCalendar_1 = require("../XCalendar");
125
+ var XInputDecimalBase_1 = require("../XInputDecimalBase");
126
+ var XLocale_1 = require("../XLocale");
127
+ var XFtsInput_1 = require("../XFtsInput");
128
+ var XUtilsMetadataCommon_1 = require("../../serverApi/XUtilsMetadataCommon");
129
+ var editor_1 = require("primereact/editor");
130
+ var XMultilineSwitch_1 = require("./XMultilineSwitch");
131
+ var XMultilineRenderer_1 = require("./XMultilineRenderer");
132
+ var XHtmlRenderer_1 = require("./XHtmlRenderer");
133
+ var XOcfDropdown_1 = require("./XOcfDropdown");
130
134
  var XLazyDataTable = function (props) {
131
135
  var _a;
132
136
  // must be here, is used in createInitFilters()
@@ -236,14 +240,16 @@ var XLazyDataTable = function (props) {
236
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)
237
241
  var initFtsInputValue = props.fullTextSearch ? createInitFtsInputValue() : undefined;
238
242
  var _g = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValue = _g[0], setFtsInputValue = _g[1];
239
- var _h = __read((0, react_1.useState)(true), 2), multiLineSwitchValue = _h[0], setMultiLineSwitchValue = _h[1];
240
- var _j = __read((0, react_1.useState)(XUtils_1.XUtils.createMultiSortMeta(props.sortField)), 2), multiSortMeta = _j[0], setMultiSortMeta = _j[1];
241
- var _k = __read((0, react_1.useState)(null), 2), selectedRow = _k[0], setSelectedRow = _k[1];
242
- 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
243
- var _m = __read((0, react_1.useState)(false), 2), exportRowsDialogOpened = _m[0], setExportRowsDialogOpened = _m[1];
244
- var _o = __read((0, react_1.useState)(), 2), exportRowsDialogRowCount = _o[0], setExportRowsDialogRowCount = _o[1]; // param pre dialog
245
- 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)
246
- 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
247
253
  // parameter [] zabezpeci ze sa metoda zavola len po prvom renderingu (a nie po kazdej zmene stavu (zavolani setNieco()))
248
254
  (0, react_1.useEffect)(function () {
249
255
  // jednoduchy sposob - nepouzivame parameter props.displayed a priznak dataLoaded
@@ -273,10 +279,13 @@ var XLazyDataTable = function (props) {
273
279
  // TODO - preco je to tu? presunut dole ak sa da...
274
280
  var dataKey = props.dataKey !== undefined ? props.dataKey : XUtilsMetadataCommon_1.XUtilsMetadataCommon.getXEntity(props.entity).idField;
275
281
  var onPage = function (event) { return __awaiter(void 0, void 0, void 0, function () {
282
+ var findParam;
276
283
  return __generator(this, function (_a) {
277
284
  //console.log("zavolany onPage");
278
285
  setFirst(event.first);
279
- 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);
280
289
  return [2 /*return*/];
281
290
  });
282
291
  }); };
@@ -290,7 +299,9 @@ var XLazyDataTable = function (props) {
290
299
  //console.log("zavolany onSort - this.state.multiSortMeta = " + JSON.stringify(multiSortMeta));
291
300
  //console.log("zavolany onSort - event.multiSortMeta = " + JSON.stringify(event.multiSortMeta));
292
301
  setMultiSortMeta(event.multiSortMeta);
293
- 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);
294
305
  };
295
306
  var onClickFilter = function () {
296
307
  //console.log("zavolany onClickFilter");
@@ -303,9 +314,26 @@ var XLazyDataTable = function (props) {
303
314
  if (ftsInputValue) {
304
315
  setFtsInputValue(createInitFtsInputValue());
305
316
  }
317
+ if (props.optionalCustomFilters) {
318
+ setOptionalCustomFilter(undefined);
319
+ }
306
320
  };
307
321
  var loadData = function () {
308
- 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
+ };
309
337
  };
310
338
  var loadDataBase = function (findParam) { return __awaiter(void 0, void 0, void 0, function () {
311
339
  var findResult;
@@ -322,6 +350,7 @@ var XLazyDataTable = function (props) {
322
350
  // odlozime si filter hodnoty pre pripadny export - deep cloning vyzera ze netreba
323
351
  setFiltersAfterFiltering(filters);
324
352
  setFtsInputValueAfterFiltering(ftsInputValue ? __assign({}, ftsInputValue) : undefined);
353
+ setOptionalCustomFilterAfterFiltering(optionalCustomFilter);
325
354
  return [2 /*return*/];
326
355
  }
327
356
  });
@@ -350,7 +379,10 @@ var XLazyDataTable = function (props) {
350
379
  }
351
380
  return xFullTextSearch;
352
381
  };
353
- 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) {
354
386
  // krasne zobrazi cely objekt!
355
387
  //console.log(dataTableEl.current);
356
388
  var e_3, _a;
@@ -369,8 +401,10 @@ var XLazyDataTable = function (props) {
369
401
  }
370
402
  finally { if (e_3) throw e_3.error; }
371
403
  }
372
- if (props.fields) {
373
- 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
+ }
374
408
  }
375
409
  return fields;
376
410
  };
@@ -396,6 +430,10 @@ var XLazyDataTable = function (props) {
396
430
  }
397
431
  return headers;
398
432
  };
433
+ var hasContentTypeHtml = function () {
434
+ var columns = props.children;
435
+ return columns.some(function (column) { return column.props.contentType === "html"; });
436
+ };
399
437
  var onSelectionChange = function (event) {
400
438
  //console.log("zavolany onSelectionChange");
401
439
  //console.log(event.value);
@@ -497,7 +535,18 @@ var XLazyDataTable = function (props) {
497
535
  return __generator(this, function (_a) {
498
536
  switch (_a.label) {
499
537
  case 0:
500
- 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
+ };
501
550
  return [4 /*yield*/, findByFilter(findParam)];
502
551
  case 1:
503
552
  findResult = _a.sent();
@@ -509,7 +558,15 @@ var XLazyDataTable = function (props) {
509
558
  });
510
559
  }); };
511
560
  var createExportParams = function () {
512
- 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
+ };
513
570
  return {
514
571
  path: "x-lazy-data-table-export",
515
572
  queryParam: queryParam,
@@ -617,23 +674,26 @@ var XLazyDataTable = function (props) {
617
674
  }
618
675
  return betweenFilter;
619
676
  };
620
- var valueAsUI = function (value, xField) {
677
+ var valueAsUI = function (value, xField, contentType) {
621
678
  var valueResult;
622
679
  if (xField.type === "boolean") {
623
680
  // TODO - efektivnejsie by bolo renderovat len prislusne ikonky
624
681
  valueResult = react_1.default.createElement(tristatecheckbox_1.TriStateCheckbox, { value: value, disabled: true });
625
682
  }
626
683
  else {
627
- // ine typy - convertValue vrati string
628
- // mame zapnutu konverziu fromModel, lebo z json-u nam prichadzaju objekty typu string (napr. pri datumoch)
629
- valueResult = (0, XUtilsConversions_1.convertValue)(xField, value, true, XUtilsConversions_1.AsUIType.Form);
630
- // ak mame viacriadkovy text a zapnuty multiLineSwitch (defaultne je zapnuty aj ked nie je zobrazeny)
631
- if (multiLineSwitchValue) {
632
- if (xField.type === "string" && typeof valueResult === "string" && valueResult) {
633
- var lines = valueResult.split(XUtilsCommon_1.XUtilsCommon.newLine);
634
- if (lines.length >= 2) {
635
- var elemList = lines.map(function (value, index) { return react_1.default.createElement("div", { key: index }, value); });
636
- valueResult = react_1.default.createElement("div", null, elemList);
684
+ if (contentType === "html") {
685
+ // value should be always string (xField.type === "string")
686
+ valueResult = react_1.default.createElement(XHtmlRenderer_1.XHtmlRenderer, { htmlValue: value, renderType: multilineSwitchValue, fewLinesCount: props.multilineSwitchFewLinesCount });
687
+ }
688
+ else {
689
+ // ine typy - convertValue vrati string
690
+ // mame zapnutu konverziu fromModel, lebo z json-u nam prichadzaju objekty typu string (napr. pri datumoch)
691
+ valueResult = (0, XUtilsConversions_1.convertValue)(xField, value, true, XUtilsConversions_1.AsUIType.Form);
692
+ // ak mame viacriadkovy text a multilineSwitch nastaveny na viac ako 1 riadok (defaultne je nastaveny na "allLines") pouzijeme XMultilineRenderer
693
+ if (contentType === "multiline" && multilineSwitchValue !== "singleLine") {
694
+ if (xField.type === "string" && typeof valueResult === "string" && valueResult) {
695
+ var lines = valueResult.split(XUtilsCommon_1.XUtilsCommon.newLine);
696
+ valueResult = react_1.default.createElement(XMultilineRenderer_1.XMultilineRenderer, { valueList: lines, renderType: multilineSwitchValue, fewLinesCount: props.multilineSwitchFewLinesCount, multilineContent: true });
637
697
  }
638
698
  }
639
699
  }
@@ -644,11 +704,11 @@ var XLazyDataTable = function (props) {
644
704
  var bodyValue;
645
705
  var rowDataValue = XUtilsCommon_1.XUtilsCommon.getValueOrValueListByPath(rowData, columnProps.field);
646
706
  if (Array.isArray(rowDataValue)) {
647
- var elemList = rowDataValue.map(function (value, index) { return react_1.default.createElement("div", { key: index }, valueAsUI(value, xField)); });
648
- bodyValue = react_1.default.createElement("div", null, elemList);
707
+ var elemList = rowDataValue.map(function (value) { return valueAsUI(value, xField, columnProps.contentType); });
708
+ bodyValue = react_1.default.createElement(XMultilineRenderer_1.XMultilineRenderer, { valueList: elemList, renderType: multilineSwitchValue, fewLinesCount: props.multilineSwitchFewLinesCount });
649
709
  }
650
710
  else {
651
- bodyValue = valueAsUI(rowDataValue, xField);
711
+ bodyValue = valueAsUI(rowDataValue, xField, columnProps.contentType);
652
712
  }
653
713
  return bodyValue;
654
714
  };
@@ -892,13 +952,14 @@ var XLazyDataTable = function (props) {
892
952
  }
893
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 });
894
954
  });
895
- // align-items-center centruje vertikalne (posuva smerom doulu do stredu)
955
+ // align-items-center centruje vertikalne (posuva smerom dolu do stredu)
896
956
  return (react_1.default.createElement("div", null,
897
957
  react_1.default.createElement("div", { className: "flex justify-content-center align-items-center" },
898
958
  ftsInputValue ? react_1.default.createElement(XFtsInput_1.XFtsInput, { value: ftsInputValue, onChange: function (value) { return setFtsInputValue(value); } }) : null,
899
959
  react_1.default.createElement(XButton_1.XButton, { key: "filter", label: (0, XLocale_1.xLocaleOption)('filter'), onClick: onClickFilter }),
900
960
  react_1.default.createElement(XButton_1.XButton, { key: "clearFilter", label: (0, XLocale_1.xLocaleOption)('clearFilter'), onClick: onClickClearFilter }),
901
- props.multiLineSwitch ? react_1.default.createElement(inputswitch_1.InputSwitch, { checked: multiLineSwitchValue, onChange: function (e) { return setMultiLineSwitchValue(e.value); }, className: "m-1" }) : null),
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,
962
+ props.multilineSwitch ? react_1.default.createElement(XMultilineSwitch_1.XMultilineSwitch, { value: multilineSwitchValue, onChange: function (value) { return setMultilineSwitchValue(value); }, className: "m-1" }) : null),
902
963
  react_1.default.createElement("div", { className: "flex justify-content-center" },
903
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)),
904
965
  react_1.default.createElement("div", { className: "flex justify-content-center" },
@@ -909,7 +970,8 @@ var XLazyDataTable = function (props) {
909
970
  props.appButtonsForRow ? props.appButtonsForRow.map(function (xAppButton) { return react_1.default.createElement(XButton_1.XButton, { key: xAppButton.key, icon: xAppButton.icon, label: xAppButton.label, onClick: function () { return onClickAppButtonForRow(xAppButton.onClick); } }); }) : null,
910
971
  props.appButtons,
911
972
  props.searchBrowseParams !== undefined ? react_1.default.createElement(XButton_1.XButton, { key: "choose", label: (0, XLocale_1.xLocaleOption)('chooseRow'), onClick: onClickChoose }) : null,
912
- exportRows ? react_1.default.createElement(XExportRowsDialog_1.XExportRowsDialog, { key: "exportRowsDialog", dialogOpened: exportRowsDialogOpened, hideDialog: function () { return setExportRowsDialogOpened(false); }, rowCount: exportRowsDialogRowCount, exportParams: createExportParams }) : null)));
973
+ exportRows ? react_1.default.createElement(XExportRowsDialog_1.XExportRowsDialog, { key: "exportRowsDialog", dialogOpened: exportRowsDialogOpened, hideDialog: function () { return setExportRowsDialogOpened(false); }, rowCount: exportRowsDialogRowCount, exportParams: createExportParams }) : null),
974
+ hasContentTypeHtml() ? react_1.default.createElement(editor_1.Editor, { style: { display: 'none' }, showHeader: false }) : null /* we want to import css if needed (<style type="text/css" data-primereact-style-id="editor">) */));
913
975
  };
914
976
  exports.XLazyDataTable = XLazyDataTable;
915
977
  exports.XLazyDataTable.defaultProps = {
@@ -917,7 +979,9 @@ exports.XLazyDataTable.defaultProps = {
917
979
  rows: 10,
918
980
  filterDisplay: "row",
919
981
  fullTextSearch: true,
920
- multiLineSwitch: false,
982
+ multilineSwitch: false,
983
+ multilineSwitchInitValue: "allLines",
984
+ multilineSwitchFewLinesCount: 2,
921
985
  scrollable: true,
922
986
  scrollWidth: 'viewport',
923
987
  scrollHeight: 'viewport',
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { XMultilineRenderType } from "./XLazyDataTable";
3
+ export declare const XMultilineRenderer: (props: {
4
+ valueList: React.ReactNode[];
5
+ renderType: XMultilineRenderType;
6
+ fewLinesCount: number;
7
+ multilineContent?: boolean;
8
+ }) => JSX.Element;
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __read = (this && this.__read) || function (o, n) {
26
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
27
+ if (!m) return o;
28
+ var i = m.call(o), r, ar = [], e;
29
+ try {
30
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
31
+ }
32
+ catch (error) { e = { error: error }; }
33
+ finally {
34
+ try {
35
+ if (r && !r.done && (m = i["return"])) m.call(i);
36
+ }
37
+ finally { if (e) throw e.error; }
38
+ }
39
+ return ar;
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.XMultilineRenderer = void 0;
43
+ var react_1 = __importStar(require("react"));
44
+ var button_1 = require("primereact/button");
45
+ var XMultilineRenderer = function (props) {
46
+ // used only for props.renderType === "fewLines"
47
+ var _a = __read((0, react_1.useState)(false), 2), showAllLines = _a[0], setShowAllLines = _a[1];
48
+ var valueResult; // musime vracat element, ak chceme XMultilineRenderer volat priamo cez jsx
49
+ if (props.renderType === "singleLine") {
50
+ // TODO - joinovat elementy
51
+ valueResult = react_1.default.createElement("div", null, props.valueList.join(", ")); // pouziva sa hlavne pre oneToMany asociacie
52
+ }
53
+ else {
54
+ var valueListLocal = props.valueList;
55
+ if (props.renderType === "fewLines" && !showAllLines) {
56
+ valueListLocal = valueListLocal.slice(0, props.fewLinesCount);
57
+ }
58
+ var elemList = valueListLocal.map(function (value, index) { return react_1.default.createElement("div", { key: index }, value); });
59
+ if (props.renderType === "fewLines") {
60
+ if (props.valueList.length > props.fewLinesCount) {
61
+ // prepiseme posledny element v zozname - pridame mu button
62
+ var elemListLastIndex = elemList.length - 1;
63
+ elemList[elemListLastIndex] =
64
+ react_1.default.createElement("div", { key: elemListLastIndex },
65
+ valueListLocal[elemListLastIndex],
66
+ react_1.default.createElement(button_1.Button, { icon: showAllLines ? "pi pi-angle-double-left" : "pi pi-angle-double-right", onClick: function () { return setShowAllLines(!showAllLines); }, className: "x-button-multiline-expand-collapse" }));
67
+ // ak by bol nejaky problem s tym hore tak treba pouzit toto:
68
+ // elemList[elemListLastIndex] =
69
+ // <div className="flex flex-row flex-wrap">
70
+ // <div key={elemListLastIndex}>{valueListLocal[elemListLastIndex]}</div>
71
+ // <Button icon={showAllLines ? "pi pi-angle-double-left" : "pi pi-angle-double-right"} onClick={() => setShowAllLines(!showAllLines)}
72
+ // className="x-button-multiline-expand-collapse"/>
73
+ // </div>;
74
+ }
75
+ }
76
+ valueResult = react_1.default.createElement("div", { className: props.multilineContent ? "x-multiline-content" : undefined }, elemList);
77
+ }
78
+ return valueResult;
79
+ };
80
+ exports.XMultilineRenderer = XMultilineRenderer;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { XMultilineRenderType } from "./XLazyDataTable";
3
+ export declare const XMultilineSwitch: (props: {
4
+ value: XMultilineRenderType;
5
+ onChange: (value: XMultilineRenderType) => void;
6
+ className?: string | undefined;
7
+ }) => JSX.Element;
@@ -0,0 +1,20 @@
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.XMultilineSwitch = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var selectbutton_1 = require("primereact/selectbutton");
9
+ var XMultilineSwitch = function (props) {
10
+ var options = [
11
+ { icon: 'pi pi-minus', value: 'singleLine' },
12
+ { icon: 'pi pi-bars', value: 'fewLines' },
13
+ { icon: 'pi pi-align-justify', value: 'allLines' }
14
+ ];
15
+ var itemTemplate = function (option) {
16
+ return react_1.default.createElement("i", { className: option.icon });
17
+ };
18
+ return (react_1.default.createElement(selectbutton_1.SelectButton, { value: props.value, onChange: function (e) { return props.onChange(e.value); }, options: options, optionValue: "value", itemTemplate: itemTemplate, className: props.className }));
19
+ };
20
+ exports.XMultilineSwitch = XMultilineSwitch;
@@ -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;
@@ -1,6 +1,6 @@
1
1
  import { XField } from "../serverApi/XEntityMetadata";
2
2
  import { XBrowseMeta } from "../serverApi/XBrowseMetadata";
3
- import { XBetweenFilterProp } from "./XLazyDataTable";
3
+ import { XBetweenFilterProp } from "./XLazyDataTable/XLazyDataTable";
4
4
  export declare class XUtilsMetadata {
5
5
  private static xBrowseMetaMap;
6
6
  static fetchAndSetXEntityMap(): Promise<any>;
@@ -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,9 +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;
14
+ static arrayCreateMap<ID, T>(array: T[], idField: string): Map<ID, T>;
13
15
  static getDayName(date: Date | null | undefined): string | undefined;
14
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;
15
20
  static findFirstMatch(pattern: RegExp, value: string): string | null;
16
21
  static sqlMaxDateIfNull(sqlExp: string): string;
17
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
@@ -190,6 +222,26 @@ var XUtilsCommon = /** @class */ (function () {
190
222
  Date.prototype.toJSON = dateToJSONOriginal;
191
223
  return json;
192
224
  };
225
+ XUtilsCommon.arrayCreateMap = function (array, idField) {
226
+ var e_3, _a;
227
+ var idRowMap = new Map();
228
+ try {
229
+ for (var array_1 = __values(array), array_1_1 = array_1.next(); !array_1_1.done; array_1_1 = array_1.next()) {
230
+ var row = array_1_1.value;
231
+ if (row) {
232
+ idRowMap.set(row[idField], row);
233
+ }
234
+ }
235
+ }
236
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
237
+ finally {
238
+ try {
239
+ if (array_1_1 && !array_1_1.done && (_a = array_1.return)) _a.call(array_1);
240
+ }
241
+ finally { if (e_3) throw e_3.error; }
242
+ }
243
+ return idRowMap;
244
+ };
193
245
  XUtilsCommon.getDayName = function (date) {
194
246
  var days = ['nedeľa', 'pondelok', 'utorok', 'streda', 'štvrtok', 'piatok', 'sobota'];
195
247
  return date ? days[date.getDay()] : undefined;
@@ -202,6 +254,49 @@ var XUtilsCommon = /** @class */ (function () {
202
254
  }
203
255
  return result;
204
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
+ };
205
300
  XUtilsCommon.findFirstMatch = function (pattern, value) {
206
301
  var match = pattern.exec(value);
207
302
  return match != null ? match[0] : null;
@@ -212,7 +307,12 @@ var XUtilsCommon = /** @class */ (function () {
212
307
  };
213
308
  XUtilsCommon.today = function () {
214
309
  var today = new Date();
215
- today.setHours(0, 0, 0, 0);
310
+ // vynulujeme casovu zlozku
311
+ // poznamka: Date vzdy obsahuje aj casovu zlozku. Nase konverzne funkcie dateFromModel a dateFromUI pouzivaju konverziu new Date('YYYY-MM-DD')
312
+ // a tato konverzia vytvara datum s GMT/UTC/Z casom 00:00:00 (stredoeuropsky 00:01:00 - akokeby sme zadavali new Date('YYYY-MM-DDT00:00:00Z'))
313
+ //today.setHours(0, 0, 0, 0); // nastavi cas 00:00:00 v aktualnej timezone (stredoeuropsky 00:00:00, GMT 23:00:00)
314
+ // - potom nam nefunguje porovnavanie s datumami vytvorenymi cez funkcie dateFromModel a dateFromUI
315
+ today.setUTCHours(0, 0, 0, 0);
216
316
  return today;
217
317
  };
218
318
  // vrati true ak sa string sklada iba z cislic, moze mat + alebo - na zaciatku