@michalrakus/x-react-web-lib 1.32.4 → 1.32.6

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.
@@ -76,7 +76,13 @@ var XCalendar = function (props) {
76
76
  var onSelect = function (e) {
77
77
  // musime tu zavolat props.onChange lebo event select zavola aj onChange ale my umyselne v onChange nevolame props.onChange
78
78
  // (cakame na event blur, ktory po selecte nepride)
79
- props.onChange(e.value); // vzdycky Date
79
+ //props.onChange(e.value as any); // vzdycky Date
80
+ // <- bolo takto ale vytvaralo Tue Feb 04 2025 00:00:00 GMT+0100 (Central European Standard Time) a cez onBlur (a ked prisiel string z DB)
81
+ // tak vytvaralo Tue Feb 04 2025 01:00:00 GMT+0100 (Central European Standard Time)
82
+ // a potom nefungoval XUtilsCommon.dateEquals (cez date1.getTime() === date2.getTime())
83
+ // aby bol onSelect aj onBlur jednotne, tak dame:
84
+ var value = (0, XUtilsConversions_1.dateFromUI)((0, XUtilsConversions_1.dateAsUI)(e.value, props.scale), props.scale); // e.value je vzdy Date
85
+ props.onChange(value !== null && value !== void 0 ? value : null);
80
86
  // pre poriadok resetneme stav
81
87
  setInputChanged(false);
82
88
  setInputValueState(undefined);
@@ -49,11 +49,59 @@ var __read = (this && this.__read) || function (o, n) {
49
49
  }
50
50
  return ar;
51
51
  };
52
+ var __importDefault = (this && this.__importDefault) || function (mod) {
53
+ return (mod && mod.__esModule) ? mod : { "default": mod };
54
+ };
52
55
  Object.defineProperty(exports, "__esModule", { value: true });
53
56
  exports.XEditorBase = void 0;
54
57
  var react_1 = __importStar(require("react"));
55
58
  var XUtils_1 = require("./XUtils");
56
59
  var editor_1 = require("primereact/editor");
60
+ var quill_1 = __importDefault(require("quill"));
61
+ // bez tohto kodu size options nefunguju
62
+ var Size = quill_1.default.import('attributors/style/size');
63
+ Size.whitelist = ['10px', '12px', '14px', '16px', '18px', '24px', '32px', '48px'];
64
+ quill_1.default.register(Size, true);
65
+ var Font = quill_1.default.import('formats/font');
66
+ Font.whitelist = [
67
+ 'sans-serif', 'serif', 'monospace',
68
+ 'times-new-roman', 'comic-sans',
69
+ ];
70
+ quill_1.default.register(Font, true);
71
+ var headerTemplate = function () {
72
+ // poznamka - k tomuto layout-u sa este viazu css styly umiestnene v App.css
73
+ var styleMarginRight = { marginRight: '0.7rem' };
74
+ return (react_1.default.createElement("span", { className: "ql-formats" },
75
+ react_1.default.createElement("select", { className: "ql-font", "aria-label": "Font" },
76
+ react_1.default.createElement("option", { value: "sans-serif", selected: true }, "Sans-Serif"),
77
+ react_1.default.createElement("option", { value: "serif" }, "Serif"),
78
+ react_1.default.createElement("option", { value: "monospace" }, "Monospace"),
79
+ react_1.default.createElement("option", { value: "times-new-roman" }, "TimesNewRoman"),
80
+ react_1.default.createElement("option", { value: "comic-sans" }, "Comic Sans")),
81
+ react_1.default.createElement("select", { className: "ql-size", "aria-label": "Font Size", style: styleMarginRight },
82
+ react_1.default.createElement("option", { value: "10px" }, "10"),
83
+ react_1.default.createElement("option", { value: "12px", selected: true }, "12"),
84
+ react_1.default.createElement("option", { value: "14px" }, "14"),
85
+ react_1.default.createElement("option", { value: "16px" }, "16"),
86
+ react_1.default.createElement("option", { value: "18px" }, "18"),
87
+ react_1.default.createElement("option", { value: "24px" }, "24"),
88
+ react_1.default.createElement("option", { value: "32px" }, "32"),
89
+ react_1.default.createElement("option", { value: "48px" }, "48")),
90
+ react_1.default.createElement("button", { className: "ql-bold", "aria-label": "Bold" }),
91
+ react_1.default.createElement("button", { className: "ql-italic", "aria-label": "Italic" }),
92
+ react_1.default.createElement("button", { className: "ql-underline", "aria-label": "Underline" }),
93
+ react_1.default.createElement("button", { className: "ql-strike", "aria-label": "Strikethrough", style: styleMarginRight }),
94
+ react_1.default.createElement("select", { className: "ql-color", "aria-label": "Text Color" }),
95
+ react_1.default.createElement("select", { className: "ql-background", "aria-label": "Background Color", style: styleMarginRight }),
96
+ react_1.default.createElement("select", { className: "ql-align", "aria-label": "Text Alignment", style: styleMarginRight },
97
+ react_1.default.createElement("option", { selected: true }),
98
+ react_1.default.createElement("option", { value: "center" }),
99
+ react_1.default.createElement("option", { value: "right" })),
100
+ react_1.default.createElement("button", { className: "ql-list", value: "ordered", "aria-label": "Ordered List" }),
101
+ react_1.default.createElement("button", { className: "ql-list", value: "bullet", "aria-label": "Bullet List" }),
102
+ react_1.default.createElement("button", { className: "ql-indent", value: "-1", "aria-label": "Indent to the left" }),
103
+ react_1.default.createElement("button", { className: "ql-indent", value: "+1", "aria-label": "Indent to the right" })));
104
+ };
57
105
  // koli optimalizacii - typovany text si zapisuje do svojej stavovej premennej a onChange zavola az z onBlur
58
106
  // pri velkych formularoch je totiz volanie zmeny stavu this.setState({object: this.state.object, errorMap: this.state.errorMap}); pomale
59
107
  var XEditorBase = function (props) {
@@ -86,6 +134,6 @@ var XEditorBase = function (props) {
86
134
  }
87
135
  return htmlValue !== null ? htmlValue : undefined; // value v Editor nechce null, chce undefined
88
136
  };
89
- return (react_1.default.createElement(editor_1.Editor, __assign({ id: props.id, value: getValue(), onTextChange: onTextChange, onBlur: onBlur, readOnly: props.readOnly, style: props.style }, XUtils_1.XUtils.createTooltipOrErrorProps(props.error))));
137
+ return (react_1.default.createElement(editor_1.Editor, __assign({ id: props.id, value: getValue(), onTextChange: onTextChange, onBlur: onBlur, readOnly: props.readOnly, pt: { root: { style: props.style } } }, XUtils_1.XUtils.createTooltipOrErrorProps(props.error), { headerTemplate: headerTemplate() })));
90
138
  };
