mig-schema-table 3.0.41 → 3.0.43

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.
@@ -3,11 +3,12 @@ import { oas31 } from "openapi3-ts";
3
3
  import { TColumnFilterValue } from "../../index";
4
4
  import { IColumnConfig } from "../../../types";
5
5
  export interface IFilterFormComponentProps {
6
- onChange: (newValue?: TColumnFilterValue) => void;
7
- propSchema: oas31.SchemaObject;
8
- propName: string;
9
6
  columnFilterValue: TColumnFilterValue;
7
+ onChange: (newValue?: TColumnFilterValue) => void;
8
+ onInputKeyDown: (e: React.KeyboardEvent) => void;
10
9
  propConfig?: IColumnConfig<any>;
10
+ propName: string;
11
+ propSchema: oas31.SchemaObject;
11
12
  }
12
- declare const _default: React.MemoExoticComponent<({ onChange, propSchema, propName, propConfig, columnFilterValue, }: IFilterFormComponentProps) => import("react/jsx-runtime").JSX.Element>;
13
+ declare const _default: React.MemoExoticComponent<({ columnFilterValue, onChange, onInputKeyDown, propConfig, propName, propSchema, }: IFilterFormComponentProps) => import("react/jsx-runtime").JSX.Element>;
13
14
  export default _default;
