@absreim/react-bootstrap-data-grid 1.2.1 → 1.3.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 (50) hide show
  1. package/{ColHeaderCell.jsx → ColHeaderCell.js} +5 -7
  2. package/Grid.d.ts +3 -1
  3. package/{Grid.jsx → Grid.js} +39 -51
  4. package/{ToggleButton.jsx → ToggleButton.js} +2 -3
  5. package/editing/EditControlsCell.d.ts +11 -0
  6. package/editing/EditControlsCell.js +6 -0
  7. package/editing/EditableRow.d.ts +13 -0
  8. package/editing/EditableRow.js +66 -0
  9. package/editing/inputStrsToRowDef.d.ts +3 -0
  10. package/editing/inputStrsToRowDef.js +18 -0
  11. package/{FilterOptionsTable/DateFilterRow.jsx → filtering/DateFilterRow.js} +2 -24
  12. package/{FilterOptionsTable/FilterOptionsTable.jsx → filtering/FilterOptionsTable.js} +5 -20
  13. package/{FilterOptionsTable/NumberFilterRow.jsx → filtering/NumberFilterRow.js} +2 -17
  14. package/{FilterOptionsTable/StringFilterRow.jsx → filtering/StringFilterRow.js} +2 -17
  15. package/hooks/{useControlledHover.jsx → useControlledHover.js} +3 -7
  16. package/hooks/useDisplayRows.d.ts +1 -1
  17. package/hooks/useDisplayRows.js +28 -21
  18. package/icons/arrowPlaceholder.d.ts +1 -1
  19. package/icons/arrowPlaceholder.js +7 -0
  20. package/icons/deselectAll.d.ts +1 -1
  21. package/icons/deselectAll.js +3 -0
  22. package/icons/downArrow.d.ts +1 -1
  23. package/icons/downArrow.js +3 -0
  24. package/icons/selectAll.d.ts +1 -1
  25. package/icons/selectAll.js +3 -0
  26. package/icons/upArrow.d.ts +1 -1
  27. package/icons/upArrow.js +13 -0
  28. package/package.json +1 -1
  29. package/pagination/{PageSelector.jsx → PageSelector.js} +23 -50
  30. package/pagination/PageSizeSelector.js +15 -0
  31. package/pagination/{Pagination.jsx → Pagination.js} +2 -4
  32. package/selection/{SelectAllHeaderCell.jsx → SelectAllHeaderCell.js} +4 -5
  33. package/selection/{SelectionInput.jsx → SelectionInput.js} +3 -2
  34. package/style.css +1 -0
  35. package/style.scss +41 -0
  36. package/types.d.ts +14 -1
  37. package/icons/arrowPlaceholder.jsx +0 -10
  38. package/icons/deselectAll.jsx +0 -5
  39. package/icons/downArrow.jsx +0 -9
  40. package/icons/selectAll.jsx +0 -6
  41. package/icons/upArrow.jsx +0 -21
  42. package/pagination/PageSizeSelector.jsx +0 -20
  43. /package/{FilterOptionsTable → filtering}/DateFilterRow.d.ts +0 -0
  44. /package/{FilterOptionsTable → filtering}/FilterOptionsTable.d.ts +0 -0
  45. /package/{FilterOptionsTable → filtering}/NumberFilterRow.d.ts +0 -0
  46. /package/{FilterOptionsTable → filtering}/StringFilterRow.d.ts +0 -0
  47. /package/{FilterOptionsTable → filtering}/types.d.ts +0 -0
  48. /package/{FilterOptionsTable → filtering}/types.js +0 -0
  49. /package/{FilterOptionsTable → filtering}/useFormStateFromTableFilterState.d.ts +0 -0
  50. /package/{FilterOptionsTable → filtering}/useFormStateFromTableFilterState.js +0 -0
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import downArrow from "./icons/downArrow";
3
4
  import upArrow from "./icons/upArrow";
4
5
  import arrowPlaceholder from "./icons/arrowPlaceholder";
@@ -44,14 +45,11 @@ var ColHeaderCell = function (_a) {
44
45
  }
45
46
  }
46
47
  };
47
- return (<th className={classNames({
48
- "cursor-pointer": sortModel,
48
+ return (_jsxs("th", { className: classNames({
49
+ "rbdg-clickable-grid-header-cell": sortModel,
49
50
  "table-active": sortModel === null || sortModel === void 0 ? void 0 : sortModel.sortOrder,
50
- })} onClick={sortModel && handleClick} onMouseOver={handleMouseOver} onMouseOut={handleMouseOut} aria-description={sortModel
51
+ }), onClick: sortModel && handleClick, onMouseOver: handleMouseOver, onMouseOut: handleMouseOut, "aria-description": sortModel
51
52
  ? "Column header"
52
- : "Column header that can be clicked to change the sorting mode"} aria-colindex={ariaColIndex}>
53
- {label}
54
- {getSortSymbol()}
55
- </th>);
53
+ : "Column header that can be clicked to change the sorting mode", "aria-colindex": ariaColIndex, children: [label, getSortSymbol()] }));
56
54
  };
57
55
  export default ColHeaderCell;
