@michalrakus/x-react-web-lib 1.31.2 → 1.32.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/lib/components/XAutoCompleteDT.d.ts +1 -0
- package/lib/components/XAutoCompleteDT.js +1 -1
- package/lib/components/XFormDataTable2.d.ts +2 -0
- package/lib/components/XFormDataTable2.js +2 -2
- package/lib/components/XFtsInput.js +4 -5
- package/lib/components/XInputTextBase.d.ts +16 -0
- package/lib/components/XInputTextBase.js +98 -0
- package/lib/components/XLazyDataTable/XLazyDataTable.d.ts +12 -0
- package/lib/components/XLazyDataTable/XLazyDataTable.js +123 -7
- package/lib/components/XLocale.d.ts +1 -0
- package/lib/components/XLocale.js +7 -1
- package/lib/components/locale/x-en.json +3 -1
- package/lib/serverApi/ExportImportParam.d.ts +3 -3
- package/lib/serverApi/FindParam.d.ts +14 -2
- package/lib/serverApi/FindParam.js +6 -15
- package/package.json +1 -1
|
@@ -16,6 +16,7 @@ export interface XAutoCompleteDTProps extends XFormComponentDTProps {
|
|
|
16
16
|
suggestionsLoad?: XSuggestionsLoadProp;
|
|
17
17
|
lazyLoadMaxRows?: number;
|
|
18
18
|
splitQueryValue?: boolean;
|
|
19
|
+
addRowEnabled: boolean;
|
|
19
20
|
minLength?: number;
|
|
20
21
|
filter?: XTableFieldFilterProp;
|
|
21
22
|
sortField?: string | DataTableSortMeta[];
|
|
@@ -68,7 +68,7 @@ var XAutoCompleteDT = /** @class */ (function (_super) {
|
|
|
68
68
|
// TODO - size
|
|
69
69
|
//const size = this.props.size ?? xDisplayField.length;
|
|
70
70
|
// div className="col" nam zabezpeci aby XAutoCompleteBase nezaberal celu dlzku grid-u (ma nastaveny width=100% vdaka "formgroup-inline")
|
|
71
|
-
return (react_1.default.createElement(XAutoCompleteBase_1.XAutoCompleteBase, { value: this.getValue(), onChange: this.onChangeAutoCompleteBase, field: this.props.displayField, itemTemplate: this.props.itemTemplate, searchBrowse: this.props.searchBrowse, valueForm: this.props.assocForm, idField: xEntityAssoc.idField, readOnly: this.isReadOnly(), error: this.getError(), onErrorChange: this.onErrorChangeAutoCompleteBase, suggestions: this.props.suggestions, suggestionsLoad: this.props.suggestionsLoad, lazyLoadMaxRows: this.props.lazyLoadMaxRows, splitQueryValue: this.props.splitQueryValue, minLength: this.props.minLength, scrollHeight: this.props.scrollHeight, suggestionsQuery: { entity: this.xAssoc.entityName, filter: function () { return _this.getFilterBase(_this.props.filter); }, sortField: this.props.sortField, fields: this.props.fields }, inputClassName: this.props.inputClassName }));
|
|
71
|
+
return (react_1.default.createElement(XAutoCompleteBase_1.XAutoCompleteBase, { value: this.getValue(), onChange: this.onChangeAutoCompleteBase, field: this.props.displayField, itemTemplate: this.props.itemTemplate, searchBrowse: this.props.searchBrowse, valueForm: this.props.assocForm, idField: xEntityAssoc.idField, readOnly: this.isReadOnly(), error: this.getError(), onErrorChange: this.onErrorChangeAutoCompleteBase, suggestions: this.props.suggestions, suggestionsLoad: this.props.suggestionsLoad, lazyLoadMaxRows: this.props.lazyLoadMaxRows, splitQueryValue: this.props.splitQueryValue, addRowEnabled: this.props.addRowEnabled, minLength: this.props.minLength, scrollHeight: this.props.scrollHeight, suggestionsQuery: { entity: this.xAssoc.entityName, filter: function () { return _this.getFilterBase(_this.props.filter); }, sortField: this.props.sortField, fields: this.props.fields }, inputClassName: this.props.inputClassName }));
|
|
72
72
|
};
|
|
73
73
|
return XAutoCompleteDT;
|
|
74
74
|
}(XFormComponentDT_1.XFormComponentDT));
|
|
@@ -116,6 +116,7 @@ export interface XFormAutoCompleteColumnProps extends XFormColumnBaseProps {
|
|
|
116
116
|
displayField: string;
|
|
117
117
|
searchBrowse?: JSX.Element;
|
|
118
118
|
assocForm?: JSX.Element;
|
|
119
|
+
addRowEnabled: boolean;
|
|
119
120
|
filter?: XTableFieldFilterProp;
|
|
120
121
|
sortField?: string | DataTableSortMeta[];
|
|
121
122
|
fields?: string[];
|
|
@@ -153,6 +154,7 @@ export declare const XFormAutoCompleteColumn: {
|
|
|
153
154
|
(props: XFormAutoCompleteColumnProps): null;
|
|
154
155
|
defaultProps: {
|
|
155
156
|
type: string;
|
|
157
|
+
addRowEnabled: boolean;
|
|
156
158
|
columnViewStatus: boolean;
|
|
157
159
|
};
|
|
158
160
|
};
|
|
@@ -404,7 +404,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
|
|
|
404
404
|
}
|
|
405
405
|
else if (columnProps.type === "autoComplete") {
|
|
406
406
|
var columnPropsAutoComplete = columnProps;
|
|
407
|
-
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, sortField: columnPropsAutoComplete.sortField, fields: columnPropsAutoComplete.fields, suggestions: columnPropsAutoComplete.suggestions, rowData: rowData, readOnly: readOnly });
|
|
407
|
+
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, addRowEnabled: columnPropsAutoComplete.addRowEnabled, filter: columnPropsAutoComplete.filter, sortField: columnPropsAutoComplete.sortField, fields: columnPropsAutoComplete.fields, suggestions: columnPropsAutoComplete.suggestions, rowData: rowData, readOnly: readOnly });
|
|
408
408
|
}
|
|
409
409
|
else if (columnProps.type === "searchButton") {
|
|
410
410
|
var columnPropsSearchButton = columnProps;
|
|
@@ -737,7 +737,7 @@ var XFormAutoCompleteColumn = function (props) {
|
|
|
737
737
|
return (null);
|
|
738
738
|
};
|
|
739
739
|
exports.XFormAutoCompleteColumn = XFormAutoCompleteColumn;
|
|
740
|
-
exports.XFormAutoCompleteColumn.defaultProps = __assign(__assign({}, XFormColumnBase_defaultProps), { type: "autoComplete" });
|
|
740
|
+
exports.XFormAutoCompleteColumn.defaultProps = __assign(__assign({}, XFormColumnBase_defaultProps), { type: "autoComplete", addRowEnabled: true });
|
|
741
741
|
var XFormSearchButtonColumn = function (props) {
|
|
742
742
|
// nevadi ze tu nic nevraciame, field a header vieme precitat a zvysok by sme aj tak zahodili lebo vytvarame novy element
|
|
743
743
|
return (null);
|
|
@@ -15,16 +15,15 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.XFtsInput = void 0;
|
|
18
|
-
var inputtext_1 = require("primereact/inputtext");
|
|
19
18
|
var react_1 = __importDefault(require("react"));
|
|
20
|
-
var
|
|
19
|
+
var XInputTextBase_1 = require("./XInputTextBase");
|
|
21
20
|
var XFtsInput = function (props) {
|
|
22
|
-
var onChange = function (
|
|
23
|
-
var value = (0, XUtilsConversions_1.stringFromUI)(e.target.value);
|
|
21
|
+
var onChange = function (value) {
|
|
24
22
|
props.value.value = value;
|
|
25
23
|
props.onChange(__assign({}, props.value)); // vyklonujeme aby react zaregistroval, ze sme urobili zmenu
|
|
26
24
|
};
|
|
27
25
|
// TODO - pridat input na zmenu matchMode
|
|
28
|
-
|
|
26
|
+
// we use XInputTextBase - we save onChange calls
|
|
27
|
+
return (react_1.default.createElement(XInputTextBase_1.XInputTextBase, { value: props.value.value, onChange: onChange, style: { height: '2.5rem', width: '17rem' }, className: "m-1" }));
|
|
29
28
|
};
|
|
30
29
|
exports.XFtsInput = XFtsInput;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export declare const XInputTextBase: {
|
|
3
|
+
(props: {
|
|
4
|
+
id?: string | undefined;
|
|
5
|
+
value: string | null;
|
|
6
|
+
onChange: (value: string | null) => void;
|
|
7
|
+
readOnly?: boolean | undefined;
|
|
8
|
+
maxLength?: number | undefined;
|
|
9
|
+
size?: string | number | undefined;
|
|
10
|
+
placeholder?: string | undefined;
|
|
11
|
+
className?: string | undefined;
|
|
12
|
+
style?: React.CSSProperties | undefined;
|
|
13
|
+
error?: string | undefined;
|
|
14
|
+
}): React.JSX.Element;
|
|
15
|
+
defaultProps: {};
|
|
16
|
+
};
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
30
|
+
if (mod && mod.__esModule) return mod;
|
|
31
|
+
var result = {};
|
|
32
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
33
|
+
__setModuleDefault(result, mod);
|
|
34
|
+
return result;
|
|
35
|
+
};
|
|
36
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
37
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
38
|
+
if (!m) return o;
|
|
39
|
+
var i = m.call(o), r, ar = [], e;
|
|
40
|
+
try {
|
|
41
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
42
|
+
}
|
|
43
|
+
catch (error) { e = { error: error }; }
|
|
44
|
+
finally {
|
|
45
|
+
try {
|
|
46
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
47
|
+
}
|
|
48
|
+
finally { if (e) throw e.error; }
|
|
49
|
+
}
|
|
50
|
+
return ar;
|
|
51
|
+
};
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.XInputTextBase = void 0;
|
|
54
|
+
var react_1 = __importStar(require("react"));
|
|
55
|
+
var XUtilsConversions_1 = require("../serverApi/XUtilsConversions");
|
|
56
|
+
var XUtils_1 = require("./XUtils");
|
|
57
|
+
var inputtext_1 = require("primereact/inputtext");
|
|
58
|
+
// koli optimalizacii - typovany text si zapisuje do svojej stavovej premennej a onChange zavola az z onBlur
|
|
59
|
+
// used for filter element in XLazyDataTable - if there was many rows/columns in datatable, typing in filter was slow (if setState was called after every character change)
|
|
60
|
+
var XInputTextBase = function (props) {
|
|
61
|
+
// true, ak uzivatel typuje hodnotu
|
|
62
|
+
// false, ak uz uzivatel dotypoval (zavolal sa onBlur) - hodnotu berieme "z hora" (z prop.value)
|
|
63
|
+
var _a = __read((0, react_1.useState)(false), 2), inputChanged = _a[0], setInputChanged = _a[1];
|
|
64
|
+
// pouzivane, len ak inputChanged === true, je tu zapisana zmenena hodnota v inpute
|
|
65
|
+
var _b = __read((0, react_1.useState)(undefined), 2), inputValueState = _b[0], setInputValueState = _b[1];
|
|
66
|
+
var onChange = function (e) {
|
|
67
|
+
// standardne prichadza z Calendar e.value - typ Date alebo null
|
|
68
|
+
// typ Date prichadza ak uzivatel vyplnil validny datum, null (typeof e.value vracia "object") prichadza ak uzivatel vymazal datum
|
|
69
|
+
// alebo je este datum nekompletny (uzivatel prave zadava datum)
|
|
70
|
+
// nastavili sme keepInvalid={true} -> bude chodit nevalidny string (typeof e.value vracia "string")
|
|
71
|
+
// naviac sme vypli parsovanie na datum (metoda parseDateTime), takze vzdy chodi "string" a konverziu robime v onBlur
|
|
72
|
+
//const value: string | null = stringFromUI(e.target.value);
|
|
73
|
+
setInputChanged(true);
|
|
74
|
+
setInputValueState(e.target.value); // vzdycky string
|
|
75
|
+
};
|
|
76
|
+
var onBlur = function (e) {
|
|
77
|
+
if (inputChanged) {
|
|
78
|
+
// poznamka: e.target.value aj inputValueState obsahuju tu istu string hodnotu
|
|
79
|
+
var value = (0, XUtilsConversions_1.stringFromUI)(e.target.value);
|
|
80
|
+
props.onChange(value);
|
|
81
|
+
setInputChanged(false);
|
|
82
|
+
setInputValueState(undefined); // pre poriadok
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
var getInputValue = function () {
|
|
86
|
+
var inputValue;
|
|
87
|
+
if (inputChanged) {
|
|
88
|
+
inputValue = inputValueState; // vzdycky string
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
inputValue = (0, XUtilsConversions_1.stringAsUI)(props.value);
|
|
92
|
+
}
|
|
93
|
+
return inputValue;
|
|
94
|
+
};
|
|
95
|
+
return (react_1.default.createElement(inputtext_1.InputText, __assign({ id: props.id, value: getInputValue(), onChange: onChange, onBlur: onBlur, readOnly: props.readOnly, maxLength: props.maxLength, size: props.size, className: props.className, style: props.style }, XUtils_1.XUtils.createTooltipOrErrorProps(props.error), { placeholder: props.placeholder })));
|
|
96
|
+
};
|
|
97
|
+
exports.XInputTextBase = XInputTextBase;
|
|
98
|
+
exports.XInputTextBase.defaultProps = {};
|
|
@@ -98,6 +98,17 @@ export type XFilterElementParams = {
|
|
|
98
98
|
options: ColumnFilterElementTemplateOptions;
|
|
99
99
|
};
|
|
100
100
|
export type XFilterElementProp = (params: XFilterElementParams) => React.ReactNode;
|
|
101
|
+
export type XAutoCompleteInFilterProps = {
|
|
102
|
+
assocField?: string;
|
|
103
|
+
filter?: XCustomFilter;
|
|
104
|
+
sortField?: string | DataTableSortMeta[];
|
|
105
|
+
lazyLoadMaxRows?: number;
|
|
106
|
+
field?: string | string[];
|
|
107
|
+
searchBrowse?: JSX.Element;
|
|
108
|
+
valueForm?: JSX.Element;
|
|
109
|
+
minLength?: number;
|
|
110
|
+
scrollHeight?: string;
|
|
111
|
+
};
|
|
101
112
|
export type XContentType = "multiline" | "html" | undefined;
|
|
102
113
|
export interface XLazyColumnProps {
|
|
103
114
|
field: string;
|
|
@@ -106,6 +117,7 @@ export interface XLazyColumnProps {
|
|
|
106
117
|
dropdownInFilter?: boolean;
|
|
107
118
|
dropdownFilter?: XCustomFilter;
|
|
108
119
|
dropdownSortField?: string;
|
|
120
|
+
autoComplete?: XAutoCompleteInFilterProps | true;
|
|
109
121
|
showFilterMenu?: boolean;
|
|
110
122
|
betweenFilter?: XBetweenFilterProp | "noBetween";
|
|
111
123
|
width?: string;
|
|
@@ -120,7 +120,7 @@ var XButtonIconSmall_1 = require("../XButtonIconSmall");
|
|
|
120
120
|
var tristatecheckbox_1 = require("primereact/tristatecheckbox");
|
|
121
121
|
var XUtilsCommon_1 = require("../../serverApi/XUtilsCommon");
|
|
122
122
|
var XExportRowsDialog_1 = require("./XExportRowsDialog");
|
|
123
|
-
var api_1 = require("primereact/api");
|
|
123
|
+
var api_1 = __importStar(require("primereact/api"));
|
|
124
124
|
var XCalendar_1 = require("../XCalendar");
|
|
125
125
|
var XInputDecimalBase_1 = require("../XInputDecimalBase");
|
|
126
126
|
var XLocale_1 = require("../XLocale");
|
|
@@ -132,6 +132,8 @@ var XMultilineRenderer_1 = require("./XMultilineRenderer");
|
|
|
132
132
|
var XHtmlRenderer_1 = require("./XHtmlRenderer");
|
|
133
133
|
var XOcfDropdown_1 = require("./XOcfDropdown");
|
|
134
134
|
var XFieldSetBase_1 = require("../XFieldSet/XFieldSetBase");
|
|
135
|
+
var XAutoCompleteBase_1 = require("../XAutoCompleteBase");
|
|
136
|
+
var XInputTextBase_1 = require("../XInputTextBase");
|
|
135
137
|
var XLazyDataTable = function (props) {
|
|
136
138
|
var _a;
|
|
137
139
|
// must be here, is used in createInitFilters()
|
|
@@ -170,7 +172,7 @@ var XLazyDataTable = function (props) {
|
|
|
170
172
|
var field = xLazyColumn.props.field;
|
|
171
173
|
var xField = XUtilsMetadataCommon_1.XUtilsMetadataCommon.getXFieldByPath(xEntity, field);
|
|
172
174
|
// TODO column.props.dropdownInFilter - pre "menu" by bolo fajn mat zoznam "enumov"
|
|
173
|
-
var filterMatchMode =
|
|
175
|
+
var filterMatchMode = getInitFilterMatchMode(xLazyColumn.props, xField);
|
|
174
176
|
initFilters[field] = createFilterItem(props.filterDisplay, { value: null, matchMode: filterMatchMode });
|
|
175
177
|
}
|
|
176
178
|
}
|
|
@@ -183,9 +185,12 @@ var XLazyDataTable = function (props) {
|
|
|
183
185
|
}
|
|
184
186
|
return initFilters;
|
|
185
187
|
};
|
|
186
|
-
var
|
|
188
|
+
var getInitFilterMatchMode = function (xLazyColumnProps, xField) {
|
|
187
189
|
var filterMatchMode;
|
|
188
|
-
if (
|
|
190
|
+
if (isAutoCompleteInFilterEnabled(xLazyColumnProps)) {
|
|
191
|
+
filterMatchMode = FindParam_1.XFilterMatchMode.X_AUTO_COMPLETE; // little hack
|
|
192
|
+
}
|
|
193
|
+
else if (xField.type === "string" || xField.type === "jsonb") {
|
|
189
194
|
filterMatchMode = api_1.FilterMatchMode.CONTAINS;
|
|
190
195
|
}
|
|
191
196
|
// zatial vsetky ostatne EQUALS
|
|
@@ -197,6 +202,40 @@ var XLazyDataTable = function (props) {
|
|
|
197
202
|
}
|
|
198
203
|
return filterMatchMode;
|
|
199
204
|
};
|
|
205
|
+
var isAutoCompleteInFilterEnabled = function (xLazyColumnProps) {
|
|
206
|
+
return xLazyColumnProps.autoComplete !== undefined;
|
|
207
|
+
};
|
|
208
|
+
/* old version - created for automatical use of autocomplete on every *toOne assoc with string attribute
|
|
209
|
+
- extra property was used: autoCompleteEnabled: true | false | "forStringOnly"
|
|
210
|
+
const isAutoCompleteInFilterEnabled = (xLazyColumnProps: XLazyColumnProps, xField: XField): boolean => {
|
|
211
|
+
let autoCompleteEnabled: boolean = false; // default
|
|
212
|
+
// condition1: field has to have the length >= 2
|
|
213
|
+
if (!XUtilsCommon.isSingleField(xLazyColumnProps.field)) {
|
|
214
|
+
// condition2: used assoc must be *toOne
|
|
215
|
+
let assocField: string;
|
|
216
|
+
if (xLazyColumnProps.autoComplete?.assocField) {
|
|
217
|
+
assocField = xLazyColumnProps.autoComplete?.assocField;
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
const [assocFieldTemp, displayFieldTemp] = XUtilsCommon.getPathToAssocAndField(xLazyColumnProps.field);
|
|
221
|
+
assocField = assocFieldTemp!;
|
|
222
|
+
}
|
|
223
|
+
const xAssoc: XAssoc = XUtilsMetadataCommon.getXAssocToOneByPath(xEntity, assocField);
|
|
224
|
+
if (xAssoc.relationType === "many-to-one" || xAssoc.relationType === "one-to-one") {
|
|
225
|
+
if (xLazyColumnProps.autoCompleteEnabled === true) {
|
|
226
|
+
autoCompleteEnabled = true; // explicit enabled - works for all types (usually has not big sense)
|
|
227
|
+
}
|
|
228
|
+
else if (xLazyColumnProps.autoCompleteEnabled === "forStringOnly") {
|
|
229
|
+
// default usecase - the last attribute must be of type string
|
|
230
|
+
if (xField.type === "string") {
|
|
231
|
+
autoCompleteEnabled = true;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return autoCompleteEnabled;
|
|
237
|
+
}
|
|
238
|
+
*/
|
|
200
239
|
var createFilterItem = function (filterDisplay, constraint) {
|
|
201
240
|
var filterItem;
|
|
202
241
|
if (filterDisplay === "menu") {
|
|
@@ -217,6 +256,7 @@ var XLazyDataTable = function (props) {
|
|
|
217
256
|
return { value: null, matchMode: "contains" };
|
|
218
257
|
};
|
|
219
258
|
// premenne platne pre cely component (obdoba member premennych v class-e)
|
|
259
|
+
var primeReactContext = react_1.default.useContext(api_1.PrimeReactContext); // probably does not work and deprecated PrimeReact.filterMatchModeOptions is used
|
|
220
260
|
var dataTableEl = (0, react_1.useRef)(null);
|
|
221
261
|
var customFilterItems = XUtilsCommon_1.XUtilsCommon.createCustomFilterItems(props.customFilter);
|
|
222
262
|
var aggregateItems = createAggregateItems();
|
|
@@ -714,12 +754,13 @@ var XLazyDataTable = function (props) {
|
|
|
714
754
|
};
|
|
715
755
|
// vseobecna metodka - nastavi hodnotu do filtra
|
|
716
756
|
// ak je matchMode === undefined, tak zachova povodnu hodnotu matchMode
|
|
717
|
-
var setFilterValue = function (field, value, matchMode) {
|
|
757
|
+
var setFilterValue = function (field, value, matchMode, customFilterItems) {
|
|
718
758
|
var filterValue = filters[field]; // funguje len pre filterDisplay="row"
|
|
719
759
|
filterValue.value = value;
|
|
720
760
|
if (matchMode !== undefined) {
|
|
721
761
|
filterValue.matchMode = matchMode;
|
|
722
762
|
}
|
|
763
|
+
filterValue.customFilterItems = customFilterItems;
|
|
723
764
|
// treba klonovat, inac react nezobrazi zmenenu hodnotu
|
|
724
765
|
var filtersCloned = __assign({}, filters);
|
|
725
766
|
setFilters(filtersCloned);
|
|
@@ -729,6 +770,11 @@ var XLazyDataTable = function (props) {
|
|
|
729
770
|
var filterValue = filters[field]; // funguje len pre filterDisplay="row"
|
|
730
771
|
return filterValue.value;
|
|
731
772
|
};
|
|
773
|
+
// vseobecna metodka - vrati nastaveny match mode
|
|
774
|
+
var getFilterMatchMode = function (field) {
|
|
775
|
+
var filterValue = filters[field]; // funguje len pre filterDisplay="row"
|
|
776
|
+
return filterValue.matchMode;
|
|
777
|
+
};
|
|
732
778
|
// ****** vseobecne metodky pre set/get do/z filtra - pre betweenFilter ********
|
|
733
779
|
// do DataTableFilterMetaData.value ulozime dvojprvkove pole [value1, value2]
|
|
734
780
|
// na backende spracujeme toto dvojprvkove pole
|
|
@@ -778,6 +824,23 @@ var XLazyDataTable = function (props) {
|
|
|
778
824
|
}
|
|
779
825
|
return betweenFilter;
|
|
780
826
|
};
|
|
827
|
+
// after change from match mode xAutoComplete input displays [object Object] - trying resolving this hug does not work - I have no idea why
|
|
828
|
+
/*
|
|
829
|
+
const onFilterMatchModeChange = (e: ColumnFilterMatchModeChangeEvent): void => {
|
|
830
|
+
console.log(e.matchMode);
|
|
831
|
+
console.log(e.field);
|
|
832
|
+
console.log(getFilterValue(e.field));
|
|
833
|
+
console.log(typeof (getFilterValue(e.field)));
|
|
834
|
+
if (e.matchMode !== XFilterMatchMode.X_AUTO_COMPLETE) {
|
|
835
|
+
const filterValue: any | null = getFilterValue(e.field);
|
|
836
|
+
if (filterValue !== null && typeof filterValue === 'object') {
|
|
837
|
+
console.log("idem volat setFilterValue");
|
|
838
|
+
setFilterValue(e.field, null);
|
|
839
|
+
console.log(getFilterValue(e.field));
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
*/
|
|
781
844
|
var valueAsUI = function (value, xField, contentType, fieldSetId) {
|
|
782
845
|
var valueResult;
|
|
783
846
|
if (xField.type === "boolean") {
|
|
@@ -946,6 +1009,42 @@ var XLazyDataTable = function (props) {
|
|
|
946
1009
|
return childColumn.props.filterElement({ getFilterItem: getFilterItem, setFilterItem: setFilterItem, options: options });
|
|
947
1010
|
};
|
|
948
1011
|
}
|
|
1012
|
+
else if (getFilterMatchMode(childColumn.props.field) === FindParam_1.XFilterMatchMode.X_AUTO_COMPLETE) {
|
|
1013
|
+
var assocField_1 = undefined; // path to manyToOne assoc
|
|
1014
|
+
var displayField = undefined; // field/fields displayed in autocomplete (can be path)
|
|
1015
|
+
// if childColumn.props.autoComplete = true, then autoComplete = undefined and default autocomlete is created
|
|
1016
|
+
var autoComplete = (typeof childColumn.props.autoComplete === 'object' ? childColumn.props.autoComplete : undefined);
|
|
1017
|
+
if (autoComplete) {
|
|
1018
|
+
if (autoComplete.field) {
|
|
1019
|
+
displayField = autoComplete.field;
|
|
1020
|
+
}
|
|
1021
|
+
if (autoComplete.assocField) {
|
|
1022
|
+
// check - autoComplete.assocField must be prefix (part) of childColumn.props.field
|
|
1023
|
+
if (!childColumn.props.field.startsWith(autoComplete.assocField + ".")) {
|
|
1024
|
+
throw "XLazyColumn with field \"".concat(childColumn.props.field, "\": autoComplete.assocField \"").concat(autoComplete.assocField, "\" is not prefix of the field");
|
|
1025
|
+
}
|
|
1026
|
+
assocField_1 = autoComplete.assocField;
|
|
1027
|
+
if (displayField === undefined) {
|
|
1028
|
+
// take displayField from childColumn.props.field (rest of the path)
|
|
1029
|
+
displayField = childColumn.props.field.substring(autoComplete.assocField.length + 1);
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
if (assocField_1 === undefined) {
|
|
1034
|
+
// default - take assocField/displayField from childColumn.props.field
|
|
1035
|
+
var _a = __read(XUtilsCommon_1.XUtilsCommon.getPathToAssocAndField(childColumn.props.field), 2), assocFieldTemp = _a[0], displayFieldTemp = _a[1];
|
|
1036
|
+
if (assocFieldTemp === null) {
|
|
1037
|
+
throw "XLazyColumn with field \"".concat(childColumn.props.field, "\": unexpected error - path of length >= 2 expected");
|
|
1038
|
+
}
|
|
1039
|
+
assocField_1 = assocFieldTemp;
|
|
1040
|
+
if (displayField === undefined) {
|
|
1041
|
+
displayField = displayFieldTemp;
|
|
1042
|
+
}
|
|
1043
|
+
}
|
|
1044
|
+
var xAssoc = XUtilsMetadataCommon_1.XUtilsMetadataCommon.getXAssocToOneByPath(xEntity, assocField_1);
|
|
1045
|
+
var object = getFilterValue(childColumn.props.field);
|
|
1046
|
+
filterElement = react_1.default.createElement(XAutoCompleteBase_1.XAutoCompleteBase, { value: object, onChange: function (object, objectChange) { return setFilterValue(childColumn.props.field, object, undefined, object !== null ? [{ where: "[".concat(assocField_1, "] = ").concat(object['id']), params: {} }] : undefined); }, error: undefined, onErrorChange: function (error) { }, idField: "id", field: displayField, suggestionsQuery: { entity: xAssoc.entityName, filter: autoComplete === null || autoComplete === void 0 ? void 0 : autoComplete.filter, sortField: autoComplete === null || autoComplete === void 0 ? void 0 : autoComplete.sortField }, searchBrowse: autoComplete === null || autoComplete === void 0 ? void 0 : autoComplete.searchBrowse, valueForm: autoComplete === null || autoComplete === void 0 ? void 0 : autoComplete.valueForm, addRowEnabled: false, width: "100%", scrollHeight: autoComplete === null || autoComplete === void 0 ? void 0 : autoComplete.scrollHeight, suggestionsLoad: "lazy", lazyLoadMaxRows: autoComplete === null || autoComplete === void 0 ? void 0 : autoComplete.lazyLoadMaxRows, minLength: autoComplete === null || autoComplete === void 0 ? void 0 : autoComplete.minLength });
|
|
1047
|
+
}
|
|
949
1048
|
else {
|
|
950
1049
|
if (xField.type === "boolean") {
|
|
951
1050
|
var checkboxValue = getFilterValue(childColumn.props.field);
|
|
@@ -955,6 +1054,10 @@ var XLazyDataTable = function (props) {
|
|
|
955
1054
|
var dropdownValue = getDropdownFilterValue(childColumn.props.field);
|
|
956
1055
|
filterElement = react_1.default.createElement(XDropdownDTFilter_1.XDropdownDTFilter, { entity: props.entity, path: childColumn.props.field, value: dropdownValue, onValueChange: onDropdownFilterChange, filter: childColumn.props.dropdownFilter, sortField: childColumn.props.dropdownSortField });
|
|
957
1056
|
}
|
|
1057
|
+
else if (xField.type === "string") {
|
|
1058
|
+
var stringValue = getFilterValue(childColumn.props.field);
|
|
1059
|
+
filterElement = react_1.default.createElement(XInputTextBase_1.XInputTextBase, { value: stringValue, onChange: function (value) { return setFilterValue(childColumn.props.field, value); } });
|
|
1060
|
+
}
|
|
958
1061
|
else if (xField.type === "date" || xField.type === "datetime") {
|
|
959
1062
|
betweenFilter = getBetweenFilter(childColumn.props.betweenFilter, props.betweenFilter);
|
|
960
1063
|
if (betweenFilter !== undefined) {
|
|
@@ -987,7 +1090,7 @@ var XLazyDataTable = function (props) {
|
|
|
987
1090
|
}
|
|
988
1091
|
// ************** dataType **************
|
|
989
1092
|
// depending on the dataType of the column, suitable match modes are displayed in filter
|
|
990
|
-
var dataType =
|
|
1093
|
+
var dataType = "text";
|
|
991
1094
|
if (xField.type === "decimal" || xField.type === "number") {
|
|
992
1095
|
dataType = "numeric";
|
|
993
1096
|
}
|
|
@@ -1007,6 +1110,18 @@ var XLazyDataTable = function (props) {
|
|
|
1007
1110
|
}
|
|
1008
1111
|
}
|
|
1009
1112
|
}
|
|
1113
|
+
// *********** filterMatchModeOptions ***********
|
|
1114
|
+
// we use the same match mode lists like the default lists in primereact, but in case of ManyToOne assoc we add match mode for autocomplete
|
|
1115
|
+
var filterMatchModeOptions = undefined;
|
|
1116
|
+
if (showFilterMenu) {
|
|
1117
|
+
// copy of primereact code (ColumnFilter.js)
|
|
1118
|
+
//filterMatchModeOptions = primeReactContext.filterMatchModeOptions![dataType].map((key) => ({ label: prLocaleOption(key), value: key }));
|
|
1119
|
+
filterMatchModeOptions = (primeReactContext && primeReactContext.filterMatchModeOptions[dataType].map(function (key) { return ({ label: (0, XLocale_1.prLocaleOption)(key), value: key }); })) ||
|
|
1120
|
+
api_1.default.filterMatchModeOptions[dataType].map(function (key) { return ({ label: (0, XLocale_1.prLocaleOption)(key), value: key }); });
|
|
1121
|
+
if (isAutoCompleteInFilterEnabled(childColumn.props)) {
|
|
1122
|
+
filterMatchModeOptions.push({ label: (0, XLocale_1.xLocaleOption)('xAutoComplete'), value: FindParam_1.XFilterMatchMode.X_AUTO_COMPLETE });
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1010
1125
|
// *********** showClearButton ***********
|
|
1011
1126
|
// pre filterDisplay = "row" nechceme clear button, chceme setrit miesto
|
|
1012
1127
|
var showClearButton = props.filterDisplay === "menu";
|
|
@@ -1059,7 +1174,7 @@ var XLazyDataTable = function (props) {
|
|
|
1059
1174
|
}
|
|
1060
1175
|
footer = aggregateValue;
|
|
1061
1176
|
}
|
|
1062
|
-
return react_1.default.createElement(column_1.Column, { field: childColumn.props.field, header: header, footer: footer, filter: true, sortable: true, filterElement: filterElement, dataType: dataType, showFilterMenu: showFilterMenu, showClearButton: showClearButton, body: body, headerStyle: headerStyle, align: align });
|
|
1177
|
+
return react_1.default.createElement(column_1.Column, { field: childColumn.props.field, header: header, footer: footer, filter: true, sortable: true, filterElement: filterElement, dataType: dataType, showFilterMenu: showFilterMenu, filterMatchModeOptions: filterMatchModeOptions, showClearButton: showClearButton, onFilterMatchModeChange: undefined /*onFilterMatchModeChange*/, body: body, headerStyle: headerStyle, align: align });
|
|
1063
1178
|
});
|
|
1064
1179
|
// align-items-center centruje vertikalne (posuva smerom dolu do stredu)
|
|
1065
1180
|
// x-lazy-datatable-label-right-compensation - vyvazuje label, aby item-y v strede isli aspon priblizne do stredu
|
|
@@ -1106,5 +1221,6 @@ var XLazyColumn = function (props) {
|
|
|
1106
1221
|
};
|
|
1107
1222
|
exports.XLazyColumn = XLazyColumn;
|
|
1108
1223
|
exports.XLazyColumn.defaultProps = {
|
|
1224
|
+
//autoCompleteEnabled: "forStringOnly",
|
|
1109
1225
|
columnViewStatus: true // XViewStatus.ReadWrite
|
|
1110
1226
|
};
|
|
@@ -24,3 +24,4 @@ export interface XLocaleOptions {
|
|
|
24
24
|
}
|
|
25
25
|
export declare function xAddLocale(locale: string, xOptions: XLocaleOptions): void;
|
|
26
26
|
export declare function xLocaleOption(xOptionKey: string, options?: any[string]): any;
|
|
27
|
+
export declare function prLocaleOption(key: string): any;
|
|
@@ -26,7 +26,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
26
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
27
|
};
|
|
28
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.xLocaleOption = exports.xAddLocale = void 0;
|
|
29
|
+
exports.prLocaleOption = exports.xLocaleOption = exports.xAddLocale = void 0;
|
|
30
30
|
var api_1 = __importStar(require("primereact/api"));
|
|
31
31
|
// using json-loader module we import x-en.json file into variable xEnJsonObject
|
|
32
32
|
var x_en_json_1 = __importDefault(require("./locale/x-en.json"));
|
|
@@ -55,5 +55,11 @@ function xLocaleOption(xOptionKey, options) {
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
exports.xLocaleOption = xLocaleOption;
|
|
58
|
+
// localeOption of primereact without locale param (helper)
|
|
59
|
+
function prLocaleOption(key) {
|
|
60
|
+
var _locale = api_1.default.locale || 'en';
|
|
61
|
+
return (0, api_1.localeOption)(key, _locale);
|
|
62
|
+
}
|
|
63
|
+
exports.prLocaleOption = prLocaleOption;
|
|
58
64
|
// add en locale into PrimeReact locale (global variable "locales" declared in file Locale.js)
|
|
59
65
|
xAddLocale('en', x_en_json_1.default.en);
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"save": "Save",
|
|
17
17
|
"cancel": "Cancel",
|
|
18
18
|
"formRemoveRowConfirm": "Are you sure to remove the row?",
|
|
19
|
+
"xAutoComplete": "Autocomplete",
|
|
19
20
|
"expRowCount": "Row count",
|
|
20
21
|
"expExportType": "Export type",
|
|
21
22
|
"expCreateHeaderLine": "Create header line",
|
|
@@ -35,6 +36,7 @@
|
|
|
35
36
|
"no": "no",
|
|
36
37
|
"dateFrom": "Date from",
|
|
37
38
|
"dateTo": "Date to",
|
|
38
|
-
"year": "Year"
|
|
39
|
+
"year": "Year",
|
|
40
|
+
"yearForAgeCalculation": "Year for age calculation"
|
|
39
41
|
}
|
|
40
42
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { XCustomFilterItem, XFullTextSearch } from "./FindParam";
|
|
1
|
+
import { DataTableSortMeta } from "primereact/datatable";
|
|
2
|
+
import { XCustomFilterItem, XDataTableFilterMeta, XFullTextSearch } from "./FindParam";
|
|
3
3
|
export declare enum ExportType {
|
|
4
4
|
Excel = "excel",
|
|
5
5
|
Csv = "csv",
|
|
@@ -19,7 +19,7 @@ export interface ExportJsonParam {
|
|
|
19
19
|
queryParam: LazyDataTableQueryParam;
|
|
20
20
|
}
|
|
21
21
|
export interface LazyDataTableQueryParam {
|
|
22
|
-
filters:
|
|
22
|
+
filters: XDataTableFilterMeta;
|
|
23
23
|
fullTextSearch?: XFullTextSearch;
|
|
24
24
|
customFilterItems?: XCustomFilterItem[];
|
|
25
25
|
multiSortMeta?: DataTableSortMeta[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DataTableFilterMetaData, DataTableOperatorFilterMetaData, DataTableSortMeta } from "primereact/datatable";
|
|
2
2
|
export declare enum ResultType {
|
|
3
3
|
OnlyRowCount = 0,
|
|
4
4
|
OnlyPagedRows = 1,
|
|
@@ -13,6 +13,18 @@ export interface XCustomFilterItem {
|
|
|
13
13
|
params: XParams;
|
|
14
14
|
}
|
|
15
15
|
export type XCustomFilter = XCustomFilterItem | XCustomFilterItem[];
|
|
16
|
+
export declare enum XFilterMatchMode {
|
|
17
|
+
X_AUTO_COMPLETE = "xAutoComplete"
|
|
18
|
+
}
|
|
19
|
+
export interface XDataTableFilterMetaData extends DataTableFilterMetaData {
|
|
20
|
+
customFilterItems?: XCustomFilterItem[];
|
|
21
|
+
}
|
|
22
|
+
export interface XDataTableFilterMeta {
|
|
23
|
+
/**
|
|
24
|
+
* Extra options.
|
|
25
|
+
*/
|
|
26
|
+
[key: string]: XDataTableFilterMetaData | DataTableOperatorFilterMetaData;
|
|
27
|
+
}
|
|
16
28
|
export interface XFullTextSearch {
|
|
17
29
|
fields?: string[];
|
|
18
30
|
value: string;
|
|
@@ -33,7 +45,7 @@ export interface FindParam {
|
|
|
33
45
|
resultType: ResultType;
|
|
34
46
|
first?: number;
|
|
35
47
|
rows?: number;
|
|
36
|
-
filters?:
|
|
48
|
+
filters?: XDataTableFilterMeta;
|
|
37
49
|
fullTextSearch?: XFullTextSearch;
|
|
38
50
|
customFilterItems?: XCustomFilterItem[];
|
|
39
51
|
multiSortMeta?: DataTableSortMeta[];
|
|
@@ -1,20 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.XAggregateFunction = exports.ResultType = void 0;
|
|
4
|
-
// TODO - replaced with DataTableFilterMetaData
|
|
5
|
-
// export interface FilterValue {
|
|
6
|
-
// value : string;
|
|
7
|
-
// matchMode : 'startsWith' | 'equals'; // matchMode ma konstanty napr. startsWith
|
|
8
|
-
// }
|
|
9
|
-
// TODO - replaced with DataTableFilterMeta
|
|
10
|
-
// export interface Filters {
|
|
11
|
-
// [field: string]: FilterValue; // specialny typ pre object (dictionary) ktory ma dynamicky pocet propertiesov
|
|
12
|
-
// }
|
|
13
|
-
// TODO - replace with DataTableSortMeta
|
|
14
|
-
// export interface SortMeta {
|
|
15
|
-
// field : string;
|
|
16
|
-
// order : 1 | -1; // hodnoty 1 alebo -1
|
|
17
|
-
// }
|
|
3
|
+
exports.XAggregateFunction = exports.XFilterMatchMode = exports.ResultType = void 0;
|
|
18
4
|
var ResultType;
|
|
19
5
|
(function (ResultType) {
|
|
20
6
|
ResultType[ResultType["OnlyRowCount"] = 0] = "OnlyRowCount";
|
|
@@ -22,6 +8,11 @@ var ResultType;
|
|
|
22
8
|
ResultType[ResultType["RowCountAndPagedRows"] = 2] = "RowCountAndPagedRows";
|
|
23
9
|
ResultType[ResultType["AllRows"] = 3] = "AllRows";
|
|
24
10
|
})(ResultType = exports.ResultType || (exports.ResultType = {}));
|
|
11
|
+
// additional match modes (extension to primereact enum FilterMatchMode)
|
|
12
|
+
var XFilterMatchMode;
|
|
13
|
+
(function (XFilterMatchMode) {
|
|
14
|
+
XFilterMatchMode["X_AUTO_COMPLETE"] = "xAutoComplete";
|
|
15
|
+
})(XFilterMatchMode = exports.XFilterMatchMode || (exports.XFilterMatchMode = {}));
|
|
25
16
|
var XAggregateFunction;
|
|
26
17
|
(function (XAggregateFunction) {
|
|
27
18
|
XAggregateFunction["Min"] = "MIN";
|