@michalrakus/x-react-web-lib 1.20.0 → 1.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/XFormHeader.d.ts +3 -0
  2. package/XFormHeader.js +5 -0
  3. package/XParamBrowse.d.ts +3 -0
  4. package/XParamBrowse.js +5 -0
  5. package/XParamForm.d.ts +3 -0
  6. package/XParamForm.js +5 -0
  7. package/gulpfile.js +5 -2
  8. package/lib/administration/XParamBrowse.d.ts +6 -0
  9. package/lib/administration/XParamBrowse.js +25 -0
  10. package/lib/administration/XParamForm.d.ts +7 -0
  11. package/lib/administration/XParamForm.js +62 -0
  12. package/lib/administration/XUserBrowse.js +1 -1
  13. package/lib/administration/XUserForm.js +12 -9
  14. package/lib/components/XAutoCompleteBase.js +2 -29
  15. package/lib/components/XCalendar.d.ts +15 -8
  16. package/lib/components/XCalendar.js +21 -2
  17. package/lib/components/XFormComponent.d.ts +1 -0
  18. package/lib/components/XFormHeader.d.ts +4 -0
  19. package/lib/components/XFormHeader.js +11 -0
  20. package/lib/components/XInputDate.js +1 -1
  21. package/lib/components/XInputDateDT.js +1 -1
  22. package/lib/components/XInputText.js +1 -1
  23. package/lib/components/XLazyDataTable/XExportRowsDialog.d.ts +10 -5
  24. package/lib/components/XLazyDataTable/XExportRowsDialog.js +79 -44
  25. package/lib/components/XLazyDataTable/XLazyDataTable.d.ts +7 -0
  26. package/lib/components/XLazyDataTable/XLazyDataTable.js +113 -31
  27. package/lib/components/XLazyDataTable/XMultilineSwitch.js +1 -1
  28. package/lib/components/XLazyDataTable/XOcfDropdown.d.ts +8 -0
  29. package/lib/components/XLazyDataTable/XOcfDropdown.js +53 -0
  30. package/lib/components/XUtils.d.ts +3 -1
  31. package/lib/components/XUtils.js +42 -10
  32. package/lib/components/locale/x-en.json +1 -0
  33. package/lib/serverApi/ExportImportParam.d.ts +29 -11
  34. package/lib/serverApi/ExportImportParam.js +11 -1
  35. package/lib/serverApi/XUtilsCommon.d.ts +5 -0
  36. package/lib/serverApi/XUtilsCommon.js +90 -3
  37. package/lib/serverApi/XUtilsConversions.d.ts +13 -5
  38. package/lib/serverApi/XUtilsConversions.js +110 -34
  39. package/lib/serverApi/XUtilsMetadataCommon.d.ts +1 -0
  40. package/lib/serverApi/XUtilsMetadataCommon.js +17 -0
  41. package/package.json +1 -1
