@michalrakus/x-react-web-lib 1.10.0 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/XEditBrowse.d.ts +3 -0
  2. package/XEditBrowse.js +5 -0
  3. package/XObject.d.ts +3 -0
  4. package/XObject.js +5 -0
  5. package/gulpfile.js +2 -1
  6. package/lib/administration/XBrowseMetaBrowse.d.ts +2 -1
  7. package/lib/administration/XUserBrowse.d.ts +2 -1
  8. package/lib/administration/XUserBrowse.js +1 -1
  9. package/lib/administration/XUserForm.d.ts +6 -3
  10. package/lib/administration/XUserForm.js +9 -16
  11. package/lib/components/XAutoComplete.d.ts +6 -4
  12. package/lib/components/XAutoComplete.js +13 -22
  13. package/lib/components/XAutoCompleteBase.d.ts +15 -5
  14. package/lib/components/XAutoCompleteBase.js +115 -96
  15. package/lib/components/XAutoCompleteDT.d.ts +4 -3
  16. package/lib/components/XAutoCompleteDT.js +8 -7
  17. package/lib/components/XCheckboxDT.d.ts +2 -1
  18. package/lib/components/XCheckboxDT.js +2 -9
  19. package/lib/components/XDropdownDT.d.ts +2 -2
  20. package/lib/components/XDropdownDT.js +2 -3
  21. package/lib/components/{XBrowse.d.ts → XEditBrowse.d.ts} +3 -3
  22. package/lib/components/{XBrowse.js → XEditBrowse.js} +22 -22
  23. package/lib/components/XFormBase.d.ts +10 -9
  24. package/lib/components/XFormBase.js +20 -12
  25. package/lib/components/XFormComponent.d.ts +3 -3
  26. package/lib/components/XFormComponentDT.d.ts +4 -4
  27. package/lib/components/XFormComponentDT.js +10 -11
  28. package/lib/components/XFormDataTable2.d.ts +10 -8
  29. package/lib/components/XFormDataTable2.js +36 -28
  30. package/lib/components/XFormNavigator3.d.ts +3 -3
  31. package/lib/components/XFormNavigator3.js +2 -2
  32. package/lib/components/XInputDateDT.d.ts +2 -1
  33. package/lib/components/XInputDateDT.js +2 -9
  34. package/lib/components/XInputTextDT.d.ts +2 -1
  35. package/lib/components/XInputTextDT.js +2 -9
  36. package/lib/components/XLazyDataTable.d.ts +9 -2
  37. package/lib/components/XLazyDataTable.js +17 -15
  38. package/lib/components/{SearchTableParams.d.ts → XSearchBrowseParams.d.ts} +2 -2
  39. package/lib/components/XSearchButton.d.ts +2 -2
  40. package/lib/components/XSearchButton.js +7 -11
  41. package/lib/components/XSearchButtonDT.d.ts +4 -3
  42. package/lib/components/XSearchButtonDT.js +10 -6
  43. package/lib/components/XUtils.d.ts +24 -1
  44. package/lib/components/XUtils.js +92 -8
  45. package/lib/components/locale/x-en.json +4 -1
  46. package/package.json +1 -1
  47. package/XBrowse.d.ts +0 -3
  48. package/XBrowse.js +0 -5
  49. /package/lib/components/{SearchTableParams.js → XSearchBrowseParams.js} +0 -0
@@ -7,16 +7,8 @@ exports.XCheckboxDT = void 0;
7
7
  var react_1 = __importDefault(require("react"));
8
8
  var tristatecheckbox_1 = require("primereact/tristatecheckbox");
9
9
  var XUtilsCommon_1 = require("../serverApi/XUtilsCommon");
10
+ var XUtils_1 = require("./XUtils");
10
11
  var XCheckboxDT = function (props) {
11
- // ak mame path, field je vzdy readOnly
12
- var readOnly;
13
- var posDot = props.field.indexOf(".");
14
- if (posDot !== -1) {
15
- readOnly = true;
16
- }
17
- else {
18
- readOnly = props.readOnly !== undefined ? props.readOnly : false;
19
- }
20
12
  var onValueChange = function (field, rowData, newValue) {
21
13
  // pri klikani na TriStateCheckbox prichadza v newValue cyklicky: true -> false -> null
22
14
  // ak mame not null atribut, tak pri null hodnote skocime rovno na true
@@ -41,6 +33,7 @@ var XCheckboxDT = function (props) {
41
33
  // konvertovat null hodnotu na "" (vo funkcii stringAsUI) je dolezite aby sa prejavila zmena na null v modeli (a tiez aby korektne pridal novy riadok)
42
34
  fieldValue = rowDataValue;
43
35
  }
36
+ var readOnly = XUtils_1.XUtils.isReadOnlyTableField(props.field, props.readOnly, props.form.state.object, props.rowData);
44
37
  return (react_1.default.createElement(tristatecheckbox_1.TriStateCheckbox, { id: props.field, value: fieldValue, onChange: function (e) { return onValueChange(props.field, props.rowData, e.value); }, disabled: readOnly }));
45
38
  };
46
39
  exports.XCheckboxDT = XCheckboxDT;
@@ -1,6 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { XFormBase } from "./XFormBase";
3
- import { XDropdownOptionsMap } from "./XFormDataTable2";
3
+ import { XDropdownOptionsMap, XTableFieldReadOnlyProp } from "./XFormDataTable2";
4
4
  import { XCustomFilter } from "../serverApi/FindParam";
5
5
  export declare const XDropdownDT: (props: {
6
6
  form: XFormBase;
@@ -12,5 +12,5 @@ export declare const XDropdownDT: (props: {
12
12
  dropdownOptionsMap: XDropdownOptionsMap;
13
13
  onDropdownOptionsMapChange: (dropdownOptionsMap: XDropdownOptionsMap) => void;
14
14
  rowData: any;
15
- readOnly?: boolean | undefined;
15
+ readOnly?: XTableFieldReadOnlyProp | undefined;
16
16
  }) => JSX.Element;
@@ -103,7 +103,6 @@ var XDropdownDT = function (props) {
103
103
  }
104
104
  });
105
105
  }); };
