@michalrakus/x-react-web-lib 1.20.0 → 1.22.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 (41) hide show
  1. package/XFormHeader.d.ts +3 -0
  2. package/XFormHeader.js +5 -0
  3. package/XParamBrowse.d.ts +3 -0
  4. package/XParamBrowse.js +5 -0
  5. package/XParamForm.d.ts +3 -0
  6. package/XParamForm.js +5 -0
  7. package/gulpfile.js +5 -2
  8. package/lib/administration/XParamBrowse.d.ts +6 -0
  9. package/lib/administration/XParamBrowse.js +25 -0
  10. package/lib/administration/XParamForm.d.ts +7 -0
  11. package/lib/administration/XParamForm.js +62 -0
  12. package/lib/administration/XUserBrowse.js +1 -1
  13. package/lib/administration/XUserForm.js +12 -9
  14. package/lib/components/XAutoCompleteBase.js +2 -29
  15. package/lib/components/XCalendar.d.ts +15 -8
  16. package/lib/components/XCalendar.js +21 -2
  17. package/lib/components/XFormComponent.d.ts +1 -0
  18. package/lib/components/XFormHeader.d.ts +4 -0
  19. package/lib/components/XFormHeader.js +11 -0
  20. package/lib/components/XInputDate.js +1 -1
  21. package/lib/components/XInputDateDT.js +1 -1
  22. package/lib/components/XInputText.js +1 -1
  23. package/lib/components/XLazyDataTable/XExportRowsDialog.d.ts +10 -5
  24. package/lib/components/XLazyDataTable/XExportRowsDialog.js +79 -44
  25. package/lib/components/XLazyDataTable/XLazyDataTable.d.ts +7 -0
  26. package/lib/components/XLazyDataTable/XLazyDataTable.js +113 -31
  27. package/lib/components/XLazyDataTable/XMultilineSwitch.js +1 -1
  28. package/lib/components/XLazyDataTable/XOcfDropdown.d.ts +8 -0
  29. package/lib/components/XLazyDataTable/XOcfDropdown.js +53 -0
  30. package/lib/components/XUtils.d.ts +3 -1
  31. package/lib/components/XUtils.js +42 -10
  32. package/lib/components/locale/x-en.json +1 -0
  33. package/lib/serverApi/ExportImportParam.d.ts +29 -11
  34. package/lib/serverApi/ExportImportParam.js +11 -1
  35. package/lib/serverApi/XUtilsCommon.d.ts +5 -0
  36. package/lib/serverApi/XUtilsCommon.js +90 -3
  37. package/lib/serverApi/XUtilsConversions.d.ts +13 -5
  38. package/lib/serverApi/XUtilsConversions.js +110 -34
  39. package/lib/serverApi/XUtilsMetadataCommon.d.ts +1 -0
  40. package/lib/serverApi/XUtilsMetadataCommon.js +17 -0
  41. package/package.json +1 -1
@@ -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;
@@ -34,6 +38,7 @@ export interface XSearchBrowseProps {
34
38
  }
35
39
  export interface XLazyDataTableProps {
36
40
  entity: string;
41
+ label?: string;
37
42
  dataKey?: string;
38
43
  paginator: boolean;
39
44
  rows: number;
@@ -52,6 +57,7 @@ export interface XLazyDataTableProps {
52
57
  appButtons?: any;
53
58
  filters?: DataTableFilterMeta;
54
59
  customFilter?: XCustomFilter;
60
+ optionalCustomFilters?: XOptionalCustomFilter[];
55
61
  sortField?: string | DataTableSortMeta[];
56
62
  fullTextSearch: boolean | string[];
57
63
  fields?: string[];
@@ -62,6 +68,7 @@ export interface XLazyDataTableProps {
62
68
  width?: string;
63
69
  rowClassName?: (data: any) => object | string | undefined;
64
70
  dataLoadedState?: [boolean, React.Dispatch<React.SetStateAction<boolean>>];
71
+ exportFieldsToDuplicateValues?: string[];
65
72
  editMode?: boolean;
66
73
  editModeHandlers?: XEditModeHandlers;
67
74
  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
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)({ dialogOpened: false }), 2), exportRowsDialogState = _o[0], setExportRowsDialogState = _o[1];
249
+ //const [exportRowsDialogRowCount, setExportRowsDialogRowCount] = useState<number>(); // param pre dialog
248
250
  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
251
  var _q = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValueAfterFiltering = _q[0], setFtsInputValueAfterFiltering = _q[1]; // tak isto ako filtersAfterFiltering
252
+ var _r = __read((0, react_1.useState)(undefined), 2), optionalCustomFilterAfterFiltering = _r[0], setOptionalCustomFilterAfterFiltering = _r[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
  };
@@ -399,6 +430,28 @@ var XLazyDataTable = function (props) {
399
430
  }
400
431
  return headers;
401
432
  };
