@anji-dashing/dam-solution-v2 5.8.173

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 (259) hide show
  1. package/README.md +53 -0
  2. package/build/AssetType/AddFieldProperties.d.ts +10 -0
  3. package/build/AssetType/AddFieldProperties.js +359 -0
  4. package/build/AssetType/AssetTemplatesTable.d.ts +10 -0
  5. package/build/AssetType/AssetTemplatesTable.js +172 -0
  6. package/build/AssetType/CreateAssetTemplate.d.ts +3 -0
  7. package/build/AssetType/CreateAssetTemplate.js +70 -0
  8. package/build/AssetType/CreateOrEditAssetTemplate.d.ts +1 -0
  9. package/build/AssetType/CreateOrEditAssetTemplate.js +100 -0
  10. package/build/AssetType/DraggedField.d.ts +14 -0
  11. package/build/AssetType/DraggedField.js +58 -0
  12. package/build/AssetType/EditAssetTemplate.d.ts +5 -0
  13. package/build/AssetType/EditAssetTemplate.js +257 -0
  14. package/build/AssetType/FieldsSection.d.ts +14 -0
  15. package/build/AssetType/FieldsSection.js +268 -0
  16. package/build/AssetType/assetTemplatesContainer.d.ts +2 -0
  17. package/build/AssetType/assetTemplatesContainer.js +71 -0
  18. package/build/AssetType/fieldProperties/DateField.d.ts +5 -0
  19. package/build/AssetType/fieldProperties/DateField.js +23 -0
  20. package/build/AssetType/fieldProperties/NumberField.d.ts +5 -0
  21. package/build/AssetType/fieldProperties/NumberField.js +91 -0
  22. package/build/AssetType/fieldProperties/OptionsField.d.ts +6 -0
  23. package/build/AssetType/fieldProperties/OptionsField.js +55 -0
  24. package/build/AssetType/fieldProperties/TextField.d.ts +5 -0
  25. package/build/AssetType/fieldProperties/TextField.js +92 -0
  26. package/build/AssetType/index.d.ts +11 -0
  27. package/build/AssetType/index.js +25 -0
  28. package/build/AssetType/routes.d.ts +3 -0
  29. package/build/AssetType/routes.js +17 -0
  30. package/build/BookView/ProductDescription.d.ts +4 -0
  31. package/build/BookView/ProductDescription.js +20 -0
  32. package/build/BookView/bookDetail.d.ts +4 -0
  33. package/build/BookView/bookDetail.js +106 -0
  34. package/build/BookView/bookInfo.d.ts +4 -0
  35. package/build/BookView/bookInfo.js +17 -0
  36. package/build/BookView/description.d.ts +4 -0
  37. package/build/BookView/description.js +5 -0
  38. package/build/BookView/index.d.ts +10 -0
  39. package/build/BookView/index.js +23 -0
  40. package/build/CreateClient/CreateClientBtn.d.ts +14 -0
  41. package/build/CreateClient/CreateClientBtn.js +54 -0
  42. package/build/CreateClient/CreateClientForm.d.ts +15 -0
  43. package/build/CreateClient/CreateClientForm.js +347 -0
  44. package/build/CreateClient/index.d.ts +20 -0
  45. package/build/CreateClient/index.js +18 -0
  46. package/build/ImagePicker/MetaFieldOptions.d.ts +14 -0
  47. package/build/ImagePicker/MetaFieldOptions.js +75 -0
  48. package/build/ImagePicker/TestImagePickerModal.d.ts +8 -0
  49. package/build/ImagePicker/TestImagePickerModal.js +72 -0
  50. package/build/ImagePicker/TestImgFromMetaData.d.ts +7 -0
  51. package/build/ImagePicker/TestImgFromMetaData.js +82 -0
  52. package/build/ImagePicker/imagePickerComponent.d.ts +6 -0
  53. package/build/ImagePicker/imagePickerComponent.js +63 -0
  54. package/build/ImagePicker/index.d.ts +13 -0
  55. package/build/ImagePicker/index.js +24 -0
  56. package/build/ImagePicker/routes.d.ts +6 -0
  57. package/build/ImagePicker/routes.js +17 -0
  58. package/build/ImagePickerFilters/ImagePickerFiltersComponent.d.ts +8 -0
  59. package/build/ImagePickerFilters/ImagePickerFiltersComponent.js +223 -0
  60. package/build/ImagePickerFilters/index.d.ts +12 -0
  61. package/build/ImagePickerFilters/index.js +19 -0
  62. package/build/MyDrive/ActionBar.d.ts +8 -0
  63. package/build/MyDrive/ActionBar.js +190 -0
  64. package/build/MyDrive/AddDrive.d.ts +5 -0
  65. package/build/MyDrive/AddDrive.js +189 -0
  66. package/build/MyDrive/AddFolder.d.ts +11 -0
  67. package/build/MyDrive/AddFolder.js +165 -0
  68. package/build/MyDrive/BreadCrumbList.d.ts +10 -0
  69. package/build/MyDrive/BreadCrumbList.js +81 -0
  70. package/build/MyDrive/BulkUploadModal.d.ts +2 -0
  71. package/build/MyDrive/BulkUploadModal.js +324 -0
  72. package/build/MyDrive/DriveContainer.d.ts +14 -0
  73. package/build/MyDrive/DriveContainer.js +343 -0
  74. package/build/MyDrive/FileDownloadHistory.d.ts +7 -0
  75. package/build/MyDrive/FileDownloadHistory.js +107 -0
  76. package/build/MyDrive/FileMenuOptions.d.ts +11 -0
  77. package/build/MyDrive/FileMenuOptions.js +450 -0
  78. package/build/MyDrive/FilesGridView.d.ts +9 -0
  79. package/build/MyDrive/FilesGridView.js +25 -0
  80. package/build/MyDrive/FolderGridView.d.ts +20 -0
  81. package/build/MyDrive/FolderGridView.js +95 -0
  82. package/build/MyDrive/FolderListView.d.ts +26 -0
  83. package/build/MyDrive/FolderListView.js +226 -0
  84. package/build/MyDrive/FolderMenuOptions.d.ts +5 -0
  85. package/build/MyDrive/FolderMenuOptions.js +350 -0
  86. package/build/MyDrive/FolderTree.d.ts +8 -0
  87. package/build/MyDrive/FolderTree.js +479 -0
  88. package/build/MyDrive/ImageEditor/EditImage.d.ts +6 -0
  89. package/build/MyDrive/ImageEditor/EditImage.js +97 -0
  90. package/build/MyDrive/ImageEditor/EditImageModal.d.ts +8 -0
  91. package/build/MyDrive/ImageEditor/EditImageModal.js +30 -0
  92. package/build/MyDrive/ImageEditor/TuiImageEditor.d.ts +10 -0
  93. package/build/MyDrive/ImageEditor/TuiImageEditor.js +99 -0
  94. package/build/MyDrive/ImagePickerBreadCrumbList.d.ts +8 -0
  95. package/build/MyDrive/ImagePickerBreadCrumbList.js +35 -0
  96. package/build/MyDrive/ImagePickerDrive.d.ts +1 -0
  97. package/build/MyDrive/ImagePickerDrive.js +41 -0
  98. package/build/MyDrive/MyDriveMainContainer.d.ts +6 -0
  99. package/build/MyDrive/MyDriveMainContainer.js +63 -0
  100. package/build/MyDrive/SearchFilter.d.ts +8 -0
  101. package/build/MyDrive/SearchFilter.js +73 -0
  102. package/build/MyDrive/ShareBtn.d.ts +5 -0
  103. package/build/MyDrive/ShareBtn.js +19 -0
  104. package/build/MyDrive/ToggleView.d.ts +4 -0
  105. package/build/MyDrive/ToggleView.js +12 -0
  106. package/build/MyDrive/UploadStatusModal.d.ts +12 -0
  107. package/build/MyDrive/UploadStatusModal.js +52 -0
  108. package/build/MyDrive/fileDetails/CommentEntity.d.ts +8 -0
  109. package/build/MyDrive/fileDetails/CommentEntity.js +102 -0
  110. package/build/MyDrive/fileDetails/Comments.d.ts +6 -0
  111. package/build/MyDrive/fileDetails/Comments.js +65 -0
  112. package/build/MyDrive/fileDetails/Compliance.d.ts +2 -0
  113. package/build/MyDrive/fileDetails/Compliance.js +18 -0
  114. package/build/MyDrive/fileDetails/CreateComment.d.ts +7 -0
  115. package/build/MyDrive/fileDetails/CreateComment.js +48 -0
  116. package/build/MyDrive/fileDetails/Editor.d.ts +6 -0
  117. package/build/MyDrive/fileDetails/Editor.js +55 -0
  118. package/build/MyDrive/fileDetails/EmojiPicker.d.ts +5 -0
  119. package/build/MyDrive/fileDetails/EmojiPicker.js +6 -0
  120. package/build/MyDrive/fileDetails/FileDetails.d.ts +11 -0
  121. package/build/MyDrive/fileDetails/FileDetails.js +125 -0
  122. package/build/MyDrive/fileDetails/FileHeader.d.ts +7 -0
  123. package/build/MyDrive/fileDetails/FileHeader.js +27 -0
  124. package/build/MyDrive/fileDetails/FileViewer.d.ts +10 -0
  125. package/build/MyDrive/fileDetails/FileViewer.js +17 -0
  126. package/build/MyDrive/fileDetails/ImageOptions.d.ts +2 -0
  127. package/build/MyDrive/fileDetails/ImageOptions.js +44 -0
  128. package/build/MyDrive/fileDetails/ImageViewer.d.ts +6 -0
  129. package/build/MyDrive/fileDetails/ImageViewer.js +16 -0
  130. package/build/MyDrive/fileDetails/ManageFile.d.ts +7 -0
  131. package/build/MyDrive/fileDetails/ManageFile.js +34 -0
  132. package/build/MyDrive/fileDetails/MetaForm.d.ts +15 -0
  133. package/build/MyDrive/fileDetails/MetaForm.js +199 -0
  134. package/build/MyDrive/fileDetails/Metadata.d.ts +8 -0
  135. package/build/MyDrive/fileDetails/Metadata.js +52 -0
  136. package/build/MyDrive/fileDetails/PdfOptions.d.ts +9 -0
  137. package/build/MyDrive/fileDetails/PdfOptions.js +35 -0
  138. package/build/MyDrive/fileDetails/PdfViewer.d.ts +8 -0
  139. package/build/MyDrive/fileDetails/PdfViewer.js +18 -0
  140. package/build/MyDrive/fileDetails/Previewdetails.d.ts +10 -0
  141. package/build/MyDrive/fileDetails/Previewdetails.js +53 -0
  142. package/build/MyDrive/fileDetails/VideoPlayer.d.ts +4 -0
  143. package/build/MyDrive/fileDetails/VideoPlayer.js +21 -0
  144. package/build/MyDrive/files/AssetSelectionFormItem.d.ts +7 -0
  145. package/build/MyDrive/files/AssetSelectionFormItem.js +14 -0
  146. package/build/MyDrive/files/FolderTabs.d.ts +6 -0
  147. package/build/MyDrive/files/FolderTabs.js +90 -0
  148. package/build/MyDrive/files/MapFile.d.ts +9 -0
  149. package/build/MyDrive/files/MapFile.js +239 -0
  150. package/build/MyDrive/files/MoveToAnotherFolder.d.ts +9 -0
  151. package/build/MyDrive/files/MoveToAnotherFolder.js +67 -0
  152. package/build/MyDrive/filesListView.d.ts +2 -0
  153. package/build/MyDrive/filesListView.js +57 -0
  154. package/build/MyDrive/index.d.ts +16 -0
  155. package/build/MyDrive/index.js +50 -0
  156. package/build/MyDrive/routes.d.ts +10 -0
  157. package/build/MyDrive/routes.js +12 -0
  158. package/build/PenView/PenDetails.d.ts +4 -0
  159. package/build/PenView/PenDetails.js +114 -0
  160. package/build/PenView/ProductDescription.d.ts +5 -0
  161. package/build/PenView/ProductDescription.js +51 -0
  162. package/build/PenView/index.d.ts +10 -0
  163. package/build/PenView/index.js +23 -0
  164. package/build/RefreshKey/RefreshKeyBtn.d.ts +1 -0
  165. package/build/RefreshKey/RefreshKeyBtn.js +42 -0
  166. package/build/RefreshKey/index.d.ts +9 -0
  167. package/build/RefreshKey/index.js +23 -0
  168. package/build/ShoesView/ProductDescription.d.ts +4 -0
  169. package/build/ShoesView/ProductDescription.js +25 -0
  170. package/build/ShoesView/ShoeDetails.d.ts +4 -0
  171. package/build/ShoesView/ShoeDetails.js +96 -0
  172. package/build/ShoesView/index.d.ts +10 -0
  173. package/build/ShoesView/index.js +23 -0
  174. package/build/common/Button.d.ts +2 -0
  175. package/build/common/Button.js +18 -0
  176. package/build/common/CustomElements.d.ts +98 -0
  177. package/build/common/CustomElements.js +77 -0
  178. package/build/common/LoadMoreItems.d.ts +7 -0
  179. package/build/common/LoadMoreItems.js +33 -0
  180. package/build/common/RenderFormItem.d.ts +42 -0
  181. package/build/common/RenderFormItem.js +98 -0
  182. package/build/common/RenderThumnail.d.ts +7 -0
  183. package/build/common/RenderThumnail.js +6 -0
  184. package/build/common/deleteModal.d.ts +1 -0
  185. package/build/common/deleteModal.js +12 -0
  186. package/build/common/folders/TypeAndDateFilters.d.ts +13 -0
  187. package/build/common/folders/TypeAndDateFilters.js +66 -0
  188. package/build/common/folders/getFolderOrFileIcon.d.ts +2 -0
  189. package/build/common/folders/getFolderOrFileIcon.js +41 -0
  190. package/build/common/loader/CustomLoader.d.ts +7 -0
  191. package/build/common/loader/CustomLoader.js +8 -0
  192. package/build/common/loader/loader.d.ts +1 -0
  193. package/build/common/loader/loader.js +6 -0
  194. package/build/common/notifications.d.ts +2 -0
  195. package/build/common/notifications.js +30 -0
  196. package/build/common/steps.d.ts +4 -0
  197. package/build/common/steps.js +7 -0
  198. package/build/hocs/AppProvider.d.ts +3 -0
  199. package/build/hocs/AppProvider.js +11 -0
  200. package/build/hocs/DamConfigContext.d.ts +2 -0
  201. package/build/hocs/DamConfigContext.js +153 -0
  202. package/build/hocs/ThemeContext.d.ts +15 -0
  203. package/build/hocs/ThemeContext.js +131 -0
  204. package/build/hocs/ToastProvider.d.ts +2 -0
  205. package/build/hocs/ToastProvider.js +6 -0
  206. package/build/hocs/appConstants.d.ts +124 -0
  207. package/build/hocs/appConstants.js +211 -0
  208. package/build/hocs/configureAxios.d.ts +2 -0
  209. package/build/hocs/configureAxios.js +65 -0
  210. package/build/hocs/helpers.d.ts +17 -0
  211. package/build/hocs/helpers.js +201 -0
  212. package/build/index.d.ts +12 -0
  213. package/build/index.js +12 -0
  214. package/build/react-query/hooks/brand-hooks.d.ts +3 -0
  215. package/build/react-query/hooks/brand-hooks.js +10 -0
  216. package/build/react-query/hooks/folder-hooks.d.ts +7 -0
  217. package/build/react-query/hooks/folder-hooks.js +119 -0
  218. package/build/react-query/services/brand-services.d.ts +4 -0
  219. package/build/react-query/services/brand-services.js +41 -0
  220. package/build/react-query/services/file-services.d.ts +43 -0
  221. package/build/react-query/services/file-services.js +69 -0
  222. package/build/react-query/services/folder-services.d.ts +46 -0
  223. package/build/react-query/services/folder-services.js +87 -0
  224. package/build/react-query/services/image-picker-services.d.ts +5 -0
  225. package/build/react-query/services/image-picker-services.js +47 -0
  226. package/build/settings/InviteTeamModal.d.ts +12 -0
  227. package/build/settings/InviteTeamModal.js +174 -0
  228. package/build/settings/UpdateInvitationAccessType.d.ts +9 -0
  229. package/build/settings/UpdateInvitationAccessType.js +96 -0
  230. package/build/settings/getUserAvatar.d.ts +7 -0
  231. package/build/settings/getUserAvatar.js +11 -0
  232. package/build/style.css +1 -0
  233. package/build/types/assetType.d.ts +8 -0
  234. package/build/types/assetType.js +1 -0
  235. package/build/ui/pageTitle.d.ts +3 -0
  236. package/build/ui/pageTitle.js +4 -0
  237. package/build/utilities/FoldersContext.d.ts +16 -0
  238. package/build/utilities/FoldersContext.js +15 -0
  239. package/build/utilities/NavigatorProvider.d.ts +2 -0
  240. package/build/utilities/NavigatorProvider.js +10 -0
  241. package/build/utilities/constants/apiUrls.d.ts +97 -0
  242. package/build/utilities/constants/apiUrls.js +117 -0
  243. package/build/utilities/constants/imageUrls.d.ts +6 -0
  244. package/build/utilities/constants/imageUrls.js +6 -0
  245. package/build/utilities/constants/interface.d.ts +371 -0
  246. package/build/utilities/constants/interface.js +142 -0
  247. package/build/utilities/constants/messages.d.ts +55 -0
  248. package/build/utilities/constants/messages.js +55 -0
  249. package/build/utilities/constants/queryKeys.d.ts +16 -0
  250. package/build/utilities/constants/queryKeys.js +33 -0
  251. package/build/utilities/constants/routes.d.ts +22 -0
  252. package/build/utilities/constants/routes.js +22 -0
  253. package/build/utilities/helpers/validators.d.ts +12 -0
  254. package/build/utilities/helpers/validators.js +89 -0
  255. package/build/utilities/useAppNavigate.d.ts +2 -0
  256. package/build/utilities/useAppNavigate.js +35 -0
  257. package/build/utilities/useAppParams.d.ts +8 -0
  258. package/build/utilities/useAppParams.js +72 -0
  259. package/package.json +93 -0