106
- var readOnly = props.readOnly !== undefined ? props.readOnly : false;
107
106
  var onValueChange = function (assocField, rowData, newValue) {
108
107
  // zmenime hodnotu v modeli (odtial sa hodnota cita)
109
108
  var newValueOrNull;
@@ -118,7 +117,6 @@ var XDropdownDT = function (props) {
118
117
  // kedze "rowData" je sucastou "props.form.state.object", tak nam staci zavolat setState({object: object}), aby sa zmena prejavila
119
118
  props.form.onObjectDataChange();
120
119
  };
121
- // TODO - readOnly implementovat
122
120
  // Dropdown setuje do atributu object.assocField asociovany objekt zo zoznamu objektov ktore ziskame podla asociacie
123
121
  var assocObject = null;
124
122
  if (props.rowData !== null) {
@@ -129,7 +127,8 @@ var XDropdownDT = function (props) {
129
127
  }
130
128
  }
131
129
  var options = props.dropdownOptionsMap[props.assocField] !== undefined ? props.dropdownOptionsMap[props.assocField] : []; // mozno mozme do options prasknut rovno undefined...
130
+ var readOnly = XUtils_1.XUtils.isReadOnlyTableField(undefined, props.readOnly, props.form.state.object, props.rowData);
132
131
  // appendTo={document.body} appenduje overlay panel na element body - eliminuje problem s overflow (pozri poznamku v XDropdownDTFilter)
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); } }));
132
+ 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); }, readOnly: readOnly, disabled: readOnly }));
134
133
  };
135
134
  exports.XDropdownDT = XDropdownDT;
@@ -1,11 +1,11 @@
1
1
  import { Component } from "react";
2
2
  import { XEditColumnDialogValues } from "./XEditColumnDialog";
3
3
  import { XBrowseMeta } from "../serverApi/XBrowseMetadata";
