@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.
- package/XEditBrowse.d.ts +3 -0
- package/XEditBrowse.js +5 -0
- package/XObject.d.ts +3 -0
- package/XObject.js +5 -0
- package/gulpfile.js +2 -1
- package/lib/administration/XBrowseMetaBrowse.d.ts +2 -1
- package/lib/administration/XUserBrowse.d.ts +2 -1
- package/lib/administration/XUserBrowse.js +1 -1
- package/lib/administration/XUserForm.d.ts +6 -3
- package/lib/administration/XUserForm.js +9 -16
- package/lib/components/XAutoComplete.d.ts +4 -4
- package/lib/components/XAutoComplete.js +9 -19
- package/lib/components/XAutoCompleteBase.d.ts +15 -5
- package/lib/components/XAutoCompleteBase.js +114 -95
- package/lib/components/XAutoCompleteDT.d.ts +4 -3
- package/lib/components/XAutoCompleteDT.js +8 -7
- package/lib/components/{XBrowse.d.ts → XEditBrowse.d.ts} +3 -3
- package/lib/components/{XBrowse.js → XEditBrowse.js} +22 -22
- package/lib/components/XFormBase.d.ts +5 -4
- package/lib/components/XFormBase.js +20 -12
- package/lib/components/XFormDataTable2.d.ts +5 -5
- package/lib/components/XFormDataTable2.js +3 -16
- package/lib/components/XFormNavigator3.d.ts +3 -3
- package/lib/components/XFormNavigator3.js +2 -2
- package/lib/components/XLazyDataTable.d.ts +9 -2
- package/lib/components/XLazyDataTable.js +17 -15
- package/lib/components/{SearchTableParams.d.ts → XSearchBrowseParams.d.ts} +2 -2
- package/lib/components/XSearchButton.d.ts +2 -2
- package/lib/components/XSearchButton.js +7 -11
- package/lib/components/XSearchButtonDT.d.ts +2 -2
- package/lib/components/XSearchButtonDT.js +9 -5
- package/lib/components/XUtils.d.ts +18 -0
- package/lib/components/XUtils.js +47 -6
- package/lib/components/locale/x-en.json +4 -1
- package/package.json +1 -1
- package/XBrowse.d.ts +0 -3
- package/XBrowse.js +0 -5
- /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.
|
|
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
|
|
113
|
-
var
|
|
114
|
-
__extends(
|
|
115
|
-
function
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
273
|
+
XEditBrowse.prototype.onMoveColumnLeft = function (field) {
|
|
274
274
|
this.moveColumn(field, -1);
|
|
275
275
|
};
|
|
276
|
-
|
|
276
|
+
XEditBrowse.prototype.onMoveColumnRight = function (field) {
|
|
277
277
|
this.moveColumn(field, 1);
|
|
278
278
|
};
|
|
279
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
358
|
+
return XEditBrowse;
|
|
359
359
|
}(react_1.Component));
|
|
360
|
-
exports.
|
|
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
|
|
8
|
+
export interface XFormProps {
|
|
9
9
|
id?: number;
|
|
10
|
-
|
|
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<
|
|
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:
|
|
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.
|
|
120
|
-
throw "Form cannot have both props id and
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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.
|
|
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
|
|
112
|
-
|
|
113
|
-
assocForm?:
|
|
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
|
-
|
|
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 + '.' +
|
|
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,
|
|
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,
|
|
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?:
|
|
3
|
+
rootFormElement?: JSX.Element;
|
|
4
4
|
}
|
|
5
5
|
export declare class XFormNavigator3 extends Component<XFormNavigator3Props> {
|
|
6
6
|
state: {
|
|
7
|
-
formElements:
|
|
7
|
+
formElements: JSX.Element[];
|
|
8
8
|
};
|
|
9
9
|
constructor(props: XFormNavigator3Props);
|
|
10
|
-
openForm(newFormElement:
|
|
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
|
|
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 }
|
|
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 {
|
|
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
|
-
|
|
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.
|
|
212
|
-
var displayFieldFilter = props.
|
|
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.
|
|
217
|
-
|
|
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.
|
|
371
|
-
props.
|
|
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.
|
|
476
|
-
props.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
7
|
+
export interface XSearchBrowseParams {
|
|
8
8
|
onChoose: (chosenRow: any) => void;
|
|
9
9
|
displayFieldFilter?: XFieldFilter;
|
|
10
|
-
|
|
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
|
-
|
|
9
|
-
assocForm?:
|
|
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 }
|
|
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
|
|
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
|
-
|
|
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, {
|
|
219
|
-
react_1.default.createElement(dialog_1.Dialog, { visible: dialogOpened, onHide: onHide }, react_1.default.cloneElement(props.
|
|
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
|
-
|
|
9
|
-
assocForm?:
|
|
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 }
|
|
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, {
|
|
186
|
-
react_1.default.createElement(dialog_1.Dialog, { visible: dialogOpened, onHide: onHide }, react_1.default.cloneElement(props.
|
|
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;
|