@stella-source/stellasource-dsl 5.2.0 → 5.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.
package/README.md CHANGED
@@ -48,6 +48,19 @@ To get started with the **Stella Source Design System**, visit our [documentatio
48
48
 
49
49
  ---
50
50
 
51
+ # NPM Commands
52
+
53
+ | Command | Description |
54
+ |---|---|
55
+ | `npm run start` | Start Storybook dev server on port 6006 |
56
+ | `npm run build` | Build Storybook for production |
57
+ | `npm run package` | Build the component library with Rollup |
58
+ | `npm test` | Run tests in watch mode (Vitest) |
59
+ | `npm run test:coverage` | Run tests with coverage report |
60
+ | `npm run ngrok` | Expose local Storybook via ngrok (port 6006) |
61
+
62
+ ---
63
+
51
64
  # Contributing to the DSL
52
65
 
53
66
  Contributing Guide: https://dev.azure.com/stellasource/Stella%20Source/_wiki/wikis/SecturaSoft.wiki/543/Contributing-To-The-DSL
package/dist/cjs/index.js CHANGED
@@ -21861,14 +21861,15 @@ function usePersistTableState(tableId, state, sizingDebounceMs = 300) {
21861
21861
  a$n.useEffect(() => {
21862
21862
  latestSizing.current = state.columnSizing;
21863
21863
  }, [state.columnSizing]);
21864
- // Persist visibility and sorting immediately
21864
+ // Persist visibility, sorting, and filters immediately
21865
21865
  a$n.useEffect(() => {
21866
21866
  saveTableState(tableId, {
21867
21867
  columnVisibility: state.columnVisibility,
21868
21868
  columnSizing: latestSizing.current,
21869
21869
  sorting: state.sorting,
21870
+ columnFilters: state.columnFilters,
21870
21871
  });
21871
- }, [tableId, state.columnVisibility, state.sorting]);
21872
+ }, [tableId, state.columnVisibility, state.sorting, state.columnFilters]);
21872
21873
  // Persist sizing debounced
21873
21874
  a$n.useEffect(() => {
21874
21875
  if (debounceTimer.current)
@@ -21878,6 +21879,7 @@ function usePersistTableState(tableId, state, sizingDebounceMs = 300) {
21878
21879
  columnVisibility: state.columnVisibility,
21879
21880
  columnSizing: latestSizing.current,
21880
21881
  sorting: state.sorting,
21882
+ columnFilters: state.columnFilters,
21881
21883
  });
21882
21884
  }, sizingDebounceMs);
21883
21885
  return () => {
@@ -22541,7 +22543,9 @@ const TableHeaderCell = ({ header, serverSide, filters, sorting, scrollPosition,
22541
22543
  }, 300);
22542
22544
  const displayOptions = serverSide
22543
22545
  ? filterOptions
22544
- : normalizeOptions(Array.from(header.column.getFacetedUniqueValues().keys()));
22546
+ : header.column.getCanFilter()
22547
+ ? normalizeOptions(Array.from(header.column.getFacetedUniqueValues().keys()))
22548
+ : [];
22545
22549
  a$n.useEffect(() => {
22546
22550
  setFilterOptions(normalizeOptions(meta?.filterOptions || []));
22547
22551
  }, [meta]);
@@ -22677,7 +22681,6 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
22677
22681
  const [localColumns, setLocalColumns] = a$n.useState(columns);
22678
22682
  const [totalData, setTotalData] = a$n.useState(paginationDetails?.totalRows);
22679
22683
  const [sorting, setSorting] = a$n.useState(() => loadTableState(id).sorting ?? []);
22680
- const [filters, setFilters] = a$n.useState({});
22681
22684
  const [rowState, setRowState] = a$n.useState({});
22682
22685
  const [columnVisibility, setColumnVisibility] = a$n.useState(() => {
22683
22686
  const persisted = loadTableState(id);
@@ -22691,7 +22694,8 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
22691
22694
  ]));
22692
22695
  });
