@michalrakus/x-react-web-lib 1.3.0 → 1.4.1

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.
@@ -1,58 +1,63 @@
1
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
+ })();
2
17
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
18
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
19
  };
5
20
  Object.defineProperty(exports, "__esModule", { value: true });
6
21
  exports.XInputDate = void 0;
7
22
  var react_1 = __importDefault(require("react"));
8
- var calendar_1 = require("primereact/calendar");
9
- var XUtilsConversions_1 = require("./XUtilsConversions");
10
- var XUtilsMetadata_1 = require("./XUtilsMetadata");
11
- var XUtilsCommon_1 = require("../serverApi/XUtilsCommon");
12
- var XUtils_1 = require("./XUtils");
13
- var XInputDate = function (props) {
14
- var _a, _b;
15
- props.form.addField(props.field);
16
- var xField = XUtilsMetadata_1.XUtilsMetadata.getXFieldByPathStr(props.form.getEntity(), props.field);
17
- var showTime = (xField.type === 'datetime');
18
- var cssClassName = showTime ? 'x-input-datetime' : 'x-input-date';
19
- var label = (_a = props.label) !== null && _a !== void 0 ? _a : props.field;
20
- var readOnly = XUtils_1.XUtils.isReadOnly(props.field, props.readOnly) || props.form.formReadOnlyBase(props.field);
21
- if (!xField.isNullable && !readOnly) {
22
- label = XUtils_1.XUtils.markNotNull(label);
23
+ var XCalendar_1 = require("./XCalendar");
24
+ var XInput_1 = require("./XInput");
25
+ var XInputDate = /** @class */ (function (_super) {
26
+ __extends(XInputDate, _super);
27
+ function XInputDate(props) {
28
+ var _this = _super.call(this, props) || this;
29
+ _this.onValueChange = _this.onValueChange.bind(_this);
30
+ _this.onBlur = _this.onBlur.bind(_this);
31
+ return _this;
23
32
  }
24
- var onValueChange = function (e) {
25
- // z Calendar prichadza e.value - typ Date alebo null
26
- // typ Date prichadza ak uzivatel vyplnil validny datum, null (typeof e.value vracia "object") prichadza ak uzivatel vymazal datum
27
- // alebo je este datum nekompletny (uzivatel prave zadava datum)
28
- //console.log(typeof e.value);
29
- //console.log(e.value instanceof Date);
30
- props.form.onFieldChange(props.field, e.value);
31
- };
32
- var fieldValue = undefined;
33
- var object = props.form.state.object;
34
- if (object !== null) {
35
- var objectValue = XUtilsCommon_1.XUtilsCommon.getValueByPath(object, props.field);
36
- // pre istotu dame na null, null je standard
37
- //if (objectValue === undefined) {
38
- // objectValue = null;
39
- //}
40
- // TODO - konvertovat null hodnotu na "" (vo funkcii stringAsUI) je dolezite aby sa prejavila zmena na null v modeli
41
- // - otestovat ci zmena na null funguje dobre -
42
- //fieldValue = stringAsUI(objectValue);
33
+ XInputDate.prototype.getValue = function () {
34
+ var value = null;
35
+ var objectValue = this.getValueFromObject();
43
36
  // tuto zatial hack, mal by prist Date
44
37
  if (typeof objectValue === 'string') {
45
- fieldValue = new Date(objectValue);
38
+ value = new Date(objectValue);
46
39
  }
47
40
  else if (typeof objectValue === 'object' && objectValue instanceof Date) {
48
- fieldValue = objectValue;
41
+ value = objectValue;
49
42
  }
50
- // fieldValue zostalo undefined (konvertujeme null -> undefined) - Calendar pozaduje undefined, nechce null
51
- }
52
- var labelStyle = (_b = props.labelStyle) !== null && _b !== void 0 ? _b : {};
53
- XUtils_1.XUtils.addCssPropIfNotExists(labelStyle, { width: XUtils_1.XUtils.FIELD_LABEL_WIDTH });
54
- return (react_1.default.createElement("div", { className: "field grid" },
55
- react_1.default.createElement("label", { htmlFor: props.field, className: "col-fixed", style: labelStyle }, label),
56
- react_1.default.createElement(calendar_1.Calendar, { id: props.field, value: fieldValue, onChange: onValueChange, disabled: readOnly, showIcon: true, dateFormat: (0, XUtilsConversions_1.dateFormatCalendar)(), showTime: showTime, showSeconds: showTime, inputClassName: cssClassName, showOnFocus: false })));
57
- };
43
+ // value zostalo null ak nebol vykonany ziaden if
44
+ return value;
45
+ };
46
+ XInputDate.prototype.onValueChange = function (value) {
47
+ // z XCalendar prichadza value - typ Date alebo null
48
+ this.onValueChangeBase(value);
49
+ };
50
+ // nedame do onChange inputu, lebo by sa nas onChange volal po kazdej zmene pismenka
51
+ // ak bude treba, mozme este dorobit metodu "onChange2", ktora sa bude volat po kazdej zmene pismenka (asi iba do XInputText)
52
+ XInputDate.prototype.onBlur = function (e) {
53
+ this.callOnChangeFromOnBlur();
54
+ };
55
+ XInputDate.prototype.render = function () {
56
+ // note: style overrides size (width of the input according to character count)
57
+ return (react_1.default.createElement("div", { className: "field grid" },
58
+ react_1.default.createElement("label", { htmlFor: this.props.field, className: "col-fixed", style: this.getLabelStyle() }, this.getLabel()),
59
+ react_1.default.createElement(XCalendar_1.XCalendar, { id: this.props.field, value: this.getValue(), onChange: this.onValueChange, readOnly: this.isReadOnly(), datetime: this.xField.type === 'datetime' })));
60
+ };
61
+ return XInputDate;
62
+ }(XInput_1.XInput));
58
63
  exports.XInputDate = XInputDate;
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ export declare const XInputDecimalBase: (props: {
3
+ id?: string | undefined;
4
+ value: number | null;
5
+ onChange: (value: number | null) => void;
6
+ readOnly?: boolean | undefined;
7
+ useGrouping?: boolean | undefined;
8
+ fractionDigits?: number | undefined;
9
+ min?: number | undefined;
10
+ max?: number | undefined;
11
+ size?: number | undefined;
12
+ }) => JSX.Element;
@@ -0,0 +1,18 @@
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.XInputDecimalBase = void 0;
7
+ var react_1 = __importDefault(require("react"));
8
+ var inputnumber_1 = require("primereact/inputnumber");
9
+ // wrapper for InputNumber component - zatial taky zjednoduseny, len na filter polozky pouzivame
10
+ var XInputDecimalBase = function (props) {
11
+ var onChange = function (e) {
12
+ // z InputNumber prichadza e.value - typ number alebo null
13
+ props.onChange(e.value);
14
+ };
15
+ // null konvertujeme na undefined (zevraj InputNumber nechce null)
16
+ return (react_1.default.createElement(inputnumber_1.InputNumber, { id: props.id, value: props.value !== null ? props.value : undefined, onChange: onChange, readOnly: props.readOnly, mode: "decimal", locale: "de-DE", useGrouping: props.useGrouping, minFractionDigits: props.fractionDigits, maxFractionDigits: props.fractionDigits, min: props.min, max: props.max, size: props.size }));
17
+ };
18
+ exports.XInputDecimalBase = XInputDecimalBase;
@@ -1,7 +1,10 @@
1
- import { ReactChild } from 'react';
1
+ import React, { ReactChild } from 'react';
2
+ import { DataTableFilterMetaData, DataTableOperatorFilterMetaData } from 'primereact/datatable';
3
+ import { ColumnBodyOptions, ColumnFilterElementTemplateOptions } from 'primereact/column';
2
4
  import { SearchTableParams } from "./SearchTableParams";
3
5
  import { XCustomFilter } from "../serverApi/FindParam";
4
6
  import { XOnSaveOrCancelProp } from "./XFormBase";
7
+ export type XBetweenFilterProp = "row" | "column" | undefined;
5
8
  export interface XEditModeHandlers {
6
9
  onStart: () => void;
7
10
  onSave: () => void;
@@ -18,6 +21,7 @@ export interface XLazyDataTableProps {
18
21
  paginator: boolean;
19
22
  rows: number;
20
23
  filterDisplay: "menu" | "row";
24
+ betweenFilter?: XBetweenFilterProp;
21
25
  scrollable: boolean;
22
26
  scrollWidth: string;
23
27
  scrollHeight: string;
@@ -49,12 +53,17 @@ export declare const XLazyDataTable: {
49
53
  shrinkWidth: boolean;
50
54
  };
51
55
  };
56
+ export type XSetFilterItem = (field: string, filterItem: DataTableFilterMetaData | DataTableOperatorFilterMetaData) => void;
57
+ export type XFilterElementProp = (setFilterItem: XSetFilterItem, options: ColumnFilterElementTemplateOptions) => React.ReactNode;
52
58
  export interface XLazyColumnProps {
53
59
  field: string;
54
60
  header?: any;
55
61
  align?: "left" | "center" | "right";
56
62
  dropdownInFilter?: boolean;
57
63
  showFilterMenu?: boolean;
64
+ betweenFilter?: XBetweenFilterProp | "noBetween";
58
65
  width?: string;
66
+ filterElement?: XFilterElementProp;
67
+ body?: React.ReactNode | ((data: any, options: ColumnBodyOptions) => React.ReactNode);
59
68
  }
60
69
  export declare const XLazyColumn: (props: XLazyColumnProps) => null;
@@ -112,6 +112,8 @@ var tristatecheckbox_1 = require("primereact/tristatecheckbox");
112
112
  var XUtilsCommon_1 = require("../serverApi/XUtilsCommon");
113
113
  var XExportRowsDialog_1 = require("./XExportRowsDialog");
114
114
  var api_1 = require("primereact/api");
115
+ var XCalendar_1 = require("./XCalendar");
116
+ var XInputDecimalBase_1 = require("./XInputDecimalBase");
115
117
  var XLazyDataTable = function (props) {
116
118
  // must be here, is used in createInitFilters()
117
119
  var xEntity = XUtilsMetadata_1.XUtilsMetadata.getXEntity(props.entity);
@@ -476,58 +478,90 @@ var XLazyDataTable = function (props) {
476
478
  console.log("Nie je vyselectovany ziaden zaznam.");
477
479
  }
478
480
  };
479
- // ****** checkbox vo filtri ********
481
+ // ****** dropdown vo filtri ********
480
482
  // pouziva sa len pre simple filtrovanie (filterDisplay="row")
481
- var onCheckboxFilterChange = function (field, checkboxValue) {
482
- // TODO - treba vyklonovat?
483
+ var onDropdownFilterChange = function (field, displayValue) {
484
+ var filterValue = displayValue !== XUtils_1.XUtils.dropdownEmptyOptionValue ? displayValue : null;
485
+ setFilterValue(field, filterValue, api_1.FilterMatchMode.EQUALS);
486
+ };
487
+ var getDropdownFilterValue = function (field) {
488
+ var filterValue = getFilterValue(field);
489
+ return filterValue !== null ? filterValue : XUtils_1.XUtils.dropdownEmptyOptionValue;
490
+ };
491
+ // ****** vseobecne metodky pre set/get do/z filtra ********
492
+ // zatial funguje len pre simple filtrovanie (filterDisplay="row")
493
+ // vseobecna specialna metodka pouzvana pri custom filtri (XLazyColumn.filterElement)
494
+ var setFilterItem = function (field, filterItem) {
495
+ filters[field] = filterItem;
496
+ // neskusal som, ci treba aj toto klonovat ale pravdepodobne hej
483
497
  var filtersCloned = __assign({}, filters);
484
- if (checkboxValue !== null) {
485
- filtersCloned[field] = { value: checkboxValue ? "1" : "0", matchMode: api_1.FilterMatchMode.EQUALS };
486
- }
487
- else {
488
- // pouzivatel zrusil hodnotu vo filtri (vybral prazdny stav v checkboxe), zrusime polozku z filtra
489
- //delete filtersCloned[field];
490
- filtersCloned[field] = { value: null, matchMode: api_1.FilterMatchMode.EQUALS };
491
- }
492
498
  setFilters(filtersCloned);
493
499
  };
494
- var getCheckboxFilterValue = function (field) {
495
- var checkboxValue = null;
496
- var filterValue = filters[field];
497
- if (filterValue !== undefined && filterValue !== null) {
498
- if (filterValue.value === '1') {
499
- checkboxValue = true;
500
- }
501
- else if (filterValue.value === '0') {
502
- checkboxValue = false;
503
- }
500
+ // vseobecna metodka - nastavi hodnotu do filtra
501
+ // ak je matchMode === undefined, tak zachova povodnu hodnotu matchMode
502
+ var setFilterValue = function (field, value, matchMode) {
503
+ var filterValue = filters[field]; // funguje len pre filterDisplay="row"
504
+ filterValue.value = value;
505
+ if (matchMode !== undefined) {
506
+ filterValue.matchMode = matchMode;
507
+ }
508
+ // treba klonovat, inac react nezobrazi zmenenu hodnotu
509
+ var filtersCloned = __assign({}, filters);
510
+ setFilters(filtersCloned);
511
+ };
512
+ // vseobecna metodka - precita hodnotu z filtra (vrati napr. typ Date | null)
513
+ var getFilterValue = function (field) {
514
+ var filterValue = filters[field]; // funguje len pre filterDisplay="row"
515
+ return filterValue.value;
516
+ };
517
+ // ****** vseobecne metodky pre set/get do/z filtra - pre betweenFilter ********
518
+ // do DataTableFilterMetaData.value ulozime dvojprvkove pole [value1, value2]
519
+ // na backende spracujeme toto dvojprvkove pole
520
+ var setFilterValue1 = function (field, value) {
521
+ // na zaciatku (po inicializacii lazy table) je filterValue = null
522
+ var filterValue = getFilterValue(field);
523
+ if (filterValue !== null) {
524
+ filterValue[0] = value;
525
+ }
526
+ else {
527
+ filterValue = [value, null];
504
528
  }
505
- return checkboxValue;
529
+ setFilterValue(field, filterValue, api_1.FilterMatchMode.BETWEEN);
506
530
  };
507
- // ****** dropdown vo filtri ********
508
- // pouziva sa len pre simple filtrovanie (filterDisplay="row")
509
- var onDropdownFilterChange = function (field, displayValue) {
510
- // TODO - treba vyklonovat?
511
- var filtersCloned = __assign({}, filters);
512
- if (displayValue !== XUtils_1.XUtils.dropdownEmptyOptionValue) {
513
- filtersCloned[field] = { value: displayValue, matchMode: api_1.FilterMatchMode.EQUALS };
531
+ var setFilterValue2 = function (field, value) {
532
+ // na zaciatku (po inicializacii lazy table) je filterValue = null
533
+ var filterValue = getFilterValue(field);
534
+ if (filterValue !== null) {
535
+ filterValue[1] = value;
514
536
  }
515
537
  else {
516
- // pouzivatel zrusil hodnotu vo filtri (vybral prazdny riadok), zrusime polozku z filtra
517
- //delete filtersCloned[field];
518
- filtersCloned[field] = { value: null, matchMode: api_1.FilterMatchMode.EQUALS };
538
+ filterValue = [null, value];
519
539
  }
520
- setFilters(filtersCloned);
540
+ setFilterValue(field, filterValue, api_1.FilterMatchMode.BETWEEN);
521
541
  };
522
- var getDropdownFilterValue = function (field) {
523
- var dropdownValue = XUtils_1.XUtils.dropdownEmptyOptionValue;
524
- var filterValue = filters[field];
525
- if (filterValue !== undefined && filterValue !== null) {
526
- if (filterValue.value !== null) {
527
- dropdownValue = filterValue.value;
542
+ var getFilterValue1 = function (field) {
543
+ return getFilterValue1or2(field, 0);
544
+ };
545
+ var getFilterValue2 = function (field) {
546
+ return getFilterValue1or2(field, 1);
547
+ };
548
+ var getFilterValue1or2 = function (field, index) {
549
+ var filterValue = getFilterValue(field);
550
+ return filterValue !== null ? filterValue[index] : null;
551
+ };
552
+ var getBetweenFilter = function (columnBetweenFilter, tableBetweenFilter) {
553
+ var betweenFilter = undefined;
554
+ // columnBetweenFilter has higher prio than tableBetweenFilter
555
+ if (columnBetweenFilter !== undefined) {
556
+ if (columnBetweenFilter === "row" || columnBetweenFilter === "column") {
557
+ betweenFilter = columnBetweenFilter;
528
558
  }
559
+ // for "noBetween" stays betweenFilter = undefined (simple filter used)
560
+ }
561
+ else {
562
+ betweenFilter = tableBetweenFilter; // betweenFilter from XLazyDataTable property
529
563
  }
530
- return dropdownValue;
564
+ return betweenFilter;
531
565
  };
532
566
  var bodyTemplate = function (columnProps, rowData, xField) {
533
567
  var rowDataValue = XUtilsCommon_1.XUtilsCommon.getValueByPath(rowData, columnProps.field);
@@ -684,14 +718,61 @@ var XLazyDataTable = function (props) {
684
718
  header = headerLabel;
685
719
  }
686
720
  // *********** filterElement ***********
721
+ var betweenFilter = undefined;
687
722
  var filterElement;
688
- if (xField.type === "boolean") {
689
- var checkboxValue = getCheckboxFilterValue(childColumn.props.field);
690
- filterElement = react_1.default.createElement(tristatecheckbox_1.TriStateCheckbox, { value: checkboxValue, onChange: function (e) { return onCheckboxFilterChange(childColumn.props.field, e.value); } });
723
+ if (childColumn.props.filterElement !== undefined) {
724
+ filterElement = function (options) {
725
+ // compilator sa stazoval ze childColumn.props.filterElement muze byt undefined, preto som pridal "!"
726
+ return childColumn.props.filterElement(setFilterItem, options);
727
+ };
691
728
  }
692
- else if (childColumn.props.dropdownInFilter) {
693
- var dropdownValue = getDropdownFilterValue(childColumn.props.field);
694
- filterElement = react_1.default.createElement(XDropdownDTFilter_1.XDropdownDTFilter, { entity: props.entity, path: childColumn.props.field, value: dropdownValue, onValueChange: onDropdownFilterChange });
729
+ else {
730
+ if (xField.type === "boolean") {
731
+ var checkboxValue = getFilterValue(childColumn.props.field);
732
+ filterElement = react_1.default.createElement(tristatecheckbox_1.TriStateCheckbox, { value: checkboxValue, onChange: function (e) { return setFilterValue(childColumn.props.field, e.value, api_1.FilterMatchMode.EQUALS); } });
733
+ }
734
+ else if (childColumn.props.dropdownInFilter) {
735
+ var dropdownValue = getDropdownFilterValue(childColumn.props.field);
736
+ filterElement = react_1.default.createElement(XDropdownDTFilter_1.XDropdownDTFilter, { entity: props.entity, path: childColumn.props.field, value: dropdownValue, onValueChange: onDropdownFilterChange });
737
+ }
738
+ else if (xField.type === "date" || xField.type === "datetime") {
739
+ betweenFilter = getBetweenFilter(childColumn.props.betweenFilter, props.betweenFilter);
740
+ if (betweenFilter !== undefined) {
741
+ // display: 'flex' umiestni XCalendar elementy vedla seba
742
+ filterElement =
743
+ react_1.default.createElement("div", { style: betweenFilter === "row" ? { display: 'flex' } : undefined },
744
+ react_1.default.createElement(XCalendar_1.XCalendar, { value: getFilterValue1(childColumn.props.field), onChange: function (value) { return setFilterValue1(childColumn.props.field, value); }, datetime: xField.type === "datetime" }),
745
+ react_1.default.createElement(XCalendar_1.XCalendar, { value: getFilterValue2(childColumn.props.field), onChange: function (value) { return setFilterValue2(childColumn.props.field, value); }, datetime: xField.type === "datetime" }));
746
+ }
747
+ else {
748
+ var dateValue = getFilterValue(childColumn.props.field);
749
+ filterElement = react_1.default.createElement(XCalendar_1.XCalendar, { value: dateValue, onChange: function (value) { return setFilterValue(childColumn.props.field, value); }, datetime: xField.type === "datetime" });
750
+ }
751
+ }
752
+ else if (xField.type === "decimal" || xField.type === "number") {
753
+ var params = XUtilsMetadata_1.XUtilsMetadata.getParamsForInputNumber(xField);
754
+ betweenFilter = getBetweenFilter(childColumn.props.betweenFilter, props.betweenFilter);
755
+ if (betweenFilter !== undefined) {
756
+ // display: 'flex' umiestni input elementy pod seba (betweenFilter = "column") resp. vedla seba (betweenFilter = "row")
757
+ filterElement =
758
+ react_1.default.createElement("div", { style: { display: 'flex', flexDirection: betweenFilter } },
759
+ react_1.default.createElement(XInputDecimalBase_1.XInputDecimalBase, __assign({ value: getFilterValue1(childColumn.props.field), onChange: function (value) { return setFilterValue1(childColumn.props.field, value); } }, params)),
760
+ react_1.default.createElement(XInputDecimalBase_1.XInputDecimalBase, __assign({ value: getFilterValue2(childColumn.props.field), onChange: function (value) { return setFilterValue2(childColumn.props.field, value); } }, params)));
761
+ }
762
+ else {
763
+ var numberValue = getFilterValue(childColumn.props.field);
764
+ filterElement = react_1.default.createElement(XInputDecimalBase_1.XInputDecimalBase, __assign({ value: numberValue, onChange: function (value) { return setFilterValue(childColumn.props.field, value); } }, params));
765
+ }
766
+ }
767
+ }
768
+ // ************** dataType **************
769
+ // depending on the dataType of the column, suitable match modes are displayed in filter
770
+ var dataType = undefined;
771
+ if (xField.type === "decimal" || xField.type === "number") {
772
+ dataType = "numeric";
773
+ }
774
+ else if (xField.type === "date" || xField.type === "datetime") {
775
+ dataType = "date";
695
776
  }
696
777
  // *********** showFilterMenu ***********
697
778
  var showFilterMenu;
@@ -701,7 +782,7 @@ var XLazyDataTable = function (props) {
701
782
  else {
702
783
  showFilterMenu = true; // default
703
784
  if (props.filterDisplay === "row") {
704
- if (xField.type === "boolean" || childColumn.props.dropdownInFilter) {
785
+ if (xField.type === "boolean" || childColumn.props.dropdownInFilter || betweenFilter !== undefined) {
705
786
  showFilterMenu = false;
706
787
  }
707
788
  }
@@ -710,9 +791,12 @@ var XLazyDataTable = function (props) {
710
791
  // pre filterDisplay = "row" nechceme clear button, chceme setrit miesto
711
792
  var showClearButton = props.filterDisplay === "menu";
712
793
  // *********** body ***********
713
- // TODO - mozno by bolo dobre vytvarat body pre kazdy field, nech je to vsetko konzistentne
714
794
  var body;
715
- if (xField.type === "decimal" || xField.type === "date" || xField.type === "datetime" || xField.type === "boolean") {
795
+ if (childColumn.props.body !== undefined) {
796
+ body = childColumn.props.body;
797
+ }
798
+ // TODO - mozno by bolo dobre vytvarat body pre kazdy typ fieldu, nech je to vsetko konzistentne
799
+ else if (xField.type === "decimal" || xField.type === "date" || xField.type === "datetime" || xField.type === "boolean") {
716
800
  body = function (rowData) { return bodyTemplate(childColumn.props, rowData, xField); };
717
801
  }
718
802
  // *********** width/headerStyle ***********
@@ -721,7 +805,7 @@ var XLazyDataTable = function (props) {
721
805
  // TODO - if filter not used at all, then buttons flags should be false
722
806
  var filterMenuInFilterRow = props.filterDisplay === "row" && showFilterMenu;
723
807
  var filterButtonInHeader = props.filterDisplay === "menu";
724
- width = XUtilsMetadata_1.XUtilsMetadata.computeColumnWidth(xField, filterMenuInFilterRow, undefined, headerLabel, true, filterButtonInHeader);
808
+ width = XUtilsMetadata_1.XUtilsMetadata.computeColumnWidth(xField, betweenFilter, filterMenuInFilterRow, undefined, headerLabel, true, filterButtonInHeader);
725
809
  }
726
810
  var headerStyle = {};
727
811
  if (width !== undefined) {
@@ -741,7 +825,7 @@ var XLazyDataTable = function (props) {
741
825
  align = "center";
742
826
  }
743
827
  }
744
- return react_1.default.createElement(column_1.Column, { field: childColumn.props.field, header: header, filter: true, sortable: true, filterElement: filterElement, showFilterMenu: showFilterMenu, showClearButton: showClearButton, body: body, headerStyle: headerStyle, align: align });
828
+ return react_1.default.createElement(column_1.Column, { field: childColumn.props.field, header: header, filter: true, sortable: true, filterElement: filterElement, dataType: dataType, showFilterMenu: showFilterMenu, showClearButton: showClearButton, body: body, headerStyle: headerStyle, align: align });
745
829
  });
746
830
  return (react_1.default.createElement("div", null,
747
831
  react_1.default.createElement("div", { className: "flex justify-content-center" },
@@ -1,5 +1,6 @@
1
- import { XAssoc, XEntity, XField } from "../serverApi/XEntityMetadata";
1
+ import { XAssoc, XEntity, XField, XRelationType } from "../serverApi/XEntityMetadata";
2
2
  import { XBrowseMeta } from "../serverApi/XBrowseMetadata";
3
+ import { XBetweenFilterProp } from "./XLazyDataTable";
3
4
  export declare class XUtilsMetadata {
4
5
  private static xEntityMap;
5
6
  private static xBrowseMetaMap;
@@ -9,6 +10,8 @@ export declare class XUtilsMetadata {
9
10
  static getXField(xEntity: XEntity, field: string): XField;
10
11
  static getXFieldByPath(xEntity: XEntity, path: string): XField;
11
12
  static getXFieldByPathStr(entity: string, path: string): XField;
13
+ static getXAssocByPath(xEntity: XEntity, path: string): XAssoc;
14
+ static getLastXAssocByPath(xEntity: XEntity, path: string): XAssoc;
12
15
  static getXAssocToOne(xEntity: XEntity, assocField: string): XAssoc;
13
16
  static getXAssocToMany(xEntity: XEntity, assocField: string): XAssoc;
14
17
  static getXAssocToOneByAssocEntity(xEntity: XEntity, assocEntityName: string): XAssoc;
@@ -16,6 +19,7 @@ export declare class XUtilsMetadata {
16
19
  static getXEntityForAssocToOne(xEntity: XEntity, assocField: string): XEntity;
17
20
  static getXEntityForAssocToMany(xEntity: XEntity, assocField: string): XEntity;
18
21
  static getXFieldList(xEntity: XEntity): XField[];
22
+ static getXAssocList(xEntity: XEntity, relationTypeList?: XRelationType[]): XAssoc[];
19
23
  static getParamsForInputNumber(xField: XField): {
20
24
  useGrouping: boolean;
21
25
  fractionDigits?: number;
@@ -24,7 +28,7 @@ export declare class XUtilsMetadata {
24
28
  size?: number;
25
29
  };
26
30
  static CHAR_SIZE: number;
27
- static computeColumnWidth(xField: XField, filterMenuInFilterRow: boolean, formColumnType: string | undefined, header: string | undefined, sortableButtonInHeader: boolean, filterButtonInHeader: boolean): string | undefined;
31
+ static computeColumnWidth(xField: XField, betweenFilter: XBetweenFilterProp, filterMenuInFilterRow: boolean, formColumnType: string | undefined, header: string | undefined, sortableButtonInHeader: boolean, filterButtonInHeader: boolean): string | undefined;
28
32
  static computeColumnWidthBase(charSize?: number, paddingAndOther?: number): number | undefined;
29
33
  static getXBrowseMeta(entity: string, browseId?: string): XBrowseMeta;
30
34
  static setXBrowseMeta(entity: string, browseId: string | undefined, xBrowseMeta: XBrowseMeta): void;