@michalrakus/x-react-web-lib 1.32.3 → 1.32.5
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.
- package/lib/components/XButton.d.ts +1 -0
- package/lib/components/XButton.js +1 -1
- package/lib/components/XCalendar.js +7 -1
- package/lib/components/XFormBase.d.ts +3 -0
- package/lib/components/XFormBase.js +8 -0
- package/lib/components/XFormDataTable2.js +8 -3
- package/lib/components/XInputTextarea.d.ts +1 -1
- package/lib/components/XInputTextarea.js +11 -6
- package/lib/components/XLazyDataTable/XLazyDataTable.d.ts +6 -1
- package/lib/components/XLazyDataTable/XLazyDataTable.js +80 -41
- package/lib/components/XUtils.d.ts +2 -0
- package/lib/components/XUtils.js +8 -0
- package/lib/serverApi/XUtilsCommon.js +5 -0
- package/package.json +1 -1
|
@@ -8,6 +8,6 @@ var react_1 = __importDefault(require("react"));
|
|
|
8
8
|
var button_1 = require("primereact/button");
|
|
9
9
|
var XButton = function (props) {
|
|
10
10
|
// zatial iba pridany class x-button, aby sme vedeli nastavit margin "m-1" (0.25rem)
|
|
11
|
-
return (react_1.default.createElement(button_1.Button, { label: props.label, icon: props.icon, onClick: props.onClick, disabled: props.disabled, className: "m-1" }));
|
|
11
|
+
return (react_1.default.createElement(button_1.Button, { label: props.label, icon: props.icon, onClick: props.onClick, disabled: props.disabled, className: "m-1", style: props.style }));
|
|
12
12
|
};
|
|
13
13
|
exports.XButton = XButton;
|
|
@@ -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);
|
|
@@ -31,6 +31,7 @@ export declare abstract class XFormBase extends Component<XFormProps> {
|
|
|
31
31
|
assoc: string;
|
|
32
32
|
sortField: string;
|
|
33
33
|
}>;
|
|
34
|
+
tabViewUsed: boolean;
|
|
34
35
|
constructor(props: XFormProps);
|
|
35
36
|
componentDidMount(): Promise<void>;
|
|
36
37
|
getEntity(): string;
|
|
@@ -38,6 +39,8 @@ export declare abstract class XFormBase extends Component<XFormProps> {
|
|
|
38
39
|
getObject(): any;
|
|
39
40
|
isAddRow(): boolean;
|
|
40
41
|
isInDialog(): boolean;
|
|
42
|
+
isTabViewUsed(): boolean;
|
|
43
|
+
setTabViewUsed(tabViewUsed: boolean): void;
|
|
41
44
|
onFieldChange(field: string, value: any, error?: string | undefined, onChange?: XFieldOnChange, assocObjectChange?: OperationType): void;
|
|
42
45
|
onTableFieldChange(rowData: any, field: string, value: any, error?: string | undefined, onChange?: XTableFieldOnChange, assocObjectChange?: OperationType): void;
|
|
43
46
|
/**
|
|
@@ -141,6 +141,7 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
141
141
|
_this.xFormDataTableList = [];
|
|
142
142
|
_this.assocToValidateList = [];
|
|
143
143
|
_this.assocToSortList = [];
|
|
144
|
+
_this.tabViewUsed = false; // default
|
|
144
145
|
_this.onClickSave = _this.onClickSave.bind(_this);
|
|
145
146
|
_this.onClickCancel = _this.onClickCancel.bind(_this);
|
|
146
147
|
return _this;
|
|
@@ -236,6 +237,13 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
236
237
|
XFormBase.prototype.isInDialog = function () {
|
|
237
238
|
return this.props.onSaveOrCancel !== undefined;
|
|
238
239
|
};
|
|
240
|
+
// helper method
|
|
241
|
+
XFormBase.prototype.isTabViewUsed = function () {
|
|
242
|
+
return this.tabViewUsed;
|
|
243
|
+
};
|
|
244
|
+
XFormBase.prototype.setTabViewUsed = function (tabViewUsed) {
|
|
245
|
+
this.tabViewUsed = tabViewUsed;
|
|
246
|
+
};
|
|
239
247
|
XFormBase.prototype.onFieldChange = function (field, value, error, onChange, assocObjectChange) {
|
|
240
248
|
// field moze byt aj na asociovanom objekte (field length > 1, napr.: <assocX>.<fieldY>)
|
|
241
249
|
// v takom pripade sa do errorMap zapise ako key cely field <assocX>.<fieldY>
|
|
@@ -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:
|
|
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:
|
|
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;
|
|
@@ -559,7 +559,12 @@ var XFormDataTable2 = /** @class */ (function (_super) {
|
|
|
559
559
|
if (this.props.scrollWidth !== "none") {
|
|
560
560
|
scrollWidth = this.props.scrollWidth;
|
|
561
561
|
if (scrollWidth === "viewport") {
|
|
562
|
-
|
|
562
|
+
var marginsWidth = XUtils_1.XUtils.isMobile() ? 1.2 : 2.2; // desktop - povodne bolo 1.4rem (20px okraje) namiesto 2.2 ale pri vela stlpcoch vznikal horizontalny scrollbar
|
|
563
|
+
// mobil - padding 0.5rem body element, ale este bola tabulka moc siroka, tak sme dali 1.2
|
|
564
|
+
if (this.props.form.isTabViewUsed()) {
|
|
565
|
+
marginsWidth += 1; // TabPanel has padding 0.5rem (in css file) -> 1rem both margins
|
|
566
|
+
}
|
|
567
|
+
scrollWidth = "calc(100vw - ".concat(marginsWidth, "rem)");
|
|
563
568
|
}
|
|
564
569
|
}
|
|
565
570
|
if (this.props.scrollHeight !== "none") {
|
|
@@ -10,9 +10,9 @@ export interface XInputTextareaProps extends XInputProps<string> {
|
|
|
10
10
|
export declare class XInputTextarea extends XInput<string, XInputTextareaProps> {
|
|
11
11
|
static defaultProps: {
|
|
12
12
|
cols: string;
|
|
13
|
-
labelOnTop: boolean;
|
|
14
13
|
};
|
|
15
14
|
xInputTextareaBaseRef: any;
|
|
15
|
+
labelOnTop: boolean;
|
|
16
16
|
constructor(props: XInputTextareaProps);
|
|
17
17
|
getValue(): string | null;
|
|
18
18
|
onValueChange(value: string | null): void;
|
|
@@ -29,6 +29,12 @@ var XInputTextarea = /** @class */ (function (_super) {
|
|
|
29
29
|
function XInputTextarea(props) {
|
|
30
30
|
var _this = _super.call(this, props) || this;
|
|
31
31
|
_this.xInputTextareaBaseRef = react_1.default.createRef();
|
|
32
|
+
if (props.labelOnTop !== undefined) {
|
|
33
|
+
_this.labelOnTop = props.labelOnTop;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
_this.labelOnTop = XUtils_1.XUtils.isMobile();
|
|
37
|
+
}
|
|
32
38
|
_this.onValueChange = _this.onValueChange.bind(_this);
|
|
33
39
|
return _this;
|
|
34
40
|
}
|
|
@@ -40,7 +46,7 @@ var XInputTextarea = /** @class */ (function (_super) {
|
|
|
40
46
|
};
|
|
41
47
|
XInputTextarea.prototype.getLabelStyle = function () {
|
|
42
48
|
var _a;
|
|
43
|
-
return this.
|
|
49
|
+
return this.labelOnTop ? ((_a = this.props.labelStyle) !== null && _a !== void 0 ? _a : {}) : _super.prototype.getLabelStyle.call(this);
|
|
44
50
|
};
|
|
45
51
|
// api method - can be called through "ref" from parent if needed to adjust the height of the input textarea according to the (changed) content
|
|
46
52
|
XInputTextarea.prototype.autoResize = function () {
|
|
@@ -59,7 +65,7 @@ var XInputTextarea = /** @class */ (function (_super) {
|
|
|
59
65
|
// pridame width:100%
|
|
60
66
|
//fieldStyle = {width: '100%'};
|
|
61
67
|
var widthValue = void 0;
|
|
62
|
-
if (this.
|
|
68
|
+
if (this.labelOnTop) {
|
|
63
69
|
widthValue = '100%';
|
|
64
70
|
}
|
|
65
71
|
else {
|
|
@@ -89,16 +95,15 @@ var XInputTextarea = /** @class */ (function (_super) {
|
|
|
89
95
|
labelElemId = "".concat(this.props.field, "_label_id");
|
|
90
96
|
}
|
|
91
97
|
// InputTextarea renderujeme az ked mame nacitany object, lebo inac pri autoResize sa nam nenastavi spravna velkost (hodnota nie je k dispozicii pri prvom renderingu)
|
|
92
|
-
return (react_1.default.createElement("div", { className: !this.
|
|
93
|
-
react_1.default.createElement("label", { id: labelElemId, htmlFor: this.props.field, className: !this.
|
|
98
|
+
return (react_1.default.createElement("div", { className: !this.labelOnTop ? 'field grid' : 'field grid x-inputtextarea-label-on-top', style: fieldStyle },
|
|
99
|
+
react_1.default.createElement("label", { id: labelElemId, htmlFor: this.props.field, className: !this.labelOnTop ? 'col-fixed' : undefined, style: labelStyle }, this.getLabel()),
|
|
94
100
|
labelTooltip ? react_1.default.createElement(tooltip_1.Tooltip, { target: "#".concat(labelElemId), content: labelTooltip }) : null,
|
|
95
101
|
this.props.form.state.object ?
|
|
96
102
|
react_1.default.createElement(XInputTextareaBase_1.XInputTextareaBase, { ref: this.xInputTextareaBaseRef, id: this.props.field, value: value, onChange: this.onValueChange, readOnly: this.isReadOnly(), maxLength: this.xField.length, style: inputStyle, rows: this.props.rows, cols: cols, autoResize: this.props.autoResize, error: this.getError(), tooltip: this.props.tooltip, placeholder: (_b = this.props.placeholder) !== null && _b !== void 0 ? _b : this.props.desc })
|
|
97
103
|
: null));
|
|
98
104
|
};
|
|
99
105
|
XInputTextarea.defaultProps = {
|
|
100
|
-
cols: "full"
|
|
101
|
-
labelOnTop: false
|
|
106
|
+
cols: "full"
|
|
102
107
|
};
|
|
103
108
|
return XInputTextarea;
|
|
104
109
|
}(XInput_1.XInput));
|
|
@@ -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";
|
|
@@ -14,6 +14,7 @@ export interface XAppButtonForRow {
|
|
|
14
14
|
icon?: IconType<ButtonProps>;
|
|
15
15
|
label: string;
|
|
16
16
|
onClick: (selectedRow: any) => void;
|
|
17
|
+
style?: React.CSSProperties;
|
|
17
18
|
}
|
|
18
19
|
export interface XOptionalCustomFilter {
|
|
19
20
|
label: string;
|
|
@@ -40,6 +41,8 @@ export interface XLazyDataTableProps {
|
|
|
40
41
|
entity: string;
|
|
41
42
|
label?: string;
|
|
42
43
|
dataKey?: string;
|
|
44
|
+
rowExpansionTemplate?: (row: any, options: DataTableRowExpansionTemplate) => React.ReactNode;
|
|
45
|
+
showExpandedRow?: (row: any, multilineSwitchValue: XMultilineRenderType) => boolean;
|
|
43
46
|
paginator: boolean;
|
|
44
47
|
rows: number;
|
|
45
48
|
filterDisplay: "menu" | "row";
|
|
@@ -67,6 +70,8 @@ export interface XLazyDataTableProps {
|
|
|
67
70
|
multilineSwitch: boolean;
|
|
68
71
|
multilineSwitchInitValue: XMultilineRenderType;
|
|
69
72
|
multilineSwitchFewLinesCount: number;
|
|
73
|
+
multilineSwitchValue?: [XMultilineRenderType, React.Dispatch<React.SetStateAction<XMultilineRenderType>>];
|
|
74
|
+
headerElementRight?: React.ReactNode;
|
|
70
75
|
searchBrowseParams?: XSearchBrowseParams;
|
|
71
76
|
width?: string;
|
|
72
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
|
|
267
|
-
var
|
|
268
|
-
var
|
|
269
|
-
var
|
|
270
|
-
var
|
|
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
|
|
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
|
|
288
|
-
var
|
|
289
|
-
var
|
|
290
|
-
var
|
|
291
|
-
var
|
|
292
|
-
var
|
|
293
|
-
var
|
|
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
|
|
296
|
-
var
|
|
297
|
-
var
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
|
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 (
|
|
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 (
|
|
562
|
+
finally { if (e_6) throw e_6.error; }
|
|
533
563
|
}
|
|
534
564
|
return headers;
|
|
535
565
|
};
|
|
536
566
|
var getWidths = function () {
|
|
537
|
-
var
|
|
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 (
|
|
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 (
|
|
584
|
+
finally { if (e_7) throw e_7.error; }
|
|
555
585
|
}
|
|
556
586
|
return widths;
|
|
557
587
|
};
|
|
558
588
|
var getFieldSetIds = function () {
|
|
559
|
-
var
|
|
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 (
|
|
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 (
|
|
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(
|
|
626
|
+
props.onEdit(row);
|
|
594
627
|
}
|
|
595
628
|
else if (props.searchBrowseParams !== undefined) {
|
|
596
|
-
props.searchBrowseParams.onChoose(
|
|
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,
|
|
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
|
-
|
|
633
|
-
XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'),
|
|
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
|
-
|
|
656
|
-
XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'),
|
|
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
|
|
@@ -903,7 +940,8 @@ var XLazyDataTable = function (props) {
|
|
|
903
940
|
if (props.scrollWidth !== "none") {
|
|
904
941
|
scrollWidth = props.scrollWidth;
|
|
905
942
|
if (scrollWidth === "viewport") {
|
|
906
|
-
scrollWidth = "calc(100vw - ".concat(isMobile ? 1
|
|
943
|
+
scrollWidth = "calc(100vw - ".concat(isMobile ? 1 : 2.2, "rem)"); // desktop - povodne bolo 1.4rem (20px okraje) namiesto 2.2 ale pri vela stlpcoch vznikal horizontalny scrollbar
|
|
944
|
+
// mobil - padding 0.5rem body element
|
|
907
945
|
}
|
|
908
946
|
}
|
|
909
947
|
if (props.scrollHeight !== "none") {
|
|
@@ -1220,16 +1258,17 @@ var XLazyDataTable = function (props) {
|
|
|
1220
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,
|
|
1221
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,
|
|
1222
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,
|
|
1223
|
-
props.multilineSwitch ? react_1.default.createElement(XMultilineSwitch_1.XMultilineSwitch, { value: multilineSwitchValue, onChange: function (
|
|
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,
|
|
1224
1263
|
props.label && !isMobile ? react_1.default.createElement("div", { className: "x-lazy-datatable-label-right-compensation" }) : null),
|
|
1225
1264
|
react_1.default.createElement("div", { className: "flex justify-content-center" },
|
|
1226
|
-
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)),
|
|
1227
1266
|
react_1.default.createElement("div", { className: "flex justify-content-center" },
|
|
1228
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,
|
|
1229
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,
|
|
1230
1269
|
props.removeRow !== undefined && props.removeRow !== false && props.searchBrowseParams === undefined ? react_1.default.createElement(XButton_1.XButton, { key: "removeRow", icon: "pi pi-times", label: (0, XLocale_1.xLocaleOption)('removeRow'), onClick: onClickRemoveRow }) : null,
|
|
1231
1270
|
exportRows ? react_1.default.createElement(XButton_1.XButton, { key: "exportRows", icon: "pi pi-file-export", label: (0, XLocale_1.xLocaleOption)('exportRows'), onClick: onClickExport }) : null,
|
|
1232
|
-
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,
|
|
1271
|
+
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); }, style: xAppButton.style }); }) : null,
|
|
1233
1272
|
props.appButtons,
|
|
1234
1273
|
props.searchBrowseParams !== undefined ? react_1.default.createElement(XButton_1.XButton, { key: "choose", label: (0, XLocale_1.xLocaleOption)('chooseRow'), onClick: onClickChoose }) : null,
|
|
1235
1274
|
exportRows ? react_1.default.createElement(XExportRowsDialog_1.XExportRowsDialog, { key: "exportRowsDialog", dialogState: exportRowsDialogState, hideDialog: function () { return setExportRowsDialogState({ dialogOpened: false }); } }) : 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;
|
package/lib/components/XUtils.js
CHANGED
|
@@ -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
|
};
|