@krak-stack/registry 0.1.43 → 0.1.45

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 ADDED
@@ -0,0 +1,9 @@
1
+ # @krak-stack/registry
2
+
3
+ ## 0.1.45
4
+
5
+ ### Patch Changes
6
+
7
+ - Support initial hidden columns through `DataTable.initialState.columnVisibility`, with saved user preferences taking precedence. Improve list columns with primary item actions, item menus for nonempty lists, responsive dropdowns, and truncated labels. Consolidate the column-type examples into one kitchen-sink preview.
8
+
9
+ - Preserve decoded pagination defaults in QueryStandard. Use TanStack Router's stripSearchParams({ page: 0, pageSize: 20 }) search middleware on the root route to omit defaults from URLs without making validated search state optional.
@@ -40,7 +40,9 @@ export interface DataTableListOptions {
40
40
  export type DataTableListColumn<TData> = DataTableListOptions & {
41
41
  /** Includes items not loaded in the preview; the dropdown only shows supplied items. */
42
42
  getTotalCount?: (row: TData) => number;
43
- /** Actions open from an explicit roster button; list items remain passive. */
43
+ /** Optional primary action for items without submenu actions. */
44
+ onItemClick?: (context: DataTableListItemContext<TData>) => void;
45
+ /** Optional secondary actions shown in each item's submenu. */
44
46
  itemActions?: readonly DataTableItemAction<DataTableListItemContext<TData>>[];
45
47
  actionsLabel?: string;
46
48
  } & ({
@@ -76,6 +78,7 @@ interface EditableDataTableListCellProps extends DataTableListOptions {
76
78
  totalCount?: number | undefined;
77
79
  }
78
80
  interface DataTableListCellActionsProps {
81
+ onItemClick?: ((item: DataTableListItem) => void) | undefined;
79
82
  actionsLabel?: string | undefined;
80
83
  itemActions?: readonly DataTableItemAction<DataTableListItem>[] | undefined;
81
84
  }
@@ -375,7 +378,10 @@ export interface DataTableProps<TData extends RowData> {
375
378
  columnDefs: readonly DataTableColDef<TData>[];
376
379
  getRowId?: (row: TData) => string;
377
380
  state?: DataTablePublicState;
378
- initialState?: Partial<DataTablePublicState>;
381
+ initialState?: Partial<DataTablePublicState> & {
382
+ /** Initial visibility defaults; saved user preferences take precedence. */
383
+ columnVisibility?: Readonly<Record<string, boolean>>;
384
+ };
379
385
  locale?: string;
380
386
  onStateChange?: (state: DataTablePublicState) => void;
381
387
  status?: DataTableStatus;
@@ -1494,6 +1494,7 @@ var renderCell = (row, column, locale = "en", labels = dataTableMessages(locale)
1494
1494
  return /* @__PURE__ */ jsx14(DataTableListCell, {
1495
1495
  ...config,
1496
1496
  itemActions,
1497
+ onItemClick: config.onItemClick ? (item) => config.onItemClick?.({ item, row: row.data }) : undefined,
1497
1498
  items: config.getItems(row.data),
1498
1499
  locale,
1499
1500
  messages: { [locale]: labels },
@@ -1506,6 +1507,7 @@ var renderCell = (row, column, locale = "en", labels = dataTableMessages(locale)
1506
1507
  return /* @__PURE__ */ jsx14(DataTableListCell, {
1507
1508
  ...config,
1508
1509
  itemActions,
1510
+ onItemClick: config.onItemClick ? (item) => config.onItemClick?.({ item, row: row.data }) : undefined,
1509
1511
  items: config.getItems(row.data),
1510
1512
  locale,
1511
1513
  messages: { [locale]: labels },
@@ -2934,6 +2936,7 @@ var HydratedDataTable = ({
2934
2936
  };
2935
2937
  var DataTable = (props) => {
2936
2938
  const locale = useKrakstackLocale3(props.locale);
2939
+ const [initialColumnVisibility] = useState(() => props.initialState?.columnVisibility ?? {});
2937
2940
  const [persistedUiAtom] = useState(() => {
2938
2941
  const pathname = globalThis.window?.location.pathname ?? "/";
2939
2942
  const columnIds = normalizeDataTableColumns(props.columnDefs).map(({ id }) => id).join(",");
@@ -2947,7 +2950,14 @@ var DataTable = (props) => {
2947
2950
  });
2948
2951
  });
2949
2952
  const [persistedUiResult, setPersistedUiState] = useAtom(persistedUiAtom);
2950
- if (!AsyncResult.isSuccess(persistedUiResult) || AsyncResult.isWaiting(persistedUiResult)) {
2953
+ const persistedUiState = useMemo(() => AsyncResult.isSuccess(persistedUiResult) ? {
2954
+ ...persistedUiResult.value,
2955
+ columnVisibility: {
2956
+ ...initialColumnVisibility,
2957
+ ...persistedUiResult.value.columnVisibility
2958
+ }
2959
+ } : undefined, [initialColumnVisibility, persistedUiResult]);
2960
+ if (!persistedUiState || AsyncResult.isWaiting(persistedUiResult)) {
2951
2961
  return /* @__PURE__ */ jsx14("div", {
2952
2962
  "aria-busy": "true",
2953
2963
  className: "invisible w-full max-w-full min-w-0 rounded-md",
@@ -2957,7 +2967,7 @@ var DataTable = (props) => {
2957
2967
  return /* @__PURE__ */ jsx14(HydratedDataTable, {
2958
2968
  ...props,
2959
2969
  locale,
2960
- persistedUiState: persistedUiResult.value,
2970
+ persistedUiState,
2961
2971
  setPersistedUiState
2962
2972
  });
2963
2973
  };
@@ -3001,11 +3011,10 @@ var DataTableListCell = (props) => {
3001
3011
  ...resolvedProps
3002
3012
  });
3003
3013
  }
3004
- const { actionsLabel, itemActions, ...summaryProps } = resolvedProps;
3014
+ const { actionsLabel, itemActions, onItemClick, ...summaryProps } = resolvedProps;
3005
3015
  const labels = dataTableMessages(locale, resolvedProps.messages);
3006
- const totalCount = resolvedProps.totalCount ?? resolvedProps.items.length;
3007
- const overflow = totalCount > Math.min(resolvedProps.items.length, resolvedProps.visibleCount ?? 3);
3008
- if (!itemActions?.length && !overflow) {
3016
+ const hasItems = resolvedProps.items.length > 0;
3017
+ if (!itemActions?.length && !hasItems) {
3009
3018
  return /* @__PURE__ */ jsx14(DataTableListSummary, {
3010
3019
  ...summaryProps
3011
3020
  });
@@ -3019,11 +3028,12 @@ var DataTableListCell = (props) => {
3019
3028
  children: /* @__PURE__ */ jsx14(DataTableListMenu, {
3020
3029
  actions: itemActions ?? [],
3021
3030
  display: resolvedProps.display,
3022
- force: overflow,
3031
+ force: hasItems,
3023
3032
  label: menuLabel,
3024
3033
  items: resolvedProps.items,
3025
3034
  locale,
3026
3035
  messages: resolvedProps.messages,
3036
+ onItemClick,
3027
3037
  trigger: /* @__PURE__ */ jsxs8(Button, {
3028
3038
  "aria-label": menuLabel,
3029
3039
  className: "h-full w-full min-w-0 justify-between rounded-none px-2 focus-visible:ring-inset",
@@ -3051,6 +3061,7 @@ var EditableDataTableListCell = ({
3051
3061
  totalCount,
3052
3062
  actionsLabel,
3053
3063
  itemActions,
3064
+ onItemClick,
3054
3065
  locale = "en",
3055
3066
  messages
3056
3067
  }) => {
@@ -3093,6 +3104,7 @@ var EditableDataTableListCell = ({
3093
3104
  display,
3094
3105
  force: true,
3095
3106
  items: selected,
3107
+ onItemClick,
3096
3108
  label: actionsLabel ?? manageLabel,
3097
3109
  locale,
3098
3110
  messages,
@@ -3133,6 +3145,7 @@ var DataTableListMenu = ({
3133
3145
  locale = "en",
3134
3146
  messages,
3135
3147
  onAdd,
3148
+ onItemClick,
3136
3149
  trigger
3137
3150
  }) => {
3138
3151
  const entries = items.map((item) => {
@@ -3160,7 +3173,7 @@ var DataTableListMenu = ({
3160
3173
  }),
3161
3174
  /* @__PURE__ */ jsx14(DropdownMenuContent, {
3162
3175
  align: "end",
3163
- className: "max-h-72 w-72",
3176
+ className: "max-h-[min(18rem,var(--available-height))] w-72 max-w-[calc(100vw-2rem)]",
3164
3177
  onClick: (event) => event.stopPropagation(),
3165
3178
  onPointerDown: (event) => event.stopPropagation(),
3166
3179
  children: /* @__PURE__ */ jsxs8(DropdownMenuGroup, {
@@ -3194,8 +3207,12 @@ var DataTableListMenu = ({
3194
3207
  }, action.id ?? action.name))
3195
3208
  })
3196
3209
  ]
3197
- }, item.value ?? `${item.label}-${index}`) : /* @__PURE__ */ jsx14("div", {
3198
- className: "px-2 py-1.5",
3210
+ }, item.value ?? `${item.label}-${index}`) : /* @__PURE__ */ jsx14(DropdownMenuItem, {
3211
+ closeOnClick: Boolean(onItemClick),
3212
+ onClick: (event) => {
3213
+ event.stopPropagation();
3214
+ onItemClick?.(item);
3215
+ },
3199
3216
  children: /* @__PURE__ */ jsx14(DataTableListEntry, {
3200
3217
  item,
3201
3218
  appearance: display === "icon" ? "detail" : "list"
@@ -3377,7 +3394,8 @@ var DataTableListEntry = ({
3377
3394
  });
3378
3395
  if (appearance === "list") {
3379
3396
  return /* @__PURE__ */ jsx14("span", {
3380
- className: "truncate",
3397
+ className: "min-w-0 flex-1 truncate",
3398
+ title: item.label,
3381
3399
  children: item.label
3382
3400
  });
3383
3401
  }
@@ -43,22 +43,24 @@ export declare const Query: Schema.Struct<{
43
43
  export type QueryType = typeof Query.Type;
44
44
  export type QueryEncoded = typeof Query.Encoded;
45
45
  export declare const QueryStandard: import("effect/StandardSchema").StandardSchemaV1<{
46
+ readonly page?: string | number | undefined;
47
+ readonly pageSize?: string | number | undefined;
46
48
  readonly globalFilter?: string | undefined;
47
49
  readonly sort?: readonly {
48
50
  readonly id: string;
49
51
  readonly direction: "asc" | "desc";
50
52
  }[] | undefined;
51
- readonly page?: string | number | undefined;
52
- readonly pageSize?: string | number | undefined;
53
53
  }, {
54
+ readonly page: number;
55
+ readonly pageSize: number;
54
56
  readonly globalFilter?: string | undefined;
55
57
  readonly sort?: readonly {
56
58
  readonly id: string;
57
59
  readonly direction: "asc" | "desc";
58
60
  }[] | undefined;
59
- readonly page?: number | undefined;
60
- readonly pageSize?: number | undefined;
61
61
  }> & Schema.Struct<{
62
+ readonly page: Schema.decodeTo<Schema.Int, Schema.optional<Schema.Union<readonly [Schema.Number, Schema.NumberFromString]>>, never, never>;
63
+ readonly pageSize: Schema.decodeTo<Schema.Int, Schema.optional<Schema.Union<readonly [Schema.Number, Schema.NumberFromString]>>, never, never>;
62
64
  readonly globalFilter: Schema.optional<Schema.String>;
63
65
  readonly sort: Schema.optional<Schema.declare<readonly {
64
66
  readonly id: string;
@@ -67,8 +69,6 @@ export declare const QueryStandard: import("effect/StandardSchema").StandardSche
67
69
  readonly id: string;
68
70
  readonly direction: "asc" | "desc";
69
71
  }[]>>;
70
- readonly page: Schema.decodeTo<Schema.optional<Schema.Int>, Schema.decodeTo<Schema.Int, Schema.optional<Schema.Union<readonly [Schema.Number, Schema.NumberFromString]>>, never, never>, never, never>;
71
- readonly pageSize: Schema.decodeTo<Schema.optional<Schema.Int>, Schema.decodeTo<Schema.Int, Schema.optional<Schema.Union<readonly [Schema.Number, Schema.NumberFromString]>>, never, never>, never, never>;
72
72
  }>;
73
73
  export declare const PaginationMeta: Schema.Struct<{
74
74
  readonly page: Schema.Int;
package/dist/lib/query.js CHANGED
@@ -107,17 +107,7 @@ var Query = Schema.Struct({
107
107
  }
108
108
  ]
109
109
  });
110
- var QueryStandard = Schema.toStandardSchemaV1(Schema.Struct({
111
- ...Query.fields,
112
- page: Query.fields.page.pipe(Schema.decodeTo(Schema.optional(Schema.Int), {
113
- decode: SchemaGetter.transform((page) => page === 0 ? undefined : page),
114
- encode: SchemaGetter.transform((page) => page ?? 0)
115
- })),
116
- pageSize: Query.fields.pageSize.pipe(Schema.decodeTo(Schema.optional(Schema.Int), {
117
- decode: SchemaGetter.transform((pageSize) => pageSize === 20 ? undefined : pageSize),
118
- encode: SchemaGetter.transform((pageSize) => pageSize ?? 20)
119
- }))
120
- }).annotate({ identifier: "QuerySearch" }));
110
+ var QueryStandard = Schema.toStandardSchemaV1(Query);
121
111
  var PaginationMeta = Schema.Struct({
122
112
  page: Schema.Int,
123
113
  pageSize: Schema.Int,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krak-stack/registry",
3
- "version": "0.1.43",
3
+ "version": "0.1.45",
4
4
  "description": "Tree-shakable KrakStack components and Effect services.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -11,7 +11,8 @@
11
11
  "files": [
12
12
  "dist",
13
13
  "README.md",
14
- "tailwind.css"
14
+ "tailwind.css",
15
+ "CHANGELOG.md"
15
16
  ],
16
17
  "type": "module",
17
18
  "sideEffects": false,