433
+ var getWidths = function () {
434
+ var e_5, _a;
435
+ var _b;
436
+ // vrati sirky stlpcov napr. ['7.75rem', '20rem', '8.5rem', '8.5rem', '6rem']
437
+ // nevracia aktualne sirky stlpcov (po manualnom rozsireni) ale tie ktore boli nastavene/vypocitane v kode
438
+ var widths = [];
439
+ var columns = dataTableEl.current.props.children;
440
+ try {
441
+ for (var columns_5 = __values(columns), columns_5_1 = columns_5.next(); !columns_5_1.done; columns_5_1 = columns_5.next()) {
442
+ var column = columns_5_1.value;
443
+ widths.push((_b = column.props.headerStyle) === null || _b === void 0 ? void 0 : _b.width);
444
+ }
445
+ }
446
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
447
+ finally {
448
+ try {
449
+ if (columns_5_1 && !columns_5_1.done && (_a = columns_5.return)) _a.call(columns_5);
450
+ }
451
+ finally { if (e_5) throw e_5.error; }
452
+ }
453
+ return widths;
454
+ };
402
455
  var hasContentTypeHtml = function () {
403
456
  var columns = props.children;
404
457
  return columns.some(function (column) { return column.props.contentType === "html"; });
@@ -436,7 +489,7 @@ var XLazyDataTable = function (props) {
436
489
  }
437
490
  };
