@burdenoff/microfe-files 2026.510.101

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 (289) hide show
  1. package/README.md +12 -0
  2. package/dist/config/index.d.ts +33 -0
  3. package/dist/config/index.d.ts.map +1 -0
  4. package/dist/config/index.js +28 -0
  5. package/dist/config/index.js.map +1 -0
  6. package/dist/dev/main.d.ts +1 -0
  7. package/dist/dev/main.d.ts.map +1 -0
  8. package/dist/files/FilesRoot.d.ts +31 -0
  9. package/dist/files/FilesRoot.d.ts.map +1 -0
  10. package/dist/files/FilesRoot.js +63 -0
  11. package/dist/files/FilesRoot.js.map +1 -0
  12. package/dist/files/FilesRoutes.d.ts +12 -0
  13. package/dist/files/FilesRoutes.d.ts.map +1 -0
  14. package/dist/files/FilesRoutes.js +45 -0
  15. package/dist/files/FilesRoutes.js.map +1 -0
  16. package/dist/files/components/ActionMenu.d.ts +19 -0
  17. package/dist/files/components/ActionMenu.d.ts.map +1 -0
  18. package/dist/files/components/ActionMenu.js +73 -0
  19. package/dist/files/components/ActionMenu.js.map +1 -0
  20. package/dist/files/components/ConfirmDialog.d.ts +14 -0
  21. package/dist/files/components/ConfirmDialog.d.ts.map +1 -0
  22. package/dist/files/components/ConfirmDialog.js +85 -0
  23. package/dist/files/components/ConfirmDialog.js.map +1 -0
  24. package/dist/files/components/ContextMenu.d.ts +59 -0
  25. package/dist/files/components/ContextMenu.d.ts.map +1 -0
  26. package/dist/files/components/ContextMenu.js +136 -0
  27. package/dist/files/components/ContextMenu.js.map +1 -0
  28. package/dist/files/components/CopyDialog.d.ts +12 -0
  29. package/dist/files/components/CopyDialog.d.ts.map +1 -0
  30. package/dist/files/components/CopyDialog.js +139 -0
  31. package/dist/files/components/CopyDialog.js.map +1 -0
  32. package/dist/files/components/EmptyState.d.ts +8 -0
  33. package/dist/files/components/EmptyState.d.ts.map +1 -0
  34. package/dist/files/components/EmptyState.js +66 -0
  35. package/dist/files/components/EmptyState.js.map +1 -0
  36. package/dist/files/components/FileBrowser.d.ts +37 -0
  37. package/dist/files/components/FileBrowser.d.ts.map +1 -0
  38. package/dist/files/components/FileBrowser.js +421 -0
  39. package/dist/files/components/FileBrowser.js.map +1 -0
  40. package/dist/files/components/FileCard.d.ts +30 -0
  41. package/dist/files/components/FileCard.d.ts.map +1 -0
  42. package/dist/files/components/FileCard.js +233 -0
  43. package/dist/files/components/FileCard.js.map +1 -0
  44. package/dist/files/components/FileInfoPanel.d.ts +9 -0
  45. package/dist/files/components/FileInfoPanel.d.ts.map +1 -0
  46. package/dist/files/components/FileInfoPanel.js +224 -0
  47. package/dist/files/components/FileInfoPanel.js.map +1 -0
  48. package/dist/files/components/FileListItem.d.ts +46 -0
  49. package/dist/files/components/FileListItem.d.ts.map +1 -0
  50. package/dist/files/components/FileListItem.js +235 -0
  51. package/dist/files/components/FileListItem.js.map +1 -0
  52. package/dist/files/components/FilePreviewModal.d.ts +17 -0
  53. package/dist/files/components/FilePreviewModal.d.ts.map +1 -0
  54. package/dist/files/components/FilePreviewModal.js +175 -0
  55. package/dist/files/components/FilePreviewModal.js.map +1 -0
  56. package/dist/files/components/FileVersionPanel.d.ts +9 -0
  57. package/dist/files/components/FileVersionPanel.d.ts.map +1 -0
  58. package/dist/files/components/FileVersionPanel.js +227 -0
  59. package/dist/files/components/FileVersionPanel.js.map +1 -0
  60. package/dist/files/components/FolderCard.d.ts +34 -0
  61. package/dist/files/components/FolderCard.d.ts.map +1 -0
  62. package/dist/files/components/FolderCard.js +225 -0
  63. package/dist/files/components/FolderCard.js.map +1 -0
  64. package/dist/files/components/MoveDialog.d.ts +12 -0
  65. package/dist/files/components/MoveDialog.d.ts.map +1 -0
  66. package/dist/files/components/MoveDialog.js +123 -0
  67. package/dist/files/components/MoveDialog.js.map +1 -0
  68. package/dist/files/components/SearchBar.d.ts +13 -0
  69. package/dist/files/components/SearchBar.d.ts.map +1 -0
  70. package/dist/files/components/SearchBar.js +257 -0
  71. package/dist/files/components/SearchBar.js.map +1 -0
  72. package/dist/files/components/ShareDialog.d.ts +24 -0
  73. package/dist/files/components/ShareDialog.d.ts.map +1 -0
  74. package/dist/files/components/ShareDialog.js +201 -0
  75. package/dist/files/components/ShareDialog.js.map +1 -0
  76. package/dist/files/components/TabBar.d.ts +14 -0
  77. package/dist/files/components/TabBar.d.ts.map +1 -0
  78. package/dist/files/components/TabBar.js +65 -0
  79. package/dist/files/components/TabBar.js.map +1 -0
  80. package/dist/files/components/Toast.d.ts +14 -0
  81. package/dist/files/components/Toast.d.ts.map +1 -0
  82. package/dist/files/components/Toast.js +51 -0
  83. package/dist/files/components/Toast.js.map +1 -0
  84. package/dist/files/components/UploadQueue.d.ts +21 -0
  85. package/dist/files/components/UploadQueue.d.ts.map +1 -0
  86. package/dist/files/components/UploadQueue.js +171 -0
  87. package/dist/files/components/UploadQueue.js.map +1 -0
  88. package/dist/files/components/index.d.ts +43 -0
  89. package/dist/files/components/index.d.ts.map +1 -0
  90. package/dist/files/components/viewers/AudioPlayer.d.ts +8 -0
  91. package/dist/files/components/viewers/AudioPlayer.d.ts.map +1 -0
  92. package/dist/files/components/viewers/AudioPlayer.js +102 -0
  93. package/dist/files/components/viewers/AudioPlayer.js.map +1 -0
  94. package/dist/files/components/viewers/CodeViewer.d.ts +16 -0
  95. package/dist/files/components/viewers/CodeViewer.d.ts.map +1 -0
  96. package/dist/files/components/viewers/CodeViewer.js +113 -0
  97. package/dist/files/components/viewers/CodeViewer.js.map +1 -0
  98. package/dist/files/components/viewers/ImageViewer.d.ts +8 -0
  99. package/dist/files/components/viewers/ImageViewer.d.ts.map +1 -0
  100. package/dist/files/components/viewers/ImageViewer.js +138 -0
  101. package/dist/files/components/viewers/ImageViewer.js.map +1 -0
  102. package/dist/files/components/viewers/PDFViewer.d.ts +15 -0
  103. package/dist/files/components/viewers/PDFViewer.d.ts.map +1 -0
  104. package/dist/files/components/viewers/PDFViewer.js +80 -0
  105. package/dist/files/components/viewers/PDFViewer.js.map +1 -0
  106. package/dist/files/components/viewers/TextViewer.d.ts +8 -0
  107. package/dist/files/components/viewers/TextViewer.d.ts.map +1 -0
  108. package/dist/files/components/viewers/TextViewer.js +121 -0
  109. package/dist/files/components/viewers/TextViewer.js.map +1 -0
  110. package/dist/files/components/viewers/VideoPlayer.d.ts +8 -0
  111. package/dist/files/components/viewers/VideoPlayer.d.ts.map +1 -0
  112. package/dist/files/components/viewers/VideoPlayer.js +138 -0
  113. package/dist/files/components/viewers/VideoPlayer.js.map +1 -0
  114. package/dist/files/components/viewers/index.d.ts +7 -0
  115. package/dist/files/components/viewers/index.d.ts.map +1 -0
  116. package/dist/files/components/viewers/index.js +6 -0
  117. package/dist/files/graphql-types.d.ts +317 -0
  118. package/dist/files/graphql-types.d.ts.map +1 -0
  119. package/dist/files/hooks/useBatchOperations.d.ts +32 -0
  120. package/dist/files/hooks/useBatchOperations.d.ts.map +1 -0
  121. package/dist/files/hooks/useBatchOperations.js +18 -0
  122. package/dist/files/hooks/useBatchOperations.js.map +1 -0
  123. package/dist/files/hooks/useBinItems.d.ts +11 -0
  124. package/dist/files/hooks/useBinItems.d.ts.map +1 -0
  125. package/dist/files/hooks/useBinItems.js +27 -0
  126. package/dist/files/hooks/useBinItems.js.map +1 -0
  127. package/dist/files/hooks/useBrowsePage.d.ts +18 -0
  128. package/dist/files/hooks/useBrowsePage.d.ts.map +1 -0
  129. package/dist/files/hooks/useBrowsePage.js +34 -0
  130. package/dist/files/hooks/useBrowsePage.js.map +1 -0
  131. package/dist/files/hooks/useCopyFile.d.ts +14 -0
  132. package/dist/files/hooks/useCopyFile.d.ts.map +1 -0
  133. package/dist/files/hooks/useCopyFile.js +22 -0
  134. package/dist/files/hooks/useCopyFile.js.map +1 -0
  135. package/dist/files/hooks/useCreateFolder.d.ts +14 -0
  136. package/dist/files/hooks/useCreateFolder.d.ts.map +1 -0
  137. package/dist/files/hooks/useCreateFolder.js +14 -0
  138. package/dist/files/hooks/useCreateFolder.js.map +1 -0
  139. package/dist/files/hooks/useCreateFolderShare.d.ts +16 -0
  140. package/dist/files/hooks/useCreateFolderShare.d.ts.map +1 -0
  141. package/dist/files/hooks/useCreateFolderShare.js +14 -0
  142. package/dist/files/hooks/useCreateFolderShare.js.map +1 -0
  143. package/dist/files/hooks/useCreateShare.d.ts +16 -0
  144. package/dist/files/hooks/useCreateShare.d.ts.map +1 -0
  145. package/dist/files/hooks/useCreateShare.js +14 -0
  146. package/dist/files/hooks/useCreateShare.js.map +1 -0
  147. package/dist/files/hooks/useDeleteFile.d.ts +9 -0
  148. package/dist/files/hooks/useDeleteFile.d.ts.map +1 -0
  149. package/dist/files/hooks/useDeleteFile.js +20 -0
  150. package/dist/files/hooks/useDeleteFile.js.map +1 -0
  151. package/dist/files/hooks/useDeleteFolder.d.ts +10 -0
  152. package/dist/files/hooks/useDeleteFolder.d.ts.map +1 -0
  153. package/dist/files/hooks/useDeleteFolder.js +24 -0
  154. package/dist/files/hooks/useDeleteFolder.js.map +1 -0
  155. package/dist/files/hooks/useDragDrop.d.ts +31 -0
  156. package/dist/files/hooks/useDragDrop.d.ts.map +1 -0
  157. package/dist/files/hooks/useDragDrop.js +45 -0
  158. package/dist/files/hooks/useDragDrop.js.map +1 -0
  159. package/dist/files/hooks/useFileVersions.d.ts +52 -0
  160. package/dist/files/hooks/useFileVersions.d.ts.map +1 -0
  161. package/dist/files/hooks/useFileVersions.js +52 -0
  162. package/dist/files/hooks/useFileVersions.js.map +1 -0
  163. package/dist/files/hooks/useFiles.d.ts +18 -0
  164. package/dist/files/hooks/useFiles.d.ts.map +1 -0
  165. package/dist/files/hooks/useFolder.d.ts +7 -0
  166. package/dist/files/hooks/useFolder.d.ts.map +1 -0
  167. package/dist/files/hooks/useFolderPath.d.ts +2 -0
  168. package/dist/files/hooks/useFolderPath.d.ts.map +1 -0
  169. package/dist/files/hooks/useFoldersQuery.d.ts +7 -0
  170. package/dist/files/hooks/useFoldersQuery.d.ts.map +1 -0
  171. package/dist/files/hooks/useFoldersQuery.js +13 -0
  172. package/dist/files/hooks/useFoldersQuery.js.map +1 -0
  173. package/dist/files/hooks/useKeyboardNavigation.d.ts +17 -0
  174. package/dist/files/hooks/useKeyboardNavigation.d.ts.map +1 -0
  175. package/dist/files/hooks/useKeyboardNavigation.js +105 -0
  176. package/dist/files/hooks/useKeyboardNavigation.js.map +1 -0
  177. package/dist/files/hooks/useMoveFile.d.ts +10 -0
  178. package/dist/files/hooks/useMoveFile.d.ts.map +1 -0
  179. package/dist/files/hooks/useMoveFile.js +21 -0
  180. package/dist/files/hooks/useMoveFile.js.map +1 -0
  181. package/dist/files/hooks/useMoveFolder.d.ts +10 -0
  182. package/dist/files/hooks/useMoveFolder.d.ts.map +1 -0
  183. package/dist/files/hooks/useMoveFolder.js +21 -0
  184. package/dist/files/hooks/useMoveFolder.js.map +1 -0
  185. package/dist/files/hooks/usePermanentlyDeleteFile.d.ts +9 -0
  186. package/dist/files/hooks/usePermanentlyDeleteFile.d.ts.map +1 -0
  187. package/dist/files/hooks/usePermanentlyDeleteFile.js +18 -0
  188. package/dist/files/hooks/usePermanentlyDeleteFile.js.map +1 -0
  189. package/dist/files/hooks/usePermanentlyDeleteFolder.d.ts +9 -0
  190. package/dist/files/hooks/usePermanentlyDeleteFolder.d.ts.map +1 -0
  191. package/dist/files/hooks/usePermanentlyDeleteFolder.js +18 -0
  192. package/dist/files/hooks/usePermanentlyDeleteFolder.js.map +1 -0
  193. package/dist/files/hooks/useRecentFiles.d.ts +10 -0
  194. package/dist/files/hooks/useRecentFiles.d.ts.map +1 -0
  195. package/dist/files/hooks/useRecentFiles.js +24 -0
  196. package/dist/files/hooks/useRecentFiles.js.map +1 -0
  197. package/dist/files/hooks/useRenameFile.d.ts +10 -0
  198. package/dist/files/hooks/useRenameFile.d.ts.map +1 -0
  199. package/dist/files/hooks/useRenameFile.js +21 -0
  200. package/dist/files/hooks/useRenameFile.js.map +1 -0
  201. package/dist/files/hooks/useRenameFolder.d.ts +10 -0
  202. package/dist/files/hooks/useRenameFolder.d.ts.map +1 -0
  203. package/dist/files/hooks/useRenameFolder.js +21 -0
  204. package/dist/files/hooks/useRenameFolder.js.map +1 -0
  205. package/dist/files/hooks/useRestoreFile.d.ts +9 -0
  206. package/dist/files/hooks/useRestoreFile.d.ts.map +1 -0
  207. package/dist/files/hooks/useRestoreFile.js +21 -0
  208. package/dist/files/hooks/useRestoreFile.js.map +1 -0
  209. package/dist/files/hooks/useRestoreFolder.d.ts +9 -0
  210. package/dist/files/hooks/useRestoreFolder.d.ts.map +1 -0
  211. package/dist/files/hooks/useRestoreFolder.js +21 -0
  212. package/dist/files/hooks/useRestoreFolder.js.map +1 -0
  213. package/dist/files/hooks/useSearch.d.ts +15 -0
  214. package/dist/files/hooks/useSearch.d.ts.map +1 -0
  215. package/dist/files/hooks/useSearch.js +27 -0
  216. package/dist/files/hooks/useSearch.js.map +1 -0
  217. package/dist/files/hooks/useStarredItems.d.ts +10 -0
  218. package/dist/files/hooks/useStarredItems.d.ts.map +1 -0
  219. package/dist/files/hooks/useStarredItems.js +18 -0
  220. package/dist/files/hooks/useStarredItems.js.map +1 -0
  221. package/dist/files/hooks/useToast.d.ts +11 -0
  222. package/dist/files/hooks/useToast.d.ts.map +1 -0
  223. package/dist/files/hooks/useToast.js +28 -0
  224. package/dist/files/hooks/useToast.js.map +1 -0
  225. package/dist/files/hooks/useToggleStar.d.ts +10 -0
  226. package/dist/files/hooks/useToggleStar.d.ts.map +1 -0
  227. package/dist/files/hooks/useToggleStar.js +26 -0
  228. package/dist/files/hooks/useToggleStar.js.map +1 -0
  229. package/dist/files/hooks/useUploadFile.d.ts +25 -0
  230. package/dist/files/hooks/useUploadFile.d.ts.map +1 -0
  231. package/dist/files/hooks/useUploadFile.js +74 -0
  232. package/dist/files/hooks/useUploadFile.js.map +1 -0
  233. package/dist/files/index.d.ts +29 -0
  234. package/dist/files/index.d.ts.map +1 -0
  235. package/dist/files/index.js +3 -0
  236. package/dist/files/pages/BrowserPage.d.ts +5 -0
  237. package/dist/files/pages/BrowserPage.d.ts.map +1 -0
  238. package/dist/files/pages/BrowserPage.js +1014 -0
  239. package/dist/files/pages/BrowserPage.js.map +1 -0
  240. package/dist/files/pages/ShareAccessPage.d.ts +2 -0
  241. package/dist/files/pages/ShareAccessPage.d.ts.map +1 -0
  242. package/dist/files/pages/ShareAccessPage.js +162 -0
  243. package/dist/files/pages/ShareAccessPage.js.map +1 -0
  244. package/dist/files/providers/FilesProvider.d.ts +25 -0
  245. package/dist/files/providers/FilesProvider.d.ts.map +1 -0
  246. package/dist/files/providers/FilesProvider.js +18 -0
  247. package/dist/files/providers/FilesProvider.js.map +1 -0
  248. package/dist/files/store/filesStore.d.ts +99 -0
  249. package/dist/files/store/filesStore.d.ts.map +1 -0
  250. package/dist/files/store/filesStore.js +129 -0
  251. package/dist/files/store/filesStore.js.map +1 -0
  252. package/dist/files/types.d.ts +266 -0
  253. package/dist/files/types.d.ts.map +1 -0
  254. package/dist/files/utils/events.d.ts +6 -0
  255. package/dist/files/utils/events.d.ts.map +1 -0
  256. package/dist/files/utils/events.js +16 -0
  257. package/dist/files/utils/events.js.map +1 -0
  258. package/dist/files/utils/i18n.d.ts +5 -0
  259. package/dist/files/utils/i18n.d.ts.map +1 -0
  260. package/dist/files/utils/i18n.js +15 -0
  261. package/dist/files/utils/i18n.js.map +1 -0
  262. package/dist/files/utils/index.d.ts +74 -0
  263. package/dist/files/utils/index.d.ts.map +1 -0
  264. package/dist/files/utils/index.js +50 -0
  265. package/dist/files/utils/index.js.map +1 -0
  266. package/dist/files/utils/thumbnail.d.ts +5 -0
  267. package/dist/files/utils/thumbnail.d.ts.map +1 -0
  268. package/dist/files/utils/thumbnail.js +39 -0
  269. package/dist/files/utils/thumbnail.js.map +1 -0
  270. package/dist/files.d.ts +2 -0
  271. package/dist/files.js +6 -0
  272. package/dist/generated/global-operations.d.ts +2 -0
  273. package/dist/generated/global-operations.d.ts.map +1 -0
  274. package/dist/generated/global-types.d.ts +21253 -0
  275. package/dist/generated/global-types.d.ts.map +1 -0
  276. package/dist/generated/wspace-operations.d.ts +2706 -0
  277. package/dist/generated/wspace-operations.d.ts.map +1 -0
  278. package/dist/generated/wspace-operations.js +1085 -0
  279. package/dist/generated/wspace-operations.js.map +1 -0
  280. package/dist/generated/wspace-types.d.ts +55214 -0
  281. package/dist/generated/wspace-types.d.ts.map +1 -0
  282. package/dist/index.d.ts +30 -0
  283. package/dist/index.d.ts.map +1 -0
  284. package/dist/shared/types/index.d.ts +101 -0
  285. package/dist/shared/types/index.d.ts.map +1 -0
  286. package/dist/utils/nativeBridge.d.ts +3 -0
  287. package/dist/utils/nativeBridge.d.ts.map +1 -0
  288. package/dist/utils/nativeBridge.js +2 -0
  289. package/package.json +126 -0
