@michalrakus/x-react-web-lib 1.9.0 → 1.10.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/XInputInterval.d.ts +3 -0
- package/XInputInterval.js +5 -0
- package/XInputIntervalBase.d.ts +3 -0
- package/XInputIntervalBase.js +5 -0
- package/gulpfile.js +2 -0
- package/lib/components/XAutoComplete.js +1 -1
- package/lib/components/XCalendar.d.ts +2 -1
- package/lib/components/XCalendar.js +1 -1
- package/lib/components/XDropdownDT.d.ts +3 -0
- package/lib/components/XDropdownDT.js +14 -7
- package/lib/components/XDropdownForEntity.d.ts +1 -0
- package/lib/components/XDropdownForEntity.js +3 -1
- package/lib/components/XFormBase.d.ts +9 -0
- package/lib/components/XFormBase.js +117 -30
- package/lib/components/XFormDataTable2.d.ts +2 -1
- package/lib/components/XFormDataTable2.js +15 -22
- package/lib/components/XInputDate.js +1 -1
- package/lib/components/XInputInterval.d.ts +14 -0
- package/lib/components/XInputInterval.js +56 -0
- package/lib/components/XInputIntervalBase.d.ts +10 -0
- package/lib/components/XInputIntervalBase.js +97 -0
- package/lib/components/XInputIntervalDT.d.ts +11 -0
- package/lib/components/XInputIntervalDT.js +43 -0
- package/lib/components/XLazyDataTable.js +43 -29
- package/lib/components/XSearchButton.js +1 -1
- package/lib/components/XUtils.d.ts +12 -2
- package/lib/components/XUtils.js +51 -14
- package/lib/components/XUtilsConversions.d.ts +3 -0
- package/lib/components/XUtilsConversions.js +53 -1
- package/lib/serverApi/ExportImportParam.d.ts +2 -2
- package/lib/serverApi/FindParam.d.ts +6 -5
- package/lib/serverApi/XUtilsCommon.d.ts +1 -0
- package/lib/serverApi/XUtilsCommon.js +70 -0
- package/package.json +1 -1
package/gulpfile.js
CHANGED
|
@@ -46,6 +46,8 @@ function generateApi(cb) {
|
|
|
46
46
|
"./lib/components/XInputDecimal",
|
|
47
47
|
"./lib/components/XInputDecimalBase",
|
|
48
48
|
"./lib/components/XInputFileList",
|
|
49
|
+
"./lib/components/XInputInterval",
|
|
50
|
+
"./lib/components/XInputIntervalBase",
|
|
49
51
|
"./lib/components/XInputText",
|
|
50
52
|
"./lib/components/XInputTextarea",
|
|
51
53
|
"./lib/components/XLazyDataTable",
|
|
@@ -86,7 +86,7 @@ var XAutoComplete = /** @class */ (function (_super) {
|
|
|
86
86
|
}
|
|
87
87
|
};
|
|
88
88
|
XAutoComplete.prototype.componentDidMount = function () {
|
|
89
|
-
console.log("volany XAutoComplete.componentDidMount()");
|
|
89
|
+
//console.log("volany XAutoComplete.componentDidMount()");
|
|
90
90
|
this.readAndSetSuggestions();
|
|
91
91
|
};
|
|
92
92
|
XAutoComplete.prototype.readAndSetSuggestions = function () {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import React from "react";
|
|
2
2
|
export declare const XCalendar: (props: {
|
|
3
3
|
id?: string | undefined;
|
|
4
4
|
value: Date | null;
|
|
5
5
|
onChange: (value: Date | null) => void;
|
|
6
|
+
onBlur?: ((event: React.FocusEvent<HTMLInputElement, Element>) => void) | undefined;
|
|
6
7
|
readOnly?: boolean | undefined;
|
|
7
8
|
datetime?: boolean | undefined;
|
|
8
9
|
}) => JSX.Element;
|
|
@@ -22,6 +22,6 @@ var XCalendar = function (props) {
|
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
var datetime = (_a = props.datetime) !== null && _a !== void 0 ? _a : false;
|
|
25
|
-
return (react_1.default.createElement(calendar_1.Calendar, { id: props.id, value: props.value, onChange: onChange, disabled: props.readOnly, showIcon: true, showOnFocus: false, dateFormat: (0, XUtilsConversions_1.dateFormatCalendar)(), showTime: datetime, showSeconds: datetime, inputClassName: datetime ? 'x-input-datetime' : 'x-input-date' }));
|
|
25
|
+
return (react_1.default.createElement(calendar_1.Calendar, { id: props.id, value: props.value, onChange: onChange, disabled: props.readOnly, showIcon: true, showOnFocus: false, dateFormat: (0, XUtilsConversions_1.dateFormatCalendar)(), showTime: datetime, showSeconds: datetime, inputClassName: datetime ? 'x-input-datetime' : 'x-input-date', onBlur: props.onBlur }));
|
|
26
26
|
};
|
|
27
27
|
exports.XCalendar = XCalendar;
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { XFormBase } from "./XFormBase";
|
|
3
3
|
import { XDropdownOptionsMap } from "./XFormDataTable2";
|
|
4
|
+
import { XCustomFilter } from "../serverApi/FindParam";
|
|
4
5
|
export declare const XDropdownDT: (props: {
|
|
5
6
|
form: XFormBase;
|
|
6
7
|
entity: string;
|
|
7
8
|
assocField: string;
|
|
8
9
|
displayField: string;
|
|
10
|
+
sortField?: string | undefined;
|
|
11
|
+
filter?: XCustomFilter | undefined;
|
|
9
12
|
dropdownOptionsMap: XDropdownOptionsMap;
|
|
10
13
|
onDropdownOptionsMapChange: (dropdownOptionsMap: XDropdownOptionsMap) => void;
|
|
11
14
|
rowData: any;
|
|
@@ -63,17 +63,22 @@ exports.XDropdownDT = void 0;
|
|
|
63
63
|
var react_1 = __importStar(require("react"));
|
|
64
64
|
var XUtils_1 = require("./XUtils");
|
|
65
65
|
var dropdown_1 = require("primereact/dropdown");
|
|
66
|
+
var XUtilsMetadata_1 = require("./XUtilsMetadata");
|
|
66
67
|
var XDropdownDT = function (props) {
|
|
67
68
|
// poznamka: nacitanie/ulozenie options je vytiahnute do parent komponentu XFormDataTable koli tomu aby sme nenacitavali options pre kazdy riadok tabulky
|
|
69
|
+
// "members"
|
|
70
|
+
var xAssoc = XUtilsMetadata_1.XUtilsMetadata.getXAssocToOne(XUtilsMetadata_1.XUtilsMetadata.getXEntity(props.entity), props.assocField);
|
|
71
|
+
var idField = XUtilsMetadata_1.XUtilsMetadata.getXEntity(xAssoc.entityName).idField;
|
|
68
72
|
// parameter [] zabezpeci ze sa metoda zavola len po prvom renderingu (a nie po kazdej zmene stavu (zavolani setNieco()))
|
|
69
73
|
(0, react_1.useEffect)(function () {
|
|
70
74
|
//console.log("XDropdownDT - zavolany useEffect *******************")
|
|
71
75
|
findOptions();
|
|
72
76
|
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
73
77
|
var findOptions = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
74
|
-
var options;
|
|
75
|
-
|
|
76
|
-
|
|
78
|
+
var options, xAssoc_1;
|
|
79
|
+
var _a;
|
|
80
|
+
return __generator(this, function (_b) {
|
|
81
|
+
switch (_b.label) {
|
|
77
82
|
case 0:
|
|
78
83
|
options = props.dropdownOptionsMap[props.assocField];
|
|
79
84
|
if (!(options === undefined)) return [3 /*break*/, 2];
|
|
@@ -83,15 +88,17 @@ var XDropdownDT = function (props) {
|
|
|
83
88
|
// Nacitanie z DB sa koli asynchronnosti vykona az po zavolani tejto metody pre vsetky riadky tabulky, co je pre nas neskoro.
|
|
84
89
|
// ak by tu tento riadok nebol, tak by sa options nacitavali tolkokrat, kolko je riadkov v tabulke
|
|
85
90
|
props.dropdownOptionsMap[props.assocField] = [];
|
|
86
|
-
|
|
91
|
+
xAssoc_1 = XUtilsMetadata_1.XUtilsMetadata.getXAssocToOne(XUtilsMetadata_1.XUtilsMetadata.getXEntity(props.entity), props.assocField);
|
|
92
|
+
return [4 /*yield*/, XUtils_1.XUtils.fetchRows(xAssoc_1.entityName, props.filter, (_a = props.sortField) !== null && _a !== void 0 ? _a : props.displayField)];
|
|
87
93
|
case 1:
|
|
88
|
-
options =
|
|
94
|
+
//options = await XUtils.fetchMany('findRowsForAssoc', {entity: props.entity, assocField: props.assocField});
|
|
95
|
+
options = _b.sent();
|
|
89
96
|
options.splice(0, 0, {}); // null polozka (nepridavat pre not null atributy)
|
|
90
97
|
props.dropdownOptionsMap[props.assocField] = options;
|
|
91
98
|
//console.log("XDropdownDT - findOptions - citali sme options pre field = " + props.assocField);
|
|
92
99
|
//console.log(props.dropdownOptionsMap);
|
|
93
100
|
props.onDropdownOptionsMapChange(props.dropdownOptionsMap); // vyrenderujeme nacitane hodnoty
|
|
94
|
-
|
|
101
|
+
_b.label = 2;
|
|
95
102
|
case 2: return [2 /*return*/];
|
|
96
103
|
}
|
|
97
104
|
});
|
|
@@ -123,6 +130,6 @@ var XDropdownDT = function (props) {
|
|
|
123
130
|
}
|
|
124
131
|
var options = props.dropdownOptionsMap[props.assocField] !== undefined ? props.dropdownOptionsMap[props.assocField] : []; // mozno mozme do options prasknut rovno undefined...
|
|
125
132
|
// appendTo={document.body} appenduje overlay panel na element body - eliminuje problem s overflow (pozri poznamku v XDropdownDTFilter)
|
|
126
|
-
return (react_1.default.createElement(dropdown_1.Dropdown, { appendTo: document.body, id: props.assocField, optionLabel: props.displayField, value: assocObject, options: options, onChange: function (e) { return onValueChange(props.assocField, props.rowData, e.target.value); } }));
|
|
133
|
+
return (react_1.default.createElement(dropdown_1.Dropdown, { appendTo: document.body, id: props.assocField, optionLabel: props.displayField, value: assocObject, options: options, dataKey: idField, onChange: function (e) { return onValueChange(props.assocField, props.rowData, e.target.value); } }));
|
|
127
134
|
};
|
|
128
135
|
exports.XDropdownDT = XDropdownDT;
|
|
@@ -89,6 +89,7 @@ exports.XDropdownForEntity = void 0;
|
|
|
89
89
|
var react_1 = __importStar(require("react"));
|
|
90
90
|
var dropdown_1 = require("primereact/dropdown");
|
|
91
91
|
var XUtils_1 = require("./XUtils");
|
|
92
|
+
var XUtilsMetadata_1 = require("./XUtilsMetadata");
|
|
92
93
|
// vseobecny Dropdown ktoreho parametrom je entity, zobrazuje zaznamy danej entity, po selectnuti vracia zaznam danej entity
|
|
93
94
|
// ambicia je pouzivat ho vsade - vo formulari, vo filtroch, vo form tabulke, priamo aplikacnym programmerom
|
|
94
95
|
// dalo by sa vyclenit este XDropdownBase, ktory by dostaval ako parameter options (bol by nezavisly od DB), zatial ho nerobime,
|
|
@@ -100,6 +101,7 @@ var XDropdownForEntity = /** @class */ (function (_super) {
|
|
|
100
101
|
__extends(XDropdownForEntity, _super);
|
|
101
102
|
function XDropdownForEntity(props) {
|
|
102
103
|
var _this = _super.call(this, props) || this;
|
|
104
|
+
_this.idField = XUtilsMetadata_1.XUtilsMetadata.getXEntity(_this.props.entity).idField;
|
|
103
105
|
_this.state = {
|
|
104
106
|
options: []
|
|
105
107
|
};
|
|
@@ -142,7 +144,7 @@ var XDropdownForEntity = /** @class */ (function (_super) {
|
|
|
142
144
|
XDropdownForEntity.prototype.render = function () {
|
|
143
145
|
// TODO - mozno by nebolo od veci pouzivat InputText ak readOnly === true (chybala by len sipka (rozbalovac)) a dalo by sa copy-paste-ovat
|
|
144
146
|
// propertiesy na Dropdown-e: readOnly vyseduje, disabled znemoznuje vyber polozky
|
|
145
|
-
return (react_1.default.createElement(dropdown_1.Dropdown, __assign({ id: this.props.id, options: this.state.options, optionLabel: this.props.displayField, value: this.props.value, onChange: this.onChange, readOnly: this.props.readOnly, disabled: this.props.readOnly }, XUtils_1.XUtils.createErrorProps(this.props.error))));
|
|
147
|
+
return (react_1.default.createElement(dropdown_1.Dropdown, __assign({ id: this.props.id, options: this.state.options, optionLabel: this.props.displayField, dataKey: this.idField, value: this.props.value, onChange: this.onChange, readOnly: this.props.readOnly, disabled: this.props.readOnly }, XUtils_1.XUtils.createErrorProps(this.props.error))));
|
|
146
148
|
};
|
|
147
149
|
return XDropdownForEntity;
|
|
148
150
|
}(react_1.Component));
|
|
@@ -24,6 +24,11 @@ export declare abstract class XFormBase extends Component<FormProps> {
|
|
|
24
24
|
} | any;
|
|
25
25
|
xFormComponentList: Array<XFormComponent<any, any>>;
|
|
26
26
|
xFormDataTableList: Array<XFormDataTable2>;
|
|
27
|
+
assocToValidateList: Array<string>;
|
|
28
|
+
assocToSortList: Array<{
|
|
29
|
+
assoc: string;
|
|
30
|
+
sortField: string;
|
|
31
|
+
}>;
|
|
27
32
|
constructor(props: FormProps);
|
|
28
33
|
componentDidMount(): Promise<void>;
|
|
29
34
|
getEntity(): string;
|
|
@@ -45,12 +50,16 @@ export declare abstract class XFormBase extends Component<FormProps> {
|
|
|
45
50
|
addXFormComponent(xFormComponent: XFormComponent<any, any>): void;
|
|
46
51
|
findXFormComponent(field: string): XFormComponent<any, any> | undefined;
|
|
47
52
|
addXFormDataTable(xFormDataTable: XFormDataTable2): void;
|
|
53
|
+
addAssocToValidate(oneToManyAssoc: string): void;
|
|
54
|
+
addAssocToSort(oneToManyAssoc: string, sortField: string): void;
|
|
48
55
|
formReadOnlyBase(field: string): boolean;
|
|
49
56
|
onClickSave(): Promise<void>;
|
|
50
57
|
onClickCancel(): void;
|
|
51
58
|
validateSave(): boolean;
|
|
52
59
|
validateForm(): XErrorMap;
|
|
53
60
|
fieldValidation(): XErrorMap;
|
|
61
|
+
getErrorMessagesForAssoc(oneToManyAssoc: string): string;
|
|
62
|
+
static saveErrorsIntoXRowTechData(row: any, xErrors: XErrors): void;
|
|
54
63
|
formReadOnly(object: XObject, field: string): boolean;
|
|
55
64
|
preInitForm(object: XObject, operationType: OperationType.Insert | OperationType.Update): void;
|
|
56
65
|
validate(object: XObject): XErrors;
|
|
@@ -137,15 +137,18 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
137
137
|
};
|
|
138
138
|
_this.xFormComponentList = [];
|
|
139
139
|
_this.xFormDataTableList = [];
|
|
140
|
+
_this.assocToValidateList = [];
|
|
141
|
+
_this.assocToSortList = [];
|
|
140
142
|
_this.onClickSave = _this.onClickSave.bind(_this);
|
|
141
143
|
_this.onClickCancel = _this.onClickCancel.bind(_this);
|
|
142
144
|
return _this;
|
|
143
145
|
}
|
|
144
146
|
XFormBase.prototype.componentDidMount = function () {
|
|
145
147
|
return __awaiter(this, void 0, void 0, function () {
|
|
146
|
-
var object, operationType;
|
|
147
|
-
|
|
148
|
-
|
|
148
|
+
var object, operationType, _a, _b, assocToSort, assocRowList;
|
|
149
|
+
var e_1, _c;
|
|
150
|
+
return __generator(this, function (_d) {
|
|
151
|
+
switch (_d.label) {
|
|
149
152
|
case 0:
|
|
150
153
|
//console.log("volany XFormBase.componentDidMount()");
|
|
151
154
|
// kontrola (musi byt tu, v konstruktore este property nie je nastavena)
|
|
@@ -157,14 +160,31 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
157
160
|
case 1:
|
|
158
161
|
//console.log('XFormBase.componentDidMount ide nacitat objekt');
|
|
159
162
|
//console.log(this.fields);
|
|
160
|
-
object =
|
|
163
|
+
object = _d.sent();
|
|
161
164
|
operationType = XUtils_1.OperationType.Update;
|
|
165
|
+
try {
|
|
166
|
+
// sortovanie, aby sme nemuseli sortovat v DB (neviem co je efektivnejsie)
|
|
167
|
+
for (_a = __values(this.assocToSortList), _b = _a.next(); !_b.done; _b = _a.next()) {
|
|
168
|
+
assocToSort = _b.value;
|
|
169
|
+
assocRowList = object[assocToSort.assoc];
|
|
170
|
+
if (assocRowList) {
|
|
171
|
+
object[assocToSort.assoc] = XUtils_1.XUtils.arraySort(assocRowList, assocToSort.sortField);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
176
|
+
finally {
|
|
177
|
+
try {
|
|
178
|
+
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
|
|
179
|
+
}
|
|
180
|
+
finally { if (e_1) throw e_1.error; }
|
|
181
|
+
}
|
|
162
182
|
return [3 /*break*/, 3];
|
|
163
183
|
case 2:
|
|
164
184
|
// add new row
|
|
165
185
|
object = this.state.object;
|
|
166
186
|
operationType = XUtils_1.OperationType.Insert;
|
|
167
|
-
|
|
187
|
+
_d.label = 3;
|
|
168
188
|
case 3:
|
|
169
189
|
this.preInitForm(object, operationType);
|
|
170
190
|
//console.log("volany XFormBase.componentDidMount() - ideme setnut object");
|
|
@@ -268,7 +288,7 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
268
288
|
this.setState({ object: object });
|
|
269
289
|
};
|
|
270
290
|
XFormBase.getNextRowId = function (rowList, dataKey) {
|
|
271
|
-
var
|
|
291
|
+
var e_2, _a;
|
|
272
292
|
var maxId = 0;
|
|
273
293
|
try {
|
|
274
294
|
for (var rowList_1 = __values(rowList), rowList_1_1 = rowList_1.next(); !rowList_1_1.done; rowList_1_1 = rowList_1.next()) {
|
|
@@ -279,12 +299,12 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
279
299
|
}
|
|
280
300
|
}
|
|
281
301
|
}
|
|
282
|
-
catch (
|
|
302
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
283
303
|
finally {
|
|
284
304
|
try {
|
|
285
305
|
if (rowList_1_1 && !rowList_1_1.done && (_a = rowList_1.return)) _a.call(rowList_1);
|
|
286
306
|
}
|
|
287
|
-
finally { if (
|
|
307
|
+
finally { if (e_2) throw e_2.error; }
|
|
288
308
|
}
|
|
289
309
|
return maxId + 1;
|
|
290
310
|
};
|
|
@@ -300,7 +320,6 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
300
320
|
// TODO - tu mozno treba setnut funkciu - koli moznej asynchronicite
|
|
301
321
|
this.setState({ object: object });
|
|
302
322
|
};
|
|
303
|
-
// tato metoda (aj vsetky ostatne metody precujuce s row-mi) by mali byt skor na XFormDataTable2 (ta pozna "assocField" (OneToMany asociaciu))
|
|
304
323
|
XFormBase.getXRowTechData = function (row) {
|
|
305
324
|
// ak este nemame rowTechData, tak ho vytvorime
|
|
306
325
|
if (row.__x_rowTechData === undefined) {
|
|
@@ -322,7 +341,7 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
322
341
|
this.xFormComponentList.push(xFormComponent);
|
|
323
342
|
};
|
|
324
343
|
XFormBase.prototype.findXFormComponent = function (field) {
|
|
325
|
-
var
|
|
344
|
+
var e_3, _a;
|
|
326
345
|
try {
|
|
327
346
|
// TODO - vytvorit mapu (field, ref(xFormComponent)), bude to rychlejsie
|
|
328
347
|
// vytvorit len mapu (a list zrusit) je problem - mozme mat pre jeden field viacero (napr. asociacnych) componentov
|
|
@@ -333,25 +352,31 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
333
352
|
}
|
|
334
353
|
}
|
|
335
354
|
}
|
|
336
|
-
catch (
|
|
355
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
337
356
|
finally {
|
|
338
357
|
try {
|
|
339
358
|
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
340
359
|
}
|
|
341
|
-
finally { if (
|
|
360
|
+
finally { if (e_3) throw e_3.error; }
|
|
342
361
|
}
|
|
343
362
|
return undefined;
|
|
344
363
|
};
|
|
345
364
|
XFormBase.prototype.addXFormDataTable = function (xFormDataTable) {
|
|
346
365
|
this.xFormDataTableList.push(xFormDataTable);
|
|
347
366
|
};
|
|
367
|
+
XFormBase.prototype.addAssocToValidate = function (oneToManyAssoc) {
|
|
368
|
+
this.assocToValidateList.push(oneToManyAssoc);
|
|
369
|
+
};
|
|
370
|
+
XFormBase.prototype.addAssocToSort = function (oneToManyAssoc, sortField) {
|
|
371
|
+
this.assocToSortList.push({ assoc: oneToManyAssoc, sortField: sortField });
|
|
372
|
+
};
|
|
348
373
|
XFormBase.prototype.formReadOnlyBase = function (field) {
|
|
349
374
|
// TODO - bude this.state.object vzdycky !== undefined?
|
|
350
375
|
return this.formReadOnly(this.state.object, field);
|
|
351
376
|
};
|
|
352
377
|
XFormBase.prototype.onClickSave = function () {
|
|
353
378
|
return __awaiter(this, void 0, void 0, function () {
|
|
354
|
-
var isAddRow, object,
|
|
379
|
+
var isAddRow, object, e_4;
|
|
355
380
|
return __generator(this, function (_a) {
|
|
356
381
|
switch (_a.label) {
|
|
357
382
|
case 0:
|
|
@@ -381,8 +406,8 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
381
406
|
object = _a.sent();
|
|
382
407
|
return [3 /*break*/, 4];
|
|
383
408
|
case 3:
|
|
384
|
-
|
|
385
|
-
XUtils_1.XUtils.showErrorMessage("Save row failed.",
|
|
409
|
+
e_4 = _a.sent();
|
|
410
|
+
XUtils_1.XUtils.showErrorMessage("Save row failed.", e_4);
|
|
386
411
|
return [2 /*return*/]; // zostavame vo formulari
|
|
387
412
|
case 4:
|
|
388
413
|
if (this.props.onSaveOrCancel !== undefined) {
|
|
@@ -409,23 +434,39 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
409
434
|
}
|
|
410
435
|
};
|
|
411
436
|
XFormBase.prototype.validateSave = function () {
|
|
412
|
-
var
|
|
437
|
+
var e_5, _a, e_6, _b;
|
|
413
438
|
var xErrorMap = this.validateForm();
|
|
414
439
|
// zatial takto jednoducho
|
|
415
440
|
var msg = XUtils_1.XUtils.getErrorMessages(xErrorMap);
|
|
416
441
|
try {
|
|
417
442
|
// este spracujeme editovatelne tabulky
|
|
418
|
-
for (var
|
|
419
|
-
var xFormDataTable =
|
|
420
|
-
msg += xFormDataTable.getErrorMessages();
|
|
443
|
+
for (var _c = __values(this.xFormDataTableList), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
444
|
+
var xFormDataTable = _d.value;
|
|
445
|
+
//msg += xFormDataTable.getErrorMessages();
|
|
446
|
+
msg += this.getErrorMessagesForAssoc(xFormDataTable.props.assocField);
|
|
421
447
|
}
|
|
422
448
|
}
|
|
423
|
-
catch (
|
|
449
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
424
450
|
finally {
|
|
425
451
|
try {
|
|
426
|
-
if (
|
|
452
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
453
|
+
}
|
|
454
|
+
finally { if (e_5) throw e_5.error; }
|
|
455
|
+
}
|
|
456
|
+
try {
|
|
457
|
+
// este spracujeme oneToMany asociacie, ktore boli explicitne uvedene, ze ich treba validovat
|
|
458
|
+
// (validaciu treba nakodit vo formulari, zavolat z metody validate() a ukoncit zavolanim XFormBase.saveErrorsIntoXRowTechData)
|
|
459
|
+
for (var _e = __values(this.assocToValidateList), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
460
|
+
var assocToValidate = _f.value;
|
|
461
|
+
msg += this.getErrorMessagesForAssoc(assocToValidate);
|
|
427
462
|
}
|
|
428
|
-
|
|
463
|
+
}
|
|
464
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
465
|
+
finally {
|
|
466
|
+
try {
|
|
467
|
+
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
468
|
+
}
|
|
469
|
+
finally { if (e_6) throw e_6.error; }
|
|
429
470
|
}
|
|
430
471
|
var ok = true;
|
|
431
472
|
if (msg !== "") {
|
|
@@ -435,7 +476,7 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
435
476
|
return ok;
|
|
436
477
|
};
|
|
437
478
|
XFormBase.prototype.validateForm = function () {
|
|
438
|
-
var
|
|
479
|
+
var e_7, _a;
|
|
439
480
|
var xErrorMap = this.fieldValidation();
|
|
440
481
|
// form validation
|
|
441
482
|
var xErrors = this.validate(this.getXObject());
|
|
@@ -450,12 +491,12 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
450
491
|
}
|
|
451
492
|
}
|
|
452
493
|
}
|
|
453
|
-
catch (
|
|
494
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
454
495
|
finally {
|
|
455
496
|
try {
|
|
456
497
|
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
457
498
|
}
|
|
458
|
-
finally { if (
|
|
499
|
+
finally { if (e_7) throw e_7.error; }
|
|
459
500
|
}
|
|
460
501
|
// TODO - optimalizacia - netreba setovat stav ak by sme sli prec z formulara (ak by zbehla validacia aj save a isli by sme naspet do browsu)
|
|
461
502
|
// setujeme aj this.state.object, lebo mohli pribudnut/odbudnut chyby na rowData v editovatelnych tabulkach
|
|
@@ -463,7 +504,7 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
463
504
|
return xErrorMap;
|
|
464
505
|
};
|
|
465
506
|
XFormBase.prototype.fieldValidation = function () {
|
|
466
|
-
var
|
|
507
|
+
var e_8, _a, e_9, _b;
|
|
467
508
|
var xErrorMap = {};
|
|
468
509
|
try {
|
|
469
510
|
for (var _c = __values(this.xFormComponentList), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
@@ -475,12 +516,12 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
475
516
|
}
|
|
476
517
|
}
|
|
477
518
|
}
|
|
478
|
-
catch (
|
|
519
|
+
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
479
520
|
finally {
|
|
480
521
|
try {
|
|
481
522
|
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
482
523
|
}
|
|
483
|
-
finally { if (
|
|
524
|
+
finally { if (e_8) throw e_8.error; }
|
|
484
525
|
}
|
|
485
526
|
try {
|
|
486
527
|
for (var _e = __values(this.xFormDataTableList), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
@@ -488,15 +529,61 @@ var XFormBase = /** @class */ (function (_super) {
|
|
|
488
529
|
xFormDataTable.validate();
|
|
489
530
|
}
|
|
490
531
|
}
|
|
491
|
-
catch (
|
|
532
|
+
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
492
533
|
finally {
|
|
493
534
|
try {
|
|
494
535
|
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
495
536
|
}
|
|
496
|
-
finally { if (
|
|
537
|
+
finally { if (e_9) throw e_9.error; }
|
|
497
538
|
}
|
|
498
539
|
return xErrorMap;
|
|
499
540
|
};
|
|
541
|
+
XFormBase.prototype.getErrorMessagesForAssoc = function (oneToManyAssoc) {
|
|
542
|
+
var e_10, _a;
|
|
543
|
+
var msg = "";
|
|
544
|
+
var object = this.getXObject();
|
|
545
|
+
var rowList = object[oneToManyAssoc];
|
|
546
|
+
if (!Array.isArray(rowList)) {
|
|
547
|
+
throw "Array for the assoc ".concat(oneToManyAssoc, " not found in the form object");
|
|
548
|
+
}
|
|
549
|
+
try {
|
|
550
|
+
for (var rowList_2 = __values(rowList), rowList_2_1 = rowList_2.next(); !rowList_2_1.done; rowList_2_1 = rowList_2.next()) {
|
|
551
|
+
var row = rowList_2_1.value;
|
|
552
|
+
var xRowTechData = XFormBase.getXRowTechData(row);
|
|
553
|
+
msg += XUtils_1.XUtils.getErrorMessages(xRowTechData.errorMap);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
catch (e_10_1) { e_10 = { error: e_10_1 }; }
|
|
557
|
+
finally {
|
|
558
|
+
try {
|
|
559
|
+
if (rowList_2_1 && !rowList_2_1.done && (_a = rowList_2.return)) _a.call(rowList_2);
|
|
560
|
+
}
|
|
561
|
+
finally { if (e_10) throw e_10.error; }
|
|
562
|
+
}
|
|
563
|
+
return msg;
|
|
564
|
+
};
|
|
565
|
+
// can be called from AppForm in case of custom validation on oneToMany assoc
|
|
566
|
+
XFormBase.saveErrorsIntoXRowTechData = function (row, xErrors) {
|
|
567
|
+
var e_11, _a;
|
|
568
|
+
var xErrorMap = {};
|
|
569
|
+
try {
|
|
570
|
+
for (var _b = __values(Object.entries(xErrors)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
571
|
+
var _d = __read(_c.value, 2), field = _d[0], error = _d[1];
|
|
572
|
+
if (error) {
|
|
573
|
+
xErrorMap[field] = { form: error };
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
catch (e_11_1) { e_11 = { error: e_11_1 }; }
|
|
578
|
+
finally {
|
|
579
|
+
try {
|
|
580
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
581
|
+
}
|
|
582
|
+
finally { if (e_11) throw e_11.error; }
|
|
583
|
+
}
|
|
584
|
+
var xRowTechData = XFormBase.getXRowTechData(row);
|
|
585
|
+
xRowTechData.errorMap = xErrorMap;
|
|
586
|
+
};
|
|
500
587
|
// this method can be overriden in subclass if needed
|
|
501
588
|
// (the purpose is to put the whole form to read only mode (maybe with exception a few fields))
|
|
502
589
|
// if returns true for the param "field", then the field is read only, otherwise the property readOnly of the XInput* is processed
|
|
@@ -83,7 +83,6 @@ export declare class XFormDataTable2 extends Component<XFormDataTableProps> {
|
|
|
83
83
|
onClickRemoveRowBySelection(): void;
|
|
84
84
|
removeRow(row: any): void;
|
|
85
85
|
validate(): void;
|
|
86
|
-
getErrorMessages(): string;
|
|
87
86
|
isReadOnly(): boolean;
|
|
88
87
|
render(): JSX.Element;
|
|
89
88
|
}
|
|
@@ -104,6 +103,8 @@ export interface XFormInputSimpleColumnProps extends XFormColumnProps {
|
|
|
104
103
|
export interface XFormDropdownColumnProps extends XFormColumnProps {
|
|
105
104
|
assocField: string;
|
|
106
105
|
displayField: string;
|
|
106
|
+
sortField?: string;
|
|
107
|
+
filter?: XCustomFilter;
|
|
107
108
|
}
|
|
108
109
|
export interface XFormAutoCompleteColumnProps extends XFormColumnProps {
|
|
109
110
|
assocField: string;
|
|
@@ -80,6 +80,7 @@ var api_1 = require("primereact/api");
|
|
|
80
80
|
var XAutoCompleteDT_1 = require("./XAutoCompleteDT");
|
|
81
81
|
var XButtonIconNarrow_1 = require("./XButtonIconNarrow");
|
|
82
82
|
var XLocale_1 = require("./XLocale");
|
|
83
|
+
var XInputIntervalDT_1 = require("./XInputIntervalDT");
|
|
83
84
|
var XFormDataTable2 = /** @class */ (function (_super) {
|
|
84
85
|
__extends(XFormDataTable2, _super);
|
|
85
86
|
function XFormDataTable2(props) {
|
|
@@ -349,6 +350,9 @@ var XFormDataTable2 = /** @class */ (function (_super) {
|
|
|
349
350
|
else if (xField.type === "date" || xField.type === "datetime") {
|
|
350
351
|
body = react_1.default.createElement(XInputDateDT_1.XInputDateDT, { form: this.props.form, xField: xField, field: columnPropsInputSimple.field, rowData: rowData, readOnly: readOnly });
|
|
351
352
|
}
|
|
353
|
+
else if (xField.type === "interval") {
|
|
354
|
+
body = react_1.default.createElement(XInputIntervalDT_1.XInputIntervalDT, { form: this.props.form, entity: this.getEntity(), field: columnPropsInputSimple.field, rowData: rowData, readOnly: readOnly });
|
|
355
|
+
}
|
|
352
356
|
else if (xField.type === "boolean") {
|
|
353
357
|
body = react_1.default.createElement(XCheckboxDT_1.XCheckboxDT, { form: this.props.form, xField: xField, field: columnPropsInputSimple.field, rowData: rowData, readOnly: readOnly });
|
|
354
358
|
}
|
|
@@ -359,7 +363,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
|
|
|
359
363
|
}
|
|
360
364
|
else if (columnProps.type === "dropdown") {
|
|
361
365
|
var columnPropsDropdown = columnProps;
|
|
362
|
-
body = react_1.default.createElement(XDropdownDT_1.XDropdownDT, { form: this.props.form, entity: this.getEntity(), assocField: columnPropsDropdown.assocField, displayField: columnPropsDropdown.displayField, dropdownOptionsMap: this.state.dropdownOptionsMap, onDropdownOptionsMapChange: this.onDropdownOptionsMapChange, rowData: rowData });
|
|
366
|
+
body = react_1.default.createElement(XDropdownDT_1.XDropdownDT, { form: this.props.form, entity: this.getEntity(), assocField: columnPropsDropdown.assocField, displayField: columnPropsDropdown.displayField, sortField: columnPropsDropdown.sortField, filter: columnPropsDropdown.filter, dropdownOptionsMap: this.state.dropdownOptionsMap, onDropdownOptionsMapChange: this.onDropdownOptionsMapChange, rowData: rowData });
|
|
363
367
|
}
|
|
364
368
|
else if (columnProps.type === "autoComplete") {
|
|
365
369
|
var columnPropsAutoComplete = columnProps;
|
|
@@ -444,27 +448,16 @@ var XFormDataTable2 = /** @class */ (function (_super) {
|
|
|
444
448
|
finally { if (e_3) throw e_3.error; }
|
|
445
449
|
}
|
|
446
450
|
};
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
460
|
-
finally {
|
|
461
|
-
try {
|
|
462
|
-
if (rowList_2_1 && !rowList_2_1.done && (_a = rowList_2.return)) _a.call(rowList_2);
|
|
463
|
-
}
|
|
464
|
-
finally { if (e_5) throw e_5.error; }
|
|
465
|
-
}
|
|
466
|
-
return msg;
|
|
467
|
-
};
|
|
451
|
+
// getErrorMessages(): string {
|
|
452
|
+
// let msg: string = "";
|
|
453
|
+
// const object: XObject = this.props.form.getXObject();
|
|
454
|
+
// const rowList: any[] = object[this.props.assocField];
|
|
455
|
+
// for (const row of rowList) {
|
|
456
|
+
// const xRowTechData: XRowTechData = XFormBase.getXRowTechData(row);
|
|
457
|
+
// msg += XUtils.getErrorMessages(xRowTechData.errorMap);
|
|
458
|
+
// }
|
|
459
|
+
// return msg;
|
|
460
|
+
// }
|
|
468
461
|
// TODO - velmi podobna funkcia ako XFormComponent.isReadOnly() - zjednotit ak sa da
|
|
469
462
|
XFormDataTable2.prototype.isReadOnly = function () {
|
|
470
463
|
var readOnly;
|
|
@@ -56,7 +56,7 @@ var XInputDate = /** @class */ (function (_super) {
|
|
|
56
56
|
// note: style overrides size (width of the input according to character count)
|
|
57
57
|
return (react_1.default.createElement("div", { className: "field grid" },
|
|
58
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' })));
|
|
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', onBlur: this.onBlur })));
|
|
60
60
|
};
|
|
61
61
|
return XInputDate;
|
|
62
62
|
}(XInput_1.XInput));
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { XFormComponentProps } from "./XFormComponent";
|
|
3
|
+
import { XInput } from "./XInput";
|
|
4
|
+
import { IPostgresInterval } from "./XUtils";
|
|
5
|
+
export interface XInputIntervalProps extends XFormComponentProps<number> {
|
|
6
|
+
field: string;
|
|
7
|
+
inputStyle?: React.CSSProperties;
|
|
8
|
+
}
|
|
9
|
+
export declare class XInputInterval extends XInput<number, XInputIntervalProps> {
|
|
10
|
+
constructor(props: XInputIntervalProps);
|
|
11
|
+
getValue(): IPostgresInterval | null;
|
|
12
|
+
onValueChange(value: IPostgresInterval | null): void;
|
|
13
|
+
render(): JSX.Element;
|
|
14
|
+
}
|