@@ -0,0 +1,3 @@
1
+ // generated by gulp
2
+
3
+ export * from './lib/components/XFormHeader';
package/XFormHeader.js ADDED
@@ -0,0 +1,5 @@
1
+ // generated by gulp
2
+
3
+ 'use strict';
4
+
5
+ module.exports = require('./lib/components/XFormHeader.js');
@@ -0,0 +1,3 @@
1
+ // generated by gulp
2
+
3
+ export * from './lib/administration/XParamBrowse';
@@ -0,0 +1,5 @@
1
+ // generated by gulp
2
+
3
+ 'use strict';
4
+
5
+ module.exports = require('./lib/administration/XParamBrowse.js');
@@ -0,0 +1,3 @@
1
+ // generated by gulp
2
+
3
+ export * from './lib/administration/XParamForm';
package/XParamForm.js ADDED
@@ -0,0 +1,5 @@
1
+ // generated by gulp
2
+
3
+ 'use strict';
4
+
5
+ module.exports = require('./lib/administration/XParamForm.js');
package/gulpfile.js CHANGED
@@ -13,10 +13,12 @@ function generateApi(cb) {
13
13
  const fs = require('fs');
14
14
 
15
15
  const apiFileList = [
16
- "./lib/administration/XUserBrowse",
17
- "./lib/administration/XUserForm",
18
16
  "./lib/administration/XBrowseMetaBrowse",
19
17
  "./lib/administration/XBrowseMetaForm",
18
+ "./lib/administration/XParamBrowse",
19
+ "./lib/administration/XParamForm",
20
+ "./lib/administration/XUserBrowse",
21
+ "./lib/administration/XUserForm",
20
22
 
21
23
  "./lib/components/XFormRowCol/XFormCol",
22
24
  "./lib/components/XFormRowCol/XFormInlineRow",
@@ -51,6 +53,7 @@ function generateApi(cb) {
51
53
  "./lib/components/XFormBaseT",
52
54
  "./lib/components/XFormDataTable2",
53
55
  "./lib/components/XFormFooter",
56
+ "./lib/components/XFormHeader",
54
57
  "./lib/components/XFormNavigator3",
55
58
  "./lib/components/XHolders",
56
59
  "./lib/components/XInputDate",
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ import { XBrowseProps } from "../components/XLazyDataTable/XLazyDataTable";
3
+ import { XCustomFilter } from "../serverApi/FindParam";
4
+ export declare const XParamBrowse: (props: XBrowseProps & {
5
+ customFilter?: XCustomFilter;
6
+ }) => JSX.Element;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.XParamBrowse = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var XLazyDataTable_1 = require("../components/XLazyDataTable/XLazyDataTable");
9
+ var XParamForm_1 = require("./XParamForm");
10
+ var XParamBrowse = function (props) {
11
+ var onAddRow = function () {
12
+ // openForm pridavame automaticky v XFormNavigator3 pri renderovani komponentu
13
+ props.openForm(react_1.default.createElement(XParamForm_1.XParamForm, null));
14
+ };
15
+ var onEdit = function (selectedRow) {
16
+ // openForm pridavame automaticky v XFormNavigator3 pri renderovani komponentu
17
+ props.openForm(react_1.default.createElement(XParamForm_1.XParamForm, { id: selectedRow.id }));
18
+ };
19
+ return (react_1.default.createElement(XLazyDataTable_1.XLazyDataTable, { entity: "XParam", label: "Parameters", sortField: "id", rows: 30, customFilter: props.customFilter, onAddRow: onAddRow, onEdit: onEdit, removeRow: true, displayed: props.displayed },
20
+ react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "id", header: "ID", width: "8rem" }),
21
+ react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "code", header: "Code", width: "16rem" }),
22
+ react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "name", header: "Name", width: "45rem" }),
23
+ react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "value", header: "Value", width: "16rem" })));
24
+ };
25
+ exports.XParamBrowse = XParamBrowse;
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { XFormBaseModif } from "../components/XFormBaseModif";
3
+ import { XObject } from "../components/XObject";
4
+ export declare class XParamForm extends XFormBaseModif {
5
+ createNewObject(): XObject;
6
+ render(): JSX.Element;
7
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
18
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
19
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
20
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
21
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
22
+ };
23
+ var __importDefault = (this && this.__importDefault) || function (mod) {
24
+ return (mod && mod.__esModule) ? mod : { "default": mod };
25
+ };
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.XParamForm = void 0;
28
+ var react_1 = __importDefault(require("react"));
29
+ var XFormBaseModif_1 = require("../components/XFormBaseModif");
30
+ var XFormBase_1 = require("../components/XFormBase");
31
+ var XInputDecimal_1 = require("../components/XInputDecimal");
32
+ var XInputDate_1 = require("../components/XInputDate");
33
+ var XInputText_1 = require("../components/XInputText");
34
+ var XFormFooter_1 = require("../components/XFormFooter");
35
+ var XFormHeader_1 = require("../components/XFormHeader");
36
+ var XParamForm = /** @class */ (function (_super) {
37
+ __extends(XParamForm, _super);
38
+ function XParamForm() {
39
+ return _super !== null && _super.apply(this, arguments) || this;
40
+ }
41
+ XParamForm.prototype.createNewObject = function () {
42
+ return { version: 0 };
43
+ };
44
+ XParamForm.prototype.render = function () {
45
+ return (react_1.default.createElement("div", null,
46
+ react_1.default.createElement(XFormHeader_1.XFormHeader, { label: "Parameter" }),
47
+ react_1.default.createElement("div", { className: "x-form-row" },
48
+ react_1.default.createElement("div", { className: "x-form-col" },
49
+ react_1.default.createElement(XInputDecimal_1.XInputDecimal, { form: this, field: "id", label: "ID", readOnly: true }),
50
+ react_1.default.createElement(XInputDate_1.XInputDate, { form: this, field: "modifDate", label: "Modified at", readOnly: true }),
51
+ react_1.default.createElement(XInputText_1.XInputText, { form: this, field: "modifXUser.name", label: "Modified by", inputStyle: { width: '12.5rem' } }),
52
+ react_1.default.createElement(XInputText_1.XInputText, { form: this, field: "code", label: "Code", inputStyle: { width: '16rem' } }),
53
+ react_1.default.createElement(XInputText_1.XInputText, { form: this, field: "name", label: "Name", inputStyle: { width: '45rem' } }),
54
+ react_1.default.createElement(XInputText_1.XInputText, { form: this, field: "value", label: "Value", inputStyle: { width: '45rem' } }))),
55
+ react_1.default.createElement(XFormFooter_1.XFormFooter, { form: this })));
56
+ };
57
+ XParamForm = __decorate([
58
+ (0, XFormBase_1.Form)("XParam")
59
+ ], XParamForm);
60
+ return XParamForm;
61
+ }(XFormBaseModif_1.XFormBaseModif));
62
+ exports.XParamForm = XParamForm;
@@ -75,7 +75,7 @@ var XUserBrowse = function (props) {
75
75
  }
