mig-schema-table 3.0.54 → 3.0.56

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.
@@ -7,8 +7,9 @@ export interface IFilterFormComponentProps {
7
7
  onChange: (newValue?: TColumnFilterValue) => void;
8
8
  onInputKeyDown: (e: React.KeyboardEvent) => void;
9
9
  propConfig?: IColumnConfig<any>;
10
+ propIsRequired: boolean;
10
11
  propName: string;
11
12
  propSchema: oas31.SchemaObject;
12
13
  }
13
- declare const _default: React.MemoExoticComponent<({ columnFilterValue, onChange, onInputKeyDown, propConfig, propName, propSchema, }: IFilterFormComponentProps) => import("react/jsx-runtime").JSX.Element>;
14
+ declare const _default: React.MemoExoticComponent<({ columnFilterValue, onChange, onInputKeyDown, propConfig, propIsRequired, propName, propSchema, }: IFilterFormComponentProps) => import("react/jsx-runtime").JSX.Element>;
14
15
  export default _default;
@@ -4,7 +4,7 @@ import { t } from "../../../inc/string";
4
4
  import { DEFAULT_DATE_FORMAT, DEFAULT_DATE_TIME_FORMAT, } from "../../../inc/constant";
5
5
  import DatePicker from "react-datepicker";
6
6
  import nl from "date-fns/locale/nl";
