@tulip-systems/drive 0.8.1 → 0.8.2

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.
Files changed (236) hide show
  1. package/dist/client.d.mts +5 -0
  2. package/dist/client.mjs +6 -0
  3. package/dist/components/content.d.mts +14 -0
  4. package/dist/components/content.d.mts.map +1 -0
  5. package/dist/components/content.mjs +18 -0
  6. package/dist/components/content.mjs.map +1 -0
  7. package/dist/components/context.client.d.mts +14 -0
  8. package/dist/components/context.client.d.mts.map +1 -0
  9. package/dist/components/dnd.client.d.mts +17 -0
  10. package/dist/components/dnd.client.d.mts.map +1 -0
  11. package/dist/components/dnd.client.mjs +30 -0
  12. package/dist/components/dnd.client.mjs.map +1 -0
  13. package/dist/components/grid-card.client.d.mts +43 -0
  14. package/dist/components/grid-card.client.d.mts.map +1 -0
  15. package/dist/components/grid-card.client.mjs +173 -0
  16. package/dist/components/grid-card.client.mjs.map +1 -0
  17. package/dist/components/grid.client.d.mts +54 -0
  18. package/dist/components/grid.client.d.mts.map +1 -0
  19. package/dist/components/grid.client.mjs +54 -0
  20. package/dist/components/grid.client.mjs.map +1 -0
  21. package/dist/components/navigation/breadcrumbs.client.d.mts +26 -0
  22. package/dist/components/navigation/breadcrumbs.client.d.mts.map +1 -0
  23. package/dist/components/navigation/breadcrumbs.client.mjs +52 -0
  24. package/dist/components/navigation/breadcrumbs.client.mjs.map +1 -0
  25. package/dist/components/navigation/header.client.d.mts +28 -0
  26. package/dist/components/navigation/header.client.d.mts.map +1 -0
  27. package/dist/components/navigation/header.client.mjs +41 -0
  28. package/dist/components/navigation/header.client.mjs.map +1 -0
  29. package/dist/components/navigation/toolbar.client.d.mts +24 -0
  30. package/dist/components/navigation/toolbar.client.d.mts.map +1 -0
  31. package/dist/components/navigation/toolbar.client.mjs +35 -0
  32. package/dist/components/navigation/toolbar.client.mjs.map +1 -0
  33. package/dist/components/navigation/view-switcher.client.d.mts +10 -0
  34. package/dist/components/navigation/view-switcher.client.d.mts.map +1 -0
  35. package/dist/components/navigation/view-switcher.client.mjs +36 -0
  36. package/dist/components/navigation/view-switcher.client.mjs.map +1 -0
  37. package/dist/components/selection.client.d.mts +28 -0
  38. package/dist/components/selection.client.d.mts.map +1 -0
  39. package/dist/components/selection.client.mjs +39 -0
  40. package/dist/components/selection.client.mjs.map +1 -0
  41. package/dist/components/view.client.d.mts +26 -0
  42. package/dist/components/view.client.d.mts.map +1 -0
  43. package/dist/components/view.client.mjs +44 -0
  44. package/dist/components/view.client.mjs.map +1 -0
  45. package/dist/config/filters.mjs +15 -0
  46. package/dist/config/filters.mjs.map +1 -0
  47. package/dist/config/types.mjs +61 -0
  48. package/dist/config/types.mjs.map +1 -0
  49. package/dist/google/client.d.mts +8 -0
  50. package/dist/google/client.mjs +9 -0
  51. package/dist/google/server.d.mts +3 -0
  52. package/dist/google/server.mjs +4 -0
  53. package/dist/google.d.mts +6 -0
  54. package/dist/google.mjs +7 -0
  55. package/dist/index.d.mts +7 -0
  56. package/dist/index.mjs +7 -0
  57. package/dist/lib/constants.d.mts +12 -0
  58. package/dist/lib/constants.d.mts.map +1 -0
  59. package/dist/lib/constants.mjs +21 -0
  60. package/dist/lib/constants.mjs.map +1 -0
  61. package/dist/lib/contracts.d.mts +101 -0
  62. package/dist/lib/contracts.d.mts.map +1 -0
  63. package/dist/lib/dto.d.mts +118 -0
  64. package/dist/lib/dto.d.mts.map +1 -0
  65. package/dist/lib/dto.mjs +58 -0
  66. package/dist/lib/dto.mjs.map +1 -0
  67. package/dist/lib/helpers.d.mts +18 -0
  68. package/dist/lib/helpers.d.mts.map +1 -0
  69. package/dist/lib/helpers.mjs +37 -0
  70. package/dist/lib/helpers.mjs.map +1 -0
  71. package/dist/lib/helpers.server.d.mts +14 -0
  72. package/dist/lib/helpers.server.d.mts.map +1 -0
  73. package/dist/lib/helpers.server.mjs +16 -0
  74. package/dist/lib/helpers.server.mjs.map +1 -0
  75. package/dist/lib/search-params.d.mts +9 -0
  76. package/dist/lib/search-params.d.mts.map +1 -0
  77. package/dist/lib/search-params.mjs +8 -0
  78. package/dist/lib/search-params.mjs.map +1 -0
  79. package/dist/lib/validators.d.mts +158 -0
  80. package/dist/lib/validators.d.mts.map +1 -0
  81. package/dist/lib/validators.mjs +66 -0
  82. package/dist/lib/validators.mjs.map +1 -0
  83. package/dist/local/client.d.mts +13 -0
  84. package/dist/local/client.mjs +13 -0
  85. package/dist/local/server.d.mts +4 -0
  86. package/dist/local/server.mjs +5 -0
  87. package/dist/local.d.mts +8 -0
  88. package/dist/local.mjs +9 -0
  89. package/dist/providers/google/components/command-file-update.d.mts +22 -0
  90. package/dist/providers/google/components/command-file-update.d.mts.map +1 -0
  91. package/dist/providers/google/components/command-file-update.mjs +52 -0
  92. package/dist/providers/google/components/command-file-update.mjs.map +1 -0
  93. package/dist/providers/google/components/command-folder-create.d.mts +22 -0
  94. package/dist/providers/google/components/command-folder-create.d.mts.map +1 -0
  95. package/dist/providers/google/components/command-folder-create.mjs +59 -0
  96. package/dist/providers/google/components/command-folder-create.mjs.map +1 -0
  97. package/dist/providers/google/components/command-folder-update.d.mts +22 -0
  98. package/dist/providers/google/components/command-folder-update.d.mts.map +1 -0
  99. package/dist/providers/google/components/command-folder-update.mjs +52 -0
  100. package/dist/providers/google/components/command-folder-update.mjs.map +1 -0
  101. package/dist/providers/google/components/content.client.d.mts +10 -0
  102. package/dist/providers/google/components/content.client.d.mts.map +1 -0
  103. package/dist/providers/google/components/content.client.mjs +11 -0
  104. package/dist/providers/google/components/content.client.mjs.map +1 -0
  105. package/dist/providers/google/components/navigation.client.d.mts +16 -0
  106. package/dist/providers/google/components/navigation.client.d.mts.map +1 -0
  107. package/dist/providers/google/components/navigation.client.mjs +18 -0
  108. package/dist/providers/google/components/navigation.client.mjs.map +1 -0
  109. package/dist/providers/google/components/provider.client.d.mts +33 -0
  110. package/dist/providers/google/components/provider.client.d.mts.map +1 -0
  111. package/dist/providers/google/components/provider.client.mjs +43 -0
  112. package/dist/providers/google/components/provider.client.mjs.map +1 -0
  113. package/dist/providers/google/components/view.client.d.mts +41 -0
  114. package/dist/providers/google/components/view.client.d.mts.map +1 -0
  115. package/dist/providers/google/components/view.client.mjs +98 -0
  116. package/dist/providers/google/components/view.client.mjs.map +1 -0
  117. package/dist/providers/google/config/columns-data.d.mts +8 -0
  118. package/dist/providers/google/config/columns-data.d.mts.map +1 -0
  119. package/dist/providers/google/config/columns-data.mjs +70 -0
  120. package/dist/providers/google/config/columns-data.mjs.map +1 -0
  121. package/dist/providers/google/config/filters.d.mts +16 -0
  122. package/dist/providers/google/config/filters.d.mts.map +1 -0
  123. package/dist/providers/google/config/filters.mjs +8 -0
  124. package/dist/providers/google/config/filters.mjs.map +1 -0
  125. package/dist/providers/google/lib/constants.mjs +13 -0
  126. package/dist/providers/google/lib/constants.mjs.map +1 -0
  127. package/dist/providers/google/lib/dto.d.mts +39 -0
  128. package/dist/providers/google/lib/dto.d.mts.map +1 -0
  129. package/dist/providers/google/lib/dto.mjs +66 -0
  130. package/dist/providers/google/lib/dto.mjs.map +1 -0
  131. package/dist/providers/google/lib/helpers.mjs +46 -0
  132. package/dist/providers/google/lib/helpers.mjs.map +1 -0
  133. package/dist/providers/google/lib/router.server.d.mts +612 -0
  134. package/dist/providers/google/lib/router.server.d.mts.map +1 -0
  135. package/dist/providers/google/lib/router.server.mjs +40 -0
  136. package/dist/providers/google/lib/router.server.mjs.map +1 -0
  137. package/dist/providers/google/lib/search-params.d.mts +15 -0
  138. package/dist/providers/google/lib/search-params.d.mts.map +1 -0
  139. package/dist/providers/google/lib/search-params.mjs +12 -0
  140. package/dist/providers/google/lib/search-params.mjs.map +1 -0
  141. package/dist/providers/google/lib/service.server.d.mts +186 -0
  142. package/dist/providers/google/lib/service.server.d.mts.map +1 -0
  143. package/dist/providers/google/lib/service.server.mjs +613 -0
  144. package/dist/providers/google/lib/service.server.mjs.map +1 -0
  145. package/dist/providers/google/lib/validators.d.mts +303 -0
  146. package/dist/providers/google/lib/validators.d.mts.map +1 -0
  147. package/dist/providers/google/lib/validators.mjs +59 -0
  148. package/dist/providers/google/lib/validators.mjs.map +1 -0
  149. package/dist/providers/local/components/command-file-update.d.mts +18 -0
  150. package/dist/providers/local/components/command-file-update.d.mts.map +1 -0
  151. package/dist/providers/local/components/command-file-update.mjs +48 -0
  152. package/dist/providers/local/components/command-file-update.mjs.map +1 -0
  153. package/dist/providers/local/components/command-file-upload.d.mts +11 -0
  154. package/dist/providers/local/components/command-file-upload.d.mts.map +1 -0
  155. package/dist/providers/local/components/command-file-upload.mjs +35 -0
  156. package/dist/providers/local/components/command-file-upload.mjs.map +1 -0
  157. package/dist/providers/local/components/command-folder-create.d.mts +18 -0
  158. package/dist/providers/local/components/command-folder-create.d.mts.map +1 -0
  159. package/dist/providers/local/components/command-folder-create.mjs +55 -0
  160. package/dist/providers/local/components/command-folder-create.mjs.map +1 -0
  161. package/dist/providers/local/components/command-folder-update.d.mts +18 -0
  162. package/dist/providers/local/components/command-folder-update.d.mts.map +1 -0
  163. package/dist/providers/local/components/command-folder-update.mjs +48 -0
  164. package/dist/providers/local/components/command-folder-update.mjs.map +1 -0
  165. package/dist/providers/local/components/content.client.d.mts +7 -0
  166. package/dist/providers/local/components/content.client.d.mts.map +1 -0
  167. package/dist/providers/local/components/content.client.mjs +8 -0
  168. package/dist/providers/local/components/content.client.mjs.map +1 -0
  169. package/dist/providers/local/components/navigation.client.d.mts +16 -0
  170. package/dist/providers/local/components/navigation.client.d.mts.map +1 -0
  171. package/dist/providers/local/components/navigation.client.mjs +18 -0
  172. package/dist/providers/local/components/navigation.client.mjs.map +1 -0
  173. package/dist/providers/local/components/provider.client.d.mts +40 -0
  174. package/dist/providers/local/components/provider.client.d.mts.map +1 -0
  175. package/dist/providers/local/components/provider.client.mjs +61 -0
  176. package/dist/providers/local/components/provider.client.mjs.map +1 -0
  177. package/dist/providers/local/components/upload-zone-context.client.d.mts +38 -0
  178. package/dist/providers/local/components/upload-zone-context.client.d.mts.map +1 -0
  179. package/dist/providers/local/components/upload-zone-context.client.mjs +23 -0
  180. package/dist/providers/local/components/upload-zone-context.client.mjs.map +1 -0
  181. package/dist/providers/local/components/upload-zone.client.d.mts +30 -0
  182. package/dist/providers/local/components/upload-zone.client.d.mts.map +1 -0
  183. package/dist/providers/local/components/upload-zone.client.mjs +147 -0
  184. package/dist/providers/local/components/upload-zone.client.mjs.map +1 -0
  185. package/dist/providers/local/components/view.client.d.mts +32 -0
  186. package/dist/providers/local/components/view.client.d.mts.map +1 -0
  187. package/dist/providers/local/components/view.client.mjs +91 -0
  188. package/dist/providers/local/components/view.client.mjs.map +1 -0
  189. package/dist/providers/local/config/columns-data.d.mts +8 -0
  190. package/dist/providers/local/config/columns-data.d.mts.map +1 -0
  191. package/dist/providers/local/config/columns-data.mjs +70 -0
  192. package/dist/providers/local/config/columns-data.mjs.map +1 -0
  193. package/dist/providers/local/config/filters.d.mts +26 -0
  194. package/dist/providers/local/config/filters.d.mts.map +1 -0
  195. package/dist/providers/local/config/filters.mjs +15 -0
  196. package/dist/providers/local/config/filters.mjs.map +1 -0
  197. package/dist/providers/local/lib/constants.d.mts +12 -0
  198. package/dist/providers/local/lib/constants.d.mts.map +1 -0
  199. package/dist/providers/local/lib/constants.mjs +29 -0
  200. package/dist/providers/local/lib/constants.mjs.map +1 -0
  201. package/dist/providers/local/lib/helpers.d.mts +45 -0
  202. package/dist/providers/local/lib/helpers.d.mts.map +1 -0
  203. package/dist/providers/local/lib/helpers.mjs +110 -0
  204. package/dist/providers/local/lib/helpers.mjs.map +1 -0
  205. package/dist/providers/local/lib/route-handler.server.d.mts +34 -0
  206. package/dist/providers/local/lib/route-handler.server.d.mts.map +1 -0
  207. package/dist/providers/local/lib/route-handler.server.mjs +114 -0
  208. package/dist/providers/local/lib/route-handler.server.mjs.map +1 -0
  209. package/dist/providers/local/lib/router.server.d.mts +41648 -0
  210. package/dist/providers/local/lib/router.server.d.mts.map +1 -0
  211. package/dist/providers/local/lib/router.server.mjs +52 -0
  212. package/dist/providers/local/lib/router.server.mjs.map +1 -0
  213. package/dist/providers/local/lib/schema.d.mts +1113 -0
  214. package/dist/providers/local/lib/schema.d.mts.map +1 -0
  215. package/dist/providers/local/lib/schema.mjs +71 -0
  216. package/dist/providers/local/lib/schema.mjs.map +1 -0
  217. package/dist/providers/local/lib/search-params.d.mts +14 -0
  218. package/dist/providers/local/lib/search-params.d.mts.map +1 -0
  219. package/dist/providers/local/lib/search-params.mjs +9 -0
  220. package/dist/providers/local/lib/search-params.mjs.map +1 -0
  221. package/dist/providers/local/lib/service.server.d.mts +489 -0
  222. package/dist/providers/local/lib/service.server.d.mts.map +1 -0
  223. package/dist/providers/local/lib/service.server.mjs +668 -0
  224. package/dist/providers/local/lib/service.server.mjs.map +1 -0
  225. package/dist/providers/local/lib/upload.client.d.mts +62 -0
  226. package/dist/providers/local/lib/upload.client.d.mts.map +1 -0
  227. package/dist/providers/local/lib/upload.client.mjs +100 -0
  228. package/dist/providers/local/lib/upload.client.mjs.map +1 -0
  229. package/dist/providers/local/lib/validators.d.mts +454 -0
  230. package/dist/providers/local/lib/validators.d.mts.map +1 -0
  231. package/dist/providers/local/lib/validators.mjs +96 -0
  232. package/dist/providers/local/lib/validators.mjs.map +1 -0
  233. package/dist/server.d.mts +2 -0
  234. package/dist/server.mjs +3 -0
  235. package/package.json +3 -2
  236. package/src/providers/local/lib/helpers.ts +0 -1