22693
22696
  const [columnFilters, setColumnFilters] = a$n.useState(() => {
22694
- const base = defaultFilters ?? [];
22697
+ const persisted = loadTableState(id);
22698
+ const base = persisted.columnFilters ?? defaultFilters ?? [];
22695
22699
  if (!staticFilters?.length)
22696
22700
  return base;
22697
22701
  const merged = [...base];
@@ -22710,6 +22714,11 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
22710
22714
  });
22711
22715
  return merged;
22712
22716
  });
22717
+ const filters = a$n.useMemo(() => {
22718
+ const map = {};
22719
+ columnFilters.forEach((f) => (map[f.id] = f.value));
22720
+ return map;
22721
+ }, [columnFilters]);
22713
22722
  const [columnPinning, setColumnPinning] = a$n.useState({ left: ["select"], right: ["options"] });
22714
22723
  const scrollRef = a$n.useRef(null);
22715
22724
  const visibilityButtonRef = a$n.useRef(null);
@@ -22746,7 +22755,13 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
22746
22755
  setLocalData(data);
22747
22756
  if (paginationDetails && paginationDetails.startingPage !== pageIndex)
22748
22757
  setPageIndex(paginationDetails?.startingPage);
22749
- }, [paginationDetails, data, columns]);
22758
+ }, [
22759
+ paginationDetails?.totalRows,
22760
+ paginationDetails?.startingPage,
22761
+ paginationDetails?.rowsPerPage,
22762
+ data,
22763
+ columns,
22764
+ ]);
22750
22765
  a$n.useEffect(() => {
22751
22766
  if (!showVisibilityMenu)
22752
22767
  return;
@@ -22826,7 +22841,7 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
22826
22841
  !table.getIsAllPageRowsSelected();
22827
22842
  return (a$n.createElement(IndeterminateCheckbox, { isIndeterminate: isIndeterminate, isChecked: table.getIsAllPageRowsSelected(), onChange: table.getToggleAllPageRowsSelectedHandler() }));
22828
22843
  },
22829
- cell: ({ row }) => (a$n.createElement(Checkbox, { checked: row.getIsSelected(), onChange: row.getToggleSelectedHandler() })),
22844
+ cell: ({ row }) => (a$n.createElement(Checkbox, { checked: row.getIsSelected(), onChange: row.getToggleSelectedHandler(), onClick: (e) => e.stopPropagation() })),
22830
22845
  size: 20,
22831
22846
  });
22832
22847
  }
@@ -22912,9 +22927,6 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
22912
22927
  });
22913
22928
  }
22914
22929
  setColumnFilters(next);
22915
- const map = {};
22916
- next.forEach((f) => (map[f.id] = f.value));
22917
- setFilters(map);
22918
22930
  onFilterChange?.(next);
22919
22931
  },
22920
22932
  filterFns: {
@@ -22925,7 +22937,7 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
22925
22937
  },
22926
22938
  },
22927
22939
  });
22928
- usePersistTableState(id, { columnVisibility, sorting });
22940
+ usePersistTableState(id, { columnVisibility, sorting, columnFilters });
22929
22941
  a$n.useEffect(() => {
22930
22942
  if (onRowSelect) {
22931
22943
  const selectedData = table
@@ -22934,6 +22946,12 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
22934
22946
  onRowSelect?.(selectedData);
22935
22947
  }
22936
22948
  }, [rowSelection]);
22949
+ const initialColumnFilters = a$n.useRef(columnFilters);
22950
+ a$n.useEffect(() => {
22951
+ if (initialColumnFilters.current.length > 0) {
22952
+ onFilterChange?.(initialColumnFilters.current);
22953
+ }
22954
+ }, []);
22937
22955
  const isMounted = a$n.useRef(false);
