@michalrakus/x-react-web-lib 1.3.0 → 1.4.1
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/XCalendar.d.ts +3 -0
- package/XCalendar.js +5 -0
- package/XDropdownForEntity.d.ts +3 -0
- package/XDropdownForEntity.js +5 -0
- package/XInputDecimalBase.d.ts +3 -0
- package/XInputDecimalBase.js +5 -0
- package/gulpfile.js +4 -1
- package/lib/components/XAutoCompleteBase.js +4 -0
- package/lib/components/XCalendar.d.ts +8 -0
- package/lib/components/XCalendar.js +27 -0
- package/lib/components/XDropdown.d.ts +2 -7
- package/lib/components/XDropdown.js +8 -90
- package/lib/components/XDropdownDTFilter.js +8 -7
- package/lib/components/XDropdownForEntity.d.ts +24 -0
- package/lib/components/XDropdownForEntity.js +148 -0
- package/lib/components/XFieldSelector.js +4 -3
- package/lib/components/XFormComponent.d.ts +3 -0
- package/lib/components/XFormComponent.js +3 -1
- package/lib/components/XFormDataTable2.js +1 -1
- package/lib/components/XInputDate.d.ts +12 -8
- package/lib/components/XInputDate.js +49 -44
- package/lib/components/XInputDecimalBase.d.ts +12 -0
- package/lib/components/XInputDecimalBase.js +18 -0
- package/lib/components/XLazyDataTable.d.ts +10 -1
- package/lib/components/XLazyDataTable.js +135 -51
- package/lib/components/XUtilsMetadata.d.ts +6 -2
- package/lib/components/XUtilsMetadata.js +79 -18
- package/lib/serverApi/XEntityMetadata.d.ts +3 -2
- package/lib/serverApi/XUtilsCommon.d.ts +1 -0
- package/lib/serverApi/XUtilsCommon.js +9 -0
- package/package.json +1 -1
|
@@ -1,58 +1,63 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
if (typeof b !== "function" && b !== null)
|
|
11
|
+
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
+
extendStatics(d, b);
|
|
13
|
+
function __() { this.constructor = d; }
|
|
14
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
+
};
|
|
16
|
+
})();
|
|
2
17
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
18
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
19
|
};
|
|
5
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
21
|
exports.XInputDate = void 0;
|
|
7
22
|
var react_1 = __importDefault(require("react"));
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
var showTime = (xField.type === 'datetime');
|
|
18
|
-
var cssClassName = showTime ? 'x-input-datetime' : 'x-input-date';
|
|
19
|
-
var label = (_a = props.label) !== null && _a !== void 0 ? _a : props.field;
|
|
20
|
-
var readOnly = XUtils_1.XUtils.isReadOnly(props.field, props.readOnly) || props.form.formReadOnlyBase(props.field);
|
|
21
|
-
if (!xField.isNullable && !readOnly) {
|
|
22
|
-
label = XUtils_1.XUtils.markNotNull(label);
|
|
23
|
+
var XCalendar_1 = require("./XCalendar");
|
|
24
|
+
var XInput_1 = require("./XInput");
|
|
25
|
+
var XInputDate = /** @class */ (function (_super) {
|
|
26
|
+
__extends(XInputDate, _super);
|
|
27
|
+
function XInputDate(props) {
|
|
28
|
+
var _this = _super.call(this, props) || this;
|
|
29
|
+
_this.onValueChange = _this.onValueChange.bind(_this);
|
|
30
|
+
_this.onBlur = _this.onBlur.bind(_this);
|
|
31
|
+
return _this;
|
|
23
32
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
// alebo je este datum nekompletny (uzivatel prave zadava datum)
|
|
28
|
-
//console.log(typeof e.value);
|
|
29
|
-
//console.log(e.value instanceof Date);
|
|
30
|
-
props.form.onFieldChange(props.field, e.value);
|
|
31
|
-
};
|
|
32
|
-
var fieldValue = undefined;
|
|
33
|
-
var object = props.form.state.object;
|
|
34
|
-
if (object !== null) {
|
|
35
|
-
var objectValue = XUtilsCommon_1.XUtilsCommon.getValueByPath(object, props.field);
|
|
36
|
-
// pre istotu dame na null, null je standard
|
|
37
|
-
//if (objectValue === undefined) {
|
|
38
|
-
// objectValue = null;
|
|
39
|
-
//}
|
|
40
|
-
// TODO - konvertovat null hodnotu na "" (vo funkcii stringAsUI) je dolezite aby sa prejavila zmena na null v modeli
|
|
41
|
-
// - otestovat ci zmena na null funguje dobre -
|
|
42
|
-
//fieldValue = stringAsUI(objectValue);
|
|
33
|
+
XInputDate.prototype.getValue = function () {
|
|
34
|
+
var value = null;
|
|
35
|
+
var objectValue = this.getValueFromObject();
|
|
43
36
|
// tuto zatial hack, mal by prist Date
|
|
44
37
|
if (typeof objectValue === 'string') {
|
|
45
|
-
|
|
38
|
+
value = new Date(objectValue);
|
|
46
39
|
}
|
|
47
40
|
else if (typeof objectValue === 'object' && objectValue instanceof Date) {
|
|
48
|
-
|
|
41
|
+
value = objectValue;
|
|
49
42
|
}
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
43
|
+
// value zostalo null ak nebol vykonany ziaden if
|
|
44
|
+
return value;
|
|
45
|
+
};
|
|
46
|
+
XInputDate.prototype.onValueChange = function (value) {
|
|
47
|
+
// z XCalendar prichadza value - typ Date alebo null
|
|
48
|
+
this.onValueChangeBase(value);
|
|
49
|
+
};
|
|
50
|
+
// nedame do onChange inputu, lebo by sa nas onChange volal po kazdej zmene pismenka
|
|
51
|
+
// ak bude treba, mozme este dorobit metodu "onChange2", ktora sa bude volat po kazdej zmene pismenka (asi iba do XInputText)
|
|
52
|
+
XInputDate.prototype.onBlur = function (e) {
|
|
53
|
+
this.callOnChangeFromOnBlur();
|
|
54
|
+
};
|
|
55
|
+
XInputDate.prototype.render = function () {
|
|
56
|
+
// note: style overrides size (width of the input according to character count)
|
|
57
|
+
return (react_1.default.createElement("div", { className: "field grid" },
|
|
58
|
+
react_1.default.createElement("label", { htmlFor: this.props.field, className: "col-fixed", style: this.getLabelStyle() }, this.getLabel()),
|
|
59
|
+
react_1.default.createElement(XCalendar_1.XCalendar, { id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), datetime: this.xField.type === 'datetime' })));
|
|
60
|
+
};
|
|
61
|
+
return XInputDate;
|
|
62
|
+
}(XInput_1.XInput));
|
|
58
63
|
exports.XInputDate = XInputDate;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export declare const XInputDecimalBase: (props: {
|
|
3
|
+
id?: string | undefined;
|
|
4
|
+
value: number | null;
|
|
5
|
+
onChange: (value: number | null) => void;
|
|
6
|
+
readOnly?: boolean | undefined;
|
|
7
|
+
useGrouping?: boolean | undefined;
|
|
8
|
+
fractionDigits?: number | undefined;
|
|
9
|
+
min?: number | undefined;
|
|
10
|
+
max?: number | undefined;
|
|
11
|
+
size?: number | undefined;
|
|
12
|
+
}) => JSX.Element;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.XInputDecimalBase = void 0;
|
|
7
|
+
var react_1 = __importDefault(require("react"));
|
|
8
|
+
var inputnumber_1 = require("primereact/inputnumber");
|
|
9
|
+
// wrapper for InputNumber component - zatial taky zjednoduseny, len na filter polozky pouzivame
|
|
10
|
+
var XInputDecimalBase = function (props) {
|
|
11
|
+
var onChange = function (e) {
|
|
12
|
+
// z InputNumber prichadza e.value - typ number alebo null
|
|
13
|
+
props.onChange(e.value);
|
|
14
|
+
};
|
|
15
|
+
// null konvertujeme na undefined (zevraj InputNumber nechce null)
|
|
16
|
+
return (react_1.default.createElement(inputnumber_1.InputNumber, { id: props.id, value: props.value !== null ? props.value : undefined, onChange: onChange, readOnly: props.readOnly, mode: "decimal", locale: "de-DE", useGrouping: props.useGrouping, minFractionDigits: props.fractionDigits, maxFractionDigits: props.fractionDigits, min: props.min, max: props.max, size: props.size }));
|
|
17
|
+
};
|
|
18
|
+
exports.XInputDecimalBase = XInputDecimalBase;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { ReactChild } from 'react';
|
|
1
|
+
import React, { ReactChild } from 'react';
|
|
2
|
+
import { DataTableFilterMetaData, DataTableOperatorFilterMetaData } from 'primereact/datatable';
|
|
3
|
+
import { ColumnBodyOptions, ColumnFilterElementTemplateOptions } from 'primereact/column';
|
|
2
4
|
import { SearchTableParams } from "./SearchTableParams";
|
|
3
5
|
import { XCustomFilter } from "../serverApi/FindParam";
|
|
4
6
|
import { XOnSaveOrCancelProp } from "./XFormBase";
|
|
7
|
+
export type XBetweenFilterProp = "row" | "column" | undefined;
|
|
5
8
|
export interface XEditModeHandlers {
|
|
6
9
|
onStart: () => void;
|
|
7
10
|
onSave: () => void;
|
|
@@ -18,6 +21,7 @@ export interface XLazyDataTableProps {
|
|
|
18
21
|
paginator: boolean;
|
|
19
22
|
rows: number;
|
|
20
23
|
filterDisplay: "menu" | "row";
|
|
24
|
+
betweenFilter?: XBetweenFilterProp;
|
|
21
25
|
scrollable: boolean;
|
|
22
26
|
scrollWidth: string;
|
|
23
27
|
scrollHeight: string;
|
|
@@ -49,12 +53,17 @@ export declare const XLazyDataTable: {
|
|
|
49
53
|
shrinkWidth: boolean;
|
|
50
54
|
};
|
|
51
55
|
};
|
|
56
|
+
export type XSetFilterItem = (field: string, filterItem: DataTableFilterMetaData | DataTableOperatorFilterMetaData) => void;
|
|
57
|
+
export type XFilterElementProp = (setFilterItem: XSetFilterItem, options: ColumnFilterElementTemplateOptions) => React.ReactNode;
|
|
52
58
|
export interface XLazyColumnProps {
|
|
53
59
|
field: string;
|
|
54
60
|
header?: any;
|
|
55
61
|
align?: "left" | "center" | "right";
|
|
56
62
|
dropdownInFilter?: boolean;
|
|
57
63
|
showFilterMenu?: boolean;
|
|
64
|
+
betweenFilter?: XBetweenFilterProp | "noBetween";
|
|
58
65
|
width?: string;
|
|
66
|
+
filterElement?: XFilterElementProp;
|
|
67
|
+
body?: React.ReactNode | ((data: any, options: ColumnBodyOptions) => React.ReactNode);
|
|
59
68
|
}
|
|
60
69
|
export declare const XLazyColumn: (props: XLazyColumnProps) => null;
|
|
@@ -112,6 +112,8 @@ var tristatecheckbox_1 = require("primereact/tristatecheckbox");
|
|
|
112
112
|
var XUtilsCommon_1 = require("../serverApi/XUtilsCommon");
|
|
113
113
|
var XExportRowsDialog_1 = require("./XExportRowsDialog");
|
|
114
114
|
var api_1 = require("primereact/api");
|
|
115
|
+
var XCalendar_1 = require("./XCalendar");
|
|
116
|
+
var XInputDecimalBase_1 = require("./XInputDecimalBase");
|
|
115
117
|
var XLazyDataTable = function (props) {
|
|
116
118
|
// must be here, is used in createInitFilters()
|
|
117
119
|
var xEntity = XUtilsMetadata_1.XUtilsMetadata.getXEntity(props.entity);
|
|
@@ -476,58 +478,90 @@ var XLazyDataTable = function (props) {
|
|
|
476
478
|
console.log("Nie je vyselectovany ziaden zaznam.");
|
|
477
479
|
}
|
|
478
480
|
};
|
|
479
|
-
// ******
|
|
481
|
+
// ****** dropdown vo filtri ********
|
|
480
482
|
// pouziva sa len pre simple filtrovanie (filterDisplay="row")
|
|
481
|
-
var
|
|
482
|
-
|
|
483
|
+
var onDropdownFilterChange = function (field, displayValue) {
|
|
484
|
+
var filterValue = displayValue !== XUtils_1.XUtils.dropdownEmptyOptionValue ? displayValue : null;
|
|
485
|
+
setFilterValue(field, filterValue, api_1.FilterMatchMode.EQUALS);
|
|
486
|
+
};
|
|
487
|
+
var getDropdownFilterValue = function (field) {
|
|
488
|
+
var filterValue = getFilterValue(field);
|
|
489
|
+
return filterValue !== null ? filterValue : XUtils_1.XUtils.dropdownEmptyOptionValue;
|
|
490
|
+
};
|
|
491
|
+
// ****** vseobecne metodky pre set/get do/z filtra ********
|
|
492
|
+
// zatial funguje len pre simple filtrovanie (filterDisplay="row")
|
|
493
|
+
// vseobecna specialna metodka pouzvana pri custom filtri (XLazyColumn.filterElement)
|
|
494
|
+
var setFilterItem = function (field, filterItem) {
|
|
495
|
+
filters[field] = filterItem;
|
|
496
|
+
// neskusal som, ci treba aj toto klonovat ale pravdepodobne hej
|
|
483
497
|
var filtersCloned = __assign({}, filters);
|
|
484
|
-
if (checkboxValue !== null) {
|
|
485
|
-
filtersCloned[field] = { value: checkboxValue ? "1" : "0", matchMode: api_1.FilterMatchMode.EQUALS };
|
|
486
|
-
}
|
|
487
|
-
else {
|
|
488
|
-
// pouzivatel zrusil hodnotu vo filtri (vybral prazdny stav v checkboxe), zrusime polozku z filtra
|
|
489
|
-
//delete filtersCloned[field];
|
|
490
|
-
filtersCloned[field] = { value: null, matchMode: api_1.FilterMatchMode.EQUALS };
|
|
491
|
-
}
|
|
492
498
|
setFilters(filtersCloned);
|
|
493
499
|
};
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
500
|
+
// vseobecna metodka - nastavi hodnotu do filtra
|
|
501
|
+
// ak je matchMode === undefined, tak zachova povodnu hodnotu matchMode
|
|
502
|
+
var setFilterValue = function (field, value, matchMode) {
|
|
503
|
+
var filterValue = filters[field]; // funguje len pre filterDisplay="row"
|
|
504
|
+
filterValue.value = value;
|
|
505
|
+
if (matchMode !== undefined) {
|
|
506
|
+
filterValue.matchMode = matchMode;
|
|
507
|
+
}
|
|
508
|
+
// treba klonovat, inac react nezobrazi zmenenu hodnotu
|
|
509
|
+
var filtersCloned = __assign({}, filters);
|
|
510
|
+
setFilters(filtersCloned);
|
|
511
|
+
};
|
|
512
|
+
// vseobecna metodka - precita hodnotu z filtra (vrati napr. typ Date | null)
|
|
513
|
+
var getFilterValue = function (field) {
|
|
514
|
+
var filterValue = filters[field]; // funguje len pre filterDisplay="row"
|
|
515
|
+
return filterValue.value;
|
|
516
|
+
};
|
|
517
|
+
// ****** vseobecne metodky pre set/get do/z filtra - pre betweenFilter ********
|
|
518
|
+
// do DataTableFilterMetaData.value ulozime dvojprvkove pole [value1, value2]
|
|
519
|
+
// na backende spracujeme toto dvojprvkove pole
|
|
520
|
+
var setFilterValue1 = function (field, value) {
|
|
521
|
+
// na zaciatku (po inicializacii lazy table) je filterValue = null
|
|
522
|
+
var filterValue = getFilterValue(field);
|
|
523
|
+
if (filterValue !== null) {
|
|
524
|
+
filterValue[0] = value;
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
filterValue = [value, null];
|
|
504
528
|
}
|
|
505
|
-
|
|
529
|
+
setFilterValue(field, filterValue, api_1.FilterMatchMode.BETWEEN);
|
|
506
530
|
};
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
if (displayValue !== XUtils_1.XUtils.dropdownEmptyOptionValue) {
|
|
513
|
-
filtersCloned[field] = { value: displayValue, matchMode: api_1.FilterMatchMode.EQUALS };
|
|
531
|
+
var setFilterValue2 = function (field, value) {
|
|
532
|
+
// na zaciatku (po inicializacii lazy table) je filterValue = null
|
|
533
|
+
var filterValue = getFilterValue(field);
|
|
534
|
+
if (filterValue !== null) {
|
|
535
|
+
filterValue[1] = value;
|
|
514
536
|
}
|
|
515
537
|
else {
|
|
516
|
-
|
|
517
|
-
//delete filtersCloned[field];
|
|
518
|
-
filtersCloned[field] = { value: null, matchMode: api_1.FilterMatchMode.EQUALS };
|
|
538
|
+
filterValue = [null, value];
|
|
519
539
|
}
|
|
520
|
-
|
|
540
|
+
setFilterValue(field, filterValue, api_1.FilterMatchMode.BETWEEN);
|
|
521
541
|
};
|
|
522
|
-
var
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
542
|
+
var getFilterValue1 = function (field) {
|
|
543
|
+
return getFilterValue1or2(field, 0);
|
|
544
|
+
};
|
|
545
|
+
var getFilterValue2 = function (field) {
|
|
546
|
+
return getFilterValue1or2(field, 1);
|
|
547
|
+
};
|
|
548
|
+
var getFilterValue1or2 = function (field, index) {
|
|
549
|
+
var filterValue = getFilterValue(field);
|
|
550
|
+
return filterValue !== null ? filterValue[index] : null;
|
|
551
|
+
};
|
|
552
|
+
var getBetweenFilter = function (columnBetweenFilter, tableBetweenFilter) {
|
|
553
|
+
var betweenFilter = undefined;
|
|
554
|
+
// columnBetweenFilter has higher prio than tableBetweenFilter
|
|
555
|
+
if (columnBetweenFilter !== undefined) {
|
|
556
|
+
if (columnBetweenFilter === "row" || columnBetweenFilter === "column") {
|
|
557
|
+
betweenFilter = columnBetweenFilter;
|
|
528
558
|
}
|
|
559
|
+
// for "noBetween" stays betweenFilter = undefined (simple filter used)
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
betweenFilter = tableBetweenFilter; // betweenFilter from XLazyDataTable property
|
|
529
563
|
}
|
|
530
|
-
return
|
|
564
|
+
return betweenFilter;
|
|
531
565
|
};
|
|
532
566
|
var bodyTemplate = function (columnProps, rowData, xField) {
|
|
533
567
|
var rowDataValue = XUtilsCommon_1.XUtilsCommon.getValueByPath(rowData, columnProps.field);
|
|
@@ -684,14 +718,61 @@ var XLazyDataTable = function (props) {
|
|
|
684
718
|
header = headerLabel;
|
|
685
719
|
}
|
|
686
720
|
// *********** filterElement ***********
|
|
721
|
+
var betweenFilter = undefined;
|
|
687
722
|
var filterElement;
|
|
688
|
-
if (
|
|
689
|
-
|
|
690
|
-
|
|
723
|
+
if (childColumn.props.filterElement !== undefined) {
|
|
724
|
+
filterElement = function (options) {
|
|
725
|
+
// compilator sa stazoval ze childColumn.props.filterElement muze byt undefined, preto som pridal "!"
|
|
726
|
+
return childColumn.props.filterElement(setFilterItem, options);
|
|
727
|
+
};
|
|
691
728
|
}
|
|
692
|
-
else
|
|
693
|
-
|
|
694
|
-
|
|
729
|
+
else {
|
|
730
|
+
if (xField.type === "boolean") {
|
|
731
|
+
var checkboxValue = getFilterValue(childColumn.props.field);
|
|
732
|
+
filterElement = react_1.default.createElement(tristatecheckbox_1.TriStateCheckbox, { value: checkboxValue, onChange: function (e) { return setFilterValue(childColumn.props.field, e.value, api_1.FilterMatchMode.EQUALS); } });
|
|
733
|
+
}
|
|
734
|
+
else if (childColumn.props.dropdownInFilter) {
|
|
735
|
+
var dropdownValue = getDropdownFilterValue(childColumn.props.field);
|
|
736
|
+
filterElement = react_1.default.createElement(XDropdownDTFilter_1.XDropdownDTFilter, { entity: props.entity, path: childColumn.props.field, value: dropdownValue, onValueChange: onDropdownFilterChange });
|
|
737
|
+
}
|
|
738
|
+
else if (xField.type === "date" || xField.type === "datetime") {
|
|
739
|
+
betweenFilter = getBetweenFilter(childColumn.props.betweenFilter, props.betweenFilter);
|
|
740
|
+
if (betweenFilter !== undefined) {
|
|
741
|
+
// display: 'flex' umiestni XCalendar elementy vedla seba
|
|
742
|
+
filterElement =
|
|
743
|
+
react_1.default.createElement("div", { style: betweenFilter === "row" ? { display: 'flex' } : undefined },
|
|
744
|
+
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" }),
|
|
745
|
+
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" }));
|
|
746
|
+
}
|
|
747
|
+
else {
|
|
748
|
+
var dateValue = getFilterValue(childColumn.props.field);
|
|
749
|
+
filterElement = react_1.default.createElement(XCalendar_1.XCalendar, { value: dateValue, onChange: function (value) { return setFilterValue(childColumn.props.field, value); }, datetime: xField.type === "datetime" });
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
else if (xField.type === "decimal" || xField.type === "number") {
|
|
753
|
+
var params = XUtilsMetadata_1.XUtilsMetadata.getParamsForInputNumber(xField);
|
|
754
|
+
betweenFilter = getBetweenFilter(childColumn.props.betweenFilter, props.betweenFilter);
|
|
755
|
+
if (betweenFilter !== undefined) {
|
|
756
|
+
// display: 'flex' umiestni input elementy pod seba (betweenFilter = "column") resp. vedla seba (betweenFilter = "row")
|
|
757
|
+
filterElement =
|
|
758
|
+
react_1.default.createElement("div", { style: { display: 'flex', flexDirection: betweenFilter } },
|
|
759
|
+
react_1.default.createElement(XInputDecimalBase_1.XInputDecimalBase, __assign({ value: getFilterValue1(childColumn.props.field), onChange: function (value) { return setFilterValue1(childColumn.props.field, value); } }, params)),
|
|
760
|
+
react_1.default.createElement(XInputDecimalBase_1.XInputDecimalBase, __assign({ value: getFilterValue2(childColumn.props.field), onChange: function (value) { return setFilterValue2(childColumn.props.field, value); } }, params)));
|
|
761
|
+
}
|
|
762
|
+
else {
|
|
763
|
+
var numberValue = getFilterValue(childColumn.props.field);
|
|
764
|
+
filterElement = react_1.default.createElement(XInputDecimalBase_1.XInputDecimalBase, __assign({ value: numberValue, onChange: function (value) { return setFilterValue(childColumn.props.field, value); } }, params));
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
// ************** dataType **************
|
|
769
|
+
// depending on the dataType of the column, suitable match modes are displayed in filter
|
|
770
|
+
var dataType = undefined;
|
|
771
|
+
if (xField.type === "decimal" || xField.type === "number") {
|
|
772
|
+
dataType = "numeric";
|
|
773
|
+
}
|
|
774
|
+
else if (xField.type === "date" || xField.type === "datetime") {
|
|
775
|
+
dataType = "date";
|
|
695
776
|
}
|
|
696
777
|
// *********** showFilterMenu ***********
|
|
697
778
|
var showFilterMenu;
|
|
@@ -701,7 +782,7 @@ var XLazyDataTable = function (props) {
|
|
|
701
782
|
else {
|
|
702
783
|
showFilterMenu = true; // default
|
|
703
784
|
if (props.filterDisplay === "row") {
|
|
704
|
-
if (xField.type === "boolean" || childColumn.props.dropdownInFilter) {
|
|
785
|
+
if (xField.type === "boolean" || childColumn.props.dropdownInFilter || betweenFilter !== undefined) {
|
|
705
786
|
showFilterMenu = false;
|
|
706
787
|
}
|
|
707
788
|
}
|
|
@@ -710,9 +791,12 @@ var XLazyDataTable = function (props) {
|
|
|
710
791
|
// pre filterDisplay = "row" nechceme clear button, chceme setrit miesto
|
|
711
792
|
var showClearButton = props.filterDisplay === "menu";
|
|
712
793
|
// *********** body ***********
|
|
713
|
-
// TODO - mozno by bolo dobre vytvarat body pre kazdy field, nech je to vsetko konzistentne
|
|
714
794
|
var body;
|
|
715
|
-
if (
|
|
795
|
+
if (childColumn.props.body !== undefined) {
|
|
796
|
+
body = childColumn.props.body;
|
|
797
|
+
}
|
|
798
|
+
// TODO - mozno by bolo dobre vytvarat body pre kazdy typ fieldu, nech je to vsetko konzistentne
|
|
799
|
+
else if (xField.type === "decimal" || xField.type === "date" || xField.type === "datetime" || xField.type === "boolean") {
|
|
716
800
|
body = function (rowData) { return bodyTemplate(childColumn.props, rowData, xField); };
|
|
717
801
|
}
|
|
718
802
|
// *********** width/headerStyle ***********
|
|
@@ -721,7 +805,7 @@ var XLazyDataTable = function (props) {
|
|
|
721
805
|
// TODO - if filter not used at all, then buttons flags should be false
|
|
722
806
|
var filterMenuInFilterRow = props.filterDisplay === "row" && showFilterMenu;
|
|
723
807
|
var filterButtonInHeader = props.filterDisplay === "menu";
|
|
724
|
-
width = XUtilsMetadata_1.XUtilsMetadata.computeColumnWidth(xField, filterMenuInFilterRow, undefined, headerLabel, true, filterButtonInHeader);
|
|
808
|
+
width = XUtilsMetadata_1.XUtilsMetadata.computeColumnWidth(xField, betweenFilter, filterMenuInFilterRow, undefined, headerLabel, true, filterButtonInHeader);
|
|
725
809
|
}
|
|
726
810
|
var headerStyle = {};
|
|
727
811
|
if (width !== undefined) {
|
|
@@ -741,7 +825,7 @@ var XLazyDataTable = function (props) {
|
|
|
741
825
|
align = "center";
|
|
742
826
|
}
|
|
743
827
|
}
|
|
744
|
-
return react_1.default.createElement(column_1.Column, { field: childColumn.props.field, header: header, filter: true, sortable: true, filterElement: filterElement, showFilterMenu: showFilterMenu, showClearButton: showClearButton, body: body, headerStyle: headerStyle, align: align });
|
|
828
|
+
return react_1.default.createElement(column_1.Column, { field: childColumn.props.field, header: header, filter: true, sortable: true, filterElement: filterElement, dataType: dataType, showFilterMenu: showFilterMenu, showClearButton: showClearButton, body: body, headerStyle: headerStyle, align: align });
|
|
745
829
|
});
|
|
746
830
|
return (react_1.default.createElement("div", null,
|
|
747
831
|
react_1.default.createElement("div", { className: "flex justify-content-center" },
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { XAssoc, XEntity, XField } from "../serverApi/XEntityMetadata";
|
|
1
|
+
import { XAssoc, XEntity, XField, XRelationType } from "../serverApi/XEntityMetadata";
|
|
2
2
|
import { XBrowseMeta } from "../serverApi/XBrowseMetadata";
|
|
3
|
+
import { XBetweenFilterProp } from "./XLazyDataTable";
|
|
3
4
|
export declare class XUtilsMetadata {
|
|
4
5
|
private static xEntityMap;
|
|
5
6
|
private static xBrowseMetaMap;
|
|
@@ -9,6 +10,8 @@ export declare class XUtilsMetadata {
|
|
|
9
10
|
static getXField(xEntity: XEntity, field: string): XField;
|
|
10
11
|
static getXFieldByPath(xEntity: XEntity, path: string): XField;
|
|
11
12
|
static getXFieldByPathStr(entity: string, path: string): XField;
|
|
13
|
+
static getXAssocByPath(xEntity: XEntity, path: string): XAssoc;
|
|
14
|
+
static getLastXAssocByPath(xEntity: XEntity, path: string): XAssoc;
|
|
12
15
|
static getXAssocToOne(xEntity: XEntity, assocField: string): XAssoc;
|
|
13
16
|
static getXAssocToMany(xEntity: XEntity, assocField: string): XAssoc;
|
|
14
17
|
static getXAssocToOneByAssocEntity(xEntity: XEntity, assocEntityName: string): XAssoc;
|
|
@@ -16,6 +19,7 @@ export declare class XUtilsMetadata {
|
|
|
16
19
|
static getXEntityForAssocToOne(xEntity: XEntity, assocField: string): XEntity;
|
|
17
20
|
static getXEntityForAssocToMany(xEntity: XEntity, assocField: string): XEntity;
|
|
18
21
|
static getXFieldList(xEntity: XEntity): XField[];
|
|
22
|
+
static getXAssocList(xEntity: XEntity, relationTypeList?: XRelationType[]): XAssoc[];
|
|
19
23
|
static getParamsForInputNumber(xField: XField): {
|
|
20
24
|
useGrouping: boolean;
|
|
21
25
|
fractionDigits?: number;
|
|
@@ -24,7 +28,7 @@ export declare class XUtilsMetadata {
|
|
|
24
28
|
size?: number;
|
|
25
29
|
};
|
|
26
30
|
static CHAR_SIZE: number;
|
|
27
|
-
static computeColumnWidth(xField: XField, filterMenuInFilterRow: boolean, formColumnType: string | undefined, header: string | undefined, sortableButtonInHeader: boolean, filterButtonInHeader: boolean): string | undefined;
|
|
31
|
+
static computeColumnWidth(xField: XField, betweenFilter: XBetweenFilterProp, filterMenuInFilterRow: boolean, formColumnType: string | undefined, header: string | undefined, sortableButtonInHeader: boolean, filterButtonInHeader: boolean): string | undefined;
|
|
28
32
|
static computeColumnWidthBase(charSize?: number, paddingAndOther?: number): number | undefined;
|
|
29
33
|
static getXBrowseMeta(entity: string, browseId?: string): XBrowseMeta;
|
|
30
34
|
static setXBrowseMeta(entity: string, browseId: string | undefined, xBrowseMeta: XBrowseMeta): void;
|