@@ -0,0 +1,129 @@
1
+ import { create as e } from "zustand";
2
+ import { devtools as t, persist as n } from "zustand/middleware";
3
+ import { createProfileScopedStorage as r } from "@burdenoff/fe-libs/shared/utils";
4
+ //#region src/files/store/filesStore.ts
5
+ var i = {
6
+ currentFolder: null,
7
+ viewMode: "grid",
8
+ sortBy: "date",
9
+ sortDirection: "desc",
10
+ selectedFiles: /* @__PURE__ */ new Set(),
11
+ selectedFolders: /* @__PURE__ */ new Set(),
12
+ uploadQueue: [],
13
+ isUploadPanelOpen: !1,
14
+ previewFile: null,
15
+ isPreviewOpen: !1,
16
+ filters: {},
17
+ breadcrumbs: [],
18
+ isSidebarOpen: !0,
19
+ isShareDialogOpen: !1,
20
+ shareDialogFile: null
21
+ }, a = e()(t(n((e, t) => ({
22
+ ...i,
23
+ setCurrentFolder: (t) => e({ currentFolder: t }),
24
+ setBreadcrumbs: (t) => e({ breadcrumbs: t }),
25
+ navigateToFolder: (t, n) => e((e) => ({ breadcrumbs: [...e.breadcrumbs, {
26
+ id: t,
27
+ name: n
28
+ }] })),
29
+ navigateUp: () => e((e) => ({ breadcrumbs: e.breadcrumbs.slice(0, -1) })),
30
+ navigateToRoot: () => e({
31
+ breadcrumbs: [],
32
+ currentFolder: null
33
+ }),
34
+ setViewMode: (t) => e({ viewMode: t }),
35
+ setSortBy: (t) => e({ sortBy: t }),
36
+ toggleSortDirection: () => e((e) => ({ sortDirection: e.sortDirection === "asc" ? "desc" : "asc" })),
37
+ selectFile: (t) => e((e) => {
38
+ let n = new Set(e.selectedFiles);
39
+ return n.add(t), { selectedFiles: n };
40
+ }),
41
+ deselectFile: (t) => e((e) => {
42
+ let n = new Set(e.selectedFiles);
43
+ return n.delete(t), { selectedFiles: n };
44
+ }),
45
+ toggleFileSelection: (t) => e((e) => {
46
+ let n = new Set(e.selectedFiles);
47
+ return n.has(t) ? n.delete(t) : n.add(t), { selectedFiles: n };
48
+ }),
49
+ selectAllFiles: (t) => e({ selectedFiles: new Set(t) }),
50
+ clearFileSelection: () => e({ selectedFiles: /* @__PURE__ */ new Set() }),
51
+ selectFolder: (t) => e((e) => {
52
+ let n = new Set(e.selectedFolders);
53
+ return n.add(t), { selectedFolders: n };
54
+ }),
55
+ deselectFolder: (t) => e((e) => {
56
+ let n = new Set(e.selectedFolders);
57
+ return n.delete(t), { selectedFolders: n };
58
+ }),
59
+ toggleFolderSelection: (t) => e((e) => {
60
+ let n = new Set(e.selectedFolders);
61
+ return n.has(t) ? n.delete(t) : n.add(t), { selectedFolders: n };
62
+ }),
63
+ selectAllFolders: (t) => e({ selectedFolders: new Set(t) }),
64
+ clearSelection: () => e({
65
+ selectedFiles: /* @__PURE__ */ new Set(),
66
+ selectedFolders: /* @__PURE__ */ new Set()
67
+ }),
68
+ addToUploadQueue: (t) => e((e) => ({
69
+ uploadQueue: [...e.uploadQueue, ...t],
70
+ isUploadPanelOpen: !0
71
+ })),
72
+ updateUploadItem: (t, n) => e((e) => ({ uploadQueue: e.uploadQueue.map((e) => e.id === t ? {
73
+ ...e,
74
+ ...n
75
+ } : e) })),
76
+ removeFromUploadQueue: (t) => e((e) => ({ uploadQueue: e.uploadQueue.filter((e) => e.id !== t) })),
77
+ clearUploadQueue: () => e({ uploadQueue: [] }),
78
+ setUploadPanelOpen: (t) => e({ isUploadPanelOpen: t }),
79
+ openPreview: (t) => e({
80
+ previewFile: t,
81
+ isPreviewOpen: !0
82
+ }),
83
+ closePreview: () => e({
84
+ previewFile: null,
85
+ isPreviewOpen: !1
86
+ }),
87
+ previewNextFile: (t) => e((e) => {
88
+ if (!e.previewFile) return {};
89
+ let n = t.findIndex((t) => t.id === e.previewFile?.id) + 1;
90
+ return n < t.length ? { previewFile: t[n] } : {};
91
+ }),
92
+ previewPreviousFile: (t) => e((e) => {
93
+ if (!e.previewFile) return {};
94
+ let n = t.findIndex((t) => t.id === e.previewFile?.id) - 1;
95
+ return n >= 0 ? { previewFile: t[n] } : {};
96
+ }),
97
+ setFilters: (t) => e((e) => ({ filters: {
98
+ ...e.filters,
99
+ ...t
100
+ } })),
101
+ clearFilters: () => e({ filters: {} }),
102
+ toggleSidebar: () => e((e) => ({ isSidebarOpen: !e.isSidebarOpen })),
103
+ setSidebarOpen: (t) => e({ isSidebarOpen: t }),
104
+ openShareDialog: (t) => e({
105
+ isShareDialogOpen: !0,
106
+ shareDialogFile: t
107
+ }),
108
+ closeShareDialog: () => e({
109
+ isShareDialogOpen: !1,
110
+ shareDialogFile: null
111
+ }),
112
+ reset: () => e(i)
113
+ }), {
114
+ name: "burdenoff-files-storage",
115
+ storage: r(),
116
+ partialize: (e) => ({
117
+ viewMode: e.viewMode,
118
+ sortBy: e.sortBy,
119
+ sortDirection: e.sortDirection,
120
+ isSidebarOpen: e.isSidebarOpen
121
+ })
122
+ }), {
123
+ name: "Files Store",
124
+ enabled: !1
125
+ }));
126
+ //#endregion
127
+ export { a as useFilesStore };
128
+
129
+ //# sourceMappingURL=filesStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filesStore.js","names":[],"sources":["../../../src/files/store/filesStore.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools, persist } from \"zustand/middleware\";\nimport { createProfileScopedStorage } from \"@burdenoff/fe-libs/shared/utils\";\nimport type {\n FileViewMode,\n FileSortBy,\n FileSortDirection,\n FolderItem,\n FileItem,\n UploadItem,\n FileFilters,\n} from \"../types\";\n\ninterface FilesState {\n // View state\n currentFolder: FolderItem | null;\n viewMode: FileViewMode;\n sortBy: FileSortBy;\n sortDirection: FileSortDirection;\n\n // Selection state\n selectedFiles: Set<string>;\n selectedFolders: Set<string>;\n\n // Upload state\n uploadQueue: UploadItem[];\n isUploadPanelOpen: boolean;\n\n // Preview state\n previewFile: FileItem | null;\n isPreviewOpen: boolean;\n\n // Filter state\n filters: FileFilters;\n\n // Breadcrumb state\n breadcrumbs: Array<{ id: string; name: string }>;\n\n // UI state\n isSidebarOpen: boolean;\n isShareDialogOpen: boolean;\n shareDialogFile: FileItem | null;\n\n // Actions - Folder navigation\n setCurrentFolder: (folder: FolderItem | null) => void;\n setBreadcrumbs: (breadcrumbs: Array<{ id: string; name: string }>) => void;\n navigateToFolder: (folderId: string, folderName: string) => void;\n navigateUp: () => void;\n navigateToRoot: () => void;\n\n // Actions - View\n setViewMode: (mode: FileViewMode) => void;\n setSortBy: (sortBy: FileSortBy) => void;\n toggleSortDirection: () => void;\n\n // Actions - Selection\n selectFile: (fileId: string) => void;\n deselectFile: (fileId: string) => void;\n toggleFileSelection: (fileId: string) => void;\n selectAllFiles: (fileIds: string[]) => void;\n clearFileSelection: () => void;\n selectFolder: (folderId: string) => void;\n deselectFolder: (folderId: string) => void;\n toggleFolderSelection: (folderId: string) => void;\n selectAllFolders: (folderIds: string[]) => void;\n clearSelection: () => void;\n\n // Actions - Upload\n addToUploadQueue: (items: UploadItem[]) => void;\n updateUploadItem: (id: string, updates: Partial<UploadItem>) => void;\n removeFromUploadQueue: (id: string) => void;\n clearUploadQueue: () => void;\n setUploadPanelOpen: (open: boolean) => void;\n\n // Actions - Preview\n openPreview: (file: FileItem) => void;\n closePreview: () => void;\n previewNextFile: (files: FileItem[]) => void;\n previewPreviousFile: (files: FileItem[]) => void;\n\n // Actions - Filters\n setFilters: (filters: Partial<FileFilters>) => void;\n clearFilters: () => void;\n\n // Actions - UI\n toggleSidebar: () => void;\n setSidebarOpen: (open: boolean) => void;\n openShareDialog: (file: FileItem) => void;\n closeShareDialog: () => void;\n\n // Actions - Reset\n reset: () => void;\n}\n\nconst initialState = {\n currentFolder: null,\n viewMode: \"grid\" as FileViewMode,\n sortBy: \"date\" as FileSortBy,\n sortDirection: \"desc\" as FileSortDirection,\n selectedFiles: new Set<string>(),\n selectedFolders: new Set<string>(),\n uploadQueue: [],\n isUploadPanelOpen: false,\n previewFile: null,\n isPreviewOpen: false,\n filters: {},\n breadcrumbs: [],\n isSidebarOpen: true,\n isShareDialogOpen: false,\n shareDialogFile: null,\n};\n\nexport const useFilesStore = create<FilesState>()(\n devtools(\n persist(\n (set, get) => ({\n ...initialState,\n\n // Folder navigation\n setCurrentFolder: (folder) => set({ currentFolder: folder }),\n\n setBreadcrumbs: (breadcrumbs) => set({ breadcrumbs }),\n\n navigateToFolder: (folderId, folderName) =>\n set((state) => ({\n breadcrumbs: [\n ...state.breadcrumbs,\n { id: folderId, name: folderName },\n ],\n })),\n\n navigateUp: () =>\n set((state) => ({\n breadcrumbs: state.breadcrumbs.slice(0, -1),\n })),\n\n navigateToRoot: () =>\n set({\n breadcrumbs: [],\n currentFolder: null,\n }),\n\n // View\n setViewMode: (mode) => set({ viewMode: mode }),\n setSortBy: (sortBy) => set({ sortBy }),\n toggleSortDirection: () =>\n set((state) => ({\n sortDirection: state.sortDirection === \"asc\" ? \"desc\" : \"asc\",\n })),\n\n // Selection\n selectFile: (fileId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFiles);\n newSelected.add(fileId);\n return { selectedFiles: newSelected };\n }),\n\n deselectFile: (fileId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFiles);\n newSelected.delete(fileId);\n return { selectedFiles: newSelected };\n }),\n\n toggleFileSelection: (fileId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFiles);\n if (newSelected.has(fileId)) {\n newSelected.delete(fileId);\n } else {\n newSelected.add(fileId);\n }\n return { selectedFiles: newSelected };\n }),\n\n selectAllFiles: (fileIds) => set({ selectedFiles: new Set(fileIds) }),\n\n clearFileSelection: () => set({ selectedFiles: new Set() }),\n\n selectFolder: (folderId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFolders);\n newSelected.add(folderId);\n return { selectedFolders: newSelected };\n }),\n\n deselectFolder: (folderId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFolders);\n newSelected.delete(folderId);\n return { selectedFolders: newSelected };\n }),\n\n toggleFolderSelection: (folderId) =>\n set((state) => {\n const newSelected = new Set(state.selectedFolders);\n if (newSelected.has(folderId)) {\n newSelected.delete(folderId);\n } else {\n newSelected.add(folderId);\n }\n return { selectedFolders: newSelected };\n }),\n\n selectAllFolders: (folderIds) =>\n set({ selectedFolders: new Set(folderIds) }),\n\n clearSelection: () =>\n set({\n selectedFiles: new Set(),\n selectedFolders: new Set(),\n }),\n\n // Upload\n addToUploadQueue: (items) =>\n set((state) => ({\n uploadQueue: [...state.uploadQueue, ...items],\n isUploadPanelOpen: true,\n })),\n\n updateUploadItem: (id, updates) =>\n set((state) => ({\n uploadQueue: state.uploadQueue.map((item) =>\n item.id === id ? { ...item, ...updates } : item,\n ),\n })),\n\n removeFromUploadQueue: (id) =>\n set((state) => ({\n uploadQueue: state.uploadQueue.filter((item) => item.id !== id),\n })),\n\n clearUploadQueue: () => set({ uploadQueue: [] }),\n\n setUploadPanelOpen: (open) => set({ isUploadPanelOpen: open }),\n\n // Preview\n openPreview: (file) =>\n set({\n previewFile: file,\n isPreviewOpen: true,\n }),\n\n closePreview: () =>\n set({\n previewFile: null,\n isPreviewOpen: false,\n }),\n\n previewNextFile: (files) =>\n set((state) => {\n if (!state.previewFile) return {};\n const currentIndex = files.findIndex(\n (f) => f.id === state.previewFile?.id,\n );\n const nextIndex = currentIndex + 1;\n if (nextIndex < files.length) {\n return { previewFile: files[nextIndex] };\n }\n return {};\n }),\n\n previewPreviousFile: (files) =>\n set((state) => {\n if (!state.previewFile) return {};\n const currentIndex = files.findIndex(\n (f) => f.id === state.previewFile?.id,\n );\n const prevIndex = currentIndex - 1;\n if (prevIndex >= 0) {\n return { previewFile: files[prevIndex] };\n }\n return {};\n }),\n\n // Filters\n setFilters: (filters) =>\n set((state) => ({\n filters: { ...state.filters, ...filters },\n })),\n\n clearFilters: () => set({ filters: {} }),\n\n // UI\n toggleSidebar: () =>\n set((state) => ({ isSidebarOpen: !state.isSidebarOpen })),\n\n setSidebarOpen: (open) => set({ isSidebarOpen: open }),\n\n openShareDialog: (file) =>\n set({\n isShareDialogOpen: true,\n shareDialogFile: file,\n }),\n\n closeShareDialog: () =>\n set({\n isShareDialogOpen: false,\n shareDialogFile: null,\n }),\n\n // Reset\n reset: () => set(initialState),\n }),\n {\n name: \"burdenoff-files-storage\",\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n viewMode: state.viewMode,\n sortBy: state.sortBy,\n sortDirection: state.sortDirection,\n isSidebarOpen: state.isSidebarOpen,\n }),\n },\n ),\n { name: \"Files Store\", enabled: import.meta.env.DEV },\n ),\n);\n"],"mappings":"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"}
@@ -0,0 +1,266 @@
1
+ import { MicrofrontendRootProps, NavItem, FooterItem } from '../shared/types/index';
2
+ export type { NavItem, FooterItem };
3
+ /**
4
+ * Props for the FilesRoot component
5
+ */
6
+ export interface FilesRootProps extends MicrofrontendRootProps {
7
+ /**
8
+ * Optional function to register navigation items with the shell
9
+ * Injected by the shell app
10
+ */
11
+ registerNavItems?: (items: NavItem | NavItem[]) => () => void;
12
+ /**
13
+ * Optional function to register footer items with the shell
14
+ * Injected by the shell app
15
+ */
16
+ registerFooterItems?: (items: FooterItem | FooterItem[]) => () => void;
17
+ /**
18
+ * Optional callback when a file is selected
19
+ */
20
+ onFileSelect?: (file: FileSummary) => void;
21
+ /**
22
+ * Optional callback when files are uploaded
23
+ */
24
+ onFilesUploaded?: (files: FileSummary[]) => void;
25
+ /**
26
+ * Optional storage quota limit in bytes
27
+ */
28
+ storageQuotaBytes?: number;
29
+ }
30
+ /**
31
+ * File summary for callbacks
32
+ */
33
+ export interface FileSummary {
34
+ id: string;
35
+ name: string;
36
+ size: number;
37
+ mimeType: string;
38
+ url: string;
39
+ thumbnailUrl?: string;
40
+ }
41
+ /**
42
+ * View mode for file browser
43
+ */
44
+ export type FileViewMode = "grid" | "list" | "tree";
45
+ /**
46
+ * File sort options
47
+ */
48
+ export type FileSortBy = "name" | "date" | "size" | "type";
49
+ /**
50
+ * File sort direction
51
+ */
52
+ export type FileSortDirection = "asc" | "desc";
53
+ /**
54
+ * File upload status
55
+ */
56
+ export type UploadStatus = "pending" | "uploading" | "paused" | "completed" | "failed";
57
+ /**
58
+ * File item in the browser
59
+ */
60
+ export interface FileItem {
61
+ id: string;
62
+ name: string;
63
+ description?: string;
64
+ size: number;
65
+ mimeType: string;
66
+ extension: string;
67
+ url: string;
68
+ s3Key: string;
69
+ thumbnailUrl?: string;
70
+ versionNumber?: number;
71
+ workspaceId: string;
72
+ folderId?: string | null;
73
+ status?: string;
74
+ visibility?: string;
75
+ starred?: boolean;
76
+ createdAt: string;
77
+ createdBy?: {
78
+ id: string;
79
+ name: string;
80
+ avatar?: string;
81
+ };
82
+ createdById?: string;
83
+ updatedAt: string;
84
+ updatedBy?: {
85
+ id: string;
86
+ name: string;
87
+ avatar?: string;
88
+ };
89
+ tags?: string[];
90
+ isFavorite?: boolean;
91
+ isShared?: boolean;
92
+ downloadUrl?: string;
93
+ canRead?: boolean;
94
+ canUpdate?: boolean;
95
+ canWrite?: boolean;
96
+ canDelete?: boolean;
97
+ canShare?: boolean;
98
+ canAdmin?: boolean;
99
+ }
100
+ /**
101
+ * Folder item in the browser
102
+ */
103
+ export interface FolderItem {
104
+ id: string;
105
+ name: string;
106
+ description?: string;
107
+ workspaceId: string;
108
+ parentFolderId?: string | null;
109
+ path?: string;
110
+ level?: number;
111
+ status?: string;
112
+ visibility?: string;
113
+ color?: string;
114
+ icon?: string;
115
+ starred?: boolean;
116
+ fileCount?: number;
117
+ filesCount?: number;
118
+ subfoldersCount?: number;
119
+ createdAt: string;
120
+ createdBy?: {
121
+ id: string;
122
+ name: string;
123
+ avatar?: string;
124
+ };
125
+ createdById?: string;
126
+ updatedAt: string;
127
+ parentId?: string;
128
+ subfolders?: FolderItem[];
129
+ canRead?: boolean;
130
+ canUpdate?: boolean;
131
+ canDelete?: boolean;
132
+ permissions?: FolderPermissions;
133
+ }
134
+ /**
135
+ * File permissions
136
+ */
137
+ export interface FilePermissions {
138
+ canRead: boolean;
139
+ canWrite: boolean;
140
+ canDelete: boolean;
141
+ canShare: boolean;
142
+ canAdmin: boolean;
143
+ }
144
+ /**
145
+ * Folder permissions
146
+ */
147
+ export interface FolderPermissions {
148
+ canRead: boolean;
149
+ canWrite: boolean;
150
+ canDelete: boolean;
151
+ canShare: boolean;
152
+ canAdmin: boolean;
153
+ }
154
+ /**
155
+ * Upload item in the queue
156
+ */
157
+ export interface UploadItem {
158
+ id: string;
159
+ file: File;
160
+ status: UploadStatus;
161
+ progress: number;
162
+ error?: string;
163
+ uploadedFileId?: string;
164
+ folderId?: string;
165
+ uploadedBytes?: number;
166
+ sessionId?: string;
167
+ uploadUrl?: string;
168
+ thumbnailUrl?: string;
169
+ }
170
+ /**
171
+ * File version
172
+ */
173
+ export interface FileVersion {
174
+ id: string;
175
+ fileId: string;
176
+ versionNumber: number;
177
+ size: number;
178
+ url: string;
179
+ createdAt: string;
180
+ createdBy: {
181
+ id: string;
182
+ name: string;
183
+ avatar?: string;
184
+ };
185
+ notes?: string;
186
+ isCurrent: boolean;
187
+ }
188
+ /**
189
+ * Share link
190
+ */
191
+ export interface ShareLink {
192
+ id: string;
193
+ fileId: string;
194
+ token: string;
195
+ url: string;
196
+ expiresAt?: string;
197
+ password?: string;
198
+ accessCount: number;
199
+ maxAccessCount?: number;
200
+ createdAt: string;
201
+ createdBy: {
202
+ id: string;
203
+ name: string;
204
+ };
205
+ isActive: boolean;
206
+ }
207
+ /**
208
+ * File share permissions
209
+ */
210
+ export interface FileShare {
211
+ id: string;
212
+ fileId: string;
213
+ userId?: string;
214
+ groupId?: string;
215
+ email?: string;
216
+ permission: "view" | "comment" | "edit" | "admin";
217
+ expiresAt?: string;
218
+ createdAt: string;
219
+ createdBy: {
220
+ id: string;
221
+ name: string;
222
+ };
223
+ }
224
+ /**
225
+ * Storage quota information
226
+ */
227
+ export interface StorageQuota {
228
+ used: number;
229
+ limit: number;
230
+ percentage: number;
231
+ breakdown: {
232
+ images: number;
233
+ documents: number;
234
+ videos: number;
235
+ audio: number;
236
+ other: number;
237
+ };
238
+ }
239
+ /**
240
+ * File preview type
241
+ */
242
+ export type FilePreviewType = "image" | "pdf" | "video" | "audio" | "code" | "text" | "unsupported";
243
+ /**
244
+ * Breadcrumb item
245
+ */
246
+ export interface BreadcrumbItem {
247
+ id: string;
248
+ name: string;
249
+ path: string;
250
+ }
251
+ /**
252
+ * File filters
253
+ */
254
+ export interface FileFilters {
255
+ search?: string;
256
+ mimeType?: string[];
257
+ tags?: string[];
258
+ dateFrom?: string;
259
+ dateTo?: string;
260
+ minSize?: number;
261
+ maxSize?: number;
262
+ createdBy?: string[];
263
+ isFavorite?: boolean;
264
+ isShared?: boolean;
265
+ }
266
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/files/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { FilesRootProps } from '../types';
2
+ export type FilesEventName = "files.file.uploaded" | "files.file.deleted" | "files.file.restored" | "files.file.downloaded" | "files.file.starred" | "files.file.moved" | "files.file.copied" | "files.file.renamed" | "files.folder.created" | "files.folder.deleted" | "files.folder.restored" | "files.folder.starred" | "files.folder.moved" | "files.folder.renamed" | "files.share.created" | "files.share.downloaded" | "files.api.failed";
3
+ type FilesEventPayload = Record<string, unknown>;
4
+ export declare function emitFilesEvent(context: Pick<FilesRootProps, "eventBus" | "workspaceId">, name: FilesEventName, payload?: FilesEventPayload): void;
5
+ export {};
6
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/files/utils/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,MAAM,cAAc,GACtB,qBAAqB,GACrB,oBAAoB,GACpB,qBAAqB,GACrB,uBAAuB,GACvB,oBAAoB,GACpB,kBAAkB,GAClB,mBAAmB,GACnB,oBAAoB,GACpB,sBAAsB,GACtB,sBAAsB,GACtB,uBAAuB,GACvB,sBAAsB,GACtB,oBAAoB,GACpB,sBAAsB,GACtB,qBAAqB,GACrB,wBAAwB,GACxB,kBAAkB,CAAC;AAEvB,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,GAAG,aAAa,CAAC,EACzD,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,iBAAsB,GAC9B,IAAI,CAmBN"}
@@ -0,0 +1,16 @@
1
+ //#region src/files/utils/events.ts
2
+ function e(e, t, n = {}) {
3
+ let r = {
4
+ workspaceId: e.workspaceId,
5
+ ...n
6
+ };
7
+ e.eventBus?.emit?.(t, r), typeof window < "u" && window.dispatchEvent(new CustomEvent("burdenoff:mfe-event", { detail: {
8
+ name: t,
9
+ source: { mfe: "microfe-files" },
10
+ payload: r
11
+ } }));
12
+ }
13
+ //#endregion
14
+ export { e as emitFilesEvent };
15
+
16
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","names":[],"sources":["../../../src/files/utils/events.ts"],"sourcesContent":["import type { FilesRootProps } from \"../types\";\n\nexport type FilesEventName =\n | \"files.file.uploaded\"\n | \"files.file.deleted\"\n | \"files.file.restored\"\n | \"files.file.downloaded\"\n | \"files.file.starred\"\n | \"files.file.moved\"\n | \"files.file.copied\"\n | \"files.file.renamed\"\n | \"files.folder.created\"\n | \"files.folder.deleted\"\n | \"files.folder.restored\"\n | \"files.folder.starred\"\n | \"files.folder.moved\"\n | \"files.folder.renamed\"\n | \"files.share.created\"\n | \"files.share.downloaded\"\n | \"files.api.failed\";\n\ntype FilesEventPayload = Record<string, unknown>;\n\nexport function emitFilesEvent(\n context: Pick<FilesRootProps, \"eventBus\" | \"workspaceId\">,\n name: FilesEventName,\n payload: FilesEventPayload = {},\n): void {\n const eventPayload = {\n workspaceId: context.workspaceId,\n ...payload,\n };\n\n context.eventBus?.emit?.(name, eventPayload);\n\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(\n new CustomEvent(\"burdenoff:mfe-event\", {\n detail: {\n name,\n source: { mfe: \"microfe-files\" },\n payload: eventPayload,\n },\n }),\n );\n }\n}\n"],"mappings":";AAuBA,SAAgB,EACd,GACA,GACA,IAA6B,EAAE,EACzB;CACN,IAAM,IAAe;EACnB,aAAa,EAAQ;EACrB,GAAG;EACJ;AAID,CAFA,EAAQ,UAAU,OAAO,GAAM,EAAa,EAExC,OAAO,SAAW,OACpB,OAAO,cACL,IAAI,YAAY,uBAAuB,EACrC,QAAQ;EACN;EACA,QAAQ,EAAE,KAAK,iBAAiB;EAChC,SAAS;EACV,EACF,CAAC,CACH"}
@@ -0,0 +1,5 @@
1
+ import { I18nContextValue } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';
2
+ type TranslationParams = Record<string, string | number>;
3
+ export declare function tWithFallback(t: I18nContextValue["t"], key: string, fallback: string, params?: TranslationParams): string;
4
+ export {};
5
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../../src/files/utils/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wDAAwD,CAAC;AAE/F,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAgBzD,wBAAgB,aAAa,CAC3B,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,EACxB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,iBAAiB,GACzB,MAAM,CAOR"}
@@ -0,0 +1,15 @@
1
+ //#region src/files/utils/i18n.ts
2
+ function e(e, t) {
3
+ return t ? e.replace(/\{\{\s*(\w+)\s*\}\}/g, (e, n) => {
4
+ let r = t[n];
5
+ return r === void 0 ? `{{${n}}}` : String(r);
6
+ }) : e;
7
+ }
8
+ function t(t, n, r, i) {
9
+ let a = t(n, i);
10
+ return a === n ? e(r, i) : a;
11
+ }
12
+ //#endregion
13
+ export { t as tWithFallback };
14
+
15
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","names":[],"sources":["../../../src/files/utils/i18n.ts"],"sourcesContent":["import type { I18nContextValue } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\n\ntype TranslationParams = Record<string, string | number>;\n\nfunction interpolateFallback(\n fallback: string,\n params?: TranslationParams,\n): string {\n if (!params) {\n return fallback;\n }\n\n return fallback.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (_, key: string) => {\n const value = params[key];\n return value === undefined ? `{{${key}}}` : String(value);\n });\n}\n\nexport function tWithFallback(\n t: I18nContextValue[\"t\"],\n key: string,\n fallback: string,\n params?: TranslationParams,\n): string {\n const translated = t(key, params);\n if (translated === key) {\n return interpolateFallback(fallback, params);\n }\n\n return translated;\n}\n"],"mappings":";AAIA,SAAS,EACP,GACA,GACQ;AAKR,QAJK,IAIE,EAAS,QAAQ,yBAAyB,GAAG,MAAgB;EAClE,IAAM,IAAQ,EAAO;AACrB,SAAO,MAAU,KAAA,IAAY,KAAK,EAAI,MAAM,OAAO,EAAM;GACzD,GANO;;AASX,SAAgB,EACd,GACA,GACA,GACA,GACQ;CACR,IAAM,IAAa,EAAE,GAAK,EAAO;AAKjC,QAJI,MAAe,IACV,EAAoB,GAAU,EAAO,GAGvC"}
@@ -0,0 +1,74 @@
1
+ import { LucideIcon } from 'lucide-react';
2
+ import { formatBytes, formatRelativeTime } from '@burdenoff/fe-libs/shared/utils';
3
+ import { FilePreviewType } from '../types';
4
+ export { isImageType, generateThumbnail, revokeThumbnail, revokeThumbnails, } from './thumbnail';
5
+ /**
6
+ * Format file size in bytes to human readable format
7
+ * Re-exports formatBytes from fe-libs for convenience
8
+ */
9
+ export declare const formatFileSize: typeof formatBytes;
10
+ /**
11
+ * Get file extension from filename
12
+ */
13
+ export declare function getFileExtension(filename: string): string;
14
+ /**
15
+ * Determine file preview type from MIME type
16
+ */
17
+ export declare function getFilePreviewType(mimeType: string): FilePreviewType;
18
+ /**
19
+ * Check if file can be previewed
20
+ */
21
+ export declare function canPreviewFile(mimeType: string): boolean;
22
+ /**
23
+ * Get file icon component based on MIME type
24
+ */
25
+ export declare function getFileIcon(mimeType: string): LucideIcon;
26
+ /**
27
+ * Generate unique upload ID
28
+ */
29
+ export declare function generateUploadId(): string;
30
+ /**
31
+ * Validate file name
32
+ */
33
+ export declare function isValidFileName(name: string): boolean;
34
+ /**
35
+ * Sort files by various criteria
36
+ */
37
+ export declare function sortFiles<T extends {
38
+ name: string;
39
+ createdAt: string;
40
+ size?: number;
41
+ }>(files: T[], sortBy: "name" | "date" | "size" | "type", direction?: "asc" | "desc"): T[];
42
+ /**
43
+ * Check if file type is allowed
44
+ */
45
+ export declare function isFileTypeAllowed(mimeType: string, allowedTypes?: string[]): boolean;
46
+ /**
47
+ * Calculate upload progress percentage
48
+ */
49
+ export declare function calculateUploadProgress(uploadedBytes: number, totalBytes: number): number;
50
+ /**
51
+ * Format date for file display
52
+ * Uses shared formatRelativeTime from fe-libs
53
+ */
54
+ export declare const formatFileDate: typeof formatRelativeTime;
55
+ /**
56
+ * Truncate filename to max length
57
+ */
58
+ export declare function truncateFileName(name: string, maxLength?: number): string;
59
+ /**
60
+ * Check if storage quota exceeded
61
+ */
62
+ export declare function isStorageQuotaExceeded(usedBytes: number, limitBytes: number, fileSize: number): boolean;
63
+ /**
64
+ * Generate breadcrumb path from folder navigation
65
+ */
66
+ export declare function generateBreadcrumbs(currentFolderId: string | null, folderMap: Map<string, {
67
+ id: string;
68
+ name: string;
69
+ parentId?: string;
70
+ }>): Array<{
71
+ id: string;
72
+ name: string;
73
+ }>;
74
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/files/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAU/C,OAAO,EACL,WAAW,EACX,kBAAkB,EAEnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,eAAO,MAAM,cAAc,oBAAc,CAAC;AAE1C;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CA6BpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAmBxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAoBrD;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAE5D,KAAK,EAAE,CAAC,EAAE,EACV,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EACzC,SAAS,GAAE,KAAK,GAAG,MAAc,GAChC,CAAC,EAAE,CA4BL;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,EAAE,GACtB,OAAO,CAmBT;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GACjB,MAAM,CAGR;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,2BAAqB,CAAC;AAEjD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAW,GAAG,MAAM,CAc7E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,MAAM,GAAG,IAAI,EAC9B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACtE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBrC"}
@@ -0,0 +1,50 @@
1
+ import "./thumbnail.js";
2
+ import { Code as e, File as t, FileText as n, Film as r, Image as i, Music as a } from "lucide-react";
3
+ import { formatBytes as o, formatRelativeTime as s } from "@burdenoff/fe-libs/shared/utils";
4
+ //#region src/files/utils/index.ts
5
+ var c = o;
6
+ function l(e) {
7
+ let t = e.split(".");
8
+ return t.length > 1 ? t[t.length - 1].toLowerCase() : "";
9
+ }
10
+ function u(e) {
11
+ return e.startsWith("image/") ? "image" : e === "application/pdf" ? "pdf" : e.startsWith("video/") ? "video" : e.startsWith("audio/") ? "audio" : e.startsWith("text/") || e === "application/json" || e === "application/xml" ? "text" : e.includes("javascript") || e.includes("typescript") || e.includes("python") || e.includes("java") ? "code" : "unsupported";
12
+ }
13
+ function d(o) {
14
+ switch (u(o)) {
15
+ case "image": return i;
16
+ case "pdf": return n;
17
+ case "video": return r;
18
+ case "audio": return a;
19
+ case "code": return e;
20
+ case "text": return n;
21
+ default: return t;
22
+ }
23
+ }
24
+ function f(e, t, n = "asc") {
25
+ return [...e].sort((e, r) => {
26
+ let i = 0;
27
+ switch (t) {
28
+ case "name":
29
+ i = e.name.localeCompare(r.name);
30
+ break;
31
+ case "date":
32
+ i = new Date(e.createdAt).getTime() - new Date(r.createdAt).getTime();
33
+ break;
34
+ case "size":
35
+ i = (e.size || 0) - (r.size || 0);
36
+ break;
37
+ case "type": {
38
+ let t = l(e.name), n = l(r.name);
39
+ i = t.localeCompare(n);
40
+ break;
41
+ }
42
+ }
43
+ return n === "asc" ? i : -i;
44
+ });
45
+ }
46
+ var p = s;
47
+ //#endregion
48
+ export { p as formatFileDate, c as formatFileSize, d as getFileIcon, f as sortFiles };
49
+
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/files/utils/index.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport {\n File,\n Image,\n FileText,\n Film,\n Music,\n Code,\n Archive,\n} from \"lucide-react\";\nimport {\n formatBytes,\n formatRelativeTime,\n formatDate,\n} from \"@burdenoff/fe-libs/shared/utils\";\nimport type { FilePreviewType } from \"../types\";\nexport {\n isImageType,\n generateThumbnail,\n revokeThumbnail,\n revokeThumbnails,\n} from \"./thumbnail\";\n\n/**\n * Format file size in bytes to human readable format\n * Re-exports formatBytes from fe-libs for convenience\n */\nexport const formatFileSize = formatBytes;\n\n/**\n * Get file extension from filename\n */\nexport function getFileExtension(filename: string): string {\n const parts = filename.split(\".\");\n return parts.length > 1 ? parts[parts.length - 1].toLowerCase() : \"\";\n}\n\n/**\n * Determine file preview type from MIME type\n */\nexport function getFilePreviewType(mimeType: string): FilePreviewType {\n if (mimeType.startsWith(\"image/\")) {\n return \"image\";\n }\n if (mimeType === \"application/pdf\") {\n return \"pdf\";\n }\n if (mimeType.startsWith(\"video/\")) {\n return \"video\";\n }\n if (mimeType.startsWith(\"audio/\")) {\n return \"audio\";\n }\n if (\n mimeType.startsWith(\"text/\") ||\n mimeType === \"application/json\" ||\n mimeType === \"application/xml\"\n ) {\n return \"text\";\n }\n if (\n mimeType.includes(\"javascript\") ||\n mimeType.includes(\"typescript\") ||\n mimeType.includes(\"python\") ||\n mimeType.includes(\"java\")\n ) {\n return \"code\";\n }\n return \"unsupported\";\n}\n\n/**\n * Check if file can be previewed\n */\nexport function canPreviewFile(mimeType: string): boolean {\n const previewType = getFilePreviewType(mimeType);\n return previewType !== \"unsupported\";\n}\n\n/**\n * Get file icon component based on MIME type\n */\nexport function getFileIcon(mimeType: string): LucideIcon {\n const previewType = getFilePreviewType(mimeType);\n\n switch (previewType) {\n case \"image\":\n return Image;\n case \"pdf\":\n return FileText;\n case \"video\":\n return Film;\n case \"audio\":\n return Music;\n case \"code\":\n return Code;\n case \"text\":\n return FileText;\n default:\n return File;\n }\n}\n\n/**\n * Generate unique upload ID\n */\nexport function generateUploadId(): string {\n return `upload-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Validate file name\n */\nexport function isValidFileName(name: string): boolean {\n // Check for empty name\n if (!name || name.trim().length === 0) {\n return false;\n }\n\n // Check for invalid characters (OS-specific)\n // eslint-disable-next-line no-control-regex\n const invalidChars = /[<>:\"/\\\\|?*\\u0000-\\u001f]/;\n if (invalidChars.test(name)) {\n return false;\n }\n\n // Check for reserved names (Windows)\n const reservedNames = /^(con|prn|aux|nul|com[1-9]|lpt[1-9])(\\..*)?$/i;\n if (reservedNames.test(name)) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Sort files by various criteria\n */\nexport function sortFiles<\n T extends { name: string; createdAt: string; size?: number },\n>(\n files: T[],\n sortBy: \"name\" | \"date\" | \"size\" | \"type\",\n direction: \"asc\" | \"desc\" = \"asc\",\n): T[] {\n const sorted = [...files].sort((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case \"name\":\n comparison = a.name.localeCompare(b.name);\n break;\n case \"date\":\n comparison =\n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();\n break;\n case \"size\":\n comparison = (a.size || 0) - (b.size || 0);\n break;\n case \"type\": {\n // For now, sort by extension\n const extA = getFileExtension(a.name);\n const extB = getFileExtension(b.name);\n comparison = extA.localeCompare(extB);\n break;\n }\n }\n\n return direction === \"asc\" ? comparison : -comparison;\n });\n\n return sorted;\n}\n\n/**\n * Check if file type is allowed\n */\nexport function isFileTypeAllowed(\n mimeType: string,\n allowedTypes?: string[],\n): boolean {\n if (!allowedTypes || allowedTypes.length === 0) {\n return true;\n }\n\n return allowedTypes.some((allowed) => {\n // Exact match\n if (allowed === mimeType) {\n return true;\n }\n\n // Wildcard match (e.g., \"image/*\")\n if (allowed.endsWith(\"/*\")) {\n const prefix = allowed.slice(0, -2);\n return mimeType.startsWith(prefix);\n }\n\n return false;\n });\n}\n\n/**\n * Calculate upload progress percentage\n */\nexport function calculateUploadProgress(\n uploadedBytes: number,\n totalBytes: number,\n): number {\n if (totalBytes === 0) return 0;\n return Math.round((uploadedBytes / totalBytes) * 100);\n}\n\n/**\n * Format date for file display\n * Uses shared formatRelativeTime from fe-libs\n */\nexport const formatFileDate = formatRelativeTime;\n\n/**\n * Truncate filename to max length\n */\nexport function truncateFileName(name: string, maxLength: number = 30): string {\n if (name.length <= maxLength) {\n return name;\n }\n\n const ext = getFileExtension(name);\n const nameWithoutExt = name.slice(0, name.lastIndexOf(\".\"));\n const truncatedLength = maxLength - ext.length - 4; // -4 for \"...\" and \".\"\n\n if (truncatedLength <= 0) {\n return `${name.slice(0, maxLength - 3)}...`;\n }\n\n return `${nameWithoutExt.slice(0, truncatedLength)}...${ext}`;\n}\n\n/**\n * Check if storage quota exceeded\n */\nexport function isStorageQuotaExceeded(\n usedBytes: number,\n limitBytes: number,\n fileSize: number,\n): boolean {\n return usedBytes + fileSize > limitBytes;\n}\n\n/**\n * Generate breadcrumb path from folder navigation\n */\nexport function generateBreadcrumbs(\n currentFolderId: string | null,\n folderMap: Map<string, { id: string; name: string; parentId?: string }>,\n): Array<{ id: string; name: string }> {\n if (!currentFolderId) {\n return [{ id: \"root\", name: \"Files\" }];\n }\n\n const breadcrumbs: Array<{ id: string; name: string }> = [];\n let current = folderMap.get(currentFolderId);\n\n while (current) {\n breadcrumbs.unshift({ id: current.id, name: current.name });\n current = current.parentId ? folderMap.get(current.parentId) : undefined;\n }\n\n // Add root\n breadcrumbs.unshift({ id: \"root\", name: \"Files\" });\n\n return breadcrumbs;\n}\n"],"mappings":";;;;AA2BA,IAAa,IAAiB;AAK9B,SAAgB,EAAiB,GAA0B;CACzD,IAAM,IAAQ,EAAS,MAAM,IAAI;AACjC,QAAO,EAAM,SAAS,IAAI,EAAM,EAAM,SAAS,GAAG,aAAa,GAAG;;AAMpE,SAAgB,EAAmB,GAAmC;AA4BpE,QA3BI,EAAS,WAAW,SAAS,GACxB,UAEL,MAAa,oBACR,QAEL,EAAS,WAAW,SAAS,GACxB,UAEL,EAAS,WAAW,SAAS,GACxB,UAGP,EAAS,WAAW,QAAQ,IAC5B,MAAa,sBACb,MAAa,oBAEN,SAGP,EAAS,SAAS,aAAa,IAC/B,EAAS,SAAS,aAAa,IAC/B,EAAS,SAAS,SAAS,IAC3B,EAAS,SAAS,OAAO,GAElB,SAEF;;AAcT,SAAgB,EAAY,GAA8B;AAGxD,SAFoB,EAAmB,EAAS,EAEhD;EACE,KAAK,QACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,QACE,QAAO;;;AAuCb,SAAgB,EAGd,GACA,GACA,IAA4B,OACvB;AA2BL,QA1Be,CAAC,GAAG,EAAM,CAAC,MAAM,GAAG,MAAM;EACvC,IAAI,IAAa;AAEjB,UAAQ,GAAR;GACE,KAAK;AACH,QAAa,EAAE,KAAK,cAAc,EAAE,KAAK;AACzC;GACF,KAAK;AACH,QACE,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,UAAU,CAAC,SAAS;AACnE;GACF,KAAK;AACH,SAAc,EAAE,QAAQ,MAAM,EAAE,QAAQ;AACxC;GACF,KAAK,QAAQ;IAEX,IAAM,IAAO,EAAiB,EAAE,KAAK,EAC/B,IAAO,EAAiB,EAAE,KAAK;AACrC,QAAa,EAAK,cAAc,EAAK;AACrC;;;AAIJ,SAAO,MAAc,QAAQ,IAAa,CAAC;GAC3C;;AA+CJ,IAAa,IAAiB"}
@@ -0,0 +1,5 @@
1
+ export declare function isImageType(mimeType: string): boolean;
2
+ export declare function generateThumbnail(file: File, maxSize?: number): Promise<string | null>;
3
+ export declare function revokeThumbnail(thumbnailUrl: string): void;
4
+ export declare function revokeThumbnails(thumbnailUrls: (string | undefined)[]): void;
5
+ //# sourceMappingURL=thumbnail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnail.d.ts","sourceRoot":"","sources":["../../../src/files/utils/thumbnail.ts"],"names":[],"mappings":"AAaA,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,MAA2B,GACnC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0DxB;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAI1D;AAED,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,IAAI,CAM5E"}