@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.
Files changed (34) hide show
  1. package/XInputInterval.d.ts +3 -0
  2. package/XInputInterval.js +5 -0
  3. package/XInputIntervalBase.d.ts +3 -0
  4. package/XInputIntervalBase.js +5 -0
  5. package/gulpfile.js +2 -0
  6. package/lib/components/XAutoComplete.js +1 -1
  7. package/lib/components/XCalendar.d.ts +2 -1
  8. package/lib/components/XCalendar.js +1 -1
  9. package/lib/components/XDropdownDT.d.ts +3 -0
  10. package/lib/components/XDropdownDT.js +14 -7
  11. package/lib/components/XDropdownForEntity.d.ts +1 -0
  12. package/lib/components/XDropdownForEntity.js +3 -1
  13. package/lib/components/XFormBase.d.ts +9 -0
  14. package/lib/components/XFormBase.js +117 -30
  15. package/lib/components/XFormDataTable2.d.ts +2 -1
  16. package/lib/components/XFormDataTable2.js +15 -22
  17. package/lib/components/XInputDate.js +1 -1
  18. package/lib/components/XInputInterval.d.ts +14 -0
  19. package/lib/components/XInputInterval.js +56 -0
  20. package/lib/components/XInputIntervalBase.d.ts +10 -0
  21. package/lib/components/XInputIntervalBase.js +97 -0
  22. package/lib/components/XInputIntervalDT.d.ts +11 -0
  23. package/lib/components/XInputIntervalDT.js +43 -0
  24. package/lib/components/XLazyDataTable.js +43 -29
  25. package/lib/components/XSearchButton.js +1 -1
  26. package/lib/components/XUtils.d.ts +12 -2
  27. package/lib/components/XUtils.js +51 -14
  28. package/lib/components/XUtilsConversions.d.ts +3 -0
  29. package/lib/components/XUtilsConversions.js +53 -1
  30. package/lib/serverApi/ExportImportParam.d.ts +2 -2
  31. package/lib/serverApi/FindParam.d.ts +6 -5
  32. package/lib/serverApi/XUtilsCommon.d.ts +1 -0
  33. package/lib/serverApi/XUtilsCommon.js +70 -0
  34. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ // generated by gulp
2
+
3
+ export * from './lib/components/XInputInterval';
@@ -0,0 +1,5 @@
1
+ // generated by gulp
2
+
3
+ 'use strict';
4
+
5
+ module.exports = require('./lib/components/XInputInterval.js');
@@ -0,0 +1,3 @@
1
+ // generated by gulp
2
+
3
+ export * from './lib/components/XInputIntervalBase';
@@ -0,0 +1,5 @@
1
+ // generated by gulp
2
+
3
+ 'use strict';
4
+
5
+ module.exports = require('./lib/components/XInputIntervalBase.js');
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
- /// <reference types="react" />
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
- return __generator(this, function (_a) {
76
- switch (_a.label) {
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
- return [4 /*yield*/, XUtils_1.XUtils.fetchMany('findRowsForAssoc', { entity: props.entity, assocField: props.assocField })];
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 = _a.sent();
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
- _a.label = 2;
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;
@@ -14,6 +14,7 @@ export interface XDropdownForEntityProps {
14
14
  filter?: XCustomFilter;
15
15
  }
16
16
  export declare class XDropdownForEntity extends Component<XDropdownForEntityProps> {
17
+ protected idField: string;
17
18
  state: {
18
19
  options: any[];
19
20
  };
@@ -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
- return __generator(this, function (_a) {
148
- switch (_a.label) {
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 = _a.sent();
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
- _a.label = 3;
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 e_1, _a;
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 (e_1_1) { e_1 = { error: e_1_1 }; }
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 (e_1) throw e_1.error; }
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 e_2, _a;
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 (e_2_1) { e_2 = { error: e_2_1 }; }
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 (e_2) throw e_2.error; }
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, e_3;
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
- e_3 = _a.sent();
385
- XUtils_1.XUtils.showErrorMessage("Save row failed.", e_3);
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 e_4, _a;
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 _b = __values(this.xFormDataTableList), _c = _b.next(); !_c.done; _c = _b.next()) {
419
- var xFormDataTable = _c.value;
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 (e_4_1) { e_4 = { error: e_4_1 }; }
449
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
424
450
  finally {
425
451
  try {
426
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
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
- finally { if (e_4) throw e_4.error; }
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 e_5, _a;
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 (e_5_1) { e_5 = { error: e_5_1 }; }
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 (e_5) throw e_5.error; }
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 e_6, _a, e_7, _b;
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 (e_6_1) { e_6 = { error: e_6_1 }; }
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 (e_6) throw e_6.error; }
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 (e_7_1) { e_7 = { error: e_7_1 }; }
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 (e_7) throw e_7.error; }
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
- XFormDataTable2.prototype.getErrorMessages = function () {
448
- var e_5, _a;
449
- var msg = "";
450
- var object = this.props.form.getXObject();
451
- var rowList = object[this.props.assocField];
452
- try {
453
- for (var rowList_2 = __values(rowList), rowList_2_1 = rowList_2.next(); !rowList_2_1.done; rowList_2_1 = rowList_2.next()) {
454
- var row = rowList_2_1.value;
455
- var xRowTechData = XFormBase_1.XFormBase.getXRowTechData(row);
456
- msg += XUtils_1.XUtils.getErrorMessages(xRowTechData.errorMap);
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
+ }