@michalrakus/x-react-web-lib 1.10.0 → 1.11.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 (38) 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 +4 -4
  12. package/lib/components/XAutoComplete.js +9 -19
  13. package/lib/components/XAutoCompleteBase.d.ts +15 -5
  14. package/lib/components/XAutoCompleteBase.js +114 -95
  15. package/lib/components/XAutoCompleteDT.d.ts +4 -3
  16. package/lib/components/XAutoCompleteDT.js +8 -7
  17. package/lib/components/{XBrowse.d.ts → XEditBrowse.d.ts} +3 -3
  18. package/lib/components/{XBrowse.js → XEditBrowse.js} +22 -22
  19. package/lib/components/XFormBase.d.ts +5 -4
  20. package/lib/components/XFormBase.js +20 -12
  21. package/lib/components/XFormDataTable2.d.ts +5 -5
  22. package/lib/components/XFormDataTable2.js +3 -16
  23. package/lib/components/XFormNavigator3.d.ts +3 -3
  24. package/lib/components/XFormNavigator3.js +2 -2
  25. package/lib/components/XLazyDataTable.d.ts +9 -2
  26. package/lib/components/XLazyDataTable.js +17 -15
  27. package/lib/components/{SearchTableParams.d.ts → XSearchBrowseParams.d.ts} +2 -2
  28. package/lib/components/XSearchButton.d.ts +2 -2
  29. package/lib/components/XSearchButton.js +7 -11
  30. package/lib/components/XSearchButtonDT.d.ts +2 -2
  31. package/lib/components/XSearchButtonDT.js +9 -5
  32. package/lib/components/XUtils.d.ts +18 -0
  33. package/lib/components/XUtils.js +47 -6
  34. package/lib/components/locale/x-en.json +4 -1
  35. package/package.json +1 -1
  36. package/XBrowse.d.ts +0 -3
  37. package/XBrowse.js +0 -5
  38. /package/lib/components/{SearchTableParams.js → XSearchBrowseParams.js} +0 -0
@@ -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;
@@ -5,9 +5,9 @@ import { FieldOnChange, XFormComponent } from "./XFormComponent";
5
5
  import { TableFieldOnChange, 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,7 +29,7 @@ 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;
@@ -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
  };
@@ -66,7 +66,6 @@ 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;
71
70
  getEntity(): string;
72
71
  createInitFilters(): DataTableFilterMeta;
@@ -108,15 +107,16 @@ export interface XFormDropdownColumnProps extends XFormColumnProps {
108
107
  }
109
108
  export interface XFormAutoCompleteColumnProps extends XFormColumnProps {
110
109
  assocField: string;
111
- displayField: string | ((suggestion: any) => string);
112
- searchTable?: any;
113
- assocForm?: any;
110
+ displayField: string;
111
+ searchBrowse?: JSX.Element;
112
+ assocForm?: JSX.Element;
114
113
  filter?: XTableFieldFilterProp;
114
+ suggestions?: any[];
115
115
  }
116
116
  export interface XFormSearchButtonColumnProps extends XFormColumnProps {
117
117
  assocField: string;
118
118
  displayField: string;
119
- searchTable: any;
119
+ searchBrowse: JSX.Element;
120
120
  }
121
121
  export declare const XFormColumn: {
122
122
  (props: XFormInputSimpleColumnProps): null;
@@ -140,7 +140,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
140
140
  }
141
141
  else if (columnProps.type === "autoComplete") {
142
142
  var columnPropsAutoComplete = columnProps;
143
- return columnPropsAutoComplete.assocField + '.' + this.getDisplayFieldOrId(columnPropsAutoComplete);
143
+ return columnPropsAutoComplete.assocField + '.' + columnPropsAutoComplete.displayField;
144
144
  }
145
145
  else if (columnProps.type === "searchButton") {
146
146
  var columnPropsSearchButton = columnProps;
@@ -150,19 +150,6 @@ var XFormDataTable2 = /** @class */ (function (_super) {
150
150
  throw "Unknown prop type = " + columnProps.type;
151
151
  }
152
152
  };
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
153
  XFormDataTable2.getHeader = function (columnProps, xEntity, field, xField) {
167
154
  var _a, _b, _c, _d;
168
155
  // poznamky - parametre field a xField by sme mohli vyratavat na zaklade columnProps ale kedze ich uz mame, setrime performance a neduplikujeme vypocet
@@ -369,11 +356,11 @@ var XFormDataTable2 = /** @class */ (function (_super) {
369
356
  var columnPropsAutoComplete = columnProps;
370
357
  // tableReadOnly has higher prio then property readOnly
371
358
  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 });
359
+ 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
360
  }
374
361
  else if (columnProps.type === "searchButton") {
375
362
  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 });