438
491
  var onClickRemoveRow = function () { return __awaiter(void 0, void 0, void 0, function () {
439
- var reread, e_5, e_6;
492
+ var reread, e_6, e_7;
440
493
  return __generator(this, function (_a) {
441
494
  switch (_a.label) {
442
495
  case 0:
@@ -451,8 +504,8 @@ var XLazyDataTable = function (props) {
451
504
  reread = _a.sent();
452
505
  return [3 /*break*/, 4];
453
506
  case 3:
454
- e_5 = _a.sent();
455
- XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_5);
507
+ e_6 = _a.sent();
508
+ XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_6);
456
509
  return [3 /*break*/, 4];
457
510
  case 4:
458
511
  if (reread) {
@@ -474,8 +527,8 @@ var XLazyDataTable = function (props) {
474
527
  _a.sent();
475
528
  return [3 /*break*/, 9];
476
529
  case 8:
477
- e_6 = _a.sent();
478
- XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_6);
530
+ e_7 = _a.sent();
531
+ XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_7);
479
532
  return [3 /*break*/, 9];
480
533
  case 9:
481
534
  loadData();
@@ -500,30 +553,55 @@ var XLazyDataTable = function (props) {
500
553
  }
501
554
  };
502
555
  var onClickExport = function () { return __awaiter(void 0, void 0, void 0, function () {
503
- var findParam, findResult;
556
+ var fields, findParam, findResult, exportParams;
504
557
  return __generator(this, function (_a) {
505
558
  switch (_a.label) {
506
559
  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 };
560
+ fields = getFields(false);
561
+ findParam = {
562
+ resultType: FindParam_1.ResultType.OnlyRowCount,
563
+ first: first,
564
+ rows: rows,
565
+ filters: filtersAfterFiltering,
566
+ fullTextSearch: createXFullTextSearch(ftsInputValueAfterFiltering),
567
+ customFilterItems: createXCustomFilterItems(customFilterItems, optionalCustomFilterAfterFiltering),
568
+ multiSortMeta: multiSortMeta,
569
+ entity: props.entity,
570
+ fields: fields,
571
+ aggregateItems: aggregateItems
572
+ };
508
573
  return [4 /*yield*/, findByFilter(findParam)];
509
574
  case 1:
510
575
  findResult = _a.sent();
511
- //setLoading(false);
512
- setExportRowsDialogRowCount(findResult.totalRecords); // param pre dialog
513
- setExportRowsDialogOpened(true);
576
+ exportParams = createExportParams(fields, findResult.totalRecords);
577
+ setExportRowsDialogState({ dialogOpened: true, exportParams: exportParams });
514
578
  return [2 /*return*/];
515
579
  }
516
580
  });
517
581
  }); };
518
- var createExportParams = function () {
519
- var queryParam = { filters: filtersAfterFiltering, fullTextSearch: createXFullTextSearch(ftsInputValueAfterFiltering), customFilterItems: customFilterItems, multiSortMeta: multiSortMeta, entity: props.entity, fields: getFields() };
582
+ var createExportParams = function (fields, rowCount) {
583
+ var queryParam = {
584
+ filters: filtersAfterFiltering,
585
+ fullTextSearch: createXFullTextSearch(ftsInputValueAfterFiltering),
586
+ customFilterItems: createXCustomFilterItems(customFilterItems, optionalCustomFilterAfterFiltering),
587
+ multiSortMeta: multiSortMeta,
588
+ entity: props.entity,
589
+ fields: fields
590
+ };
520
591
  return {
521
- path: "x-lazy-data-table-export",
592
+ rowCount: rowCount,
593
+ existsToManyAssoc: existsToManyAssoc(fields),
522
594
  queryParam: queryParam,
523
595
  headers: getHeaders(),
596
+ widths: getWidths(),
597
+ fieldsToDuplicateValues: props.exportFieldsToDuplicateValues,
524
598
  fileName: "".concat(props.entity)
525
599
  };
526
600
  };
601
+ var existsToManyAssoc = function (fields) {
602
+ var xEntity = XUtilsMetadataCommon_1.XUtilsMetadataCommon.getXEntity(props.entity);
603
+ return fields.some(function (value) { return XUtilsMetadataCommon_1.XUtilsMetadataCommon.hasPathToManyAssoc(xEntity, value); });
604
+ };
527
605
  var onClickChoose = function () {
528
606
  //console.log("zavolany onClickChoose");
529
607
  if (selectedRow !== null) {
@@ -802,12 +880,12 @@ var XLazyDataTable = function (props) {
802
880
  // display: 'flex' umiestni XCalendar elementy vedla seba
803
881
  filterElement =
804
882
  react_1.default.createElement("div", { style: betweenFilter === "row" ? { display: 'flex' } : undefined },
805
- react_1.default.createElement(XCalendar_1.XCalendar, { value: getFilterValue1(childColumn.props.field), onChange: function (value) { return setFilterValue1(childColumn.props.field, value); }, datetime: xField.type === "datetime" }),
806
- react_1.default.createElement(XCalendar_1.XCalendar, { value: getFilterValue2(childColumn.props.field), onChange: function (value) { return setFilterValue2(childColumn.props.field, value); }, datetime: xField.type === "datetime" }));
883
+ react_1.default.createElement(XCalendar_1.XCalendar, { value: getFilterValue1(childColumn.props.field), onChange: function (value) { return setFilterValue1(childColumn.props.field, value); }, scale: xField.scale, datetime: xField.type === "datetime" }),
884
+ react_1.default.createElement(XCalendar_1.XCalendar, { value: getFilterValue2(childColumn.props.field), onChange: function (value) { return setFilterValue2(childColumn.props.field, value); }, scale: xField.scale, datetime: xField.type === "datetime" }));
807
885
  }
808
886
  else {
809
887
  var dateValue = getFilterValue(childColumn.props.field);
810
- filterElement = react_1.default.createElement(XCalendar_1.XCalendar, { value: dateValue, onChange: function (value) { return setFilterValue(childColumn.props.field, value); }, datetime: xField.type === "datetime" });
888
+ filterElement = react_1.default.createElement(XCalendar_1.XCalendar, { value: dateValue, onChange: function (value) { return setFilterValue(childColumn.props.field, value); }, scale: xField.scale, datetime: xField.type === "datetime" });
811
889
  }
812
890
  }
813
891
  else if (xField.type === "decimal" || xField.type === "number") {
@@ -902,13 +980,17 @@ var XLazyDataTable = function (props) {
902
980
  }
903
981
  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
982
  });
905
- // align-items-center centruje vertikalne (posuva smerom doulu do stredu)
983
+ // align-items-center centruje vertikalne (posuva smerom dolu do stredu)
984
+ // x-lazy-datatable-label-right-compensation - vyvazuje label, aby item-y v strede isli aspon priblizne do stredu
906
985
  return (react_1.default.createElement("div", null,
907
986
  react_1.default.createElement("div", { className: "flex justify-content-center align-items-center" },
987
+ props.label ? react_1.default.createElement("div", { className: "x-lazy-datatable-label" }, props.label) : null,
908
988
  ftsInputValue ? react_1.default.createElement(XFtsInput_1.XFtsInput, { value: ftsInputValue, onChange: function (value) { return setFtsInputValue(value); } }) : null,
909
989
  react_1.default.createElement(XButton_1.XButton, { key: "filter", label: (0, XLocale_1.xLocaleOption)('filter'), onClick: onClickFilter }),
910
990
  react_1.default.createElement(XButton_1.XButton, { key: "clearFilter", label: (0, XLocale_1.xLocaleOption)('clearFilter'), onClick: onClickClearFilter }),
911
- props.multilineSwitch ? react_1.default.createElement(XMultilineSwitch_1.XMultilineSwitch, { value: multilineSwitchValue, onChange: function (value) { return setMultilineSwitchValue(value); }, className: "m-1" }) : null),
991
+ props.optionalCustomFilters ? react_1.default.createElement(XOcfDropdown_1.XOcfDropdown, { optionalCustomFilters: props.optionalCustomFilters, value: optionalCustomFilter, onChange: function (value) { return setOptionalCustomFilter(value); }, className: "m-1" }) : null,
992
+ props.multilineSwitch ? react_1.default.createElement(XMultilineSwitch_1.XMultilineSwitch, { value: multilineSwitchValue, onChange: function (value) { return setMultilineSwitchValue(value); }, className: "m-1" }) : null,
993
+ props.label ? react_1.default.createElement("div", { className: "x-lazy-datatable-label-right-compensation" }) : null),
912
994
  react_1.default.createElement("div", { className: "flex justify-content-center" },
913
995
  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)),
914
996
  react_1.default.createElement("div", { className: "flex justify-content-center" },
@@ -919,7 +1001,7 @@ var XLazyDataTable = function (props) {
919
1001
  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,
920
1002
  props.appButtons,
921
1003
  props.searchBrowseParams !== undefined ? react_1.default.createElement(XButton_1.XButton, { key: "choose", label: (0, XLocale_1.xLocaleOption)('chooseRow'), onClick: onClickChoose }) : null,
922
- exportRows ? react_1.default.createElement(XExportRowsDialog_1.XExportRowsDialog, { key: "exportRowsDialog", dialogOpened: exportRowsDialogOpened, hideDialog: function () { return setExportRowsDialogOpened(false); }, rowCount: exportRowsDialogRowCount, exportParams: createExportParams }) : null),
1004
+ exportRows ? react_1.default.createElement(XExportRowsDialog_1.XExportRowsDialog, { key: "exportRowsDialog", dialogState: exportRowsDialogState, hideDialog: function () { return setExportRowsDialogState({ dialogOpened: false }); } }) : null),
923
1005
  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">) */));
924
1006
  };
925
1007
  exports.XLazyDataTable = XLazyDataTable;
@@ -15,6 +15,6 @@ var XMultilineSwitch = function (props) {
15
15
  var itemTemplate = function (option) {
16
16
  return react_1.default.createElement("i", { className: option.icon });
17
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 }));
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, allowEmpty: false, className: props.className }));
19
19
  };
