@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 +9 -0
- package/dist/components/ui/data-table.d.ts +8 -2
- package/dist/components/ui/data-table.js +29 -11
- package/dist/lib/query.d.ts +6 -6
- package/dist/lib/query.js +1 -11
- package/package.json +3 -2
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
|
-
/**
|
|
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
|
-
|
|
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
|
|
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
|
|
3007
|
-
|
|
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:
|
|
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-
|
|
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(
|
|
3198
|
-
|
|
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
|
}
|
package/dist/lib/query.d.ts
CHANGED
|
@@ -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(
|
|
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.
|
|
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,
|