@tulip-systems/drive 0.8.2 → 0.9.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/dist/components/content.d.mts +1 -2
- package/dist/components/content.mjs +1 -2
- package/dist/components/context.client.d.mts +1 -2
- package/dist/components/dnd.client.d.mts +1 -2
- package/dist/components/dnd.client.mjs +1 -2
- package/dist/components/grid-card.client.d.mts +6 -3
- package/dist/components/grid-card.client.mjs +15 -15
- package/dist/components/grid.client.d.mts +1 -2
- package/dist/components/grid.client.mjs +1 -2
- package/dist/components/navigation/breadcrumbs.client.d.mts +1 -2
- package/dist/components/navigation/breadcrumbs.client.mjs +1 -2
- package/dist/components/navigation/header.client.d.mts +1 -2
- package/dist/components/navigation/header.client.mjs +1 -2
- package/dist/components/navigation/toolbar.client.d.mts +1 -2
- package/dist/components/navigation/toolbar.client.mjs +1 -2
- package/dist/components/navigation/view-switcher.client.d.mts +1 -2
- package/dist/components/navigation/view-switcher.client.mjs +1 -2
- package/dist/components/selection.client.d.mts +2 -3
- package/dist/components/selection.client.mjs +2 -5
- package/dist/components/view.client.d.mts +1 -2
- package/dist/components/view.client.mjs +1 -2
- package/dist/config/filters.mjs +1 -2
- package/dist/config/types.mjs +1 -2
- package/dist/lib/constants.d.mts +1 -2
- package/dist/lib/constants.mjs +1 -2
- package/dist/lib/contracts.d.mts +1 -2
- package/dist/lib/dto.d.mts +3 -4
- package/dist/lib/dto.mjs +1 -2
- package/dist/lib/helpers.d.mts +1 -2
- package/dist/lib/helpers.mjs +1 -2
- package/dist/lib/helpers.server.d.mts +1 -2
- package/dist/lib/helpers.server.mjs +1 -2
- package/dist/lib/search-params.d.mts +1 -2
- package/dist/lib/search-params.mjs +1 -2
- package/dist/lib/validators.d.mts +10 -11
- package/dist/lib/validators.mjs +1 -2
- package/dist/providers/google/components/command-file-update.d.mts +1 -2
- package/dist/providers/google/components/command-file-update.mjs +3 -4
- package/dist/providers/google/components/command-folder-create.d.mts +1 -2
- package/dist/providers/google/components/command-folder-create.mjs +3 -4
- package/dist/providers/google/components/command-folder-update.d.mts +1 -2
- package/dist/providers/google/components/command-folder-update.mjs +3 -4
- package/dist/providers/google/components/content.client.d.mts +1 -2
- package/dist/providers/google/components/content.client.mjs +1 -2
- package/dist/providers/google/components/navigation.client.d.mts +1 -2
- package/dist/providers/google/components/navigation.client.mjs +1 -2
- package/dist/providers/google/components/provider.client.d.mts +1 -2
- package/dist/providers/google/components/provider.client.mjs +1 -2
- package/dist/providers/google/components/view.client.d.mts +2 -3
- package/dist/providers/google/components/view.client.mjs +4 -6
- package/dist/providers/google/config/columns-data.d.mts +1 -2
- package/dist/providers/google/config/columns-data.mjs +1 -2
- package/dist/providers/google/config/filters.d.mts +2 -3
- package/dist/providers/google/config/filters.mjs +1 -2
- package/dist/providers/google/lib/constants.mjs +1 -2
- package/dist/providers/google/lib/dto.d.mts +1 -2
- package/dist/providers/google/lib/dto.mjs +1 -2
- package/dist/providers/google/lib/helpers.mjs +1 -9
- package/dist/providers/google/lib/router.server.d.mts +21 -22
- package/dist/providers/google/lib/router.server.mjs +1 -2
- package/dist/providers/google/lib/search-params.d.mts +2 -3
- package/dist/providers/google/lib/search-params.mjs +1 -2
- package/dist/providers/google/lib/service.server.d.mts +1 -2
- package/dist/providers/google/lib/service.server.mjs +2 -5
- package/dist/providers/google/lib/validators.d.mts +13 -14
- package/dist/providers/google/lib/validators.mjs +1 -2
- package/dist/providers/local/components/command-file-update.d.mts +1 -2
- package/dist/providers/local/components/command-file-update.mjs +3 -4
- package/dist/providers/local/components/command-file-upload.d.mts +1 -2
- package/dist/providers/local/components/command-file-upload.mjs +1 -2
- package/dist/providers/local/components/command-folder-create.d.mts +1 -2
- package/dist/providers/local/components/command-folder-create.mjs +3 -4
- package/dist/providers/local/components/command-folder-update.d.mts +1 -2
- package/dist/providers/local/components/command-folder-update.mjs +3 -4
- package/dist/providers/local/components/content.client.d.mts +1 -2
- package/dist/providers/local/components/content.client.mjs +1 -2
- package/dist/providers/local/components/navigation.client.d.mts +1 -2
- package/dist/providers/local/components/navigation.client.mjs +1 -2
- package/dist/providers/local/components/provider.client.d.mts +1 -2
- package/dist/providers/local/components/provider.client.mjs +1 -2
- package/dist/providers/local/components/upload-zone-context.client.d.mts +1 -2
- package/dist/providers/local/components/upload-zone-context.client.mjs +1 -2
- package/dist/providers/local/components/upload-zone.client.d.mts +1 -2
- package/dist/providers/local/components/upload-zone.client.mjs +2 -3
- package/dist/providers/local/components/view.client.d.mts +2 -3
- package/dist/providers/local/components/view.client.mjs +3 -4
- package/dist/providers/local/config/columns-data.d.mts +1 -2
- package/dist/providers/local/config/columns-data.mjs +1 -2
- package/dist/providers/local/config/filters.d.mts +2 -3
- package/dist/providers/local/config/filters.mjs +1 -2
- package/dist/providers/local/config/sorting.mjs +16 -0
- package/dist/providers/local/lib/constants.d.mts +1 -2
- package/dist/providers/local/lib/constants.mjs +1 -2
- package/dist/providers/local/lib/helpers.d.mts +1 -2
- package/dist/providers/local/lib/helpers.mjs +1 -2
- package/dist/providers/local/lib/route-handler.server.d.mts +1 -2
- package/dist/providers/local/lib/route-handler.server.mjs +1 -2
- package/dist/providers/local/lib/router.server.d.mts +118 -119
- package/dist/providers/local/lib/router.server.mjs +1 -2
- package/dist/providers/local/lib/schema.d.mts +3 -4
- package/dist/providers/local/lib/schema.mjs +1 -2
- package/dist/providers/local/lib/search-params.d.mts +2 -3
- package/dist/providers/local/lib/search-params.mjs +1 -2
- package/dist/providers/local/lib/service.server.d.mts +20 -21
- package/dist/providers/local/lib/service.server.mjs +10 -10
- package/dist/providers/local/lib/upload.client.d.mts +1 -2
- package/dist/providers/local/lib/upload.client.mjs +1 -2
- package/dist/providers/local/lib/validators.d.mts +19 -20
- package/dist/providers/local/lib/validators.mjs +1 -2
- package/package.json +44 -46
- package/src/components/grid-card.client.tsx +18 -13
- package/src/components/selection.client.tsx +1 -2
- package/src/config/types.tsx +1 -1
- package/src/providers/google/components/command-file-update.tsx +2 -2
- package/src/providers/google/components/command-folder-create.tsx +2 -2
- package/src/providers/google/components/command-folder-update.tsx +2 -2
- package/src/providers/google/components/view.client.tsx +5 -10
- package/src/providers/google/lib/helpers.ts +0 -9
- package/src/providers/google/lib/service.server.ts +1 -3
- package/src/providers/local/components/command-file-update.tsx +2 -2
- package/src/providers/local/components/command-folder-create.tsx +2 -2
- package/src/providers/local/components/command-folder-update.tsx +2 -2
- package/src/providers/local/components/upload-zone.client.tsx +1 -1
- package/src/providers/local/components/view.client.tsx +4 -3
- package/src/providers/local/config/sorting.ts +16 -0
- package/src/providers/local/lib/service.server.ts +8 -19
- package/dist/components/content.d.mts.map +0 -1
- package/dist/components/content.mjs.map +0 -1
- package/dist/components/context.client.d.mts.map +0 -1
- package/dist/components/dnd.client.d.mts.map +0 -1
- package/dist/components/dnd.client.mjs.map +0 -1
- package/dist/components/grid-card.client.d.mts.map +0 -1
- package/dist/components/grid-card.client.mjs.map +0 -1
- package/dist/components/grid.client.d.mts.map +0 -1
- package/dist/components/grid.client.mjs.map +0 -1
- package/dist/components/navigation/breadcrumbs.client.d.mts.map +0 -1
- package/dist/components/navigation/breadcrumbs.client.mjs.map +0 -1
- package/dist/components/navigation/header.client.d.mts.map +0 -1
- package/dist/components/navigation/header.client.mjs.map +0 -1
- package/dist/components/navigation/toolbar.client.d.mts.map +0 -1
- package/dist/components/navigation/toolbar.client.mjs.map +0 -1
- package/dist/components/navigation/view-switcher.client.d.mts.map +0 -1
- package/dist/components/navigation/view-switcher.client.mjs.map +0 -1
- package/dist/components/selection.client.d.mts.map +0 -1
- package/dist/components/selection.client.mjs.map +0 -1
- package/dist/components/view.client.d.mts.map +0 -1
- package/dist/components/view.client.mjs.map +0 -1
- package/dist/config/filters.mjs.map +0 -1
- package/dist/config/types.mjs.map +0 -1
- package/dist/lib/constants.d.mts.map +0 -1
- package/dist/lib/constants.mjs.map +0 -1
- package/dist/lib/contracts.d.mts.map +0 -1
- package/dist/lib/dto.d.mts.map +0 -1
- package/dist/lib/dto.mjs.map +0 -1
- package/dist/lib/helpers.d.mts.map +0 -1
- package/dist/lib/helpers.mjs.map +0 -1
- package/dist/lib/helpers.server.d.mts.map +0 -1
- package/dist/lib/helpers.server.mjs.map +0 -1
- package/dist/lib/search-params.d.mts.map +0 -1
- package/dist/lib/search-params.mjs.map +0 -1
- package/dist/lib/validators.d.mts.map +0 -1
- package/dist/lib/validators.mjs.map +0 -1
- package/dist/providers/google/components/command-file-update.d.mts.map +0 -1
- package/dist/providers/google/components/command-file-update.mjs.map +0 -1
- package/dist/providers/google/components/command-folder-create.d.mts.map +0 -1
- package/dist/providers/google/components/command-folder-create.mjs.map +0 -1
- package/dist/providers/google/components/command-folder-update.d.mts.map +0 -1
- package/dist/providers/google/components/command-folder-update.mjs.map +0 -1
- package/dist/providers/google/components/content.client.d.mts.map +0 -1
- package/dist/providers/google/components/content.client.mjs.map +0 -1
- package/dist/providers/google/components/navigation.client.d.mts.map +0 -1
- package/dist/providers/google/components/navigation.client.mjs.map +0 -1
- package/dist/providers/google/components/provider.client.d.mts.map +0 -1
- package/dist/providers/google/components/provider.client.mjs.map +0 -1
- package/dist/providers/google/components/view.client.d.mts.map +0 -1
- package/dist/providers/google/components/view.client.mjs.map +0 -1
- package/dist/providers/google/config/columns-data.d.mts.map +0 -1
- package/dist/providers/google/config/columns-data.mjs.map +0 -1
- package/dist/providers/google/config/filters.d.mts.map +0 -1
- package/dist/providers/google/config/filters.mjs.map +0 -1
- package/dist/providers/google/lib/constants.mjs.map +0 -1
- package/dist/providers/google/lib/dto.d.mts.map +0 -1
- package/dist/providers/google/lib/dto.mjs.map +0 -1
- package/dist/providers/google/lib/helpers.mjs.map +0 -1
- package/dist/providers/google/lib/router.server.d.mts.map +0 -1
- package/dist/providers/google/lib/router.server.mjs.map +0 -1
- package/dist/providers/google/lib/search-params.d.mts.map +0 -1
- package/dist/providers/google/lib/search-params.mjs.map +0 -1
- package/dist/providers/google/lib/service.server.d.mts.map +0 -1
- package/dist/providers/google/lib/service.server.mjs.map +0 -1
- package/dist/providers/google/lib/validators.d.mts.map +0 -1
- package/dist/providers/google/lib/validators.mjs.map +0 -1
- package/dist/providers/local/components/command-file-update.d.mts.map +0 -1
- package/dist/providers/local/components/command-file-update.mjs.map +0 -1
- package/dist/providers/local/components/command-file-upload.d.mts.map +0 -1
- package/dist/providers/local/components/command-file-upload.mjs.map +0 -1
- package/dist/providers/local/components/command-folder-create.d.mts.map +0 -1
- package/dist/providers/local/components/command-folder-create.mjs.map +0 -1
- package/dist/providers/local/components/command-folder-update.d.mts.map +0 -1
- package/dist/providers/local/components/command-folder-update.mjs.map +0 -1
- package/dist/providers/local/components/content.client.d.mts.map +0 -1
- package/dist/providers/local/components/content.client.mjs.map +0 -1
- package/dist/providers/local/components/navigation.client.d.mts.map +0 -1
- package/dist/providers/local/components/navigation.client.mjs.map +0 -1
- package/dist/providers/local/components/provider.client.d.mts.map +0 -1
- package/dist/providers/local/components/provider.client.mjs.map +0 -1
- package/dist/providers/local/components/upload-zone-context.client.d.mts.map +0 -1
- package/dist/providers/local/components/upload-zone-context.client.mjs.map +0 -1
- package/dist/providers/local/components/upload-zone.client.d.mts.map +0 -1
- package/dist/providers/local/components/upload-zone.client.mjs.map +0 -1
- package/dist/providers/local/components/view.client.d.mts.map +0 -1
- package/dist/providers/local/components/view.client.mjs.map +0 -1
- package/dist/providers/local/config/columns-data.d.mts.map +0 -1
- package/dist/providers/local/config/columns-data.mjs.map +0 -1
- package/dist/providers/local/config/filters.d.mts.map +0 -1
- package/dist/providers/local/config/filters.mjs.map +0 -1
- package/dist/providers/local/lib/constants.d.mts.map +0 -1
- package/dist/providers/local/lib/constants.mjs.map +0 -1
- package/dist/providers/local/lib/helpers.d.mts.map +0 -1
- package/dist/providers/local/lib/helpers.mjs.map +0 -1
- package/dist/providers/local/lib/route-handler.server.d.mts.map +0 -1
- package/dist/providers/local/lib/route-handler.server.mjs.map +0 -1
- package/dist/providers/local/lib/router.server.d.mts.map +0 -1
- package/dist/providers/local/lib/router.server.mjs.map +0 -1
- package/dist/providers/local/lib/schema.d.mts.map +0 -1
- package/dist/providers/local/lib/schema.mjs.map +0 -1
- package/dist/providers/local/lib/search-params.d.mts.map +0 -1
- package/dist/providers/local/lib/search-params.mjs.map +0 -1
- package/dist/providers/local/lib/service.server.d.mts.map +0 -1
- package/dist/providers/local/lib/service.server.mjs.map +0 -1
- package/dist/providers/local/lib/upload.client.d.mts.map +0 -1
- package/dist/providers/local/lib/upload.client.mjs.map +0 -1
- package/dist/providers/local/lib/validators.d.mts.map +0 -1
- package/dist/providers/local/lib/validators.mjs.map +0 -1
|
@@ -29,8 +29,9 @@ import { useDriveSelectionContext } from "./selection.client";
|
|
|
29
29
|
*/
|
|
30
30
|
type DriveGridCardProps<TData extends DriveNode> = ComponentProps<"div"> & {
|
|
31
31
|
node: TData;
|
|
32
|
-
commands?: CommandDef
|
|
32
|
+
commands?: CommandDef[];
|
|
33
33
|
imageLoader?: (props: ImageLoaderProps) => string;
|
|
34
|
+
unoptimized?: boolean;
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
export function DriveGridCard<TData extends DriveNode>(props: DriveGridCardProps<TData>) {
|
|
@@ -56,6 +57,8 @@ export function DriveGridFolderCard<TData extends DriveNode>({
|
|
|
56
57
|
node,
|
|
57
58
|
commands,
|
|
58
59
|
onDoubleClick,
|
|
60
|
+
imageLoader,
|
|
61
|
+
unoptimized,
|
|
59
62
|
className,
|
|
60
63
|
...props
|
|
61
64
|
}: DriveGridCardProps<TData>) {
|
|
@@ -63,7 +66,7 @@ export function DriveGridFolderCard<TData extends DriveNode>({
|
|
|
63
66
|
|
|
64
67
|
const router = useRouter();
|
|
65
68
|
|
|
66
|
-
const
|
|
69
|
+
const selectionContext = useDriveSelectionContext();
|
|
67
70
|
|
|
68
71
|
const droppable = useDroppable({ id: node.id });
|
|
69
72
|
const draggable = useDraggable({ id: node.id });
|
|
@@ -77,11 +80,11 @@ export function DriveGridFolderCard<TData extends DriveNode>({
|
|
|
77
80
|
{...props}
|
|
78
81
|
key={id}
|
|
79
82
|
ref={draggable.ref}
|
|
80
|
-
data-selected={selection?.rowSelection?.[id]}
|
|
83
|
+
data-selected={selectionContext?.selection?.rowSelection?.[id]}
|
|
81
84
|
data-dragging={draggable.isDragging}
|
|
82
85
|
className="group @container relative flex max-h-48 max-w-full cursor-pointer flex-col items-center gap-2 overflow-hidden bg-transparent p-2 hover:bg-muted/70 active:bg-muted data-[selected=true]:bg-primary/30 data-[dragging=true]:opacity-50"
|
|
83
86
|
onClick={() => {
|
|
84
|
-
const conditions = selectionConditions?.(node);
|
|
87
|
+
const conditions = selectionContext?.selectionConditions?.(node);
|
|
85
88
|
|
|
86
89
|
if (conditions !== undefined) {
|
|
87
90
|
const canSelect = Array.isArray(conditions)
|
|
@@ -91,12 +94,12 @@ export function DriveGridFolderCard<TData extends DriveNode>({
|
|
|
91
94
|
if (!canSelect) return;
|
|
92
95
|
}
|
|
93
96
|
|
|
94
|
-
const isSelected = selection?.rowSelection?.[id];
|
|
97
|
+
const isSelected = selectionContext?.selection?.rowSelection?.[id];
|
|
95
98
|
|
|
96
99
|
if (!isSelected) {
|
|
97
|
-
selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));
|
|
100
|
+
selectionContext?.selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));
|
|
98
101
|
} else {
|
|
99
|
-
selection?.setRowSelection?.((old) => {
|
|
102
|
+
selectionContext?.selection?.setRowSelection?.((old) => {
|
|
100
103
|
const newSelection = { ...old };
|
|
101
104
|
delete newSelection[id];
|
|
102
105
|
return newSelection;
|
|
@@ -144,13 +147,14 @@ export function DriveGridFileCard<TData extends DriveNode>({
|
|
|
144
147
|
node,
|
|
145
148
|
commands,
|
|
146
149
|
imageLoader,
|
|
150
|
+
unoptimized = false,
|
|
147
151
|
className,
|
|
148
152
|
...props
|
|
149
153
|
}: DriveGridCardProps<TData>) {
|
|
150
154
|
const { id } = node;
|
|
151
155
|
|
|
152
156
|
const { ref, isDragging } = useDraggable({ id });
|
|
153
|
-
const
|
|
157
|
+
const selectionContext = useDriveSelectionContext();
|
|
154
158
|
|
|
155
159
|
const subtype = findStatus(nodeSubtypeConfig, node.subtype);
|
|
156
160
|
const Icon = subtype?.icon;
|
|
@@ -165,11 +169,11 @@ export function DriveGridFileCard<TData extends DriveNode>({
|
|
|
165
169
|
{...props}
|
|
166
170
|
key={id}
|
|
167
171
|
ref={ref}
|
|
168
|
-
data-selected={selection?.rowSelection?.[id]}
|
|
172
|
+
data-selected={selectionContext?.selection?.rowSelection?.[id]}
|
|
169
173
|
data-dragging={isDragging}
|
|
170
174
|
className="@container flex max-h-48 max-w-full cursor-pointer flex-col items-center gap-2 overflow-hidden p-2 hover:bg-muted/70 active:bg-muted data-[selected=true]:bg-primary/30 data-[dragging=true]:opacity-50"
|
|
171
175
|
onClick={() => {
|
|
172
|
-
const conditions = selectionConditions?.(node);
|
|
176
|
+
const conditions = selectionContext?.selectionConditions?.(node);
|
|
173
177
|
|
|
174
178
|
if (conditions !== undefined) {
|
|
175
179
|
const canSelect = Array.isArray(conditions)
|
|
@@ -179,12 +183,12 @@ export function DriveGridFileCard<TData extends DriveNode>({
|
|
|
179
183
|
if (!canSelect) return;
|
|
180
184
|
}
|
|
181
185
|
|
|
182
|
-
const isSelected = selection?.rowSelection?.[id];
|
|
186
|
+
const isSelected = selectionContext?.selection?.rowSelection?.[id];
|
|
183
187
|
|
|
184
188
|
if (!isSelected) {
|
|
185
|
-
selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));
|
|
189
|
+
selectionContext?.selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));
|
|
186
190
|
} else {
|
|
187
|
-
selection?.setRowSelection?.((old) => {
|
|
191
|
+
selectionContext?.selection?.setRowSelection?.((old) => {
|
|
188
192
|
const newSelection = { ...old };
|
|
189
193
|
delete newSelection[id];
|
|
190
194
|
return newSelection;
|
|
@@ -222,6 +226,7 @@ export function DriveGridFileCard<TData extends DriveNode>({
|
|
|
222
226
|
height={200}
|
|
223
227
|
loader={imageLoader}
|
|
224
228
|
className="h-full w-full object-cover"
|
|
229
|
+
unoptimized={unoptimized}
|
|
225
230
|
/>
|
|
226
231
|
) : (
|
|
227
232
|
<div className="flex h-full w-full items-center justify-center">
|
|
@@ -19,8 +19,7 @@ const DriveSelectionContext = createContext<DriveSelectionContextValue | null>(n
|
|
|
19
19
|
*/
|
|
20
20
|
export function useDriveSelectionContext() {
|
|
21
21
|
const context = use(DriveSelectionContext);
|
|
22
|
-
|
|
23
|
-
return context;
|
|
22
|
+
return context ?? null;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
/**
|
package/src/config/types.tsx
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
|
|
4
4
|
import type { DefaultError, MutationOptions } from "@tanstack/react-query";
|
|
5
5
|
import {
|
|
6
6
|
CommandFormDialog,
|
|
@@ -56,7 +56,7 @@ export function GoogleDriveFileUpdateCommand<
|
|
|
56
56
|
mutation,
|
|
57
57
|
}: GoogleDriveFileUpdateCommandProps<TData, TError, TVariables, TOnMutateResult>) {
|
|
58
58
|
const form = useForm<UpdateGoogleDriveNodeInput>({
|
|
59
|
-
resolver:
|
|
59
|
+
resolver: standardSchemaResolver(updateGoogleDriveNodeInputSchema),
|
|
60
60
|
defaultValues,
|
|
61
61
|
});
|
|
62
62
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
|
|
4
4
|
import type { DefaultError, MutationOptions } from "@tanstack/react-query";
|
|
5
5
|
import {
|
|
6
6
|
CommandFormDialog,
|
|
@@ -60,7 +60,7 @@ export function GoogleDriveFoldersCreateCommand<
|
|
|
60
60
|
const [{ parentId }] = useQueryStates(driveTreeSearchParams);
|
|
61
61
|
|
|
62
62
|
const form = useForm<CreateGoogleDriveFolderInput>({
|
|
63
|
-
resolver:
|
|
63
|
+
resolver: standardSchemaResolver(createGoogleDriveFolderInputSchema),
|
|
64
64
|
defaultValues: { ...defaultValues, parentId },
|
|
65
65
|
});
|
|
66
66
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
|
|
4
4
|
import type { DefaultError, MutationOptions } from "@tanstack/react-query";
|
|
5
5
|
import {
|
|
6
6
|
CommandFormDialog,
|
|
@@ -56,7 +56,7 @@ export function GoogleDriveFoldersUpdateCommand<
|
|
|
56
56
|
mutation,
|
|
57
57
|
}: GoogleDriveFoldersUpdateCommandProps<TData, TError, TVariables, TOnMutateResult>) {
|
|
58
58
|
const form = useForm<UpdateGoogleDriveNodeInput>({
|
|
59
|
-
resolver:
|
|
59
|
+
resolver: standardSchemaResolver(updateGoogleDriveNodeInputSchema),
|
|
60
60
|
defaultValues,
|
|
61
61
|
});
|
|
62
62
|
|
|
@@ -23,7 +23,6 @@ import { DriveGridCard, DriveGridCardSkeleton } from "@/components/grid-card.cli
|
|
|
23
23
|
import { useDriveSelectionContext } from "@/components/selection.client";
|
|
24
24
|
import { useDriveViewContext } from "@/components/view.client";
|
|
25
25
|
import { googleDriveColumns } from "../config/columns-data";
|
|
26
|
-
import { googleDriveImageLoader } from "../lib/helpers";
|
|
27
26
|
import type { GoogleDriveNode } from "../lib/validators";
|
|
28
27
|
import { useGoogleDriveContext } from "./provider.client";
|
|
29
28
|
|
|
@@ -35,7 +34,7 @@ type GoogleDriveViewProviderProps<TData extends GoogleDriveNode = GoogleDriveNod
|
|
|
35
34
|
queryData: TData[];
|
|
36
35
|
columns?: TableColumnDef<TData>[];
|
|
37
36
|
strategy: ReturnType<typeof useInfiniteStrategy>;
|
|
38
|
-
commands?: CommandDef
|
|
37
|
+
commands?: CommandDef[];
|
|
39
38
|
columnVisibility?: VisibilityState;
|
|
40
39
|
};
|
|
41
40
|
|
|
@@ -49,7 +48,7 @@ export function GoogleDriveViewProvider<TData extends GoogleDriveNode = GoogleDr
|
|
|
49
48
|
...props
|
|
50
49
|
}: GoogleDriveViewProviderProps<TData>) {
|
|
51
50
|
const { meta } = useGoogleDriveContext();
|
|
52
|
-
const
|
|
51
|
+
const selectionContext = useDriveSelectionContext();
|
|
53
52
|
|
|
54
53
|
/**
|
|
55
54
|
* Table
|
|
@@ -57,11 +56,12 @@ export function GoogleDriveViewProvider<TData extends GoogleDriveNode = GoogleDr
|
|
|
57
56
|
const config = createTableConfig<TData>({
|
|
58
57
|
queryData,
|
|
59
58
|
columns,
|
|
59
|
+
getRowId: (row) => row.id,
|
|
60
60
|
strategy,
|
|
61
61
|
commands,
|
|
62
62
|
meta,
|
|
63
63
|
columnVisibility,
|
|
64
|
-
selection,
|
|
64
|
+
selection: selectionContext?.selection,
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
return (
|
|
@@ -108,12 +108,7 @@ function GoogleDriveGrid(props: ComponentProps<"div">) {
|
|
|
108
108
|
<DriveGrid {...props}>
|
|
109
109
|
{queryData.length > 0 ? (
|
|
110
110
|
queryData.map((node) => (
|
|
111
|
-
<DriveGridCard
|
|
112
|
-
key={node.id}
|
|
113
|
-
node={node}
|
|
114
|
-
commands={commands}
|
|
115
|
-
imageLoader={googleDriveImageLoader}
|
|
116
|
-
/>
|
|
111
|
+
<DriveGridCard key={node.id} node={node} commands={commands} unoptimized />
|
|
117
112
|
))
|
|
118
113
|
) : (
|
|
119
114
|
<DriveGridEmpty title="Geen resultaten gevonden" />
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Readable } from "node:stream";
|
|
2
2
|
import type { ObjectBodyInput } from "@tulip-systems/core/storage";
|
|
3
|
-
import type { ImageLoaderProps } from "next/image";
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* Escapes dynamic values before interpolating them into Google Drive `q` strings.
|
|
@@ -36,11 +35,3 @@ export function toGoogleDriveReadable(body: ObjectBodyInput) {
|
|
|
36
35
|
if (typeof body === "string") return Readable.from([body]);
|
|
37
36
|
return Readable.from([body]);
|
|
38
37
|
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Use Google-provided thumbnail URLs directly instead of routing them through
|
|
42
|
-
* the Next.js optimizer.
|
|
43
|
-
*/
|
|
44
|
-
export function googleDriveImageLoader({ src }: ImageLoaderProps) {
|
|
45
|
-
return src;
|
|
46
|
-
}
|
|
@@ -514,9 +514,7 @@ export class GoogleDrive<TSchema extends TDatabaseSchema>
|
|
|
514
514
|
|
|
515
515
|
const nextSeen = new Set([...seen, node.id]);
|
|
516
516
|
const currentChild = {
|
|
517
|
-
|
|
518
|
-
type: node.type,
|
|
519
|
-
parentId: node.parentId,
|
|
517
|
+
...node,
|
|
520
518
|
depth: current.depth,
|
|
521
519
|
} satisfies GoogleDriveNodeChild;
|
|
522
520
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
|
|
4
4
|
import type { DefaultError, MutationOptions } from "@tanstack/react-query";
|
|
5
5
|
import {
|
|
6
6
|
CommandFormDialog,
|
|
@@ -49,7 +49,7 @@ export function LocalDriveFileUpdateCommand<
|
|
|
49
49
|
mutation,
|
|
50
50
|
}: LocalDriveFileUpdateCommandProps<TData, TError, TVariables, TOnMutateResult>) {
|
|
51
51
|
const form = useForm<UpdateLocalDriveNodeInput>({
|
|
52
|
-
resolver:
|
|
52
|
+
resolver: standardSchemaResolver(updateLocalDriveNodeInputSchema),
|
|
53
53
|
defaultValues,
|
|
54
54
|
});
|
|
55
55
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
|
|
4
4
|
import type { DefaultError, MutationOptions } from "@tanstack/react-query";
|
|
5
5
|
import {
|
|
6
6
|
CommandFormDialog,
|
|
@@ -56,7 +56,7 @@ export function LocalDriveFoldersCreateCommand<
|
|
|
56
56
|
const [{ parentId }] = useQueryStates(driveTreeSearchParams);
|
|
57
57
|
|
|
58
58
|
const form = useForm<CreateLocalDriveFolderInput>({
|
|
59
|
-
resolver:
|
|
59
|
+
resolver: standardSchemaResolver(createLocalDriveFolderInputSchema),
|
|
60
60
|
defaultValues: { ...defaultValues, parentId },
|
|
61
61
|
});
|
|
62
62
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { standardSchemaResolver } from "@hookform/resolvers/standard-schema";
|
|
4
4
|
import type { DefaultError, MutationOptions } from "@tanstack/react-query";
|
|
5
5
|
import {
|
|
6
6
|
CommandFormDialog,
|
|
@@ -49,7 +49,7 @@ export function LocalDriveFoldersUpdateCommand<
|
|
|
49
49
|
mutation,
|
|
50
50
|
}: LocalDriveFoldersUpdateCommandProps<TData, TError, TVariables, TOnMutateResult>) {
|
|
51
51
|
const form = useForm<UpdateLocalDriveNodeInput>({
|
|
52
|
-
resolver:
|
|
52
|
+
resolver: standardSchemaResolver(updateLocalDriveNodeInputSchema),
|
|
53
53
|
defaultValues,
|
|
54
54
|
});
|
|
55
55
|
|
|
@@ -33,7 +33,7 @@ type LocalDriveViewProviderProps<TData extends LocalDriveNodeWithAsset = LocalDr
|
|
|
33
33
|
queryData: TData[];
|
|
34
34
|
columns?: TableColumnDef<TData>[];
|
|
35
35
|
strategy: ReturnType<typeof useInfiniteStrategy>;
|
|
36
|
-
commands?: CommandDef
|
|
36
|
+
commands?: CommandDef[];
|
|
37
37
|
columnVisibility?: VisibilityState;
|
|
38
38
|
};
|
|
39
39
|
|
|
@@ -49,16 +49,17 @@ export function LocalDriveViewProvider<
|
|
|
49
49
|
...props
|
|
50
50
|
}: LocalDriveViewProviderProps<TData>) {
|
|
51
51
|
const { meta } = useLocalDriveContext();
|
|
52
|
-
const
|
|
52
|
+
const selectionContext = useDriveSelectionContext();
|
|
53
53
|
|
|
54
54
|
const config = createTableConfig<TData>({
|
|
55
55
|
queryData,
|
|
56
56
|
columns,
|
|
57
|
+
getRowId: (row) => row.id,
|
|
57
58
|
strategy,
|
|
58
59
|
commands,
|
|
59
60
|
meta,
|
|
60
61
|
columnVisibility,
|
|
61
|
-
selection,
|
|
62
|
+
selection: selectionContext?.selection,
|
|
62
63
|
});
|
|
63
64
|
|
|
64
65
|
return (
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createTableQuerySortingParser } from "@tulip-systems/core/data-tables/server";
|
|
2
|
+
import { asc, getTableColumns } from "drizzle-orm";
|
|
3
|
+
import { nodes } from "../lib/schema";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Local Drive specific sorting config
|
|
7
|
+
*/
|
|
8
|
+
const localDriveTableQuerySortingConfig = getTableColumns(nodes);
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Local Drive specific sorting parser
|
|
12
|
+
*/
|
|
13
|
+
export const parseLocalDriveTableQuerySorting = createTableQuerySortingParser(
|
|
14
|
+
localDriveTableQuerySortingConfig,
|
|
15
|
+
{ fallback: asc(nodes.createdAt) },
|
|
16
|
+
);
|
|
@@ -2,7 +2,6 @@ import stream from "node:stream/consumers";
|
|
|
2
2
|
import type { TDatabaseSchema } from "@tulip-systems/core/config";
|
|
3
3
|
import type { TableQueryResponse } from "@tulip-systems/core/data-tables/server";
|
|
4
4
|
import {
|
|
5
|
-
convertOrderByToQueryParams,
|
|
6
5
|
convertSearchToQueryParams,
|
|
7
6
|
createTableQueryResponse,
|
|
8
7
|
} from "@tulip-systems/core/data-tables/server";
|
|
@@ -11,18 +10,7 @@ import { ServerError } from "@tulip-systems/core/router/server";
|
|
|
11
10
|
import { type ObjectBodyInput, storageAssets } from "@tulip-systems/core/storage";
|
|
12
11
|
import type { Storage } from "@tulip-systems/core/storage/server";
|
|
13
12
|
import { addSeconds } from "date-fns";
|
|
14
|
-
import {
|
|
15
|
-
and,
|
|
16
|
-
asc,
|
|
17
|
-
desc,
|
|
18
|
-
eq,
|
|
19
|
-
getTableColumns,
|
|
20
|
-
inArray,
|
|
21
|
-
isNotNull,
|
|
22
|
-
isNull,
|
|
23
|
-
type SQL,
|
|
24
|
-
sql,
|
|
25
|
-
} from "drizzle-orm";
|
|
13
|
+
import { and, eq, getTableColumns, inArray, isNotNull, isNull, sql } from "drizzle-orm";
|
|
26
14
|
import { after } from "next/server";
|
|
27
15
|
import type { QueryResult } from "pg";
|
|
28
16
|
import type {
|
|
@@ -34,6 +22,7 @@ import type {
|
|
|
34
22
|
DriveReader,
|
|
35
23
|
DriveReadonly,
|
|
36
24
|
} from "../../../lib/contracts";
|
|
25
|
+
import { parseLocalDriveTableQuerySorting } from "../config/sorting";
|
|
37
26
|
import { deviceSizes } from "./constants";
|
|
38
27
|
import {
|
|
39
28
|
inferLocalDriveNodeSubtype,
|
|
@@ -221,7 +210,7 @@ export class LocalDrive<TSchema extends TDatabaseSchema>
|
|
|
221
210
|
filters,
|
|
222
211
|
...query
|
|
223
212
|
}: GetLocalDriveNodesByParentIdInput): Promise<LocalDriveNode[]> {
|
|
224
|
-
const orderBy =
|
|
213
|
+
const orderBy = parseLocalDriveTableQuerySorting.parse(query);
|
|
225
214
|
const search = convertSearchToQueryParams(query, [nodes.name]);
|
|
226
215
|
const archivedFilter =
|
|
227
216
|
filters.isArchived === true
|
|
@@ -247,7 +236,7 @@ export class LocalDrive<TSchema extends TDatabaseSchema>
|
|
|
247
236
|
search,
|
|
248
237
|
),
|
|
249
238
|
)
|
|
250
|
-
.orderBy(orderBy
|
|
239
|
+
.orderBy(...orderBy);
|
|
251
240
|
|
|
252
241
|
return items.map(toLocalDriveNode);
|
|
253
242
|
}
|
|
@@ -265,7 +254,7 @@ export class LocalDrive<TSchema extends TDatabaseSchema>
|
|
|
265
254
|
filters,
|
|
266
255
|
...query
|
|
267
256
|
}: ListLocalDriveTreeSchema): Promise<TableQueryResponse<LocalDriveNodeWithAsset>> {
|
|
268
|
-
const orderBy =
|
|
257
|
+
const orderBy = parseLocalDriveTableQuerySorting.parse(query);
|
|
269
258
|
const search = convertSearchToQueryParams(query, [nodes.name]);
|
|
270
259
|
|
|
271
260
|
const archivedFilter =
|
|
@@ -303,7 +292,7 @@ export class LocalDrive<TSchema extends TDatabaseSchema>
|
|
|
303
292
|
.from(nodes)
|
|
304
293
|
.where(where)
|
|
305
294
|
.leftJoin(storageAssets, eq(nodes.assetId, storageAssets.id))
|
|
306
|
-
.orderBy(orderBy
|
|
295
|
+
.orderBy(...orderBy)
|
|
307
296
|
.limit(limit)
|
|
308
297
|
.offset(offset);
|
|
309
298
|
|
|
@@ -331,7 +320,7 @@ export class LocalDrive<TSchema extends TDatabaseSchema>
|
|
|
331
320
|
filters,
|
|
332
321
|
...query
|
|
333
322
|
}: ListLocalDriveFlatSchema): Promise<TableQueryResponse<LocalDriveNodeWithAsset>> {
|
|
334
|
-
const orderBy =
|
|
323
|
+
const orderBy = parseLocalDriveTableQuerySorting.parse(query);
|
|
335
324
|
const search = convertSearchToQueryParams(query, [nodes.name]);
|
|
336
325
|
const archivedFilter =
|
|
337
326
|
filters.isArchived === true
|
|
@@ -363,7 +352,7 @@ export class LocalDrive<TSchema extends TDatabaseSchema>
|
|
|
363
352
|
.from(nodes)
|
|
364
353
|
.where(where)
|
|
365
354
|
.leftJoin(storageAssets, eq(nodes.assetId, storageAssets.id))
|
|
366
|
-
.orderBy(orderBy
|
|
355
|
+
.orderBy(...orderBy)
|
|
367
356
|
.limit(limit)
|
|
368
357
|
.offset(offset);
|
|
369
358
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"content.d.mts","names":[],"sources":["../../src/components/content.tsx"],"mappings":";;;;;;;iBAMgB,YAAA,CAAA;EAAe,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"content.mjs","names":[],"sources":["../../src/components/content.tsx"],"sourcesContent":["import { cn } from \"@tulip-systems/core/lib\";\nimport type { ComponentProps } from \"react\";\n\n/**\n * Drive Content\n */\nexport function DriveContent({ className, ...props }: ComponentProps<\"div\">) {\n return (\n <div {...props} className={cn(\"space-y-6\", className)}>\n {props.children}\n </div>\n );\n}\n"],"mappings":";;;;;;;AAMA,SAAgB,aAAa,EAAE,WAAW,GAAG,SAAgC;AAC3E,QACE,oBAAC;EAAI,GAAI;EAAO,WAAW,GAAG,aAAa,UAAU;YAClD,MAAM;GACH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.client.d.mts","names":[],"sources":["../../src/components/context.client.tsx"],"mappings":";;;;;AAOA;KAAY,iBAAA;EACV,SAAA;EACA,UAAA,GAAa,UAAA;EACb,IAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dnd.client.d.mts","names":[],"sources":["../../src/components/dnd.client.tsx"],"mappings":";;;;;;;KAUY,0BAAA,GAA6B,iBAAA;EACvC,QAAA;EACA,MAAA,IAAU,KAAA;IAAS,EAAA;IAAY,QAAA;EAAA;AAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dnd.client.mjs","names":[],"sources":["../../src/components/dnd.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { PointerActivationConstraints, PointerSensor } from \"@dnd-kit/dom\";\nimport { DragDropProvider } from \"@dnd-kit/react\";\nimport type { PropsWithChildren } from \"react\";\n\n/**\n * DriveViewProvider\n */\n\nexport type DriveDragDropProviderProps = PropsWithChildren<{\n disabled?: boolean;\n onMove?: (input: { id: string; parentId: string | null }) => void;\n}>;\n\nexport function DriveDragDropProvider(props: DriveDragDropProviderProps) {\n return (\n <DragDropProvider\n sensors={(defaults) => [\n ...defaults,\n PointerSensor.configure({\n activationConstraints: [\n // Start dragging after moving 35 pixels to prevent accidental drags when clicking\n new PointerActivationConstraints.Distance({ value: 35 }),\n ],\n }),\n ]}\n onDragEnd={(event) => {\n if (props.disabled) return;\n\n const { operation, canceled } = event;\n const { source, target } = operation;\n\n if (!source || !target || canceled) return;\n\n const id = source.id.toString();\n const parentId = target.id.toString() === \"drive\" ? null : target.id.toString();\n\n if (id === parentId) return;\n\n props.onMove?.({ id, parentId });\n }}\n >\n {props.children}\n </DragDropProvider>\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,sBAAsB,OAAmC;AACvE,QACE,oBAAC;EACC,UAAU,aAAa,CACrB,GAAG,UACH,cAAc,UAAU,EACtB,uBAAuB,CAErB,IAAI,6BAA6B,SAAS,EAAE,OAAO,IAAI,CAAC,CACzD,EACF,CAAC,CACH;EACD,YAAY,UAAU;AACpB,OAAI,MAAM,SAAU;GAEpB,MAAM,EAAE,WAAW,aAAa;GAChC,MAAM,EAAE,QAAQ,WAAW;AAE3B,OAAI,CAAC,UAAU,CAAC,UAAU,SAAU;GAEpC,MAAM,KAAK,OAAO,GAAG,UAAU;GAC/B,MAAM,WAAW,OAAO,GAAG,UAAU,KAAK,UAAU,OAAO,OAAO,GAAG,UAAU;AAE/E,OAAI,OAAO,SAAU;AAErB,SAAM,SAAS;IAAE;IAAI;IAAU,CAAC;;YAGjC,MAAM;GACU"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grid-card.client.d.mts","names":[],"sources":["../../src/components/grid-card.client.tsx"],"mappings":";;;;;;;;;;KA6BK,kBAAA,eAAiC,SAAA,IAAa,cAAA;EACjD,IAAA,EAAM,KAAA;EACN,QAAA,GAAW,UAAA,CAAW,KAAA;EACtB,WAAA,IAAe,KAAA,EAAO,gBAAA;AAAA;AAAA,iBAGR,aAAA,eAA4B,SAAA,CAAA,CAAW,KAAA,EAAO,kBAAA,CAAmB,KAAA,IAAM,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAmBvE,mBAAA,eAAkC,SAAA,CAAA,CAAA;EAChD,IAAA;EACA,QAAA;EACA,aAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,kBAAA,CAAmB,KAAA,IAAM,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAkFZ,iBAAA,eAAgC,SAAA,CAAA,CAAA;EAC9C,IAAA;EACA,QAAA;EACA,WAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,kBAAA,CAAmB,KAAA,IAAM,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAmGZ,qBAAA,CAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grid-card.client.mjs","names":[],"sources":["../../src/components/grid-card.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { useDraggable, useDroppable } from \"@dnd-kit/react\";\nimport type { CommandDef } from \"@tulip-systems/core/commands\";\nimport {\n ContextCommandMenu,\n ContextCommandMenuContent,\n ContextCommandMenuTrigger,\n DropdownCommandMenu,\n} from \"@tulip-systems/core/commands/client\";\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n findStatus,\n Skeleton,\n} from \"@tulip-systems/core/components\";\nimport { FolderIcon } from \"lucide-react\";\nimport Image, { type ImageLoaderProps } from \"next/image\";\nimport { useRouter } from \"next/navigation\";\nimport type { ComponentProps } from \"react\";\nimport { nodeSubtypeConfig, nodeSubtypeVariants } from \"@/config/types\";\nimport type { DriveNode } from \"@/lib/dto\";\nimport { useDriveSelectionContext } from \"./selection.client\";\n\n/**\n * Drive Grid Card\n */\ntype DriveGridCardProps<TData extends DriveNode> = ComponentProps<\"div\"> & {\n node: TData;\n commands?: CommandDef<TData>[];\n imageLoader?: (props: ImageLoaderProps) => string;\n};\n\nexport function DriveGridCard<TData extends DriveNode>(props: DriveGridCardProps<TData>) {\n if (props.node.availability === \"pending\") {\n return <DriveGridCardSkeleton {...props} />;\n }\n\n if (props.node.type === \"folder\") {\n return <DriveGridFolderCard {...props} />;\n }\n\n if (props.node.type === \"file\") {\n return <DriveGridFileCard {...props} />;\n }\n\n return null;\n}\n\n/**\n * Folder card\n */\nexport function DriveGridFolderCard<TData extends DriveNode>({\n node,\n commands,\n onDoubleClick,\n className,\n ...props\n}: DriveGridCardProps<TData>) {\n const { id } = node;\n\n const router = useRouter();\n\n const { selection, selectionConditions } = useDriveSelectionContext();\n\n const droppable = useDroppable({ id: node.id });\n const draggable = useDraggable({ id: node.id });\n\n if (node.hidden) return null;\n\n return (\n <ContextCommandMenu>\n <ContextCommandMenuTrigger asChild>\n <Card\n {...props}\n key={id}\n ref={draggable.ref}\n data-selected={selection?.rowSelection?.[id]}\n data-dragging={draggable.isDragging}\n className=\"group @container relative flex max-h-48 max-w-full cursor-pointer flex-col items-center gap-2 overflow-hidden bg-transparent p-2 hover:bg-muted/70 active:bg-muted data-[selected=true]:bg-primary/30 data-[dragging=true]:opacity-50\"\n onClick={() => {\n const conditions = selectionConditions?.(node);\n\n if (conditions !== undefined) {\n const canSelect = Array.isArray(conditions)\n ? conditions.some((condition) => condition)\n : conditions;\n\n if (!canSelect) return;\n }\n\n const isSelected = selection?.rowSelection?.[id];\n\n if (!isSelected) {\n selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));\n } else {\n selection?.setRowSelection?.((old) => {\n const newSelection = { ...old };\n delete newSelection[id];\n return newSelection;\n });\n }\n }}\n onDoubleClick={() => router.push(`?parentId=${id}`)}\n >\n <div\n ref={droppable.ref}\n data-over={droppable.isDropTarget && !draggable.isDragging}\n className=\"absolute inset-0 -z-10 data-[over=true]:bg-primary/35\"\n />\n\n <CardHeader className=\"flex w-full flex-row items-center justify-between gap-2.5 p-0 px-1.5\">\n <FolderIcon className=\"my-1.5 size-4 fill-foreground\" />\n\n <CardTitle\n className=\"line-clamp-2 w-full break-all text-xs leading-[1.2]\"\n title={node.name}\n >\n {node.name}\n </CardTitle>\n\n {commands && <DropdownCommandMenu data={node} commands={commands} />}\n </CardHeader>\n\n <CardContent className=\"h-48 w-full overflow-hidden rounded-lg bg-background p-0 group-hover:bg-background\">\n <div className=\"flex h-full w-full items-center justify-center\">\n <FolderIcon className=\"size-12 fill-foreground\" />\n </div>\n </CardContent>\n </Card>\n </ContextCommandMenuTrigger>\n\n {commands && <ContextCommandMenuContent data={node} commands={commands} />}\n </ContextCommandMenu>\n );\n}\n\n/**\n * File card\n */\nexport function DriveGridFileCard<TData extends DriveNode>({\n node,\n commands,\n imageLoader,\n className,\n ...props\n}: DriveGridCardProps<TData>) {\n const { id } = node;\n\n const { ref, isDragging } = useDraggable({ id });\n const { selection, selectionConditions } = useDriveSelectionContext();\n\n const subtype = findStatus(nodeSubtypeConfig, node.subtype);\n const Icon = subtype?.icon;\n const fileUrl = node.links.view ?? node.links.download;\n const imageUrl = node.links.thumbnail ?? node.links.preview;\n if (node.hidden) return null;\n\n return (\n <ContextCommandMenu>\n <ContextCommandMenuTrigger asChild>\n <Card\n {...props}\n key={id}\n ref={ref}\n data-selected={selection?.rowSelection?.[id]}\n data-dragging={isDragging}\n className=\"@container flex max-h-48 max-w-full cursor-pointer flex-col items-center gap-2 overflow-hidden p-2 hover:bg-muted/70 active:bg-muted data-[selected=true]:bg-primary/30 data-[dragging=true]:opacity-50\"\n onClick={() => {\n const conditions = selectionConditions?.(node);\n\n if (conditions !== undefined) {\n const canSelect = Array.isArray(conditions)\n ? conditions.some((condition) => condition)\n : conditions;\n\n if (!canSelect) return;\n }\n\n const isSelected = selection?.rowSelection?.[id];\n\n if (!isSelected) {\n selection?.setRowSelection?.((old) => ({ ...old, [id]: true }));\n } else {\n selection?.setRowSelection?.((old) => {\n const newSelection = { ...old };\n delete newSelection[id];\n return newSelection;\n });\n }\n }}\n onDoubleClick={() => window.open(fileUrl ?? \"\", \"_blank\", \"noopener,noreferrer\")}\n >\n <CardHeader className=\"flex w-full flex-row items-center justify-between gap-2 p-0 px-1.5\">\n {Icon && (\n <Icon\n className={nodeSubtypeVariants({\n status: node.subtype,\n className: \"my-1.5 size-4\",\n })}\n />\n )}\n\n <CardTitle\n className=\"line-clamp-2 w-full break-all text-xs leading-[1.2]\"\n title={node.name}\n >\n {node.name}\n </CardTitle>\n\n {commands && <DropdownCommandMenu data={node} commands={commands} />}\n </CardHeader>\n\n <CardContent className=\"h-48 w-full overflow-hidden rounded-lg bg-background p-0\">\n {node.subtype === \"image\" ? (\n <Image\n src={imageUrl ?? fileUrl ?? \"\"}\n alt={node.name}\n width={200}\n height={200}\n loader={imageLoader}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n {Icon && (\n <Icon\n className={nodeSubtypeVariants({ status: node.subtype, className: \"size-12\" })}\n />\n )}\n </div>\n )}\n </CardContent>\n </Card>\n </ContextCommandMenuTrigger>\n\n {commands && <ContextCommandMenuContent data={node} commands={commands} />}\n </ContextCommandMenu>\n );\n}\n\n/**\n * Card Skeleton\n */\n\nexport function DriveGridCardSkeleton() {\n return (\n <Card className=\"flex max-h-52 cursor-pointer flex-col items-center gap-3 overflow-hidden bg-muted/70 p-3\">\n <Skeleton className=\"h-7\" />\n <CardContent className=\"h-52 w-full overflow-hidden rounded-lg bg-background p-0\" />\n </Card>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;AAmCA,SAAgB,cAAuC,OAAkC;AACvF,KAAI,MAAM,KAAK,iBAAiB,UAC9B,QAAO,oBAAC,yBAAsB,GAAI,QAAS;AAG7C,KAAI,MAAM,KAAK,SAAS,SACtB,QAAO,oBAAC,uBAAoB,GAAI,QAAS;AAG3C,KAAI,MAAM,KAAK,SAAS,OACtB,QAAO,oBAAC,qBAAkB,GAAI,QAAS;AAGzC,QAAO;;;;;AAMT,SAAgB,oBAA6C,EAC3D,MACA,UACA,eACA,WACA,GAAG,SACyB;CAC5B,MAAM,EAAE,OAAO;CAEf,MAAM,SAAS,WAAW;CAE1B,MAAM,EAAE,WAAW,wBAAwB,0BAA0B;CAErE,MAAM,YAAY,aAAa,EAAE,IAAI,KAAK,IAAI,CAAC;CAC/C,MAAM,YAAY,aAAa,EAAE,IAAI,KAAK,IAAI,CAAC;AAE/C,KAAI,KAAK,OAAQ,QAAO;AAExB,QACE,qBAAC,iCACC,oBAAC;EAA0B;YACzB,8BAAC;GACC,GAAI;GACJ,KAAK;GACL,KAAK,UAAU;GACf,iBAAe,WAAW,eAAe;GACzC,iBAAe,UAAU;GACzB,WAAU;GACV,eAAe;IACb,MAAM,aAAa,sBAAsB,KAAK;AAE9C,QAAI,eAAe,QAKjB;SAAI,EAJc,MAAM,QAAQ,WAAW,GACvC,WAAW,MAAM,cAAc,UAAU,GACzC,YAEY;;AAKlB,QAAI,CAFe,WAAW,eAAe,IAG3C,YAAW,mBAAmB,SAAS;KAAE,GAAG;MAAM,KAAK;KAAM,EAAE;QAE/D,YAAW,mBAAmB,QAAQ;KACpC,MAAM,eAAe,EAAE,GAAG,KAAK;AAC/B,YAAO,aAAa;AACpB,YAAO;MACP;;GAGN,qBAAqB,OAAO,KAAK,aAAa,KAAK;KAEnD,oBAAC;GACC,KAAK,UAAU;GACf,aAAW,UAAU,gBAAgB,CAAC,UAAU;GAChD,WAAU;IACV,EAEF,qBAAC;GAAW,WAAU;;IACpB,oBAAC,cAAW,WAAU,kCAAkC;IAExD,oBAAC;KACC,WAAU;KACV,OAAO,KAAK;eAEX,KAAK;MACI;IAEX,YAAY,oBAAC;KAAoB,MAAM;KAAgB;MAAY;;IACzD,EAEb,oBAAC;GAAY,WAAU;aACrB,oBAAC;IAAI,WAAU;cACb,oBAAC,cAAW,WAAU,4BAA4B;KAC9C;IACM,CACT;GACmB,EAE3B,YAAY,oBAAC;EAA0B,MAAM;EAAgB;GAAY,IACvD;;;;;AAOzB,SAAgB,kBAA2C,EACzD,MACA,UACA,aACA,WACA,GAAG,SACyB;CAC5B,MAAM,EAAE,OAAO;CAEf,MAAM,EAAE,KAAK,eAAe,aAAa,EAAE,IAAI,CAAC;CAChD,MAAM,EAAE,WAAW,wBAAwB,0BAA0B;CAGrE,MAAM,OADU,WAAW,mBAAmB,KAAK,QAAQ,EACrC;CACtB,MAAM,UAAU,KAAK,MAAM,QAAQ,KAAK,MAAM;CAC9C,MAAM,WAAW,KAAK,MAAM,aAAa,KAAK,MAAM;AACpD,KAAI,KAAK,OAAQ,QAAO;AAExB,QACE,qBAAC,iCACC,oBAAC;EAA0B;YACzB,8BAAC;GACC,GAAI;GACJ,KAAK;GACA;GACL,iBAAe,WAAW,eAAe;GACzC,iBAAe;GACf,WAAU;GACV,eAAe;IACb,MAAM,aAAa,sBAAsB,KAAK;AAE9C,QAAI,eAAe,QAKjB;SAAI,EAJc,MAAM,QAAQ,WAAW,GACvC,WAAW,MAAM,cAAc,UAAU,GACzC,YAEY;;AAKlB,QAAI,CAFe,WAAW,eAAe,IAG3C,YAAW,mBAAmB,SAAS;KAAE,GAAG;MAAM,KAAK;KAAM,EAAE;QAE/D,YAAW,mBAAmB,QAAQ;KACpC,MAAM,eAAe,EAAE,GAAG,KAAK;AAC/B,YAAO,aAAa;AACpB,YAAO;MACP;;GAGN,qBAAqB,OAAO,KAAK,WAAW,IAAI,UAAU,sBAAsB;KAEhF,qBAAC;GAAW,WAAU;;IACnB,QACC,oBAAC,QACC,WAAW,oBAAoB;KAC7B,QAAQ,KAAK;KACb,WAAW;KACZ,CAAC,GACF;IAGJ,oBAAC;KACC,WAAU;KACV,OAAO,KAAK;eAEX,KAAK;MACI;IAEX,YAAY,oBAAC;KAAoB,MAAM;KAAgB;MAAY;;IACzD,EAEb,oBAAC;GAAY,WAAU;aACpB,KAAK,YAAY,UAChB,oBAAC;IACC,KAAK,YAAY,WAAW;IAC5B,KAAK,KAAK;IACV,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,WAAU;KACV,GAEF,oBAAC;IAAI,WAAU;cACZ,QACC,oBAAC,QACC,WAAW,oBAAoB;KAAE,QAAQ,KAAK;KAAS,WAAW;KAAW,CAAC,GAC9E;KAEA;IAEI,CACT;GACmB,EAE3B,YAAY,oBAAC;EAA0B,MAAM;EAAgB;GAAY,IACvD;;;;;AAQzB,SAAgB,wBAAwB;AACtC,QACE,qBAAC;EAAK,WAAU;aACd,oBAAC,YAAS,WAAU,QAAQ,EAC5B,oBAAC,eAAY,WAAU,6DAA6D;GAC/E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grid.client.d.mts","names":[],"sources":["../../src/components/grid.client.tsx"],"mappings":";;;;;;;KAWY,cAAA,GAAiB,cAAA;AAAA,iBAEb,SAAA,CAAA;EAAY,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;KAerD,mBAAA,GAAsB,cAAA;EAChC,KAAA,GAAQ,SAAA;EACR,WAAA,GAAc,SAAA;AAAA;AAAA,iBAGA,cAAA,CAAA;EACd,KAAA;EACA,WAAA;EACA,SAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,mBAAA,GAAmB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;KAYV,qBAAA,GAAwB,cAAA;AAAA,iBAEpB,gBAAA,CAAA;EAAmB,SAAA;EAAA,GAAc;AAAA,GAAS,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;KAa1E,uBAAA,GAA0B,cAAA;EAC7B,WAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;AAAA;AAAA,iBAGc,kBAAA,CAAA;EACd,WAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,SAAA;EAAA,GACG;AAAA,GACF,uBAAA,GAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"grid.client.mjs","names":[],"sources":["../../src/components/grid.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { EmptyDescription, EmptyPage, EmptyPageTitle } from \"@tulip-systems/core/components\";\nimport { cn } from \"@tulip-systems/core/lib\";\nimport { useInView } from \"motion/react\";\nimport { type ComponentProps, type ReactNode, useEffect, useRef } from \"react\";\nimport { DriveGridCardSkeleton } from \"./grid-card.client\";\n\n/**\n * Layout primitive for drive grid content.\n */\nexport type DriveGridProps = ComponentProps<\"div\">;\n\nexport function DriveGrid({ className, ...props }: DriveGridProps) {\n return (\n <div\n {...props}\n className={cn(\n \"grid grid-cols-1 gap-5 md:grid-cols-[repeat(auto-fill,minmax(13rem,1fr))]\",\n className,\n )}\n />\n );\n}\n\n/**\n * Empty state that spans the full grid.\n */\nexport type DriveGridEmptyProps = ComponentProps<\"div\"> & {\n title?: ReactNode;\n description?: ReactNode;\n};\n\nexport function DriveGridEmpty({\n title,\n description,\n className,\n children,\n ...props\n}: DriveGridEmptyProps) {\n return (\n <EmptyPage {...props} className={cn(\"col-span-full min-h-[80dvh]\", className)}>\n <EmptyPageTitle>{title}</EmptyPageTitle>\n {description && <EmptyDescription>{description}</EmptyDescription>}\n </EmptyPage>\n );\n}\n\n/**\n * Skeleton grid for page-level loading states.\n */\nexport type DriveGridLoadingProps = ComponentProps<\"div\">;\n\nexport function DriveGridLoading({ className, ...props }: DriveGridLoadingProps) {\n return (\n <DriveGrid {...props}>\n {Array.from({ length: 12 }).map((_, index) => (\n <DriveGridCardSkeleton key={index} />\n ))}\n </DriveGrid>\n );\n}\n\n/**\n * Infinite table bottombar\n */\ntype DriveGridBottombarProps = ComponentProps<\"div\"> & {\n hasNextPage: boolean;\n fetchNextPage: () => void;\n isFetching: boolean;\n isFetchingNextPage: boolean;\n};\n\nexport function DriveGridBottombar({\n hasNextPage,\n fetchNextPage,\n isFetching,\n isFetchingNextPage,\n className,\n ...props\n}: DriveGridBottombarProps) {\n const scrollRef = useRef(null);\n const isInView = useInView(scrollRef);\n\n useEffect(() => {\n if (isInView && hasNextPage && !isFetching && !isFetchingNextPage) {\n fetchNextPage();\n }\n }, [isInView, fetchNextPage, hasNextPage, isFetching, isFetchingNextPage]);\n\n return (\n <div {...props} className={cn(\"relative col-span-full\", className)}>\n <div ref={scrollRef} className=\"absolute bottom-0 -z-50 min-h-[500px] bg-primary\" />\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAgB,UAAU,EAAE,WAAW,GAAG,SAAyB;AACjE,QACE,oBAAC;EACC,GAAI;EACJ,WAAW,GACT,6EACA,UACD;GACD;;AAYN,SAAgB,eAAe,EAC7B,OACA,aACA,WACA,UACA,GAAG,SACmB;AACtB,QACE,qBAAC;EAAU,GAAI;EAAO,WAAW,GAAG,+BAA+B,UAAU;aAC3E,oBAAC,4BAAgB,QAAuB,EACvC,eAAe,oBAAC,8BAAkB,cAA+B;GACxD;;AAShB,SAAgB,iBAAiB,EAAE,WAAW,GAAG,SAAgC;AAC/E,QACE,oBAAC;EAAU,GAAI;YACZ,MAAM,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,UAClC,oBAAC,2BAA2B,MAAS,CACrC;GACQ;;AAchB,SAAgB,mBAAmB,EACjC,aACA,eACA,YACA,oBACA,WACA,GAAG,SACuB;CAC1B,MAAM,YAAY,OAAO,KAAK;CAC9B,MAAM,WAAW,UAAU,UAAU;AAErC,iBAAgB;AACd,MAAI,YAAY,eAAe,CAAC,cAAc,CAAC,mBAC7C,gBAAe;IAEhB;EAAC;EAAU;EAAe;EAAa;EAAY;EAAmB,CAAC;AAE1E,QACE,oBAAC;EAAI,GAAI;EAAO,WAAW,GAAG,0BAA0B,UAAU;YAChE,oBAAC;GAAI,KAAK;GAAW,WAAU;IAAqD;GAChF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumbs.client.d.mts","names":[],"sources":["../../../src/components/navigation/breadcrumbs.client.tsx"],"mappings":";;;;;;KAsBK,mBAAA;EACH,IAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,KAGG,mBAAA;EACH,IAAA;EACA,KAAA;EACA,IAAA;AAAA;AAAA,KAGU,eAAA,GAAkB,mBAAA,GAAsB,mBAAA;AAAA,KAExC,qBAAA;EACV,WAAA,GAAc,eAAA;AAAA;AAAA,iBAGA,gBAAA,CAAA;EAAmB;AAAA,GAAoB,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"breadcrumbs.client.mjs","names":[],"sources":["../../../src/components/navigation/breadcrumbs.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { pointerIntersection } from \"@dnd-kit/collision\";\nimport { useDroppable } from \"@dnd-kit/react\";\nimport { BreadcrumbItem, BreadcrumbLink, BreadcrumbPage } from \"@tulip-systems/core/components\";\nimport {\n HeaderBreadcrumbSeparator,\n HeaderBreadcrumbs,\n HeaderBreadcrumbsDesktopList,\n HeaderBreadcrumbsDropdownMenu,\n HeaderBreadcrumbsDropdownMenuItem,\n HeaderBreadcrumbsLink,\n HeaderBreadcrumbsMobileList,\n} from \"@tulip-systems/core/components/client\";\nimport Link from \"next/link\";\nimport { createSerializer, useQueryStates } from \"nuqs\";\nimport { Fragment } from \"react\";\nimport { driveTreeSearchParams } from \"@/entry\";\n\n/**\n * Drive Header Breadcrumbs\n */\ntype DriveNodeBreadcrumb = {\n node: true;\n label: string;\n parentId: string | null;\n};\n\ntype DriveHrefBreadcrumb = {\n node?: false;\n label: string;\n href: string;\n};\n\nexport type DriveBreadcrumb = DriveNodeBreadcrumb | DriveHrefBreadcrumb;\n\nexport type DriveBreadCrumbsProps = {\n breadcrumbs?: DriveBreadcrumb[];\n};\n\nexport function DriveBreadcrumbs({ breadcrumbs = [] }: DriveBreadCrumbsProps) {\n return (\n <HeaderBreadcrumbs>\n <HeaderBreadcrumbsMobileList>\n {breadcrumbs.length > 1 && (\n <>\n <HeaderBreadcrumbsDropdownMenu>\n {breadcrumbs.slice(0, -1).map((breadcrumb, index) => (\n <HeaderBreadcrumbsDropdownMenuItem key={index} breadcrumb={breadcrumb} />\n ))}\n </HeaderBreadcrumbsDropdownMenu>\n\n <HeaderBreadcrumbSeparator />\n </>\n )}\n\n {breadcrumbs.slice(-1).map((breadcrumb, index, array) => (\n <Fragment key={index}>\n <HeaderBreadcrumbsLink breadcrumb={breadcrumb} />\n {index < array.length - 1 && <HeaderBreadcrumbSeparator />}\n </Fragment>\n ))}\n </HeaderBreadcrumbsMobileList>\n\n <HeaderBreadcrumbsDesktopList>\n {breadcrumbs.length > 2 && (\n <>\n <HeaderBreadcrumbsDropdownMenu>\n {breadcrumbs.slice(0, -2).map((breadcrumb, index) => (\n <HeaderBreadcrumbsDropdownMenuItem key={index} breadcrumb={breadcrumb} />\n ))}\n </HeaderBreadcrumbsDropdownMenu>\n\n <HeaderBreadcrumbSeparator />\n </>\n )}\n\n {breadcrumbs.slice(-2).map((breadcrumb, index, array) => (\n <Fragment key={index}>\n {breadcrumb.node ? (\n <DriveHeaderBreadcrumbsLink breadcrumb={breadcrumb} />\n ) : (\n <HeaderBreadcrumbsLink breadcrumb={breadcrumb} />\n )}\n {index < array.length - 1 && <HeaderBreadcrumbSeparator />}\n </Fragment>\n ))}\n </HeaderBreadcrumbsDesktopList>\n </HeaderBreadcrumbs>\n );\n}\n\n/**\n * Drive Header Breadcrumbs Link with DnD support\n */\nfunction DriveHeaderBreadcrumbsLink(props: { breadcrumb: DriveNodeBreadcrumb }) {\n const id = props.breadcrumb.parentId ?? null;\n const [query] = useQueryStates(driveTreeSearchParams);\n const serialize = createSerializer(driveTreeSearchParams);\n\n const { ref, isDropTarget } = useDroppable({\n id: id ?? \"drive\",\n collisionDetector: pointerIntersection,\n });\n\n const href = serialize({ ...query, parentId: id });\n\n return (\n <BreadcrumbItem\n ref={ref}\n data-over={isDropTarget && query.parentId !== id}\n className=\"data-[over=true]:bg-primary/35\"\n >\n {href !== undefined && href !== null ? (\n <BreadcrumbLink asChild>\n <Link href={href || \"?\"} className=\"truncate\">\n {props.breadcrumb.label}\n </Link>\n </BreadcrumbLink>\n ) : (\n <BreadcrumbPage className=\"truncate\">{props.breadcrumb.label}</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAwCA,SAAgB,iBAAiB,EAAE,cAAc,EAAE,IAA2B;AAC5E,QACE,qBAAC,gCACC,qBAAC,0CACE,YAAY,SAAS,KACpB,8CACE,oBAAC,2CACE,YAAY,MAAM,GAAG,GAAG,CAAC,KAAK,YAAY,UACzC,oBAAC,qCAA0D,cAAnB,MAAiC,CACzE,GAC4B,EAEhC,oBAAC,8BAA4B,IAC5B,EAGJ,YAAY,MAAM,GAAG,CAAC,KAAK,YAAY,OAAO,UAC7C,qBAAC,uBACC,oBAAC,yBAAkC,aAAc,EAChD,QAAQ,MAAM,SAAS,KAAK,oBAAC,8BAA4B,KAF7C,MAGJ,CACX,IAC0B,EAE9B,qBAAC,2CACE,YAAY,SAAS,KACpB,8CACE,oBAAC,2CACE,YAAY,MAAM,GAAG,GAAG,CAAC,KAAK,YAAY,UACzC,oBAAC,qCAA0D,cAAnB,MAAiC,CACzE,GAC4B,EAEhC,oBAAC,8BAA4B,IAC5B,EAGJ,YAAY,MAAM,GAAG,CAAC,KAAK,YAAY,OAAO,UAC7C,qBAAC,uBACE,WAAW,OACV,oBAAC,8BAAuC,aAAc,GAEtD,oBAAC,yBAAkC,aAAc,EAElD,QAAQ,MAAM,SAAS,KAAK,oBAAC,8BAA4B,KAN7C,MAOJ,CACX,IAC2B,IACb;;;;;AAOxB,SAAS,2BAA2B,OAA4C;CAC9E,MAAM,KAAK,MAAM,WAAW,YAAY;CACxC,MAAM,CAAC,SAAS,eAAe,sBAAsB;CACrD,MAAM,YAAY,iBAAiB,sBAAsB;CAEzD,MAAM,EAAE,KAAK,iBAAiB,aAAa;EACzC,IAAI,MAAM;EACV,mBAAmB;EACpB,CAAC;CAEF,MAAM,OAAO,UAAU;EAAE,GAAG;EAAO,UAAU;EAAI,CAAC;AAElD,QACE,oBAAC;EACM;EACL,aAAW,gBAAgB,MAAM,aAAa;EAC9C,WAAU;YAET,SAAS,UAAa,SAAS,OAC9B,oBAAC;GAAe;aACd,oBAAC;IAAK,MAAM,QAAQ;IAAK,WAAU;cAChC,MAAM,WAAW;KACb;IACQ,GAEjB,oBAAC;GAAe,WAAU;aAAY,MAAM,WAAW;IAAuB;GAEjE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"header.client.d.mts","names":[],"sources":["../../../src/components/navigation/header.client.tsx"],"mappings":";;;;;;;;iBAegB,WAAA,CAAA;EAAc,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAWzD,sBAAA,CAAA;EAAyB;AAAA,GAAe,qBAAA,GAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAgB7D,gBAAA,CAAA;EAAmB,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"header.client.mjs","names":[],"sources":["../../../src/components/navigation/header.client.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n Header,\n HeaderTopbarBackButton,\n HeaderTopbarMobileNavSwitcher,\n Topbar,\n TopbarTools,\n} from \"@tulip-systems/core/components/client\";\nimport type { ComponentProps } from \"react\";\nimport { type DriveBreadCrumbsProps, DriveBreadcrumbs } from \"./breadcrumbs.client\";\n\n/**\n * Drive Header\n */\nexport function DriveHeader({ children, ...props }: ComponentProps<\"div\">) {\n return (\n <Header {...props}>\n <Topbar>{children}</Topbar>\n </Header>\n );\n}\n\n/**\n * Drive Header Breadcrumbs\n */\nexport function DriveHeaderBreadcrumbs({ breadcrumbs }: DriveBreadCrumbsProps) {\n return (\n <div className=\"flex h-full items-center gap-4\">\n <div className=\"h-full\">\n <HeaderTopbarBackButton />\n <HeaderTopbarMobileNavSwitcher />\n </div>\n\n <DriveBreadcrumbs breadcrumbs={breadcrumbs} />\n </div>\n );\n}\n\n/**\n * Drive Header Tools\n */\nexport function DriveHeaderTools({ children, ...props }: ComponentProps<\"div\">) {\n return <TopbarTools {...props}>{children}</TopbarTools>;\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAgB,YAAY,EAAE,UAAU,GAAG,SAAgC;AACzE,QACE,oBAAC;EAAO,GAAI;YACV,oBAAC,UAAQ,WAAkB;GACpB;;;;;AAOb,SAAgB,uBAAuB,EAAE,eAAsC;AAC7E,QACE,qBAAC;EAAI,WAAU;aACb,qBAAC;GAAI,WAAU;cACb,oBAAC,2BAAyB,EAC1B,oBAAC,kCAAgC;IAC7B,EAEN,oBAAC,oBAA8B,cAAe;GAC1C;;;;;AAOV,SAAgB,iBAAiB,EAAE,UAAU,GAAG,SAAgC;AAC9E,QAAO,oBAAC;EAAY,GAAI;EAAQ;GAAuB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar.client.d.mts","names":[],"sources":["../../../src/components/navigation/toolbar.client.tsx"],"mappings":";;;;;;;;iBASgB,YAAA,CAAA;EAAe,SAAA;EAAW,QAAA;EAAA,GAAa;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;iBAmBrE,iBAAA,CAAA;EAAoB,QAAA;EAAU,SAAA;EAAA,GAAc;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar.client.mjs","names":[],"sources":["../../../src/components/navigation/toolbar.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn } from \"@tulip-systems/core/lib\";\nimport type { ComponentProps } from \"react\";\nimport { DriveBreadcrumbs } from \"./breadcrumbs.client\";\n\n/**\n * Drive Page Topbar\n */\nexport function DriveToolbar({ className, children, ...props }: ComponentProps<\"div\">) {\n return (\n <div\n {...props}\n className={cn(\"flex items-center justify-between overflow-x-auto pt-3\", className)}\n >\n {children}\n </div>\n );\n}\n\n/**\n * Drive Toolbar Breadcrumbs\n */\nexport const DriveToolbarBreadcrumbs = DriveBreadcrumbs;\n\n/**\n * Drive Header Tools\n */\nexport function DriveToolbarTools({ children, className, ...props }: ComponentProps<\"div\">) {\n return (\n <div {...props} className={cn(\"flex h-full items-center justify-end gap-4\", className)}>\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,aAAa,EAAE,WAAW,UAAU,GAAG,SAAgC;AACrF,QACE,oBAAC;EACC,GAAI;EACJ,WAAW,GAAG,0DAA0D,UAAU;EAEjF;GACG;;;;;AAOV,MAAa,0BAA0B;;;;AAKvC,SAAgB,kBAAkB,EAAE,UAAU,WAAW,GAAG,SAAgC;AAC1F,QACE,oBAAC;EAAI,GAAI;EAAO,WAAW,GAAG,8CAA8C,UAAU;EACnF;GACG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"view-switcher.client.d.mts","names":[],"sources":["../../../src/components/navigation/view-switcher.client.tsx"],"mappings":";;;;;;iBASgB,iBAAA,CAAA,GAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"view-switcher.client.mjs","names":[],"sources":["../../../src/components/navigation/view-switcher.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { ToggleGroup, ToggleGroupItem } from \"@tulip-systems/core/components/client\";\nimport { LayoutGridIcon, StretchVerticalIcon } from \"lucide-react\";\nimport { type DriveViewMode, useDriveViewContext } from \"../view.client\";\n\n/**\n * Drive view switcher\n */\nexport function DriveViewSwitcher() {\n const { view, onViewChange } = useDriveViewContext();\n\n return (\n <ToggleGroup\n type=\"single\"\n variant=\"outline\"\n value={view}\n onValueChange={(value) => {\n console.log(\"DriveViewSwitcher: Changing view to\", value);\n onViewChange(value ? (value as DriveViewMode) : \"grid\");\n }}\n >\n <ToggleGroupItem value=\"grid\" aria-label=\"Toggle grid view\">\n <LayoutGridIcon />\n </ToggleGroupItem>\n\n <ToggleGroupItem value=\"list\" aria-label=\"Toggle list view\">\n <StretchVerticalIcon />\n </ToggleGroupItem>\n </ToggleGroup>\n );\n}\n"],"mappings":";;;;;;;;;;;AASA,SAAgB,oBAAoB;CAClC,MAAM,EAAE,MAAM,iBAAiB,qBAAqB;AAEpD,QACE,qBAAC;EACC,MAAK;EACL,SAAQ;EACR,OAAO;EACP,gBAAgB,UAAU;AACxB,WAAQ,IAAI,uCAAuC,MAAM;AACzD,gBAAa,QAAS,QAA0B,OAAO;;aAGzD,oBAAC;GAAgB,OAAM;GAAO,cAAW;aACvC,oBAAC,mBAAiB;IACF,EAElB,oBAAC;GAAgB,OAAM;GAAO,cAAW;aACvC,oBAAC,wBAAsB;IACP;GACN"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selection.client.d.mts","names":[],"sources":["../../src/components/selection.client.tsx"],"mappings":";;;;;;;;;KASY,0BAAA;EACV,SAAA,GAAY,SAAA;EACZ,mBAAA,IAAuB,IAAA,EAAM,SAAA;AAAA;;;;iBAQf,wBAAA,CAAA,GAAwB,0BAAA;;;;iBASxB,sBAAA,CAAA;EACd,SAAA;EACA,mBAAA;EACA;AAAA,GACC,iBAAA,CAAkB,0BAAA,IAA2B,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"selection.client.mjs","names":[],"sources":["../../src/components/selection.client.tsx"],"sourcesContent":["\"use client\";\n\nimport type { Selection } from \"@tulip-systems/core/data-tables\";\nimport { createContext, type PropsWithChildren, use, useMemo, useState } from \"react\";\nimport type { DriveNode } from \"@/lib/dto\";\n\n/**\n * DriveSelectionContextValue\n */\nexport type DriveSelectionContextValue = {\n selection?: Selection;\n selectionConditions?: (node: DriveNode) => boolean | boolean[];\n};\n\nconst DriveSelectionContext = createContext<DriveSelectionContextValue | null>(null);\n\n/**\n * useDriveSelectionContext\n */\nexport function useDriveSelectionContext() {\n const context = use(DriveSelectionContext);\n if (!context) throw new Error(\"DriveSelectionContext not found!\");\n return context;\n}\n\n/**\n * DriveSelectionProvider\n */\nexport function DriveSelectionProvider({\n selection,\n selectionConditions,\n children,\n}: PropsWithChildren<DriveSelectionContextValue>) {\n const [_rowSelection, _setRowSelection] = useState({});\n\n const value = useMemo(\n () => ({\n selection: {\n rowSelection: selection?.rowSelection ?? _rowSelection,\n setRowSelection: selection?.setRowSelection ?? _setRowSelection,\n },\n selectionConditions: selectionConditions,\n }),\n [selection, selectionConditions, _rowSelection],\n );\n\n return <DriveSelectionContext value={value}>{children}</DriveSelectionContext>;\n}\n"],"mappings":";;;;;;AAcA,MAAM,wBAAwB,cAAiD,KAAK;;;;AAKpF,SAAgB,2BAA2B;CACzC,MAAM,UAAU,IAAI,sBAAsB;AAC1C,KAAI,CAAC,QAAS,OAAM,IAAI,MAAM,mCAAmC;AACjE,QAAO;;;;;AAMT,SAAgB,uBAAuB,EACrC,WACA,qBACA,YACgD;CAChD,MAAM,CAAC,eAAe,oBAAoB,SAAS,EAAE,CAAC;AAatD,QAAO,oBAAC;EAAsB,OAXhB,eACL;GACL,WAAW;IACT,cAAc,WAAW,gBAAgB;IACzC,iBAAiB,WAAW,mBAAmB;IAChD;GACoB;GACtB,GACD;GAAC;GAAW;GAAqB;GAAc,CAChD;EAE4C;GAAiC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"view.client.d.mts","names":[],"sources":["../../src/components/view.client.tsx"],"mappings":";;;;KAKY,aAAA;;;AAAZ;KAKY,qBAAA;EACV,IAAA,EAAM,aAAA;EACN,YAAA,GAAe,IAAA,EAAM,aAAA;AAAA;AAFvB;;;AAAA,iBAUgB,mBAAA,CAAA,GAAmB,qBAAA;;;;KAoBvB,sBAAA,GAAyB,iBAAA,CAAkB,OAAA,CAAQ,qBAAA;EAC7D,WAAA,GAAc,aAAA;AAAA;AAAA,iBAGA,iBAAA,CAAkB,KAAA,EAAO,sBAAA,GAAsB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"view.client.mjs","names":[],"sources":["../../src/components/view.client.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, type PropsWithChildren, use, useCallback, useState } from \"react\";\nimport { DRIVE_VIEW_COOKIE, DRIVE_VIEW_COOKIE_MAX_AGE } from \"@/lib/constants\";\n\nexport type DriveViewMode = \"grid\" | \"list\";\n\n/**\n * DriveViewContextValue\n */\nexport type DriveViewContextValue = {\n view: DriveViewMode;\n onViewChange: (view: DriveViewMode) => void;\n};\n\nconst DriveViewContext = createContext<DriveViewContextValue | null>(null);\n\n/**\n * useDriveViewContext\n */\nexport function useDriveViewContext() {\n const context = use(DriveViewContext);\n\n if (!context) {\n console.warn(\"DriveViewContext not found!\");\n return {\n view: \"grid\" as DriveViewMode,\n onViewChange: () => {\n throw new Error(\"DriveViewContext not found!\");\n },\n };\n }\n\n return context;\n}\n\n/**\n * DriveViewProvider\n */\n\nexport type DriveViewProviderProps = PropsWithChildren<Partial<DriveViewContextValue>> & {\n initialView?: DriveViewMode;\n};\n\nexport function DriveViewProvider(props: DriveViewProviderProps) {\n const [_view, _setView] = useState<DriveViewMode>(props.view ?? props.initialView ?? \"grid\");\n const view = props.view ?? _view;\n\n const onViewChange = useCallback(\n (value: DriveViewMode | ((value: DriveViewMode) => DriveViewMode)) => {\n const viewState = typeof value === \"function\" ? value(view) : value;\n\n if (props.onViewChange) {\n props.onViewChange(viewState);\n } else {\n _setView(viewState);\n }\n\n // This sets the cookie to keep the view state.\n // biome-ignore lint/suspicious/noDocumentCookie: This is needed to persist the sidebar state across page reloads.\n document.cookie = `${DRIVE_VIEW_COOKIE}=${viewState}; path=/; max-age=${DRIVE_VIEW_COOKIE_MAX_AGE}`;\n },\n [props.onViewChange, view],\n );\n\n return <DriveViewContext value={{ view, onViewChange }}>{props.children}</DriveViewContext>;\n}\n"],"mappings":";;;;;;;AAeA,MAAM,mBAAmB,cAA4C,KAAK;;;;AAK1E,SAAgB,sBAAsB;CACpC,MAAM,UAAU,IAAI,iBAAiB;AAErC,KAAI,CAAC,SAAS;AACZ,UAAQ,KAAK,8BAA8B;AAC3C,SAAO;GACL,MAAM;GACN,oBAAoB;AAClB,UAAM,IAAI,MAAM,8BAA8B;;GAEjD;;AAGH,QAAO;;AAWT,SAAgB,kBAAkB,OAA+B;CAC/D,MAAM,CAAC,OAAO,YAAY,SAAwB,MAAM,QAAQ,MAAM,eAAe,OAAO;CAC5F,MAAM,OAAO,MAAM,QAAQ;AAmB3B,QAAO,oBAAC;EAAiB,OAAO;GAAE;GAAM,cAjBnB,aAClB,UAAqE;IACpE,MAAM,YAAY,OAAO,UAAU,aAAa,MAAM,KAAK,GAAG;AAE9D,QAAI,MAAM,aACR,OAAM,aAAa,UAAU;QAE7B,UAAS,UAAU;AAKrB,aAAS,SAAS,GAAG,kBAAkB,GAAG,UAAU,oBAAoB;MAE1E,CAAC,MAAM,cAAc,KAAK,CAC3B;GAEqD;YAAG,MAAM;GAA4B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"filters.mjs","names":["z"],"sources":["../../src/config/filters.ts"],"sourcesContent":["import {\n createTableFilters,\n parseFilterArray,\n parseFilterBoolean,\n} from \"@tulip-systems/core/data-tables\";\nimport z from \"zod\";\nimport { DRIVE_NODE_TYPES } from \"@/lib/constants\";\n\nexport const driveTreeFilters = createTableFilters({\n types: parseFilterArray(z.array(z.enum(DRIVE_NODE_TYPES))),\n contentTypes: parseFilterArray(z.array(z.string())),\n nodeIds: parseFilterArray(z.array(z.string())),\n isArchived: parseFilterBoolean(z.boolean()),\n});\n"],"mappings":";;;;;AAQA,MAAa,mBAAmB,mBAAmB;CACjD,OAAO,iBAAiBA,IAAE,MAAMA,IAAE,KAAK,iBAAiB,CAAC,CAAC;CAC1D,cAAc,iBAAiBA,IAAE,MAAMA,IAAE,QAAQ,CAAC,CAAC;CACnD,SAAS,iBAAiBA,IAAE,MAAMA,IAAE,QAAQ,CAAC,CAAC;CAC9C,YAAY,mBAAmBA,IAAE,SAAS,CAAC;CAC5C,CAAC"}
|