7
- const FilterFormComponent = ({ columnFilterValue, onChange, onInputKeyDown, propConfig, propName, propSchema, }) => {
7
+ const FilterFormComponent = ({ columnFilterValue, onChange, onInputKeyDown, propConfig, propIsRequired, propName, propSchema, }) => {
8
8
  const { type, format, minimum, maximum } = propSchema;
9
9
  const value = columnFilterValue;
10
10
  switch (type) {
@@ -48,28 +48,31 @@ const FilterFormComponent = ({ columnFilterValue, onChange, onInputKeyDown, prop
48
48
  const dateRangeValue = (columnFilterValue || {
49
49
  from: undefined,
50
50
  to: undefined,
51
+ filterEmpty: undefined,
51
52
  });
52
- const startDateChangeHandler = (date) => {
53
- if (!date && !dateRangeValue.to) {
54
- onChange(undefined);
55
- return;
56
- }
57
- if (dateRangeValue.to && date && date > dateRangeValue.to) {
58
- return;
59
- }
60
- onChange(Object.assign(Object.assign({}, columnFilterValue), { from: date || undefined }));
61
- };
62
- const endDateChangeHandler = (date) => {
63
- if (!date && !dateRangeValue.from) {
64
- onChange(undefined);
65
- return;
66
- }
67
- if (dateRangeValue.from && date && date < dateRangeValue.from) {
68
- return;
69
- }
70
- onChange(Object.assign(Object.assign({}, columnFilterValue), { to: date || undefined }));
71
- };
72
- return (_jsxs("div", Object.assign({ className: "input-group d-flex" }, { children: [_jsxs("div", Object.assign({ className: "d-flex flex-column m-1" }, { children: [_jsx("label", { children: "Start date-time" }), _jsx(DatePicker, { autoFocus: true, dateFormat: dateFormat, "data-prop-name": propName, locale: nl, selected: dateRangeValue.from, onChange: startDateChangeHandler, placeholderText: dateFormat, isClearable: true, selectsStart: true, showTimeSelect: format === "date-time", timeIntervals: 15, shouldCloseOnSelect: format === "date" })] })), _jsxs("div", Object.assign({ className: "d-flex flex-column m-1" }, { children: [_jsx("label", { children: "End date-time" }), _jsx(DatePicker, { id: "filter-date", dateFormat: dateFormat, "data-prop-name": propName, locale: nl, selectsEnd: true, selected: dateRangeValue.to, onChange: endDateChangeHandler, placeholderText: dateFormat, isClearable: true, startDate: dateRangeValue.from, endDate: dateRangeValue.to, showTimeSelect: format === "date-time", timeIntervals: 15, shouldCloseOnSelect: format === "date" })] }))] })));
53
+ return (_jsxs("div", { children: [propIsRequired ? null : (_jsxs("div", { children: [_jsxs("label", Object.assign({ className: "d-flex" }, { children: [_jsx("input", { type: "checkbox", className: "m-0 me-1", checked: !!dateRangeValue.filterEmpty, onChange: () => {
54
+ onChange(Object.assign(Object.assign({}, dateRangeValue), { filterEmpty: !dateRangeValue.filterEmpty }));
55
+ } }), "Hide empty values"] })), _jsx("hr", {})] })), _jsxs("div", Object.assign({ className: "input-group d-flex" }, { children: [_jsxs("div", Object.assign({ className: "d-flex flex-column m-1" }, { children: [_jsx("label", { children: "Start date-time" }), _jsx(DatePicker, { autoFocus: true, dateFormat: dateFormat, "data-prop-name": propName, locale: nl, selected: dateRangeValue.from, onChange: (date) => {
56
+ if (!date && !dateRangeValue.to) {
57
+ onChange(undefined);
58
+ return;
59
+ }
60
+ if (dateRangeValue.to && date && date > dateRangeValue.to) {
61
+ return;
62
+ }
63
+ onChange(Object.assign(Object.assign({}, columnFilterValue), { from: date || undefined }));
64
+ }, placeholderText: dateFormat, isClearable: true, selectsStart: true, showTimeSelect: format === "date-time", timeIntervals: 15, shouldCloseOnSelect: format === "date" })] })), _jsxs("div", Object.assign({ className: "d-flex flex-column m-1" }, { children: [_jsx("label", { children: "End date-time" }), _jsx(DatePicker, { id: "filter-date", dateFormat: dateFormat, "data-prop-name": propName, locale: nl, selectsEnd: true, selected: dateRangeValue.to, onChange: (date) => {
65
+ if (!date && !dateRangeValue.from) {
66
+ onChange(undefined);
67
+ return;
68
+ }
69
+ if (dateRangeValue.from &&
70
+ date &&
71
+ date < dateRangeValue.from) {
72
+ return;
73
+ }
74
+ onChange(Object.assign(Object.assign({}, columnFilterValue), { to: date || undefined }));
75
+ }, placeholderText: dateFormat, isClearable: true, startDate: dateRangeValue.from, endDate: dateRangeValue.to, showTimeSelect: format === "date-time", timeIntervals: 15, shouldCloseOnSelect: format === "date" })] }))] }))] }));
73
76
  }
74
77
  // falls through
75
78
  default:
@@ -6,13 +6,15 @@ export interface ISchemaColumnFilterPopoverConfig {
6
6
  referenceElement: HTMLElement;
7
7
  propName: string;
8
8
  propConfig?: IColumnConfig<any>;
9
+ propIsRequired: boolean;
9
10
  }
10
11
  type TSchemaColumnFilterPopoverProps = ISchemaColumnFilterPopoverConfig & {
11
12
  onChange: (newValue?: TColumnFilterValue) => void;
12
13
  onInputKeyDown: (e: React.KeyboardEvent) => void;
14
+ propIsRequired: boolean;
13
15
  propSchema: oas31.SchemaObject;
14
16
  value: TColumnFilterValue;
15
17
  onClose: () => void;
16
18
  };
17
- declare const _default: React.MemoExoticComponent<({ onChange, onClose, onInputKeyDown, propName, propSchema, referenceElement, value, propConfig, }: TSchemaColumnFilterPopoverProps) => import("react/jsx-runtime").JSX.Element>;
19
+ declare const _default: React.MemoExoticComponent<({ onChange, onClose, onInputKeyDown, propIsRequired, propName, propSchema, referenceElement, value, propConfig, }: TSchemaColumnFilterPopoverProps) => import("react/jsx-runtime").JSX.Element>;
18
20
  export default _default;
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React from "react";
3
3
  import FilterFormComponent from "./FilterFormComponent";
4
4
  import { usePopper } from "react-popper";
5
- const SchemaColumnFilterPopover = ({ onChange, onClose, onInputKeyDown, propName, propSchema, referenceElement, value, propConfig, }) => {
5
+ const SchemaColumnFilterPopover = ({ onChange, onClose, onInputKeyDown, propIsRequired, propName, propSchema, referenceElement, value, propConfig, }) => {
6
6
  const [popperElement, setPopperElement] = React.useState(null);
7
7
  const [arrowElement, setArrowElement] = React.useState(null);
8
8
  const { styles, attributes } = usePopper(referenceElement, popperElement, {
@@ -33,6 +33,6 @@ const SchemaColumnFilterPopover = ({ onChange, onClose, onInputKeyDown, propName
33
33
  classNames.push(`bs-popover-${attributes.popper["data-popper-placement"]}`);
34
34
  }
35
35
  const FilterForm = (propConfig === null || propConfig === void 0 ? void 0 : propConfig.FilterForm) || FilterFormComponent;
36
- return (_jsxs("div", Object.assign({ className: classNames.join(" "), role: "tooltip", ref: setPopperElement, style: styles.popper }, attributes.popper, { children: [_jsx("div", { className: "popover-arrow", ref: setArrowElement, style: styles.arrow }), _jsx("div", Object.assign({ className: "popover-body" }, { children: _jsx(FilterForm, { onChange: onChange, onInputKeyDown: onInputKeyDown, propSchema: propSchema, propName: propName, columnFilterValue: value, propConfig: propConfig }) }))] })));
36
+ return (_jsxs("div", Object.assign({ className: classNames.join(" "), role: "tooltip", ref: setPopperElement, style: styles.popper }, attributes.popper, { children: [_jsx("div", { className: "popover-arrow", ref: setArrowElement, style: styles.arrow }), _jsx("div", Object.assign({ className: "popover-body" }, { children: _jsx(FilterForm, { columnFilterValue: value, onChange: onChange, onInputKeyDown: onInputKeyDown, propConfig: propConfig, propIsRequired: propIsRequired, propName: propName, propSchema: propSchema }) }))] })));
37
37
  };
38
38
  export default React.memo(SchemaColumnFilterPopover);
@@ -15,6 +15,7 @@ interface IThProps {
15
15
  numberOfSelectedRows?: number;
16
16
  onSelectAllIndexesHandler?: (e: React.ChangeEvent<HTMLInputElement>) => void;
17
17
  propConfig?: IColumnConfig<any>;
18
+ propIsRequired: boolean;
18
19
  propName: string;
19
20
  schema?: oas31.SchemaObject;
20
21
  setPopoverConfig?: Dispatch<SetStateAction<ISchemaColumnFilterPopoverConfig | undefined>>;
@@ -23,5 +24,5 @@ interface IThProps {
23
24
  sortAsc?: boolean;
24
25
  style: CSSProperties;
25
26
  }
26
- declare const _default: ({ isAllChecked, columnFilterStatus, disableColumnFilter, isSortable, numberOfSelectedRows, onSelectAllIndexesHandler, propConfig, propName, schema, setPopoverConfig, setSortAsc, setSortColumn, sortAsc, style, }: IThProps) => import("react/jsx-runtime").JSX.Element;
27
+ declare const _default: ({ columnFilterStatus, disableColumnFilter, isAllChecked, isSortable, numberOfSelectedRows, onSelectAllIndexesHandler, propConfig, propIsRequired, propName, schema, setPopoverConfig, setSortAsc, setSortColumn, sortAsc, style, }: IThProps) => import("react/jsx-runtime").JSX.Element;
27
28
  export default _default;
@@ -9,7 +9,7 @@ export var EColumnFilterStatus;
9
9
  EColumnFilterStatus["AVAILABLE"] = "AVAILABLE";
10
10
  EColumnFilterStatus["ACTIVE"] = "ACTIVE";
11
11
  })(EColumnFilterStatus || (EColumnFilterStatus = {}));
12
- const Th = ({ isAllChecked, columnFilterStatus, disableColumnFilter, isSortable, numberOfSelectedRows, onSelectAllIndexesHandler, propConfig, propName, schema, setPopoverConfig, setSortAsc, setSortColumn, sortAsc, style, }) => {
12
+ const Th = ({ columnFilterStatus, disableColumnFilter, isAllChecked, isSortable, numberOfSelectedRows, onSelectAllIndexesHandler, propConfig, propIsRequired, propName, schema, setPopoverConfig, setSortAsc, setSortColumn, sortAsc, style, }) => {
13
13
  const thDivProps = {
14
14
  style,
15
15
  className: `schema-table__th schema-table__th--column-filter-status-${columnFilterStatus} ${isSortable ? "schema-table__th--sortable" : "schema-table__th--unsortable"}`,
@@ -43,15 +43,17 @@ const Th = ({ isAllChecked, columnFilterStatus, disableColumnFilter, isSortable,
43
43
  return undefined;
44
44
  }
45
45
  return {
46
- referenceElement,
47
- propName,
48
46
  propConfig,
47
+ propIsRequired,
48
+ propName,
49
+ referenceElement,
49
50
  };
50
51
  });
51
52
  }, [
52
53
  columnFilterStatus,
53
54
  disableColumnFilter,
54
55
  propConfig,
56
+ propIsRequired,
55
57
  propName,
56
58
  setPopoverConfig,
57
59
  ]);
@@ -40,10 +40,12 @@ export interface ISchemaTableProps<T> {
40
40
  style?: React.CSSProperties;
41
41
  width: number;
42
42
  }
43
- export type TColumnFilterValue = string | number | boolean | {
43
+ export interface IDateColumnFilterValue {
44
44
  from?: Date;
45
45
  to?: Date;
46
- };
46
+ filterEmpty?: boolean;
47
+ }
48
+ export type TColumnFilterValue = string | number | boolean | IDateColumnFilterValue;
47
49
  declare function SchemaTable<T>({ Heading, checkedIndexes, disabledCheckedIndexes, config, customElement, data, defaultColumnFilters, defaultSortAsc, defaultSortColumn, getRowClassName, getRowSelected, maxHeight, isSearchable, isColumnFilterable, isSortable, onCheckedIndexesChange, onRowClick, rowHeight, schema, searchPlaceholder, style, width, onRowDoubleClick, enableAutoFocus, }: ISchemaTableProps<T>): import("react/jsx-runtime").JSX.Element;
48
50
  declare const _default: typeof SchemaTable;
49
51
  export default _default;
@@ -43,7 +43,7 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
43
43
  sortColumn,
44
44
  sourceData,
45
45
  ]);
46
- const { properties = {} } = schema;
46
+ const { properties = {}, required = [] } = schema;
47
47
  const columnNames = React.useMemo(() => {
48
48
  const columns = Object.keys(properties);
49
49
  if (onCheckedIndexesChange) {
@@ -208,7 +208,7 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
208
208
  const propSchema = properties[propName];
209
209
  // @ts-ignore
210
210
  const rawValue = sourceData[item._index][propName];
211
- switch (propSchema.type) {
211
+ switch (propSchema === null || propSchema === void 0 ? void 0 : propSchema.type) {
212
212
  case "boolean":
213
213
  case "integer":
214
214
  result = rawValue === columnFilterValue;
@@ -218,11 +218,16 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
218
218
  if (typeof columnFilterValue === "object" &&
219
219
  (propSchema.format === "date" ||
220
220
  propSchema.format === "date-time")) {
221
- const { from, to } = columnFilterValue;
222
- const rawDate = rawValue ? new Date(rawValue) : undefined;
223
- if ((from && (!rawDate || rawDate < from)) ||
224
- (to && (!rawDate || rawDate > to))) {
225
- result = false;
221
+ const { from, to, filterEmpty } = columnFilterValue;
222
+ if (!rawValue) {
223
+ result = !filterEmpty;
224
+ }
225
+ else {
226
+ const rawDate = rawValue ? new Date(rawValue) : undefined;
227
+ if ((from && (!rawDate || rawDate < from)) ||
228
+ (to && (!rawDate || rawDate > to))) {
229
+ result = false;
230
+ }
226
231
  }
227
232
  return;
228
233
  }
@@ -358,7 +363,7 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
358
363
  const schema = (propName === SELECT_ALL_COLUMN_NAME
359
364
  ? { type: "boolean" }
360
365
  : properties[propName]);
361
- return (_jsx(Th, { isAllChecked: isAllRowsChecked, columnFilterStatus: columnFilterStatus, disableColumnFilter: disableColumnFilter, isSortable: !!isSortable, numberOfSelectedRows: checkedIndexes === null || checkedIndexes === void 0 ? void 0 : checkedIndexes.length, onSelectAllIndexesHandler: onSelectAllIndexesHandler, propConfig: propConfig, propName: propName, schema: schema, setPopoverConfig: setPopoverConfig, setSortAsc: onSetSortAsc, setSortColumn: onSetSortColumn, sortAsc: sortColumn === propName ? sortAsc : undefined, style: style }));
366
+ return (_jsx(Th, { isAllChecked: isAllRowsChecked, columnFilterStatus: columnFilterStatus, disableColumnFilter: disableColumnFilter, isSortable: !!isSortable, numberOfSelectedRows: checkedIndexes === null || checkedIndexes === void 0 ? void 0 : checkedIndexes.length, onSelectAllIndexesHandler: onSelectAllIndexesHandler, propConfig: propConfig, propIsRequired: required.includes(propName), propName: propName, schema: schema, setPopoverConfig: setPopoverConfig, setSortAsc: onSetSortAsc, setSortColumn: onSetSortColumn, sortAsc: sortColumn === propName ? sortAsc : undefined, style: style }));
362
367
  }, [
363
368
  checkedIndexes === null || checkedIndexes === void 0 ? void 0 : checkedIndexes.length,
364
369
  columnFilterMap,
@@ -372,6 +377,7 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
372
377
  onSetSortAsc,
373
378
  onSetSortColumn,
374
379
  properties,
380
+ required,
375
381
  sortAsc,
376
382
  sortColumn,
377
383
  ]);
@@ -455,6 +461,6 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
455
461
  backgroundColor: "#CCC",
456
462
  alignItems: "center",
457
463
  justifyContent: "center",
458
- } }, { children: isDirty ? (_jsx("button", Object.assign({ onClick: refreshData, className: "btn border" }, { children: "Refresh data" }))) : (_jsx("div", { children: "\u231B Loading..." })) }))), popoverConfig ? (_jsx(SchemaColumnFilterPopover, { referenceElement: popoverConfig.referenceElement, onClose: onPopoverClose, onChange: onSchemaColumnFilterChange, onInputKeyDown: onInputKeyDown, propName: popoverConfig.propName, propSchema: schema.properties[popoverConfig.propName], value: columnFilterMap[popoverConfig.propName], propConfig: popoverConfig.propConfig })) : null] })));
464
+ } }, { children: isDirty ? (_jsx("button", Object.assign({ onClick: refreshData, className: "btn border" }, { children: "Refresh data" }))) : (_jsx("div", { children: "\u231B Loading..." })) }))), popoverConfig ? (_jsx(SchemaColumnFilterPopover, { referenceElement: popoverConfig.referenceElement, onClose: onPopoverClose, onChange: onSchemaColumnFilterChange, onInputKeyDown: onInputKeyDown, propIsRequired: popoverConfig.propIsRequired, propName: popoverConfig.propName, propSchema: schema.properties[popoverConfig.propName], value: columnFilterMap[popoverConfig.propName], propConfig: popoverConfig.propConfig })) : null] })));
459
465
  }
460
466
  export default React.memo(SchemaTable);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mig-schema-table",
3
- "version": "3.0.54",
3
+ "version": "3.0.56",
4
4
  "main": "dist/index.js",
5
5
  "files": [
6
6
  "dist/"