363
+ 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
364
  }
378
365
  else {
379
366
  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
  }
@@ -110,11 +110,11 @@ var XFormNavigator3 = /** @class */ (function (_super) {
110
110
  };
111
111
  XFormNavigator3.prototype.render = function () {
112
112
  var _this = this;
113
- var formElements = this.props.rootFormElement !== null ? __spreadArray([this.props.rootFormElement], __read(this.state.formElements), false) : this.state.formElements;
113
+ var formElements = this.props.rootFormElement ? __spreadArray([this.props.rootFormElement], __read(this.state.formElements), false) : this.state.formElements;
114
114
  var forms = formElements.map(function (formElement, index) {
115
115
  var displayed = (index === formElements.length - 1);
116
116
  // klonovanim elementu pridame atribut openForm={this.openForm} (nemusime tento atribut pridavat pri vytvarani elementu)
117
- var formElementCloned = react_1.default.cloneElement(formElement, { openForm: _this.openForm, displayed: displayed }, formElement.children);
117
+ var formElementCloned = react_1.default.cloneElement(formElement, { openForm: _this.openForm, displayed: displayed } /*, (formElement as any).children*/);
118
118
  // prvych n - 1 komponentov skryjeme cez display: "none" a az posledny vyrenderujeme naozaj (cez display: "block")
119
119
  // TODO - do buducnosti - ak nechceme drzat stav componentu cez display: "none", staci vratit null (komponent vobec nevyrenderujeme)
120
120
  var display = (displayed ? "block" : "none");
@@ -1,7 +1,7 @@
1
1
  import React, { ReactChild } from 'react';
2
2
  import { DataTableFilterMeta, DataTableFilterMetaData, DataTableOperatorFilterMetaData } from 'primereact/datatable';
3
3
  import { ColumnBodyOptions, ColumnFilterElementTemplateOptions } from 'primereact/column';
4
- import { SearchTableParams } from "./SearchTableParams";
4
+ import { XSearchBrowseParams } from "./XSearchBrowseParams";
5
5
  import { XAggregateType, XCustomFilter } from "../serverApi/FindParam";
6
6
  import { XOnSaveOrCancelProp } from "./XFormBase";
7
7
  export type XBetweenFilterProp = "row" | "column" | undefined;
@@ -15,6 +15,13 @@ export interface XEditModeHandlers {
15
15
  onMoveColumnLeft: (field: string) => void;
16
16
  onMoveColumnRight: (field: string) => void;
17
17
  }
18
+ export interface XBrowseProps {
19
+ displayed?: boolean;
20
+ openForm?: (newFormElement: JSX.Element | null) => void;
21
+ }
22
+ export interface XSearchBrowseProps {
23
+ searchBrowseParams?: XSearchBrowseParams;
24
+ }
18
25
  export interface XLazyDataTableProps {
19
26
  entity: string;
20
27
  dataKey?: string;
@@ -35,7 +42,7 @@ export interface XLazyDataTableProps {
35
42
  filters?: DataTableFilterMeta;
36
43
  customFilter?: XCustomFilter;
37
44
  sortField?: string;
38
- searchTableParams?: SearchTableParams;
45
+ searchBrowseParams?: XSearchBrowseParams;
39
46
  width?: string;
40
47
  dataLoadedState?: [boolean, React.Dispatch<React.SetStateAction<boolean>>];
41
48
  editMode?: boolean;
@@ -208,13 +208,15 @@ var XLazyDataTable = function (props) {
208
208
  if (props.filters) {
209
209
  filtersInit = __assign(__assign({}, filtersInit), props.filters); // items from props.filters will replace existing items in filtersInit
210
210
  }
211
- if (props.searchTableParams !== undefined) {
212
- var displayFieldFilter = props.searchTableParams.displayFieldFilter;
211
+ if (props.searchBrowseParams !== undefined) {
212
+ var displayFieldFilter = props.searchBrowseParams.displayFieldFilter;
213
213
  if (displayFieldFilter !== undefined) {
214
214
  filtersInit[displayFieldFilter.field] = createFilterItem(props.filterDisplay, displayFieldFilter.constraint);
215
215
  }
216
- // ak mame props.searchTableParams.customFilterItems, pridame ho
217
- customFilterItems = XUtils_1.XUtils.filterAnd(customFilterItems, props.searchTableParams.customFilter);
216
+ // ak mame props.searchBrowseParams.customFilterFunction, pridame filter
217
+ if (props.searchBrowseParams.customFilterFunction) {
218
+ customFilterItems = XUtils_1.XUtils.filterAnd(customFilterItems, props.searchBrowseParams.customFilterFunction());
219
+ }
218
220
  }
219
221
  var _f = __read((0, react_1.useState)(filtersInit), 2), filters = _f[0], setFilters = _f[1]; // filtrovanie na "controlled manner" (moze sa sem nainicializovat nejaka hodnota)
220
222
  var _g = __read((0, react_1.useState)(props.sortField ? [{ field: props.sortField, order: 1 }] : []), 2), multiSortMeta = _g[0], setMultiSortMeta = _g[1];
@@ -364,11 +366,11 @@ var XLazyDataTable = function (props) {
364
366
  var onRowDoubleClick = function (event) {
365
367
  //console.log("zavolany onRowDoubleClick");
366
368
  //console.log(event.data);
367
- if (props.onEdit !== undefined) {
369
+ if (props.onEdit !== undefined && props.searchBrowseParams === undefined) {
368
370
  props.onEdit(event.data);
369
371
  }
370
- else if (props.searchTableParams !== undefined) {
371
- props.searchTableParams.onChoose(event.data);
372
+ else if (props.searchBrowseParams !== undefined) {
373
+ props.searchBrowseParams.onChoose(event.data);
372
374
  }
373
375
  };
374
376
  var onClickAddRow = function () {
@@ -472,8 +474,8 @@ var XLazyDataTable = function (props) {
472
474
  var onClickChoose = function () {
473
475
  //console.log("zavolany onClickChoose");
474
476
  if (selectedRow !== null) {
475
- if (props.searchTableParams !== undefined) {
476
- props.searchTableParams.onChoose(selectedRow);
477
+ if (props.searchBrowseParams !== undefined) {
478
+ props.searchBrowseParams.onChoose(selectedRow);
477
479
  }
478
480
  }
479
481
  else {
@@ -648,7 +650,7 @@ var XLazyDataTable = function (props) {
648
650
  // }
649
651
  var viewHeight = void 0;
650
652
  var headerFooterHeight = void 0;
651
- if (props.searchTableParams === undefined) {
653
+ if (props.searchBrowseParams === undefined) {
652
654
  // sme v standardnom formulari
653
655
  viewHeight = '100vh';
654
656
  // experimentalne zistena vyska header/footer
@@ -717,7 +719,7 @@ var XLazyDataTable = function (props) {
717
719
  }
718
720
  // else - editMode is undefined - browse is not editable
719
721
  // export pre search button-y zatial vypneme
720
- var exportRows = (props.searchTableParams === undefined);
722
+ var exportRows = (props.searchBrowseParams === undefined);
721
723
  // pre lepsiu citatelnost vytvarame stlpce uz tu
722
724
  var columnElemList = react_1.default.Children.map(props.children, function (child) {
723
725
  // ak chceme zmenit child element, tak treba bud vytvorit novy alebo vyklonovat
@@ -873,12 +875,12 @@ var XLazyDataTable = function (props) {
873
875
  react_1.default.createElement("div", { className: "flex justify-content-center" },
874
876
  react_1.default.createElement(datatable_1.DataTable, { value: value.rowList, dataKey: dataKey, paginator: props.paginator, rows: rows, totalRecords: value.totalRecords, lazy: true, first: first, onPage: onPage, loading: loading, filterDisplay: props.filterDisplay, filters: filters, onFilter: onFilter, sortMode: "multiple", removableSort: true, multiSortMeta: multiSortMeta, onSort: onSort, selectionMode: "single", selection: selectedRow, onSelectionChange: onSelectionChange, onRowDoubleClick: onRowDoubleClick, ref: dataTableEl, className: "p-datatable-sm x-lazy-datatable", resizableColumns: true, columnResizeMode: "expand", tableStyle: tableStyle, paginatorLeft: paginatorLeft, paginatorRight: paginatorRight, scrollable: props.scrollable, scrollHeight: scrollHeight, style: style }, columnElemList)),
875
877
  react_1.default.createElement("div", { className: "flex justify-content-center" },
876
- props.onAddRow !== undefined ? react_1.default.createElement(XButton_1.XButton, { key: "addRow", icon: "pi pi-plus", label: (0, XLocale_1.xLocaleOption)('addRow'), onClick: onClickAddRow }) : null,
877
- props.onEdit !== undefined ? react_1.default.createElement(XButton_1.XButton, { key: "editRow", icon: "pi pi-pencil", label: (0, XLocale_1.xLocaleOption)('editRow'), onClick: onClickEdit }) : null,
878
- props.removeRow !== undefined && props.removeRow !== false ? react_1.default.createElement(XButton_1.XButton, { key: "removeRow", icon: "pi pi-times", label: (0, XLocale_1.xLocaleOption)('removeRow'), onClick: onClickRemoveRow }) : null,
878
+ props.onAddRow !== undefined && props.searchBrowseParams === undefined ? react_1.default.createElement(XButton_1.XButton, { key: "addRow", icon: "pi pi-plus", label: (0, XLocale_1.xLocaleOption)('addRow'), onClick: onClickAddRow }) : null,
879
+ props.onEdit !== undefined && props.searchBrowseParams === undefined ? react_1.default.createElement(XButton_1.XButton, { key: "editRow", icon: "pi pi-pencil", label: (0, XLocale_1.xLocaleOption)('editRow'), onClick: onClickEdit }) : null,
880
+ props.removeRow !== undefined && props.removeRow !== false && props.searchBrowseParams === undefined ? react_1.default.createElement(XButton_1.XButton, { key: "removeRow", icon: "pi pi-times", label: (0, XLocale_1.xLocaleOption)('removeRow'), onClick: onClickRemoveRow }) : null,
879
881
  exportRows ? react_1.default.createElement(XButton_1.XButton, { key: "exportRows", icon: "pi pi-file-export", label: (0, XLocale_1.xLocaleOption)('exportRows'), onClick: onClickExport }) : null,
880
882
  props.appButtons,
881
- props.searchTableParams !== undefined ? react_1.default.createElement(XButton_1.XButton, { key: "choose", label: (0, XLocale_1.xLocaleOption)('chooseRow'), onClick: onClickChoose }) : null,
883
+ props.searchBrowseParams !== undefined ? react_1.default.createElement(XButton_1.XButton, { key: "choose", label: (0, XLocale_1.xLocaleOption)('chooseRow'), onClick: onClickChoose }) : null,
882
884
  exportRows ? react_1.default.createElement(XExportRowsDialog_1.XExportRowsDialog, { key: "exportRowsDialog", dialogOpened: exportRowsDialogOpened, hideDialog: function () { return setExportRowsDialogOpened(false); }, rowCount: exportRowsDialogRowCount, exportParams: createExportParams }) : null)));
883
885
  };
884
886
  exports.XLazyDataTable = XLazyDataTable;
@@ -4,8 +4,8 @@ export interface XFieldFilter {
4
4
  field: string;
5
5
  constraint: DataTableFilterMetaData;
6
6
  }
7
- export interface SearchTableParams {
7
+ export interface XSearchBrowseParams {
8
8
  onChoose: (chosenRow: any) => void;
9
9
  displayFieldFilter?: XFieldFilter;
10
- customFilter?: XCustomFilter;
10
+ customFilterFunction?: () => XCustomFilter | undefined;
11
11
  }
@@ -5,8 +5,8 @@ import { XObject } from "./XObject";
5
5
  export interface XSearchButtonProps extends XFormComponentProps<XObject> {
6
6
  assocField: string;
7
7
  displayField: string;
8
- searchTable: any;
9
- assocForm?: any;
8
+ searchBrowse: JSX.Element;
9
+ assocForm?: JSX.Element;
10
10
  filter?: XFilterProp;
11
11
  size?: number;
12
12
  inputStyle?: React.CSSProperties;
@@ -166,7 +166,7 @@ var XSearchButton = /** @class */ (function (_super) {
166
166
  setInputChanged(false);
167
167
  };
168
168
  var onClickSearch = function (e) {
169
- console.log("zavolany onClickSearch");
169
+ //console.log("zavolany onClickSearch");
170
170
  if (!_this.isReadOnly()) {
171
171
  setDialogOpened(true);
172
172
  // POVODNY KOD
@@ -178,13 +178,13 @@ var XSearchButton = /** @class */ (function (_super) {
178
178
  // OTAZKA - ziskavat id priamo z root objektu? potom ho vsak treba do root objektu pridat
179
179
  var id = (assocObject !== null) ? assocObject[xEntityAssoc.idField] : null;
180
180
  // klonovanim elementu pridame atribut id
181
- var assocForm = react_1.default.cloneElement(props.assocForm, { id: id }, props.assocForm.children);
181
+ var assocForm = react_1.default.cloneElement(props.assocForm, { id: id } /*, props.assocForm.children*/);
182
182
  props.form.props.openForm(assocForm);
183
183
  }
184
184
  }
185
185
  };
186
186
  var onChoose = function (chosenRow) {
187
- console.log("zavolany onChoose");
187
+ //console.log("zavolany onChoose");
188
188
  // zavrieme search dialog
189
189
  // POVODNY KOD
190
190
  //overlayPanelEl.current.hide();
@@ -199,14 +199,12 @@ var XSearchButton = /** @class */ (function (_super) {
199
199
  _this.inputTextRef.current.focus();
200
200
  }
201
201
  };
202
- // {React.createElement(props.searchTable, {searchTableParams: {onChoose: onChoose, displayField: props.displayField, filter: (inputChanged ? inputValueState : undefined)}, ...props.searchTableProps}, null)}
203
- // <BrandSearchTable searchTableParams={{onChoose: onChoose, displayField: props.displayField, filter: (inputChanged ? inputValueState : undefined)}} qqq="fiha"/>
204
202
  // takto cez metodku, mozno sa metodka vola len ked sa otvori dialog a usetrime nieco...
205
- var createSearchTableParams = function () {
203
+ var createSearchBrowseParams = function () {
206
204
  return {
207
205
  onChoose: onChoose,
208
206
  displayFieldFilter: (inputChanged ? { field: props.displayField, constraint: { value: inputValueState, matchMode: "startsWith" } } : undefined),
209
- customFilter: _this.getFilterBase(_this.props.filter)
207
+ customFilterFunction: function () { return _this.getFilterBase(_this.props.filter); }
210
208
  };
211
209
  };
212
210
  // vypocitame inputValue
@@ -215,10 +213,8 @@ var XSearchButton = /** @class */ (function (_super) {
215
213
  react_1.default.createElement("label", { htmlFor: props.assocField, className: "col-fixed", style: this.getLabelStyle() }, this.getLabel()),
216
214
  react_1.default.createElement("div", { className: "x-search-button-base" },
217
215
  react_1.default.createElement(inputtext_1.InputText, __assign({ id: props.assocField, value: inputValue, onChange: onInputValueChange, onBlur: onInputBlur, readOnly: this.isReadOnly(), ref: this.inputTextRef, maxLength: xDisplayField.length, size: size, style: props.inputStyle }, this.getClassNameTooltip())),
218
- react_1.default.createElement(button_1.Button, { label: "...", onClick: onClickSearch })),
219
- react_1.default.createElement(dialog_1.Dialog, { visible: dialogOpened, onHide: onHide }, react_1.default.cloneElement(props.searchTable, {
220
- searchTableParams: createSearchTableParams()
221
- }, props.searchTable.children))));
216
+ react_1.default.createElement(button_1.Button, { icon: "pi pi-search", onClick: onClickSearch })),
217
+ react_1.default.createElement(dialog_1.Dialog, { visible: dialogOpened, onHide: onHide }, react_1.default.cloneElement(props.searchBrowse, { searchBrowseParams: createSearchBrowseParams() } /*, props.searchBrowse.children*/))));
222
218
  };
223
219
  return XSearchButton;
224
220
  }(XFormComponent_1.XFormComponent));
@@ -5,8 +5,8 @@ export declare const XSearchButtonDT: (props: {
5
5
  entity: string;
6
6
  assocField: string;
7
7
  displayField: string;
8
- searchTable: any;
9
- assocForm?: any;
8
+ searchBrowse: JSX.Element;
9
+ assocForm?: JSX.Element | undefined;
10
10
  rowData: any;
11
11
  readOnly?: boolean | undefined;
12
12
  }) => JSX.Element;
@@ -155,7 +155,7 @@ var XSearchButtonDT = function (props) {
155
155
  // OTAZKA - ziskavat id priamo z root objektu? potom ho vsak treba do root objektu pridat
156
156
  var id = (assocObject !== null && assocObject !== undefined) ? assocObject[xEntityAssoc.idField] : null;
157
157
  // klonovanim elementu pridame atribut id
158
- var assocForm = react_1.default.cloneElement(props.assocForm, { id: id }, props.assocForm.children);
158
+ var assocForm = react_1.default.cloneElement(props.assocForm, { id: id } /*, props.assocForm.children*/);
159
159
  props.form.props.openForm(assocForm);
160
160
  }
161
161
  }
@@ -175,14 +175,18 @@ var XSearchButtonDT = function (props) {
175
175
  inputTextRef.current.focus();
176
176
  }
177
177
  };
178
- // {React.createElement(props.searchTable, {searchTableParams: {onChoose: onChoose, displayField: props.displayField, filter: (inputChanged ? inputValueState : undefined)}, ...props.searchTableProps}, null)}
179
- // <BrandSearchTable searchTableParams={{onChoose: onChoose, displayField: props.displayField, filter: (inputChanged ? inputValueState : undefined)}} qqq="fiha"/>
180
178
  // vypocitame inputValue
181
179
  var inputValue = computeInputValue();
182
180
  return (react_1.default.createElement("div", null,
183
181
  react_1.default.createElement("div", { className: "x-search-button-base" },
184
182
  react_1.default.createElement(inputtext_1.InputText, { id: props.assocField, value: inputValue, onChange: onInputValueChange, onBlur: onInputBlur, readOnly: readOnly, ref: inputTextRef }),
185
- react_1.default.createElement(button_1.Button, { label: "...", onClick: onClickSearch })),
186
- react_1.default.createElement(dialog_1.Dialog, { visible: dialogOpened, onHide: onHide }, react_1.default.cloneElement(props.searchTable, { searchTableParams: { onChoose: onChoose, displayField: props.displayField, filter: (inputChanged ? inputValueState : undefined) } }, props.searchTable.children))));
183
+ react_1.default.createElement(button_1.Button, { icon: "pi pi-search", onClick: onClickSearch })),
184
+ react_1.default.createElement(dialog_1.Dialog, { visible: dialogOpened, onHide: onHide }, react_1.default.cloneElement(props.searchBrowse, {
185
+ searchBrowseParams: {
186
+ onChoose: onChoose,
187
+ displayFieldFilter: (inputChanged ? { field: props.displayField, constraint: { value: inputValueState, matchMode: "startsWith" } } : undefined),
188
+ customFilterFunction: function () { return undefined; } // TODO - dorobit
189
+ }
190
+ } /*, props.searchBrowse.children*/))));
187
191
  };
188
192
  exports.XSearchButtonDT = XSearchButtonDT;
@@ -67,6 +67,24 @@ export declare class XUtils {
67
67
  static removeRow(entity: string, row: any): Promise<void>;
68
68
  static arrayMoveElement(array: any[], position: number, offset: number): void;
69
69
  static arraySort(array: any[], fieldOrStringFunction: string | ((item: any) => string)): any[];
70
+ /**
71
+ * returns true, if param item is member of the array
72
+ * remark: null/undefined items in array are ignored, item = null/undefined is ignored
73
+ *
74
+ * @param array
75
+ * @param item
76
+ * @param idField
77
+ */
78
+ static arrayIncludes<T>(array: T[], item: T, idField: string): boolean;
79
+ /**
80
+ * returns intersection of 2 row lists
81
+ * remark: null/undefined items in both array1 and array2 are ignored
82
+ *
83
+ * @param array1
84
+ * @param array2
85
+ * @param idField
86
+ */
87
+ static arrayIntersect<T>(array1: T[], array2: T[], idField: string): T[];
70
88
  static isReadOnly(path: string, readOnlyInit?: boolean): boolean;
71
89
  static markNotNull(label: string): string;
72
90
  static showErrorMessage(message: string, e: unknown): void;