20
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,53 @@
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
+ // dropdown for optional custom filter (ocf)
35
+ var XOcfDropdown = function (props) {
36
+ var onChange = function (e) {
37
+ var value;
38
+ // specialna null polozka nema ziadne atributy
39
+ if (Object.keys(e.value).length === 0) {
40
+ value = undefined;
41
+ }
42
+ else {
43
+ value = e.value;
44
+ }
45
+ props.onChange(value);
46
+ };
47
+ // pridame prazdnu polozku
48
+ // polozku pridavame do kopie zoznamu, lebo inac sa nam "polozka" v props.optionalCustomFilters "mnozi"
49
+ var options = __spreadArray([], __read(props.optionalCustomFilters), false);
50
+ options.splice(0, 0, {});
51
+ return (react_1.default.createElement(dropdown_1.Dropdown, { options: options, optionLabel: "label", value: props.value, onChange: onChange, className: props.className }));
52
+ };
53
+ exports.XOcfDropdown = XOcfDropdown;
@@ -1,5 +1,5 @@
1
1
  import { XToken } from "./XToken";
2
- import { CsvDecimalFormat, CsvEncoding, CsvSeparator, ExportType } from "../serverApi/ExportImportParam";
2
+ import { CsvDecimalFormat, CsvEncoding, CsvSeparator, ExportType, XMultilineExportType } from "../serverApi/ExportImportParam";
3
3
  import React from "react";