4
- export interface XBrowseProps {
4
+ export interface XEditBrowseProps {
5
5
  entity: string;
6
6
  browseId?: string;
7
7
  }
8
- export declare class XBrowse extends Component<XBrowseProps> {
8
+ export declare class XEditBrowse extends Component<XEditBrowseProps> {
9
9
  state: {
10
10
  xBrowseMeta: XBrowseMeta;
11
11
  editMode: boolean;
@@ -14,7 +14,7 @@ export declare class XBrowse extends Component<XBrowseProps> {
14
14
  indexForAddColumn?: number;
15
15
  addColumn: boolean;
16
16
  xEditColumnDialogValues?: XEditColumnDialogValues;
17
- constructor(props: XBrowseProps);
17
+ constructor(props: XEditBrowseProps);
18
18
  getXBrowseMeta(): XBrowseMeta;
19
19
  createDefaultXBrowseMeta(): XBrowseMeta;
20
20
  onEditModeStart(): void;
@@ -101,7 +101,7 @@ var __read = (this && this.__read) || function (o, n) {
101
101
  return ar;
102
102
  };
103
103
  Object.defineProperty(exports, "__esModule", { value: true });
104
- exports.XBrowse = void 0;
104
+ exports.XEditBrowse = void 0;
105
105
  var react_1 = __importStar(require("react"));
106
106
  var SourceCodeLinkEntity_1 = require("./SourceCodeLinkEntity");
107
107
  var XEditColumnDialog_1 = require("./XEditColumnDialog");
@@ -109,10 +109,10 @@ var _ = __importStar(require("lodash"));
109
109
  var XUtilsMetadata_1 = require("./XUtilsMetadata");
110
110
  var XUtils_1 = require("./XUtils");
111
111
  var XLazyDataTable_1 = require("./XLazyDataTable");
112
- // TODO - pouzit extends XBrowseBase, ako je tomu pri CarForm?
113
- var XBrowse = /** @class */ (function (_super) {
114
- __extends(XBrowse, _super);
115
- function XBrowse(props) {
112
+ // TODO - pouzit extends XEditBrowseBase, ako je tomu pri CarForm?
113
+ var XEditBrowse = /** @class */ (function (_super) {
114
+ __extends(XEditBrowse, _super);
115
+ function XEditBrowse(props) {
116
116
  var _this = _super.call(this, props) || this;
117
117
  console.log("************* XBrowse const entity = " + _this.props.entity);
118
118
  _this.getXBrowseMeta = _this.getXBrowseMeta.bind(_this);
@@ -137,14 +137,14 @@ var XBrowse = /** @class */ (function (_super) {
137
137
  _this.onEdit = _this.onEdit.bind(_this);
138
138
  return _this;
139
139
  }
140
- XBrowse.prototype.getXBrowseMeta = function () {
140
+ XEditBrowse.prototype.getXBrowseMeta = function () {
141
141
  var xBrowseMeta = XUtilsMetadata_1.XUtilsMetadata.getXBrowseMeta(this.props.entity, this.props.browseId);
142
142
  if (xBrowseMeta === undefined) {
143
143
  xBrowseMeta = this.createDefaultXBrowseMeta();
144
144
  }
145
145
  return xBrowseMeta;
146
146
  };
147
- XBrowse.prototype.createDefaultXBrowseMeta = function () {
147
+ XEditBrowse.prototype.createDefaultXBrowseMeta = function () {
148
148
  var e_1, _a;
149
149
  var xColumnMetaList = [];
150
150
  var xEntity = XUtilsMetadata_1.XUtilsMetadata.getXEntity(this.props.entity);
@@ -164,12 +164,12 @@ var XBrowse = /** @class */ (function (_super) {
164
164
  }
165
165
  return { entity: this.props.entity, rows: 15, columnMetaList: xColumnMetaList };
166
166
  };
167
- XBrowse.prototype.onEditModeStart = function () {
167
+ XEditBrowse.prototype.onEditModeStart = function () {
168
168
  // zmeny budeme robit na klonovanych datach - aby sme sa vedeli cez cancel vratit do povodneho stavu
169
169
  var xBrowseMetaCloned = _.cloneDeep(this.state.xBrowseMeta);
170
170
  this.setState({ xBrowseMeta: xBrowseMetaCloned, editMode: true });
171
171
  };
172
- XBrowse.prototype.onEditModeSave = function () {
172
+ XEditBrowse.prototype.onEditModeSave = function () {
173
173
  return __awaiter(this, void 0, void 0, function () {
174
174
  var xBrowseMeta, columnOrder, _a, _b, xColumnMeta, e_2;
175
175
  var e_3, _c;
@@ -213,19 +213,19 @@ var XBrowse = /** @class */ (function (_super) {
213
213
  });
214
214
  });
215
215
  };
216
- XBrowse.prototype.onEditModeCancel = function () {
216
+ XEditBrowse.prototype.onEditModeCancel = function () {
217
217
  // vratime formular z cache, resp. defaultny formular
218
218
  var xBrowseMeta = this.getXBrowseMeta();
219
219
  this.setState({ editMode: false, xBrowseMeta: xBrowseMeta });
220
220
  };
221
- XBrowse.prototype.onAddColumn = function (field) {
221
+ XEditBrowse.prototype.onAddColumn = function (field) {
222
222
  console.log("onAddColumn: " + field);
223
223
  this.indexForAddColumn = this.getIndexForColumn(field);
224
224
  this.addColumn = true;
225
225
  this.xEditColumnDialogValues = { field: "", header: "", dropdownInFilter: false }; // values are used for dialog initialization
226
226
  this.setState({ editColumnDialogOpened: true });
227
227
  };
228
- XBrowse.prototype.editColumnDialogOnHide = function (xEditColumnDialogValues) {
228
+ XEditBrowse.prototype.editColumnDialogOnHide = function (xEditColumnDialogValues) {
229
229
  if (xEditColumnDialogValues !== null) {
230
230
  if (this.indexForAddColumn !== undefined) {
231
231
  var xBrowseMeta = this.state.xBrowseMeta;
@@ -248,7 +248,7 @@ var XBrowse = /** @class */ (function (_super) {
248
248
  }
249
249
  this.setState({ editColumnDialogOpened: false });
250
250
  };
251
- XBrowse.prototype.onEditColumn = function (field) {
251
+ XEditBrowse.prototype.onEditColumn = function (field) {
252
252
  var _a;
253
253
  console.log("onEditColumn: " + field);
254
254
  this.indexForAddColumn = this.getIndexForColumn(field);
@@ -260,7 +260,7 @@ var XBrowse = /** @class */ (function (_super) {
260
260
  this.setState({ editColumnDialogOpened: true });
261
261
  }
262
262
  };
263
- XBrowse.prototype.onRemoveColumn = function (field) {
263
+ XEditBrowse.prototype.onRemoveColumn = function (field) {
264
264
  console.log("onRemoveColumn: " + field);
265
265
  var index = this.getIndexForColumn(field);
266
266
  if (index !== undefined) {
@@ -270,13 +270,13 @@ var XBrowse = /** @class */ (function (_super) {
270
270
  this.setState({ xBrowseMeta: xBrowseMeta });
271
271
  }
272
272
  };
273
- XBrowse.prototype.onMoveColumnLeft = function (field) {
273
+ XEditBrowse.prototype.onMoveColumnLeft = function (field) {
274
274
  this.moveColumn(field, -1);
275
275
  };
276
- XBrowse.prototype.onMoveColumnRight = function (field) {
276
+ XEditBrowse.prototype.onMoveColumnRight = function (field) {
277
277
  this.moveColumn(field, 1);
278
278
  };
279
- XBrowse.prototype.moveColumn = function (field, offset) {
279
+ XEditBrowse.prototype.moveColumn = function (field, offset) {
280
280
  var index = this.getIndexForColumn(field);
281
281
  if (index !== undefined) {
282
282
  var xBrowseMeta = this.state.xBrowseMeta;
@@ -285,7 +285,7 @@ var XBrowse = /** @class */ (function (_super) {
285
285
  this.setState({ xBrowseMeta: xBrowseMeta });
286
286
  }
287
287
  };
288
- XBrowse.prototype.getIndexForColumn = function (field) {
288
+ XEditBrowse.prototype.getIndexForColumn = function (field) {
289
289
  var e_4, _a;
290
290
  var searchedIndex = undefined;
291
291
  var xBrowseMeta = this.state.xBrowseMeta;
@@ -307,7 +307,7 @@ var XBrowse = /** @class */ (function (_super) {
307
307
  }
308
308
  return searchedIndex;
309
309
  };
310
- XBrowse.prototype.onEdit = function (selectedRow) {
310
+ XEditBrowse.prototype.onEdit = function (selectedRow) {
311
311
  var formElement = XUtils_1.XUtils.getAppForm(this.props.entity);
312
312
  if (formElement !== undefined) {
313
313
  var xEntity = XUtilsMetadata_1.XUtilsMetadata.getXEntity(this.props.entity);
@@ -321,7 +321,7 @@ var XBrowse = /** @class */ (function (_super) {
321
321
  console.log("XBrowse entity = ".concat(this.props.entity, ": form not found/registered."));
322
322
  }
323
323
  };
324
- XBrowse.prototype.render = function () {
324
+ XEditBrowse.prototype.render = function () {
325
325
  var xBrowseMeta = this.state.xBrowseMeta;
326
326
  var xEditModeHandlers = {
327
327
  onStart: this.onEditModeStart,
@@ -355,6 +355,6 @@ var XBrowse = /** @class */ (function (_super) {
355
355
  entitySourceCodeLink,
356
356
  react_1.default.createElement(XEditColumnDialog_1.XEditColumnDialog, { dialogOpened: this.state.editColumnDialogOpened, entity: xBrowseMeta.entity, addColumn: this.addColumn, xEditColumnDialogValues: this.xEditColumnDialogValues, onHideDialog: this.editColumnDialogOnHide })));
357
357
  };
358
- return XBrowse;
358
+ return XEditBrowse;
359
359
  }(react_1.Component));
360
- exports.XBrowse = XBrowse;
360
+ exports.XEditBrowse = XEditBrowse;
@@ -1,13 +1,13 @@
1
1
  import { Component } from "react";
2
2
  import { XObject } from "./XObject";
3
3
  import { OperationType } from "./XUtils";
4
- import { FieldOnChange, XFormComponent } from "./XFormComponent";
5
- import { TableFieldOnChange, XFormDataTable2, XRowTechData } from "./XFormDataTable2";
4
+ import { XFieldOnChange, XFormComponent } from "./XFormComponent";
5
+ import { XTableFieldOnChange, XFormDataTable2, XRowTechData } from "./XFormDataTable2";
6
6
  import { XErrorMap, XErrors } from "./XErrors";
7
7
  export type XOnSaveOrCancelProp = (object: XObject | null, objectChange: OperationType) => void;
8
- export interface FormProps {
8
+ export interface XFormProps {
9
9
  id?: number;
10
- object?: XObject;
10
+ initValues?: object;
11
11
  onSaveOrCancel?: XOnSaveOrCancelProp;
12
12
  }
13
13
  export declare function Form(entity: string): <T extends new (...args: any[]) => {}>(constructor: T) => {
@@ -15,7 +15,7 @@ export declare function Form(entity: string): <T extends new (...args: any[]) =>
15
15
  entity: string;
16
16
  };
17
17
  } & T;
18
- export declare abstract class XFormBase extends Component<FormProps> {
18
+ export declare abstract class XFormBase extends Component<XFormProps> {
19
19
  entity?: string;
20
20
  fields: Set<string>;
21
21
  state: {
@@ -29,18 +29,18 @@ export declare abstract class XFormBase extends Component<FormProps> {
29
29
  assoc: string;
30
30
  sortField: string;
31
31
  }>;
32
- constructor(props: FormProps);
32
+ constructor(props: XFormProps);
33
33
  componentDidMount(): Promise<void>;
34
34
  getEntity(): string;
35
35
  getXObject(): XObject;
36
36
  getObject(): any;
37
37
  isAddRow(): any;
38
- onFieldChange(field: string, value: any, error?: string | undefined, onChange?: FieldOnChange, assocObjectChange?: OperationType): void;
39
- onTableFieldChange(rowData: any, field: string, value: any, error?: string | undefined, onChange?: TableFieldOnChange, assocObjectChange?: OperationType): void;
38
+ onFieldChange(field: string, value: any, error?: string | undefined, onChange?: XFieldOnChange, assocObjectChange?: OperationType): void;
39
+ onTableFieldChange(rowData: any, field: string, value: any, error?: string | undefined, onChange?: XTableFieldOnChange, assocObjectChange?: OperationType): void;
40
40
  /**
41
41
  * @deprecated - mal by sa pouzivat onTableFieldChange
42
42
  */
43
- onObjectDataChange(row?: any, onChange?: TableFieldOnChange): void;
43
+ onObjectDataChange(row?: any, onChange?: XTableFieldOnChange): void;
44
44
  setStateXForm(): void;
45
45
  onTableAddRow(assocField: string, newRow: any, dataKey?: string, selectedRow?: {}): void;
46
46
  static getNextRowId(rowList: any[], dataKey: string): number;
@@ -61,6 +61,7 @@ export declare abstract class XFormBase extends Component<FormProps> {
61
61
  getErrorMessagesForAssoc(oneToManyAssoc: string): string;
62
62
  static saveErrorsIntoXRowTechData(row: any, xErrors: XErrors): void;
63
63
  formReadOnly(object: XObject, field: string): boolean;
64
+ createNewObject(): XObject;
64
65
  preInitForm(object: XObject, operationType: OperationType.Insert | OperationType.Update): void;
65
66
  validate(object: XObject): XErrors;
66
67
  preSave(object: XObject): void;
@@ -116,20 +116,20 @@ var XFormBase = /** @class */ (function (_super) {
116
116
  function XFormBase(props) {
117
117
  var _this = _super.call(this, props) || this;
118
118
  // check
119
- if (props.id !== undefined && props.object !== undefined) {
120
- throw "Form cannot have both props id and object defined. Only one of them can be defined.";
119
+ if (props.id !== undefined && props.initValues !== undefined) {
120
+ throw "Form cannot have both props id and initValues defined. Only one of them can be defined.";
121
121
  }
122
122
  //this.entity = props.entity; - nastavuje sa cez decorator @Form
123
123
  var object = null;
124
- if (props.id === undefined) {
125
- // add row operation
126
- if (props.object !== undefined) {
127
- object = props.object;
128
- }
129
- else {
130
- object = {}; // empty new object
131
- }
132
- }
124
+ // if (props.id === undefined) {
125
+ // // add row operation
126
+ // if (props.object !== undefined) {
127
+ // object = props.object;
128
+ // }
129
+ // else {
130
+ // object = {}; // empty new object
131
+ // }
132
+ // }
133
133
  _this.fields = new Set();
134
134
  _this.state = {
135
135
  object: object,
@@ -182,7 +182,11 @@ var XFormBase = /** @class */ (function (_super) {
182
182
  return [3 /*break*/, 3];
183
183
  case 2:
184
184
  // add new row
185
- object = this.state.object;
185
+ object = this.createNewObject();
186
+ // pridame pripadne "init values", ktore pridu cez prop object (pouziva sa napr. pri insertovani cez XAutoComplete na predplnenie hodnoty)
187
+ if (this.props.initValues !== undefined) {
188
+ object = __assign(__assign({}, object), this.props.initValues); // values from this.props.object will override values from object (if key is the same)
189
+ }
186
190
  operationType = XUtils_1.OperationType.Insert;
187
191
  _d.label = 3;
188
192
  case 3:
@@ -590,6 +594,10 @@ var XFormBase = /** @class */ (function (_super) {
590
594
  XFormBase.prototype.formReadOnly = function (object, field) {
591
595
  return false;
592
596
  };
597
+ // this method can be overriden in subclass if needed (to set some default values for insert)
598
+ XFormBase.prototype.createNewObject = function () {
599
+ return {};
600
+ };
593
601
  // this method can be overriden in subclass if needed (to modify/save object after read from DB and before set into the form)
594
602
  XFormBase.prototype.preInitForm = function (object, operationType) {
595
603
  };
@@ -4,7 +4,7 @@ import { XError } from "./XErrors";
4
4
  import { OperationType } from "./XUtils";
5
5
  import { XFieldChangeEvent } from "./XFieldChangeEvent";
6
6
  import { XCustomFilter } from "../serverApi/FindParam";
7
- export type FieldOnChange = (e: XFieldChangeEvent<any>) => void;
7
+ export type XFieldOnChange = (e: XFieldChangeEvent<any>) => void;
8
8
  export type XReadOnlyProp = boolean | ((object: any) => boolean);
9
9
  export type XFilterProp = XCustomFilter | ((object: any) => XCustomFilter | undefined);
10
10
  export interface XFormComponentProps<T> {
@@ -13,13 +13,13 @@ export interface XFormComponentProps<T> {
13
13
  readOnly?: XReadOnlyProp;
14
14
  labelStyle?: React.CSSProperties;
15
15
  inline?: boolean;
16
- onChange?: FieldOnChange;
16
+ onChange?: XFieldOnChange;
17
17
  }
18
18
  export declare abstract class XFormComponent<T, P extends XFormComponentProps<T>> extends Component<P> {
19
19
  protected constructor(props: P);
20
20
  abstract getField(): string;
21
21
  getValueFromObject(): any;
22
- onValueChangeBase(value: any, onChange?: FieldOnChange, assocObjectChange?: OperationType): void;
22
+ onValueChangeBase(value: any, onChange?: XFieldOnChange, assocObjectChange?: OperationType): void;
23
23
  abstract isNotNull(): boolean;
24
24
  isReadOnly(): boolean;
25
25
  getLabel(): string;
@@ -3,19 +3,19 @@ import { Component } from "react";
3
3
  import { OperationType } from "./XUtils";
4
4
  import { XError } from "./XErrors";
5
5
  import { XCustomFilter } from "../serverApi/FindParam";
6
- import { XTableFieldFilterProp, TableFieldOnChange } from "./XFormDataTable2";
6
+ import { XTableFieldFilterProp, XTableFieldOnChange, XTableFieldReadOnlyProp } from "./XFormDataTable2";
7
7
  export interface XFormComponentDTProps {
8
8
  form: XFormBase;
9
9
  entity: string;
10
10
  rowData: any;
11
- readOnly?: boolean;
12
- onChange?: TableFieldOnChange;
11
+ readOnly?: XTableFieldReadOnlyProp;
12
+ onChange?: XTableFieldOnChange;
13
13
  }
14
14
  export declare abstract class XFormComponentDT<P extends XFormComponentDTProps> extends Component<P> {
15
15
  protected constructor(props: P);
16
16
  abstract getField(): string;
17
17
  getValueFromRowData(): any;
18
- onValueChangeBase(value: any, onChange?: TableFieldOnChange, assocObjectChange?: OperationType): void;
18
+ onValueChangeBase(value: any, onChange?: XTableFieldOnChange, assocObjectChange?: OperationType): void;
19
19
  abstract isNotNull(): boolean;
20
20
  isReadOnly(): boolean;
21
21
  validate(): {
@@ -60,17 +60,16 @@ var XFormComponentDT = /** @class */ (function (_super) {
60
60
  else if (typeof this.props.readOnly === 'boolean') {
61
61
  readOnly = this.props.readOnly;
62
62
  }
63
- // else if (typeof this.props.readOnly === 'function') {
64
- // // TODO - tazko povedat ci niekedy bude object === null (asi ano vid metodu getFilterBase)
65
- // TODO - use also this.props.rowData
66
- // const object: XObject = this.props.form.state.object;
67
- // if (object) {
68
- // readOnly = this.props.readOnly(this.props.form.getXObject());
69
- // }
70
- // else {
71
- // readOnly = true;
72
- // }
73
- // }
63
+ else if (typeof this.props.readOnly === 'function') {
64
+ // TODO - tazko povedat ci niekedy bude object === null (asi ano vid metodu getFilterBase)
65
+ var object = this.props.form.state.object;
66
+ if (object) {
67
+ readOnly = this.props.readOnly(this.props.form.getXObject(), this.props.rowData);
68
+ }
69
+ else {
70
+ readOnly = true;
71
+ }
72
+ }
74
73
  else {
75
74
  // readOnly is undefined
76
75
  readOnly = false;
@@ -66,8 +66,8 @@ export declare class XFormDataTable2 extends Component<XFormDataTableProps> {
66
66
  };
67
67
  constructor(props: XFormDataTableProps);
68
68
  getPathForColumn(columnProps: XFormColumnProps): string;
69
- getDisplayFieldOrId(columnPropsAutoComplete: XFormAutoCompleteColumnProps): string;
70
69
  static getHeader(columnProps: XFormColumnProps, xEntity: XEntity, field: string, xField: XField): string;
70
+ static isReadOnlyHeader(path: string | undefined, readOnly: XTableFieldReadOnlyProp | undefined): boolean;
71
71
  getEntity(): string;
72
72
  createInitFilters(): DataTableFilterMeta;
73
73
  getFilterMatchMode(xField: XField): FilterMatchMode;
@@ -86,16 +86,17 @@ export declare class XFormDataTable2 extends Component<XFormDataTableProps> {
86
86
  isReadOnly(): boolean;
87
87
  render(): JSX.Element;
88
88
  }
89
- export type TableFieldOnChange = (e: XTableFieldChangeEvent<any, any>) => void;
89
+ export type XTableFieldOnChange = (e: XTableFieldChangeEvent<any, any>) => void;
90
+ export type XTableFieldReadOnlyProp = boolean | ((object: any, tableRow: any) => boolean);
90
91
  export type XTableFieldFilterProp = XCustomFilter | ((object: any, rowData: any) => XCustomFilter | undefined);
91
92
  export interface XFormColumnProps {
92
93
  type: "inputSimple" | "dropdown" | "autoComplete" | "searchButton";
93
94
  header?: any;
94
- readOnly?: boolean;
95
+ readOnly?: XTableFieldReadOnlyProp;
95
96
  dropdownInFilter?: boolean;
96
97
  showFilterMenu?: boolean;
97
98
  width?: string;
98
- onChange?: TableFieldOnChange;
99
+ onChange?: XTableFieldOnChange;
99
100
  }
100
101
  export interface XFormInputSimpleColumnProps extends XFormColumnProps {
101
102
  field: string;
@@ -108,15 +109,16 @@ export interface XFormDropdownColumnProps extends XFormColumnProps {
108
109
  }
109
110
  export interface XFormAutoCompleteColumnProps extends XFormColumnProps {
110
111
  assocField: string;
111
- displayField: string | ((suggestion: any) => string);
112
- searchTable?: any;
113
- assocForm?: any;
112
+ displayField: string;
113
+ searchBrowse?: JSX.Element;
114
+ assocForm?: JSX.Element;
114
115
  filter?: XTableFieldFilterProp;
116
+ suggestions?: any[];
115
117
  }
116
118
  export interface XFormSearchButtonColumnProps extends XFormColumnProps {
117
119
  assocField: string;
118
120
  displayField: string;
119
- searchTable: any;
121
+ searchBrowse: JSX.Element;
120
122
  }
121
123
  export declare const XFormColumn: {
122
124
  (props: XFormInputSimpleColumnProps): null;
@@ -79,6 +79,7 @@ var tristatecheckbox_1 = require("primereact/tristatecheckbox");
79
79
  var api_1 = require("primereact/api");
80
80
  var XAutoCompleteDT_1 = require("./XAutoCompleteDT");
81
81
  var XButtonIconNarrow_1 = require("./XButtonIconNarrow");
82
+ var XUtilsCommon_1 = require("../serverApi/XUtilsCommon");
82
83
  var XLocale_1 = require("./XLocale");
83
84
  var XInputIntervalDT_1 = require("./XInputIntervalDT");
84
85
  var XFormDataTable2 = /** @class */ (function (_super) {
@@ -140,7 +141,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
140
141
  }
141
142
  else if (columnProps.type === "autoComplete") {
142
143
  var columnPropsAutoComplete = columnProps;
143
- return columnPropsAutoComplete.assocField + '.' + this.getDisplayFieldOrId(columnPropsAutoComplete);
144
+ return columnPropsAutoComplete.assocField + '.' + columnPropsAutoComplete.displayField;
144
145
  }
145
146
  else if (columnProps.type === "searchButton") {
146
147
  var columnPropsSearchButton = columnProps;
@@ -150,21 +151,8 @@ var XFormDataTable2 = /** @class */ (function (_super) {
150
151
  throw "Unknown prop type = " + columnProps.type;
151
152
  }
152
153
  };
153
- XFormDataTable2.prototype.getDisplayFieldOrId = function (columnPropsAutoComplete) {
154
- // toto je hack - ak ratame displayField cez funkciu, tak nam potom v kode chyba (hociaky) atribut asociovaneho objektu
155
- // aby sme nemuseli robit nejake velke prerabky a zmeny, tak podsunieme id-ckovy atribut
156
- if (typeof columnPropsAutoComplete.displayField === 'string') {
157
- return columnPropsAutoComplete.displayField; // vsetko ok
158
- }
159
- else {
160
- // v displayField mame funkciu, zistime id-ckovy atribut
161
- // TODO - problem - sortovanie/filtrovanie bude fungovat podla tohto id atributu
162
- var xAssoc = XUtilsMetadata_1.XUtilsMetadata.getXAssocToOne(XUtilsMetadata_1.XUtilsMetadata.getXEntity(this.getEntity()), columnPropsAutoComplete.assocField);
163
- return XUtilsMetadata_1.XUtilsMetadata.getXEntity(xAssoc.entityName).idField;
164
- }
165
- };
166
154
  XFormDataTable2.getHeader = function (columnProps, xEntity, field, xField) {
167
- var _a, _b, _c, _d;
155
+ var _a;
168
156
  // poznamky - parametre field a xField by sme mohli vyratavat na zaklade columnProps ale kedze ich uz mame, setrime performance a neduplikujeme vypocet
169
157
  // nie je to tu uplne idealne nakodene, ale je to pomerne prehladne
170
158
  var isNullable = true;
@@ -172,35 +160,58 @@ var XFormDataTable2 = /** @class */ (function (_super) {
172
160
  if (columnProps.type === "inputSimple") {
173
161
  var columnPropsInputSimple = columnProps;
174
162
  isNullable = xField.isNullable;
175
- readOnly = XUtils_1.XUtils.isReadOnly(columnPropsInputSimple.field, columnProps.readOnly);
163
+ readOnly = XFormDataTable2.isReadOnlyHeader(columnPropsInputSimple.field, columnProps.readOnly);
176
164
  }
177
165
  else if (columnProps.type === "dropdown") {
178
166
  var columnPropsDropdown = columnProps;
179
167
  var xAssoc = XUtilsMetadata_1.XUtilsMetadata.getXAssocToOne(xEntity, columnPropsDropdown.assocField);
180
168
  isNullable = xAssoc.isNullable;
181
- readOnly = (_a = columnProps.readOnly) !== null && _a !== void 0 ? _a : false;
169
+ readOnly = XFormDataTable2.isReadOnlyHeader(undefined, columnProps.readOnly);
182
170
  }
183
171
  else if (columnProps.type === "autoComplete") {
184
172
  var columnPropsAutoComplete = columnProps;
185
173
  var xAssoc = XUtilsMetadata_1.XUtilsMetadata.getXAssocToOne(xEntity, columnPropsAutoComplete.assocField);
186
174
  isNullable = xAssoc.isNullable;
187
- readOnly = (_b = columnProps.readOnly) !== null && _b !== void 0 ? _b : false;
175
+ readOnly = XFormDataTable2.isReadOnlyHeader(undefined, columnProps.readOnly);
188
176
  }
189
177
  else if (columnProps.type === "searchButton") {
190
178
  var columnPropsSearchButton = columnProps;
191
179
  var xAssoc = XUtilsMetadata_1.XUtilsMetadata.getXAssocToOne(xEntity, columnPropsSearchButton.assocField);
192
180
  isNullable = xAssoc.isNullable;
193
- readOnly = (_c = columnProps.readOnly) !== null && _c !== void 0 ? _c : false;
181
+ readOnly = XFormDataTable2.isReadOnlyHeader(undefined, columnProps.readOnly);
194
182
  }
195
183
  else {
196
184
  throw "Unknown prop type = " + columnProps.type;
197
185
  }
198
- var header = (_d = columnProps.header) !== null && _d !== void 0 ? _d : field;
186
+ var header = (_a = columnProps.header) !== null && _a !== void 0 ? _a : field;
199
187
  if (!isNullable && !readOnly) {
200
188
  header = XUtils_1.XUtils.markNotNull(header);
201
189
  }
202
190
  return header;
203
191
  };
192
+ // helper
193
+ XFormDataTable2.isReadOnlyHeader = function (path, readOnly) {
194
+ var isReadOnly;
195
+ if (path && !XUtilsCommon_1.XUtilsCommon.isSingleField(path)) {
196
+ // if the length of field is 2 or more, then readOnly
197
+ isReadOnly = true;
198
+ }
199
+ // formReadOnlyBase is called on the level XFormDataTable2
200
+ // else if (this.props.form.formReadOnlyBase("xxx")) {
201
+ // isReadOnly = true;
202
+ // }
203
+ else if (typeof readOnly === 'boolean') {
204
+ isReadOnly = readOnly;
205
+ }
206
+ else if (typeof readOnly === 'function') {
207
+ isReadOnly = false;
208
+ }
209
+ else {
210
+ // readOnly is undefined
211
+ isReadOnly = false;
212
+ }
213
+ return isReadOnly;
214
+ };
204
215
  XFormDataTable2.prototype.getEntity = function () {
205
216
  if (this.entity === undefined) {
206
217
  throw "Unexpected error: this.entity is undefined";
@@ -337,12 +348,11 @@ var XFormDataTable2 = /** @class */ (function (_super) {
337
348
  */
338
349
  // body={(rowData: any) => bodyTemplate(childColumn.props.field, rowData)}
339
350
  XFormDataTable2.prototype.bodyTemplate = function (columnProps, tableReadOnly, rowData, xEntity) {
340
- var _a, _b;
341
351
  var body;
352
+ // tableReadOnly has higher prio then property readOnly
353
+ var readOnly = tableReadOnly ? true : columnProps.readOnly;
342
354
  if (columnProps.type === "inputSimple") {
343
355
  var columnPropsInputSimple = columnProps;
344
- // tableReadOnly has higher prio then property readOnly
345
- var readOnly = tableReadOnly || ((_a = columnPropsInputSimple.readOnly) !== null && _a !== void 0 ? _a : false);
346
356
  var xField = XUtilsMetadata_1.XUtilsMetadata.getXFieldByPath(xEntity, columnPropsInputSimple.field);
347
357
  if (xField.type === "decimal" || xField.type === "number") {
348
358
  body = react_1.default.createElement(XInputDecimalDT_1.XInputDecimalDT, { form: this.props.form, entity: this.getEntity(), field: columnPropsInputSimple.field, rowData: rowData, readOnly: readOnly, onChange: columnPropsInputSimple.onChange });
@@ -363,17 +373,15 @@ var XFormDataTable2 = /** @class */ (function (_super) {
363
373
  }
364
374
  else if (columnProps.type === "dropdown") {
365
375
  var columnPropsDropdown = columnProps;
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 });
376
+ 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, readOnly: readOnly });
367
377
  }
368
378
  else if (columnProps.type === "autoComplete") {
369
379
  var columnPropsAutoComplete = columnProps;
370
- // tableReadOnly has higher prio then property readOnly
371
- var readOnly = tableReadOnly || ((_b = columnPropsAutoComplete.readOnly) !== null && _b !== void 0 ? _b : false);
372
- 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, readOnly: readOnly });
380
+ body = react_1.default.createElement(XAutoCompleteDT_1.XAutoCompleteDT, { form: this.props.form, entity: this.getEntity(), assocField: columnPropsAutoComplete.assocField, displayField: columnPropsAutoComplete.displayField, searchBrowse: columnPropsAutoComplete.searchBrowse, assocForm: columnPropsAutoComplete.assocForm, filter: columnPropsAutoComplete.filter, suggestions: columnPropsAutoComplete.suggestions, rowData: rowData, readOnly: readOnly });
373
381
  }
374
382
  else if (columnProps.type === "searchButton") {
375
383
  var columnPropsSearchButton = columnProps;
376
- 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 });
384
+ body = react_1.default.createElement(XSearchButtonDT_1.XSearchButtonDT, { form: this.props.form, entity: this.getEntity(), assocField: columnPropsSearchButton.assocField, displayField: columnPropsSearchButton.displayField, searchBrowse: columnPropsSearchButton.searchBrowse, rowData: rowData, readOnly: columnPropsSearchButton.readOnly });
377
385
  }
378
386
  else {
379
387
  throw "Unknown prop type = " + columnProps.type;
@@ -1,12 +1,12 @@
1
1
  import { Component } from "react";
2
2
  export interface XFormNavigator3Props {
3
- rootFormElement?: any;
3
+ rootFormElement?: JSX.Element;
4
4
  }
5
5
  export declare class XFormNavigator3 extends Component<XFormNavigator3Props> {
6
6
  state: {
7
- formElements: any[];
7
+ formElements: JSX.Element[];
8
8
  };
9
9
  constructor(props: XFormNavigator3Props);
10
- openForm(newFormElement: any): void;
10
+ openForm(newFormElement: JSX.Element | null): void;
11
11
  render(): JSX.Element;
12
12
  }