@michalrakus/x-react-web-lib 1.1.0 → 1.2.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 (61) hide show
  1. package/FindParam.d.ts +3 -0
  2. package/FindParam.js +5 -0
  3. package/XButtonIconNarrow.d.ts +3 -0
  4. package/XButtonIconNarrow.js +5 -0
  5. package/XButtonIconSmall.d.ts +3 -0
  6. package/XButtonIconSmall.js +5 -0
  7. package/XFieldChangeEvent.d.ts +3 -0
  8. package/XFieldChangeEvent.js +5 -0
  9. package/gulpfile.js +4 -0
  10. package/lib/components/SearchTableParams.d.ts +8 -2
  11. package/lib/components/XAutoComplete.d.ts +7 -4
  12. package/lib/components/XAutoComplete.js +21 -6
  13. package/lib/components/XAutoCompleteBase.d.ts +7 -4
  14. package/lib/components/XAutoCompleteBase.js +65 -26
  15. package/lib/components/XAutoCompleteDT.d.ts +33 -0
  16. package/lib/components/XAutoCompleteDT.js +141 -0
  17. package/lib/components/XButton.d.ts +3 -1
  18. package/lib/components/XButton.js +1 -1
  19. package/lib/components/XButtonIconNarrow.d.ts +10 -0
  20. package/lib/components/XButtonIconNarrow.js +25 -0
  21. package/lib/components/XButtonIconSmall.d.ts +3 -1
  22. package/lib/components/XCheckbox.d.ts +2 -2
  23. package/lib/components/XDropdown.d.ts +3 -2
  24. package/lib/components/XDropdown.js +1 -1
  25. package/lib/components/XFieldChangeEvent.d.ts +11 -0
  26. package/lib/components/XFieldChangeEvent.js +2 -0
  27. package/lib/components/XFormBase.d.ts +17 -9
  28. package/lib/components/XFormBase.js +85 -34
  29. package/lib/components/XFormComponent.d.ts +11 -3
  30. package/lib/components/XFormComponent.js +29 -3
  31. package/lib/components/XFormComponentDT.d.ts +30 -0
  32. package/lib/components/XFormComponentDT.js +119 -0
  33. package/lib/components/XFormDataTable2.d.ts +46 -6
  34. package/lib/components/XFormDataTable2.js +170 -40
  35. package/lib/components/XInput.d.ts +2 -2
  36. package/lib/components/XInputDT.d.ts +11 -0
  37. package/lib/components/XInputDT.js +37 -0
  38. package/lib/components/XInputDate.d.ts +2 -1
  39. package/lib/components/XInputDate.js +4 -2
  40. package/lib/components/XInputDecimal.d.ts +9 -2
  41. package/lib/components/XInputDecimal.js +62 -45
  42. package/lib/components/XInputDecimalDT.d.ts +10 -8
  43. package/lib/components/XInputDecimalDT.js +58 -36
  44. package/lib/components/XInputText.d.ts +3 -2
  45. package/lib/components/XInputText.js +7 -1
  46. package/lib/components/XInputTextarea.d.ts +2 -2
  47. package/lib/components/XLazyDataTable.d.ts +5 -0
  48. package/lib/components/XLazyDataTable.js +38 -23
  49. package/lib/components/XSearchButton.d.ts +6 -4
  50. package/lib/components/XSearchButton.js +19 -17
  51. package/lib/components/XSearchButtonDT.js +3 -3
  52. package/lib/components/XUtils.d.ts +12 -2
  53. package/lib/components/XUtils.js +94 -1
  54. package/lib/components/XUtilsConversions.d.ts +1 -0
  55. package/lib/components/XUtilsConversions.js +14 -1
  56. package/lib/components/XUtilsMetadata.d.ts +4 -1
  57. package/lib/components/XUtilsMetadata.js +46 -7
  58. package/lib/serverApi/FindParam.d.ts +10 -2
  59. package/lib/serverApi/XUtilsCommon.d.ts +1 -0
  60. package/lib/serverApi/XUtilsCommon.js +4 -0
  61. package/package.json +1 -1
@@ -3,6 +3,16 @@ import { Component, ReactChild } from "react";
3
3
  import { DataTableFilterMeta } from "primereact/datatable";
4
4
  import { XEntity, XField } from "../serverApi/XEntityMetadata";
5
5
  import { FilterMatchMode } from "primereact/api";
6
+ import { XTableFieldChangeEvent } from "./XFieldChangeEvent";
7
+ import { XCustomFilter } from "../serverApi/FindParam";
8
+ import { XFormComponentDT } from "./XFormComponentDT";
9
+ import { XErrorMap } from "./XErrors";
10
+ import { IconType } from "primereact/utils";
11
+ import { ButtonProps } from "primereact/button";
12
+ export interface XRowTechData {
13
+ xFormComponentDTList: Array<XFormComponentDT<any>>;
14
+ errorMap: XErrorMap;
15
+ }
6
16
  export interface XDropdownOptionsMap {
7
17
  [assocField: string]: any[];
8
18
  }