22938
22956
  a$n.useEffect(() => {
22939
22957
  if (!isMounted.current) {
@@ -22943,8 +22961,9 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
22943
22961
  resetTable();
22944
22962
  }, [resetTrigger]);
22945
22963
  const resetTable = () => {
22946
- setColumnFilters(staticFilters ?? []);
22947
- setFilters({});
22964
+ const resetFilters = staticFilters ?? [];
22965
+ setColumnFilters(resetFilters);
22966
+ onFilterChange?.(resetFilters);
22948
22967
  setSorting([]);
22949
22968
  setPageIndex(1);
22950
22969
  setPagination({
@@ -22953,6 +22972,8 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
22953
22972
  });
22954
22973
  table.toggleAllRowsSelected(false);
22955
22974
  };
22975
+ const hasActiveFilters = Object.keys(filters).length > (staticFilters?.length ?? 0) &&
22976
+ Object.values(filters).some((v) => v?.length);
22956
22977
  return (a$n.createElement(a$n.Fragment, null,
22957
22978
  !isLoading && (a$n.createElement(ActionBar, null,
22958
22979
  a$n.createElement(GlobalActionWrapper, null, globalActions?.(table)),
@@ -23017,7 +23038,8 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
23017
23038
  }, key: index + "loading-row" }, Array.from({
23018
23039
  length: 10,
23019
23040
  }).map((_, i) => (a$n.createElement(LoadingShimmer, { key: `${i}-loading`, "$width": "110px", "$height": "25px" }))))))))) : (a$n.createElement(StyledTable, { id: `${id}-table`, ...htmlProps },
23020
- a$n.createElement("thead", null, table.getHeaderGroups().map((headerGroup) => (a$n.createElement(HeaderRow, { key: headerGroup.id, "$isEmpty": table.getRowModel().rows.length === 0 }, headerGroup.headers.map((header, i) => {
23041
+ a$n.createElement("thead", null, table.getHeaderGroups().map((headerGroup) => (a$n.createElement(HeaderRow, { key: headerGroup.id, "$isEmpty": table.getCoreRowModel().rows.length === 0 &&
23042
+ !hasActiveFilters }, headerGroup.headers.map((header, i) => {
23021
23043
  return (a$n.createElement(TableHeaderCell, { key: header.id, serverSide: serverSide, header: header, filters: filters, sorting: sorting, scrollPosition: scrollState, onFilterMenuInteraction: (id, active) => {
23022
23044
  setFilterMenuOpen((prev) => ({
23023
23045
  ...prev,
@@ -23032,14 +23054,21 @@ function Table({ columns, data, isLoading, serverSide = false, onPageChange, onS
23032
23054
  } }));
23033
23055
  }))))),
23034
23056
  a$n.createElement("tbody", null,
23035
- table.getRowModel().rows.length === 0 && (a$n.createElement(EmptyTableState, { header: emptyTableState?.header || "No data available.", subHeader: emptyTableState?.subHeader, showClearFilterButton: emptyTableState?.showClearFilterButton, onClearFilters: resetTable, colSpan: table.getVisibleLeafColumns().length, size: "large" })),
23057
+ table.getRowModel().rows.length === 0 && (a$n.createElement(EmptyTableState, { header: hasActiveFilters
23058
+ ? "No results found."
23059
+ : emptyTableState?.header || "No data available.", subHeader: !hasActiveFilters ? emptyTableState?.subHeader : undefined, showClearFilterButton: hasActiveFilters, onClearFilters: () => {
23060
+ resetTable();
23061
+ emptyTableState?.onClearFilters?.();
23062
+ }, colSpan: table.getVisibleLeafColumns().length, size: "large" })),
23036
23063
  table.getRowModel().rows.map((row) => (a$n.createElement(a$n.Fragment, { key: row.id },
23037
23064
  a$n.createElement(CellRow, { onClick: () => {
23065
+ if (showSelection)
23066
+ row.toggleSelected();
23038
23067
  if (!showExpandedRowToggle &&
23039
23068
  !!renderExpandedRow?.(row))
23040
23069
  toggleRowExpanded(row.id);
23041
23070
  onRowClick?.(row.original);
23042
- }, "$isClickable": !!onRowClick }, row.getVisibleCells().map((cell) => {
23071
+ }, "$isClickable": !!onRowClick || showSelection }, row.getVisibleCells().map((cell) => {
23043
23072
  const value = flexRender(cell.column.columnDef.cell, {
23044
23073
  ...cell.getContext(),
23045
23074
  localValue: rowState[row.id]?.[cell.column.id],