@michalrakus/x-react-web-lib 1.29.0 → 1.31.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.
@@ -0,0 +1,79 @@
1
+ /// <reference types="react" />
2
+ export interface XFieldSetMeta {
3
+ id?: number;
4
+ fieldSetId: string;
5
+ xFieldMetaRoot: XFieldMeta;
6
+ modifDate: Date | null;
7
+ modifXUser: any | null;
8
+ version: number;
9
+ }
10
+ export declare enum XFieldType {
11
+ rootField = "rootField",
12
+ fieldGroup = "fieldGroup",
13
+ fieldGroupWithCheckbox = "fieldGroupWithCheckbox",
14
+ checkbox = "checkbox",
15
+ checkboxNullable = "checkboxNullable",
16
+ inputText = "inputText",
17
+ inputDecimal = "inputDecimal"
18
+ }
19
+ export declare enum XChildrenLayout {
20
+ column = "column",
21
+ row = "row",
22
+ tabView = "tabView",
23
+ tabViewWithHeaderGroup = "tabViewWithHeaderGroup"
24
+ }
25
+ export declare enum XFieldPropValuesFrom {
26
+ parent = "parent",
27
+ this = "this"
28
+ }
29
+ export interface XFieldMeta {
30
+ type?: XFieldType;
31
+ childrenLayout?: XChildrenLayout;
32
+ width?: string;
33
+ labelWidth?: string;
34
+ inputWidth?: string;
35
+ suppressFieldGroupPanel?: true;
36
+ field: string;
37
+ label: string;
38
+ tooltip?: string;
39
+ decimalProps?: {
40
+ scale: number;
41
+ };
42
+ dateFrom?: Date;
43
+ dateTo?: Date;
44
+ xFieldMetaList?: XFieldMeta[];
45
+ fieldPropValuesMapForEdit?: XFieldPropValuesMapForEdit;
46
+ fieldPropValuesMapCached?: XFieldPropValuesMap;
47
+ xFieldMetaParentCached?: XFieldMeta;
48
+ }
49
+ export interface XFieldPropValuesMapForEdit {
50
+ [field: string]: XFieldPropValuesForEdit;
51
+ }
52
+ export interface XFieldPropValuesMap {
53
+ [field: string]: XFieldPropValues;
54
+ }
55
+ export interface XFieldPropValuesForEdit {
56
+ valuesFrom: XFieldPropValuesFrom;
57
+ values?: XFieldPropValues;
58
+ error?: string;
59
+ }
60
+ export type XFieldPropValues = any | undefined;
61
+ export interface XFieldProp {
62
+ id: string;
63
+ label: string;
64
+ fieldPropEdit?: JSX.Element;
65
+ }
66
+ export interface XFieldPropEditProps {
67
+ value?: XFieldPropValues;
68
+ onChange?: (value: XFieldPropValues) => void;
69
+ onErrorChange?: (error: (string | undefined)) => void;
70
+ }
71
+ export interface XFieldSetValues {
72
+ [field: string]: any;
73
+ }
74
+ export type XFieldXFieldMetaMap = Map<string, XFieldMeta>;
75
+ export declare class XFieldSetBase {
76
+ static createXFieldXFieldMetaMap(xFieldSetMeta: XFieldSetMeta, filterFromParent?: string): XFieldXFieldMetaMap;
77
+ static xFieldSetValuesAsUI(xFieldSetValues: XFieldSetValues, xFieldXFieldMetaMap: XFieldXFieldMetaMap): string;
78
+ private static createMapForXFieldMeta;
79
+ }
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ var __values = (this && this.__values) || function(o) {
3
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
4
+ if (m) return m.call(o);
5
+ if (o && typeof o.length === "number") return {
6
+ next: function () {
7
+ if (o && i >= o.length) o = void 0;
8
+ return { value: o && o[i++], done: !o };
9
+ }
10
+ };
11
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
12
+ };
13
+ var __read = (this && this.__read) || function (o, n) {
14
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
15
+ if (!m) return o;
16
+ var i = m.call(o), r, ar = [], e;
17
+ try {
18
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
19
+ }
20
+ catch (error) { e = { error: error }; }
21
+ finally {
22
+ try {
23
+ if (r && !r.done && (m = i["return"])) m.call(i);
24
+ }
25
+ finally { if (e) throw e.error; }
26
+ }
27
+ return ar;
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.XFieldSetBase = exports.XFieldPropValuesFrom = exports.XChildrenLayout = exports.XFieldType = void 0;
31
+ var XUtilsConversions_1 = require("../../serverApi/XUtilsConversions");
32
+ var XFieldType;
33
+ (function (XFieldType) {
34
+ XFieldType["rootField"] = "rootField";
35
+ XFieldType["fieldGroup"] = "fieldGroup";
36
+ XFieldType["fieldGroupWithCheckbox"] = "fieldGroupWithCheckbox";
37
+ XFieldType["checkbox"] = "checkbox";
38
+ XFieldType["checkboxNullable"] = "checkboxNullable";
39
+ XFieldType["inputText"] = "inputText";
40
+ XFieldType["inputDecimal"] = "inputDecimal";
41
+ })(XFieldType = exports.XFieldType || (exports.XFieldType = {}));
42
+ // children layout sa da nastavit len na type, ktory ma children - rootField, fieldGroup
43
+ var XChildrenLayout;
44
+ (function (XChildrenLayout) {
45
+ XChildrenLayout["column"] = "column";
46
+ XChildrenLayout["row"] = "row";
47
+ XChildrenLayout["tabView"] = "tabView";
48
+ XChildrenLayout["tabViewWithHeaderGroup"] = "tabViewWithHeaderGroup"; // to iste co tabView ale prvy fieldGroup (0-ty tab) zobrazi nad tabView (aby bol vzdy pristupny)
49
+ })(XChildrenLayout = exports.XChildrenLayout || (exports.XChildrenLayout = {}));
50
+ // poznamka - tabView a tabViewWithHeaderGroup odignoruju bezne simple children - ak take budu existovat, zobrazi sa uzivatelovi warning pri nastaveni tabView
51
+ // pouzijeme len checkbox supressFieldGroupPanel
52
+ // pouziva sa len pre typ fieldGroup a len v pripade ak dany fieldGroup nie je vyrenderovany v nejakej tab-ke (jeho parent ma nastaveny layout tabView*)
53
+ // export enum XFieldGroupPanelViewStatus {
54
+ // show = "show", // default - vyrenderuje Panel aj s labelom a vo vnutri panelu umiestni children
55
+ // hide = "hide" // nerenderuje Panel, children umiestni do div elementu (label sa nepouzije) - pouziva sa na vytvorenie stlpcov v (parent) fieldGroup-e
56
+ // }
57
+ var XFieldPropValuesFrom;
58
+ (function (XFieldPropValuesFrom) {
59
+ XFieldPropValuesFrom["parent"] = "parent";
60
+ XFieldPropValuesFrom["this"] = "this"; // field prop values preberame z current fieldu
61
+ })(XFieldPropValuesFrom = exports.XFieldPropValuesFrom || (exports.XFieldPropValuesFrom = {}));
62
+ // zatial provizorne len na staticke metody
63
+ var XFieldSetBase = /** @class */ (function () {
64
+ function XFieldSetBase() {
65
+ }
66
+ // api metoda na vytvorenie Map instancie, ktora sluzi na rychle najdenie prislusneho XFieldMeta podla nazvu fieldu
67
+ // ak je zadany filterFromParent, tak vracia len children/subchildren/... fieldu s field = filterFromParent
68
+ // (filterFromParent je casto groupField)
69
+ XFieldSetBase.createXFieldXFieldMetaMap = function (xFieldSetMeta, filterFromParent) {
70
+ var xFieldXFieldMetaMap = new Map();
71
+ XFieldSetBase.createMapForXFieldMeta(xFieldSetMeta.xFieldMetaRoot, filterFromParent, xFieldXFieldMetaMap);
72
+ return xFieldXFieldMetaMap;
73
+ };
74
+ // api metoda na vyrenderovanie field set atributu
75
+ // logicky patri do src/serverApi/XUtilsConversions.ts a zisla by sa aj pri exporte do excelu ale XFieldXFieldMetaMap (a jeho "parent"-a XFieldSetBase) mame len na frontende
76
+ XFieldSetBase.xFieldSetValuesAsUI = function (xFieldSetValues, xFieldXFieldMetaMap) {
77
+ var e_1, _a;
78
+ var _b;
79
+ // budeme mat vzdy spravne poradie? nebudeme... asi najjednoduchsie zosortovat tu "valueUIList" podla abecedy
80
+ var valueUIList = [];
81
+ try {
82
+ for (var _c = __values(Object.entries(xFieldSetValues)), _d = _c.next(); !_d.done; _d = _c.next()) {
83
+ var _e = __read(_d.value, 2), field = _e[0], value = _e[1];
84
+ var xFieldMeta = xFieldXFieldMetaMap.get(field);
85
+ if (xFieldMeta) {
86
+ if (xFieldMeta.type === XFieldType.checkbox) {
87
+ valueUIList.push(xFieldMeta.label);
88
+ }
89
+ else if (xFieldMeta.type === XFieldType.inputText) {
90
+ valueUIList.push("".concat(xFieldMeta.label, ": \"").concat(value, "\""));
91
+ }
92
+ else if (xFieldMeta.type === XFieldType.inputDecimal) {
93
+ valueUIList.push("".concat(xFieldMeta.label, ": ").concat((0, XUtilsConversions_1.numberAsUI)((0, XUtilsConversions_1.numberFromModel)(value), (_b = xFieldMeta.decimalProps) === null || _b === void 0 ? void 0 : _b.scale)));
94
+ }
95
+ else {
96
+ // neznamy typ
97
+ valueUIList.push("".concat(xFieldMeta.label, ": \"").concat(value, "\""));
98
+ }
99
+ }
100
+ else {
101
+ // field bol z formulara odstraneny (nemalo by sa to takto pouzivat, skor by sa mala datumom ohranicit platnost fieldu)
102
+ // zobrazime v surovom stave
103
+ valueUIList.push("".concat(field, ": ").concat(typeof value === 'string' ? '"' + value + '"' : value));
104
+ }
105
+ }
106
+ }
107
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
108
+ finally {
109
+ try {
110
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
111
+ }
112
+ finally { if (e_1) throw e_1.error; }
113
+ }
114
+ return valueUIList.join(", ");
115
+ };
116
+ XFieldSetBase.createMapForXFieldMeta = function (xFieldMeta, filterFromParent, xFieldXFieldMetaMap) {
117
+ var e_2, _a;
118
+ if (filterFromParent === undefined) {
119
+ // no filter is used
120
+ xFieldXFieldMetaMap.set(xFieldMeta.field, xFieldMeta);
121
+ }
122
+ else if (filterFromParent === xFieldMeta.field) {
123
+ // the searched parent field has been found, all his children/subchildren/... will be added to the list (we remove the filter)
124
+ filterFromParent = undefined;
125
+ }
126
+ if (xFieldMeta.xFieldMetaList) {
127
+ try {
128
+ for (var _b = __values(xFieldMeta.xFieldMetaList), _c = _b.next(); !_c.done; _c = _b.next()) {
129
+ var insideXFieldMeta = _c.value;
130
+ XFieldSetBase.createMapForXFieldMeta(insideXFieldMeta, filterFromParent, xFieldXFieldMetaMap);
131
+ }
132
+ }
133
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
134
+ finally {
135
+ try {
136
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
137
+ }
138
+ finally { if (e_2) throw e_2.error; }
139
+ }
140
+ }
141
+ };
142
+ return XFieldSetBase;
143
+ }());
144
+ exports.XFieldSetBase = XFieldSetBase;
@@ -1,5 +1,5 @@
1
1
  import { XFormBase } from "./XFormBase";
2
- import { Component } from "react";
2
+ import React, { Component } from "react";
3
3
  import { OperationType } from "./XUtils";
4
4
  import { XError } from "./XErrors";
5
5
  import { XCustomFilter } from "../serverApi/FindParam";
@@ -10,6 +10,11 @@ export interface XFormComponentDTProps {
10
10
  rowData: any;
11
11
  readOnly?: XTableFieldReadOnlyProp;
12
12
  onChange?: XTableFieldOnChange;
13
+ placeholder?: string;
14
+ label?: string;
15
+ tooltip?: string;
16
+ desc?: string;
17
+ labelStyle?: React.CSSProperties;
13
18
  }
14
19
  export declare abstract class XFormComponentDT<P extends XFormComponentDTProps> extends Component<P> {
15
20
  private valueChanged;
@@ -19,6 +24,8 @@ export declare abstract class XFormComponentDT<P extends XFormComponentDTProps>
19
24
  onValueChangeBase(value: any, onChange?: XTableFieldOnChange, assocObjectChange?: OperationType): void;
20
25
  abstract isNotNull(): boolean;
21
26
  isReadOnly(): boolean;
27
+ getLabel(): string | undefined;
28
+ getLabelStyle(): React.CSSProperties;
22
29
  validate(): {
23
30
  field: string;
24
31
  xError: XError;
@@ -78,6 +78,25 @@ var XFormComponentDT = /** @class */ (function (_super) {
78
78
  }
79
79
  return readOnly;
80
80
  };
81
+ // *********** label support - len pre ne-DT componenty pouzivany ************
82
+ // ak je label undefined, label element sa nevykresli
83
+ XFormComponentDT.prototype.getLabel = function () {
84
+ var label = this.props.label;
85
+ if (label !== undefined) {
86
+ // test na readOnly je tu hlavne koli tomu aby sme nemali * pri ID atribute, ktory sa pri inserte generuje az pri zapise do DB
87
+ if (this.isNotNull() && !this.isReadOnly()) {
88
+ label = XUtils_1.XUtils.markNotNull(label);
89
+ }
90
+ }
91
+ return label;
92
+ };
93
+ XFormComponentDT.prototype.getLabelStyle = function () {
94
+ var _a;
95
+ var labelStyle = (_a = this.props.labelStyle) !== null && _a !== void 0 ? _a : {};
96
+ // this.props.inline nepouzivame, lebo je to asi zombie
97
+ XUtils_1.XUtils.addCssPropIfNotExists(labelStyle, { width: XUtils_1.XUtils.FIELD_LABEL_WIDTH });
98
+ return labelStyle;
99
+ };
81
100
  // *********** validation support ************
82
101
  // volane po kliknuti na Save
83
102
  // vrati (field, XError) ak nezbehne "field validacia", ak zbehne, vrati undefined
@@ -1,6 +1,6 @@
1
1
  import { XFormBase } from "./XFormBase";
2
2
  import React, { Component, ReactChild } from "react";
3
- import { DataTableFilterMeta } from "primereact/datatable";
3
+ import { DataTableFilterMeta, DataTableSortMeta } from "primereact/datatable";
4
4
  import { ColumnBodyOptions } from "primereact/column";
5
5
  import { XEntity, XField } from "../serverApi/XEntityMetadata";
6
6
  import { XViewStatusOrBoolean } from "./XUtils";
@@ -117,6 +117,7 @@ export interface XFormAutoCompleteColumnProps extends XFormColumnBaseProps {
117
117
  searchBrowse?: JSX.Element;
118
118
  assocForm?: JSX.Element;
119
119
  filter?: XTableFieldFilterProp;
120
+ sortField?: string | DataTableSortMeta[];
120
121
  fields?: string[];
121
122
  suggestions?: any[];
122
123
  }
@@ -277,7 +277,7 @@ var XFormDataTable2 = /** @class */ (function (_super) {
277
277
  };
278
278
  XFormDataTable2.prototype.getFilterMatchMode = function (xField) {
279
279
  var filterMatchMode;
280
- if (xField.type === "string") {
280
+ if (xField.type === "string" || xField.type === "jsonb") {
281
281
  filterMatchMode = api_1.FilterMatchMode.CONTAINS;
282
282
  }
283
283
  // zatial vsetky ostatne EQUALS
@@ -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, 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, 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;
@@ -1,7 +1,9 @@
1
1
  import { XField } from "../serverApi/XEntityMetadata";
2
2
  import { XFormComponentDT, XFormComponentDTProps } from "./XFormComponentDT";
3
+ import React from "react";
3
4
  export interface XInputDTProps extends XFormComponentDTProps {
4
5
  field: string;
6
+ inputStyle?: React.CSSProperties;
5
7
  }
6
8
  export declare abstract class XInputDT<P extends XInputDTProps> extends XFormComponentDT<P> {
7
9
  protected xField: XField;
@@ -40,7 +40,6 @@ var XInputDate = /** @class */ (function (_super) {
40
40
  };
41
41
  XInputDate.prototype.render = function () {
42
42
  var _a;
43
- // note: style overrides size (width of the input according to character count)
44
43
  return (react_1.default.createElement("div", { className: "field grid" },
45
44
  react_1.default.createElement("label", { htmlFor: this.props.field, className: "col-fixed", style: this.getLabelStyle() }, this.getLabel()),
46
45
  react_1.default.createElement(XCalendar_1.XCalendar, { id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), error: this.getError(), scale: (_a = this.props.scale) !== null && _a !== void 0 ? _a : this.xField.scale, datetime: this.xField.type === 'datetime' })));
@@ -110,6 +110,7 @@ export interface XLazyColumnProps {
110
110
  betweenFilter?: XBetweenFilterProp | "noBetween";
111
111
  width?: string;
112
112
  contentType?: XContentType;
113
+ fieldSetId?: string;
113
114
  aggregateType?: XAggregateFunction;
114
115
  columnViewStatus: XViewStatusOrBoolean;
115
116
  filterElement?: XFilterElementProp;
@@ -131,6 +131,7 @@ var XMultilineSwitch_1 = require("./XMultilineSwitch");
131
131
  var XMultilineRenderer_1 = require("./XMultilineRenderer");
132
132
  var XHtmlRenderer_1 = require("./XHtmlRenderer");
133
133
  var XOcfDropdown_1 = require("./XOcfDropdown");
134
+ var XFieldSetBase_1 = require("../XFieldSet/XFieldSetBase");
134
135
  var XLazyDataTable = function (props) {
135
136
  var _a;
136
137
  // must be here, is used in createInitFilters()
@@ -184,7 +185,7 @@ var XLazyDataTable = function (props) {
184
185
  };
185
186
  var getFilterMatchMode = function (xField) {
186
187
  var filterMatchMode;
187
- if (xField.type === "string") {
188
+ if (xField.type === "string" || xField.type === "jsonb") {
188
189
  filterMatchMode = api_1.FilterMatchMode.CONTAINS;
189
190
  }
190
191
  // zatial vsetky ostatne EQUALS
@@ -219,10 +220,14 @@ var XLazyDataTable = function (props) {
219
220
  var dataTableEl = (0, react_1.useRef)(null);
220
221
  var customFilterItems = XUtilsCommon_1.XUtilsCommon.createCustomFilterItems(props.customFilter);
221
222
  var aggregateItems = createAggregateItems();
222
- var _b = __read((0, react_1.useState)({ rowList: [], totalRecords: 0, aggregateValues: [] }), 2), value = _b[0], setValue = _b[1];
223
- var _c = __read((0, react_1.useState)(false), 2), loading = _c[0], setLoading = _c[1];
224
- var _d = __read((0, react_1.useState)(0), 2), first = _d[0], setFirst = _d[1];
225
- var _e = __read((0, react_1.useState)(props.paginator ? props.rows : undefined), 2), rows = _e[0], setRows = _e[1];
223
+ // ak mame fieldSet stlpce (stlpce ktore maju zadany fieldSetId a zobrazuju hodnoty podla fieldSet-u),
224
+ // tak sem nacitame mapy umoznujuce ziskanie labelov zakliknutych field-ov
225
+ // poznamka: uz by sa zislo mat vytvorene objekty (instancie) pre stlpce a do nich zapisovat pripadny XFieldSetMap, filter (teraz je vo "filters")
226
+ var _b = __read((0, react_1.useState)({}), 2), xFieldSetMaps = _b[0], setXFieldSetMaps = _b[1];
227
+ var _c = __read((0, react_1.useState)({ rowList: [], totalRecords: 0, aggregateValues: [] }), 2), value = _c[0], setValue = _c[1];
228
+ var _d = __read((0, react_1.useState)(false), 2), loading = _d[0], setLoading = _d[1];
229
+ var _e = __read((0, react_1.useState)(0), 2), first = _e[0], setFirst = _e[1];
230
+ var _f = __read((0, react_1.useState)(props.paginator ? props.rows : undefined), 2), rows = _f[0], setRows = _f[1];
226
231
  var filtersInit = createInitFilters();
227
232
  if (props.filters) {
228
233
  filtersInit = __assign(__assign({}, filtersInit), props.filters); // items from props.filters will replace existing items in filtersInit
@@ -237,19 +242,19 @@ var XLazyDataTable = function (props) {
237
242
  customFilterItems = XUtilsCommon_1.XUtilsCommon.filterAnd(customFilterItems, XUtils_1.XUtils.evalFilter(props.searchBrowseParams.customFilter));
238
243
  }
239
244
  }
240
- 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)
245
+ var _g = __read((0, react_1.useState)(filtersInit), 2), filters = _g[0], setFilters = _g[1]; // filtrovanie na "controlled manner" (moze sa sem nainicializovat nejaka hodnota)
241
246
  var initFtsInputValue = props.fullTextSearch ? createInitFtsInputValue() : undefined;
242
- var _g = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValue = _g[0], setFtsInputValue = _g[1];
243
- var _h = __read((0, react_1.useState)(undefined), 2), optionalCustomFilter = _h[0], setOptionalCustomFilter = _h[1];
244
- var _j = __read((0, react_1.useState)(props.multilineSwitchInitValue), 2), multilineSwitchValue = _j[0], setMultilineSwitchValue = _j[1];
245
- var _k = __read((0, react_1.useState)(XUtilsCommon_1.XUtilsCommon.createMultiSortMeta(props.sortField)), 2), multiSortMeta = _k[0], setMultiSortMeta = _k[1];
246
- var _l = __read((0, react_1.useState)(null), 2), selectedRow = _l[0], setSelectedRow = _l[1];
247
- var _m = __read((_a = props.dataLoadedState) !== null && _a !== void 0 ? _a : (0, react_1.useState)(false), 2), dataLoaded = _m[0], setDataLoaded = _m[1]; // priznak kde si zapiseme, ci uz sme nacitali data
248
- var _o = __read((0, react_1.useState)({ dialogOpened: false }), 2), exportRowsDialogState = _o[0], setExportRowsDialogState = _o[1];
247
+ var _h = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValue = _h[0], setFtsInputValue = _h[1];
248
+ var _j = __read((0, react_1.useState)(undefined), 2), optionalCustomFilter = _j[0], setOptionalCustomFilter = _j[1];
249
+ var _k = __read((0, react_1.useState)(props.multilineSwitchInitValue), 2), multilineSwitchValue = _k[0], setMultilineSwitchValue = _k[1];
250
+ var _l = __read((0, react_1.useState)(XUtilsCommon_1.XUtilsCommon.createMultiSortMeta(props.sortField)), 2), multiSortMeta = _l[0], setMultiSortMeta = _l[1];
251
+ var _m = __read((0, react_1.useState)(null), 2), selectedRow = _m[0], setSelectedRow = _m[1];
252
+ var _o = __read((_a = props.dataLoadedState) !== null && _a !== void 0 ? _a : (0, react_1.useState)(false), 2), dataLoaded = _o[0], setDataLoaded = _o[1]; // priznak kde si zapiseme, ci uz sme nacitali data
253
+ var _p = __read((0, react_1.useState)({ dialogOpened: false }), 2), exportRowsDialogState = _p[0], setExportRowsDialogState = _p[1];
249
254
  //const [exportRowsDialogRowCount, setExportRowsDialogRowCount] = useState<number>(); // param pre dialog
250
- var _p = __read((0, react_1.useState)(filtersInit), 2), filtersAfterFiltering = _p[0], setFiltersAfterFiltering = _p[1]; // sem si odkladame stav filtra po kliknuti na button Filter (chceme exportovat presne to co vidno vyfiltrovane)
251
- var _q = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValueAfterFiltering = _q[0], setFtsInputValueAfterFiltering = _q[1]; // tak isto ako filtersAfterFiltering
252
- var _r = __read((0, react_1.useState)(undefined), 2), optionalCustomFilterAfterFiltering = _r[0], setOptionalCustomFilterAfterFiltering = _r[1]; // tak isto ako filtersAfterFiltering
255
+ var _q = __read((0, react_1.useState)(filtersInit), 2), filtersAfterFiltering = _q[0], setFiltersAfterFiltering = _q[1]; // sem si odkladame stav filtra po kliknuti na button Filter (chceme exportovat presne to co vidno vyfiltrovane)
256
+ var _r = __read((0, react_1.useState)(initFtsInputValue), 2), ftsInputValueAfterFiltering = _r[0], setFtsInputValueAfterFiltering = _r[1]; // tak isto ako filtersAfterFiltering
257
+ var _s = __read((0, react_1.useState)(undefined), 2), optionalCustomFilterAfterFiltering = _s[0], setOptionalCustomFilterAfterFiltering = _s[1]; // tak isto ako filtersAfterFiltering
253
258
  // parameter [] zabezpeci ze sa metoda zavola len po prvom renderingu (a nie po kazdej zmene stavu (zavolani setNieco()))
254
259
  (0, react_1.useEffect)(function () {
255
260
  // jednoduchy sposob - nepouzivame parameter props.displayed a priznak dataLoaded
@@ -318,9 +323,22 @@ var XLazyDataTable = function (props) {
318
323
  setOptionalCustomFilter(undefined);
319
324
  }
320
325
  };
321
- var loadData = function () {
322
- loadDataBase(createFindParam());
323
- };
326
+ var loadData = function () { return __awaiter(void 0, void 0, void 0, function () {
327
+ return __generator(this, function (_a) {
328
+ switch (_a.label) {
329
+ case 0:
330
+ // pre poriadok zaserializujeme obidve operacie (aj ked teoreticky by to malo fungovat aj bez serializovania)
331
+ return [4 /*yield*/, loadXFieldSetMaps()];
332
+ case 1:
333
+ // pre poriadok zaserializujeme obidve operacie (aj ked teoreticky by to malo fungovat aj bez serializovania)
334
+ _a.sent();
335
+ return [4 /*yield*/, loadDataBase(createFindParam())];
336
+ case 2:
337
+ _a.sent();
338
+ return [2 /*return*/];
339
+ }
340
+ });
341
+ }); };
324
342
  var createFindParam = function () {
325
343
  return {
326
344
  resultType: FindParam_1.ResultType.RowCountAndPagedRows,
@@ -335,6 +353,42 @@ var XLazyDataTable = function (props) {
335
353
  aggregateItems: aggregateItems
336
354
  };
337
355
  };
356
+ var loadXFieldSetMaps = function () { return __awaiter(void 0, void 0, void 0, function () {
357
+ var fieldSetIds, xFieldSetMetaList, xFieldSetMapsLocal, xFieldSetMetaList_1, xFieldSetMetaList_1_1, xFieldSetMeta;
358
+ var e_3, _a;
359
+ return __generator(this, function (_b) {
360
+ switch (_b.label) {
361
+ case 0:
362
+ fieldSetIds = getFieldSetIds();
363
+ if (!(fieldSetIds.length > 0)) return [3 /*break*/, 2];
364
+ return [4 /*yield*/, XUtils_1.XUtils.fetchRows('XFieldSetMeta', { where: "[fieldSetId] IN (:...fieldSetIdList)", params: { fieldSetIdList: fieldSetIds } })];
365
+ case 1:
366
+ xFieldSetMetaList = _b.sent();
367
+ // check
368
+ if (xFieldSetMetaList.length !== fieldSetIds.length) {
369
+ throw "One or more of fieldSetIds \"".concat(fieldSetIds.join(", "), "\" was not found in DB in the table for Entity XFieldSetMeta");
370
+ }
371
+ xFieldSetMapsLocal = {};
372
+ try {
373
+ for (xFieldSetMetaList_1 = __values(xFieldSetMetaList), xFieldSetMetaList_1_1 = xFieldSetMetaList_1.next(); !xFieldSetMetaList_1_1.done; xFieldSetMetaList_1_1 = xFieldSetMetaList_1.next()) {
374
+ xFieldSetMeta = xFieldSetMetaList_1_1.value;
375
+ xFieldSetMapsLocal[xFieldSetMeta.fieldSetId] = XFieldSetBase_1.XFieldSetBase.createXFieldXFieldMetaMap(xFieldSetMeta);
376
+ }
377
+ }
378
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
379
+ finally {
380
+ try {
381
+ if (xFieldSetMetaList_1_1 && !xFieldSetMetaList_1_1.done && (_a = xFieldSetMetaList_1.return)) _a.call(xFieldSetMetaList_1);
382
+ }
383
+ finally { if (e_3) throw e_3.error; }
384
+ }
385
+ // save created structures
386
+ setXFieldSetMaps(xFieldSetMapsLocal);
387
+ _b.label = 2;
388
+ case 2: return [2 /*return*/];
389
+ }
390
+ });
391
+ }); };
338
392
  var loadDataBase = function (findParam) { return __awaiter(void 0, void 0, void 0, function () {
339
393
  var findResult;
340
394
  return __generator(this, function (_a) {
@@ -385,7 +439,7 @@ var XLazyDataTable = function (props) {
385
439
  var getFields = function (addPropsFields) {
386
440
  // krasne zobrazi cely objekt!
387
441
  //console.log(dataTableEl.current);
388
- var e_3, _a;
442
+ var e_4, _a;
389
443
  var fields = [];
390
444
  var columns = dataTableEl.current.props.children;
391
445
  try {
@@ -394,12 +448,12 @@ var XLazyDataTable = function (props) {
394
448
  fields.push(column.props.field);
395
449
  }
396
450
  }
397
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
451
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
398
452
  finally {
399
453
  try {
400
454
  if (columns_3_1 && !columns_3_1.done && (_a = columns_3.return)) _a.call(columns_3);
401
455
  }
402
- finally { if (e_3) throw e_3.error; }
456
+ finally { if (e_4) throw e_4.error; }
403
457
  }
404
458
  if (addPropsFields) {
405
459
  if (props.fields) {
@@ -411,7 +465,7 @@ var XLazyDataTable = function (props) {
411
465
  var getHeaders = function () {
412
466
  // krasne zobrazi cely objekt!
413
467
  //console.log(dataTableEl.current);
414
- var e_4, _a;
468
+ var e_5, _a;
415
469
  var headers = [];
416
470
  var columns = dataTableEl.current.props.children;
417
471
  try {
@@ -421,17 +475,17 @@ var XLazyDataTable = function (props) {
421
475
  headers.push(column.props.header);
422
476
  }
423
477
  }
424
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
478
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
425
479
  finally {
426
480
  try {
427
481
  if (columns_4_1 && !columns_4_1.done && (_a = columns_4.return)) _a.call(columns_4);
428
482
  }
429
- finally { if (e_4) throw e_4.error; }
483
+ finally { if (e_5) throw e_5.error; }
430
484
  }
431
485
  return headers;
432
486
  };
433
487
  var getWidths = function () {
434
- var e_5, _a;
488
+ var e_6, _a;
435
489
  var _b;
436
490
  // vrati sirky stlpcov napr. ['7.75rem', '20rem', '8.5rem', '8.5rem', '6rem']
437
491
  // nevracia aktualne sirky stlpcov (po manualnom rozsireni) ale tie ktore boli nastavene/vypocitane v kode
@@ -443,15 +497,37 @@ var XLazyDataTable = function (props) {
443
497
  widths.push((_b = column.props.headerStyle) === null || _b === void 0 ? void 0 : _b.width);
444
498
  }
445
499
  }
446
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
500
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
447
501
  finally {
448
502
  try {
449
503
  if (columns_5_1 && !columns_5_1.done && (_a = columns_5.return)) _a.call(columns_5);
450
504
  }
451
- finally { if (e_5) throw e_5.error; }
505
+ finally { if (e_6) throw e_6.error; }
452
506
  }
453
507
  return widths;
454
508
  };
509
+ var getFieldSetIds = function () {
510
+ var e_7, _a;
511
+ var fieldSetIds = [];
512
+ // warning note: props.children are used to get props of XLazyColumn whereas dataTableEl.current.props.children are used to get props of Primereact DataTable
513
+ var columns = props.children;
514
+ try {
515
+ for (var columns_6 = __values(columns), columns_6_1 = columns_6.next(); !columns_6_1.done; columns_6_1 = columns_6.next()) {
516
+ var column = columns_6_1.value;
517
+ if (column.props.fieldSetId) {
518
+ fieldSetIds.push(column.props.fieldSetId);
519
+ }
520
+ }
521
+ }
522
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
523
+ finally {
524
+ try {
525
+ if (columns_6_1 && !columns_6_1.done && (_a = columns_6.return)) _a.call(columns_6);
526
+ }
527
+ finally { if (e_7) throw e_7.error; }
528
+ }
529
+ return fieldSetIds;
530
+ };
455
531
  var hasContentTypeHtml = function () {
456
532
  var columns = props.children;
457
533
  return columns.some(function (column) { return column.props.contentType === "html"; });
@@ -489,7 +565,7 @@ var XLazyDataTable = function (props) {
489
565
  }
490
566
  };
491
567
  var onClickRemoveRow = function () { return __awaiter(void 0, void 0, void 0, function () {
492
- var reread, e_6, e_7;
568
+ var reread, e_8, e_9;
493
569
  return __generator(this, function (_a) {
494
570
  switch (_a.label) {
495
571
  case 0:
@@ -504,8 +580,8 @@ var XLazyDataTable = function (props) {
504
580
  reread = _a.sent();
505
581
  return [3 /*break*/, 4];
506
582
  case 3:
507
- e_6 = _a.sent();
508
- XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_6);
583
+ e_8 = _a.sent();
584
+ XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_8);
509
585
  return [3 /*break*/, 4];
510
586
  case 4:
511
587
  if (reread) {
@@ -527,8 +603,8 @@ var XLazyDataTable = function (props) {
527
603
  _a.sent();
528
604
  return [3 /*break*/, 9];
529
605
  case 8:
530
- e_7 = _a.sent();
531
- XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_7);
606
+ e_9 = _a.sent();
607
+ XUtils_1.XUtils.showErrorMessage((0, XLocale_1.xLocaleOption)('removeRowFailed'), e_9);
532
608
  return [3 /*break*/, 9];
533
609
  case 9:
534
610
  loadData();
@@ -702,12 +778,17 @@ var XLazyDataTable = function (props) {
702
778
  }
703
779
  return betweenFilter;
704
780
  };
705
- var valueAsUI = function (value, xField, contentType) {
781
+ var valueAsUI = function (value, xField, contentType, fieldSetId) {
706
782
  var valueResult;
707
783
  if (xField.type === "boolean") {
708
784
  // TODO - efektivnejsie by bolo renderovat len prislusne ikonky
709
785
  valueResult = react_1.default.createElement(tristatecheckbox_1.TriStateCheckbox, { value: value, disabled: true });
710
786
  }
787
+ else if (xField.type === "jsonb" && fieldSetId) {
788
+ // zatial sem dame; este by sme mohli dat hlbsie do convertValue/convertValueBase (aby fungovalo aj pre excel) ale tam je problem ze nemame k dispozicii "xFieldSetMaps"
789
+ // poznamka: krajsie by bolo brat fieldSetId z xField ale to by sme museli vytvorit decorator na backend-e...
790
+ valueResult = XFieldSetBase_1.XFieldSetBase.xFieldSetValuesAsUI(value, xFieldSetMaps[fieldSetId]);
791
+ }
711
792
  else {
712
793
  if (contentType === "html") {
713
794
  // value should be always string (xField.type === "string")
@@ -732,11 +813,11 @@ var XLazyDataTable = function (props) {
732
813
  var bodyValue;
733
814
  var rowDataValue = XUtilsCommon_1.XUtilsCommon.getValueOrValueListByPath(rowData, columnProps.field);
734
815
  if (Array.isArray(rowDataValue)) {
735
- var elemList = rowDataValue.map(function (value) { return valueAsUI(value, xField, columnProps.contentType); });
816
+ var elemList = rowDataValue.map(function (value) { return valueAsUI(value, xField, columnProps.contentType, columnProps.fieldSetId); });
736
817
  bodyValue = react_1.default.createElement(XMultilineRenderer_1.XMultilineRenderer, { valueList: elemList, renderType: multilineSwitchValue, fewLinesCount: props.multilineSwitchFewLinesCount });
737
818
  }
738
819
  else {
739
- bodyValue = valueAsUI(rowDataValue, xField, columnProps.contentType);
820
+ bodyValue = valueAsUI(rowDataValue, xField, columnProps.contentType, columnProps.fieldSetId);
740
821
  }
741
822
  return bodyValue;
742
823
  };
@@ -15,6 +15,7 @@
15
15
  "ok": "Ok",
16
16
  "save": "Save",
17
17
  "cancel": "Cancel",
18
+ "formRemoveRowConfirm": "Are you sure to remove the row?",
18
19
  "expRowCount": "Row count",
19
20
  "expExportType": "Export type",
20
21
  "expCreateHeaderLine": "Create header line",
@@ -471,6 +471,12 @@ function convertValueBase(fieldType, scale, value, fromModel, asUI) {
471
471
  value = booleanAsUIText(value);
472
472
  }
473
473
  }
474
+ else if (fieldType === "jsonb") {
475
+ // konverziu z modelu (json objekt-u) netreba
476
+ if (asUI) {
477
+ value = XUtilsCommon_1.XUtilsCommon.objectAsJSON(value);
478
+ }
479
+ }
474
480
  else {
475
481
  // vsetko ostatne
476
482
  if (asUI && asUI !== AsUIType.Excel) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michalrakus/x-react-web-lib",
3
- "version": "1.29.0",
3
+ "version": "1.31.0",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "clean": "rimraf lib",