@@ -0,0 +1,190 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo, useState } from "react";
3
+ import { Button, Tag, Tooltip } from "antd";
4
+ import { FiUpload, FiDownload, FiFolderPlus, FiTrash2, FiX, } from "react-icons/fi";
5
+ import { IoArchiveOutline, IoLinkOutline } from "react-icons/io5";
6
+ import { concat, find, first, get, join, map } from "lodash";
7
+ import MoveToAnotherFolder from "./files/MoveToAnotherFolder";
8
+ import { useMutation, useQueryClient } from "react-query";
9
+ import { deleteFiles, downloadFiles, restoreFiles, useFile, } from "../react-query/services/file-services";
10
+ import { DeleteConfirmationModal } from "../common/CustomElements";
11
+ import { DeleteOutlined, RedoOutlined } from "@ant-design/icons";
12
+ import { generateFoldersQueryKey, invalidateData, } from "../utilities/constants/queryKeys";
13
+ import { DriveModes, NotificationStatus, } from "../utilities/constants/interface";
14
+ import { ARCHIVE_OK_TEXT, DELETE_CONFIRMATION_MESSAGE, DELETE_MESSAGE_DESCRIPTION, DELETE_OK_TEXT, DELETE_SUCCESS, INVALID_URL, RESTORE_SUCCESS, SOMETHING_WENT_WRONG, } from "../utilities/constants/messages";
15
+ import { showNotification } from "../common/notifications";
16
+ import FileMenuOptions from "./FileMenuOptions";
17
+ import { getFolderData } from "../react-query/hooks/folder-hooks";
18
+ // import InviteTeamModal from "../settings/InviteTeamModal";
19
+ import { FETCH_ENTITY_SCREEN } from "../utilities/constants/routes";
20
+ import { useDamConfig } from "../hocs/DamConfigContext";
21
+ import { createApiClient } from "../hocs/configureAxios";
22
+ import useAppParams from "../utilities/useAppParams";
23
+ const FiUploadIcon = FiUpload;
24
+ const FiDownloadIcon = FiDownload;
25
+ const FiFolderPlusIcon = FiFolderPlus;
26
+ const IoLinkOutlineIcon = IoLinkOutline;
27
+ const FiTrash2Icon = FiTrash2;
28
+ const FiXIcon = FiX;
29
+ const IoArchiveOutlineIcon = IoArchiveOutline;
30
+ const ActionsBar = ({ fileIds, folderIds, onCloseSelection, selectedFilesData = [], }) => {
31
+ const { appType } = useDamConfig();
32
+ const { folderId, type } = useAppParams();
33
+ const queryClient = useQueryClient();
34
+ const damConfig = useDamConfig();
35
+ const { rootFolderId, isAdmin } = damConfig;
36
+ const api = useMemo(() => createApiClient(damConfig), [damConfig]);
37
+ const [state, setState] = useState({
38
+ showMoveFolder: false,
39
+ showConfirmModal: false,
40
+ actionType: "",
41
+ showShareModal: false,
42
+ });
43
+ const { showMoveFolder, showConfirmModal, actionType, showShareModal } = state;
44
+ const toggleShareModal = () => {
45
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { showShareModal: !prevState.showShareModal })));
46
+ };
47
+ const folders = getFolderData(queryClient, folderId ? folderId : rootFolderId, generateFoldersQueryKey(type));
48
+ const selectedFolder = useMemo(() => {
49
+ if (get(folderIds, "length") === 1) {
50
+ // First try from selectedFilesData
51
+ const fromData = find(selectedFilesData, (item) => get(item, "_id") === first(folderIds));
52
+ if (fromData)
53
+ return fromData;
54
+ // Fall back to cache lookup
55
+ return find(folders, (folder) => get(folder, "_id") === first(folderIds));
56
+ }
57
+ else {
58
+ return null;
59
+ }
60
+ }, [folderIds, folders, selectedFilesData]);
61
+ const selectedFile = useMemo(() => {
62
+ if (get(fileIds, "length") === 1) {
63
+ // First try from selectedFilesData
64
+ const fromData = find(selectedFilesData, (item) => get(item, "_id") === first(fileIds));
65
+ if (fromData)
66
+ return fromData;
67
+ // Fall back to cache lookup
68
+ return find(folders, (folder) => get(folder, "_id") === first(fileIds));
69
+ }
70
+ else {
71
+ return null;
72
+ }
73
+ }, [fileIds, folders, selectedFilesData]);
74
+ // Fetch file data from API if selectedFile is null but we have a single fileId
75
+ const singleFileId = useMemo(() => {
76
+ if (selectedFile)
77
+ return ""; // Already have file data
78
+ if (get(fileIds, "length") === 1) {
79
+ return first(fileIds) || "";
80
+ }
81
+ return "";
82
+ }, [selectedFile, fileIds, folderIds]);
83
+ const { data: fetchedFileData } = useFile(api, singleFileId);
84
+ // Use fetched file data if selectedFile is null
85
+ const effectiveFile = useMemo(() => {
86
+ return selectedFile || fetchedFileData || null;
87
+ }, [selectedFile, fetchedFileData]);
88
+ const toggleConfirmPopup = (actionType = "") => {
89
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { actionType, showConfirmModal: !prevState.showConfirmModal })));
90
+ };
91
+ const toggleShowMoveFolder = () => {
92
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { showMoveFolder: !prevState.showMoveFolder })));
93
+ };
94
+ const onSuccess = (message) => {
95
+ invalidateData(queryClient, generateFoldersQueryKey(type), folderId ? folderId : rootFolderId);
96
+ showNotification(message, NotificationStatus.SUCCESS);
97
+ };
98
+ const onFailure = (message) => {
99
+ showNotification(message, NotificationStatus.ERROR);
100
+ };
101
+ const deleteFileMutation = useMutation({
102
+ mutationFn: deleteFiles,
103
+ onSuccess: (response) => {
104
+ toggleConfirmPopup();
105
+ onCloseSelection();
106
+ onSuccess(get(response, "data.message", DELETE_SUCCESS));
107
+ },
108
+ onError: (error) => {
109
+ onFailure(get(error, "message", SOMETHING_WENT_WRONG));
110
+ },
111
+ });
112
+ const onDeleteFile = () => {
113
+ deleteFileMutation.mutate({
114
+ fileIds,
115
+ folderIds,
116
+ api,
117
+ });
118
+ };
119
+ const restoreFileMutation = useMutation({
120
+ mutationFn: restoreFiles,
121
+ onSuccess: (response) => {
122
+ onCloseSelection();
123
+ onSuccess(get(response, "data.message", RESTORE_SUCCESS));
124
+ },
125
+ onError: (error) => {
126
+ onFailure(get(error, "message", SOMETHING_WENT_WRONG));
127
+ },
128
+ });
129
+ const onRestoreFiles = () => {
130
+ restoreFileMutation.mutate({
131
+ fileIds,
132
+ folderIds,
133
+ api,
134
+ });
135
+ };
136
+ const downloadFileMutation = useMutation({
137
+ mutationFn: downloadFiles,
138
+ onSuccess: (response) => {
139
+ const url = get(response, "data");
140
+ if (url) {
141
+ window.open(url, "_blank");
142
+ }
143
+ else {
144
+ onFailure(INVALID_URL);
145
+ }
146
+ onCloseSelection();
147
+ },
148
+ onError: (error) => {
149
+ onFailure(get(error, "message", SOMETHING_WENT_WRONG));
150
+ },
151
+ });
152
+ const onDownloadFiles = () => {
153
+ // Always use API endpoint to ensure download history is tracked
154
+ downloadFileMutation.mutate({
155
+ fileIds,
156
+ folderIds,
157
+ api,
158
+ });
159
+ };
160
+ const fileLinks = useMemo(() => {
161
+ return map(fileIds, (id) => `${appType == "reactJs"
162
+ ? process.env.REACT_APP_MIXDRIVE_SITE_URL
163
+ : process.env.NEXT_PUBLIC_MIXDRIVE_SITE_URL}` +
164
+ FETCH_ENTITY_SCREEN.replace(":type", DriveModes.FILE).replace(":id", id));
165
+ }, [fileIds]);
166
+ const folderLinks = useMemo(() => {
167
+ return map(folderIds, (id) => `${appType == "reactJs"
168
+ ? process.env.REACT_APP_MIXDRIVE_SITE_URL
169
+ : process.env.NEXT_PUBLIC_MIXDRIVE_SITE_URL}` +
170
+ FETCH_ENTITY_SCREEN.replace(":type", DriveModes.FOLDERS).replace(":id", id));
171
+ }, [folderIds]);
172
+ const link = useMemo(() => {
173
+ if (get(concat(fileLinks, folderLinks), "length")) {
174
+ return get(concat(fileLinks, folderLinks), "length") > 1
175
+ ? join(concat(fileLinks, folderLinks), ", ")
176
+ : first(concat(fileLinks, folderLinks));
177
+ }
178
+ else {
179
+ return `${appType == "reactJs"
180
+ ? process.env.REACT_APP_MIXDRIVE_SITE_URL
181
+ : process.env.NEXT_PUBLIC_MIXDRIVE_SITE_URL}`;
182
+ }
183
+ }, [fileLinks, folderLinks]);
184
+ const isTrashPage = useMemo(() => type === DriveModes.TRASH, [type]);
185
+ return (_jsxs("div", { className: "md-lib-fixed md-lib-bottom-6 md-lib-left-1/2 md-lib-transform -md-lib-translate-x-1/2 md-lib-w-80 md:md-lib-w-[720px] md-lib-max-w-3xl md-lib-bg-textColorActive md-lib-border dark:md-lib-bg-darkPrimary dark:md-lib-border-darkBorderColor md-lib-border-secondaryHoverColor md-lib-rounded-xl md-lib-shadow-md md-lib-flex md-lib-items-center md-lib-justify-between md-lib-px-4 md-lib-py-2 md-lib-z-50", children: [_jsxs("div", { className: "md-lib-flex md-lib-items-center md-lib-gap-5 md-lib-pl-2", children: [_jsx(Button, { type: "text", size: "large", icon: _jsx(FiDownloadIcon, { size: 24, className: "" }), disabled: isTrashPage, onClick: onDownloadFiles, loading: downloadFileMutation.isLoading }), _jsx(Tooltip, { title: "Move", children: _jsx(Button, { type: "text", size: "large", icon: _jsx(FiFolderPlusIcon, { size: 24, className: "" }), disabled: isTrashPage, onClick: toggleShowMoveFolder }) }), isTrashPage ? (_jsx(Tooltip, { title: "Restore", children: _jsx(Button, { type: "text", size: "large", icon: _jsx(RedoOutlined, { className: "" }), onClick: () => onRestoreFiles(), disabled: !isTrashPage }) })) : (_jsx(_Fragment, { children: isAdmin && (_jsx(Tooltip, { title: "Delete", children: _jsx(Button, { type: "text", size: "large", icon: _jsx(FiTrash2Icon, { size: 24, className: "" }), onClick: () => toggleConfirmPopup("delete"), disabled: isTrashPage }) })) })), _jsx(FileMenuOptions, { file: selectedFile || null, fileIds: fileIds, folderIds: folderIds, folder: selectedFolder || null, onCloseSelection: onCloseSelection, readOnly: isTrashPage })] }), _jsx("div", { className: "md-lib-flex md-lib-items-center", children: _jsxs(Tag, { className: "md-lib-bg-[#DEE4ED] dark:md-lib-bg-darkPrimaryHoverColor !md-lib-rounded-lg !md-lib-px-4 h-[38px] md-lib-text-sm md-lib-items-center md-lib-font-medium md-lib-flex md-lib-gap-2 md-lib-text-textColor dark:md-lib-text-darkTextColor", closable: true, closeIcon: _jsx(FiXIcon, { onClick: onCloseSelection, className: "md-lib-cursor-pointer" }), children: [get(fileIds, "length", 0) + get(folderIds, "length", 0), " Selected"] }) }), showMoveFolder && (_jsx(MoveToAnotherFolder, { open: showMoveFolder, handleCancel: () => {
186
+ toggleShowMoveFolder();
187
+ onCloseSelection();
188
+ }, folderIds: folderIds, fileIds: fileIds, entity: null })), _jsx(DeleteConfirmationModal, { showDeleteModal: showConfirmModal, toggleDeleteModal: toggleConfirmPopup, icon: actionType === "archive" ? (_jsx(IoArchiveOutlineIcon, {})) : (_jsx(DeleteOutlined, {})), okText: actionType === "archive" ? ARCHIVE_OK_TEXT : DELETE_OK_TEXT, description: DELETE_CONFIRMATION_MESSAGE.replace(":action", actionType).replace(" :entity", ""), subHeading: actionType === "archive" ? "" : DELETE_MESSAGE_DESCRIPTION, onOk: actionType === "archive" ? () => { } : onDeleteFile, loading: deleteFileMutation.isLoading })] }));
189
+ };
190
+ export default ActionsBar;
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ declare const AddDrive: React.FC<{
3
+ parentFolderId?: string;
4
+ }>;
5
+ export default AddDrive;
@@ -0,0 +1,189 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
11
+ import { useEffect, useMemo, useRef, useState } from "react";
12
+ import { Button, Dropdown } from "antd";
13
+ import { MdKeyboardArrowDown } from "react-icons/md";
14
+ import { BsUpload } from "react-icons/bs";
15
+ import { PiFolderPlusLight } from "react-icons/pi";
16
+ import { GoPlus } from "react-icons/go";
17
+ import AddFolder from "./AddFolder";
18
+ import MapFile from "./files/MapFile";
19
+ import { showNotification } from "../common/notifications";
20
+ import { SOMETHING_WENT_WRONG, UPLOAD_SUCCESS, } from "../utilities/constants/messages";
21
+ import { FileUploadStatus, NotificationStatus, } from "../utilities/constants/interface";
22
+ import { get, keyBy, map, merge, values } from "lodash";
23
+ import { DELETE_S3_FILE_URL, FILE_UPLOAD_URL, } from "../utilities/constants/apiUrls";
24
+ import CustomLoader from "../common/loader/CustomLoader";
25
+ import UploadStatusModal from "./UploadStatusModal";
26
+ import { useDamConfig } from "../hocs/DamConfigContext";
27
+ import { createApiClient } from "../hocs/configureAxios";
28
+ import BulkUploadModal from "./BulkUploadModal";
29
+ import useAppParams from "../utilities/useAppParams";
30
+ import CustomButton from "../common/Button";
31
+ import { RiGalleryLine } from "react-icons/ri";
32
+ const extensionToMime = {
33
+ ai: "application/postscript",
34
+ psd: "image/vnd.adobe.photoshop",
35
+ indd: "application/x-indesign",
36
+ };
37
+ const RiGalleryLineIcon = RiGalleryLine;
38
+ const BsUploadIcon = BsUpload;
39
+ const PiFolderPlusLightIcon = PiFolderPlusLight;
40
+ const GoPlusIcon = GoPlus;
41
+ const MdKeyboardArrowDownIconIcon = MdKeyboardArrowDown;
42
+ const AddDrive = ({ parentFolderId }) => {
43
+ const damConfig = useDamConfig();
44
+ const { brand, rootFolderId } = damConfig;
45
+ const brandId = get(brand, "_id");
46
+ const { folderId } = useAppParams();
47
+ const currentFolderId = parentFolderId || folderId || rootFolderId;
48
+ const fileInputRef = useRef(null);
49
+ const api = useMemo(() => createApiClient(damConfig), [damConfig]);
50
+ const [state, setState] = useState({
51
+ openFolderModal: false,
52
+ openMapFile: false,
53
+ uploading: false,
54
+ filesList: [],
55
+ showUploadStatus: false,
56
+ uploadStatusList: [],
57
+ openBlukUploadModal: false,
58
+ showGenerateThumbnails: false,
59
+ });
60
+ const { openFolderModal, openMapFile, uploading, filesList, showUploadStatus, uploadStatusList, openBlukUploadModal, showGenerateThumbnails, } = state;
61
+ const toggleOpenMapFile = (files = [], shouldDelete = false) => {
62
+ var _a;
63
+ if (openMapFile && shouldDelete && ((_a = filesList === null || filesList === void 0 ? void 0 : filesList[0]) === null || _a === void 0 ? void 0 : _a.filePath)) {
64
+ try {
65
+ api.delete(DELETE_S3_FILE_URL.replace(":path", filesList === null || filesList === void 0 ? void 0 : filesList[0].filePath));
66
+ }
67
+ catch (err) {
68
+ console.log("Error while deleting file in s3", err);
69
+ }
70
+ }
71
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { openMapFile: !prevState.openMapFile, filesList: files, showUploadStatus: false })));
72
+ };
73
+ const handleMapFileCancel = (shouldDelete = false) => {
74
+ toggleOpenMapFile([], shouldDelete);
75
+ };
76
+ const toggleFolderModal = () => {
77
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { openFolderModal: !prevState.openFolderModal })));
78
+ };
79
+ const toggleFolderBulkModal = () => {
80
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { openBlukUploadModal: !prevState.openBlukUploadModal })));
81
+ };
82
+ const updateFileStatus = (fileName, status) => {
83
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { uploadStatusList: map(prevState.uploadStatusList, (f) => get(f, "name") === fileName ? Object.assign(Object.assign({}, f), { status }) : f) })));
84
+ };
85
+ // Auto-close upload status drawer when all uploads are complete
86
+ useEffect(() => {
87
+ if (showUploadStatus && uploadStatusList.length > 0) {
88
+ const allComplete = uploadStatusList.every((file) => file.status === FileUploadStatus.SUCCESS ||
89
+ file.status === FileUploadStatus.ERROR);
90
+ if (allComplete && !uploading) {
91
+ // Auto-close after 2 seconds when all uploads are complete
92
+ const timer = setTimeout(() => {
93
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { showUploadStatus: false })));
94
+ }, 2000);
95
+ return () => clearTimeout(timer);
96
+ }
97
+ }
98
+ }, [uploadStatusList, uploading, showUploadStatus]);
99
+ const handleNativeFileUpload = (event) => __awaiter(void 0, void 0, void 0, function* () {
100
+ const selectedFiles = get(event, "target.files", []);
101
+ if (!selectedFiles || selectedFiles.length === 0)
102
+ return;
103
+ const files = map(Array.from(selectedFiles), (file) => {
104
+ var _a;
105
+ const name = get(file, "name", "");
106
+ const ext = ((_a = name.split(".").pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase()) || "";
107
+ const mimetype = get(file, "type") ||
108
+ get(extensionToMime, ext) ||
109
+ "application/octet-stream";
110
+ return {
111
+ name,
112
+ size: get(file, "size"),
113
+ mimetype,
114
+ file,
115
+ };
116
+ });
117
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { uploading: true, showUploadStatus: true, uploadStatusList: map(files, (f) => ({
118
+ name: get(f, "name"),
119
+ status: FileUploadStatus.PENDING,
120
+ })) })));
121
+ try {
122
+ const response = yield api.post(FILE_UPLOAD_URL, {
123
+ brandId,
124
+ folderId: currentFolderId,
125
+ files: map(files, (file) => ({
126
+ name: get(file, "name"),
127
+ size: get(file, "size"),
128
+ })),
129
+ });
130
+ const uploadData = get(response, "data", []);
131
+ const uploadMap = keyBy(uploadData, "name");
132
+ for (const file of files) {
133
+ const fileUrl = get(uploadMap, [get(file, "name"), "url"]);
134
+ if (!fileUrl) {
135
+ updateFileStatus(get(file, "name"), FileUploadStatus.ERROR);
136
+ continue;
137
+ }
138
+ try {
139
+ yield fetch(fileUrl, {
140
+ method: "PUT",
141
+ headers: {
142
+ "Content-Type": get(file, "mimetype"),
143
+ "Access-Control-Allow-Origin": "*",
144
+ },
145
+ body: file.file,
146
+ });
147
+ updateFileStatus(get(file, "name"), FileUploadStatus.SUCCESS);
148
+ }
149
+ catch (_a) {
150
+ updateFileStatus(get(file, "name"), FileUploadStatus.ERROR);
151
+ }
152
+ }
153
+ showNotification(get(response, "data.message", UPLOAD_SUCCESS), NotificationStatus.SUCCESS);
154
+ toggleOpenMapFile(values(merge({}, keyBy(files, "name"), keyBy(uploadData, "name"))));
155
+ }
156
+ catch (error) {
157
+ showNotification(get(error, "message", SOMETHING_WENT_WRONG), NotificationStatus.ERROR);
158
+ }
159
+ finally {
160
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { uploading: false })));
161
+ if (fileInputRef.current)
162
+ fileInputRef.current.value = "";
163
+ }
164
+ });
165
+ const items = [
166
+ {
167
+ key: "0",
168
+ label: "Upload file",
169
+ icon: uploading ? _jsx(CustomLoader, {}) : _jsx(BsUploadIcon, { size: 16 }),
170
+ disabled: uploading,
171
+ onClick: () => { var _a; return (_a = get(fileInputRef, "current")) === null || _a === void 0 ? void 0 : _a.click(); },
172
+ },
173
+ {
174
+ key: "2",
175
+ icon: _jsx(PiFolderPlusLightIcon, { size: 20 }),
176
+ label: "Create folder",
177
+ onClick: () => toggleFolderModal(),
178
+ },
179
+ {
180
+ key: "3",
181
+ icon: _jsx(BsUploadIcon, { size: 20 }),
182
+ label: "Bulk Upload",
183
+ onClick: () => toggleFolderBulkModal(),
184
+ },
185
+ ];
186
+ const toggleGenerateThumbnails = () => setState((prevState) => (Object.assign(Object.assign({}, prevState), { showGenerateThumbnails: !prevState.showGenerateThumbnails })));
187
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "md-lib-flex md-lib-gap-3", children: [_jsx(CustomButton, { label: "Generate Thumbnails", icon: _jsx(RiGalleryLineIcon, {}), size: "large", onClick: toggleGenerateThumbnails }), _jsx(Dropdown, { menu: { items }, trigger: ["click"], placement: "bottomRight", children: _jsxs(Button, { icon: _jsx(GoPlusIcon, { size: 16 }), type: "primary", size: "large", children: ["Add ", _jsx(MdKeyboardArrowDownIconIcon, {})] }) })] }), _jsx("input", { ref: fileInputRef, type: "file", multiple: true, style: { display: 'none' }, onChange: handleNativeFileUpload }), openFolderModal && (_jsx(AddFolder, { open: openFolderModal, handleCancel: toggleFolderModal, parentFolderId: currentFolderId })), openMapFile && (_jsx(MapFile, { open: openMapFile, handleCancel: handleMapFileCancel, filesList: filesList, fromUpload: true, parentFolderId: currentFolderId })), showUploadStatus && (_jsx(UploadStatusModal, { open: showUploadStatus, statusList: uploadStatusList, onClose: () => setState((prevState) => (Object.assign(Object.assign({}, prevState), { showUploadStatus: false }))) })), openBlukUploadModal && (_jsx(BulkUploadModal, { toggleUpload: toggleFolderBulkModal, folderId: currentFolderId })), showGenerateThumbnails && (_jsx(BulkUploadModal, { toggleUpload: toggleGenerateThumbnails, thumbnailsOnly: true, folderId: currentFolderId }))] }));
188
+ };
189
+ export default AddDrive;
@@ -0,0 +1,11 @@
1
+ import { FileEntity, FolderEntity } from "../utilities/constants/interface";
2
+ declare function AddFolder({ open, handleCancel, folder, file, onCloseSelection, fileModal, parentFolderId, }: {
3
+ open: boolean;
4
+ handleCancel: () => void;
5
+ folder?: FolderEntity;
6
+ file?: FileEntity;
7
+ onCloseSelection?: () => void;
8
+ fileModal?: boolean;
9
+ parentFolderId?: string;
10
+ }): JSX.Element;
11
+ export default AddFolder;
@@ -0,0 +1,165 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ import { Form, Modal } from "antd";
12
+ import { useEffect, useMemo, useState } from "react";
13
+ import { showNotification } from "../common/notifications";
14
+ import { CREATE_SUCCESS, ENTITY_REQUIRED, RENAME_SUCCESS, SOMETHING_WENT_WRONG, } from "../utilities/constants/messages";
15
+ import { NotificationStatus, } from "../utilities/constants/interface";
16
+ import { get, sortBy } from "lodash";
17
+ import { FETCH_FILE_URL, FETCH_FOLDER_URL, FETCH_FOLDERS_URL, } from "../utilities/constants/apiUrls";
18
+ import { CustomInputFormItem } from "../common/RenderFormItem";
19
+ import { updateFoldersCacheOnUpdateFolder, } from "../react-query/hooks/folder-hooks";
20
+ import { useQueryClient } from "react-query";
21
+ import { generateFoldersQueryKey, invalidateData, QueryKeys, } from "../utilities/constants/queryKeys";
22
+ import { useDamConfig } from "../hocs/DamConfigContext";
23
+ import { createApiClient } from "../hocs/configureAxios";
24
+ import useAppParams from "../utilities/useAppParams";
25
+ import { RenderModalTitle } from "../common/CustomElements";
26
+ import { useFoldersContext, useRefetchFolders } from "../utilities/FoldersContext";
27
+ function AddFolder({ open, handleCancel, folder, file, onCloseSelection, fileModal, parentFolderId, }) {
28
+ const { setFolders, globalSearch } = useFoldersContext();
29
+ const refetchFolders = useRefetchFolders();
30
+ const { folderId, type } = useAppParams();
31
+ const damConfig = useDamConfig();
32
+ const { rootFolderId } = damConfig;
33
+ const currentFolderId = parentFolderId || folderId || rootFolderId;
34
+ const api = useMemo(() => createApiClient(damConfig), [damConfig]);
35
+ const [state, setState] = useState({ loading: false });
36
+ const { loading } = state;
37
+ const [form] = Form.useForm();
38
+ const queryClient = useQueryClient();
39
+ const onAddFolder = () => {
40
+ form.validateFields().then((values) => __awaiter(this, void 0, void 0, function* () {
41
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { loading: true })));
42
+ try {
43
+ const response = get(folder, "_id")
44
+ ? yield api.put(FETCH_FOLDER_URL.replace(":folderId", get(folder, "_id")), values)
45
+ : get(file, "_id")
46
+ ? yield api.put(FETCH_FILE_URL.replace(":fileId", get(file, "_id")), values)
47
+ : yield api.post(FETCH_FOLDERS_URL, Object.assign(Object.assign({}, values), { teamIds: [], parentId: currentFolderId }));
48
+ if (folder || file) {
49
+ // ✅ update case
50
+ const updatedFolder = folder
51
+ ? get(response, "data.updatedFolder", {})
52
+ : file
53
+ ? get(response, "data.file", Object.assign(Object.assign({}, file), { name: get(values, "name") }))
54
+ : {};
55
+ setFolders((prevFolders) => {
56
+ if (globalSearch) {
57
+ // Only update the matching folder (flat update)
58
+ const finalFolders = prevFolders.map((f) => {
59
+ // console.log("f", f);
60
+ return f._id === updatedFolder._id
61
+ ? Object.assign(Object.assign({}, f), updatedFolder) : f;
62
+ });
63
+ // console.log("updatd folders", finalFolders);
64
+ return finalFolders;
65
+ }
66
+ else {
67
+ const updateOrAddRecursively = (folders) => folders.map((f) => {
68
+ if (f._id === updatedFolder._id) {
69
+ return Object.assign(Object.assign({}, f), updatedFolder); // update
70
+ }
71
+ return Object.assign(Object.assign({}, f), { children: Array.isArray(f.children)
72
+ ? updateOrAddRecursively(f.children)
73
+ : f.children });
74
+ });
75
+ return updateOrAddRecursively(prevFolders);
76
+ }
77
+ });
78
+ updateFoldersCacheOnUpdateFolder(queryClient, folderId ? folderId : rootFolderId, updatedFolder, generateFoldersQueryKey(type));
79
+ if (file) {
80
+ invalidateData(queryClient, QueryKeys.FILE, get(file, "_id"));
81
+ }
82
+ if (refetchFolders) {
83
+ yield refetchFolders();
84
+ }
85
+ else {
86
+ const foldersQueryKey = generateFoldersQueryKey(type);
87
+ const effectiveFolderId = folderId ? folderId : rootFolderId;
88
+ invalidateData(queryClient, foldersQueryKey, effectiveFolderId);
89
+ yield queryClient.refetchQueries({
90
+ queryKey: [foldersQueryKey, effectiveFolderId],
91
+ });
92
+ }
93
+ }
94
+ else {
95
+ // ✅ create case → take folder from response
96
+ const newFolder = get(response, "data.folder", {});
97
+ setFolders((prevFolders) => {
98
+ if (newFolder.parentId !== rootFolderId) {
99
+ // Add to parent's children
100
+ const addToParent = (folders) => folders.map((f) => {
101
+ if (f._id === newFolder.parentId) {
102
+ return Object.assign(Object.assign({}, f), { children: Array.isArray(f.children)
103
+ ? [...f.children, newFolder]
104
+ : [newFolder] });
105
+ }
106
+ return f;
107
+ });
108
+ return addToParent(prevFolders);
109
+ }
110
+ else {
111
+ // Add to top level
112
+ return sortBy([...prevFolders, newFolder], (f) => {
113
+ var _a, _b;
114
+ return (_b = (_a = f.name) === null || _a === void 0 ? void 0 : _a.toLowerCase) === null || _b === void 0 ? void 0 : _b.call(_a);
115
+ });
116
+ }
117
+ });
118
+ invalidateData(queryClient, generateFoldersQueryKey(type), folderId ? folderId : rootFolderId);
119
+ }
120
+ handleCancel();
121
+ showNotification(get(response, "data.message", folder || file ? RENAME_SUCCESS : CREATE_SUCCESS), NotificationStatus.SUCCESS);
122
+ form.resetFields();
123
+ if (!fileModal) {
124
+ onCloseSelection === null || onCloseSelection === void 0 ? void 0 : onCloseSelection();
125
+ }
126
+ }
127
+ catch (error) {
128
+ showNotification(get(error, "message", SOMETHING_WENT_WRONG), NotificationStatus.ERROR);
129
+ }
130
+ finally {
131
+ setState((prevState) => (Object.assign(Object.assign({}, prevState), { loading: false })));
132
+ }
133
+ }));
134
+ };
135
+ const nameValue = (Form.useWatch("name", form) || "").trim();
136
+ const originalName = ((folder === null || folder === void 0 ? void 0 : folder.name) || (file === null || file === void 0 ? void 0 : file.name) || "").trim();
137
+ const isUnchanged = useMemo(() => !!(folder || file) && nameValue === originalName, [folder, file, nameValue, originalName]);
138
+ useEffect(() => {
139
+ if (folder) {
140
+ form.setFieldsValue(Object.assign({}, folder));
141
+ }
142
+ else if (file) {
143
+ form.setFieldsValue(Object.assign({}, file));
144
+ }
145
+ else {
146
+ form.resetFields();
147
+ }
148
+ }, [folder, file, form]);
149
+ return (_jsx(Modal, { title: _jsx(RenderModalTitle, { title: !!folder
150
+ ? `Update ${get(folder, "name", "N/A")}`
151
+ : !!file
152
+ ? `Update ${get(file, "name", "File")}`
153
+ : "Add Folder" }), okText: !!folder || !!file ? "Update" : "Save", okButtonProps: {
154
+ loading,
155
+ disabled: !nameValue || isUnchanged,
156
+ type: nameValue && !isUnchanged ? "primary" : "default",
157
+ size: "large",
158
+ }, onOk: onAddFolder, onCancel: handleCancel, open: open, cancelButtonProps: { size: "large" }, children: _jsx(Form, { layout: "vertical", form: form, scrollToFirstError: true, initialValues: folder ? folder : file ? file : {}, children: _jsx(CustomInputFormItem, { name: "name", label: "Name", placeholder: "Enter folder name", rules: [
159
+ {
160
+ required: true,
161
+ message: ENTITY_REQUIRED.replace(":entity", "Name"),
162
+ },
163
+ ], showCount: true }) }) }));
164
+ }
165
+ export default AddFolder;
@@ -0,0 +1,10 @@
1
+ import { FolderEntity } from "../utilities/constants/interface";
2
+ declare function BreadCrumbList({ folder, parentFolderId, setParentFolderId, pickerFolderId, globalSearch, setSelectedKeys, }: {
3
+ folder: FolderEntity;
4
+ parentFolderId?: string;
5
+ setParentFolderId?: (id: string) => void;
6
+ pickerFolderId?: string;
7
+ globalSearch?: string;
8
+ setSelectedKeys?: (keys: string | string[]) => void;
9
+ }): JSX.Element;
10
+ export default BreadCrumbList;
@@ -0,0 +1,81 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { DriveModes } from "../utilities/constants/interface";
3
+ import { DRIVE_MODES_SCREEN, } from "../utilities/constants/routes";
4
+ import { Breadcrumb, Tooltip } from "antd";
5
+ import { findIndex, get, isEmpty, last, map, slice } from "lodash";
6
+ import { useMemo } from "react";
7
+ import { FaChevronRight } from "react-icons/fa";
8
+ import { useDamConfig } from "../hocs/DamConfigContext";
9
+ import useAppParams from "../utilities/useAppParams";
10
+ const FaChevronRightIcon = FaChevronRight;
11
+ function BreadCrumbList({ folder, parentFolderId, setParentFolderId, pickerFolderId, globalSearch, setSelectedKeys, }) {
12
+ const { type, id } = useAppParams();
13
+ const damConfig = useDamConfig();
14
+ const { rootFolderId } = damConfig;
15
+ const tree = useMemo(() => {
16
+ const fullTree = get(folder, "tree", []);
17
+ if (pickerFolderId) {
18
+ const pickerIndex = findIndex(fullTree, (item) => get(item, "_id") === pickerFolderId);
19
+ const parentIndex = findIndex(fullTree, (item) => get(item, "_id") === parentFolderId);
20
+ if (pickerIndex !== -1) {
21
+ const end = parentIndex !== -1 ? parentIndex + 1 : get(fullTree, "length");
22
+ return slice(fullTree, pickerIndex, end);
23
+ }
24
+ }
25
+ return fullTree;
26
+ }, [folder, pickerFolderId, parentFolderId]);
27
+ const homePageInfo = useMemo(() => {
28
+ if (type === DriveModes.ARCHIVES) {
29
+ return {
30
+ url: DRIVE_MODES_SCREEN.replace(":type", DriveModes.TRASH),
31
+ name: "Archives",
32
+ };
33
+ }
34
+ else if (type === DriveModes.TRASH) {
35
+ return {
36
+ url: DRIVE_MODES_SCREEN.replace(":type", DriveModes.ARCHIVES),
37
+ name: "Trash",
38
+ };
39
+ }
40
+ else if (type === DriveModes.STARRED) {
41
+ return {
42
+ url: DRIVE_MODES_SCREEN.replace(":type", DriveModes.STARRED),
43
+ name: "Starred",
44
+ };
45
+ }
46
+ else if (type === DriveModes.SHARED) {
47
+ return {
48
+ url: DRIVE_MODES_SCREEN.replace(":type", DriveModes.SHARED),
49
+ name: "Shared",
50
+ };
51
+ }
52
+ else {
53
+ return null;
54
+ }
55
+ }, [type]);
56
+ return (_jsxs(Breadcrumb, { className: "md-lib-font-semibold md-lib-text-[22px] md-lib-truncate", separator: _jsx(FaChevronRightIcon, { className: "md-lib-mt-2" }), children: [!pickerFolderId && homePageInfo && (_jsx(Breadcrumb.Item, { href: isEmpty(tree) ? undefined : get(homePageInfo, "url"), children: get(homePageInfo, "name", "N/A") })), map(tree, (item, index) => {
57
+ const treeId = get(item, "_id");
58
+ const name = get(item, "name", "N/A");
59
+ const isLast = treeId === get(last(tree), "_id");
60
+ const isRoot = index === 0 || treeId === rootFolderId;
61
+ const handleClick = () => {
62
+ // Allow root to be clickable if it's not the last item
63
+ if (pickerFolderId && setParentFolderId && !isLast) {
64
+ setParentFolderId(treeId);
65
+ }
66
+ if (!pickerFolderId && !isLast && setSelectedKeys) {
67
+ setSelectedKeys(treeId);
68
+ }
69
+ };
70
+ const currentItemRender = (_jsx(Breadcrumb.Item, { onClick: !isLast ? handleClick : undefined, className: `md-lib-h-auto ${!isLast ? "md-lib-cursor-pointer" : ""}`, children: _jsx(Tooltip, { title: name, children: _jsx("p", { className: "md-lib-max-w-28 md-lib-truncate md-lib-font-semibold md-lib-text-[22px]", children: name }) }) }, treeId));
71
+ if (globalSearch) {
72
+ if (isLast || index == 0) {
73
+ return currentItemRender;
74
+ }
75
+ }
76
+ else {
77
+ return currentItemRender;
78
+ }
79
+ })] }));
80
+ }
81
+ export default BreadCrumbList;