@@ -12,7 +22,8 @@ export interface XFormDataTableProps {
12
22
  dataKey?: string;
13
23
  paginator?: boolean;
14
24
  rows?: number;
15
- filterDisplay: "menu" | "row";
25
+ filterDisplay: "menu" | "row" | "none";
26
+ sortable: boolean;
16
27
  scrollable: boolean;
17
28
  scrollWidth?: string;
18
29
  scrollHeight?: string;
@@ -20,17 +31,26 @@ export interface XFormDataTableProps {
20
31
  label?: string;
21
32
  readOnly?: boolean;
22
33
  onClickAddRow?: () => void;
23
- onClickRemoveRow?: () => void;
34
+ onClickRemoveRow?: (row: any) => void;
35
+ removeButtonInRow: boolean;
36
+ addRowLabel: string;
37
+ addRowIcon?: IconType<ButtonProps>;
38
+ removeRowLabel: string;
39
+ removeRowIcon?: IconType<ButtonProps>;
24
40
  width?: string;
25
41
  children: ReactChild[];
26
42
  }
27
43
  export declare class XFormDataTable2 extends Component<XFormDataTableProps> {
28
44
  static defaultProps: {
29
45
  filterDisplay: string;
46
+ sortable: boolean;
30
47
  scrollable: boolean;
31
48
  scrollWidth: string;
32
49
  scrollHeight: string;
33
50
  shrinkWidth: boolean;
51
+ removeButtonInRow: boolean;
52
+ addRowLabel: string;
53
+ removeRowLabel: string;
34
54
  };
35
55
  props: XFormDataTableProps;
36
56
  entity?: string;
@@ -42,7 +62,8 @@ export declare class XFormDataTable2 extends Component<XFormDataTableProps> {
42
62
  filters: DataTableFilterMeta;
43
63
  };
44
64
  constructor(props: XFormDataTableProps);
45
- static getPathForColumn(columnProps: XFormColumnProps): string;
65
+ getPathForColumn(columnProps: XFormColumnProps): string;
66
+ getDisplayFieldOrId(columnPropsAutoComplete: XFormAutoCompleteColumnProps): string;
46
67
  static getHeader(columnProps: XFormColumnProps, xEntity: XEntity, field: string, xField: XField): string;
47
68
  getEntity(): string;
48
69
  createInitFilters(): DataTableFilterMeta;
@@ -55,17 +76,23 @@ export declare class XFormDataTable2 extends Component<XFormDataTableProps> {
55
76
  onDropdownFilterChange(field: string, displayValue: any): void;
56
77
  getDropdownFilterValue(field: string): any;
57
78
  bodyTemplate(columnProps: XFormColumnProps, rowData: any, xEntity: XEntity): any;
58
- onClickAddRowDefault(): void;
59
- onClickRemoveRowDefault(): void;
79
+ onClickAddRow(): void;
80
+ onClickRemoveRowBySelection(): void;
81
+ removeRow(row: any): void;
82
+ validate(): void;
83
+ getErrorMessages(): string;
60
84
  render(): JSX.Element;
61
85
  }
86
+ export type TableFieldOnChange = (e: XTableFieldChangeEvent<any, any>) => void;
87
+ export type XTableFieldFilterProp = XCustomFilter | ((object: any, rowData: any) => XCustomFilter | undefined);
62
88
  export interface XFormColumnProps {
63
- type: string;
89
+ type: "inputSimple" | "dropdown" | "autoComplete" | "searchButton";
64
90
  header?: any;
65
91
  readOnly?: boolean;
66
92
  dropdownInFilter?: boolean;
67
93
  showFilterMenu?: boolean;
68
94
  width?: string;
95
+ onChange?: TableFieldOnChange;
69
96
  }
70
97
  export interface XFormInputSimpleColumnProps extends XFormColumnProps {
71
98
  field: string;
@@ -74,6 +101,13 @@ export interface XFormDropdownColumnProps extends XFormColumnProps {
74
101
  assocField: string;
75
102
  displayField: string;
76
103
  }
104
+ export interface XFormAutoCompleteColumnProps extends XFormColumnProps {
105
+ assocField: string;
106
+ displayField: string | ((suggestion: any) => string);
107
+ searchTable?: any;
108
+ assocForm?: any;
109
+ filter?: XTableFieldFilterProp;
110
+ }
77
111
  export interface XFormSearchButtonColumnProps extends XFormColumnProps {
78
112
  assocField: string;
79
113
  displayField: string;
@@ -91,6 +125,12 @@ export declare const XFormDropdownColumn: {
91
125
  type: string;
92
126
  };
93
127
  };
128
+ export declare const XFormAutoCompleteColumn: {
129
+ (props: XFormAutoCompleteColumnProps): null;
130
+ defaultProps: {
131
+ type: string;
132
+ };
133
+ };
94
134
  export declare const XFormSearchButtonColumn: {
95
135
  (props: XFormSearchButtonColumnProps): null;
96
136
  defaultProps: {
@@ -60,7 +60,8 @@ var __values = (this && this.__values) || function(o) {
60
60
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
61
61
  };
62
62
  Object.defineProperty(exports, "__esModule", { value: true });
63
- exports.XFormSearchButtonColumn = exports.XFormDropdownColumn = exports.XFormColumn = exports.XFormDataTable2 = void 0;
63
+ exports.XFormSearchButtonColumn = exports.XFormAutoCompleteColumn = exports.XFormDropdownColumn = exports.XFormColumn = exports.XFormDataTable2 = void 0;
64
+ var XFormBase_1 = require("./XFormBase");
64
65
  var react_1 = __importStar(require("react"));
65
66
  var XDropdownDT_1 = require("./XDropdownDT");
66
67
  var datatable_1 = require("primereact/datatable");
@@ -76,6 +77,8 @@ var XInputDateDT_1 = require("./XInputDateDT");
76
77
  var XCheckboxDT_1 = require("./XCheckboxDT");
77
78
  var tristatecheckbox_1 = require("primereact/tristatecheckbox");
78
79
  var api_1 = require("primereact/api");
80
+ var XAutoCompleteDT_1 = require("./XAutoCompleteDT");
81
+ var XButtonIconNarrow_1 = require("./XButtonIconNarrow");
79
82
  var XFormDataTable2 = /** @class */ (function (_super) {
80
83
  __extends(XFormDataTable2, _super);
81
84
  function XFormDataTable2(props) {
@@ -94,8 +97,9 @@ var XFormDataTable2 = /** @class */ (function (_super) {
94
97
  dropdownOptionsMap: {},
95
98
  filters: _this.createInitFilters()
96
99
  };
97
- _this.onClickAddRowDefault = _this.onClickAddRowDefault.bind(_this);
98
- _this.onClickRemoveRowDefault = _this.onClickRemoveRowDefault.bind(_this);
100
+ _this.onClickAddRow = _this.onClickAddRow.bind(_this);
101
+ _this.onClickRemoveRowBySelection = _this.onClickRemoveRowBySelection.bind(_this);
102
+ _this.removeRow = _this.removeRow.bind(_this);
99
103
  _this.onSelectionChange = _this.onSelectionChange.bind(_this);
100
104
  _this.onDropdownOptionsMapChange = _this.onDropdownOptionsMapChange.bind(_this);
101
105
  _this.onFilter = _this.onFilter.bind(_this);
@@ -104,12 +108,13 @@ var XFormDataTable2 = /** @class */ (function (_super) {
104
108
  _this.onDropdownFilterChange = _this.onDropdownFilterChange.bind(_this);
105
109
  _this.getDropdownFilterValue = _this.getDropdownFilterValue.bind(_this);
106
110
  _this.bodyTemplate = _this.bodyTemplate.bind(_this);
111
+ props.form.addXFormDataTable(_this);
107
112
  try {
108
113
  //props.form.addField(props.assocField + '.*FAKE*'); - vzdy mame aspon 1 field, nie je to potrebne
109
114
  for (var _b = __values(props.children), _c = _b.next(); !_c.done; _c = _b.next()) {
110
115
  var child = _c.value;
111
116
  var childColumn = child; // nevedel som to krajsie...
112
- var field = props.assocField + '.' + XFormDataTable2.getPathForColumn(childColumn.props);
117
+ var field = props.assocField + '.' + _this.getPathForColumn(childColumn.props);
113
118
  props.form.addField(field);
114
119
  }
115
120
  }
@@ -122,7 +127,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
122
127
  }
123
128
  return _this;
124
129
  }
125
- XFormDataTable2.getPathForColumn = function (columnProps) {
130
+ XFormDataTable2.prototype.getPathForColumn = function (columnProps) {
126
131
  if (columnProps.type === "inputSimple") {
127
132
  var columnPropsInputSimple = columnProps;
128
133
  return columnPropsInputSimple.field;
@@ -131,6 +136,10 @@ var XFormDataTable2 = /** @class */ (function (_super) {
131
136
  var columnPropsDropdown = columnProps;
132
137
  return columnPropsDropdown.assocField + '.' + columnPropsDropdown.displayField;
133
138
  }
139
+ else if (columnProps.type === "autoComplete") {
140
+ var columnPropsAutoComplete = columnProps;
141
+ return columnPropsAutoComplete.assocField + '.' + this.getDisplayFieldOrId(columnPropsAutoComplete);
142
+ }
134
143
  else if (columnProps.type === "searchButton") {
135
144
  var columnPropsSearchButton = columnProps;
136
145
  return columnPropsSearchButton.assocField + '.' + columnPropsSearchButton.displayField;
@@ -139,8 +148,21 @@ var XFormDataTable2 = /** @class */ (function (_super) {
139
148
  throw "Unknown prop type = " + columnProps.type;
140
149
  }
141
150
  };
151
+ XFormDataTable2.prototype.getDisplayFieldOrId = function (columnPropsAutoComplete) {
152
+ // toto je hack - ak ratame displayField cez funkciu, tak nam potom v kode chyba (hociaky) atribut asociovaneho objektu
153
+ // aby sme nemuseli robit nejake velke prerabky a zmeny, tak podsunieme id-ckovy atribut
154
+ if (typeof columnPropsAutoComplete.displayField === 'string') {
155
+ return columnPropsAutoComplete.displayField; // vsetko ok
156
+ }
157
+ else {
158
+ // v displayField mame funkciu, zistime id-ckovy atribut
159
+ // TODO - problem - sortovanie/filtrovanie bude fungovat podla tohto id atributu
160
+ var xAssoc = XUtilsMetadata_1.XUtilsMetadata.getXAssocToOne(XUtilsMetadata_1.XUtilsMetadata.getXEntity(this.getEntity()), columnPropsAutoComplete.assocField);
161
+ return XUtilsMetadata_1.XUtilsMetadata.getXEntity(xAssoc.entityName).idField;
162
+ }
163
+ };
142
164
  XFormDataTable2.getHeader = function (columnProps, xEntity, field, xField) {
143
- var _a, _b, _c;
165
+ var _a, _b, _c, _d;
144
166
  // poznamky - parametre field a xField by sme mohli vyratavat na zaklade columnProps ale kedze ich uz mame, setrime performance a neduplikujeme vypocet
145
167
  // nie je to tu uplne idealne nakodene, ale je to pomerne prehladne
146
168
  var isNullable = true;
@@ -156,16 +178,22 @@ var XFormDataTable2 = /** @class */ (function (_super) {
156
178
  isNullable = xAssoc.isNullable;
157
179
  readOnly = (_a = columnProps.readOnly) !== null && _a !== void 0 ? _a : false;
158
180
  }
181
+ else if (columnProps.type === "autoComplete") {
182
+ var columnPropsAutoComplete = columnProps;
183
+ var xAssoc = XUtilsMetadata_1.XUtilsMetadata.getXAssocToOne(xEntity, columnPropsAutoComplete.assocField);
184
+ isNullable = xAssoc.isNullable;
185
+ readOnly = (_b = columnProps.readOnly) !== null && _b !== void 0 ? _b : false;
186
+ }
159
187
  else if (columnProps.type === "searchButton") {
160
188
  var columnPropsSearchButton = columnProps;
161
189
  var xAssoc = XUtilsMetadata_1.XUtilsMetadata.getXAssocToOne(xEntity, columnPropsSearchButton.assocField);
162
190
  isNullable = xAssoc.isNullable;
163
- readOnly = (_b = columnProps.readOnly) !== null && _b !== void 0 ? _b : false;
191
+ readOnly = (_c = columnProps.readOnly) !== null && _c !== void 0 ? _c : false;
164
192
  }
165
193
  else {
166
194
  throw "Unknown prop type = " + columnProps.type;
167
195
  }
168
- var header = (_c = columnProps.header) !== null && _c !== void 0 ? _c : field;
196
+ var header = (_d = columnProps.header) !== null && _d !== void 0 ? _d : field;
169
197
  if (!isNullable && !readOnly) {
170
198
  header = XUtils_1.XUtils.markNotNull(header);
171
199
  }
@@ -180,13 +208,16 @@ var XFormDataTable2 = /** @class */ (function (_super) {
180
208
  XFormDataTable2.prototype.createInitFilters = function () {
181
209
  var e_2, _a;
182
210
  var initFilters = {};
211
+ if (this.props.filterDisplay === "none") {
212
+ return initFilters;
213
+ }
183
214
  var xEntity = XUtilsMetadata_1.XUtilsMetadata.getXEntity(this.getEntity());
184
215
  try {
185
216
  // TODO - asi by bolo fajn si tieto field, xField niekam ulozit a iterovat ulozene hodnoty, pouziva sa to na viacerych miestach
186
217
  for (var _b = __values(this.props.children), _c = _b.next(); !_c.done; _c = _b.next()) {
187
218
  var child = _c.value;
188
219
  var childColumn = child; // nevedel som to krajsie...
189
- var field = XFormDataTable2.getPathForColumn(childColumn.props);
220
+ var field = this.getPathForColumn(childColumn.props);
190
221
  var xField = XUtilsMetadata_1.XUtilsMetadata.getXFieldByPath(xEntity, field);
191
222
  // TODO column.props.dropdownInFilter - pre "menu" by bolo fajn mat zoznam "enumov"
192
223
  var filterMatchMode = this.getFilterMatchMode(xField);
@@ -309,7 +340,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
309
340
  var columnPropsInputSimple = columnProps;
310
341
  var xField = XUtilsMetadata_1.XUtilsMetadata.getXFieldByPath(xEntity, columnPropsInputSimple.field);
311
342
  if (xField.type === "decimal" || xField.type === "number") {
312
- body = react_1.default.createElement(XInputDecimalDT_1.XInputDecimalDT, { form: this.props.form, entity: this.getEntity(), field: columnPropsInputSimple.field, rowData: rowData, readOnly: columnPropsInputSimple.readOnly });
343
+ body = react_1.default.createElement(XInputDecimalDT_1.XInputDecimalDT, { form: this.props.form, entity: this.getEntity(), field: columnPropsInputSimple.field, rowData: rowData, readOnly: columnPropsInputSimple.readOnly, onChange: columnPropsInputSimple.onChange });
313
344
  }
314
345
  else if (xField.type === "date" || xField.type === "datetime") {
315
346
  body = react_1.default.createElement(XInputDateDT_1.XInputDateDT, { form: this.props.form, xField: xField, field: columnPropsInputSimple.field, rowData: rowData, readOnly: columnPropsInputSimple.readOnly });
@@ -326,6 +357,10 @@ var XFormDataTable2 = /** @class */ (function (_super) {
326
357
  var columnPropsDropdown = columnProps;
327
358
  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 });
328
359
  }
360
+ else if (columnProps.type === "autoComplete") {
361
+ var columnPropsAutoComplete = columnProps;
362
+ body = react_1.default.createElement(XAutoCompleteDT_1.XAutoCompleteDT, { form: this.props.form, entity: this.getEntity(), assocField: columnPropsAutoComplete.assocField, displayField: columnPropsAutoComplete.displayField, searchTable: columnPropsAutoComplete.searchTable, assocForm: columnPropsAutoComplete.assocForm, filter: columnPropsAutoComplete.filter, rowData: rowData });
363
+ }
329
364
  else if (columnProps.type === "searchButton") {
330
365
  var columnPropsSearchButton = columnProps;
331
366
  body = react_1.default.createElement(XSearchButtonDT_1.XSearchButtonDT, { form: this.props.form, entity: this.getEntity(), assocField: columnPropsSearchButton.assocField, displayField: columnPropsSearchButton.displayField, searchTable: columnPropsSearchButton.searchTable, rowData: rowData, readOnly: columnPropsSearchButton.readOnly });
@@ -335,19 +370,95 @@ var XFormDataTable2 = /** @class */ (function (_super) {
335
370
  }
336
371
  return body;
337
372
  };
338
- XFormDataTable2.prototype.onClickAddRowDefault = function () {
339
- this.props.form.onTableAddRow(this.props.assocField, {}, this.dataKey, this.state.selectedRow);
373
+ XFormDataTable2.prototype.onClickAddRow = function () {
374
+ if (this.props.onClickAddRow) {
375
+ // custom add row
376
+ this.props.onClickAddRow();
377
+ }
378
+ else {
379
+ // default add row
380
+ this.props.form.onTableAddRow(this.props.assocField, {}, this.dataKey, this.state.selectedRow);
381
+ }
340
382
  };
341
383
  ;
342
- XFormDataTable2.prototype.onClickRemoveRowDefault = function () {
384
+ XFormDataTable2.prototype.onClickRemoveRowBySelection = function () {
343
385
  if (this.state.selectedRow !== undefined) {
344
- this.props.form.onTableRemoveRow(this.props.assocField, this.state.selectedRow);
386
+ this.removeRow(this.state.selectedRow);
345
387
  }
346
388
  else {
347
389
  alert("Please select the row.");
348
390
  }
349
391
  };
350
392
  ;
393
+ XFormDataTable2.prototype.removeRow = function (row) {
394
+ if (this.props.onClickRemoveRow) {
395
+ // custom remove
396
+ this.props.onClickRemoveRow(row);
397
+ }
398
+ else {
399
+ // default remove
400
+ this.props.form.onTableRemoveRow(this.props.assocField, row);
401
+ }
402
+ };
403
+ XFormDataTable2.prototype.validate = function () {
404
+ var e_3, _a, e_4, _b;
405
+ // zvalidujeme vsetky rows a pripadne chyby zapiseme do specialneho fieldu __x_rowTechData
406
+ var object = this.props.form.getXObject();
407
+ var rowList = object[this.props.assocField];
408
+ try {
409
+ for (var rowList_1 = __values(rowList), rowList_1_1 = rowList_1.next(); !rowList_1_1.done; rowList_1_1 = rowList_1.next()) {
410
+ var row = rowList_1_1.value;
411
+ var xRowTechData = XFormBase_1.XFormBase.getXRowTechData(row);
412
+ var xErrorMap = {};
413
+ try {
414
+ for (var _c = (e_4 = void 0, __values(xRowTechData.xFormComponentDTList)), _d = _c.next(); !_d.done; _d = _c.next()) {
415
+ var xFormComponentDT = _d.value;
416
+ var errorItem = xFormComponentDT.validate();
417
+ if (errorItem) {
418
+ //console.log("Mame field = " + errorItem.field);
419
+ xErrorMap[errorItem.field] = errorItem.xError;
420
+ }
421
+ }
422
+ }
423
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
424
+ finally {
425
+ try {
426
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
427
+ }
428
+ finally { if (e_4) throw e_4.error; }
429
+ }
430
+ xRowTechData.errorMap = xErrorMap;
431
+ }
432
+ }
433
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
434
+ finally {
435
+ try {
436
+ if (rowList_1_1 && !rowList_1_1.done && (_a = rowList_1.return)) _a.call(rowList_1);
437
+ }
438
+ finally { if (e_3) throw e_3.error; }
439
+ }
440
+ };
441
+ XFormDataTable2.prototype.getErrorMessages = function () {
442
+ var e_5, _a;
443
+ var msg = "";
444
+ var object = this.props.form.getXObject();
445
+ var rowList = object[this.props.assocField];
446
+ try {
447
+ for (var rowList_2 = __values(rowList), rowList_2_1 = rowList_2.next(); !rowList_2_1.done; rowList_2_1 = rowList_2.next()) {
448
+ var row = rowList_2_1.value;
449
+ var xRowTechData = XFormBase_1.XFormBase.getXRowTechData(row);
450
+ msg += XUtils_1.XUtils.getErrorMessages(xRowTechData.errorMap);
451
+ }
452
+ }
453
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
454
+ finally {
455
+ try {
456
+ if (rowList_2_1 && !rowList_2_1.done && (_a = rowList_2.return)) _a.call(rowList_2);
457
+ }
458
+ finally { if (e_5) throw e_5.error; }
459
+ }
460
+ return msg;
461
+ };
351
462
  XFormDataTable2.prototype.render = function () {
352
463
  var _this = this;
353
464
  var paginator = this.props.paginator !== undefined ? this.props.paginator : false;
@@ -360,12 +471,11 @@ var XFormDataTable2 = /** @class */ (function (_super) {
360
471
  rows = 5; // default
361
472
  }
362
473
  }
474
+ var filterDisplay = this.props.filterDisplay !== "none" ? this.props.filterDisplay : undefined;
363
475
  var label = this.props.label !== undefined ? this.props.label : this.props.assocField;
364
476
  var readOnly = this.props.readOnly !== undefined ? this.props.readOnly : false;
365
477
  // v bloku function (child) nejde pouzit priamo this, thisLocal uz ide pouzit
366
478
  var thisLocal = this;
367
- var onClickAddRow = this.props.onClickAddRow !== undefined ? this.props.onClickAddRow : this.onClickAddRowDefault;
368
- var onClickRemoveRow = this.props.onClickRemoveRow !== undefined ? this.props.onClickRemoveRow : this.onClickRemoveRowDefault;
369
479
  var object = this.props.form.state.object;
370
480
  var valueList = object !== null ? object[this.props.assocField] : [];
371
481
  var xEntity = XUtilsMetadata_1.XUtilsMetadata.getXEntity(this.getEntity());
@@ -404,31 +514,35 @@ var XFormDataTable2 = /** @class */ (function (_super) {
404
514
  var childColumnProps = childColumn.props;
405
515
  // je dolezite, aby field obsahoval cely path az po zobrazovany atribut, lebo podla neho sa vykonava filtrovanie a sortovanie
406
516
  // (aj ked, da sa to prebit na stlpcoch (na elemente Column), su na to atributy)
407
- var field = XFormDataTable2.getPathForColumn(childColumnProps);
517
+ var field = thisLocal.getPathForColumn(childColumnProps);
408
518
  // TODO - toto by sa mohlo vytiahnut vyssie, aj v bodyTemplate sa vola metoda XUtilsMetadata.getXFieldByPath
409
519
  var xField = XUtilsMetadata_1.XUtilsMetadata.getXFieldByPath(xEntity, field);
410
520
  // *********** header ***********
411
521
  var header = XFormDataTable2.getHeader(childColumnProps, xEntity, field, xField);
412
522
  // *********** filterElement ***********
413
523
  var filterElement;
414
- if (xField.type === "boolean") {
415
- var checkboxValue = thisLocal.getCheckboxFilterValue(field);
416
- filterElement = react_1.default.createElement(tristatecheckbox_1.TriStateCheckbox, { value: checkboxValue, onChange: function (e) { return thisLocal.onCheckboxFilterChange(field, e.value); } });
417
- }
418
- else if (childColumnProps.dropdownInFilter) {
419
- var dropdownValue = thisLocal.getDropdownFilterValue(field);
420
- filterElement = react_1.default.createElement(XDropdownDTFilter_1.XDropdownDTFilter, { entity: thisLocal.getEntity(), path: field, value: dropdownValue, onValueChange: thisLocal.onDropdownFilterChange });
524
+ if (thisLocal.props.filterDisplay !== "none") {
525
+ if (xField.type === "boolean") {
526
+ var checkboxValue = thisLocal.getCheckboxFilterValue(field);
527
+ filterElement = react_1.default.createElement(tristatecheckbox_1.TriStateCheckbox, { value: checkboxValue, onChange: function (e) { return thisLocal.onCheckboxFilterChange(field, e.value); } });
528
+ }
529
+ else if (childColumnProps.dropdownInFilter) {
530
+ var dropdownValue = thisLocal.getDropdownFilterValue(field);
531
+ filterElement = react_1.default.createElement(XDropdownDTFilter_1.XDropdownDTFilter, { entity: thisLocal.getEntity(), path: field, value: dropdownValue, onValueChange: thisLocal.onDropdownFilterChange });
532
+ }
421
533
  }
422
534
  // *********** showFilterMenu ***********
423
- var showFilterMenu;
424
- if (childColumnProps.showFilterMenu !== undefined) {
425
- showFilterMenu = childColumnProps.showFilterMenu;
426
- }
427
- else {
428
- showFilterMenu = true; // default
429
- if (thisLocal.props.filterDisplay === "row") {
430
- if (xField.type === "boolean" || childColumnProps.dropdownInFilter) {
431
- showFilterMenu = false;
535
+ var showFilterMenu = false;
536
+ if (thisLocal.props.filterDisplay !== "none") {
537
+ if (childColumnProps.showFilterMenu !== undefined) {
538
+ showFilterMenu = childColumnProps.showFilterMenu;
539
+ }
540
+ else {
541
+ showFilterMenu = true; // default
542
+ if (thisLocal.props.filterDisplay === "row") {
543
+ if (xField.type === "boolean" || childColumnProps.dropdownInFilter) {
544
+ showFilterMenu = false;
545
+ }
432
546
  }
433
547
  }
434
548
  }
@@ -438,10 +552,10 @@ var XFormDataTable2 = /** @class */ (function (_super) {
438
552
  // *********** width/headerStyle ***********
439
553
  var width = XUtils_1.XUtils.processPropWidth(childColumn.props.width);
440
554
  if (width === undefined || width === "default") {
441
- // TODO - if filter not used at all, then buttons flags should be false
442
555
  var filterMenuInFilterRow = thisLocal.props.filterDisplay === "row" && showFilterMenu;
556
+ var sortableButtonInHeader = thisLocal.props.sortable;
443
557
  var filterButtonInHeader = thisLocal.props.filterDisplay === "menu";
444
- width = XUtilsMetadata_1.XUtilsMetadata.computeColumnWidth(xField, filterMenuInFilterRow, childColumnProps.type, header, filterButtonInHeader);
558
+ width = XUtilsMetadata_1.XUtilsMetadata.computeColumnWidth(xField, filterMenuInFilterRow, childColumnProps.type, header, sortableButtonInHeader, filterButtonInHeader);
445
559
  }
446
560
  var headerStyle = {};
447
561
  if (width !== undefined) {
@@ -463,24 +577,32 @@ var XFormDataTable2 = /** @class */ (function (_super) {
463
577
  align = "center";
464
578
  }
465
579
  // }
466
- return react_1.default.createElement(column_1.Column, { field: field, header: header, filter: true, sortable: true, filterElement: filterElement, showFilterMenu: showFilterMenu, showClearButton: showClearButton, headerStyle: headerStyle, align: align, body: function (rowData) { return thisLocal.bodyTemplate(childColumnProps, rowData, xEntity); } });
580
+ return react_1.default.createElement(column_1.Column, { field: field, header: header, filter: thisLocal.props.filterDisplay !== "none", sortable: thisLocal.props.sortable, filterElement: filterElement, showFilterMenu: showFilterMenu, showClearButton: showClearButton, headerStyle: headerStyle, align: align, body: function (rowData) { return thisLocal.bodyTemplate(childColumnProps, rowData, xEntity); } });
467
581
  });
582
+ if (this.props.removeButtonInRow) {
583
+ // je dolezite nastavit sirku header-a, lebo inac ma stlpec sirku 0 a nevidno ho
584
+ columnElemList.push(react_1.default.createElement(column_1.Column, { key: "removeButton", headerStyle: { width: '2rem' }, body: function (rowData) { return react_1.default.createElement(XButtonIconNarrow_1.XButtonIconNarrow, { icon: "pi pi-times", onClick: function () { return _this.removeRow(rowData); }, addMargin: false }); } }));
585
+ }
468
586
  return (react_1.default.createElement("div", null,
469
587
  react_1.default.createElement("div", { className: "flex justify-content-center" },
470
588
  react_1.default.createElement("label", null, label)),
471
589
  react_1.default.createElement("div", { className: "flex justify-content-center" },
472
- react_1.default.createElement(datatable_1.DataTable, { ref: function (el) { return _this.dt = el; }, value: valueList, dataKey: this.dataKey, paginator: paginator, rows: rows, totalRecords: valueList.length, filterDisplay: this.props.filterDisplay, filters: this.state.filters, onFilter: this.onFilter, sortMode: "multiple", removableSort: true, selectionMode: "single", selection: this.state.selectedRow, onSelectionChange: this.onSelectionChange, className: "p-datatable-sm x-form-datatable", resizableColumns: true, columnResizeMode: "expand", tableStyle: tableStyle, scrollable: this.props.scrollable, scrollHeight: scrollHeight, style: style }, columnElemList)),
590
+ react_1.default.createElement(datatable_1.DataTable, { ref: function (el) { return _this.dt = el; }, value: valueList, dataKey: this.dataKey, paginator: paginator, rows: rows, totalRecords: valueList.length, filterDisplay: filterDisplay, filters: this.state.filters, onFilter: this.onFilter, sortMode: "multiple", removableSort: true, selectionMode: "single", selection: this.state.selectedRow, onSelectionChange: this.onSelectionChange, className: "p-datatable-sm x-form-datatable", resizableColumns: true, columnResizeMode: "expand", tableStyle: tableStyle, scrollable: this.props.scrollable, scrollHeight: scrollHeight, style: style }, columnElemList)),
473
591
  react_1.default.createElement("div", { className: "flex justify-content-center" },
474
- react_1.default.createElement(XButton_1.XButton, { label: "Add row", onClick: onClickAddRow }),
475
- react_1.default.createElement(XButton_1.XButton, { label: "Remove row", onClick: onClickRemoveRow }))));
592
+ react_1.default.createElement(XButton_1.XButton, { icon: this.props.addRowIcon, label: this.props.addRowLabel, onClick: this.onClickAddRow }),
593
+ this.props.removeButtonInRow ? undefined : react_1.default.createElement(XButton_1.XButton, { icon: this.props.removeRowIcon, label: this.props.removeRowLabel, onClick: this.onClickRemoveRowBySelection }))));
476
594
  };
477
595
  XFormDataTable2.defaultProps = {
478
596
  filterDisplay: "row",
597
+ sortable: true,
479
598
  scrollable: true,
480
599
  scrollWidth: '100%',
481
600
  scrollHeight: '200vh',
482
601
  // tym ze pouzivame 200vh (max-height pre body), tak realne scrollovanie sa zapne az pri velmi vela riadkoch
483
- shrinkWidth: true
602
+ shrinkWidth: true,
603
+ removeButtonInRow: false,
604
+ addRowLabel: 'Add row',
605
+ removeRowLabel: 'Remove row'
484
606
  };
485
607
  return XFormDataTable2;
486
608
  }(react_1.Component));
@@ -501,6 +623,14 @@ exports.XFormDropdownColumn = XFormDropdownColumn;
501
623
  exports.XFormDropdownColumn.defaultProps = {
502
624
  type: "dropdown"
503
625
  };
626
+ var XFormAutoCompleteColumn = function (props) {
627
+ // nevadi ze tu nic nevraciame, field a header vieme precitat a zvysok by sme aj tak zahodili lebo vytvarame novy element
628
+ return (null);
629
+ };
630
+ exports.XFormAutoCompleteColumn = XFormAutoCompleteColumn;
631
+ exports.XFormAutoCompleteColumn.defaultProps = {
632
+ type: "autoComplete"
633
+ };
504
634
  var XFormSearchButtonColumn = function (props) {
505
635
  // nevadi ze tu nic nevraciame, field a header vieme precitat a zvysok by sme aj tak zahodili lebo vytvarame novy element
506
636
  return (null);
@@ -1,11 +1,11 @@
1
1
  import React from "react";
2
2
  import { XFormComponent, XFormComponentProps } from "./XFormComponent";
3
3
  import { XField } from "../serverApi/XEntityMetadata";
4
- export interface XInputProps extends XFormComponentProps {
4
+ export interface XInputProps<T> extends XFormComponentProps<T> {
5
5
  field: string;
6
6
  inputStyle?: React.CSSProperties;
7
7
  }
8
- export declare abstract class XInput<P extends XInputProps> extends XFormComponent<P> {
8
+ export declare abstract class XInput<T, P extends XInputProps<T>> extends XFormComponent<T, P> {
9
9
  protected xField: XField;
10
10
  protected constructor(props: P);
11
11
  getField(): string;
@@ -0,0 +1,11 @@
1
+ import { XField } from "../serverApi/XEntityMetadata";
2
+ import { XFormComponentDT, XFormComponentDTProps } from "./XFormComponentDT";
3
+ export interface XInputDTProps extends XFormComponentDTProps {
4
+ field: string;
5
+ }
6
+ export declare abstract class XInputDT<P extends XInputDTProps> extends XFormComponentDT<P> {
7
+ protected xField: XField;
8
+ protected constructor(props: P);
9
+ getField(): string;
10
+ isNotNull(): boolean;
11
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.XInputDT = void 0;
19
+ var XUtilsMetadata_1 = require("./XUtilsMetadata");
20
+ var XFormComponentDT_1 = require("./XFormComponentDT");
21
+ // spolocna nadtrieda pre jednoduche inputy (nie asociacne)
22
+ var XInputDT = /** @class */ (function (_super) {
23
+ __extends(XInputDT, _super);
24
+ function XInputDT(props) {
25
+ var _this = _super.call(this, props) || this;
26
+ _this.xField = XUtilsMetadata_1.XUtilsMetadata.getXFieldByPathStr(props.entity, props.field);
27
+ return _this;
28
+ }
29
+ XInputDT.prototype.getField = function () {
30
+ return this.props.field;
31
+ };
32
+ XInputDT.prototype.isNotNull = function () {
33
+ return !this.xField.isNullable;
34
+ };
35
+ return XInputDT;
36
+ }(XFormComponentDT_1.XFormComponentDT));
37
+ exports.XInputDT = XInputDT;
@@ -1,8 +1,9 @@
1
- /// <reference types="react" />
2
1
  import { XFormBase } from "./XFormBase";
2
+ import React from "react";
3
3
  export declare const XInputDate: (props: {
4
4
  form: XFormBase;
5
5
  field: string;
6
6
  label?: string | undefined;
7
7
  readOnly?: boolean | undefined;
8
+ labelStyle?: React.CSSProperties | undefined;
8
9
  }) => JSX.Element;
@@ -11,7 +11,7 @@ var XUtilsMetadata_1 = require("./XUtilsMetadata");
11
11
  var XUtilsCommon_1 = require("../serverApi/XUtilsCommon");
12
12
  var XUtils_1 = require("./XUtils");
13
13
  var XInputDate = function (props) {
14
- var _a;
14
+ var _a, _b;
15
15
  props.form.addField(props.field);
16
16
  var xField = XUtilsMetadata_1.XUtilsMetadata.getXFieldByPathStr(props.form.getEntity(), props.field);
17
17
  var showTime = (xField.type === 'datetime');
@@ -49,8 +49,10 @@ var XInputDate = function (props) {
49
49
  }
50
50
  // fieldValue zostalo undefined (konvertujeme null -> undefined) - Calendar pozaduje undefined, nechce null
51
51
  }
52
+ var labelStyle = (_b = props.labelStyle) !== null && _b !== void 0 ? _b : {};
53
+ XUtils_1.XUtils.addCssPropIfNotExists(labelStyle, { width: XUtils_1.XUtils.FIELD_LABEL_WIDTH });
52
54
  return (react_1.default.createElement("div", { className: "field grid" },
53
- react_1.default.createElement("label", { htmlFor: props.field, className: "col-fixed", style: { width: XUtils_1.XUtils.FIELD_LABEL_WIDTH } }, label),
55
+ react_1.default.createElement("label", { htmlFor: props.field, className: "col-fixed", style: labelStyle }, label),
54
56
  react_1.default.createElement(calendar_1.Calendar, { id: props.field, value: fieldValue, onChange: onValueChange, disabled: readOnly, showIcon: true, dateFormat: (0, XUtilsConversions_1.dateFormatCalendar)(), showTime: showTime, showSeconds: showTime, inputClassName: cssClassName, showOnFocus: false })));
55
57
  };
56
58
  exports.XInputDate = XInputDate;
@@ -1,8 +1,15 @@
1
1
  import React from "react";
2
2
  import { XFormComponentProps } from "./XFormComponent";
3
- export interface XInputDecimalProps extends XFormComponentProps {
3
+ import { XInput } from "./XInput";
4
+ export interface XInputDecimalProps extends XFormComponentProps<number> {
4
5
  field: string;
5
6
  size?: number;
6
7
  inputStyle?: React.CSSProperties;
7
8
  }
8
- export declare const XInputDecimal: (props: XInputDecimalProps) => JSX.Element;
9
+ export declare class XInputDecimal extends XInput<number, XInputDecimalProps> {
10
+ constructor(props: XInputDecimalProps);
11
+ getValue(): number | undefined;
12
+ onValueChange(e: any): void;
13
+ onBlur(e: any): void;
14
+ render(): JSX.Element;
15
+ }