mig-schema-table 4.0.4 → 4.0.6

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,132 +0,0 @@
1
- var __rest = (this && this.__rest) || function (s, e) {
2
- var t = {};
3
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
- t[p] = s[p];
5
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
- t[p[i]] = s[p[i]];
9
- }
10
- return t;
11
- };
12
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
- import React from "react";
14
- import { DEFAULT_DATE_FORMAT, DEFAULT_DATE_TIME_FORMAT, ENumberColumnFilterOperation, } from "../../../inc/constant";
15
- import DatePicker from "react-datepicker";
16
- import nl from "date-fns/locale/nl";
17
- import { endOfDay } from "date-fns";
18
- const numberColumnFilterOperationsLabelMap = {
19
- [ENumberColumnFilterOperation.GT]: ">",
20
- [ENumberColumnFilterOperation.LT]: "<",
21
- [ENumberColumnFilterOperation.EQ]: "=",
22
- };
23
- const FilterMenuComponent = ({ columnFilterValue, onChange, onInputKeyDown, propIsRequired, propName, propSchema, translate, }) => {
24
- const { type, format, minimum, maximum } = propSchema || {};
25
- const value = columnFilterValue;
26
- const isDateTime = format === "date-time";
27
- switch (type) {
28
- case "number":
29
- case "integer":
30
- const numberColumnFilterValue = (value || {});
31
- const changeOperationValue = (operation, el, persistState) => {
32
- const newValue = Object.assign(Object.assign({}, numberColumnFilterValue), { [operation]: el.value === "" ? undefined : parseInt(el.value) });
33
- const hasValue = Object.values(newValue).find((opValue) => isFinite(opValue));
34
- onChange(hasValue !== undefined &&
35
- (minimum !== undefined ? hasValue >= minimum : true)
36
- ? newValue
37
- : undefined, persistState);
38
- };
39
- return (_jsxs("ol", Object.assign({ className: "mig-schema-table-menu mig-schema-table__th-menu__filter-menu-component" }, { children: [propIsRequired ? null : (_jsxs("li", Object.assign({ style: { padding: 8 } }, { children: [_jsxs("label", Object.assign({ className: "d-flex" }, { children: [_jsx("input", { type: "checkbox", style: { marginRight: 14 }, checked: !!numberColumnFilterValue.filterEmpty, onChange: () => {
40
- const { filterEmpty } = numberColumnFilterValue, newNumberColumnFilterValue = __rest(numberColumnFilterValue, ["filterEmpty"]);
41
- if (!filterEmpty) {
42
- newNumberColumnFilterValue.filterEmpty = true;
43
- }
44
- onChange(Object.keys(newNumberColumnFilterValue).length
45
- ? newNumberColumnFilterValue
46
- : undefined, true);
47
- } }), "Hide empty values"] })), _jsx("hr", {})] }))), Object.keys(ENumberColumnFilterOperation).map((operation) => {
48
- const val = numberColumnFilterValue[operation];
49
- return (_jsxs("li", { children: [_jsx("label", Object.assign({ style: { width: 40, paddingLeft: 16 } }, { children: numberColumnFilterOperationsLabelMap[operation] })), _jsx("input", { className: "form-control", style: { width: 120 }, type: "number", value: val !== undefined ? val : "", "data-prop-name": propName, onChange: (e) => {
50
- changeOperationValue(operation, e.currentTarget, false);
51
- }, onBlur: (e) => {
52
- changeOperationValue(operation, e.currentTarget, true);
53
- }, onKeyDown: onInputKeyDown, min: minimum, max: maximum })] }, operation));
54
- })] })));
55
- case "boolean":
56
- let selectValue = value ? "✓" : "✕";
57
- if (value === undefined) {
58
- selectValue = "";
59
- }
60
- return (_jsx("ol", Object.assign({ className: "mig-schema-table-menu mig-schema-table__th-menu__filter-menu-component" }, { children: _jsx("li", { children: _jsxs("select", Object.assign({ autoFocus: true, className: "form-select", value: selectValue, "data-prop-name": propName, onChange: (e) => {
61
- switch (e.currentTarget.value) {
62
- case "✓":
63
- onChange(true, true);
64
- break;
65
- case "✕":
66
- onChange(false, true);
67
- break;
68
- default:
69
- onChange(undefined, true);
70
- }
71
- } }, { children: [_jsx("option", Object.assign({ value: "" }, { children: "All" }), "all"), ["✓", "✕"].map((optionValue) => (_jsx("option", Object.assign({ value: optionValue }, { children: optionValue }), `column-filter-select-${optionValue}`)))] })) }) })));
72
- // @ts-ignore
73
- case "string":
74
- if (propSchema === null || propSchema === void 0 ? void 0 : propSchema.enum) {
75
- return (_jsx("ol", Object.assign({ className: "mig-schema-table-menu mig-schema-table__th-menu__filter-menu-component" }, { children: _jsx("li", { children: _jsxs("select", Object.assign({ autoFocus: true, className: "form-select", value: value, "data-prop-name": propName, onChange: (e) => {
76
- onChange(e.currentTarget.value || undefined, true);
77
- } }, { children: [_jsx("option", Object.assign({ value: "" }, { children: "All" }), "all"), propSchema.enum.map((value) => {
78
- return (_jsx("option", Object.assign({ value: value }, { children: translate(value) }), `column-filter-select-${value}`));
79
- })] })) }) })));
80
- }
81
- if (isDateTime || format === "date") {
82
- const dateFormat = isDateTime
83
- ? DEFAULT_DATE_TIME_FORMAT
84
- : DEFAULT_DATE_FORMAT;
85
- const dateRangeValue = (columnFilterValue || {
86
- from: undefined,
87
- to: undefined,
88
- filterEmpty: undefined,
89
- });
90
- return (_jsxs("ol", Object.assign({ className: "mig-schema-table-menu mig-schema-table__th-menu__filter-menu-component" }, { children: [propIsRequired ? null : (_jsxs("li", Object.assign({ style: { padding: 8 } }, { children: [_jsxs("label", Object.assign({ className: "d-flex" }, { children: [_jsx("input", { type: "checkbox", checked: !!dateRangeValue.filterEmpty, onChange: () => {
91
- const { filterEmpty } = dateRangeValue, newDateRangeValue = __rest(dateRangeValue, ["filterEmpty"]);
92
- if (!filterEmpty) {
93
- newDateRangeValue.filterEmpty = true;
94
- }
95
- onChange(Object.keys(newDateRangeValue).length
96
- ? newDateRangeValue
97
- : undefined, true);
98
- } }), "Hide empty values"] })), _jsx("hr", {})] }))), _jsxs("li", Object.assign({ style: { padding: 8 } }, { children: [_jsx("label", Object.assign({ style: { width: 120, paddingLeft: 4 } }, { children: "After" })), _jsx(DatePicker, { dateFormat: dateFormat, "data-prop-name": propName, locale: nl, selected: dateRangeValue.from, onChange: (date) => {
99
- if (!date && !dateRangeValue.to) {
100
- onChange(undefined, true);
101
- return;
102
- }
103
- if (dateRangeValue.to && date && date > dateRangeValue.to) {
104
- return;
105
- }
106
- onChange(Object.assign(Object.assign({}, columnFilterValue), { from: date || undefined }), true);
107
- }, placeholderText: dateFormat, isClearable: true, selectsStart: true, showTimeSelect: isDateTime, showTimeInput: isDateTime, timeIntervals: 15, shouldCloseOnSelect: !isDateTime })] })), _jsxs("li", Object.assign({ style: { padding: 8 } }, { children: [_jsx("label", Object.assign({ style: { width: 120, paddingLeft: 4 } }, { children: "Before" })), _jsx(DatePicker, { id: "filter-date", dateFormat: dateFormat, "data-prop-name": propName, locale: nl, selectsEnd: true, selected: dateRangeValue.to, onChange: (date) => {
108
- if (!date && !dateRangeValue.from) {
109
- onChange(undefined, true);
110
- return;
111
- }
112
- const to = date
113
- ? isDateTime
114
- ? date
115
- : endOfDay(date)
116
- : undefined;
117
- if (dateRangeValue.from && to && to < dateRangeValue.from) {
118
- return;
119
- }
120
- onChange(Object.assign(Object.assign({}, columnFilterValue), { to }), true);
121
- }, placeholderText: dateFormat, isClearable: true, startDate: dateRangeValue.from, endDate: dateRangeValue.to, showTimeInput: isDateTime, showTimeSelect: isDateTime, timeIntervals: 15, shouldCloseOnSelect: !isDateTime })] }))] })));
122
- }
123
- // falls through
124
- default:
125
- return (_jsx("ol", Object.assign({ className: "mig-schema-table-menu mig-schema-table__th-menu__filter-menu-component" }, { children: _jsx("li", { children: _jsx("input", { autoFocus: true, type: "text", className: "form-control", placeholder: `Search ${propName}`, "aria-label": `Search ${propName}`, value: (value || ""), "data-prop-name": propName, onChange: (e) => {
126
- onChange(e.currentTarget.value || undefined, false);
127
- }, onKeyDown: onInputKeyDown, onBlur: (e) => {
128
- onChange(e.currentTarget.value || undefined, true);
129
- } }) }) })));
130
- }
131
- };
132
- export default React.memo(FilterMenuComponent);
@@ -1,25 +0,0 @@
1
- import React, { Dispatch, SetStateAction } from "react";
2
- import { oas31 } from "openapi3-ts";
3
- import { TColumnFilterValue } from "../index";
4
- import { IColumnConfig } from "../../types";
5
- export interface IThMenuConfig {
6
- referenceElement: HTMLElement;
7
- propName: string;
8
- propConfig?: IColumnConfig<any>;
9
- propIsRequired: boolean;
10
- }
11
- type TThMenuProps = IThMenuConfig & {
12
- isSortable: boolean;
13
- isFilterable: boolean;
14
- onChange: (newValue: TColumnFilterValue | undefined, persistState?: boolean) => void;
15
- onClose: (e: MouseEvent | React.MouseEvent) => void;
16
- onInputKeyDown: (e: React.KeyboardEvent<HTMLElement>) => void;
17
- propIsRequired: boolean;
18
- propSchema: oas31.SchemaObject;
19
- setSortAsc: Dispatch<SetStateAction<boolean>>;
20
- setSortColumn: Dispatch<SetStateAction<string>>;
21
- translate: (key: string, ...args: Array<string | number>) => string;
22
- value: TColumnFilterValue;
23
- };
24
- declare const _default: React.MemoExoticComponent<({ isSortable, isFilterable, onChange, onClose, onInputKeyDown, propConfig, propIsRequired, propName, propSchema, referenceElement, setSortAsc, setSortColumn, translate, value, }: TThMenuProps) => import("react/jsx-runtime").JSX.Element | null>;
25
- export default _default;
@@ -1,56 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import React from "react";
3
- import FilterMenuComponent from "./FilterMenuComponent";
4
- import { usePopper } from "react-popper";
5
- const ThMenu = ({ isSortable, isFilterable, onChange, onClose, onInputKeyDown, propConfig, propIsRequired, propName, propSchema, referenceElement, setSortAsc, setSortColumn, translate, value, }) => {
6
- const [menu, setMenu] = React.useState(null);
7
- const [subMenu, setSubMenu] = React.useState(null);
8
- const [subMenuReferenceElement, setSubMenuReferenceElement] = React.useState(null);
9
- const menuPopper = usePopper(referenceElement, menu, {
10
- placement: "bottom-end",
11
- });
12
- const subMenuPopper = usePopper(subMenuReferenceElement, subMenu, {
13
- placement: "right-start",
14
- });
15
- React.useEffect(() => {
16
- const onWindowClick = (e) => {
17
- if (!menu) {
18
- return;
19
- }
20
- let parent = e.target;
21
- while (parent && menu) {
22
- if (parent === menu || parent === subMenu) {
23
- return;
24
- }
25
- parent =
26
- parent.parentNode === window.document ? null : parent.parentNode;
27
- }
28
- onClose(e);
29
- };
30
- window.addEventListener("click", onWindowClick, { capture: true });
31
- return () => {
32
- window.removeEventListener("click", onWindowClick, { capture: true });
33
- };
34
- }, [onClose, menu, subMenu]);
35
- const FilterMenu = (propConfig === null || propConfig === void 0 ? void 0 : propConfig.FilterMenu) || FilterMenuComponent;
36
- const onSortAscendingClick = React.useCallback((e) => {
37
- setSortColumn(propName);
38
- setSortAsc(true);
39
- onClose(e);
40
- }, [onClose, propName, setSortAsc, setSortColumn]);
41
- const onSortDescendingClick = React.useCallback((e) => {
42
- setSortColumn(propName);
43
- setSortAsc(false);
44
- onClose(e);
45
- }, [onClose, propName, setSortAsc, setSortColumn]);
46
- const onFilterCheckboxChange = React.useCallback(() => {
47
- onChange(undefined, true);
48
- }, [onChange]);
49
- if (!isSortable && !isFilterable) {
50
- return null;
51
- }
52
- return (_jsxs(_Fragment, { children: [_jsx("div", Object.assign({ className: "mig-schema-table__th-menu", ref: setMenu, style: menuPopper.styles.popper }, menuPopper.attributes.popper, { children: _jsxs("ol", Object.assign({ className: "mig-schema-table-menu" }, { children: [isSortable ? (_jsxs("li", Object.assign({ onClick: onSortAscendingClick, style: { padding: 8 } }, { children: [_jsx("span", Object.assign({ className: "mig-schema-table__th-menu__icon" }, { children: "\u2193" })), " Sort ascending"] }))) : null, isSortable ? (_jsxs("li", Object.assign({ onClick: onSortDescendingClick, style: { padding: 8 } }, { children: [_jsx("span", Object.assign({ className: "mig-schema-table__th-menu__icon" }, { children: "\u2191" })), " Sort descending"] }))) : null, isFilterable ? (_jsxs("li", Object.assign({ style: { padding: 8 }, onMouseOver: (e) => {
53
- setSubMenuReferenceElement(e.currentTarget);
54
- } }, { children: [_jsx("span", Object.assign({ className: "mig-schema-table__th-menu__icon" }, { children: _jsx("input", { type: "checkbox", id: "mig-schema-table__th-menu__filters", checked: value !== undefined, disabled: value === undefined, onChange: onFilterCheckboxChange }) })), _jsx("label", Object.assign({ htmlFor: "mig-schema-table__th-menu__filters" }, { children: "Filters" })), _jsx("div", { className: "mig-schema-table__th-menu__sub-menu-indicator" })] }))) : null] })) })), subMenuReferenceElement ? (_jsx("div", Object.assign({ className: "mig-schema-table__th-menu__sub-menu", ref: setSubMenu, style: subMenuPopper.styles.popper }, subMenuPopper.attributes.popper, { children: _jsx(FilterMenu, { columnFilterValue: value, onChange: onChange, onInputKeyDown: onInputKeyDown, propIsRequired: propIsRequired, propName: propName, propSchema: propSchema, translate: translate }) }))) : null] }));
55
- };
56
- export default React.memo(ThMenu);
@@ -1,2 +0,0 @@
1
- export declare const SELECT_ALL_COLUMN_NAME = "SELECT_ALL_COLUMN_NAME";
2
- export declare const SELECT_ALL_COLUMN_WIDTH = 40;
@@ -1,2 +0,0 @@
1
- export const SELECT_ALL_COLUMN_NAME = "SELECT_ALL_COLUMN_NAME";
2
- export const SELECT_ALL_COLUMN_WIDTH = 40;
@@ -1,67 +0,0 @@
1
- import React from "react";
2
- import { oas31 } from "openapi3-ts";
3
- import { VariableSizeGrid } from "react-window";
4
- import { IColumnConfig, IRenderData } from "../types";
5
- import { ENumberColumnFilterOperation } from "../inc/constant";
6
- export interface IGetDataProps {
7
- searchQuery: string;
8
- columnFilterMap: {
9
- [propName: string]: TColumnFilterValue;
10
- };
11
- sortColumn?: string;
12
- sortAsc: boolean;
13
- }
14
- interface IColumnFilterMap {
15
- [propName: string]: TColumnFilterValue;
16
- }
17
- export interface ISchemaTableProps<T> {
18
- Heading?: any;
19
- checkedIndexes?: number[];
20
- config?: {
21
- [propName: string]: IColumnConfig<T>;
22
- };
23
- customElement?: React.ReactNode;
24
- data: T[] | ((getDataProps: IGetDataProps) => Promise<T[]>);
25
- defaultColumnFilters?: IColumnFilterMap;
26
- defaultSortAsc?: boolean;
27
- defaultSortColumn?: keyof T;
28
- disabledCheckedIndexes?: number[];
29
- enableAutoFocus?: boolean;
30
- enableRowCounter?: boolean;
31
- getRowClassName?: (rowData: T, dataIndex: number, filteredSortedData: IRenderData[]) => string;
32
- getRowSelected?: (rowData: T, dataIndex: number) => boolean;
33
- isColumnFilterable?: boolean;
34
- isExportable?: boolean;
35
- isResizable?: boolean;
36
- isSearchable?: boolean;
37
- isSortable?: boolean;
38
- maxHeight?: number;
39
- onCheckedIndexesChange?: (dataIndex: number[]) => void;
40
- onRowClick?: (rowData: T, dataIndex: number, event: React.MouseEvent) => void;
41
- onRowDoubleClick?: (rowData: T, dataIndex: number, event: React.MouseEvent) => void;
42
- onSearchEnter?: (searchQuery: string) => void;
43
- rowHeight?: number;
44
- schema: oas31.SchemaObject;
45
- searchPlaceholder?: string;
46
- settingsStorageKey?: string;
47
- style?: React.CSSProperties;
48
- translate?: (key: string, ...args: Array<string | number>) => string;
49
- useFilterStateHash?: boolean;
50
- width: number;
51
- tableRef?: React.RefObject<VariableSizeGrid>;
52
- }
53
- export interface IDateColumnFilterValue {
54
- from?: Date;
55
- to?: Date;
56
- filterEmpty?: true;
57
- }
58
- export interface INumberColumnFilterValue {
59
- [ENumberColumnFilterOperation.GT]: number;
60
- [ENumberColumnFilterOperation.LT]: number;
61
- [ENumberColumnFilterOperation.EQ]: number;
62
- filterEmpty?: true;
63
- }
64
- export type TColumnFilterValue = string | boolean | number | IDateColumnFilterValue | INumberColumnFilterValue;
65
- declare function SchemaTable<T>({ Heading, checkedIndexes, config, customElement, data, defaultColumnFilters, defaultSortAsc, defaultSortColumn, disabledCheckedIndexes, enableAutoFocus, enableRowCounter, getRowClassName, getRowSelected, isColumnFilterable, isExportable, isResizable, isSearchable, isSortable, maxHeight, onCheckedIndexesChange, onRowClick, onRowDoubleClick, onSearchEnter, rowHeight, schema, searchPlaceholder, settingsStorageKey, style, translate, useFilterStateHash, width, tableRef, }: ISchemaTableProps<T>): import("react/jsx-runtime").JSX.Element;
66
- declare const _default: typeof SchemaTable;
67
- export default _default;