91
139
  exports.XEditorBase = XEditorBase;
@@ -408,11 +408,11 @@ var XFormDataTable2 = /** @class */ (function (_super) {
408
408
  }
409
409
  else if (columnProps.type === "searchButton") {
410
410
  var columnPropsSearchButton = columnProps;
411
- body = react_1.default.createElement(XSearchButtonDT_1.XSearchButtonDT, { form: this.props.form, entity: this.getEntity(), assocField: columnPropsSearchButton.assocField, displayField: columnPropsSearchButton.displayField, searchBrowse: columnPropsSearchButton.searchBrowse, rowData: rowData, readOnly: columnPropsSearchButton.readOnly });
411
+ body = react_1.default.createElement(XSearchButtonDT_1.XSearchButtonDT, { form: this.props.form, entity: this.getEntity(), assocField: columnPropsSearchButton.assocField, displayField: columnPropsSearchButton.displayField, searchBrowse: columnPropsSearchButton.searchBrowse, rowData: rowData, readOnly: readOnly });
412
412
  }
413
413
  else if (columnProps.type === "textarea") {
414
414
  var columnPropsTextarea = columnProps;
415
- body = react_1.default.createElement(XInputTextareaDT_1.XInputTextareaDT, { form: this.props.form, entity: this.getEntity(), field: columnPropsTextarea.field, rows: columnPropsTextarea.rows, autoResize: columnPropsTextarea.autoResize, rowData: rowData, readOnly: columnPropsTextarea.readOnly });
415
+ body = react_1.default.createElement(XInputTextareaDT_1.XInputTextareaDT, { form: this.props.form, entity: this.getEntity(), field: columnPropsTextarea.field, rows: columnPropsTextarea.rows, autoResize: columnPropsTextarea.autoResize, rowData: rowData, readOnly: readOnly });
416
416
  }
417
417
  else {
418
418
  throw "Unknown prop type = " + columnProps.type;
@@ -1,5 +1,5 @@
1
1
  import React, { ReactChild } from 'react';
2
- import { DataTableFilterMeta, DataTableFilterMetaData, DataTableOperatorFilterMetaData, DataTableSortMeta } from 'primereact/datatable';
2
+ import { DataTableFilterMeta, DataTableFilterMetaData, DataTableOperatorFilterMetaData, DataTableRowExpansionTemplate, DataTableSortMeta } from 'primereact/datatable';
3
3
  import { ColumnBodyOptions, ColumnFilterElementTemplateOptions } from 'primereact/column';
4
4
  import { XViewStatusOrBoolean } from "../XUtils";
5
5
  import { XSearchBrowseParams } from "../XSearchBrowseParams";
@@ -41,6 +41,8 @@ export interface XLazyDataTableProps {
41
41
  entity: string;
42
42
  label?: string;
43
43
  dataKey?: string;
44
+ rowExpansionTemplate?: (row: any, options: DataTableRowExpansionTemplate) => React.ReactNode;
45
+ showExpandedRow?: (row: any, multilineSwitchValue: XMultilineRenderType) => boolean;
44
46
  paginator: boolean;
45
47
  rows: number;
46
48
  filterDisplay: "menu" | "row";
@@ -68,6 +70,8 @@ export interface XLazyDataTableProps {
68
70
  multilineSwitch: boolean;
69
71
  multilineSwitchInitValue: XMultilineRenderType;
70
72
  multilineSwitchFewLinesCount: number;
73
+ multilineSwitchValue?: [XMultilineRenderType, React.Dispatch<React.SetStateAction<XMultilineRenderType>>];
74
+ headerElementRight?: React.ReactNode;
71
75
  searchBrowseParams?: XSearchBrowseParams;
72
76
  width?: string;
73
77
  rowClassName?: (data: any) => object | string | undefined;
@@ -135,7 +135,7 @@ var XFieldSetBase_1 = require("../XFieldSet/XFieldSetBase");
135
135
  var XAutoCompleteBase_1 = require("../XAutoCompleteBase");
136
136
  var XInputTextBase_1 = require("../XInputTextBase");
137
137
  var XLazyDataTable = function (props) {
138
- var _a;
138
+ var _a, _b;
139
139
  // must be here, is used in createInitFilters()
140
140
  var xEntity = XUtilsMetadataCommon_1.XUtilsMetadataCommon.getXEntity(props.entity);
141
141
  var createAggregateItems = function () {
@@ -263,11 +263,12 @@ var XLazyDataTable = function (props) {
263
263
  // ak mame fieldSet stlpce (stlpce ktore maju zadany fieldSetId a zobrazuju hodnoty podla fieldSet-u),
264
264
  // tak sem nacitame mapy umoznujuce ziskanie labelov zakliknutych field-ov
265
265
  // poznamka: uz by sa zislo mat vytvorene objekty (instancie) pre stlpce a do nich zapisovat pripadny XFieldSetMap, filter (teraz je vo "filters")
266
- var _b = __read((0, react_1.useState)({}), 2), xFieldSetMaps = _b[0], setXFieldSetMaps = _b[1];
267
- var _c = __read((0, react_1.useState)({ rowList: [], totalRecords: 0, aggregateValues: [] }), 2), value = _c[0], setValue = _c[1];
268
- var _d = __read((0, react_1.useState)(false), 2), loading = _d[0], setLoading = _d[1];
269
- var _e = __read((0, react_1.useState)(0), 2), first = _e[0], setFirst = _e[1];
270
- var _f = __read((0, react_1.useState)(props.paginator ? props.rows : undefined), 2), rows = _f[0], setRows = _f[1];
266
+ var _c = __read((0, react_1.useState)({}), 2), xFieldSetMaps = _c[0], setXFieldSetMaps = _c[1];
267
+ var _d = __read((0, react_1.useState)({ rowList: [], totalRecords: 0, aggregateValues: [] }), 2), value = _d[0], setValue = _d[1];
268
+ var _e = __read((0, react_1.useState)(undefined), 2), expandedRows = _e[0], setExpandedRows = _e[1];
269
+ var _f = __read((0, react_1.useState)(false), 2), loading = _f[0], setLoading = _f[1];
270
+ var _g = __read((0, react_1.useState)(0), 2), first = _g[0], setFirst = _g[1];
271
+ var _h = __read((0, react_1.useState)(props.paginator ? props.rows : undefined), 2), rows = _h[0], setRows = _h[1];
271
272
  var filtersInit = createInitFilters();
272
273
  if (props.filters) {
273
274
  filtersInit = __assign(__assign({}, filtersInit), props.filters); // items from props.filters will replace existing items in filtersInit
@@ -282,19 +283,19 @@ var XLazyDataTable = function (props) {
282
283
  customFilterItems = XUtilsCommon_1.XUtilsCommon.filterAnd(customFilterItems, XUtils_1.XUtils.evalFilter(props.searchBrowseParams.customFilter));
283
284
  }
284
285
  }
285
- var _g = __read((0, react_1.useState)(filtersInit), 2), filters = _g[0], setFilters = _g[1]; // filtrovanie na "controlled manner" (moze sa sem nainicializovat nejaka hodnota)
286
+ var _j = __read((0, react_1.useState)(filtersInit), 2), filters = _j[0], setFilters = _j[1]; // filtrovanie na "controlled manner" (moze sa sem nainicializovat nejaka hodnota)
286
287
  var initFtsInputValue = props.fullTextSearch ? createInitFtsInputValue() : undefined;
287
- var _h = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValue = _h[0], setFtsInputValue = _h[1];
288
- var _j = __read((0, react_1.useState)(undefined), 2), optionalCustomFilter = _j[0], setOptionalCustomFilter = _j[1];
289
- var _k = __read((0, react_1.useState)(props.multilineSwitchInitValue), 2), multilineSwitchValue = _k[0], setMultilineSwitchValue = _k[1];
290
- var _l = __read((0, react_1.useState)(XUtilsCommon_1.XUtilsCommon.createMultiSortMeta(props.sortField)), 2), multiSortMeta = _l[0], setMultiSortMeta = _l[1];
291
- var _m = __read((0, react_1.useState)(null), 2), selectedRow = _m[0], setSelectedRow = _m[1];
292
- var _o = __read((_a = props.dataLoadedState) !== null && _a !== void 0 ? _a : (0, react_1.useState)(false), 2), dataLoaded = _o[0], setDataLoaded = _o[1]; // priznak kde si zapiseme, ci uz sme nacitali data
293
- var _p = __read((0, react_1.useState)({ dialogOpened: false }), 2), exportRowsDialogState = _p[0], setExportRowsDialogState = _p[1];
288
+ var _k = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValue = _k[0], setFtsInputValue = _k[1];
289
+ var _l = __read((0, react_1.useState)(undefined), 2), optionalCustomFilter = _l[0], setOptionalCustomFilter = _l[1];
290
+ var _m = __read((_a = props.multilineSwitchValue) !== null && _a !== void 0 ? _a : (0, react_1.useState)(props.multilineSwitchInitValue), 2), multilineSwitchValue = _m[0], setMultilineSwitchValue = _m[1];
291
+ var _o = __read((0, react_1.useState)(XUtilsCommon_1.XUtilsCommon.createMultiSortMeta(props.sortField)), 2), multiSortMeta = _o[0], setMultiSortMeta = _o[1];
292
+ var _p = __read((0, react_1.useState)(null), 2), selectedRow = _p[0], setSelectedRow = _p[1];
293
+ var _q = __read((_b = props.dataLoadedState) !== null && _b !== void 0 ? _b : (0, react_1.useState)(false), 2), dataLoaded = _q[0], setDataLoaded = _q[1]; // priznak kde si zapiseme, ci uz sme nacitali data
294
+ var _r = __read((0, react_1.useState)({ dialogOpened: false }), 2), exportRowsDialogState = _r[0], setExportRowsDialogState = _r[1];
294
295
  //const [exportRowsDialogRowCount, setExportRowsDialogRowCount] = useState<number>(); // param pre dialog
295
- 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)
296
- var _r = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValueAfterFiltering = _r[0], setFtsInputValueAfterFiltering = _r[1]; // tak isto ako filtersAfterFiltering
297
- var _s = __read((0, react_1.useState)(undefined), 2), optionalCustomFilterAfterFiltering = _s[0], setOptionalCustomFilterAfterFiltering = _s[1]; // tak isto ako filtersAfterFiltering
296
+ var _s = __read((0, react_1.useState)(filtersInit), 2), filtersAfterFiltering = _s[0], setFiltersAfterFiltering = _s[1]; // sem si odkladame stav filtra po kliknuti na button Filter (chceme exportovat presne to co vidno vyfiltrovane)
297
+ var _t = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValueAfterFiltering = _t[0], setFtsInputValueAfterFiltering = _t[1]; // tak isto ako filtersAfterFiltering
298
+ var _u = __read((0, react_1.useState)(undefined), 2), optionalCustomFilterAfterFiltering = _u[0], setOptionalCustomFilterAfterFiltering = _u[1]; // tak isto ako filtersAfterFiltering
298
299
  // parameter [] zabezpeci ze sa metoda zavola len po prvom renderingu (a nie po kazdej zmene stavu (zavolani setNieco()))
299
300
  (0, react_1.useEffect)(function () {
300
301
  // jednoduchy sposob - nepouzivame parameter props.displayed a priznak dataLoaded
@@ -449,6 +450,7 @@ var XLazyDataTable = function (props) {
449
450
  case 1:
450
451
  findResult = _a.sent();
451
452
  setValue(findResult);
453
+ setupExpandedRows(findResult, multilineSwitchValue);
452
454
  setLoading(false);
453
455
  // odlozime si filter hodnoty pre pripadny export - deep cloning vyzera ze netreba
454
456
  setFiltersAfterFiltering(filters);
@@ -458,6 +460,34 @@ var XLazyDataTable = function (props) {
458
460
  }
459
461
  });
460
462
  }); };
463
+ var setupExpandedRows = function (findResult, multilineSwitchValue) {
464
+ var e_4, _a;
465
+ if (props.rowExpansionTemplate) {
466
+ var expandedRowsLocal = {};
467
+ if (findResult.rowList) {
468
+ try {
469
+ for (var _b = __values(findResult.rowList), _c = _b.next(); !_c.done; _c = _b.next()) {
470
+ var row = _c.value;
471
+ var showExpandedRow = true; // default
472
+ if (props.showExpandedRow) {
473
+ showExpandedRow = props.showExpandedRow(row, multilineSwitchValue);
474
+ }
475
+ if (showExpandedRow) {
476
+ expandedRowsLocal["".concat(row[dataKey])] = true;
477
+ }
478
+ }
479
+ }
480
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
481
+ finally {
482
+ try {
483
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
484
+ }
485
+ finally { if (e_4) throw e_4.error; }
486
+ }
487
+ }
488
+ setExpandedRows(expandedRowsLocal);
489
+ }
490
+ };
461
491
  var findByFilter = function (findParam) { return __awaiter(void 0, void 0, void 0, function () {
462
492
  var findResult;
463
493
  return __generator(this, function (_a) {
@@ -488,7 +518,7 @@ var XLazyDataTable = function (props) {
488
518
  var getFields = function (addPropsFields) {
489
519
  // krasne zobrazi cely objekt!
490
520
  //console.log(dataTableEl.current);
491
- var e_4, _a;
521
+ var e_5, _a;
492
522
  var fields = [];
493
523
  var columns = dataTableEl.current.props.children;
494
524
  try {
@@ -497,12 +527,12 @@ var XLazyDataTable = function (props) {
497
527
  fields.push(column.props.field);
498
528
  }
499
529
  }
500
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
530
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
501
531
  finally {
502
532
  try {
503
533
  if (columns_3_1 && !columns_3_1.done && (_a = columns_3.return)) _a.call(columns_3);
504
534
  }
505
- finally { if (e_4) throw e_4.error; }
535
+ finally { if (e_5) throw e_5.error; }
506
536
  }
507
537
  if (addPropsFields) {
508
538
  if (props.fields) {
@@ -514,7 +544,7 @@ var XLazyDataTable = function (props) {
514
544
  var getHeaders = function () {
515
545
  // krasne zobrazi cely objekt!
516
546
  //console.log(dataTableEl.current);
517
- var e_5, _a;
547
+ var e_6, _a;
518
548
  var headers = [];
519
549
  var columns = dataTableEl.current.props.children;
520
550
  try {
@@ -524,17 +554,17 @@ var XLazyDataTable = function (props) {
524
554
  headers.push(column.props.header);
525
555
  }
526
556
  }
527
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
557
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
528
558
  finally {
529
559
  try {
530
560
  if (columns_4_1 && !columns_4_1.done && (_a = columns_4.return)) _a.call(columns_4);
531
561
  }
532
- finally { if (e_5) throw e_5.error; }
562
+ finally { if (e_6) throw e_6.error; }
533
563
  }
534
564
  return headers;
535
565
  };
536
566
  var getWidths = function () {
537
- var e_6, _a;
567
+ var e_7, _a;
538
568
  var _b;
539
569
  // vrati sirky stlpcov napr. ['7.75rem', '20rem', '8.5rem', '8.5rem', '6rem']
540
570
  // nevracia aktualne sirky stlpcov (po manualnom rozsireni) ale tie ktore boli nastavene/vypocitane v kode
@@ -546,17 +576,17 @@ var XLazyDataTable = function (props) {
546
576
  widths.push((_b = column.props.headerStyle) === null || _b === void 0 ? void 0 : _b.width);
547
577
  }
548
578
  }
549
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
579
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
550
580
  finally {
551
581
  try {
552
582
  if (columns_5_1 && !columns_5_1.done && (_a = columns_5.return)) _a.call(columns_5);
553
583
  }
554
- finally { if (e_6) throw e_6.error; }
584
+ finally { if (e_7) throw e_7.error; }
555
585
  }
556
586
  return widths;
557
587
  };
558
588
  var getFieldSetIds = function () {
559
- var e_7, _a;
589
+ var e_8, _a;
560
590
  var fieldSetIds = [];
561
591
  // warning note: props.children are used to get props of XLazyColumn whereas dataTableEl.current.props.children are used to get props of Primereact DataTable
562
592
  var columns = props.children;
@@ -568,12 +598,12 @@ var XLazyDataTable = function (props) {
568
598
  }
569
599
  }
570
600
  }
571
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
601
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
572
602
  finally {
573
603
  try {
574
604
  if (columns_6_1 && !columns_6_1.done && (_a = columns_6.return)) _a.call(columns_6);
575
605
  }
576
- finally { if (e_7) throw e_7.error; }
606
+ finally { if (e_8) throw e_8.error; }
577
607
  }
578
608
  return fieldSetIds;
579
609
  };
@@ -589,11 +619,14 @@ var XLazyDataTable = function (props) {
589
619
  var onRowDoubleClick = function (event) {
590
620
  //console.log("zavolany onRowDoubleClick");
591
621
  //console.log(event.data);
622
+ onRowDoubleClickBase(event.data);
623
+ };
624
+ var onRowDoubleClickBase = function (row) {
592
625
  if (props.onEdit !== undefined && props.searchBrowseParams === undefined) {
593
- props.onEdit(event.data);
626
+ props.onEdit(row);
594
627
  }
595
628
  else if (props.searchBrowseParams !== undefined) {
596
- props.searchBrowseParams.onChoose(event.data);
629
+ props.searchBrowseParams.onChoose(row);
597
630
  }
598
631
  };
599
632
  var onClickAddRow = function () {
@@ -614,7 +647,7 @@ var XLazyDataTable = function (props) {
614
647
  }
615
648
  };
616
649
  var onClickRemoveRow = function () { return __awaiter(void 0, void 0, void 0, function () {
617
- var reread, e_8, e_9;
650
+ var reread, e_9, e_10;
618
651
  return __generator(this, function (_a) {
619
652
  switch (_a.label) {
620
653
  case 0:
@@ -629,8 +662,8 @@ var XLazyDataTable = function (props) {
629
662
  reread = _a.sent();
630
663
  return [3 /*break*/, 4];
631
664
  case 3:
632
- e_8 = _a.sent();
633
- XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_8);
665
+ e_9 = _a.sent();
666
+ XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_9);
634
667
  return [3 /*break*/, 4];
635
668
  case 4:
636
669
  if (reread) {
@@ -652,8 +685,8 @@ var XLazyDataTable = function (props) {
652
685
  _a.sent();
653
686
  return [3 /*break*/, 9];
654
687
  case 8:
655
- e_9 = _a.sent();
656
- XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_9);
688
+ e_10 = _a.sent();
689
+ XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_10);
657
690
  return [3 /*break*/, 9];
658
691
  case 9:
659
692
  loadData();
@@ -861,7 +894,7 @@ var XLazyDataTable = function (props) {
861
894
  else if (xField.type === "jsonb" && fieldSetId) {
862
895
  // zatial sem dame; este by sme mohli dat hlbsie do convertValue/convertValueBase (aby fungovalo aj pre excel) ale tam je problem ze nemame k dispozicii "xFieldSetMaps"
863
896
  // poznamka: krajsie by bolo brat fieldSetId z xField ale to by sme museli vytvorit decorator na backend-e...
864
- valueResult = XFieldSetBase_1.XFieldSetBase.xFieldSetValuesAsUI(value, xFieldSetMaps[fieldSetId]);
897
+ valueResult = react_1.default.createElement("div", { className: multilineSwitchValue === "fewLines" || multilineSwitchValue === "allLines" ? "x-multiline-content" : undefined }, XFieldSetBase_1.XFieldSetBase.xFieldSetValuesAsUI(value, xFieldSetMaps[fieldSetId]));
865
898
  }
866
899
  else {
867
900
  if (contentType === "html") {
@@ -895,6 +928,10 @@ var XLazyDataTable = function (props) {
895
928
  }
896
929
  return bodyValue;
897
930
  };
931
+ // in order that row expansion works like standard row, we wrap row expansion into div
932
+ var rowExpansionTemplate = function (row, options) {
933
+ return (react_1.default.createElement("div", { onClick: function () { return setSelectedRow(row); }, onDoubleClick: function () { return onRowDoubleClickBase(row); } }, props.rowExpansionTemplate(row, options)));
934
+ };
898
935
  // ak mame scrollWidth/scrollHeight = viewport (default), vyratame scrollWidth/scrollHeight tak aby tabulka "sadla" do okna (viewport-u)
899
936
  var isMobile = XUtils_1.XUtils.isMobile();
900
937
  var scrollWidth = undefined; // vypnute horizontalne scrollovanie
@@ -1221,10 +1258,11 @@ var XLazyDataTable = function (props) {
1221
1258
  props.showFilterButtons ? react_1.default.createElement(XButton_1.XButton, { key: "filter", icon: isMobile ? "pi pi-search" : undefined, label: !isMobile ? (0, XLocale_1.xLocaleOption)('filter') : undefined, onClick: onClickFilter }) : null,
1222
1259
  props.showFilterButtons ? react_1.default.createElement(XButton_1.XButton, { key: "clearFilter", icon: isMobile ? "pi pi-ban" : undefined, label: !isMobile ? (0, XLocale_1.xLocaleOption)('clearFilter') : undefined, onClick: onClickClearFilter }) : null,
1223
1260
  props.optionalCustomFilters ? react_1.default.createElement(XOcfDropdown_1.XOcfDropdown, { optionalCustomFilters: props.optionalCustomFilters, value: optionalCustomFilter, onChange: function (value) { return setOptionalCustomFilter(value); }, className: "m-1" }) : null,
1224
- props.multilineSwitch ? react_1.default.createElement(XMultilineSwitch_1.XMultilineSwitch, { value: multilineSwitchValue, onChange: function (value) { return setMultilineSwitchValue(value); }, className: "m-1" }) : null,
1261
+ props.multilineSwitch ? react_1.default.createElement(XMultilineSwitch_1.XMultilineSwitch, { value: multilineSwitchValue, onChange: function (switchValue) { setMultilineSwitchValue(switchValue); setupExpandedRows(value, switchValue); }, className: "m-1" }) : null,
1262
+ props.headerElementRight,
1225
1263
  props.label && !isMobile ? react_1.default.createElement("div", { className: "x-lazy-datatable-label-right-compensation" }) : null),
1226
1264
  react_1.default.createElement("div", { className: "flex justify-content-center" },
1227
- react_1.default.createElement(datatable_1.DataTable, { value: value.rowList, dataKey: dataKey, paginator: props.paginator, pageLinkSize: pageLinkSize, 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)),
1265
+ react_1.default.createElement(datatable_1.DataTable, { value: value.rowList, dataKey: dataKey, expandedRows: expandedRows, rowExpansionTemplate: props.rowExpansionTemplate ? rowExpansionTemplate : undefined, paginator: props.paginator, pageLinkSize: pageLinkSize, 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)),
1228
1266
  react_1.default.createElement("div", { className: "flex justify-content-center" },
1229
1267
  props.onAddRow !== undefined && props.searchBrowseParams === undefined ? react_1.default.createElement(XButton_1.XButton, { key: "addRow", icon: "pi pi-plus", label: (0, XLocale_1.xLocaleOption)('addRow'), onClick: onClickAddRow }) : null,
1230
1268
  props.onEdit !== undefined && props.searchBrowseParams === undefined ? react_1.default.createElement(XButton_1.XButton, { key: "editRow", icon: "pi pi-pencil", label: (0, XLocale_1.xLocaleOption)('editRow'), onClick: onClickEdit }) : null,
@@ -55,6 +55,8 @@ export declare class XUtils {
55
55
  static toPX(size: string | undefined): number | undefined;
56
56
  static toPX0(size: string | undefined): number;
57
57
  static getRemSize(): number;
58
+ static getViewWidth(): number;
59
+ static getViewHeight(): number;
58
60
  static processGridBreakpoints(breakpointExp: string): string | undefined;
59
61
  static processPropWidth(widthProp: string | undefined): string | undefined;
60
62
  static addCssPropIfNotExists(cssProps: React.CSSProperties, newCssProps: React.CSSProperties): void;
@@ -135,6 +135,14 @@ var XUtils = /** @class */ (function () {
135
135
  }
136
136
  return XUtils.remSize;
137
137
  };
138
+ // alternative to 100vw, if 100vw can not be used because of technical reasons
139
+ XUtils.getViewWidth = function () {
140
+ return Math.max(document.body.scrollWidth, document.documentElement.scrollWidth, document.body.offsetWidth, document.documentElement.offsetWidth, document.documentElement.clientWidth);
141
+ };
142
+ // alternative to 100vh, if 100vh can not be used because of technical reasons
143
+ XUtils.getViewHeight = function () {
144
+ return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.offsetHeight, document.documentElement.clientHeight);
145
+ };
138
146
  // param example: "3rem md:4rem xl:6rem"
139
147
  // (in general: "<exp1> sm:<exp2> md:<exp3> lg:<exp4> xl:<exp5>")
140
148
  // according to device width returns "exp(n)"
@@ -485,6 +485,11 @@ var XUtilsCommon = /** @class */ (function () {
485
485
  }
486
486
  else if (date1 !== null && date2 !== null) {
487
487
  result = (date1.getTime() === date2.getTime());
488
+ // mali sme problem - funkcia dateFromModel() konvertovala string "2025-02-04" na Tue Feb 04 2025 01:00:00 GMT+0100 (Central European Standard Time)
489
+ // a XCalendar pri vykliknuti datumu vracal Tue Feb 04 2025 00:00:00 GMT+0100 (Central European Standard Time) -> opravili sme XCalendar
490
+ //result = date1.getFullYear() === date2.getFullYear()
491
+ // && date1.getMonth() === date2.getMonth()
492
+ // && date1.getDate() === date2.getDate();
488
493
  }
489
494
  return result;
490
495
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michalrakus/x-react-web-lib",
3
- "version": "1.32.4",
3
+ "version": "1.32.6",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "clean": "rimraf lib",
@@ -30,8 +30,8 @@
30
30
  "@types/jest": "^29.5.0",
31
31
  "@types/lodash": "^4.14.202",
32
32
  "@types/node": "^18.15.3",
33
- "@types/react": "^18.0.28",
34
- "@types/react-dom": "^18.0.11",
33
+ "@types/react": "^18.3.1",
34
+ "@types/react-dom": "^18.3.1",
35
35
  "@types/react-transition-group": "^4.4.5",
36
36
  "gulp": "^4.0.2",
37
37
  "rimraf": "^4.4.0",
@@ -40,10 +40,10 @@
40
40
  "peerDependencies": {
41
41
  "primeflex": "^3.3.1",
42
42
  "primeicons": "^7.0.0",
43
- "primereact": "~10.8.2",
44
- "quill": "^2.0.2",
45
- "react": "^18.2.0",
46
- "react-dom": "^18.2.0",
43
+ "primereact": "10.9.2",
44
+ "quill": "^2.0.3",
45
+ "react": "^18.3.1",
46
+ "react-dom": "^18.3.1",
47
47
  "react-transition-group": "^4.4.5"
48
48
  },
49
49
  "files": [