@@ -4,22 +4,22 @@ 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 = ({ onChange, propSchema, propName, propConfig, columnFilterValue, }) => {
7
+ const FilterFormComponent = ({ columnFilterValue, onChange, onInputKeyDown, propConfig, propName, propSchema, }) => {
8
8
  const { type, format, minimum, maximum } = propSchema;
9
9
  const value = columnFilterValue;
10
10
  switch (type) {
11
11
  case "integer":
12
- return (_jsx("div", Object.assign({ className: "input-group" }, { children: _jsx("input", { className: "form-control", type: "number", value: (value || ""), "data-prop-name": propName, onChange: (e) => {
12
+ return (_jsx("div", Object.assign({ className: "input-group" }, { children: _jsx("input", { autoFocus: true, className: "form-control", type: "number", value: (value || ""), "data-prop-name": propName, onChange: (e) => {
13
13
  onChange(e.currentTarget.value === ""
14
14
  ? undefined
15
15
  : parseInt(e.currentTarget.value));
16
- }, placeholder: `Search ${propName}`, min: minimum, max: maximum }) })));
16
+ }, onKeyDown: onInputKeyDown, placeholder: `Search ${propName}`, min: minimum, max: maximum }) })));
17
17
  case "boolean":
18
18
  let selectValue = value ? "✓" : "✕";
19
19
  if (value === undefined) {
20
20
  selectValue = "";
21
21
  }
22
- return (_jsxs("select", Object.assign({ className: "form-select", value: selectValue, "data-prop-name": propName, onChange: (e) => {
22
+ return (_jsxs("select", Object.assign({ autoFocus: true, className: "form-select", value: selectValue, "data-prop-name": propName, onChange: (e) => {
23
23
  switch (e.currentTarget.value) {
24
24
  case "✓":
25
25
  onChange(true);
@@ -34,7 +34,7 @@ const FilterFormComponent = ({ onChange, propSchema, propName, propConfig, colum
34
34
  // @ts-ignore
35
35
  case "string":
36
36
  if (propSchema.enum) {
37
- return (_jsxs("select", Object.assign({ className: "form-select", value: value, "data-prop-name": propName, onChange: (e) => {
37
+ return (_jsxs("select", Object.assign({ autoFocus: true, className: "form-select", value: value, "data-prop-name": propName, onChange: (e) => {
38
38
  onChange(e.currentTarget.value || undefined);
39
39
  } }, { children: [_jsx("option", Object.assign({ value: "" }, { children: "All" }), "all"), propSchema.enum.map((name) => {
40
40
  const rowName = !(propConfig === null || propConfig === void 0 ? void 0 : propConfig.translation)
@@ -69,13 +69,13 @@ const FilterFormComponent = ({ onChange, propSchema, propName, propConfig, colum
69
69
  }
70
70
  onChange(Object.assign(Object.assign({}, columnFilterValue), { to: date || undefined }));
71
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, { 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" })] }))] })));
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" })] }))] })));
73
73
  }
74
74
  // falls through
75
75
  default:
76
- return (_jsx("div", Object.assign({ className: "input-group" }, { children: _jsx("input", { type: "text", className: "form-control", placeholder: `Search ${propName}`, "aria-label": `Search ${propName}`, autoFocus: true, value: (value || ""), "data-prop-name": propName, onChange: (e) => {
76
+ return (_jsx("div", Object.assign({ className: "input-group" }, { 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) => {
77
77
  onChange(e.currentTarget.value || undefined);
78
- } }) })));
78
+ }, onKeyDown: onInputKeyDown }) })));
79
79
  }
80
80
  };
81
81
  export default React.memo(FilterFormComponent);
@@ -9,9 +9,10 @@ export interface ISchemaColumnFilterPopoverConfig {
9
9
  }
10
10
  type TSchemaColumnFilterPopoverProps = ISchemaColumnFilterPopoverConfig & {
11
11
  onChange: (newValue?: TColumnFilterValue) => void;
12
+ onInputKeyDown: (e: React.KeyboardEvent) => void;
12
13
  propSchema: oas31.SchemaObject;
13
14
  value: TColumnFilterValue;
14
15
  onClose: () => void;
15
16
  };
16
- declare const _default: React.MemoExoticComponent<({ onChange, onClose, propName, propSchema, referenceElement, value, propConfig, }: TSchemaColumnFilterPopoverProps) => import("react/jsx-runtime").JSX.Element>;
17
+ declare const _default: React.MemoExoticComponent<({ onChange, onClose, onInputKeyDown, propName, propSchema, referenceElement, value, propConfig, }: TSchemaColumnFilterPopoverProps) => import("react/jsx-runtime").JSX.Element>;
17
18
  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, propName, propSchema, referenceElement, value, propConfig, }) => {
5
+ const SchemaColumnFilterPopover = ({ onChange, onClose, onInputKeyDown, 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, propName, propSchema, re
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, 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, { onChange: onChange, onInputKeyDown: onInputKeyDown, propSchema: propSchema, propName: propName, columnFilterValue: value, propConfig: propConfig }) }))] })));
37
37
  };
38
38
  export default React.memo(SchemaColumnFilterPopover);
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { oas31 } from "openapi3-ts";
3
3
  import { IColumnConfig } from "../types";
4
- interface IGetDataProps {
4
+ export interface IGetDataProps {
5
5
  searchQuery: string;
6
6
  columnFilterMap: {
7
7
  [propName: string]: TColumnFilterValue;
@@ -314,6 +314,18 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
314
314
  delete newColumnFilterMap[propName];
315
315
  setColumnFilterMap(newColumnFilterMap);
316
316
  }, [columnFilterMap]);
317
+ const onSetSortColumn = React.useCallback((x) => {
318
+ if (data instanceof Function) {
319
+ setIsDirty(true);
320
+ }
321
+ setSortColumn(x);
322
+ }, [data]);
323
+ const onSetSortAsc = React.useCallback((x) => {
324
+ if (data instanceof Function) {
325
+ setIsDirty(true);
326
+ }
327
+ setSortAsc(x);
328
+ }, [data]);
317
329
  const SchemaTableTh = React.useCallback(({ style, index }) => {
318
330
  const propName = columnNames[index];
319
331
  const propConfig = config ? config[propName] : undefined;
@@ -326,7 +338,7 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
326
338
  const schema = (propName === SELECT_ALL_COLUMN_NAME
327
339
  ? { type: "boolean" }
328
340
  : properties[propName]);
329
- 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: setSortAsc, setSortColumn: setSortColumn, sortAsc: sortColumn === propName ? sortAsc : undefined, style: style }));
341
+ 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 }));
330
342
  }, [
331
343
  checkedIndexes === null || checkedIndexes === void 0 ? void 0 : checkedIndexes.length,
332
344
  columnFilterMap,
@@ -337,6 +349,8 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
337
349
  isColumnFilterable,
338
350
  isSortable,
339
351
  onSelectAllIndexesHandler,
352
+ onSetSortAsc,
353
+ onSetSortColumn,
340
354
  properties,
341
355
  sortAsc,
342
356
  sortColumn,
@@ -371,9 +385,12 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
371
385
  setIsDirty(false);
372
386
  setSourceData(undefined);
373
387
  }, []);
374
- const onSearchKeyDown = React.useCallback((e) => {
375
- if (e.key === "Enter" && isDirty) {
376
- refreshData();
388
+ const onInputKeyDown = React.useCallback((e) => {
389
+ if (e.key === "Enter") {
390
+ setPopoverConfig(undefined);
391
+ if (isDirty) {
392
+ refreshData();
393
+ }
377
394
  }
378
395
  }, [isDirty, refreshData]);
379
396
  const getRowHeight = React.useCallback(() => rowHeight, [rowHeight]);
@@ -393,13 +410,16 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
393
410
  if (!popoverConfig) {
394
411
  return;
395
412
  }
413
+ if (data instanceof Function) {
414
+ setIsDirty(true);
415
+ }
396
416
  if (newColumnFilterValue === undefined) {
397
417
  disableColumnFilter(popoverConfig.propName);
398
418
  return;
399
419
  }
400
420
  setColumnFilterMap((columnFilterMap) => (Object.assign(Object.assign({}, columnFilterMap), { [popoverConfig.propName]: newColumnFilterValue })));
401
- }, [disableColumnFilter, popoverConfig]);
402
- return (_jsxs("div", Object.assign({ className: `schema-table${onRowClick ? " schema-table--clickable-rows" : ""}`, style: Object.assign(Object.assign({}, style), { width: rowWidth }), role: "table" }, { children: [_jsxs("div", Object.assign({ className: "schema-table__action-container" }, { children: [_jsx("div", Object.assign({ style: { flex: 1 } }, { children: isSearchable ? (_jsx("input", { type: "text", placeholder: searchPlaceholder || "Search...", value: searchQuery, onChange: onSearchChange, onKeyDown: onSearchKeyDown, autoFocus: true })) : null })), customElement] })), _jsx(Heading, Object.assign({ height: 50, itemCount: columnCount, itemSize: getColumnWidth, layout: "horizontal", width: rowWidth, sortAsc: sortAsc, setSortAsc: setSortAsc, setSortColumn: setSortColumn, sortColumn: sortColumn, sortedRenderData: sortedRenderData, className: "schema-table__th-row" }, { children: SchemaTableTh }), `thead_${rowWidth}_${sortColumn}_${sortAsc}_${searchQuery}`), sourceData && !isDirty ? (_jsx(VariableSizeGrid, Object.assign({ className: "schema-table__tbody", height: tableBodyHeight, width: rowWidth, columnWidth: getColumnWidth, rowHeight: getRowHeight, columnCount: columnCount, rowCount: rowCount }, { children: SchemaTableTd }), `tbody_${tableBodyHeight}_${rowWidth}_${sortColumn}_${sortAsc}_${searchQuery}_${columnCount}`)) : (_jsx("div", Object.assign({ style: {
421
+ }, [data, disableColumnFilter, popoverConfig]);
422
+ return (_jsxs("div", Object.assign({ className: `schema-table${onRowClick ? " schema-table--clickable-rows" : ""}`, style: Object.assign(Object.assign({}, style), { width: rowWidth }), role: "table" }, { children: [_jsxs("div", Object.assign({ className: "schema-table__action-container" }, { children: [_jsx("div", Object.assign({ style: { flex: 1 } }, { children: isSearchable ? (_jsx("input", { type: "text", placeholder: searchPlaceholder || "Search...", value: searchQuery, onChange: onSearchChange, onKeyDown: onInputKeyDown, autoFocus: true })) : null })), customElement] })), _jsx(Heading, Object.assign({ height: 50, itemCount: columnCount, itemSize: getColumnWidth, layout: "horizontal", width: rowWidth, sortAsc: sortAsc, setSortAsc: onSetSortAsc, setSortColumn: onSetSortColumn, sortColumn: sortColumn, sortedRenderData: sortedRenderData, className: "schema-table__th-row" }, { children: SchemaTableTh }), `thead_${rowWidth}_${sortColumn}_${sortAsc}_${searchQuery}`), sourceData && !isDirty ? (_jsx(VariableSizeGrid, Object.assign({ className: "schema-table__tbody", height: tableBodyHeight, width: rowWidth, columnWidth: getColumnWidth, rowHeight: getRowHeight, columnCount: columnCount, rowCount: rowCount }, { children: SchemaTableTd }), `tbody_${tableBodyHeight}_${rowWidth}_${sortColumn}_${sortAsc}_${searchQuery}_${columnCount}`)) : (_jsx("div", Object.assign({ style: {
403
423
  width: rowWidth,
404
424
  height: Math.max(50, tableBodyHeight),
405
425
  border: "1px solid #BBB",
@@ -408,6 +428,6 @@ function SchemaTable({ Heading = VariableSizeList, checkedIndexes, disabledCheck
408
428
  backgroundColor: "#CCC",
409
429
  alignItems: "center",
410
430
  justifyContent: "center",
411
- } }, { 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, propName: popoverConfig.propName, propSchema: schema.properties[popoverConfig.propName], value: columnFilterMap[popoverConfig.propName], propConfig: popoverConfig.propConfig })) : null] })));
431
+ } }, { 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] })));
412
432
  }
413
433
  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.41",
3
+ "version": "3.0.43",
4
4
  "main": "dist/index.js",
5
5
  "files": [
6
6
  "dist/"