76
76
  });
77
77
  }); };
78
- return (react_1.default.createElement(XLazyDataTable_1.XLazyDataTable, { entity: "XUser", rows: 10, onAddRow: onAddRow, onEdit: onEdit, removeRow: onRemoveRow, displayed: props.displayed },
78
+ return (react_1.default.createElement(XLazyDataTable_1.XLazyDataTable, { entity: "XUser", label: "Users", rows: 10, onAddRow: onAddRow, onEdit: onEdit, removeRow: onRemoveRow, displayed: props.displayed },
79
79
  react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "id", header: "ID" }),
80
80
  react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "username", header: "Username", width: "17rem" }),
81
81
  react_1.default.createElement(XLazyDataTable_1.XLazyColumn, { field: "name", header: "Name", width: "17rem" }),
@@ -75,6 +75,7 @@ var XCheckbox_1 = require("../components/XCheckbox");
75
75
  var XEnvVars_1 = require("../components/XEnvVars");
76
76
  var XFormBaseModif_1 = require("../components/XFormBaseModif");
77
77
  var XInputDate_1 = require("../components/XInputDate");
78
+ var XFormHeader_1 = require("../components/XFormHeader");
78
79
  var XUserForm = /** @class */ (function (_super) {
79
80
  __extends(XUserForm, _super);
80
81
  function XUserForm(props) {
@@ -100,8 +101,9 @@ var XUserForm = /** @class */ (function (_super) {
100
101
  var e_1;
101
102
  return __generator(this, function (_a) {
102
103
  switch (_a.label) {
103
- case 0:
104
- if (!this.validateSave()) {
104
+ case 0: return [4 /*yield*/, this.validateSave()];
105
+ case 1:
106
+ if (!(_a.sent())) {
105
107
  return [2 /*return*/];
106
108
  }
107
109
  // v deme nedovolime zmenit uzivatelov ktori sa pouzivaju na skusanie dema
@@ -134,18 +136,18 @@ var XUserForm = /** @class */ (function (_super) {
134
136
  }
135
137
  }
136
138
  this.preSave(this.state.object);
137
- _a.label = 1;
138
- case 1:
139
- _a.trys.push([1, 3, , 4]);
140
- return [4 /*yield*/, XUtils_1.XUtils.post('userSaveRow', { entity: this.getEntity(), object: this.state.object })];
139
+ _a.label = 2;
141
140
  case 2:
142
- _a.sent();
143
- return [3 /*break*/, 4];
141
+ _a.trys.push([2, 4, , 5]);
142
+ return [4 /*yield*/, XUtils_1.XUtils.post('userSaveRow', { entity: this.getEntity(), object: this.state.object })];
144
143
  case 3:
144
+ _a.sent();
145
+ return [3 /*break*/, 5];
146
+ case 4:
145
147
  e_1 = _a.sent();
146
148
  XUtils_1.XUtils.showErrorMessage("Save row failed.", e_1);
147
149
  return [2 /*return*/]; // zostavame vo formulari
148
- case 4:
150
+ case 5:
149
151
  this.props.openForm(null); // save zbehol, ideme naspet do browsu
150
152
  return [2 /*return*/];
151
153
  }
@@ -167,6 +169,7 @@ var XUserForm = /** @class */ (function (_super) {
167
169
  ];
168
170
  }
169
171
  return (react_1.default.createElement("div", null,
172
+ react_1.default.createElement(XFormHeader_1.XFormHeader, { label: "User" }),
170
173
  react_1.default.createElement("div", { className: "x-form-row" },
171
174
  react_1.default.createElement("div", { className: "x-form-col" },
172
175
  react_1.default.createElement(XInputDecimal_1.XInputDecimal, { form: this, field: "id", label: "ID", readOnly: true, labelStyle: { width: '14rem' } }),
@@ -614,39 +614,12 @@ var XAutoCompleteBase = /** @class */ (function (_super) {
614
614
  return itemTemplate;
615
615
  };
616
616
  XAutoCompleteBase.prototype.computeDefaultDisplayValue = function (suggestion) {
617
- var e_2, _a;
618
- var displayValue = "";
617
+ var displayValue;
619
618
  if (XAutoCompleteBase.isMoreSuggestions(suggestion)) {
620
619
  displayValue = suggestion;
621
620
  }
622
621
  else {
623
- try {
624
- for (var _b = __values(this.getFields()), _c = _b.next(); !_c.done; _c = _b.next()) {
625
- var field = _c.value;
626
- // TODO - konverzie na spravny typ/string
627
- var _d = __read(XUtilsCommon_1.XUtilsCommon.getPrefixAndField(field), 2), prefix = _d[0], fieldOnly = _d[1];
628
- var value = XUtilsCommon_1.XUtilsCommon.getValueByPath(suggestion, fieldOnly);
629
- if (value !== null && value !== undefined) {
630
- var valueStr = value.toString(); // TODO - spravnu konverziu
631
- if (valueStr !== "") {
632
- if (displayValue !== "") {
633
- displayValue += " ";
634
- }
635
- if (prefix) {
636
- displayValue += prefix;
637
- }
638
- displayValue += valueStr;
639
- }
640
- }
641
- }
642
- }
643
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
644
- finally {
645
- try {
646
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
647
- }
648
- finally { if (e_2) throw e_2.error; }
649
- }
622
+ displayValue = XUtilsCommon_1.XUtilsCommon.createDisplayValue(suggestion, this.getFields());
650
623
  }
651
624
  return displayValue;
652
625
  };
@@ -1,9 +1,16 @@
1
1
  /// <reference types="react" />
2
- export declare const XCalendar: (props: {
3
- id?: string | undefined;
4
- value: Date | null;
5
- onChange: (value: Date | null) => void;
6
- readOnly?: boolean | undefined;
7
- error?: string | undefined;
8
- datetime?: boolean | undefined;
9
- }) => JSX.Element;
2
+ import { XDateScale } from "../serverApi/XUtilsConversions";
3
+ export declare const XCalendar: {
4
+ (props: {
5
+ id?: string | undefined;
6
+ value: Date | null;
7
+ onChange: (value: Date | null) => void;
8
+ readOnly?: boolean | undefined;
9
+ error?: string | undefined;
10
+ scale: XDateScale;
11
+ datetime?: boolean | undefined;
12
+ }): JSX.Element;
13
+ defaultProps: {
14
+ scale: XDateScale;
15
+ };
16
+ };
@@ -84,7 +84,7 @@ var XCalendar = function (props) {
84
84
  var onBlur = function (e) {
85
85
  if (inputChanged) {
86
86
  // poznamka: e.target.value aj inputValueState obsahuju tu istu string hodnotu
87
- var value = (0, XUtilsConversions_1.dateFromUI)(e.target.value);
87
+ var value = (0, XUtilsConversions_1.dateFromUI)(e.target.value, props.scale);
88
88
  props.onChange(value !== null && value !== void 0 ? value : null); // nekorektnu hodnotu reprezentovanu cez undefined budeme riesit akokeby user zadal null (field sa vyprazdni)
89
89
  setInputChanged(false);
90
90
  setInputValueState(undefined); // pre poriadok
@@ -100,9 +100,28 @@ var XCalendar = function (props) {
100
100
  }
101
101
  return inputValue;
102
102
  };
103
+ var getView = function (dateScale) {
104
+ var view;
105
+ if (dateScale === XUtilsConversions_1.XDateScale.Date) {
106
+ view = "date";
107
+ }
108
+ else if (dateScale === XUtilsConversions_1.XDateScale.Month) {
109
+ view = "month";
110
+ }
111
+ else if (dateScale === XUtilsConversions_1.XDateScale.Year) {
112
+ view = "year";
113
+ }
114
+ else {
115
+ throw "Unimplemented dateScale = " + dateScale;
116
+ }
117
+ return view;
118
+ };
103
119
  var datetime = (_a = props.datetime) !== null && _a !== void 0 ? _a : false;
104
120
  // poznamka: parseDateTime nerobi ziadny parse, nechceme aby Calendar "rusil" uzivatela pri typovani datumu
105
121
  // konverzia (a volanie props.onChange) sa robi az pri onBlur
106
- return (react_1.default.createElement(calendar_1.Calendar, __assign({ id: props.id, value: getInputValue(), onChange: onChange, disabled: props.readOnly, showIcon: true, showOnFocus: false, dateFormat: (0, XUtilsConversions_1.dateFormatCalendar)(), keepInvalid: true, parseDateTime: function (text) { return text; }, showTime: datetime, showSeconds: datetime, inputClassName: datetime ? 'x-input-datetime' : 'x-input-date', onSelect: onSelect, onBlur: onBlur }, XUtils_1.XUtils.createErrorProps(props.error))));
122
+ return (react_1.default.createElement(calendar_1.Calendar, __assign({ id: props.id, value: getInputValue(), onChange: onChange, disabled: props.readOnly, showIcon: true, showOnFocus: false, view: getView(props.scale), dateFormat: (0, XUtilsConversions_1.dateFormatCalendar)(props.scale), keepInvalid: true, parseDateTime: function (text) { return text; }, showTime: datetime, showSeconds: datetime, inputClassName: datetime ? 'x-input-datetime' : 'x-input-date', onSelect: onSelect, onBlur: onBlur }, XUtils_1.XUtils.createErrorProps(props.error))));
107
123
  };
108
124
  exports.XCalendar = XCalendar;
125
+ exports.XCalendar.defaultProps = {
126
+ scale: XUtilsConversions_1.XDateScale.Date
127
+ };
@@ -11,6 +11,7 @@ export interface XFormComponentProps<T> {
11
11
  form: XFormBase;
12
12
  label?: string;
13
13
  tooltip?: string;
14
+ placeholder?: string;
14
15
  readOnly?: XReadOnlyProp;
15
16
  labelStyle?: React.CSSProperties;
16
17
  inline?: boolean;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ export declare const XFormHeader: (props: {
3
+ label: string;
4
+ }) => JSX.Element;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.XFormHeader = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var XFormHeader = function (props) {
9
+ return (react_1.default.createElement("div", { className: "x-form-header" }, props.label));
10
+ };
11
+ exports.XFormHeader = XFormHeader;
@@ -42,7 +42,7 @@ var XInputDate = /** @class */ (function (_super) {
42
42
  // note: style overrides size (width of the input according to character count)
43
43
  return (react_1.default.createElement("div", { className: "field grid" },
44
44
  react_1.default.createElement("label", { htmlFor: this.props.field, className: "col-fixed", style: this.getLabelStyle() }, this.getLabel()),
45
- react_1.default.createElement(XCalendar_1.XCalendar, { id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), error: this.getError(), datetime: this.xField.type === 'datetime' })));
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: this.xField.scale, datetime: this.xField.type === 'datetime' })));
46
46
  };
47
47
  return XInputDate;
48
48
  }(XInput_1.XInput));
@@ -37,7 +37,7 @@ var XInputDateDT = /** @class */ (function (_super) {
37
37
  this.onValueChangeBase(value, this.props.onChange);
38
38
  };
39
39
  XInputDateDT.prototype.render = function () {
40
- return (react_1.default.createElement(XCalendar_1.XCalendar, { id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), error: this.getError(), datetime: this.xField.type === 'datetime' }));
40
+ return (react_1.default.createElement(XCalendar_1.XCalendar, { id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), error: this.getError(), scale: this.xField.scale, datetime: this.xField.type === 'datetime' }));
41
41
  };
42
42
  return XInputDateDT;
43
43
  }(XInputDT_1.XInputDT));
@@ -63,7 +63,7 @@ var XInputText = /** @class */ (function (_super) {
63
63
  var label = this.getLabel();
64
64
  return (react_1.default.createElement("div", { className: "field grid" },
65
65
  label !== undefined ? react_1.default.createElement("label", { htmlFor: this.props.field, className: "col-fixed", style: this.getLabelStyle() }, label) : null,
66
- react_1.default.createElement(inputtext_1.InputText, __assign({ id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), maxLength: this.xField.length, size: size, style: this.props.inputStyle }, this.getClassNameTooltip(), { onBlur: this.onBlur }))));
66
+ react_1.default.createElement(inputtext_1.InputText, __assign({ id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), maxLength: this.xField.length, size: size, style: this.props.inputStyle }, this.getClassNameTooltip(), { onBlur: this.onBlur, placeholder: this.props.placeholder }))));
67
67
  };
68
68
  return XInputText;
69
69
  }(XInput_1.XInput));
@@ -1,15 +1,20 @@
1
1
  /// <reference types="react" />
2
2
  import { ExportType, LazyDataTableQueryParam } from "../../serverApi/ExportImportParam";
3
3
  export interface XExportParams {
4
- path: string;
4
+ rowCount: number;
5
+ existsToManyAssoc: boolean;
5
6
  queryParam: LazyDataTableQueryParam | any;
6
- headers?: string[];
7
+ headers: string[];
8
+ widths: string[];
9
+ fieldsToDuplicateValues?: string[];
7
10
  fileName: string;
8
11
  }
9
- export declare const XExportRowsDialog: (props: {
12
+ export interface XExportRowsDialogState {
10
13
  dialogOpened: boolean;
14
+ exportParams?: XExportParams;
15
+ }
16
+ export declare const XExportRowsDialog: (props: {
17
+ dialogState: XExportRowsDialogState;
11
18
  hideDialog: () => void;
12
- rowCount?: number;
13
19
  exportTypeOptions?: ExportType[];
14
- exportParams: XExportParams | (() => XExportParams);
15
20
  }) => JSX.Element;
@@ -87,46 +87,65 @@ var XUtils_1 = require("../XUtils");
87
87
  var XUtilsConversions_1 = require("../../serverApi/XUtilsConversions");
88
88
  var XLocale_1 = require("../XLocale");
89
89
  var XExportRowsDialog = function (props) {
90
- var _a, _b;
91
- var _c = __read((0, react_1.useState)(ExportImportParam_1.ExportType.Csv), 2), exportType = _c[0], setExportType = _c[1];
92
- var _d = __read((0, react_1.useState)(true), 2), createHeaderLine = _d[0], setCreateHeaderLine = _d[1];
93
- var _e = __read((0, react_1.useState)(ExportImportParam_1.CsvSeparator.Semicolon), 2), csvSeparator = _e[0], setCsvSeparator = _e[1];
94
- var _f = __read((0, react_1.useState)(ExportImportParam_1.CsvDecimalFormat.Comma), 2), decimalFormat = _f[0], setDecimalFormat = _f[1];
95
- var _g = __read((0, react_1.useState)(ExportImportParam_1.CsvEncoding.Win1250), 2), csvEncoding = _g[0], setCsvEncoding = _g[1];
90
+ var _a, _b, _c, _d, _e;
91
+ var _f = __read((0, react_1.useState)(ExportImportParam_1.ExportType.Excel), 2), exportType = _f[0], setExportType = _f[1];
92
+ var _g = __read((0, react_1.useState)(true), 2), createHeaderLine = _g[0], setCreateHeaderLine = _g[1];
93
+ var _h = __read((0, react_1.useState)(ExportImportParam_1.XMultilineExportType.Multiline), 2), detailRowsExport = _h[0], setDetailRowsExport = _h[1];
94
+ var _j = __read((0, react_1.useState)(ExportImportParam_1.CsvSeparator.Semicolon), 2), csvSeparator = _j[0], setCsvSeparator = _j[1];
95
+ var _k = __read((0, react_1.useState)(ExportImportParam_1.CsvDecimalFormat.Comma), 2), decimalFormat = _k[0], setDecimalFormat = _k[1];
96
+ var _l = __read((0, react_1.useState)(ExportImportParam_1.CsvEncoding.Win1250), 2), csvEncoding = _l[0], setCsvEncoding = _l[1];
96
97
  // bez tejto metody by pri opetovnom otvoreni dialogu ponechal povodne hodnoty
97
98
  var onShow = function () {
98
- setExportType(ExportImportParam_1.ExportType.Csv);
99
- setCreateHeaderLine(true); // excel hadze hlasky koli prvemu riadku header-ov
99
+ setExportType(ExportImportParam_1.ExportType.Excel);
100
+ setCreateHeaderLine(true);
101
+ setDetailRowsExport(ExportImportParam_1.XMultilineExportType.Multiline);
100
102
  setCsvSeparator(ExportImportParam_1.CsvSeparator.Semicolon);
101
103
  setDecimalFormat(ExportImportParam_1.CsvDecimalFormat.Comma);
102
104
  setCsvEncoding(ExportImportParam_1.CsvEncoding.Win1250);
103
105
  };
104
106
  var onExport = function () { return __awaiter(void 0, void 0, void 0, function () {
105
- var exportParams, csvParam, exportParam, response, e_1, fileExt, fileName, respBlob, url, a;
107
+ var exportParams, apiPath, requestPayload, exportExcelParam, exportCsvParam, exportJsonParam, response, e_1, fileExt, fileName, respBlob, url, a;
106
108
  return __generator(this, function (_a) {
107
109
  switch (_a.label) {
108
110
  case 0:
109
111
  // export vykoname az po zatvoreni dialogu - moze dlho trvat a pobezi asynchronne (user zatial moze pracovat s aplikaciou)
110
112
  // zavrieme dialog
111
113
  props.hideDialog();
112
- if (typeof props.exportParams === 'function') {
113
- exportParams = props.exportParams();
114
+ exportParams = props.dialogState.exportParams;
115
+ if (exportType === ExportImportParam_1.ExportType.Excel) {
116
+ apiPath = "x-lazy-data-table-export-excel";
117
+ exportExcelParam = {
118
+ queryParam: exportParams.queryParam,
119
+ excelCsvParam: createExcelCsvParam(exportParams),
120
+ widths: exportParams.widths
121
+ };
122
+ requestPayload = exportExcelParam;
114
123
  }
115
- else {
116
- exportParams = props.exportParams;
124
+ else if (exportType === ExportImportParam_1.ExportType.Csv) {
125
+ apiPath = "x-lazy-data-table-export-csv";
126
+ exportCsvParam = {
127
+ queryParam: exportParams.queryParam,
128
+ excelCsvParam: createExcelCsvParam(exportParams),
129
+ csvParam: {
130
+ csvSeparator: csvSeparator, csvDecimalFormat: decimalFormat, csvEncoding: csvEncoding
131
+ }
132
+ };
133
+ requestPayload = exportCsvParam;
134
+ }
135
+ else if (exportType === ExportImportParam_1.ExportType.Json) {
136
+ apiPath = "x-lazy-data-table-export-json";
137
+ exportJsonParam = {
138
+ queryParam: exportParams.queryParam
139
+ };
140
+ requestPayload = exportJsonParam;
117
141
  }
118
- csvParam = undefined;
119
- if (exportType === ExportImportParam_1.ExportType.Csv) {
120
- csvParam = { useHeaderLine: createHeaderLine, csvSeparator: csvSeparator, csvDecimalFormat: decimalFormat, csvEncoding: csvEncoding };
121
- if (csvParam.useHeaderLine) {
122
- csvParam.headers = exportParams.headers;
123
- }
142
+ else {
143
+ throw "Unimplemented exportType = ".concat(exportType);
124
144
  }
125
- exportParam = { exportType: exportType, csvParam: csvParam, queryParam: exportParams.queryParam };
126
145
  _a.label = 1;
127
146
  case 1:
128
147
  _a.trys.push([1, 3, , 4]);
129
- return [4 /*yield*/, XUtils_1.XUtils.fetchBasicJson(exportParams.path, exportParam)];
148
+ return [4 /*yield*/, XUtils_1.XUtils.fetchBasicJson(apiPath, requestPayload)];
130
149
  case 2:
131
150
  response = _a.sent();
132
151
  return [3 /*break*/, 4];
@@ -135,7 +154,7 @@ var XExportRowsDialog = function (props) {
135
154
  XUtils_1.XUtils.showErrorMessage("Export failed.", e_1);
136
155
  return [2 /*return*/];
137
156
  case 4:
138
- fileExt = exportType;
157
+ fileExt = exportType === ExportImportParam_1.ExportType.Excel ? "xlsx" : exportType;
139
158
  fileName = "".concat(exportParams.fileName, ".").concat(fileExt);
140
159
  return [4 /*yield*/, response.blob()];
141
160
  case 5:
@@ -149,36 +168,52 @@ var XExportRowsDialog = function (props) {
149
168
  }
150
169
  });
151
170
  }); };
152
- var elem = null;
153
- if (props.dialogOpened) {
171
+ var createExcelCsvParam = function (exportParams) {
172
+ return {
173
+ headers: createHeaderLine ? exportParams.headers : undefined,
174
+ fieldsToDuplicateValues: exportParams.fieldsToDuplicateValues,
175
+ toManyAssocExport: detailRowsExport,
176
+ multilineTextExport: ExportImportParam_1.XMultilineExportType.Multiline // TODO - dorobit aj tuto dropdown kde si uzivatel vyberie ci chce mat v texte \n alebo nechce - aj na backende treba dorobit
177
+ };
178
+ };
179
+ var elem = [];
180
+ if (props.dialogState.dialogOpened) {
181
+ if (exportType === ExportImportParam_1.ExportType.Excel || exportType === ExportImportParam_1.ExportType.Csv) {
182
+ elem.push(react_1.default.createElement("div", { key: "expCreateHeaderLine", className: "field grid" },
183
+ react_1.default.createElement("label", { className: "col-fixed", style: { width: '12rem' } }, (0, XLocale_1.xLocaleOption)('expCreateHeaderLine')),
184
+ react_1.default.createElement(checkbox_1.Checkbox, { checked: createHeaderLine, onChange: function (e) { return setCreateHeaderLine(e.checked); } })));
185
+ if ((_a = props.dialogState.exportParams) === null || _a === void 0 ? void 0 : _a.existsToManyAssoc) {
186
+ elem.push(react_1.default.createElement("div", { key: "expDetailRowsExport", className: "field grid" },
187
+ react_1.default.createElement("label", { className: "col-fixed", style: { width: '12rem' } }, (0, XLocale_1.xLocaleOption)('expDetailRowsExport')),
188
+ react_1.default.createElement(dropdown_1.Dropdown, { value: detailRowsExport, options: XUtils_1.XUtils.multilineExportTypeOptions, onChange: function (e) { return setDetailRowsExport(e.value); } })));
189
+ }
190
+ }
154
191
  if (exportType === ExportImportParam_1.ExportType.Csv) {
155
- elem = react_1.default.createElement("span", null,
156
- react_1.default.createElement("div", { className: "field grid" },
157
- react_1.default.createElement("label", { className: "col-fixed", style: { width: '10rem' } }, (0, XLocale_1.xLocaleOption)('expCreateHeaderLine')),
158
- react_1.default.createElement(checkbox_1.Checkbox, { checked: createHeaderLine, onChange: function (e) { return setCreateHeaderLine(e.checked); } })),
159
- react_1.default.createElement("div", { className: "field grid" },
160
- react_1.default.createElement("label", { className: "col-fixed", style: { width: '10rem' } }, (0, XLocale_1.xLocaleOption)('expCsvSeparator')),
192
+ elem.push([
193
+ react_1.default.createElement("div", { key: "expCsvSeparator", className: "field grid" },
194
+ react_1.default.createElement("label", { className: "col-fixed", style: { width: '12rem' } }, (0, XLocale_1.xLocaleOption)('expCsvSeparator')),
161
195
  react_1.default.createElement(dropdown_1.Dropdown, { value: csvSeparator, options: XUtils_1.XUtils.csvSeparatorOptions, onChange: function (e) { return setCsvSeparator(e.value); } })),
162
- react_1.default.createElement("div", { className: "field grid" },
163
- react_1.default.createElement("label", { className: "col-fixed", style: { width: '10rem' } }, (0, XLocale_1.xLocaleOption)('expDecimalFormat')),
196
+ react_1.default.createElement("div", { key: "expDecimalFormat", className: "field grid" },
197
+ react_1.default.createElement("label", { className: "col-fixed", style: { width: '12rem' } }, (0, XLocale_1.xLocaleOption)('expDecimalFormat')),
164
198
  react_1.default.createElement(dropdown_1.Dropdown, { value: decimalFormat, options: XUtils_1.XUtils.decimalFormatOptions, onChange: function (e) { return setDecimalFormat(e.value); } })),
165
- react_1.default.createElement("div", { className: "field grid" },
166
- react_1.default.createElement("label", { className: "col-fixed", style: { width: '10rem' } }, (0, XLocale_1.xLocaleOption)('expEncoding')),
167
- react_1.default.createElement(dropdown_1.Dropdown, { value: csvEncoding, options: XUtils_1.XUtils.csvEncodingOptions, onChange: function (e) { return setCsvEncoding(e.value); } })));
199
+ react_1.default.createElement("div", { key: "expEncoding", className: "field grid" },
200
+ react_1.default.createElement("label", { className: "col-fixed", style: { width: '12rem' } }, (0, XLocale_1.xLocaleOption)('expEncoding')),
201
+ react_1.default.createElement(dropdown_1.Dropdown, { value: csvEncoding, options: XUtils_1.XUtils.csvEncodingOptions, onChange: function (e) { return setCsvEncoding(e.value); } }))
202
+ ]);
168
203
  }
169
204
  }
170
205
  // poznamka: renderovanie vnutornych komponentov Dialogu sa zavola az po otvoreni dialogu
171
- return (react_1.default.createElement(dialog_1.Dialog, { visible: props.dialogOpened, onShow: onShow, onHide: function () { return props.hideDialog(); } },
172
- props.rowCount ?
173
- react_1.default.createElement("div", { className: "field grid" },
174
- react_1.default.createElement("label", { className: "col-fixed", style: { width: '10rem' } }, (0, XLocale_1.xLocaleOption)('expRowCount')),
175
- react_1.default.createElement(inputtext_1.InputText, { value: (0, XUtilsConversions_1.numberAsUI)((_a = props.rowCount) !== null && _a !== void 0 ? _a : null, 0), readOnly: true }))
206
+ return (react_1.default.createElement(dialog_1.Dialog, { visible: props.dialogState.dialogOpened, onShow: onShow, onHide: function () { return props.hideDialog(); } },
207
+ ((_b = props.dialogState.exportParams) === null || _b === void 0 ? void 0 : _b.rowCount) ?
208
+ react_1.default.createElement("div", { key: "expRowCount", className: "field grid" },
209
+ react_1.default.createElement("label", { className: "col-fixed", style: { width: '12rem' } }, (0, XLocale_1.xLocaleOption)('expRowCount')),
210
+ react_1.default.createElement(inputtext_1.InputText, { value: (0, XUtilsConversions_1.numberAsUI)((_d = (_c = props.dialogState.exportParams) === null || _c === void 0 ? void 0 : _c.rowCount) !== null && _d !== void 0 ? _d : null, 0), readOnly: true }))
176
211
  : null,
177
- react_1.default.createElement("div", { className: "field grid" },
178
- react_1.default.createElement("label", { className: "col-fixed", style: { width: '10rem' } }, (0, XLocale_1.xLocaleOption)('expExportType')),
179
- react_1.default.createElement(dropdown_1.Dropdown, { value: exportType, options: (_b = props.exportTypeOptions) !== null && _b !== void 0 ? _b : XUtils_1.XUtils.exportTypeOptions, onChange: function (e) { return setExportType(e.value); } })),
212
+ react_1.default.createElement("div", { key: "expExportType", className: "field grid" },
213
+ react_1.default.createElement("label", { className: "col-fixed", style: { width: '12rem' } }, (0, XLocale_1.xLocaleOption)('expExportType')),
214
+ react_1.default.createElement(dropdown_1.Dropdown, { value: exportType, options: (_e = props.exportTypeOptions) !== null && _e !== void 0 ? _e : XUtils_1.XUtils.exportTypeOptions, onChange: function (e) { return setExportType(e.value); } })),
180
215
  elem,
181
- react_1.default.createElement("div", { className: "flex justify-content-center" },
216
+ react_1.default.createElement("div", { key: "exportRows", className: "flex justify-content-center" },
182
217
  react_1.default.createElement(XButton_1.XButton, { label: (0, XLocale_1.xLocaleOption)('exportRows'), onClick: onExport }))));
183
218
  };
184
219
  exports.XExportRowsDialog = XExportRowsDialog;