package/Grid.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { FC } from "react";
2
- import { ColDef, FilterModel, RowDef, SelectModel, Size, TableSortModel } from "./types";
2
+ import { ColDef, EditModel, FilterModel, RowDef, SelectModel, Size, TableSortModel } from "./types";
3
3
  export interface GridPaginationState {
4
4
  pageSizeOptions: number[];
5
5
  pageSizeIndex: number;
@@ -16,6 +16,8 @@ export interface GridProps {
16
16
  sortModel?: TableSortModel;
17
17
  filterModel?: FilterModel;
18
18
  selectModel?: SelectModel;
19
+ editModel?: EditModel;
20
+ caption?: string;
19
21
  }
20
22
  declare const Grid: FC<GridProps>;
21
23
  export default Grid;
@@ -1,9 +1,10 @@
1
1
  "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import { useMemo, useState } from "react";
3
4
  import ColHeaderCell from "./ColHeaderCell";
4
5
  import useFilter from "./hooks/useFilter";
5
6
  import ToggleButton from "./ToggleButton";
6
- import FilterOptionsTable from "./FilterOptionsTable/FilterOptionsTable";
7
+ import FilterOptionsTable from "./filtering/FilterOptionsTable";
7
8
  import useFilterStateFromEditable from "./hooks/useFilterStateFromEditable";
8
9
  import useAugmentedRows from "./hooks/useAugmentedRows";
9
10
  import useSortedRows from "./hooks/useSortedRows";
@@ -12,8 +13,10 @@ import SelectAllHeaderCell from "./selection/SelectAllHeaderCell";
12
13
  import SelectionInput from "./selection/SelectionInput";
13
14
  import Pagination from "./pagination/Pagination";
14
15
  import classNames from "classnames";
16
+ import EditableRow from "./editing/EditableRow";
17
+ import inputStrsToRowDef from "./editing/inputStrsToRowDef";
15
18
  var Grid = function (_a) {
16
- var rows = _a.rows, cols = _a.cols, pagination = _a.pagination, sortModel = _a.sortModel, filterModel = _a.filterModel, selectModel = _a.selectModel;
19
+ var rows = _a.rows, cols = _a.cols, pagination = _a.pagination, sortModel = _a.sortModel, filterModel = _a.filterModel, selectModel = _a.selectModel, editModel = _a.editModel, caption = _a.caption;
17
20
  var editableFilterState = (filterModel === null || filterModel === void 0 ? void 0 : filterModel.tableFilterState) || null;
18
21
  var filterState = useFilterStateFromEditable(cols, editableFilterState);
19
22
  var augmentedRows = useAugmentedRows(rows);
@@ -29,7 +32,9 @@ var Grid = function (_a) {
29
32
  var upperIndex = lowerIndex + pageSize;
30
33
  return sortedRows.slice(lowerIndex, upperIndex);
31
34
  }, [sortedRows, pagination]);
32
- var displayRows = useDisplayRows(currentPageRows, cols);
35
+ var showSelectCol = selectModel && selectModel.mode !== "row";
36
+ var ariaColIndexOffset = showSelectCol ? 1 : 0;
37
+ var displayRows = useDisplayRows(currentPageRows, cols, ariaColIndexOffset);
33
38
  var _b = useState(false), filterOptionsVisible = _b[0], setFilterOptionsVisible = _b[1];
34
39
  var handleToggleFilterOptions = function () {
35
40
  setFilterOptionsVisible(!filterOptionsVisible);
@@ -93,7 +98,6 @@ var Grid = function (_a) {
93
98
  deselectCallback: getDeselectHandler(index),
94
99
  };
95
100
  };
96
- var showSelectCol = selectModel && selectModel.mode !== "row";
97
101
  var selectedSet = new Set();
98
102
  if (selectModel && selectModel.type === "multi") {
99
103
  selectModel.selected.forEach(function (value) { return selectedSet.add(value); });
@@ -105,7 +109,6 @@ var Grid = function (_a) {
105
109
  }
106
110
  var rowsAreSelectable = !!(selectModel && selectModel.mode !== "column");
107
111
  var getRowClickHandler = function (index) { return function (event) {
108
- event.preventDefault();
109
112
  if (!rowsAreSelectable) {
110
113
  return;
111
114
  }
@@ -121,51 +124,36 @@ var Grid = function (_a) {
121
124
  }
122
125
  return String(selectedSet.has(index));
123
126
  };
124
- // Once this component implements selection state, and if such interactivity is enabled, (conditionally) change the
125
- // aria role to "grid".
126
- // TODO: implement the above described features: conditionally changing aria role to grid
127
- return (<div>
128
- {filterState && filterModel && (<div>
129
- <ToggleButton isActive={filterOptionsVisible} label={"".concat(filterOptionsVisible ? "Hide" : "Show ", " Filter Options")} onClick={handleToggleFilterOptions}/>
130
- {filterOptionsVisible && (<FilterOptionsTable filterState={filterState} setFilterState={filterModel.setTableFilterState}/>)}
131
- </div>)}
132
- <table className={classNames("table", {
133
- "table-hover": rowsAreSelectable,
134
- })} aria-rowcount={filteredRows.length + 1}>
135
- <thead>
136
- <tr aria-rowindex={1}>
137
- {showSelectCol && (<SelectAllHeaderCell selectType={selectModel.type} onClick={selectAllOnClick} selectionExists={selectionExists}/>)}
138
- {cols.map(function (_a, index) {
139
- var _b;
140
- var name = _a.name, label = _a.label, sortable = _a.sortable;
141
- var colSortModel = sortModel && sortable
142
- ? {
143
- sortOrder: ((_b = sortModel.sortColDef) === null || _b === void 0 ? void 0 : _b.name) === name
144
- ? sortModel.sortColDef.order
145
- : null,
146
- setSortOrder: function (order) {
147
- sortModel.setSortColDef(order && { name: name, order: order });
148
- },
149
- }
150
- : undefined;
151
- return (<ColHeaderCell key={name} label={label} sortModel={colSortModel} ariaColIndex={index + 1 + (showSelectCol ? 1 : 0)}/>);
152
- })}
153
- </tr>
154
- </thead>
155
- <tbody>
156
- {displayRows.map(function (row, index) { return (<tr onClick={getRowClickHandler(row.origIndex)} className={classNames({
157
- "table-active": selectedSet.has(row.origIndex),
158
- })} key={row.origIndex} aria-rowindex={index + 2} data-rowindex={row.origIndex} aria-selected={getAriaSelectedValue(row.origIndex)}>
159
- {showSelectCol && (<td>
160
- <SelectionInput selected={selectedSet.has(row.origIndex)} selectionInputModel={getSelectInputModel(row.origIndex, selectModel)} selectCallback={getSelectHandler(row.origIndex)}/>
161
- </td>)}
162
- {row.contents.map(function (value, index) { return (<td key={index} aria-colindex={index + 1 + (showSelectCol ? 1 : 0)}>
163
- {value}
164
- </td>); })}
165
- </tr>); })}
166
- </tbody>
167
- </table>
168
- {pagination && (<Pagination componentSize={pagination.componentSize || "medium"} pageSizeOptions={pagination.pageSizeOptions} pageSizeIndex={pagination.pageSizeIndex} handleSetPageSizeIndex={pagination.setPageSizeIndex} handleSetPageNum={pagination.setCurrentPage} prePagingNumRows={sortedRows.length} maxPageButtons={pagination.maxPageButtons} currentPage={pagination.currentPage}/>)}
169
- </div>);
127
+ var getInputStrSubmitCallback = editModel &&
128
+ (function (origIndex) {
129
+ var indexSpecificCallback = editModel.getUpdateCallback(origIndex);
130
+ return function (inputStrs) {
131
+ var rowDef = inputStrsToRowDef(cols, inputStrs);
132
+ indexSpecificCallback(rowDef);
133
+ };
134
+ });
135
+ return (_jsxs("div", { children: [filterState && filterModel && (_jsxs("div", { children: [_jsx(ToggleButton, { isActive: filterOptionsVisible, label: "".concat(filterOptionsVisible ? "Hide" : "Show ", " Filter Options"), onClick: handleToggleFilterOptions }), filterOptionsVisible && (_jsx(FilterOptionsTable, { filterState: filterState, setFilterState: filterModel.setTableFilterState }))] })), _jsxs("table", { className: classNames("table", {
136
+ "table-hover": rowsAreSelectable,
137
+ }), "aria-rowcount": filteredRows.length + 1, children: [caption !== undefined && _jsx("caption", { children: caption }), _jsx("thead", { children: _jsxs("tr", { "aria-rowindex": 1, children: [showSelectCol && (_jsx(SelectAllHeaderCell, { selectType: selectModel.type, onClick: selectAllOnClick, selectionExists: selectionExists })), cols.map(function (_a, index) {
138
+ var _b;
139
+ var name = _a.name, label = _a.label, sortable = _a.sortable;
140
+ var colSortModel = sortModel && sortable
141
+ ? {
142
+ sortOrder: ((_b = sortModel.sortColDef) === null || _b === void 0 ? void 0 : _b.name) === name
143
+ ? sortModel.sortColDef.order
144
+ : null,
145
+ setSortOrder: function (order) {
146
+ sortModel.setSortColDef(order && { name: name, order: order });
147
+ },
148
+ }
149
+ : undefined;
150
+ return (_jsx(ColHeaderCell, { label: label, sortModel: colSortModel, ariaColIndex: index + 1 + (showSelectCol ? 1 : 0) }, name));
151
+ }), editModel && (_jsx("th", { "aria-colindex": cols.length + 1 + (showSelectCol ? 1 : 0), children: "Edit Controls" }))] }) }), _jsx("tbody", { children: displayRows.map(function (row, index) {
152
+ return (_jsx(EditableRow, { onClick: getRowClickHandler(row.origIndex), className: classNames({
153
+ "table-active": selectedSet.has(row.origIndex),
154
+ }), "aria-rowindex": index + 2, dataRowIndex: row.origIndex, "aria-selected": getAriaSelectedValue(row.origIndex), ariaColIndexOffset: ariaColIndexOffset, cellData: row.contents, updateCallback: getInputStrSubmitCallback &&
155
+ getInputStrSubmitCallback(row.origIndex), deleteCallback: (editModel === null || editModel === void 0 ? void 0 : editModel.getDeleteCallback) &&
156
+ editModel.getDeleteCallback(row.origIndex), children: showSelectCol && (_jsx("td", { children: _jsx(SelectionInput, { selected: selectedSet.has(row.origIndex), selectionInputModel: getSelectInputModel(row.origIndex, selectModel), selectCallback: getSelectHandler(row.origIndex) }) })) }, row.origIndex));
157
+ }) })] }), pagination && (_jsx(Pagination, { componentSize: pagination.componentSize || "medium", pageSizeOptions: pagination.pageSizeOptions, pageSizeIndex: pagination.pageSizeIndex, handleSetPageSizeIndex: pagination.setPageSizeIndex, handleSetPageNum: pagination.setCurrentPage, prePagingNumRows: sortedRows.length, maxPageButtons: pagination.maxPageButtons, currentPage: pagination.currentPage }))] }));
170
158
  };
171
159
  export default Grid;
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
2
3
  import classNames from "classnames";
3
4
  var ToggleButton = function (_a) {
4
5
  var isActive = _a.isActive, label = _a.label, onClick = _a.onClick;
@@ -6,8 +7,6 @@ var ToggleButton = function (_a) {
6
7
  var variableClasses = {
7
8
  active: isActive,
8
9
  };
9
- return (<button type="button" className={classNames(baseClasses, variableClasses)} aria-pressed={isActive} onClick={onClick}>
10
- {label}
11
- </button>);
10
+ return (_jsx("button", { type: "button", className: classNames(baseClasses, variableClasses), "aria-pressed": isActive, onClick: onClick, children: label }));
12
11
  };
13
12
  export default ToggleButton;
@@ -0,0 +1,11 @@
1
+ import { FC } from "react";
2
+ export interface EditControlsCellProps {
3
+ ariaColIndex: number;
4
+ beginEditingCallback: () => void;
5
+ cancelEditingCallback: () => void;
6
+ isEditing: boolean;
7
+ saveCallback: () => void;
8
+ deleteCallback?: () => void;
9
+ }
10
+ declare const EditControlsCell: FC<EditControlsCellProps>;
11
+ export default EditControlsCell;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ var EditControlsCell = function (_a) {
3
+ var ariaColIndex = _a.ariaColIndex, beginEditingCallback = _a.beginEditingCallback, cancelEditingCallback = _a.cancelEditingCallback, isEditing = _a.isEditing, saveCallback = _a.saveCallback, deleteCallback = _a.deleteCallback;
4
+ return (_jsx("td", { "aria-colindex": ariaColIndex, children: _jsx("div", { className: "hstack gap-2", children: isEditing ? (_jsxs(_Fragment, { children: [_jsx("button", { className: "btn btn-secondary", onClick: cancelEditingCallback, children: "Cancel" }), _jsx("button", { className: "btn btn-primary", onClick: saveCallback, children: "Save" })] })) : (_jsxs(_Fragment, { children: [deleteCallback && (_jsx("button", { className: "btn btn-secondary", onClick: deleteCallback, children: "Delete" })), _jsx("button", { className: "btn btn-primary", onClick: beginEditingCallback, children: "Edit" })] })) }) }));
5
+ };
6
+ export default EditControlsCell;
@@ -0,0 +1,13 @@
1
+ import { FC, ReactNode } from "react";
2
+ import { CellData } from "../types";
3
+ import React from "react";
4
+ export type EditableRowProps = Pick<React.ComponentProps<"tr">, "onClick" | "className" | "aria-rowindex" | "aria-selected"> & {
5
+ ariaColIndexOffset: number;
6
+ dataRowIndex: number;
7
+ children: ReactNode;
8
+ cellData: CellData[];
9
+ updateCallback?: (values: string[]) => void;
10
+ deleteCallback?: () => void;
11
+ };
12
+ declare const EditableRow: FC<EditableRowProps>;
13
+ export default EditableRow;
@@ -0,0 +1,66 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useRef, useState } from "react";
4
+ import { dateToDatetimeInputStr, dateToInputStr } from "../util/datetime";
5
+ import EditControlsCell from "./EditControlsCell";
6
+ var initValueToFormValue = function (value, type) {
7
+ switch (type) {
8
+ case "date":
9
+ return dateToInputStr(value);
10
+ case "datetime":
11
+ return dateToDatetimeInputStr(value);
12
+ case "number":
13
+ return String(value);
14
+ default:
15
+ return value;
16
+ }
17
+ };
18
+ var colDataTypeToInputType = function (colDataType) {
19
+ switch (colDataType) {
20
+ case "date":
21
+ return "date";
22
+ case "datetime":
23
+ return "datetime-local";
24
+ case "number":
25
+ return "number";
26
+ default:
27
+ return "text";
28
+ }
29
+ };
30
+ var EditableRow = function (_a) {
31
+ var ariaColIndexOffset = _a.ariaColIndexOffset, cellData = _a.cellData, children = _a.children, updateCallback = _a.updateCallback, deleteCallback = _a.deleteCallback, onClick = _a.onClick, className = _a.className, ariaRowIndex = _a["aria-rowindex"], ariaSelected = _a["aria-selected"], dataRowIndex = _a.dataRowIndex;
32
+ var trRef = useRef(null);
33
+ var _b = useState(false), isEditing = _b[0], setIsEditing = _b[1];
34
+ var handleSave = function () {
35
+ var failedValidationFound = false;
36
+ var formValues = [];
37
+ for (var _i = 0, _a = Array.from(trRef.current.children); _i < _a.length; _i++) {
38
+ var rowChild = _a[_i];
39
+ if (!(rowChild instanceof HTMLTableCellElement)) {
40
+ console.warn("Found non-td element inside EditableRow");
41
+ continue;
42
+ }
43
+ for (var _b = 0, _c = Array.from(rowChild.children); _b < _c.length; _b++) {
44
+ var cellChild = _c[_b];
45
+ if (!(cellChild instanceof HTMLInputElement) ||
46
+ cellChild.type === "checkbox" ||
47
+ cellChild.type === "radio") {
48
+ continue;
49
+ }
50
+ formValues.push(cellChild.value);
51
+ failedValidationFound =
52
+ !cellChild.reportValidity() || failedValidationFound;
53
+ break; // Each cell should only have one input element
54
+ }
55
+ }
56
+ if (!failedValidationFound) {
57
+ updateCallback(formValues);
58
+ setIsEditing(false);
59
+ }
60
+ };
61
+ return (_jsxs("tr", { ref: trRef, onClick: onClick, className: className, "aria-rowindex": ariaRowIndex, "aria-selected": ariaSelected, "data-rowindex": dataRowIndex, children: [children, cellData.map(function (_a, index) {
62
+ var type = _a.type, value = _a.value, formattedValue = _a.formattedValue, label = _a.label;
63
+ return (_jsx("td", { "aria-colindex": index + ariaColIndexOffset + 1, children: isEditing && !!updateCallback ? (_jsx("input", { "aria-label": label, name: "editable-cell-input-".concat(dataRowIndex, "-").concat(index), className: "form-control", type: colDataTypeToInputType(type), defaultValue: initValueToFormValue(value, type), required: type !== "string" })) : (formattedValue) }, index));
64
+ }), updateCallback && (_jsx(EditControlsCell, { ariaColIndex: ariaColIndexOffset + cellData.length + 1, beginEditingCallback: function () { return setIsEditing(true); }, cancelEditingCallback: function () { return setIsEditing(false); }, isEditing: isEditing, saveCallback: handleSave, deleteCallback: deleteCallback }))] }));
65
+ };
66
+ export default EditableRow;
@@ -0,0 +1,3 @@
1
+ import { ColDef, RowDef } from "../types";
2
+ declare const inputStrsToRowDef: (cols: ColDef[], inputStrs: string[]) => RowDef;
3
+ export default inputStrsToRowDef;
@@ -0,0 +1,18 @@
1
+ var inputStrsToRowDef = function (cols, inputStrs) {
2
+ var newRow = {};
3
+ inputStrs.forEach(function (value, index) {
4
+ var col = cols[index];
5
+ switch (col.type) {
6
+ case "string":
7
+ newRow[col.name] = value;
8
+ return;
9
+ case "number":
10
+ newRow[col.name] = Number(value);
11
+ return;
12
+ default:
13
+ newRow[col.name] = new Date(value);
14
+ }
15
+ });
16
+ return newRow;
17
+ };
18
+ export default inputStrsToRowDef;
@@ -9,6 +9,7 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
12
13
  import { useMemo } from "react";
13
14
  import { dateFilterSchemeNames, dateFilterSchemes, } from "../types";
14
15
  import { nanoid } from "nanoid/non-secure";
@@ -39,29 +40,6 @@ var DateFilterRow = function (_a) {
39
40
  var opSelectLabel = "".concat(columnLabel, " Column Filter Operator Selection");
40
41
  var startDateInputLabel = "".concat(columnLabel, " Column Filter Start Date");
41
42
  var endDateInputLabel = "".concat(columnLabel, " Column Filter End Date");
42
- return (<tr>
43
- <td>
44
- <input name={checkboxLabel} aria-label={checkboxLabel} type="checkbox" checked={enabled} onChange={handleEnabledChange}/>
45
- </td>
46
- <td>{columnLabel}</td>
47
- <td>{filterState.type === "date" ? "Date" : "Datetime"}</td>
48
- <td>
49
- <select name={opSelectLabel} aria-label={opSelectLabel} disabled={!enabled} className="form-select" value={scheme} onChange={handleOpChange}>
50
- {dateFilterSchemes.map(function (scheme) { return (<option key={scheme} value={scheme}>
51
- {dateFilterSchemeNames[scheme]}
52
- </option>); })}
53
- </select>
54
- </td>
55
- <td>
56
- {scheme !== "endAt" && (<>
57
- {scheme === "between" && (<label htmlFor={startDateInputId}>Start Date</label>)}
58
- <input id={startDateInputId} className="form-control" type={inputType} required={enabled} disabled={!enabled} value={startDate} onChange={handleStartValueChange} aria-label={startDateInputLabel}/>
59
- </>)}
60
- {scheme !== "startFrom" && (<>
61
- {scheme === "between" && (<label htmlFor={endDateInputId}>End Date</label>)}
62
- <input id={endDateInputId} className="form-control" type={inputType} required={enabled} disabled={!enabled} value={endDate} onChange={handleEndValueChange} aria-label={endDateInputLabel}/>
63
- </>)}
64
- </td>
65
- </tr>);
43
+ return (_jsxs("tr", { children: [_jsx("td", { children: _jsx("input", { name: checkboxLabel, "aria-label": checkboxLabel, type: "checkbox", checked: enabled, onChange: handleEnabledChange }) }), _jsx("td", { children: columnLabel }), _jsx("td", { children: filterState.type === "date" ? "Date" : "Datetime" }), _jsx("td", { children: _jsx("select", { name: opSelectLabel, "aria-label": opSelectLabel, disabled: !enabled, className: "form-select", value: scheme, onChange: handleOpChange, children: dateFilterSchemes.map(function (scheme) { return (_jsx("option", { value: scheme, children: dateFilterSchemeNames[scheme] }, scheme)); }) }) }), _jsxs("td", { children: [scheme !== "endAt" && (_jsxs(_Fragment, { children: [scheme === "between" && (_jsx("label", { htmlFor: startDateInputId, children: "Start Date" })), _jsx("input", { id: startDateInputId, className: "form-control", type: inputType, required: enabled, disabled: !enabled, value: startDate, onChange: handleStartValueChange, "aria-label": startDateInputLabel })] })), scheme !== "startFrom" && (_jsxs(_Fragment, { children: [scheme === "between" && (_jsx("label", { htmlFor: endDateInputId, children: "End Date" })), _jsx("input", { id: endDateInputId, className: "form-control", type: inputType, required: enabled, disabled: !enabled, value: endDate, onChange: handleEndValueChange, "aria-label": endDateInputLabel })] }))] })] }));
66
44
  };
67
45
  export default DateFilterRow;
@@ -9,6 +9,7 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
13
  import { useState } from "react";
13
14
  import StringFilterRow from "./StringFilterRow";
14
15
  import NumberFilterRow from "./NumberFilterRow";
@@ -76,14 +77,14 @@ var FilterOptionsTable = function (_a) {
76
77
  var colFilterState = formState[colName];
77
78
  switch (colFilterState.type) {
78
79
  case "string": {
79
- return (<StringFilterRow key={colName} columnLabel={colLabel} filterState={colFilterState} setFilterState={getColStateSetter(colName)}/>);
80
+ return (_jsx(StringFilterRow, { columnLabel: colLabel, filterState: colFilterState, setFilterState: getColStateSetter(colName) }, colName));
80
81
  }
81
82
  case "number": {
82
- return (<NumberFilterRow key={colName} columnLabel={colLabel} filterState={colFilterState} setFilterState={getColStateSetter(colName)}/>);
83
+ return (_jsx(NumberFilterRow, { columnLabel: colLabel, filterState: colFilterState, setFilterState: getColStateSetter(colName) }, colName));
83
84
  }
84
85
  default: {
85
86
  // date or datetime
86
- return (<DateFilterRow key={colName} includeTime={colFilterState.type === "datetime"} columnLabel={colLabel} filterState={colFilterState} setFilterState={getColStateSetter(colName)}/>);
87
+ return (_jsx(DateFilterRow, { includeTime: colFilterState.type === "datetime", columnLabel: colLabel, filterState: colFilterState, setFilterState: getColStateSetter(colName) }, colName));
87
88
  }
88
89
  }
89
90
  });
@@ -93,22 +94,6 @@ var FilterOptionsTable = function (_a) {
93
94
  var editableTableFilterState = convertFilterFormStateToEditableState(formState);
94
95
  setFilterState(editableTableFilterState);
95
96
  };
96
- return (<form onSubmit={onSubmit}>
97
- <table className="table">
98
- <thead>
99
- <tr>
100
- <th>Enabled</th>
101
- <th>Column</th>
102
- <th>Type</th>
103
- <th>Operator</th>
104
- <th>Value</th>
105
- </tr>
106
- </thead>
107
- <tbody>{getRows()}</tbody>
108
- </table>
109
- <button className="btn btn-secondary" type="submit">
110
- Submit
111
- </button>
112
- </form>);
97
+ return (_jsxs("form", { onSubmit: onSubmit, children: [_jsxs("table", { className: "table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { children: "Enabled" }), _jsx("th", { children: "Column" }), _jsx("th", { children: "Type" }), _jsx("th", { children: "Operator" }), _jsx("th", { children: "Value" })] }) }), _jsx("tbody", { children: getRows() })] }), _jsx("button", { className: "btn btn-secondary", type: "submit", children: "Submit" })] }));
113
98
  };
114
99
  export default FilterOptionsTable;
@@ -9,6 +9,7 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
13
  import { numberFilterSchemeNames, numberFilterSchemes, } from "../types";
13
14
  var NumberFilterRow = function (_a) {
14
15
  var columnLabel = _a.columnLabel, filterState = _a.filterState, setFilterState = _a.setFilterState;
@@ -28,22 +29,6 @@ var NumberFilterRow = function (_a) {
28
29
  var checkboxLabel = "".concat(columnLabel, " Column Filter Toggle");
29
30
  var opSelectLabel = "".concat(columnLabel, " Column Filter Operator Selection");
30
31
  var valueInputLabel = "".concat(columnLabel, " Column Filter Value");
31
- return (<tr>
32
- <td>
33
- <input name={checkboxLabel} aria-label={checkboxLabel} type="checkbox" checked={enabled} onChange={handleEnabledChange}/>
34
- </td>
35
- <td>{columnLabel}</td>
36
- <td>Number</td>
37
- <td>
38
- <select name={opSelectLabel} aria-label={opSelectLabel} disabled={!enabled} className="form-select" value={scheme} onChange={handleOpChange}>
39
- {numberFilterSchemes.map(function (scheme) { return (<option key={scheme} value={scheme}>
40
- {numberFilterSchemeNames[scheme]}
41
- </option>); })}
42
- </select>
43
- </td>
44
- <td>
45
- <input name={valueInputLabel} aria-label={valueInputLabel} className="form-control" type="number" required={enabled} disabled={!enabled} value={inputValue} onChange={handleNumInputValueChange}/>
46
- </td>
47
- </tr>);
32
+ return (_jsxs("tr", { children: [_jsx("td", { children: _jsx("input", { name: checkboxLabel, "aria-label": checkboxLabel, type: "checkbox", checked: enabled, onChange: handleEnabledChange }) }), _jsx("td", { children: columnLabel }), _jsx("td", { children: "Number" }), _jsx("td", { children: _jsx("select", { name: opSelectLabel, "aria-label": opSelectLabel, disabled: !enabled, className: "form-select", value: scheme, onChange: handleOpChange, children: numberFilterSchemes.map(function (scheme) { return (_jsx("option", { value: scheme, children: numberFilterSchemeNames[scheme] }, scheme)); }) }) }), _jsx("td", { children: _jsx("input", { name: valueInputLabel, "aria-label": valueInputLabel, className: "form-control", type: "number", required: enabled, disabled: !enabled, value: inputValue, onChange: handleNumInputValueChange }) })] }));
48
33
  };
49
34
  export default NumberFilterRow;
@@ -9,6 +9,7 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
13
  import { stringFilterSchemeNames, stringFilterSchemes, } from "../types";
13
14
  var StringFilterRow = function (_a) {
14
15
  var columnLabel = _a.columnLabel, filterState = _a.filterState, setFilterState = _a.setFilterState;
@@ -28,22 +29,6 @@ var StringFilterRow = function (_a) {
28
29
  var checkboxLabel = "".concat(columnLabel, " Column Filter Toggle");
29
30
  var opSelectLabel = "".concat(columnLabel, " Column Filter Operator Selection");
30
31
  var valueInputLabel = "".concat(columnLabel, " Column Filter Value");
31
- return (<tr>
32
- <td>
33
- <input name={checkboxLabel} aria-label={checkboxLabel} type="checkbox" checked={enabled} onChange={handleEnabledChange}/>
34
- </td>
35
- <td>{columnLabel}</td>
36
- <td>String</td>
37
- <td>
38
- <select name={opSelectLabel} aria-label={opSelectLabel} disabled={!enabled} className="form-select" value={scheme} onChange={handleOpChange}>
39
- {stringFilterSchemes.map(function (scheme) { return (<option key={scheme} value={scheme}>
40
- {stringFilterSchemeNames[scheme]}
41
- </option>); })}
42
- </select>
43
- </td>
44
- <td>
45
- <input name={valueInputLabel} aria-label={valueInputLabel} className="form-control" required={enabled} disabled={!enabled} value={searchString} onChange={handleSearchStringChange}/>
46
- </td>
47
- </tr>);
32
+ return (_jsxs("tr", { children: [_jsx("td", { children: _jsx("input", { name: checkboxLabel, "aria-label": checkboxLabel, type: "checkbox", checked: enabled, onChange: handleEnabledChange }) }), _jsx("td", { children: columnLabel }), _jsx("td", { children: "String" }), _jsx("td", { children: _jsx("select", { name: opSelectLabel, "aria-label": opSelectLabel, disabled: !enabled, className: "form-select", value: scheme, onChange: handleOpChange, children: stringFilterSchemes.map(function (scheme) { return (_jsx("option", { value: scheme, children: stringFilterSchemeNames[scheme] }, scheme)); }) }) }), _jsx("td", { children: _jsx("input", { name: valueInputLabel, "aria-label": valueInputLabel, className: "form-control", required: enabled, disabled: !enabled, value: searchString, onChange: handleSearchStringChange }) })] }));
48
33
  };
49
34
  export default StringFilterRow;
@@ -1,17 +1,13 @@
1
1
  import { useState } from "react";
2
2
  var useControlledHover = function () {
3
3
  var _a = useState(false), isHovering = _a[0], setIsHovering = _a[1];
4
- var handleMouseOver = function () {
5
- return setIsHovering(true);
6
- };
7
- var handleMouseOut = function () {
8
- return setIsHovering(false);
9
- };
4
+ var handleMouseOver = function () { return setIsHovering(true); };
5
+ var handleMouseOut = function () { return setIsHovering(false); };
10
6
  return {
11
7
  isHovering: isHovering,
12
8
  setIsHovering: setIsHovering,
13
9
  handleMouseOver: handleMouseOver,
14
- handleMouseOut: handleMouseOut
10
+ handleMouseOut: handleMouseOut,
15
11
  };
16
12
  };
17
13
  export default useControlledHover;
@@ -1,3 +1,3 @@
1
1
  import { AugRowDef, FormattedRow, ColDef } from "../types";
2
- declare const useDisplayRows: (currentPageRows: AugRowDef[], cols: ColDef[]) => FormattedRow[];
2
+ declare const useDisplayRows: (currentPageRows: AugRowDef[], cols: ColDef[], ariaColIndexOffset: number) => FormattedRow[];
3
3
  export default useDisplayRows;
@@ -1,5 +1,20 @@
1
1
  import { useMemo } from "react";
2
- var useDisplayRows = function (currentPageRows, cols) {
2
+ var getFormattedValue = function (value, formatter, typeString) {
3
+ if (formatter) {
4
+ return formatter(value);
5
+ }
6
+ if (typeString === "date") {
7
+ return value.toDateString();
8
+ }
9
+ if (typeString === "datetime") {
10
+ return value.toLocaleString();
11
+ }
12
+ if (typeString === "number") {
13
+ return value.toLocaleString();
14
+ }
15
+ return value;
16
+ };
17
+ var useDisplayRows = function (currentPageRows, cols, ariaColIndexOffset) {
3
18
  return useMemo(function () {
4
19
  var nameToIndex = new Map();
5
20
  cols.forEach(function (_a, index) {
@@ -24,29 +39,21 @@ var useDisplayRows = function (currentPageRows, cols) {
24
39
  return;
25
40
  }
26
41
  var index = nameToIndex.get(name);
27
- var formatter = cols[index].formatter;
28
- var typeString = cols[index].type;
42
+ var col = cols[index];
43
+ var formatter = col.formatter;
44
+ var typeString = col.type;
29
45
  var value = row.data[name];
30
- if (formatter) {
31
- displayRow[index] = formatter(value);
32
- return;
33
- }
34
- if (typeString === "date") {
35
- displayRow[index] = value.toDateString();
36
- return;
37
- }
38
- if (typeString === "datetime") {
39
- displayRow[index] = value.toLocaleString();
40
- return;
41
- }
42
- if (typeString === "number") {
43
- displayRow[index] = value.toLocaleString();
44
- return;
45
- }
46
- displayRow[index] = value;
46
+ displayRow[index] = {
47
+ fieldName: cols[index].name,
48
+ value: value,
49
+ type: typeString,
50
+ ariaColIndex: index + 1 + ariaColIndexOffset,
51
+ formattedValue: getFormattedValue(value, formatter, typeString),
52
+ label: cols[index].label,
53
+ };
47
54
  });
48
55
  return { contents: displayRow, origIndex: row.meta.origIndex };
49
56
  });
50
- }, [currentPageRows, cols]);
57
+ }, [currentPageRows, cols, ariaColIndexOffset]);
51
58
  };
52
59
  export default useDisplayRows;
@@ -1,2 +1,2 @@
1
- declare const arrowPlaceholder: import("react").JSX.Element;
1
+ declare const arrowPlaceholder: import("react/jsx-runtime").JSX.Element;
2
2
  export default arrowPlaceholder;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // Temporary solution to prevent column widths from changing when hovering over
3
+ // columns with a mouse.
4
+ // More ideal permanent solution would be to fix column widths based on preset
5
+ // values.
6
+ var arrowPlaceholder = (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", fill: "currentColor", viewBox: "0 0 16 16", children: _jsx("desc", { children: "Empty transparent square for styling purposes" }) }));
7
+ export default arrowPlaceholder;
@@ -1,2 +1,2 @@
1
- declare const deselectAll: import("react").JSX.Element;
1
+ declare const deselectAll: import("react/jsx-runtime").JSX.Element;
2
2
  export default deselectAll;
@@ -0,0 +1,3 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ var deselectAll = (_jsxs("svg", { className: "rdbg-svg-icon", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", width: "16", height: "16", fill: "currentColor", children: [_jsx("desc", { children: "Minus sign inside a square" }), _jsx("rect", { className: "rdbg-svg-icon-foreground", x: "3.5", y: "7.5", width: "9", height: "1" })] }));
3
+ export default deselectAll;
@@ -1,2 +1,2 @@
1
- declare const downArrow: import("react").JSX.Element;
1
+ declare const downArrow: import("react/jsx-runtime").JSX.Element;
2
2
  export default downArrow;
@@ -0,0 +1,3 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ var downArrow = (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", fill: "currentColor", viewBox: "0 0 16 16", children: [_jsx("title", { children: "(sorted descending)" }), _jsx("desc", { children: "Down arrow indicating that the column is being sorted in an descending manner" }), _jsx("path", { fillRule: "evenodd", d: "M8 1a.5.5 0 0 1 .5.5v11.793l3.146-3.147a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 .708-.708L7.5 13.293V1.5A.5.5 0 0 1 8 1" })] }));
3
+ export default downArrow;
@@ -1,2 +1,2 @@
1
- declare const selectAll: import("react").JSX.Element;
1
+ declare const selectAll: import("react/jsx-runtime").JSX.Element;
2
2
  export default selectAll;
@@ -0,0 +1,3 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ var selectAll = (_jsxs("svg", { className: "rdbg-svg-icon", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", width: "16", height: "16", fill: "currentColor", children: [_jsx("desc", { children: "Plus sign inside a square" }), _jsx("rect", { className: "rdbg-svg-icon-foreground", x: "3.5", y: "7.5", width: "9", height: "1" }), _jsx("rect", { className: "rdbg-svg-icon-foreground", x: "3.5", y: "7.5", width: "9", height: "1", transform: "translate(0 16) rotate(-90)" })] }));
3
+ export default selectAll;
@@ -1,2 +1,2 @@
1
- declare const upArrow: (grayed: boolean) => import("react").JSX.Element;
1
+ declare const upArrow: (grayed: boolean) => import("react/jsx-runtime").JSX.Element;
2
2
  export default upArrow;
@@ -0,0 +1,13 @@
1
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
+ if (ar || !(i in from)) {
4
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
+ ar[i] = from[i];
6
+ }
7
+ }
8
+ return to.concat(ar || Array.prototype.slice.call(from));
9
+ };
10
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
11
+ import classNames from "classnames";
12
+ var upArrow = function (grayed) { return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "16", height: "16", fill: "currentColor", className: classNames(__spreadArray([], (grayed ? ["text-body-secondary"] : []), true)), viewBox: "0 0 16 16", children: [!grayed && (_jsxs(_Fragment, { children: [_jsx("title", { children: "(sorted ascending)" }), _jsx("desc", { children: "Up arrow indicating that the column is being sorted in an ascending manner" })] })), _jsx("path", { fillRule: "evenodd", d: "M8 15a.5.5 0 0 0 .5-.5V2.707l3.146 3.147a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 1 0 .708.708L7.5 2.707V14.5a.5.5 0 0 0 .5.5" })] })); };
13
+ export default upArrow;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@absreim/react-bootstrap-data-grid",
3
3
  "description": "Data grid UI component for use with web apps using React and Bootstrap",
4
- "version": "1.2.1",
4
+ "version": "1.3.0",
5
5
  "license": "MIT",
6
6
  "author": "Brook Li",
7
7
  "homepage": "https://react-bootstrap-data-grid.vercel.app/",
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import { useMemo } from "react";
3
4
  import classNames from "classnames";
4
5
  /**
@@ -47,73 +48,45 @@ var PageSelector = function (_a) {
47
48
  if (lowerBound === 1) {
48
49
  return null;
49
50
  }
50
- return (<li className="page-item">
51
- <a className="page-link" href="#" aria-label="First" onClick={function (event) {
52
- event.preventDefault();
53
- setPageNum(1);
54
- }}>
55
- <span aria-hidden="true">&lt;&lt;</span>
56
- </a>
57
- </li>);
51
+ return (_jsx("li", { className: "page-item", children: _jsx("a", { className: "page-link", href: "#", "aria-label": "First", onClick: function (event) {
52
+ event.preventDefault();
53
+ setPageNum(1);
54
+ }, children: _jsx("span", { "aria-hidden": "true", children: "<<" }) }) }));
58
55
  }
59
56
  function getPrevArrowButton() {
60
57
  if (pageNum === 1) {
61
58
  return null;
62
59
  }
63
- return (<li className="page-item">
64
- <a className="page-link" href="#" aria-label="Previous" onClick={function (event) {
65
- event.preventDefault();
66
- setPageNum(pageNum - 1);
67
- }}>
68
- <span aria-hidden="true">&lt;</span>
69
- </a>
70
- </li>);
60
+ return (_jsx("li", { className: "page-item", children: _jsx("a", { className: "page-link", href: "#", "aria-label": "Previous", onClick: function (event) {
61
+ event.preventDefault();
62
+ setPageNum(pageNum - 1);
63
+ }, children: _jsx("span", { "aria-hidden": "true", children: "<" }) }) }));
71
64
  }
72
65
  function getNextArrowButton() {
73
66
  if (pageNum === numPages) {
74
67
  return null;
75
68
  }
76
- return (<li className="page-item">
77
- <a className="page-link" href="#" aria-label="Next" onClick={function (event) {
78
- event.preventDefault();
79
- setPageNum(pageNum + 1);
80
- }}>
81
- <span aria-hidden="true">&gt;</span>
82
- </a>
83
- </li>);
69
+ return (_jsx("li", { className: "page-item", children: _jsx("a", { className: "page-link", href: "#", "aria-label": "Next", onClick: function (event) {
70
+ event.preventDefault();
71
+ setPageNum(pageNum + 1);
72
+ }, children: _jsx("span", { "aria-hidden": "true", children: ">" }) }) }));
84
73
  }
85
74
  function getLastArrowButton() {
86
75
  if (upperBound === numPages) {
87
76
  return null;
88
77
  }
89
- return (<li className="page-item">
90
- <a className="page-link" href="#" aria-label="Last" onClick={function (event) {
91
- event.preventDefault();
92
- setPageNum(numPages);
93
- }}>
94
- <span aria-hidden="true">&gt;&gt;</span>
95
- </a>
96
- </li>);
78
+ return (_jsx("li", { className: "page-item", children: _jsx("a", { className: "page-link", href: "#", "aria-label": "Last", onClick: function (event) {
79
+ event.preventDefault();
80
+ setPageNum(numPages);
81
+ }, children: _jsx("span", { "aria-hidden": "true", children: ">>" }) }) }));
97
82
  }
98
- var indexButtons = buttonIndices.map(function (buttonIndex) { return (<li key={buttonIndex} className={classNames({
83
+ var indexButtons = buttonIndices.map(function (buttonIndex) { return (_jsx("li", { className: classNames({
99
84
  "page-item": true,
100
85
  active: pageNum === buttonIndex,
101
- })} aria-current={pageNum === buttonIndex ? "page" : undefined}>
102
- <a className="page-link" href="#" onClick={function (event) {
103
- event.preventDefault();
104
- setPageNum(buttonIndex);
105
- }}>
106
- {buttonIndex}
107
- </a>
108
- </li>); });
109
- return (<nav aria-label={ariaLabel}>
110
- <ul className={classNames(ulClasses)}>
111
- {getFirstArrowButton()}
112
- {getPrevArrowButton()}
113
- {indexButtons}
114
- {getNextArrowButton()}
115
- {getLastArrowButton()}
116
- </ul>
117
- </nav>);
86
+ }), "aria-current": pageNum === buttonIndex ? "page" : undefined, children: _jsx("a", { className: "page-link", href: "#", onClick: function (event) {
87
+ event.preventDefault();
88
+ setPageNum(buttonIndex);
89
+ }, children: buttonIndex }) }, buttonIndex)); });
90
+ return (_jsx("nav", { "aria-label": ariaLabel, children: _jsxs("ul", { className: classNames(ulClasses), children: [getFirstArrowButton(), getPrevArrowButton(), indexButtons, getNextArrowButton(), getLastArrowButton()] }) }));
118
91
  };
119
92
  export default PageSelector;
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import classNames from "classnames";
3
+ var PageSizeSelector = function (_a) {
4
+ var componentSize = _a.componentSize, pageSizeOptions = _a.pageSizeOptions, pageSizeIndex = _a.pageSizeIndex, handleSetPageSize = _a.handleSetPageSize;
5
+ var onChange = function (event) {
6
+ var pageSizeIndex = Number(event.target.value);
7
+ handleSetPageSize(pageSizeIndex);
8
+ };
9
+ return (_jsx("div", { children: _jsx("select", { className: classNames({
10
+ "form-select": true,
11
+ "form-select-lg": componentSize === "large",
12
+ "form-select-sm": componentSize === "small",
13
+ }), value: pageSizeIndex, "aria-label": "Number of Rows per Page", onChange: onChange, children: pageSizeOptions.map(function (numRows, index) { return (_jsx("option", { value: index, children: numRows }, index)); }) }) }));
14
+ };
15
+ export default PageSizeSelector;
@@ -1,3 +1,4 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
2
  import PageSizeSelector from "./PageSizeSelector";
2
3
  import PageSelector from "./PageSelector";
3
4
  var Pagination = function (_a) {
@@ -14,9 +15,6 @@ var Pagination = function (_a) {
14
15
  handleSetPageNum(maxPages);
15
16
  }
16
17
  };
17
- return (<div className="d-flex justify-content-end gap-2">
18
- <PageSizeSelector componentSize={componentSize} pageSizeOptions={pageSizeOptions} pageSizeIndex={pageSizeIndex} handleSetPageSize={pageIndexAwarePageSizeSetter}/>
19
- <PageSelector numPages={numPages} pageNum={currentPage} numButtons={maxPageButtons} setPageNum={handleSetPageNum} size={componentSize}/>
20
- </div>);
18
+ return (_jsxs("div", { className: "d-flex justify-content-end gap-2", children: [_jsx(PageSizeSelector, { componentSize: componentSize, pageSizeOptions: pageSizeOptions, pageSizeIndex: pageSizeIndex, handleSetPageSize: pageIndexAwarePageSizeSetter }), _jsx(PageSelector, { numPages: numPages, pageNum: currentPage, numButtons: maxPageButtons, setPageNum: handleSetPageNum, size: componentSize })] }));
21
19
  };
22
20
  export default Pagination;
@@ -1,3 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
1
2
  import deselectAll from "../icons/deselectAll";
2
3
  import selectAll from "../icons/selectAll";
3
4
  import arrowPlaceholder from "../icons/arrowPlaceholder";
@@ -33,10 +34,8 @@ var SelectAllHeaderCell = function (_a) {
33
34
  var onClick = _a.onClick, selectType = _a.selectType, selectionExists = _a.selectionExists;
34
35
  var disabled = selectType === "single" && !selectionExists;
35
36
  var description = getCellAriaDescription(selectType, selectionExists);
36
- return (<th aria-colindex={1} title={description} aria-description={description} className={classNames("select-header-cell", "btn-primary", {
37
- "cursor-pointer": !disabled,
38
- })} onClick={onClick}>
39
- {getSelectIcon(selectType, selectionExists)}
40
- </th>);
37
+ return (_jsx("th", { "aria-colindex": 1, title: description, "aria-description": description, className: classNames("rbdg-select-header-cell", "btn-primary", {
38
+ "rbdg-clickable-grid-header-cell": !disabled,
39
+ }), onClick: onClick, children: getSelectIcon(selectType, selectionExists) }));
41
40
  };
42
41
  export default SelectAllHeaderCell;
@@ -1,3 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
1
2
  var SelectionInput = function (_a) {
2
3
  var selectionInputModel = _a.selectionInputModel, selected = _a.selected, selectCallback = _a.selectCallback;
3
4
  var type = selectionInputModel.type;
@@ -14,8 +15,8 @@ var SelectionInput = function (_a) {
14
15
  selectCallback();
15
16
  }
16
17
  };
17
- return (<input aria-description="input to select the current row" onClick={function (event) {
18
+ return (_jsx("input", { "aria-label": "input to select the current row", onClick: function (event) {
18
19
  event.stopPropagation();
19
- }} type={type} checked={selected} onChange={onChange} name={selectionInputModel.name}/>);
20
+ }, type: type, checked: selected, onChange: onChange, name: selectionInputModel.name }));
20
21
  };
21
22
  export default SelectionInput;
package/style.css ADDED
@@ -0,0 +1 @@
1
+ .rbdg-clickable-grid-header-cell{cursor:pointer}.rbdg-select-header-cell .rdbg-svg-icon{background-color:var(--bs-btn-bg)}.rbdg-select-header-cell .rdbg-svg-icon-foreground{color:var(--bs-btn-color)}.rbdg-select-header-cell:hover .rdbg-svg-icon{background-color:var(--bs-btn-hover-bg)}.rbdg-select-header-cell:hover .rdbg-svg-icon-foreground{color:var(--bs-btn-hover-color)}.rbdg-grid{display:table}.rbdg-grid-head{display:table-header-group}.rbdg-grid-body{display:table-row-group}.rbdg-grid-row{display:table-row}.rbdg-grid-cell{display:table-cell}
package/style.scss ADDED
@@ -0,0 +1,41 @@
1
+ .rbdg-clickable-grid-header-cell {
2
+ cursor: pointer;
3
+ }
4
+
5
+ .rbdg-select-header-cell {
6
+ .rdbg-svg-icon {
7
+ background-color: var(--bs-btn-bg);
8
+ }
9
+ .rdbg-svg-icon-foreground {
10
+ color: var(--bs-btn-color);
11
+ }
12
+
13
+ &:hover {
14
+ .rdbg-svg-icon {
15
+ background-color: var(--bs-btn-hover-bg);
16
+ }
17
+ .rdbg-svg-icon-foreground {
18
+ color: var(--bs-btn-hover-color);
19
+ }
20
+ }
21
+ }
22
+
23
+ .rbdg-grid {
24
+ display: table;
25
+ }
26
+
27
+ .rbdg-grid-head {
28
+ display: table-header-group;
29
+ }
30
+
31
+ .rbdg-grid-body {
32
+ display: table-row-group;
33
+ }
34
+
35
+ .rbdg-grid-row {
36
+ display: table-row;
37
+ }
38
+
39
+ .rbdg-grid-cell {
40
+ display: table-cell;
41
+ }
package/types.d.ts CHANGED
@@ -16,7 +16,7 @@ export interface AugRowDef {
16
16
  meta: RowMetadata;
17
17
  }
18
18
  export interface FormattedRow {
19
- contents: string[];
19
+ contents: CellData[];
20
20
  origIndex: number;
21
21
  }
22
22
  export type JustifyContentSetting = "start" | "end" | "center" | "between" | "around" | "evenly";
@@ -103,3 +103,16 @@ export interface SingleSelectModel {
103
103
  export type SelectModel = SingleSelectModel | MultiSelectModel;
104
104
  export type MultiSelectModelInitialState = Omit<MultiSelectModel, "setSelected">;
105
105
  export type SingleSelectModelInitialState = Omit<SingleSelectModel, "setSelected">;
106
+ export interface CellData {
107
+ fieldName: string;
108
+ value: ColDataType;
109
+ type: ColDataTypeStrings;
110
+ ariaColIndex: number;
111
+ formattedValue: string;
112
+ label: string;
113
+ }
114
+ export type UpdateCallbackGenerator = (origIndex: number) => (rowDef: RowDef) => void;
115
+ export interface EditModel {
116
+ getUpdateCallback: UpdateCallbackGenerator;
117
+ getDeleteCallback?: (origIndex: number) => () => void;
118
+ }
@@ -1,10 +0,0 @@
1
- // Temporary solution to prevent column widths from changing when hovering over
2
- // columns with a mouse.
3
- // More ideal permanent solution would be to fix column widths based on preset
4
- // values.
5
- var arrowPlaceholder = (<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
6
- <desc>
7
- Empty transparent square for styling purposes
8
- </desc>
9
- </svg>);
10
- export default arrowPlaceholder;
@@ -1,5 +0,0 @@
1
- var deselectAll = (<svg className="svg-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor">
2
- <desc>Minus sign inside a square</desc>
3
- <rect className="svg-icon-foreground" x="3.5" y="7.5" width="9" height="1"/>
4
- </svg>);
5
- export default deselectAll;
@@ -1,9 +0,0 @@
1
- var downArrow = (<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" viewBox="0 0 16 16">
2
- <title>(sorted descending)</title>
3
- <desc>
4
- Down arrow indicating that the column is being sorted in an descending
5
- manner
6
- </desc>
7
- <path fillRule="evenodd" d="M8 1a.5.5 0 0 1 .5.5v11.793l3.146-3.147a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 .708-.708L7.5 13.293V1.5A.5.5 0 0 1 8 1"/>
8
- </svg>);
9
- export default downArrow;
@@ -1,6 +0,0 @@
1
- var selectAll = (<svg className="svg-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="currentColor">
2
- <desc>Plus sign inside a square</desc>
3
- <rect className="svg-icon-foreground" x="3.5" y="7.5" width="9" height="1"/>
4
- <rect className="svg-icon-foreground" x="3.5" y="7.5" width="9" height="1" transform="translate(0 16) rotate(-90)"/>
5
- </svg>);
6
- export default selectAll;
package/icons/upArrow.jsx DELETED
@@ -1,21 +0,0 @@
1
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
2
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
3
- if (ar || !(i in from)) {
4
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5
- ar[i] = from[i];
6
- }
7
- }
8
- return to.concat(ar || Array.prototype.slice.call(from));
9
- };
10
- import classNames from "classnames";
11
- var upArrow = function (grayed) { return (<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" className={classNames(__spreadArray([], (grayed ? ["text-body-secondary"] : []), true))} viewBox="0 0 16 16">
12
- {!grayed && (<>
13
- <title>(sorted ascending)</title>
14
- <desc>
15
- Up arrow indicating that the column is being sorted in an ascending
16
- manner
17
- </desc>
18
- </>)}
19
- <path fillRule="evenodd" d="M8 15a.5.5 0 0 0 .5-.5V2.707l3.146 3.147a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 1 0 .708.708L7.5 2.707V14.5a.5.5 0 0 0 .5.5"/>
20
- </svg>); };
21
- export default upArrow;
@@ -1,20 +0,0 @@
1
- import classNames from "classnames";
2
- var PageSizeSelector = function (_a) {
3
- var componentSize = _a.componentSize, pageSizeOptions = _a.pageSizeOptions, pageSizeIndex = _a.pageSizeIndex, handleSetPageSize = _a.handleSetPageSize;
4
- var onChange = function (event) {
5
- var pageSizeIndex = Number(event.target.value);
6
- handleSetPageSize(pageSizeIndex);
7
- };
8
- return (<div>
9
- <select className={classNames({
10
- "form-select": true,
11
- "form-select-lg": componentSize === "large",
12
- "form-select-sm": componentSize === "small",
13
- })} value={pageSizeIndex} aria-label="Number of Rows per Page" onChange={onChange}>
14
- {pageSizeOptions.map(function (numRows, index) { return (<option key={index} value={index}>
15
- {numRows}
16
- </option>); })}
17
- </select>
18
- </div>);
19
- };
20
- export default PageSizeSelector;
File without changes
File without changes