4
4
  import { XEnvVar } from "./XEnvVars";
5
5
  import { XError, XErrorMap } from "./XErrors";
@@ -36,6 +36,7 @@ export declare class XUtils {
36
36
  static xTokenPublic: XToken;
37
37
  private static appFormMap;
38
38
  static exportTypeOptions: ExportType[];
39
+ static multilineExportTypeOptions: XMultilineExportType[];
39
40
  static csvSeparatorOptions: CsvSeparator[];
40
41
  static decimalFormatOptions: CsvDecimalFormat[];
41
42
  static csvEncodingOptions: CsvEncoding[];
@@ -60,6 +61,7 @@ export declare class XUtils {
60
61
  static fetchString(path: string, value: any): Promise<string>;
61
62
  static fetch(path: string, value: any, usePublicToken?: boolean | XToken): Promise<any>;
62
63
  static post(path: string, value: any): Promise<Response>;
64
+ static openExcelReport(apiPath: string, requestPayload: any, fileName?: string): Promise<boolean>;
63
65
  static fetchBasicJson(path: string, value: any, usePublicToken?: boolean | XToken): Promise<Response>;
64
66
  static fetchFile(path: string, jsonFieldValue: any, fileToPost: any): Promise<any>;
65
67
  static fetchBasicAuthBasic(path: string, headers: any, body: any, usePublicToken?: boolean | XToken): Promise<Response>;
@@ -334,6 +334,36 @@ var XUtils = /** @class */ (function () {
334
334
  XUtils.post = function (path, value) {
335
335
  return XUtils.fetchBasicJson(path, value);
336
336
  };
337
+ XUtils.openExcelReport = function (apiPath, requestPayload, fileName) {
338
+ return __awaiter(this, void 0, void 0, function () {
339
+ var response, e_5, fileNameExt, respBlob, url, a;
340
+ return __generator(this, function (_a) {
341
+ switch (_a.label) {
342
+ case 0:
343
+ _a.trys.push([0, 2, , 3]);
344
+ return [4 /*yield*/, XUtils.fetchBasicJson(apiPath, requestPayload)];
345
+ case 1:
346
+ response = _a.sent();
347
+ return [3 /*break*/, 3];
348
+ case 2:
349
+ e_5 = _a.sent();
350
+ XUtils.showErrorMessage("Nepodarilo sa vytvori\u0165/stiahnu\u0165 xlsx s\u00FAbor.", e_5); // dalsie info (apiPath, payload) by mali byt v "e"
351
+ return [2 /*return*/, false];
352
+ case 3:
353
+ fileNameExt = "".concat(fileName !== null && fileName !== void 0 ? fileName : apiPath, ".xlsx");
354
+ return [4 /*yield*/, response.blob()];
355
+ case 4:
356
+ respBlob = _a.sent();
357
+ url = window.URL.createObjectURL(respBlob);
358
+ a = document.createElement('a');
359
+ a.href = url;
360
+ a.download = fileNameExt;
361
+ a.click();
362
+ return [2 /*return*/, true];
363
+ }
364
+ });
365
+ });
366
+ };
337
367
  XUtils.fetchBasicJson = function (path, value, usePublicToken) {
338
368
  return XUtils.fetchBasic(path, { 'Content-Type': 'application/json' }, XUtilsCommon_1.XUtilsCommon.objectAsJSON(value), usePublicToken);
339
369
  };
@@ -538,7 +568,7 @@ var XUtils = /** @class */ (function () {
538
568
  * @param idField
539
569
  */
540
570
  XUtils.arrayIntersect = function (array1, array2, idField) {
541
- var e_5, _a;
571
+ var e_6, _a;
542
572
  var array2IdSet = new Set();
543
573
  try {
544
574
  for (var array2_1 = __values(array2), array2_1_1 = array2_1.next(); !array2_1_1.done; array2_1_1 = array2_1.next()) {
@@ -548,12 +578,12 @@ var XUtils = /** @class */ (function () {
548
578
  }
549
579
  }
550
580
  }
551
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
581
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
552
582
  finally {
553
583
  try {
554
584
  if (array2_1_1 && !array2_1_1.done && (_a = array2_1.return)) _a.call(array2_1);
555
585
  }
556
- finally { if (e_5) throw e_5.error; }
586
+ finally { if (e_6) throw e_6.error; }
557
587
  }
558
588
  return array1.filter(function (item) { return item && array2IdSet.has(item[idField]); });
559
589
  };
@@ -642,7 +672,7 @@ var XUtils = /** @class */ (function () {
642
672
  // pomocna metodka
643
673
  // ak nie su v xErrorMap ziadne chyby, vrati ""
644
674
  XUtils.getErrorMessages = function (xErrorMap) {
645
- var e_6, _a;
675
+ var e_7, _a;
646
676
  var _b;
647
677
  var msg = "";
648
678
  try {
@@ -656,12 +686,12 @@ var XUtils = /** @class */ (function () {
656
686
  }
657
687
  }
658
688
  }
659
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
689
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
660
690
  finally {
661
691
  try {
662
692
  if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
663
693
  }
664
- finally { if (e_6) throw e_6.error; }
694
+ finally { if (e_7) throw e_7.error; }
665
695
  }
666
696
  return msg;
667
697
  };
@@ -732,7 +762,7 @@ var XUtils = /** @class */ (function () {
732
762
  };
733
763
  // pomocna metodka
734
764
  XUtils.filterAnd = function () {
735
- var e_7, _a;
765
+ var e_8, _a;
736
766
  var filters = [];
737
767
  for (var _i = 0; _i < arguments.length; _i++) {
738
768
  filters[_i] = arguments[_i];
@@ -749,12 +779,12 @@ var XUtils = /** @class */ (function () {
749
779
  }
750
780
  }
751
781
  }
752
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
782
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
753
783
  finally {
754
784
  try {
755
785
  if (filters_1_1 && !filters_1_1.done && (_a = filters_1.return)) _a.call(filters_1);
756
786
  }
757
- finally { if (e_7) throw e_7.error; }
787
+ finally { if (e_8) throw e_8.error; }
758
788
  }
759
789
  }
760
790
  return customFilterItemsResult;
@@ -799,7 +829,9 @@ var XUtils = /** @class */ (function () {
799
829
  XUtils.xTokenPublic = { username: "xPublicUser", password: "xPublicUserPassword123" };
800
830
  // nacachovane metadata (setuju sa v App.fetchAndSetXMetadata)
801
831
  XUtils.appFormMap = {};
802
- XUtils.exportTypeOptions = [ExportImportParam_1.ExportType.Csv, ExportImportParam_1.ExportType.Json];
832
+ XUtils.exportTypeOptions = [ExportImportParam_1.ExportType.Excel, ExportImportParam_1.ExportType.Csv, ExportImportParam_1.ExportType.Json];
833
+ // moznost Off zatial nie je implementovana
834
+ XUtils.multilineExportTypeOptions = [ExportImportParam_1.XMultilineExportType.Multiline, ExportImportParam_1.XMultilineExportType.Singleline /*, XMultilineExportType.Off*/];
803
835
  XUtils.csvSeparatorOptions = [ExportImportParam_1.CsvSeparator.Semicolon, ExportImportParam_1.CsvSeparator.Comma];
804
836
  XUtils.decimalFormatOptions = [ExportImportParam_1.CsvDecimalFormat.Comma, ExportImportParam_1.CsvDecimalFormat.Dot];
805
837
  XUtils.csvEncodingOptions = [ExportImportParam_1.CsvEncoding.Utf8, ExportImportParam_1.CsvEncoding.Win1250];
@@ -16,6 +16,7 @@
16
16
  "expRowCount": "Row count",
17
17
  "expExportType": "Export type",
18
18
  "expCreateHeaderLine": "Create header line",
19
+ "expDetailRowsExport": "Detail rows export",
19
20
  "expCsvSeparator": "Csv separator",
20
21
  "expDecimalFormat": "Decimal format",
21
22
  "expEncoding": "Encoding",
@@ -1,13 +1,22 @@
1
1
  import { DataTableFilterMeta, DataTableSortMeta } from "primereact/datatable";
2
2
  import { XCustomFilterItem, XFullTextSearch } from "./FindParam";
3
3
  export declare enum ExportType {
4
+ Excel = "excel",
4
5
  Csv = "csv",
5
6
  Json = "json"
6
7
  }
7
- export interface ExportParam {
8
- exportType: ExportType;
9
- csvParam?: CsvParam;
10
- queryParam: LazyDataTableQueryParam | any;
8
+ export interface ExportExcelParam {
9
+ queryParam: LazyDataTableQueryParam;
10
+ excelCsvParam: ExcelCsvParam;
11
+ widths: string[];
12
+ }
13
+ export interface ExportCsvParam {
14
+ queryParam: LazyDataTableQueryParam;
15
+ excelCsvParam: ExcelCsvParam;
16
+ csvParam: CsvParam;
17
+ }
18
+ export interface ExportJsonParam {
19
+ queryParam: LazyDataTableQueryParam;
11
20
  }
12
21
  export interface LazyDataTableQueryParam {
13
22
  filters: DataTableFilterMeta;
@@ -17,6 +26,22 @@ export interface LazyDataTableQueryParam {
17
26
  entity: string;
18
27
  fields: string[];
19
28
  }
29
+ export interface ExcelCsvParam {
30
+ headers?: string[];
31
+ toManyAssocExport: XMultilineExportType;
32
+ multilineTextExport: XMultilineExportType;
33
+ fieldsToDuplicateValues?: string[];
34
+ }
35
+ export declare enum XMultilineExportType {
36
+ Singleline = "singleline",
37
+ Multiline = "multiline",
38
+ Off = "off"
39
+ }
40
+ export interface CsvParam {
41
+ csvSeparator: CsvSeparator;
42
+ csvDecimalFormat: CsvDecimalFormat;
43
+ csvEncoding: CsvEncoding;
44
+ }
20
45
  export declare enum CsvSeparator {
21
46
  Semicolon = ";",
22
47
  Comma = ","
@@ -29,13 +54,6 @@ export declare enum CsvEncoding {
29
54
  Utf8 = "utf-8",
30
55
  Win1250 = "win1250"
31
56
  }
32
- export interface CsvParam {
33
- useHeaderLine: boolean;
34
- headers?: string[];
35
- csvSeparator: CsvSeparator;
36
- csvDecimalFormat: CsvDecimalFormat;
37
- csvEncoding: CsvEncoding;
38
- }
39
57
  export declare enum ImportType {
40
58
  Csv = "csv",
41
59
  Json = "json"
@@ -1,11 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ImportType = exports.CsvEncoding = exports.CsvDecimalFormat = exports.CsvSeparator = exports.ExportType = void 0;
3
+ exports.ImportType = exports.CsvEncoding = exports.CsvDecimalFormat = exports.CsvSeparator = exports.XMultilineExportType = exports.ExportType = void 0;
4
+ // ************** export ***************
4
5
  var ExportType;
5
6
  (function (ExportType) {
7
+ ExportType["Excel"] = "excel";
6
8
  ExportType["Csv"] = "csv";
7
9
  ExportType["Json"] = "json";
8
10
  })(ExportType = exports.ExportType || (exports.ExportType = {}));
11
+ // exportovanie hodnot z toMany asociacii, pripadne viacriadkovych textov
12
+ var XMultilineExportType;
13
+ (function (XMultilineExportType) {
14
+ XMultilineExportType["Singleline"] = "singleline";
15
+ XMultilineExportType["Multiline"] = "multiline";
16
+ XMultilineExportType["Off"] = "off"; // stlpce obsahujuce viac hodnot/riadkov sa vynechaju z exportu
17
+ })(XMultilineExportType = exports.XMultilineExportType || (exports.XMultilineExportType = {}));
9
18
  // vo windowse zavisi od regionalnych nastaveni, default nastavenie je ";" a preto vecsinou aj excel produkuje csv s ";" (menej sa to bije s decimalmi)
10
19
  // takze primarne pouzivame ";" a sekundarne "," napr. pri generickom exporte do csv davame uzivatelovi na vyber
11
20
  var CsvSeparator;
@@ -27,6 +36,7 @@ var CsvEncoding;
27
36
  CsvEncoding["Utf8"] = "utf-8";
28
37
  CsvEncoding["Win1250"] = "win1250";
29
38
  })(CsvEncoding = exports.CsvEncoding || (exports.CsvEncoding = {}));
39
+ // ************** import ***************
30
40
  var ImportType;
31
41
  (function (ImportType) {
32
42
  ImportType["Csv"] = "csv";