@michalrakus/x-react-web-lib 1.29.0 → 1.31.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/XFieldSet/XFieldSetBase.d.ts +79 -0
- package/lib/components/XFieldSet/XFieldSetBase.js +144 -0
- package/lib/components/XFormComponentDT.d.ts +8 -1
- package/lib/components/XFormComponentDT.js +19 -0
- package/lib/components/XFormDataTable2.d.ts +2 -1
- package/lib/components/XFormDataTable2.js +2 -2
- package/lib/components/XInputDT.d.ts +2 -0
- package/lib/components/XInputDate.js +0 -1
- package/lib/components/XLazyDataTable/XLazyDataTable.d.ts +1 -0
- package/lib/components/XLazyDataTable/XLazyDataTable.js +117 -36
- package/lib/components/locale/x-en.json +1 -0
- package/lib/serverApi/XUtilsConversions.js +6 -0
- package/package.json +1 -1
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
export interface XFieldSetMeta {
|
|
3
|
+
id?: number;
|
|
4
|
+
fieldSetId: string;
|
|
5
|
+
xFieldMetaRoot: XFieldMeta;
|
|
6
|
+
modifDate: Date | null;
|
|
7
|
+
modifXUser: any | null;
|
|
8
|
+
version: number;
|
|
9
|
+
}
|
|
10
|
+
export declare enum XFieldType {
|
|
11
|
+
rootField = "rootField",
|
|
12
|
+
fieldGroup = "fieldGroup",
|
|
13
|
+
fieldGroupWithCheckbox = "fieldGroupWithCheckbox",
|
|
14
|
+
checkbox = "checkbox",
|
|
15
|
+
checkboxNullable = "checkboxNullable",
|
|
16
|
+
inputText = "inputText",
|
|
17
|
+
inputDecimal = "inputDecimal"
|
|
18
|
+
}
|
|
19
|
+
export declare enum XChildrenLayout {
|
|
20
|
+
column = "column",
|
|
21
|
+
row = "row",
|
|
22
|
+
tabView = "tabView",
|
|
23
|
+
tabViewWithHeaderGroup = "tabViewWithHeaderGroup"
|
|
24
|
+
}
|
|
25
|
+
export declare enum XFieldPropValuesFrom {
|
|
26
|
+
parent = "parent",
|
|
27
|
+
this = "this"
|
|
28
|
+
}
|
|
29
|
+
export interface XFieldMeta {
|
|
30
|
+
type?: XFieldType;
|
|
31
|
+
childrenLayout?: XChildrenLayout;
|
|
32
|
+
width?: string;
|
|
33
|
+
labelWidth?: string;
|
|
34
|
+
inputWidth?: string;
|
|
35
|
+
suppressFieldGroupPanel?: true;
|
|
36
|
+
field: string;
|
|
37
|
+
label: string;
|
|
38
|
+
tooltip?: string;
|
|
39
|
+
decimalProps?: {
|
|
40
|
+
scale: number;
|
|
41
|
+
};
|
|
42
|
+
dateFrom?: Date;
|
|
43
|
+
dateTo?: Date;
|
|
44
|
+
xFieldMetaList?: XFieldMeta[];
|
|
45
|
+
fieldPropValuesMapForEdit?: XFieldPropValuesMapForEdit;
|
|
46
|
+
fieldPropValuesMapCached?: XFieldPropValuesMap;
|
|
47
|
+
xFieldMetaParentCached?: XFieldMeta;
|
|
48
|
+
}
|
|
49
|
+
export interface XFieldPropValuesMapForEdit {
|
|
50
|
+
[field: string]: XFieldPropValuesForEdit;
|
|
51
|
+
}
|
|
52
|
+
export interface XFieldPropValuesMap {
|
|
53
|
+
[field: string]: XFieldPropValues;
|
|
54
|
+
}
|
|
55
|
+
export interface XFieldPropValuesForEdit {
|
|
56
|
+
valuesFrom: XFieldPropValuesFrom;
|
|
57
|
+
values?: XFieldPropValues;
|
|
58
|
+
error?: string;
|
|
59
|
+
}
|
|
60
|
+
export type XFieldPropValues = any | undefined;
|
|
61
|
+
export interface XFieldProp {
|
|
62
|
+
id: string;
|
|
63
|
+
label: string;
|
|
64
|
+
fieldPropEdit?: JSX.Element;
|
|
65
|
+
}
|
|
66
|
+
export interface XFieldPropEditProps {
|
|
67
|
+
value?: XFieldPropValues;
|
|
68
|
+
onChange?: (value: XFieldPropValues) => void;
|
|
69
|
+
onErrorChange?: (error: (string | undefined)) => void;
|
|
70
|
+
}
|
|
71
|
+
export interface XFieldSetValues {
|
|
72
|
+
[field: string]: any;
|
|
73
|
+
}
|
|
74
|
+
export type XFieldXFieldMetaMap = Map<string, XFieldMeta>;
|
|
75
|
+
export declare class XFieldSetBase {
|
|
76
|
+
static createXFieldXFieldMetaMap(xFieldSetMeta: XFieldSetMeta, filterFromParent?: string): XFieldXFieldMetaMap;
|
|
77
|
+
static xFieldSetValuesAsUI(xFieldSetValues: XFieldSetValues, xFieldXFieldMetaMap: XFieldXFieldMetaMap): string;
|
|
78
|
+
private static createMapForXFieldMeta;
|
|
79
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __values = (this && this.__values) || function(o) {
|
|
3
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
4
|
+
if (m) return m.call(o);
|
|
5
|
+
if (o && typeof o.length === "number") return {
|
|
6
|
+
next: function () {
|
|
7
|
+
if (o && i >= o.length) o = void 0;
|
|
8
|
+
return { value: o && o[i++], done: !o };
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
12
|
+
};
|
|
13
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
+
if (!m) return o;
|
|
16
|
+
var i = m.call(o), r, ar = [], e;
|
|
17
|
+
try {
|
|
18
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
+
}
|
|
20
|
+
catch (error) { e = { error: error }; }
|
|
21
|
+
finally {
|
|
22
|
+
try {
|
|
23
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
+
}
|
|
25
|
+
finally { if (e) throw e.error; }
|
|
26
|
+
}
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.XFieldSetBase = exports.XFieldPropValuesFrom = exports.XChildrenLayout = exports.XFieldType = void 0;
|
|
31
|
+
var XUtilsConversions_1 = require("../../serverApi/XUtilsConversions");
|
|
32
|
+
var XFieldType;
|
|
33
|
+
(function (XFieldType) {
|
|
34
|
+
XFieldType["rootField"] = "rootField";
|
|
35
|
+
XFieldType["fieldGroup"] = "fieldGroup";
|
|
36
|
+
XFieldType["fieldGroupWithCheckbox"] = "fieldGroupWithCheckbox";
|
|
37
|
+
XFieldType["checkbox"] = "checkbox";
|
|
38
|
+
XFieldType["checkboxNullable"] = "checkboxNullable";
|
|
39
|
+
XFieldType["inputText"] = "inputText";
|
|
40
|
+
XFieldType["inputDecimal"] = "inputDecimal";
|
|
41
|
+
})(XFieldType = exports.XFieldType || (exports.XFieldType = {}));
|
|
42
|
+
// children layout sa da nastavit len na type, ktory ma children - rootField, fieldGroup
|
|
43
|
+
var XChildrenLayout;
|
|
44
|
+
(function (XChildrenLayout) {
|
|
45
|
+
XChildrenLayout["column"] = "column";
|
|
46
|
+
XChildrenLayout["row"] = "row";
|
|
47
|
+
XChildrenLayout["tabView"] = "tabView";
|
|
48
|
+
XChildrenLayout["tabViewWithHeaderGroup"] = "tabViewWithHeaderGroup"; // to iste co tabView ale prvy fieldGroup (0-ty tab) zobrazi nad tabView (aby bol vzdy pristupny)
|
|
49
|
+
})(XChildrenLayout = exports.XChildrenLayout || (exports.XChildrenLayout = {}));
|
|
50
|
+
// poznamka - tabView a tabViewWithHeaderGroup odignoruju bezne simple children - ak take budu existovat, zobrazi sa uzivatelovi warning pri nastaveni tabView
|
|
51
|
+
// pouzijeme len checkbox supressFieldGroupPanel
|
|
52
|
+
// pouziva sa len pre typ fieldGroup a len v pripade ak dany fieldGroup nie je vyrenderovany v nejakej tab-ke (jeho parent ma nastaveny layout tabView*)
|
|
53
|
+
// export enum XFieldGroupPanelViewStatus {
|
|
54
|
+
// show = "show", // default - vyrenderuje Panel aj s labelom a vo vnutri panelu umiestni children
|
|
55
|
+
// hide = "hide" // nerenderuje Panel, children umiestni do div elementu (label sa nepouzije) - pouziva sa na vytvorenie stlpcov v (parent) fieldGroup-e
|
|
56
|
+
// }
|
|
57
|
+
var XFieldPropValuesFrom;
|
|
58
|
+
(function (XFieldPropValuesFrom) {
|
|
59
|
+
XFieldPropValuesFrom["parent"] = "parent";
|
|
60
|
+
XFieldPropValuesFrom["this"] = "this"; // field prop values preberame z current fieldu
|
|
61
|
+
})(XFieldPropValuesFrom = exports.XFieldPropValuesFrom || (exports.XFieldPropValuesFrom = {}));
|
|
62
|
+
// zatial provizorne len na staticke metody
|
|
63
|
+
var XFieldSetBase = /** @class */ (function () {
|
|
64
|
+
function XFieldSetBase() {
|
|
65
|
+
}
|
|
66
|
+
// api metoda na vytvorenie Map instancie, ktora sluzi na rychle najdenie prislusneho XFieldMeta podla nazvu fieldu
|
|
67
|
+
// ak je zadany filterFromParent, tak vracia len children/subchildren/... fieldu s field = filterFromParent
|
|
68
|
+
// (filterFromParent je casto groupField)
|
|
69
|
+
XFieldSetBase.createXFieldXFieldMetaMap = function (xFieldSetMeta, filterFromParent) {
|
|
70
|
+
var xFieldXFieldMetaMap = new Map();
|
|
71
|
+
XFieldSetBase.createMapForXFieldMeta(xFieldSetMeta.xFieldMetaRoot, filterFromParent, xFieldXFieldMetaMap);
|
|
72
|
+
return xFieldXFieldMetaMap;
|
|
73
|
+
};
|
|
74
|
+
// api metoda na vyrenderovanie field set atributu
|
|
75
|
+
// logicky patri do src/serverApi/XUtilsConversions.ts a zisla by sa aj pri exporte do excelu ale XFieldXFieldMetaMap (a jeho "parent"-a XFieldSetBase) mame len na frontende
|
|
76
|
+
XFieldSetBase.xFieldSetValuesAsUI = function (xFieldSetValues, xFieldXFieldMetaMap) {
|
|
77
|
+
var e_1, _a;
|
|
78
|
+
var _b;
|
|
79
|
+
// budeme mat vzdy spravne poradie? nebudeme... asi najjednoduchsie zosortovat tu "valueUIList" podla abecedy
|
|
80
|
+
var valueUIList = [];
|
|
81
|
+
try {
|
|
82
|
+
for (var _c = __values(Object.entries(xFieldSetValues)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
83
|
+
var _e = __read(_d.value, 2), field = _e[0], value = _e[1];
|
|
84
|
+
var xFieldMeta = xFieldXFieldMetaMap.get(field);
|
|
85
|
+
if (xFieldMeta) {
|
|
86
|
+
if (xFieldMeta.type === XFieldType.checkbox) {
|
|
87
|
+
valueUIList.push(xFieldMeta.label);
|
|
88
|
+
}
|
|
89
|
+
else if (xFieldMeta.type === XFieldType.inputText) {
|
|
90
|
+
valueUIList.push("".concat(xFieldMeta.label, ": \"").concat(value, "\""));
|
|
91
|
+
}
|
|
92
|
+
else if (xFieldMeta.type === XFieldType.inputDecimal) {
|
|
93
|
+
valueUIList.push("".concat(xFieldMeta.label, ": ").concat((0, XUtilsConversions_1.numberAsUI)((0, XUtilsConversions_1.numberFromModel)(value), (_b = xFieldMeta.decimalProps) === null || _b === void 0 ? void 0 : _b.scale)));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// neznamy typ
|
|
97
|
+
valueUIList.push("".concat(xFieldMeta.label, ": \"").concat(value, "\""));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// field bol z formulara odstraneny (nemalo by sa to takto pouzivat, skor by sa mala datumom ohranicit platnost fieldu)
|
|
102
|
+
// zobrazime v surovom stave
|
|
103
|
+
valueUIList.push("".concat(field, ": ").concat(typeof value === 'string' ? '"' + value + '"' : value));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
108
|
+
finally {
|
|
109
|
+
try {
|
|
110
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
111
|
+
}
|
|
112
|
+
finally { if (e_1) throw e_1.error; }
|
|
113
|
+
}
|
|
114
|
+
return valueUIList.join(", ");
|
|
115
|
+
};
|
|
116
|
+
XFieldSetBase.createMapForXFieldMeta = function (xFieldMeta, filterFromParent, xFieldXFieldMetaMap) {
|
|
117
|
+
var e_2, _a;
|
|
118
|
+
if (filterFromParent === undefined) {
|
|
119
|
+
// no filter is used
|
|
120
|
+
xFieldXFieldMetaMap.set(xFieldMeta.field, xFieldMeta);
|
|
121
|
+
}
|
|
122
|
+
else if (filterFromParent === xFieldMeta.field) {
|
|
123
|
+
// the searched parent field has been found, all his children/subchildren/... will be added to the list (we remove the filter)
|
|
124
|
+
filterFromParent = undefined;
|
|
125
|
+
}
|
|
126
|
+
if (xFieldMeta.xFieldMetaList) {
|
|
127
|
+
try {
|
|
128
|
+
for (var _b = __values(xFieldMeta.xFieldMetaList), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
129
|
+
var insideXFieldMeta = _c.value;
|
|
130
|
+
XFieldSetBase.createMapForXFieldMeta(insideXFieldMeta, filterFromParent, xFieldXFieldMetaMap);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
134
|
+
finally {
|
|
135
|
+
try {
|
|
136
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
137
|
+
}
|
|
138
|
+
finally { if (e_2) throw e_2.error; }
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
return XFieldSetBase;
|
|
143
|
+
}());
|
|
144
|
+
exports.XFieldSetBase = XFieldSetBase;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { XFormBase } from "./XFormBase";
|
|
2
|
-
import { Component } from "react";
|
|
2
|
+
import React, { Component } from "react";
|
|
3
3
|
import { OperationType } from "./XUtils";
|
|
4
4
|
import { XError } from "./XErrors";
|
|
5
5
|
import { XCustomFilter } from "../serverApi/FindParam";
|
|
@@ -10,6 +10,11 @@ export interface XFormComponentDTProps {
|
|
|
10
10
|
rowData: any;
|
|
11
11
|
readOnly?: XTableFieldReadOnlyProp;
|
|
12
12
|
onChange?: XTableFieldOnChange;
|
|
13
|
+
placeholder?: string;
|
|
14
|
+
label?: string;
|
|
15
|
+
tooltip?: string;
|
|
16
|
+
desc?: string;
|
|
17
|
+
labelStyle?: React.CSSProperties;
|
|
13
18
|
}
|
|
14
19
|
export declare abstract class XFormComponentDT<P extends XFormComponentDTProps> extends Component<P> {
|
|
15
20
|
private valueChanged;
|
|
@@ -19,6 +24,8 @@ export declare abstract class XFormComponentDT<P extends XFormComponentDTProps>
|
|
|
19
24
|
onValueChangeBase(value: any, onChange?: XTableFieldOnChange, assocObjectChange?: OperationType): void;
|
|
20
25
|
abstract isNotNull(): boolean;
|
|
21
26
|
isReadOnly(): boolean;
|
|
27
|
+
getLabel(): string | undefined;
|
|
28
|
+
getLabelStyle(): React.CSSProperties;
|
|
22
29
|
validate(): {
|
|
23
30
|
field: string;
|
|
24
31
|
xError: XError;
|
|
@@ -78,6 +78,25 @@ var XFormComponentDT = /** @class */ (function (_super) {
|
|
|
78
78
|
}
|
|
79
79
|
return readOnly;
|
|
80
80
|
};
|
|
81
|
+
// *********** label support - len pre ne-DT componenty pouzivany ************
|
|
82
|
+
// ak je label undefined, label element sa nevykresli
|
|
83
|
+
XFormComponentDT.prototype.getLabel = function () {
|
|
84
|
+
var label = this.props.label;
|
|
85
|
+
if (label !== undefined) {
|
|
86
|
+
// test na readOnly je tu hlavne koli tomu aby sme nemali * pri ID atribute, ktory sa pri inserte generuje az pri zapise do DB
|
|
87
|
+
if (this.isNotNull() && !this.isReadOnly()) {
|
|
88
|
+
label = XUtils_1.XUtils.markNotNull(label);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return label;
|
|
92
|
+
};
|
|
93
|
+
XFormComponentDT.prototype.getLabelStyle = function () {
|
|
94
|
+
var _a;
|
|
95
|
+
var labelStyle = (_a = this.props.labelStyle) !== null && _a !== void 0 ? _a : {};
|
|
96
|
+
// this.props.inline nepouzivame, lebo je to asi zombie
|
|
97
|
+
XUtils_1.XUtils.addCssPropIfNotExists(labelStyle, { width: XUtils_1.XUtils.FIELD_LABEL_WIDTH });
|
|
98
|
+
return labelStyle;
|
|
99
|
+
};
|
|
81
100
|
// *********** validation support ************
|
|
82
101
|
// volane po kliknuti na Save
|
|
83
102
|
// vrati (field, XError) ak nezbehne "field validacia", ak zbehne, vrati undefined
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { XFormBase } from "./XFormBase";
|
|
2
2
|
import React, { Component, ReactChild } from "react";
|
|
3
|
-
import { DataTableFilterMeta } from "primereact/datatable";
|
|
3
|
+
import { DataTableFilterMeta, DataTableSortMeta } from "primereact/datatable";
|
|
4
4
|
import { ColumnBodyOptions } from "primereact/column";
|
|
5
5
|
import { XEntity, XField } from "../serverApi/XEntityMetadata";
|
|
6
6
|
import { XViewStatusOrBoolean } from "./XUtils";
|
|
@@ -117,6 +117,7 @@ export interface XFormAutoCompleteColumnProps extends XFormColumnBaseProps {
|
|
|
117
117
|
searchBrowse?: JSX.Element;
|
|
118
118
|
assocForm?: JSX.Element;
|
|
119
119
|
filter?: XTableFieldFilterProp;
|
|
120
|
+
sortField?: string | DataTableSortMeta[];
|
|
120
121
|
fields?: string[];
|
|
121
122
|
suggestions?: any[];
|
|
122
123
|
}
|
|
@@ -277,7 +277,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
|
|
|
277
277
|
};
|
|
278
278
|
XFormDataTable2.prototype.getFilterMatchMode = function (xField) {
|
|
279
279
|
var filterMatchMode;
|
|
280
|
-
if (xField.type === "string") {
|
|
280
|
+
if (xField.type === "string" || xField.type === "jsonb") {
|
|
281
281
|
filterMatchMode = api_1.FilterMatchMode.CONTAINS;
|
|
282
282
|
}
|
|
283
283
|
// zatial vsetky ostatne EQUALS
|
|
@@ -404,7 +404,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
|
|
|
404
404
|
}
|
|
405
405
|
else if (columnProps.type === "autoComplete") {
|
|
406
406
|
var columnPropsAutoComplete = columnProps;
|
|
407
|
-
body = react_1.default.createElement(XAutoCompleteDT_1.XAutoCompleteDT, { form: this.props.form, entity: this.getEntity(), assocField: columnPropsAutoComplete.assocField, displayField: columnPropsAutoComplete.displayField, searchBrowse: columnPropsAutoComplete.searchBrowse, assocForm: columnPropsAutoComplete.assocForm, filter: columnPropsAutoComplete.filter, fields: columnPropsAutoComplete.fields, suggestions: columnPropsAutoComplete.suggestions, rowData: rowData, readOnly: readOnly });
|
|
407
|
+
body = react_1.default.createElement(XAutoCompleteDT_1.XAutoCompleteDT, { form: this.props.form, entity: this.getEntity(), assocField: columnPropsAutoComplete.assocField, displayField: columnPropsAutoComplete.displayField, searchBrowse: columnPropsAutoComplete.searchBrowse, assocForm: columnPropsAutoComplete.assocForm, filter: columnPropsAutoComplete.filter, sortField: columnPropsAutoComplete.sortField, fields: columnPropsAutoComplete.fields, suggestions: columnPropsAutoComplete.suggestions, rowData: rowData, readOnly: readOnly });
|
|
408
408
|
}
|
|
409
409
|
else if (columnProps.type === "searchButton") {
|
|
410
410
|
var columnPropsSearchButton = columnProps;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { XField } from "../serverApi/XEntityMetadata";
|
|
2
2
|
import { XFormComponentDT, XFormComponentDTProps } from "./XFormComponentDT";
|
|
3
|
+
import React from "react";
|
|
3
4
|
export interface XInputDTProps extends XFormComponentDTProps {
|
|
4
5
|
field: string;
|
|
6
|
+
inputStyle?: React.CSSProperties;
|
|
5
7
|
}
|
|
6
8
|
export declare abstract class XInputDT<P extends XInputDTProps> extends XFormComponentDT<P> {
|
|
7
9
|
protected xField: XField;
|
|
@@ -40,7 +40,6 @@ var XInputDate = /** @class */ (function (_super) {
|
|
|
40
40
|
};
|
|
41
41
|
XInputDate.prototype.render = function () {
|
|
42
42
|
var _a;
|
|
43
|
-
// note: style overrides size (width of the input according to character count)
|
|
44
43
|
return (react_1.default.createElement("div", { className: "field grid" },
|
|
45
44
|
react_1.default.createElement("label", { htmlFor: this.props.field, className: "col-fixed", style: this.getLabelStyle() }, this.getLabel()),
|
|
46
45
|
react_1.default.createElement(XCalendar_1.XCalendar, { id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), error: this.getError(), scale: (_a = this.props.scale) !== null && _a !== void 0 ? _a : this.xField.scale, datetime: this.xField.type === 'datetime' })));
|
|
@@ -110,6 +110,7 @@ export interface XLazyColumnProps {
|
|
|
110
110
|
betweenFilter?: XBetweenFilterProp | "noBetween";
|
|
111
111
|
width?: string;
|
|
112
112
|
contentType?: XContentType;
|
|
113
|
+
fieldSetId?: string;
|
|
113
114
|
aggregateType?: XAggregateFunction;
|
|
114
115
|
columnViewStatus: XViewStatusOrBoolean;
|
|
115
116
|
filterElement?: XFilterElementProp;
|
|
@@ -131,6 +131,7 @@ var XMultilineSwitch_1 = require("./XMultilineSwitch");
|
|
|
131
131
|
var XMultilineRenderer_1 = require("./XMultilineRenderer");
|
|
132
132
|
var XHtmlRenderer_1 = require("./XHtmlRenderer");
|
|
133
133
|
var XOcfDropdown_1 = require("./XOcfDropdown");
|
|
134
|
+
var XFieldSetBase_1 = require("../XFieldSet/XFieldSetBase");
|
|
134
135
|
var XLazyDataTable = function (props) {
|
|
135
136
|
var _a;
|
|
136
137
|
// must be here, is used in createInitFilters()
|
|
@@ -184,7 +185,7 @@ var XLazyDataTable = function (props) {
|
|
|
184
185
|
};
|
|
185
186
|
var getFilterMatchMode = function (xField) {
|
|
186
187
|
var filterMatchMode;
|
|
187
|
-
if (xField.type === "string") {
|
|
188
|
+
if (xField.type === "string" || xField.type === "jsonb") {
|
|
188
189
|
filterMatchMode = api_1.FilterMatchMode.CONTAINS;
|
|
189
190
|
}
|
|
190
191
|
// zatial vsetky ostatne EQUALS
|
|
@@ -219,10 +220,14 @@ var XLazyDataTable = function (props) {
|
|
|
219
220
|
var dataTableEl = (0, react_1.useRef)(null);
|
|
220
221
|
var customFilterItems = XUtilsCommon_1.XUtilsCommon.createCustomFilterItems(props.customFilter);
|
|
221
222
|
var aggregateItems = createAggregateItems();
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
var
|
|
223
|
+
// ak mame fieldSet stlpce (stlpce ktore maju zadany fieldSetId a zobrazuju hodnoty podla fieldSet-u),
|
|
224
|
+
// tak sem nacitame mapy umoznujuce ziskanie labelov zakliknutych field-ov
|
|
225
|
+
// poznamka: uz by sa zislo mat vytvorene objekty (instancie) pre stlpce a do nich zapisovat pripadny XFieldSetMap, filter (teraz je vo "filters")
|
|
226
|
+
var _b = __read((0, react_1.useState)({}), 2), xFieldSetMaps = _b[0], setXFieldSetMaps = _b[1];
|
|
227
|
+
var _c = __read((0, react_1.useState)({ rowList: [], totalRecords: 0, aggregateValues: [] }), 2), value = _c[0], setValue = _c[1];
|
|
228
|
+
var _d = __read((0, react_1.useState)(false), 2), loading = _d[0], setLoading = _d[1];
|
|
229
|
+
var _e = __read((0, react_1.useState)(0), 2), first = _e[0], setFirst = _e[1];
|
|
230
|
+
var _f = __read((0, react_1.useState)(props.paginator ? props.rows : undefined), 2), rows = _f[0], setRows = _f[1];
|
|
226
231
|
var filtersInit = createInitFilters();
|
|
227
232
|
if (props.filters) {
|
|
228
233
|
filtersInit = __assign(__assign({}, filtersInit), props.filters); // items from props.filters will replace existing items in filtersInit
|
|
@@ -237,19 +242,19 @@ var XLazyDataTable = function (props) {
|
|
|
237
242
|
customFilterItems = XUtilsCommon_1.XUtilsCommon.filterAnd(customFilterItems, XUtils_1.XUtils.evalFilter(props.searchBrowseParams.customFilter));
|
|
238
243
|
}
|
|
239
244
|
}
|
|
240
|
-
var
|
|
245
|
+
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)
|
|
241
246
|
var initFtsInputValue = props.fullTextSearch ? createInitFtsInputValue() : undefined;
|
|
242
|
-
var
|
|
243
|
-
var
|
|
244
|
-
var
|
|
245
|
-
var
|
|
246
|
-
var
|
|
247
|
-
var
|
|
248
|
-
var
|
|
247
|
+
var _h = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValue = _h[0], setFtsInputValue = _h[1];
|
|
248
|
+
var _j = __read((0, react_1.useState)(undefined), 2), optionalCustomFilter = _j[0], setOptionalCustomFilter = _j[1];
|
|
249
|
+
var _k = __read((0, react_1.useState)(props.multilineSwitchInitValue), 2), multilineSwitchValue = _k[0], setMultilineSwitchValue = _k[1];
|
|
250
|
+
var _l = __read((0, react_1.useState)(XUtilsCommon_1.XUtilsCommon.createMultiSortMeta(props.sortField)), 2), multiSortMeta = _l[0], setMultiSortMeta = _l[1];
|
|
251
|
+
var _m = __read((0, react_1.useState)(null), 2), selectedRow = _m[0], setSelectedRow = _m[1];
|
|
252
|
+
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
|
|
253
|
+
var _p = __read((0, react_1.useState)({ dialogOpened: false }), 2), exportRowsDialogState = _p[0], setExportRowsDialogState = _p[1];
|
|
249
254
|
//const [exportRowsDialogRowCount, setExportRowsDialogRowCount] = useState<number>(); // param pre dialog
|
|
250
|
-
var
|
|
251
|
-
var
|
|
252
|
-
var
|
|
255
|
+
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)
|
|
256
|
+
var _r = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValueAfterFiltering = _r[0], setFtsInputValueAfterFiltering = _r[1]; // tak isto ako filtersAfterFiltering
|
|
257
|
+
var _s = __read((0, react_1.useState)(undefined), 2), optionalCustomFilterAfterFiltering = _s[0], setOptionalCustomFilterAfterFiltering = _s[1]; // tak isto ako filtersAfterFiltering
|
|
253
258
|
// parameter [] zabezpeci ze sa metoda zavola len po prvom renderingu (a nie po kazdej zmene stavu (zavolani setNieco()))
|
|
254
259
|
(0, react_1.useEffect)(function () {
|
|
255
260
|
// jednoduchy sposob - nepouzivame parameter props.displayed a priznak dataLoaded
|
|
@@ -318,9 +323,22 @@ var XLazyDataTable = function (props) {
|
|
|
318
323
|
setOptionalCustomFilter(undefined);
|
|
319
324
|
}
|
|
320
325
|
};
|
|
321
|
-
var loadData = function () {
|
|
322
|
-
|
|
323
|
-
|
|
326
|
+
var loadData = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
327
|
+
return __generator(this, function (_a) {
|
|
328
|
+
switch (_a.label) {
|
|
329
|
+
case 0:
|
|
330
|
+
// pre poriadok zaserializujeme obidve operacie (aj ked teoreticky by to malo fungovat aj bez serializovania)
|
|
331
|
+
return [4 /*yield*/, loadXFieldSetMaps()];
|
|
332
|
+
case 1:
|
|
333
|
+
// pre poriadok zaserializujeme obidve operacie (aj ked teoreticky by to malo fungovat aj bez serializovania)
|
|
334
|
+
_a.sent();
|
|
335
|
+
return [4 /*yield*/, loadDataBase(createFindParam())];
|
|
336
|
+
case 2:
|
|
337
|
+
_a.sent();
|
|
338
|
+
return [2 /*return*/];
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
}); };
|
|
324
342
|
var createFindParam = function () {
|
|
325
343
|
return {
|
|
326
344
|
resultType: FindParam_1.ResultType.RowCountAndPagedRows,
|
|
@@ -335,6 +353,42 @@ var XLazyDataTable = function (props) {
|
|
|
335
353
|
aggregateItems: aggregateItems
|
|
336
354
|
};
|
|
337
355
|
};
|
|
356
|
+
var loadXFieldSetMaps = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
357
|
+
var fieldSetIds, xFieldSetMetaList, xFieldSetMapsLocal, xFieldSetMetaList_1, xFieldSetMetaList_1_1, xFieldSetMeta;
|
|
358
|
+
var e_3, _a;
|
|
359
|
+
return __generator(this, function (_b) {
|
|
360
|
+
switch (_b.label) {
|
|
361
|
+
case 0:
|
|
362
|
+
fieldSetIds = getFieldSetIds();
|
|
363
|
+
if (!(fieldSetIds.length > 0)) return [3 /*break*/, 2];
|
|
364
|
+
return [4 /*yield*/, XUtils_1.XUtils.fetchRows('XFieldSetMeta', { where: "[fieldSetId] IN (:...fieldSetIdList)", params: { fieldSetIdList: fieldSetIds } })];
|
|
365
|
+
case 1:
|
|
366
|
+
xFieldSetMetaList = _b.sent();
|
|
367
|
+
// check
|
|
368
|
+
if (xFieldSetMetaList.length !== fieldSetIds.length) {
|
|
369
|
+
throw "One or more of fieldSetIds \"".concat(fieldSetIds.join(", "), "\" was not found in DB in the table for Entity XFieldSetMeta");
|
|
370
|
+
}
|
|
371
|
+
xFieldSetMapsLocal = {};
|
|
372
|
+
try {
|
|
373
|
+
for (xFieldSetMetaList_1 = __values(xFieldSetMetaList), xFieldSetMetaList_1_1 = xFieldSetMetaList_1.next(); !xFieldSetMetaList_1_1.done; xFieldSetMetaList_1_1 = xFieldSetMetaList_1.next()) {
|
|
374
|
+
xFieldSetMeta = xFieldSetMetaList_1_1.value;
|
|
375
|
+
xFieldSetMapsLocal[xFieldSetMeta.fieldSetId] = XFieldSetBase_1.XFieldSetBase.createXFieldXFieldMetaMap(xFieldSetMeta);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
379
|
+
finally {
|
|
380
|
+
try {
|
|
381
|
+
if (xFieldSetMetaList_1_1 && !xFieldSetMetaList_1_1.done && (_a = xFieldSetMetaList_1.return)) _a.call(xFieldSetMetaList_1);
|
|
382
|
+
}
|
|
383
|
+
finally { if (e_3) throw e_3.error; }
|
|
384
|
+
}
|
|
385
|
+
// save created structures
|
|
386
|
+
setXFieldSetMaps(xFieldSetMapsLocal);
|
|
387
|
+
_b.label = 2;
|
|
388
|
+
case 2: return [2 /*return*/];
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
}); };
|
|
338
392
|
var loadDataBase = function (findParam) { return __awaiter(void 0, void 0, void 0, function () {
|
|
339
393
|
var findResult;
|
|
340
394
|
return __generator(this, function (_a) {
|
|
@@ -385,7 +439,7 @@ var XLazyDataTable = function (props) {
|
|
|
385
439
|
var getFields = function (addPropsFields) {
|
|
386
440
|
// krasne zobrazi cely objekt!
|
|
387
441
|
//console.log(dataTableEl.current);
|
|
388
|
-
var
|
|
442
|
+
var e_4, _a;
|
|
389
443
|
var fields = [];
|
|
390
444
|
var columns = dataTableEl.current.props.children;
|
|
391
445
|
try {
|
|
@@ -394,12 +448,12 @@ var XLazyDataTable = function (props) {
|
|
|
394
448
|
fields.push(column.props.field);
|
|
395
449
|
}
|
|
396
450
|
}
|
|
397
|
-
catch (
|
|
451
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
398
452
|
finally {
|
|
399
453
|
try {
|
|
400
454
|
if (columns_3_1 && !columns_3_1.done && (_a = columns_3.return)) _a.call(columns_3);
|
|
401
455
|
}
|
|
402
|
-
finally { if (
|
|
456
|
+
finally { if (e_4) throw e_4.error; }
|
|
403
457
|
}
|
|
404
458
|
if (addPropsFields) {
|
|
405
459
|
if (props.fields) {
|
|
@@ -411,7 +465,7 @@ var XLazyDataTable = function (props) {
|
|
|
411
465
|
var getHeaders = function () {
|
|
412
466
|
// krasne zobrazi cely objekt!
|
|
413
467
|
//console.log(dataTableEl.current);
|
|
414
|
-
var
|
|
468
|
+
var e_5, _a;
|
|
415
469
|
var headers = [];
|
|
416
470
|
var columns = dataTableEl.current.props.children;
|
|
417
471
|
try {
|
|
@@ -421,17 +475,17 @@ var XLazyDataTable = function (props) {
|
|
|
421
475
|
headers.push(column.props.header);
|
|
422
476
|
}
|
|
423
477
|
}
|
|
424
|
-
catch (
|
|
478
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
425
479
|
finally {
|
|
426
480
|
try {
|
|
427
481
|
if (columns_4_1 && !columns_4_1.done && (_a = columns_4.return)) _a.call(columns_4);
|
|
428
482
|
}
|
|
429
|
-
finally { if (
|
|
483
|
+
finally { if (e_5) throw e_5.error; }
|
|
430
484
|
}
|
|
431
485
|
return headers;
|
|
432
486
|
};
|
|
433
487
|
var getWidths = function () {
|
|
434
|
-
var
|
|
488
|
+
var e_6, _a;
|
|
435
489
|
var _b;
|
|
436
490
|
// vrati sirky stlpcov napr. ['7.75rem', '20rem', '8.5rem', '8.5rem', '6rem']
|
|
437
491
|
// nevracia aktualne sirky stlpcov (po manualnom rozsireni) ale tie ktore boli nastavene/vypocitane v kode
|
|
@@ -443,15 +497,37 @@ var XLazyDataTable = function (props) {
|
|
|
443
497
|
widths.push((_b = column.props.headerStyle) === null || _b === void 0 ? void 0 : _b.width);
|
|
444
498
|
}
|
|
445
499
|
}
|
|
446
|
-
catch (
|
|
500
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
447
501
|
finally {
|
|
448
502
|
try {
|
|
449
503
|
if (columns_5_1 && !columns_5_1.done && (_a = columns_5.return)) _a.call(columns_5);
|
|
450
504
|
}
|
|
451
|
-
finally { if (
|
|
505
|
+
finally { if (e_6) throw e_6.error; }
|
|
452
506
|
}
|
|
453
507
|
return widths;
|
|
454
508
|
};
|
|
509
|
+
var getFieldSetIds = function () {
|
|
510
|
+
var e_7, _a;
|
|
511
|
+
var fieldSetIds = [];
|
|
512
|
+
// warning note: props.children are used to get props of XLazyColumn whereas dataTableEl.current.props.children are used to get props of Primereact DataTable
|
|
513
|
+
var columns = props.children;
|
|
514
|
+
try {
|
|
515
|
+
for (var columns_6 = __values(columns), columns_6_1 = columns_6.next(); !columns_6_1.done; columns_6_1 = columns_6.next()) {
|
|
516
|
+
var column = columns_6_1.value;
|
|
517
|
+
if (column.props.fieldSetId) {
|
|
518
|
+
fieldSetIds.push(column.props.fieldSetId);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
523
|
+
finally {
|
|
524
|
+
try {
|
|
525
|
+
if (columns_6_1 && !columns_6_1.done && (_a = columns_6.return)) _a.call(columns_6);
|
|
526
|
+
}
|
|
527
|
+
finally { if (e_7) throw e_7.error; }
|
|
528
|
+
}
|
|
529
|
+
return fieldSetIds;
|
|
530
|
+
};
|
|
455
531
|
var hasContentTypeHtml = function () {
|
|
456
532
|
var columns = props.children;
|
|
457
533
|
return columns.some(function (column) { return column.props.contentType === "html"; });
|
|
@@ -489,7 +565,7 @@ var XLazyDataTable = function (props) {
|
|
|
489
565
|
}
|
|
490
566
|
};
|
|
491
567
|
var onClickRemoveRow = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
492
|
-
var reread,
|
|
568
|
+
var reread, e_8, e_9;
|
|
493
569
|
return __generator(this, function (_a) {
|
|
494
570
|
switch (_a.label) {
|
|
495
571
|
case 0:
|
|
@@ -504,8 +580,8 @@ var XLazyDataTable = function (props) {
|
|
|
504
580
|
reread = _a.sent();
|
|
505
581
|
return [3 /*break*/, 4];
|
|
506
582
|
case 3:
|
|
507
|
-
|
|
508
|
-
XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'),
|
|
583
|
+
e_8 = _a.sent();
|
|
584
|
+
XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_8);
|
|
509
585
|
return [3 /*break*/, 4];
|
|
510
586
|
case 4:
|
|
511
587
|
if (reread) {
|
|
@@ -527,8 +603,8 @@ var XLazyDataTable = function (props) {
|
|
|
527
603
|
_a.sent();
|
|
528
604
|
return [3 /*break*/, 9];
|
|
529
605
|
case 8:
|
|
530
|
-
|
|
531
|
-
XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'),
|
|
606
|
+
e_9 = _a.sent();
|
|
607
|
+
XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_9);
|
|
532
608
|
return [3 /*break*/, 9];
|
|
533
609
|
case 9:
|
|
534
610
|
loadData();
|
|
@@ -702,12 +778,17 @@ var XLazyDataTable = function (props) {
|
|
|
702
778
|
}
|
|
703
779
|
return betweenFilter;
|
|
704
780
|
};
|
|
705
|
-
var valueAsUI = function (value, xField, contentType) {
|
|
781
|
+
var valueAsUI = function (value, xField, contentType, fieldSetId) {
|
|
706
782
|
var valueResult;
|
|
707
783
|
if (xField.type === "boolean") {
|
|
708
784
|
// TODO - efektivnejsie by bolo renderovat len prislusne ikonky
|
|
709
785
|
valueResult = react_1.default.createElement(tristatecheckbox_1.TriStateCheckbox, { value: value, disabled: true });
|
|
710
786
|
}
|
|
787
|
+
else if (xField.type === "jsonb" && fieldSetId) {
|
|
788
|
+
// 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"
|
|
789
|
+
// poznamka: krajsie by bolo brat fieldSetId z xField ale to by sme museli vytvorit decorator na backend-e...
|
|
790
|
+
valueResult = XFieldSetBase_1.XFieldSetBase.xFieldSetValuesAsUI(value, xFieldSetMaps[fieldSetId]);
|
|
791
|
+
}
|
|
711
792
|
else {
|
|
712
793
|
if (contentType === "html") {
|
|
713
794
|
// value should be always string (xField.type === "string")
|
|
@@ -732,11 +813,11 @@ var XLazyDataTable = function (props) {
|
|
|
732
813
|
var bodyValue;
|
|
733
814
|
var rowDataValue = XUtilsCommon_1.XUtilsCommon.getValueOrValueListByPath(rowData, columnProps.field);
|
|
734
815
|
if (Array.isArray(rowDataValue)) {
|
|
735
|
-
var elemList = rowDataValue.map(function (value) { return valueAsUI(value, xField, columnProps.contentType); });
|
|
816
|
+
var elemList = rowDataValue.map(function (value) { return valueAsUI(value, xField, columnProps.contentType, columnProps.fieldSetId); });
|
|
736
817
|
bodyValue = react_1.default.createElement(XMultilineRenderer_1.XMultilineRenderer, { valueList: elemList, renderType: multilineSwitchValue, fewLinesCount: props.multilineSwitchFewLinesCount });
|
|
737
818
|
}
|
|
738
819
|
else {
|
|
739
|
-
bodyValue = valueAsUI(rowDataValue, xField, columnProps.contentType);
|
|
820
|
+
bodyValue = valueAsUI(rowDataValue, xField, columnProps.contentType, columnProps.fieldSetId);
|
|
740
821
|
}
|
|
741
822
|
return bodyValue;
|
|
742
823
|
};
|
|
@@ -471,6 +471,12 @@ function convertValueBase(fieldType, scale, value, fromModel, asUI) {
|
|
|
471
471
|
value = booleanAsUIText(value);
|
|
472
472
|
}
|
|
473
473
|
}
|
|
474
|
+
else if (fieldType === "jsonb") {
|
|
475
|
+
// konverziu z modelu (json objekt-u) netreba
|
|
476
|
+
if (asUI) {
|
|
477
|
+
value = XUtilsCommon_1.XUtilsCommon.objectAsJSON(value);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
474
480
|
else {
|
|
475
481
|
// vsetko ostatne
|
|
476
482
|
if (asUI && asUI !== AsUIType.Excel) {
|