@mshuja288/aksuicore 0.4.2 → 0.4.3

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/CHANGELOG.md CHANGED
@@ -7,6 +7,13 @@ Versioning follows [VERSIONING.md](./VERSIONING.md).
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.3] — 2026-10-13
11
+
12
+ ### Added
13
+
14
+ - `RecordWorkspace` persists preview on/off and side-rail expand/collapse globally (`aksui.workspace.chrome`) across all tables
15
+ - Filter values persist per screen at `${columnPrefsKey}.filters` when `columnPrefsKey` is set
16
+
10
17
  ## [0.4.1] — 2026-10-12
11
18
 
12
19
  ### Fixed
package/dist/index.cjs CHANGED
@@ -877,6 +877,37 @@ var BULK_IMPORT_MODE_OPTIONS = [
877
877
  function defaultVisibleKeys(columns) {
878
878
  return columns.filter((column) => column.defaultVisible !== false).map((column) => column.key);
879
879
  }
880
+ var WORKSPACE_CHROME_KEY = "aksui.workspace.chrome";
881
+ function readWorkspaceChrome() {
882
+ if (typeof window === "undefined") {
883
+ return { previewEnabled: false, sideOpen: false };
884
+ }
885
+ try {
886
+ const raw = window.localStorage.getItem(WORKSPACE_CHROME_KEY);
887
+ if (!raw) {
888
+ return { previewEnabled: false, sideOpen: false };
889
+ }
890
+ const parsed = JSON.parse(raw);
891
+ return {
892
+ previewEnabled: Boolean(parsed.previewEnabled),
893
+ sideOpen: Boolean(parsed.sideOpen)
894
+ };
895
+ } catch {
896
+ return { previewEnabled: false, sideOpen: false };
897
+ }
898
+ }
899
+ function writeWorkspaceChrome(chrome) {
900
+ if (typeof window === "undefined") {
901
+ return;
902
+ }
903
+ try {
904
+ window.localStorage.setItem(WORKSPACE_CHROME_KEY, JSON.stringify(chrome));
905
+ } catch {
906
+ }
907
+ }
908
+ function filtersPrefsKey(columnPrefsKey) {
909
+ return columnPrefsKey ? `${columnPrefsKey}.filters` : void 0;
910
+ }
880
911
  function readStoredColumnKeys(prefsKey, fallback, allowed) {
881
912
  if (!prefsKey || typeof window === "undefined") {
882
913
  return fallback;
@@ -905,6 +936,45 @@ function writeStoredColumnKeys(prefsKey, keys) {
905
936
  } catch {
906
937
  }
907
938
  }
939
+ function readStoredFilters(prefsKey, allowed) {
940
+ if (!prefsKey || typeof window === "undefined") {
941
+ return {};
942
+ }
943
+ try {
944
+ const raw = window.localStorage.getItem(prefsKey);
945
+ if (!raw) {
946
+ return {};
947
+ }
948
+ const parsed = JSON.parse(raw);
949
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
950
+ return {};
951
+ }
952
+ const next = {};
953
+ for (const [key, value] of Object.entries(parsed)) {
954
+ if (allowed.has(key) && typeof value === "string" && value.trim()) {
955
+ next[key] = value;
956
+ }
957
+ }
958
+ return next;
959
+ } catch {
960
+ return {};
961
+ }
962
+ }
963
+ function writeStoredFilters(prefsKey, filters) {
964
+ if (!prefsKey || typeof window === "undefined") {
965
+ return;
966
+ }
967
+ try {
968
+ const trimmed = {};
969
+ for (const [key, value] of Object.entries(filters)) {
970
+ if (value.trim()) {
971
+ trimmed[key] = value;
972
+ }
973
+ }
974
+ window.localStorage.setItem(prefsKey, JSON.stringify(trimmed));
975
+ } catch {
976
+ }
977
+ }
908
978
  function compareColumnValues(column, left, right) {
909
979
  const leftRaw = column.display ? column.display(left) : column.value(left);
910
980
  const rightRaw = column.display ? column.display(right) : column.value(right);
@@ -1028,9 +1098,12 @@ function RecordWorkspace({
1028
1098
  const [internalVisibleKeys, setInternalVisibleKeys] = react.useState(
1029
1099
  () => readStoredColumnKeys(columnPrefsKey, fallbackKeys, allowedKeys)
1030
1100
  );
1031
- const [filters, setFilters] = react.useState({});
1101
+ const filterStorageKey = filtersPrefsKey(columnPrefsKey);
1102
+ const [filters, setFilters] = react.useState(
1103
+ () => readStoredFilters(filterStorageKey, allowedKeys)
1104
+ );
1032
1105
  const [sort, setSort] = react.useState(null);
1033
- const [sideOpen, setSideOpen] = react.useState(false);
1106
+ const [sideOpen, setSideOpen] = react.useState(() => readWorkspaceChrome().sideOpen);
1034
1107
  const [toolsDrawerOpen, setToolsDrawerOpen] = react.useState(false);
1035
1108
  const [downloadOpen, setDownloadOpen] = react.useState(false);
1036
1109
  const [bulkOpen, setBulkOpen] = react.useState(false);
@@ -1039,7 +1112,7 @@ function RecordWorkspace({
1039
1112
  const [bulkReport, setBulkReport] = react.useState(null);
1040
1113
  const bulkFileInputRef = react.useRef(null);
1041
1114
  const [columnsOpen, setColumnsOpen] = react.useState(false);
1042
- const [previewEnabled, setPreviewEnabled] = react.useState(false);
1115
+ const [previewEnabled, setPreviewEnabled] = react.useState(() => readWorkspaceChrome().previewEnabled);
1043
1116
  const [previewKey, setPreviewKey] = react.useState(null);
1044
1117
  const [tooltip, setTooltip] = react.useState(null);
1045
1118
  const [pageSize, setPageSize] = react.useState("15");
@@ -1054,6 +1127,9 @@ function RecordWorkspace({
1054
1127
  }
1055
1128
  setInternalVisibleKeys(readStoredColumnKeys(columnPrefsKey, fallbackKeys, allowedKeys));
1056
1129
  }, [allowedKeys, columnPrefsKey, fallbackKeys, isControlled]);
1130
+ react.useEffect(() => {
1131
+ setFilters(readStoredFilters(filtersPrefsKey(columnPrefsKey), allowedKeys));
1132
+ }, [allowedKeys, columnPrefsKey]);
1057
1133
  const resolvedVisibleKeys = react.useMemo(() => {
1058
1134
  const source = isControlled ? visibleColumnKeys : internalVisibleKeys;
1059
1135
  const filtered2 = source.filter((key) => allowedKeys.has(key));
@@ -1214,13 +1290,22 @@ function RecordWorkspace({
1214
1290
  }
1215
1291
  const previewTitle = previewItem && visibleColumns[0] ? cellText(visibleColumns[0], previewItem) : null;
1216
1292
  function changeFilter(key, value) {
1217
- setFilters((current) => ({ ...current, [key]: value }));
1293
+ setFilters((current) => {
1294
+ const next = { ...current, [key]: value };
1295
+ writeStoredFilters(filterStorageKey, next);
1296
+ return next;
1297
+ });
1218
1298
  setPage(1);
1219
1299
  }
1220
1300
  function clearFilters() {
1221
1301
  setFilters({});
1302
+ writeStoredFilters(filterStorageKey, {});
1222
1303
  setPage(1);
1223
1304
  }
1305
+ function setSideOpenValue(open) {
1306
+ setSideOpen(open);
1307
+ writeWorkspaceChrome({ previewEnabled, sideOpen: open });
1308
+ }
1224
1309
  function toggleSort(column) {
1225
1310
  if (column.sortable === false) {
1226
1311
  return;
@@ -1238,6 +1323,7 @@ function RecordWorkspace({
1238
1323
  }
1239
1324
  function setPreviewEnabledValue(enabled) {
1240
1325
  setPreviewEnabled(enabled);
1326
+ writeWorkspaceChrome({ previewEnabled: enabled, sideOpen });
1241
1327
  setTooltip(null);
1242
1328
  if (!enabled) {
1243
1329
  setPreviewKey(null);
@@ -1298,7 +1384,7 @@ function RecordWorkspace({
1298
1384
  title: "Columns",
1299
1385
  "aria-label": "Columns",
1300
1386
  onClick: () => {
1301
- setSideOpen(true);
1387
+ setSideOpenValue(true);
1302
1388
  setColumnsOpen(true);
1303
1389
  },
1304
1390
  children: [
@@ -1316,7 +1402,7 @@ function RecordWorkspace({
1316
1402
  "aria-label": "Download",
1317
1403
  disabled: downloadBusy,
1318
1404
  onClick: () => {
1319
- setSideOpen(true);
1405
+ setSideOpenValue(true);
1320
1406
  setDownloadOpen(true);
1321
1407
  },
1322
1408
  children: /* @__PURE__ */ jsxRuntime.jsx(DownloadIcon, {})
@@ -1331,7 +1417,7 @@ function RecordWorkspace({
1331
1417
  "aria-label": "Bulk entry",
1332
1418
  disabled: importBusy,
1333
1419
  onClick: () => {
1334
- setSideOpen(true);
1420
+ setSideOpenValue(true);
1335
1421
  setBulkOpen(true);
1336
1422
  },
1337
1423
  children: /* @__PURE__ */ jsxRuntime.jsx(UploadIcon, {})
@@ -1733,7 +1819,7 @@ function RecordWorkspace({
1733
1819
  className: "ghost side-rail-toggle",
1734
1820
  "aria-expanded": sideOpen,
1735
1821
  title: sideOpen ? "Collapse" : "Expand",
1736
- onClick: () => setSideOpen((open) => !open),
1822
+ onClick: () => setSideOpenValue(!sideOpen),
1737
1823
  children: [
1738
1824
  /* @__PURE__ */ jsxRuntime.jsx(ChevronIcon, { open: sideOpen }),
1739
1825
  sideOpen ? /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Collapse" }) : null