@homebound/beam 2.186.6 → 2.187.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.
@@ -2,8 +2,9 @@ import { Dispatch, SetStateAction } from "react";
2
2
  import { OverlayTriggerProps } from "../internal/OverlayTrigger";
3
3
  import { GridColumn, Kinded } from "./GridTable";
4
4
  interface EditColumnsButtonProps<R extends Kinded, S> extends Pick<OverlayTriggerProps, "trigger" | "placement" | "disabled" | "tooltip"> {
5
- columns: GridColumn<R, S>[];
6
- setColumns: Dispatch<SetStateAction<GridColumn<R, S>[]>>;
5
+ allColumns: GridColumn<R, S>[];
6
+ selectedColumns: GridColumn<R, S>[];
7
+ setSelectedColumns: Dispatch<SetStateAction<GridColumn<R, S>[]>>;
7
8
  title?: string;
8
9
  defaultOpen?: boolean;
9
10
  }
@@ -11,13 +11,13 @@ const utils_1 = require("../../utils");
11
11
  const Button_1 = require("../Button");
12
12
  const OverlayTrigger_1 = require("../internal/OverlayTrigger");
13
13
  function EditColumnsButton(props) {
14
- const { defaultOpen, disabled, columns, setColumns, trigger, title } = props;
14
+ const { defaultOpen, disabled, allColumns, setSelectedColumns, trigger, title, selectedColumns } = props;
15
15
  const state = (0, react_stately_1.useMenuTriggerState)({ isOpen: defaultOpen });
16
16
  const buttonRef = (0, react_1.useRef)(null);
17
17
  const { menuTriggerProps } = (0, react_aria_1.useMenuTrigger)({ isDisabled: !!disabled }, state, buttonRef);
18
18
  const tid = (0, utils_1.useTestIds)(props, (0, OverlayTrigger_1.isTextButton)(trigger) ? trigger.label : (0, OverlayTrigger_1.isIconButton)(trigger) ? trigger.icon : trigger.name);
19
- const { options, selectedColumns } = (0, react_1.useMemo)(() => {
20
- return columns.reduce((acc, column) => {
19
+ const { options } = (0, react_1.useMemo)(() => {
20
+ return allColumns.reduce((acc, column) => {
21
21
  // Only include options that can be hidden and have the `name` property defined.
22
22
  if (!column.canHide)
23
23
  return acc;
@@ -25,18 +25,14 @@ function EditColumnsButton(props) {
25
25
  console.warn("Column is missing 'name' property required by the Edit Columns button", column);
26
26
  return acc;
27
27
  }
28
- // If currently visible, then add to selectedColumns
29
- if (column.canHide && column.visible) {
30
- acc.selectedColumns.push(column.name);
31
- }
32
28
  // Add current column as an option
33
29
  return { ...acc, options: acc.options.concat({ label: column.name, value: column.name }) };
34
- }, { options: [], selectedColumns: [] });
35
- }, [columns]);
36
- const [selectedValues, setSelectedValues] = (0, react_1.useState)(selectedColumns);
37
- (0, react_1.useEffect)(() => {
38
- setColumns(columns.filter((column) => (column.canHide ? selectedValues.includes(column.name) : true)));
39
- }, [selectedValues]);
30
+ }, { options: [] });
31
+ }, [allColumns]);
32
+ const selectedValues = selectedColumns.map((column) => column.name);
33
+ const setSelectedValues = (0, react_1.useCallback)((values) => {
34
+ setSelectedColumns(allColumns.filter((column) => (column.canHide ? values.includes(column.name) : true)));
35
+ }, [allColumns, setSelectedColumns]);
40
36
  return ((0, jsx_runtime_1.jsx)(OverlayTrigger_1.OverlayTrigger, Object.assign({}, props, { menuTriggerProps: menuTriggerProps, state: state, buttonRef: buttonRef }, tid, { children: (0, jsx_runtime_1.jsxs)("div", Object.assign({ css: {
41
37
  ...Css_1.Css.bgWhite.py5.px3.maxwPx(380).bshBasic.$,
42
38
  "&:hover": Css_1.Css.bshHover.$,
@@ -244,8 +244,8 @@ export declare type GridColumn<R extends Kinded, S = {}> = {
244
244
  name?: string;
245
245
  /** Flag that will allow to know which columns are hide-able */
246
246
  canHide?: boolean;
247
- /** Flag that will allow to know which hide-able columns are visible */
248
- visible?: boolean;
247
+ /** Flag that will allow to know which hide-able columns are visible on initial load */
248
+ initVisible?: boolean;
249
249
  };
250
250
  export declare const nonKindGridColumnKeys: string[];
251
251
  /** Allows rendering a specific cell. */
@@ -1,3 +1,3 @@
1
1
  import { Dispatch, SetStateAction } from "react";
2
2
  import { GridColumn, Kinded } from "./GridTable";
3
- export declare function useColumns<R extends Kinded, S = {}>(tableColumns: GridColumn<R, S>[]): [GridColumn<R, S>[], Dispatch<SetStateAction<GridColumn<R, S>[]>>];
3
+ export declare function useColumns<R extends Kinded, S = {}>(tableColumns: GridColumn<R, S>[], maybeStorageKey?: string): [GridColumn<R, S>[], Dispatch<SetStateAction<GridColumn<R, S>[]>>];
@@ -1,9 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useColumns = void 0;
4
+ const change_case_1 = require("change-case");
4
5
  const react_1 = require("react");
5
- function useColumns(tableColumns) {
6
- const [columns, setColumns] = (0, react_1.useState)(tableColumns.filter((column) => (column.canHide ? column.visible : true)));
6
+ const useSessionStorage_1 = require("../../hooks/useSessionStorage");
7
+ function useColumns(tableColumns, maybeStorageKey) {
8
+ const { selectedColumns, hideColumns } = tableColumns.reduce((acc, column) => {
9
+ // Only include options that can be hidden and have the `name` property defined.
10
+ if (!column.name || column.name.length === 0) {
11
+ console.warn("Column is missing 'name' property required by the Edit Columns button", column);
12
+ return acc;
13
+ }
14
+ // Add hide-able columns
15
+ if (column.canHide) {
16
+ acc.hideColumns.push(column.name);
17
+ }
18
+ // Add selected columns
19
+ if (!column.canHide || (column.canHide && column.initVisible)) {
20
+ acc.selectedColumns.push(column.name);
21
+ }
22
+ return { ...acc };
23
+ }, { selectedColumns: [], hideColumns: [] });
24
+ const storageKey = maybeStorageKey !== null && maybeStorageKey !== void 0 ? maybeStorageKey : (0, change_case_1.camelCase)(hideColumns.map((c) => c).join(""));
25
+ const [storageNames, setStorageNames] = (0, useSessionStorage_1.useSessionStorage)(storageKey, selectedColumns);
26
+ const storageColumns = storageNames && storageNames.map((sc) => tableColumns.find((column) => column.name === sc));
27
+ const [columns, setColumns] = (0, react_1.useState)(storageColumns);
28
+ (0, react_1.useEffect)(() => {
29
+ setStorageNames(columns.map((column) => column.name));
30
+ }, [columns]);
7
31
  return [columns, setColumns];
8
32
  }
9
33
  exports.useColumns = useColumns;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homebound/beam",
3
- "version": "2.186.6",
3
+ "version": "2.187.0",
4
4
  "author": "Homebound",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",