@@ -0,0 +1,32 @@
1
+ import { LocalDriveNodeWithAsset } from "../lib/validators.mjs";
2
+ import { TableColumnDef } from "@tulip-systems/core/data-tables";
3
+ import { ComponentProps } from "react";
4
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
5
+ import { useInfiniteStrategy } from "@tulip-systems/core/data-tables/client";
6
+ import { CommandDef } from "@tulip-systems/core/commands";
7
+ import { VisibilityState } from "@tanstack/react-table";
8
+
9
+ //#region src/providers/local/components/view.client.d.ts
10
+ type LocalDriveViewProviderProps<TData extends LocalDriveNodeWithAsset = LocalDriveNodeWithAsset> = ComponentProps<"div"> & {
11
+ queryData: TData[];
12
+ columns?: TableColumnDef<TData>[];
13
+ strategy: ReturnType<typeof useInfiniteStrategy>;
14
+ commands?: CommandDef<TData>[];
15
+ columnVisibility?: VisibilityState;
16
+ };
17
+ declare function LocalDriveViewProvider<TData extends LocalDriveNodeWithAsset = LocalDriveNodeWithAsset>({
18
+ queryData,
19
+ columns,
20
+ strategy,
21
+ commands,
22
+ columnVisibility,
23
+ children,
24
+ ...props
25
+ }: LocalDriveViewProviderProps<TData>): react_jsx_runtime0.JSX.Element;
26
+ declare function LocalDriveView(): react_jsx_runtime0.JSX.Element | null;
27
+ declare function LocalDriveViewLoading({
28
+ ...props
29
+ }: ComponentProps<"div">): react_jsx_runtime0.JSX.Element;
30
+ //#endregion
31
+ export { LocalDriveView, LocalDriveViewLoading, LocalDriveViewProvider };
32
+ //# sourceMappingURL=view.client.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.client.d.mts","names":[],"sources":["../../../../src/providers/local/components/view.client.tsx"],"mappings":";;;;;;;;;KA8BK,2BAAA,eAA0C,uBAAA,GAA0B,uBAAA,IACvE,cAAA;EACE,SAAA,EAAW,KAAA;EACX,OAAA,GAAU,cAAA,CAAe,KAAA;EACzB,QAAA,EAAU,UAAA,QAAkB,mBAAA;EAC5B,QAAA,GAAW,UAAA,CAAW,KAAA;EACtB,gBAAA,GAAmB,eAAA;AAAA;AAAA,iBAGP,sBAAA,eACA,uBAAA,GAA0B,uBAAA,CAAA,CAAA;EAExC,SAAA;EACA,OAAA;EACA,QAAA;EACA,QAAA;EACA,gBAAA;EACA,QAAA;EAAA,GACG;AAAA,GACF,2BAAA,CAA4B,KAAA,IAAM,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAqBrB,cAAA,CAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAyEd,qBAAA,CAAA;EAAA,GAA2B;AAAA,GAAS,cAAA,UAAqB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -0,0 +1,91 @@
1
+ "use client";
2
+
3
+ import { useDriveSelectionContext } from "../../../components/selection.client.mjs";
4
+ import { DriveGridCard, DriveGridCardSkeleton } from "../../../components/grid-card.client.mjs";
5
+ import { DriveGrid, DriveGridBottombar, DriveGridEmpty, DriveGridLoading } from "../../../components/grid.client.mjs";
6
+ import { useDriveViewContext } from "../../../components/view.client.mjs";
7
+ import { localDriveColumns } from "../config/columns-data.mjs";
8
+ import { localDriveImageLoader } from "../lib/helpers.mjs";
9
+ import { useLocalDriveUploadZone } from "./upload-zone-context.client.mjs";
10
+ import { useLocalDriveContext } from "./provider.client.mjs";
11
+ import { TableLayout, TableSkeleton } from "@tulip-systems/core/data-tables";
12
+ import { useMemo } from "react";
13
+ import { FloatingCommandMenu } from "@tulip-systems/core/commands/client";
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+ import { DataTable, TableConfigProvider, createTableConfig, useTableConfigContext } from "@tulip-systems/core/data-tables/client";
16
+
17
+ //#region src/providers/local/components/view.client.tsx
18
+ function LocalDriveViewProvider({ queryData, columns = localDriveColumns, strategy, commands, columnVisibility, children, ...props }) {
19
+ const { meta } = useLocalDriveContext();
20
+ const { selection } = useDriveSelectionContext();
21
+ return /* @__PURE__ */ jsx(TableConfigProvider, {
22
+ config: createTableConfig({
23
+ queryData,
24
+ columns,
25
+ strategy,
26
+ commands,
27
+ meta,
28
+ columnVisibility,
29
+ selection
30
+ }),
31
+ children: /* @__PURE__ */ jsx(TableLayout, {
32
+ ...props,
33
+ children
34
+ })
35
+ });
36
+ }
37
+ function LocalDriveView() {
38
+ const { view } = useDriveViewContext();
39
+ if (view === "grid") return /* @__PURE__ */ jsx(LocalDriveGrid, {});
40
+ if (view === "list") return /* @__PURE__ */ jsx(LocalDriveList, {});
41
+ return null;
42
+ }
43
+ function LocalDriveGrid(props) {
44
+ const { queryData, strategy, commands, selection, meta } = useTableConfigContext();
45
+ const { optimistic } = useLocalDriveUploadZone();
46
+ const { rowCount, paginationState } = strategy;
47
+ const { isFetching, isFetchingNextPage, fetchNextPage } = strategy.meta;
48
+ const hasNextPage = rowCount == null ? false : queryData.length < rowCount;
49
+ const selectedData = useMemo(() => queryData.filter((node) => selection?.rowSelection?.[node.id] === true), [queryData, selection?.rowSelection]);
50
+ return /* @__PURE__ */ jsxs(DriveGrid, {
51
+ ...props,
52
+ children: [
53
+ queryData.length > 0 ? queryData.filter((node) => !node.hidden).map((node) => /* @__PURE__ */ jsx(DriveGridCard, {
54
+ node,
55
+ commands,
56
+ imageLoader: localDriveImageLoader
57
+ }, node.id)) : /* @__PURE__ */ jsx(DriveGridEmpty, { title: "Geen resultaten gevonden" }),
58
+ isFetchingNextPage && Array.from({ length: paginationState?.pageSize ?? 0 }).map((_, index) => /* @__PURE__ */ jsx(DriveGridCardSkeleton, {}, index)),
59
+ /* @__PURE__ */ jsx(DriveGridBottombar, {
60
+ hasNextPage,
61
+ fetchNextPage,
62
+ isFetching,
63
+ isFetchingNextPage
64
+ }),
65
+ commands && commands.length > 0 && /* @__PURE__ */ jsx(FloatingCommandMenu, {
66
+ data: selectedData,
67
+ commands,
68
+ meta,
69
+ state: selectedData.length > 0 ? "open" : "closed",
70
+ onSuccess: () => {
71
+ selection?.setRowSelection?.({});
72
+ optimistic?.invalidate?.();
73
+ }
74
+ })
75
+ ]
76
+ });
77
+ }
78
+ function LocalDriveList(props) {
79
+ return /* @__PURE__ */ jsx(DataTable, { ...props });
80
+ }
81
+ function LocalDriveViewLoading({ ...props }) {
82
+ const { view } = useDriveViewContext();
83
+ return /* @__PURE__ */ jsxs("div", {
84
+ ...props,
85
+ children: [view === "grid" && /* @__PURE__ */ jsx(DriveGridLoading, { ...props }), view === "list" && /* @__PURE__ */ jsx(TableSkeleton, { ...props })]
86
+ });
87
+ }
88
+
89
+ //#endregion
90
+ export { LocalDriveView, LocalDriveViewLoading, LocalDriveViewProvider };
91
+ //# sourceMappingURL=view.client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view.client.mjs","names":[],"sources":["../../../../src/providers/local/components/view.client.tsx"],"sourcesContent":["\"use client\";\n\nimport type { VisibilityState } from \"@tanstack/react-table\";\nimport type { CommandDef } from \"@tulip-systems/core/commands\";\nimport { FloatingCommandMenu } from \"@tulip-systems/core/commands/client\";\nimport { type TableColumnDef, TableLayout, TableSkeleton } from \"@tulip-systems/core/data-tables\";\nimport {\n createTableConfig,\n DataTable,\n type InfiniteStrategyMeta,\n TableConfigProvider,\n type useInfiniteStrategy,\n useTableConfigContext,\n} from \"@tulip-systems/core/data-tables/client\";\nimport { type ComponentProps, useMemo } from \"react\";\nimport {\n DriveGrid,\n DriveGridBottombar,\n DriveGridEmpty,\n DriveGridLoading,\n} from \"@/components/grid.client\";\nimport { DriveGridCard, DriveGridCardSkeleton } from \"@/components/grid-card.client\";\nimport { useDriveSelectionContext } from \"@/components/selection.client\";\nimport { useDriveViewContext } from \"@/components/view.client\";\nimport { localDriveColumns } from \"../config/columns-data\";\nimport { localDriveImageLoader } from \"../lib/helpers\";\nimport type { LocalDriveNodeWithAsset } from \"../lib/validators\";\nimport { useLocalDriveContext } from \"./provider.client\";\nimport { useLocalDriveUploadZone } from \"./upload-zone-context.client\";\n\ntype LocalDriveViewProviderProps<TData extends LocalDriveNodeWithAsset = LocalDriveNodeWithAsset> =\n ComponentProps<\"div\"> & {\n queryData: TData[];\n columns?: TableColumnDef<TData>[];\n strategy: ReturnType<typeof useInfiniteStrategy>;\n commands?: CommandDef<TData>[];\n columnVisibility?: VisibilityState;\n };\n\nexport function LocalDriveViewProvider<\n TData extends LocalDriveNodeWithAsset = LocalDriveNodeWithAsset,\n>({\n queryData,\n columns = localDriveColumns as TableColumnDef<TData>[],\n strategy,\n commands,\n columnVisibility,\n children,\n ...props\n}: LocalDriveViewProviderProps<TData>) {\n const { meta } = useLocalDriveContext();\n const { selection } = useDriveSelectionContext();\n\n const config = createTableConfig<TData>({\n queryData,\n columns,\n strategy,\n commands,\n meta,\n columnVisibility,\n selection,\n });\n\n return (\n <TableConfigProvider config={config}>\n <TableLayout {...props}>{children}</TableLayout>\n </TableConfigProvider>\n );\n}\n\nexport function LocalDriveView() {\n const { view } = useDriveViewContext();\n\n if (view === \"grid\") return <LocalDriveGrid />;\n if (view === \"list\") return <LocalDriveList />;\n\n return null;\n}\n\nfunction LocalDriveGrid(props: ComponentProps<\"div\">) {\n const { queryData, strategy, commands, selection, meta } =\n useTableConfigContext<LocalDriveNodeWithAsset>();\n const { optimistic } = useLocalDriveUploadZone();\n\n const { rowCount, paginationState } = strategy;\n const { isFetching, isFetchingNextPage, fetchNextPage } = strategy.meta as InfiniteStrategyMeta;\n\n const hasNextPage = rowCount == null ? false : queryData.length < rowCount;\n\n const selectedData = useMemo(\n () => queryData.filter((node) => selection?.rowSelection?.[node.id] === true),\n [queryData, selection?.rowSelection],\n );\n\n return (\n <DriveGrid {...props}>\n {queryData.length > 0 ? (\n queryData\n .filter((node) => !node.hidden)\n .map((node) => (\n <DriveGridCard\n key={node.id}\n node={node}\n commands={commands}\n imageLoader={localDriveImageLoader}\n />\n ))\n ) : (\n <DriveGridEmpty title=\"Geen resultaten gevonden\" />\n )}\n\n {isFetchingNextPage &&\n Array.from({ length: paginationState?.pageSize ?? 0 }).map((_, index) => (\n <DriveGridCardSkeleton key={index} />\n ))}\n\n <DriveGridBottombar\n hasNextPage={hasNextPage}\n fetchNextPage={fetchNextPage}\n isFetching={isFetching}\n isFetchingNextPage={isFetchingNextPage}\n />\n\n {commands && commands.length > 0 && (\n <FloatingCommandMenu\n data={selectedData as never}\n commands={commands as never}\n meta={meta}\n state={selectedData.length > 0 ? \"open\" : \"closed\"}\n onSuccess={() => {\n selection?.setRowSelection?.({});\n void optimistic?.invalidate?.();\n }}\n />\n )}\n </DriveGrid>\n );\n}\n\nfunction LocalDriveList(props: ComponentProps<typeof DataTable>) {\n return <DataTable {...props} />;\n}\n\nexport function LocalDriveViewLoading({ ...props }: ComponentProps<\"div\">) {\n const { view } = useDriveViewContext();\n\n return (\n <div {...props}>\n {view === \"grid\" && <DriveGridLoading {...props} />}\n {view === \"list\" && <TableSkeleton {...props} />}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAuCA,SAAgB,uBAEd,EACA,WACA,UAAU,mBACV,UACA,UACA,kBACA,UACA,GAAG,SACkC;CACrC,MAAM,EAAE,SAAS,sBAAsB;CACvC,MAAM,EAAE,cAAc,0BAA0B;AAYhD,QACE,oBAAC;EAAoB,QAXR,kBAAyB;GACtC;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CAAC;YAIE,oBAAC;GAAY,GAAI;GAAQ;IAAuB;GAC5B;;AAI1B,SAAgB,iBAAiB;CAC/B,MAAM,EAAE,SAAS,qBAAqB;AAEtC,KAAI,SAAS,OAAQ,QAAO,oBAAC,mBAAiB;AAC9C,KAAI,SAAS,OAAQ,QAAO,oBAAC,mBAAiB;AAE9C,QAAO;;AAGT,SAAS,eAAe,OAA8B;CACpD,MAAM,EAAE,WAAW,UAAU,UAAU,WAAW,SAChD,uBAAgD;CAClD,MAAM,EAAE,eAAe,yBAAyB;CAEhD,MAAM,EAAE,UAAU,oBAAoB;CACtC,MAAM,EAAE,YAAY,oBAAoB,kBAAkB,SAAS;CAEnE,MAAM,cAAc,YAAY,OAAO,QAAQ,UAAU,SAAS;CAElE,MAAM,eAAe,cACb,UAAU,QAAQ,SAAS,WAAW,eAAe,KAAK,QAAQ,KAAK,EAC7E,CAAC,WAAW,WAAW,aAAa,CACrC;AAED,QACE,qBAAC;EAAU,GAAI;;GACZ,UAAU,SAAS,IAClB,UACG,QAAQ,SAAS,CAAC,KAAK,OAAO,CAC9B,KAAK,SACJ,oBAAC;IAEO;IACI;IACV,aAAa;MAHR,KAAK,GAIV,CACF,GAEJ,oBAAC,kBAAe,OAAM,6BAA6B;GAGpD,sBACC,MAAM,KAAK,EAAE,QAAQ,iBAAiB,YAAY,GAAG,CAAC,CAAC,KAAK,GAAG,UAC7D,oBAAC,2BAA2B,MAAS,CACrC;GAEJ,oBAAC;IACc;IACE;IACH;IACQ;KACpB;GAED,YAAY,SAAS,SAAS,KAC7B,oBAAC;IACC,MAAM;IACI;IACJ;IACN,OAAO,aAAa,SAAS,IAAI,SAAS;IAC1C,iBAAiB;AACf,gBAAW,kBAAkB,EAAE,CAAC;AAChC,KAAK,YAAY,cAAc;;KAEjC;;GAEM;;AAIhB,SAAS,eAAe,OAAyC;AAC/D,QAAO,oBAAC,aAAU,GAAI,QAAS;;AAGjC,SAAgB,sBAAsB,EAAE,GAAG,SAAgC;CACzE,MAAM,EAAE,SAAS,qBAAqB;AAEtC,QACE,qBAAC;EAAI,GAAI;aACN,SAAS,UAAU,oBAAC,oBAAiB,GAAI,QAAS,EAClD,SAAS,UAAU,oBAAC,iBAAc,GAAI,QAAS;GAC5C"}
@@ -0,0 +1,8 @@
1
+ import { LocalDriveNodeWithAsset } from "../lib/validators.mjs";
2
+ import { TableColumnDef } from "@tulip-systems/core/data-tables";
3
+
4
+ //#region src/providers/local/config/columns-data.d.ts
5
+ declare const localDriveColumns: TableColumnDef<LocalDriveNodeWithAsset>[];
6
+ //#endregion
7
+ export { localDriveColumns };
8
+ //# sourceMappingURL=columns-data.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns-data.d.mts","names":[],"sources":["../../../../src/providers/local/config/columns-data.tsx"],"mappings":";;;;cAaa,iBAAA,EAAmB,cAAA,CAAe,uBAAA"}
@@ -0,0 +1,70 @@
1
+ "use client";
2
+
3
+ import { driveTreeSearchParams } from "../../../lib/search-params.mjs";
4
+ import { nodeSubtypeConfig, nodeSubtypeVariants } from "../../../config/types.mjs";
5
+ import { TableColumnHeader } from "@tulip-systems/core/data-tables";
6
+ import { findStatus } from "@tulip-systems/core/components";
7
+ import { FolderIcon } from "lucide-react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ import { Tooltip, TooltipContent, TooltipTrigger } from "@tulip-systems/core/components/client";
10
+ import { TableTextCell, createTableSelectCell } from "@tulip-systems/core/data-tables/client";
11
+ import Link from "next/link";
12
+ import { createSerializer, useQueryStates } from "nuqs";
13
+
14
+ //#region src/providers/local/config/columns-data.tsx
15
+ const localDriveColumns = [
16
+ createTableSelectCell(),
17
+ {
18
+ id: "icon",
19
+ accessorKey: "icon",
20
+ header: () => null,
21
+ cell: ({ row }) => {
22
+ if (row.original.type === "file") {
23
+ const subtype = findStatus(nodeSubtypeConfig, row.original.subtype);
24
+ if (!subtype) return null;
25
+ return /* @__PURE__ */ jsx(TableTextCell, {
26
+ className: "w-4",
27
+ children: /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, { children: /* @__PURE__ */ jsx(subtype.icon, { className: nodeSubtypeVariants({
28
+ status: row.original.subtype,
29
+ className: "size-4"
30
+ }) }) }), /* @__PURE__ */ jsx(TooltipContent, { children: subtype.label })] })
31
+ });
32
+ }
33
+ if (row.original.type === "folder") return /* @__PURE__ */ jsx(TableTextCell, {
34
+ className: "w-4",
35
+ children: /* @__PURE__ */ jsx(FolderIcon, { className: "w-4 min-w-4" })
36
+ });
37
+ return null;
38
+ },
39
+ enableSorting: false
40
+ },
41
+ {
42
+ id: "name",
43
+ accessorKey: "name",
44
+ header: ({ column }) => /* @__PURE__ */ jsx(TableColumnHeader, {
45
+ column,
46
+ title: "Naam"
47
+ }),
48
+ cell: ({ row }) => {
49
+ const [query] = useQueryStates(driveTreeSearchParams);
50
+ const serialize = createSerializer(driveTreeSearchParams);
51
+ return /* @__PURE__ */ jsx(TableTextCell, {
52
+ className: "w-full min-w-64",
53
+ children: /* @__PURE__ */ jsx(Link, {
54
+ href: row.original.type === "file" ? row.original.links.view ?? "#" : serialize({
55
+ ...query,
56
+ parentId: row.original.id
57
+ }),
58
+ className: "truncate hover:underline",
59
+ target: row.original.type === "file" ? "_blank" : "_self",
60
+ children: row.getValue("name")
61
+ })
62
+ });
63
+ },
64
+ enableSorting: false
65
+ }
66
+ ];
67
+
68
+ //#endregion
69
+ export { localDriveColumns };
70
+ //# sourceMappingURL=columns-data.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns-data.mjs","names":[],"sources":["../../../../src/providers/local/config/columns-data.tsx"],"sourcesContent":["\"use client\";\n\nimport { findStatus } from \"@tulip-systems/core/components\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@tulip-systems/core/components/client\";\nimport { type TableColumnDef, TableColumnHeader } from \"@tulip-systems/core/data-tables\";\nimport { createTableSelectCell, TableTextCell } from \"@tulip-systems/core/data-tables/client\";\nimport { FolderIcon } from \"lucide-react\";\nimport Link from \"next/link\";\nimport { createSerializer, useQueryStates } from \"nuqs\";\nimport { nodeSubtypeConfig, nodeSubtypeVariants } from \"@/config/types\";\nimport { driveTreeSearchParams } from \"@/lib/search-params\";\nimport type { LocalDriveNodeWithAsset } from \"../lib/validators\";\n\nexport const localDriveColumns: TableColumnDef<LocalDriveNodeWithAsset>[] = [\n createTableSelectCell(),\n {\n id: \"icon\",\n accessorKey: \"icon\",\n header: () => null,\n cell: ({ row }) => {\n if (row.original.type === \"file\") {\n const subtype = findStatus(nodeSubtypeConfig, row.original.subtype);\n if (!subtype) return null;\n\n return (\n <TableTextCell className=\"w-4\">\n <Tooltip>\n <TooltipTrigger>\n <subtype.icon\n className={nodeSubtypeVariants({\n status: row.original.subtype,\n className: \"size-4\",\n })}\n />\n </TooltipTrigger>\n\n <TooltipContent>{subtype.label}</TooltipContent>\n </Tooltip>\n </TableTextCell>\n );\n }\n\n if (row.original.type === \"folder\") {\n return (\n <TableTextCell className=\"w-4\">\n <FolderIcon className=\"w-4 min-w-4\" />\n </TableTextCell>\n );\n }\n\n return null;\n },\n enableSorting: false,\n },\n {\n id: \"name\",\n accessorKey: \"name\",\n header: ({ column }) => <TableColumnHeader column={column} title=\"Naam\" />,\n cell: ({ row }) => {\n const [query] = useQueryStates(driveTreeSearchParams);\n const serialize = createSerializer(driveTreeSearchParams);\n\n return (\n <TableTextCell className=\"w-full min-w-64\">\n <Link\n href={\n row.original.type === \"file\"\n ? ((row.original.links.view as string) ?? \"#\")\n : serialize({ ...query, parentId: row.original.id })\n }\n className=\"truncate hover:underline\"\n target={row.original.type === \"file\" ? \"_blank\" : \"_self\"}\n >\n {row.getValue(\"name\")}\n </Link>\n </TableTextCell>\n );\n },\n enableSorting: false,\n },\n];\n"],"mappings":";;;;;;;;;;;;;;AAaA,MAAa,oBAA+D;CAC1E,uBAAuB;CACvB;EACE,IAAI;EACJ,aAAa;EACb,cAAc;EACd,OAAO,EAAE,UAAU;AACjB,OAAI,IAAI,SAAS,SAAS,QAAQ;IAChC,MAAM,UAAU,WAAW,mBAAmB,IAAI,SAAS,QAAQ;AACnE,QAAI,CAAC,QAAS,QAAO;AAErB,WACE,oBAAC;KAAc,WAAU;eACvB,qBAAC,sBACC,oBAAC,4BACC,oBAAC,QAAQ,QACP,WAAW,oBAAoB;MAC7B,QAAQ,IAAI,SAAS;MACrB,WAAW;MACZ,CAAC,GACF,GACa,EAEjB,oBAAC,4BAAgB,QAAQ,QAAuB,IACxC;MACI;;AAIpB,OAAI,IAAI,SAAS,SAAS,SACxB,QACE,oBAAC;IAAc,WAAU;cACvB,oBAAC,cAAW,WAAU,gBAAgB;KACxB;AAIpB,UAAO;;EAET,eAAe;EAChB;CACD;EACE,IAAI;EACJ,aAAa;EACb,SAAS,EAAE,aAAa,oBAAC;GAA0B;GAAQ,OAAM;IAAS;EAC1E,OAAO,EAAE,UAAU;GACjB,MAAM,CAAC,SAAS,eAAe,sBAAsB;GACrD,MAAM,YAAY,iBAAiB,sBAAsB;AAEzD,UACE,oBAAC;IAAc,WAAU;cACvB,oBAAC;KACC,MACE,IAAI,SAAS,SAAS,SAChB,IAAI,SAAS,MAAM,QAAmB,MACxC,UAAU;MAAE,GAAG;MAAO,UAAU,IAAI,SAAS;MAAI,CAAC;KAExD,WAAU;KACV,QAAQ,IAAI,SAAS,SAAS,SAAS,WAAW;eAEjD,IAAI,SAAS,OAAO;MAChB;KACO;;EAGpB,eAAe;EAChB;CACF"}
@@ -0,0 +1,26 @@
1
+ import z$1 from "zod";
2
+ import * as _tulip_systems_core_data_tables0 from "@tulip-systems/core/data-tables";
3
+
4
+ //#region src/providers/local/config/filters.d.ts
5
+ declare const localDriveFilters: {
6
+ subtypes: _tulip_systems_core_data_tables0.ParseFilter<z$1.ZodArray<z$1.ZodEnum<{
7
+ image: "image";
8
+ document: "document";
9
+ spreadsheet: "spreadsheet";
10
+ video: "video";
11
+ audio: "audio";
12
+ archive: "archive";
13
+ other: "other";
14
+ }>>>;
15
+ hidden: _tulip_systems_core_data_tables0.ParseFilter<z$1.ZodBoolean>;
16
+ types: _tulip_systems_core_data_tables0.ParseFilter<z$1.ZodArray<z$1.ZodEnum<{
17
+ file: "file";
18
+ folder: "folder";
19
+ }>>>;
20
+ contentTypes: _tulip_systems_core_data_tables0.ParseFilter<z$1.ZodArray<z$1.ZodString>>;
21
+ nodeIds: _tulip_systems_core_data_tables0.ParseFilter<z$1.ZodArray<z$1.ZodString>>;
22
+ isArchived: _tulip_systems_core_data_tables0.ParseFilter<z$1.ZodBoolean>;
23
+ };
24
+ //#endregion
25
+ export { localDriveFilters };
26
+ //# sourceMappingURL=filters.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.mts","names":[],"sources":["../../../../src/providers/local/config/filters.ts"],"mappings":";;;;cASa,iBAAA"}
@@ -0,0 +1,15 @@
1
+ import { driveTreeFilters } from "../../../config/filters.mjs";
2
+ import { nodeSubtypes } from "../lib/constants.mjs";
3
+ import z$1 from "zod";
4
+ import { createTableFilters, parseFilterArray, parseFilterBoolean } from "@tulip-systems/core/data-tables";
5
+
6
+ //#region src/providers/local/config/filters.ts
7
+ const localDriveFilters = createTableFilters({
8
+ ...driveTreeFilters,
9
+ subtypes: parseFilterArray(z$1.array(z$1.enum(nodeSubtypes))),
10
+ hidden: parseFilterBoolean(z$1.boolean())
11
+ });
12
+
13
+ //#endregion
14
+ export { localDriveFilters };
15
+ //# sourceMappingURL=filters.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.mjs","names":["z"],"sources":["../../../../src/providers/local/config/filters.ts"],"sourcesContent":["import {\n createTableFilters,\n parseFilterArray,\n parseFilterBoolean,\n} from \"@tulip-systems/core/data-tables\";\nimport z from \"zod\";\nimport { driveTreeFilters } from \"@/config/filters\";\nimport { nodeSubtypes } from \"../lib/constants\";\n\nexport const localDriveFilters = createTableFilters({\n ...driveTreeFilters,\n subtypes: parseFilterArray(z.array(z.enum(nodeSubtypes))),\n hidden: parseFilterBoolean(z.boolean()),\n});\n"],"mappings":";;;;;;AASA,MAAa,oBAAoB,mBAAmB;CAClD,GAAG;CACH,UAAU,iBAAiBA,IAAE,MAAMA,IAAE,KAAK,aAAa,CAAC,CAAC;CACzD,QAAQ,mBAAmBA,IAAE,SAAS,CAAC;CACxC,CAAC"}
@@ -0,0 +1,12 @@
1
+ //#region src/providers/local/lib/constants.d.ts
2
+ declare const deviceSizes: number[];
3
+ declare const imageSizes: number[];
4
+ declare const imageVariants: readonly ["main", ...`preview-${number}`[]];
5
+ type ImageVariant = (typeof imageVariants)[number];
6
+ /**
7
+ * Node subtype
8
+ */
9
+ declare const nodeSubtypes: readonly ["image", "document", "spreadsheet", "video", "audio", "archive", "other"];
10
+ //#endregion
11
+ export { ImageVariant, deviceSizes, imageSizes, imageVariants, nodeSubtypes };
12
+ //# sourceMappingURL=constants.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.mts","names":[],"sources":["../../../../src/providers/local/lib/constants.ts"],"mappings":";cACa,WAAA;AAAA,cACA,UAAA;AAAA,cAGA,aAAA;AAAA,KAID,YAAA,WAAuB,aAAA;;;AAPnC;cAYa,YAAA"}
@@ -0,0 +1,29 @@
1
+ //#region src/providers/local/lib/constants.ts
2
+ const deviceSizes = [
3
+ 640,
4
+ 750,
5
+ 828,
6
+ 1080,
7
+ 1200,
8
+ 1920,
9
+ 2048,
10
+ 3840
11
+ ];
12
+ const imageSizes = deviceSizes;
13
+ const imageVariants = ["main", ...deviceSizes.map((size) => `preview-${size}`)];
14
+ /**
15
+ * Node subtype
16
+ */
17
+ const nodeSubtypes = [
18
+ "image",
19
+ "document",
20
+ "spreadsheet",
21
+ "video",
22
+ "audio",
23
+ "archive",
24
+ "other"
25
+ ];
26
+
27
+ //#endregion
28
+ export { deviceSizes, imageSizes, imageVariants, nodeSubtypes };
29
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","names":[],"sources":["../../../../src/providers/local/lib/constants.ts"],"sourcesContent":["// Device sizes\nexport const deviceSizes = [640, 750, 828, 1080, 1200, 1920, 2048, 3840];\nexport const imageSizes = deviceSizes;\n\n// Image variants\nexport const imageVariants = [\n \"main\",\n ...deviceSizes.map((size) => `preview-${size}` as const),\n] as const;\nexport type ImageVariant = (typeof imageVariants)[number];\n\n/**\n * Node subtype\n */\nexport const nodeSubtypes = [\n \"image\",\n \"document\",\n \"spreadsheet\",\n \"video\",\n \"audio\",\n \"archive\",\n \"other\",\n] as const;\n"],"mappings":";AACA,MAAa,cAAc;CAAC;CAAK;CAAK;CAAK;CAAM;CAAM;CAAM;CAAM;CAAK;AACxE,MAAa,aAAa;AAG1B,MAAa,gBAAgB,CAC3B,QACA,GAAG,YAAY,KAAK,SAAS,WAAW,OAAgB,CACzD;;;;AAMD,MAAa,eAAe;CAC1B;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
@@ -0,0 +1,45 @@
1
+ import { GetLocalFileURLSchema, LocalDriveNode, LocalNode } from "./validators.mjs";
2
+ import { nodeSubtypes } from "./constants.mjs";
3
+ import { ImageLoaderProps } from "next/image";
4
+
5
+ //#region src/providers/local/lib/helpers.d.ts
6
+ /**
7
+ * Convert a LocalNode to LocalDriveNode by adding provider and links
8
+ * @param node The LocalNode to convert
9
+ * @returns The converted LocalDriveNode
10
+ */
11
+ declare function toLocalDriveNode<TNode extends LocalNode>(node: TNode): LocalDriveNode;
12
+ /**
13
+ * Check if the node is a file
14
+ */
15
+ declare function isLocalDriveFile(node: Pick<LocalNode, "type">): node is LocalNode;
16
+ /**
17
+ * Check if the node is a folder
18
+ */
19
+ declare function isLocalDriveFolder(node: Pick<LocalNode, "type">): node is LocalNode;
20
+ /**
21
+ * Get file url
22
+ */
23
+ declare function getLocalDriveFileUrl(id: string, options?: Partial<GetLocalFileURLSchema>): string;
24
+ /**
25
+ * Image loader
26
+ */
27
+ declare function localDriveImageLoader({
28
+ src,
29
+ width
30
+ }: ImageLoaderProps): string;
31
+ /**
32
+ * Node subtype inference
33
+ */
34
+ type LocalDriveNodeSubtype = (typeof nodeSubtypes)[number];
35
+ declare function inferLocalDriveNodeSubtype({
36
+ name,
37
+ contentType
38
+ }: Partial<Pick<LocalDriveNode, "name" | "contentType">>): LocalDriveNodeSubtype;
39
+ /**
40
+ * Render bytes
41
+ */
42
+ declare function renderBytes(bytes: number): string;
43
+ //#endregion
44
+ export { LocalDriveNodeSubtype, getLocalDriveFileUrl, inferLocalDriveNodeSubtype, isLocalDriveFile, isLocalDriveFolder, localDriveImageLoader, renderBytes, toLocalDriveNode };
45
+ //# sourceMappingURL=helpers.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.mts","names":[],"sources":["../../../../src/providers/local/lib/helpers.ts"],"mappings":";;;;;;;AASA;;;iBAAgB,gBAAA,eAA+B,SAAA,CAAA,CAAW,IAAA,EAAM,KAAA,GAAQ,cAAA;;;;iBAsBxD,gBAAA,CAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,YAAqB,IAAA,IAAQ,SAAA;;;;iBAOzD,kBAAA,CAAmB,IAAA,EAAM,IAAA,CAAK,SAAA,YAAqB,IAAA,IAAQ,SAAA;;;;iBAO3D,oBAAA,CAAqB,EAAA,UAAY,OAAA,GAAS,OAAA,CAAQ,qBAAA;;;;iBAYlD,qBAAA,CAAA;EAAwB,GAAA;EAAK;AAAA,GAAS,gBAAA;;;;KAS1C,qBAAA,WAAgC,YAAA;AAAA,iBAE5B,0BAAA,CAAA;EACd,IAAA;EACA;AAAA,GACC,OAAA,CAAQ,IAAA,CAAK,cAAA,6BAA2C,qBAAA;;;;iBAoB3C,WAAA,CAAY,KAAA"}
@@ -0,0 +1,110 @@
1
+ //#region src/providers/local/lib/helpers.ts
2
+ /**
3
+ * Convert a LocalNode to LocalDriveNode by adding provider and links
4
+ * @param node The LocalNode to convert
5
+ * @returns The converted LocalDriveNode
6
+ */
7
+ function toLocalDriveNode(node) {
8
+ return {
9
+ ...node,
10
+ type: node.type,
11
+ readonly: node.readonly ?? false,
12
+ hidden: node.hidden ?? false,
13
+ provider: "local",
14
+ links: {
15
+ view: node.type === "file" ? getLocalDriveFileUrl(node.id, { disposition: "inline" }) : null,
16
+ download: node.type === "file" ? getLocalDriveFileUrl(node.id, { disposition: "attachment" }) : null,
17
+ preview: node.type === "file" ? getLocalDriveFileUrl(node.id) : null,
18
+ thumbnail: node.type === "file" ? getLocalDriveFileUrl(node.id, { variant: "preview-256" }) : null
19
+ },
20
+ availability: "ready"
21
+ };
22
+ }
23
+ /**
24
+ * Check if the node is a file
25
+ */
26
+ function isLocalDriveFile(node) {
27
+ return node.type === "file";
28
+ }
29
+ /**
30
+ * Check if the node is a folder
31
+ */
32
+ function isLocalDriveFolder(node) {
33
+ return node.type === "folder";
34
+ }
35
+ /**
36
+ * Get file url
37
+ */
38
+ function getLocalDriveFileUrl(id, options = {}) {
39
+ const searchParams = new URLSearchParams();
40
+ if (options?.variant) searchParams.set("variant", options.variant);
41
+ if (options?.disposition) searchParams.set("disposition", options.disposition);
42
+ const queryString = searchParams.toString();
43
+ return `/api/drive/files/${id}${queryString ? `?${queryString}` : ""}`;
44
+ }
45
+ /**
46
+ * Image loader
47
+ */
48
+ function localDriveImageLoader({ src, width }) {
49
+ const url = new URL(src, window.location.origin);
50
+ url.searchParams.set("variant", `preview-${width}`);
51
+ return url.toString();
52
+ }
53
+ function inferLocalDriveNodeSubtype({ name, contentType }) {
54
+ if (contentType?.startsWith("image/")) return "image";
55
+ if (contentType === "application/pdf") return "document";
56
+ if (contentType?.includes("spreadsheet")) return "spreadsheet";
57
+ if (contentType?.startsWith("video/")) return "video";
58
+ if (contentType?.startsWith("audio/")) return "audio";
59
+ if (contentType?.includes("zip") || contentType?.includes("archive")) return "archive";
60
+ const ext = name?.split(".").pop()?.toLowerCase();
61
+ if ([
62
+ "jpg",
63
+ "jpeg",
64
+ "png",
65
+ "gif",
66
+ "bmp",
67
+ "webp"
68
+ ].includes(ext ?? "")) return "image";
69
+ if ([
70
+ "pdf",
71
+ "doc",
72
+ "docx",
73
+ "txt"
74
+ ].includes(ext ?? "")) return "document";
75
+ if ([
76
+ "xls",
77
+ "xlsx",
78
+ "ods"
79
+ ].includes(ext ?? "")) return "spreadsheet";
80
+ if ([
81
+ "zip",
82
+ "rar",
83
+ "7z"
84
+ ].includes(ext ?? "")) return "archive";
85
+ return "other";
86
+ }
87
+ /**
88
+ * Render bytes
89
+ */
90
+ function renderBytes(bytes) {
91
+ const units = [
92
+ "B",
93
+ "KB",
94
+ "MB",
95
+ "GB",
96
+ "TB",
97
+ "PB"
98
+ ];
99
+ let size = bytes;
100
+ let unitIndex = 0;
101
+ while (size >= 1024 && unitIndex < units.length - 1) {
102
+ size /= 1024;
103
+ unitIndex++;
104
+ }
105
+ return `${size.toFixed(2)}${units[unitIndex]}`;
106
+ }
107
+
108
+ //#endregion
109
+ export { getLocalDriveFileUrl, inferLocalDriveNodeSubtype, isLocalDriveFile, isLocalDriveFolder, localDriveImageLoader, renderBytes, toLocalDriveNode };
110
+ //# sourceMappingURL=helpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.mjs","names":[],"sources":["../../../../src/providers/local/lib/helpers.ts"],"sourcesContent":["import type { ImageLoaderProps } from \"next/image\";\nimport type { nodeSubtypes } from \"./constants\";\nimport type { GetLocalFileURLSchema, LocalDriveNode, LocalNode } from \"./validators\";\n\n/**\n * Convert a LocalNode to LocalDriveNode by adding provider and links\n * @param node The LocalNode to convert\n * @returns The converted LocalDriveNode\n */\nexport function toLocalDriveNode<TNode extends LocalNode>(node: TNode): LocalDriveNode {\n return {\n ...node,\n type: node.type as LocalDriveNode[\"type\"],\n readonly: node.readonly ?? false,\n hidden: node.hidden ?? false,\n provider: \"local\" as const,\n links: {\n view: node.type === \"file\" ? getLocalDriveFileUrl(node.id, { disposition: \"inline\" }) : null,\n download:\n node.type === \"file\" ? getLocalDriveFileUrl(node.id, { disposition: \"attachment\" }) : null,\n preview: node.type === \"file\" ? getLocalDriveFileUrl(node.id) : null,\n thumbnail:\n node.type === \"file\" ? getLocalDriveFileUrl(node.id, { variant: \"preview-256\" }) : null,\n },\n availability: \"ready\" as const,\n } satisfies LocalDriveNode;\n}\n\n/**\n * Check if the node is a file\n */\nexport function isLocalDriveFile(node: Pick<LocalNode, \"type\">): node is LocalNode {\n return node.type === \"file\";\n}\n\n/**\n * Check if the node is a folder\n */\nexport function isLocalDriveFolder(node: Pick<LocalNode, \"type\">): node is LocalNode {\n return node.type === \"folder\";\n}\n\n/**\n * Get file url\n */\nexport function getLocalDriveFileUrl(id: string, options: Partial<GetLocalFileURLSchema> = {}) {\n const searchParams = new URLSearchParams();\n if (options?.variant) searchParams.set(\"variant\", options.variant);\n if (options?.disposition) searchParams.set(\"disposition\", options.disposition);\n\n const queryString = searchParams.toString();\n return `/api/drive/files/${id}${queryString ? `?${queryString}` : \"\"}`;\n}\n\n/**\n * Image loader\n */\nexport function localDriveImageLoader({ src, width }: ImageLoaderProps) {\n const url = new URL(src, window.location.origin);\n url.searchParams.set(\"variant\", `preview-${width}`);\n return url.toString();\n}\n\n/**\n * Node subtype inference\n */\nexport type LocalDriveNodeSubtype = (typeof nodeSubtypes)[number];\n\nexport function inferLocalDriveNodeSubtype({\n name,\n contentType,\n}: Partial<Pick<LocalDriveNode, \"name\" | \"contentType\">>): LocalDriveNodeSubtype {\n if (contentType?.startsWith(\"image/\")) return \"image\";\n if (contentType === \"application/pdf\") return \"document\";\n if (contentType?.includes(\"spreadsheet\")) return \"spreadsheet\";\n if (contentType?.startsWith(\"video/\")) return \"video\";\n if (contentType?.startsWith(\"audio/\")) return \"audio\";\n if (contentType?.includes(\"zip\") || contentType?.includes(\"archive\")) return \"archive\";\n\n const ext = name?.split(\".\").pop()?.toLowerCase();\n if ([\"jpg\", \"jpeg\", \"png\", \"gif\", \"bmp\", \"webp\"].includes(ext ?? \"\")) return \"image\";\n if ([\"pdf\", \"doc\", \"docx\", \"txt\"].includes(ext ?? \"\")) return \"document\";\n if ([\"xls\", \"xlsx\", \"ods\"].includes(ext ?? \"\")) return \"spreadsheet\";\n if ([\"zip\", \"rar\", \"7z\"].includes(ext ?? \"\")) return \"archive\";\n\n return \"other\";\n}\n\n/**\n * Render bytes\n */\nexport function renderBytes(bytes: number) {\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(2)}${units[unitIndex]}`;\n}\n"],"mappings":";;;;;;AASA,SAAgB,iBAA0C,MAA6B;AACrF,QAAO;EACL,GAAG;EACH,MAAM,KAAK;EACX,UAAU,KAAK,YAAY;EAC3B,QAAQ,KAAK,UAAU;EACvB,UAAU;EACV,OAAO;GACL,MAAM,KAAK,SAAS,SAAS,qBAAqB,KAAK,IAAI,EAAE,aAAa,UAAU,CAAC,GAAG;GACxF,UACE,KAAK,SAAS,SAAS,qBAAqB,KAAK,IAAI,EAAE,aAAa,cAAc,CAAC,GAAG;GACxF,SAAS,KAAK,SAAS,SAAS,qBAAqB,KAAK,GAAG,GAAG;GAChE,WACE,KAAK,SAAS,SAAS,qBAAqB,KAAK,IAAI,EAAE,SAAS,eAAe,CAAC,GAAG;GACtF;EACD,cAAc;EACf;;;;;AAMH,SAAgB,iBAAiB,MAAkD;AACjF,QAAO,KAAK,SAAS;;;;;AAMvB,SAAgB,mBAAmB,MAAkD;AACnF,QAAO,KAAK,SAAS;;;;;AAMvB,SAAgB,qBAAqB,IAAY,UAA0C,EAAE,EAAE;CAC7F,MAAM,eAAe,IAAI,iBAAiB;AAC1C,KAAI,SAAS,QAAS,cAAa,IAAI,WAAW,QAAQ,QAAQ;AAClE,KAAI,SAAS,YAAa,cAAa,IAAI,eAAe,QAAQ,YAAY;CAE9E,MAAM,cAAc,aAAa,UAAU;AAC3C,QAAO,oBAAoB,KAAK,cAAc,IAAI,gBAAgB;;;;;AAMpE,SAAgB,sBAAsB,EAAE,KAAK,SAA2B;CACtE,MAAM,MAAM,IAAI,IAAI,KAAK,OAAO,SAAS,OAAO;AAChD,KAAI,aAAa,IAAI,WAAW,WAAW,QAAQ;AACnD,QAAO,IAAI,UAAU;;AAQvB,SAAgB,2BAA2B,EACzC,MACA,eAC+E;AAC/E,KAAI,aAAa,WAAW,SAAS,CAAE,QAAO;AAC9C,KAAI,gBAAgB,kBAAmB,QAAO;AAC9C,KAAI,aAAa,SAAS,cAAc,CAAE,QAAO;AACjD,KAAI,aAAa,WAAW,SAAS,CAAE,QAAO;AAC9C,KAAI,aAAa,WAAW,SAAS,CAAE,QAAO;AAC9C,KAAI,aAAa,SAAS,MAAM,IAAI,aAAa,SAAS,UAAU,CAAE,QAAO;CAE7E,MAAM,MAAM,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,aAAa;AACjD,KAAI;EAAC;EAAO;EAAQ;EAAO;EAAO;EAAO;EAAO,CAAC,SAAS,OAAO,GAAG,CAAE,QAAO;AAC7E,KAAI;EAAC;EAAO;EAAO;EAAQ;EAAM,CAAC,SAAS,OAAO,GAAG,CAAE,QAAO;AAC9D,KAAI;EAAC;EAAO;EAAQ;EAAM,CAAC,SAAS,OAAO,GAAG,CAAE,QAAO;AACvD,KAAI;EAAC;EAAO;EAAO;EAAK,CAAC,SAAS,OAAO,GAAG,CAAE,QAAO;AAErD,QAAO;;;;;AAMT,SAAgB,YAAY,OAAe;CACzC,MAAM,QAAQ;EAAC;EAAK;EAAM;EAAM;EAAM;EAAM;EAAK;CAEjD,IAAI,OAAO;CACX,IAAI,YAAY;AAEhB,QAAO,QAAQ,QAAQ,YAAY,MAAM,SAAS,GAAG;AACnD,UAAQ;AACR;;AAGF,QAAO,GAAG,KAAK,QAAQ,EAAE,GAAG,MAAM"}
@@ -0,0 +1,34 @@
1
+ import { LocalDrive } from "./service.server.mjs";
2
+ import { TDatabaseSchema, TulipContext } from "@tulip-systems/core/config";
3
+ import { NextRequest } from "next/server";
4
+
5
+ //#region src/providers/local/lib/route-handler.server.d.ts
6
+ type RouteCtx = {
7
+ params: Promise<{
8
+ rest?: string[];
9
+ }>;
10
+ };
11
+ type CreateLocalDriveRouteHandlerProps<TSchema extends TDatabaseSchema> = Pick<TulipContext<TSchema>, "auth"> & {
12
+ drive: LocalDrive<TSchema>;
13
+ };
14
+ /**
15
+ * Creates a catch-all drive route handler for `/api/drive/[[...rest]]`.
16
+ *
17
+ * Current support:
18
+ * - `GET /api/drive/files/:id?variant=:variant&disposition=:disposition`
19
+ * resolves a drive node, checks access for private local assets, and redirects
20
+ * to a short-lived file URL for the requested node variant.
21
+ *
22
+ * @param props - Route handler dependencies.
23
+ * @returns Next.js route handlers for GET, POST, PUT, PATCH, and DELETE.
24
+ */
25
+ declare function createLocalDriveRouteHandler<TSchema extends TDatabaseSchema>(context: CreateLocalDriveRouteHandlerProps<TSchema>): {
26
+ GET: (request: NextRequest, ctx: RouteCtx) => Promise<Response>;
27
+ POST: () => Promise<Response>;
28
+ PUT: () => Promise<Response>;
29
+ PATCH: () => Promise<Response>;
30
+ DELETE: () => Promise<Response>;
31
+ };
32
+ //#endregion
33
+ export { createLocalDriveRouteHandler };
34
+ //# sourceMappingURL=route-handler.server.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-handler.server.d.mts","names":[],"sources":["../../../../src/providers/local/lib/route-handler.server.ts"],"mappings":";;;;;KAQK,QAAA;EACH,MAAA,EAAQ,OAAA;IAAU,IAAA;EAAA;AAAA;AAAA,KAGf,iCAAA,iBAAkD,eAAA,IAAmB,IAAA,CACxE,YAAA,CAAa,OAAA;EAGb,KAAA,EAAO,UAAA,CAAW,OAAA;AAAA;;;;AAPI;;;;;;;;iBAqBR,4BAAA,iBAA6C,eAAA,CAAA,CAC3D,OAAA,EAAS,iCAAA,CAAkC,OAAA;iBAQf,WAAA,EAAW,GAAA,EAAO,QAAA,KAAQ,OAAA,CAAA,QAAA"}