@griddo/ax 10.2.25 → 10.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/public/img/icons/excel.png +0 -0
- package/public/img/icons/pdf.png +0 -0
- package/public/img/icons/word.png +0 -0
- package/public/img/icons/zip.png +0 -0
- package/src/GlobalStore.tsx +3 -0
- package/src/__mocks__/store/GenericStore.ts +3 -0
- package/src/__tests__/components/Fields/FileField/FileField.test.tsx +34 -8
- package/src/__tests__/components/Gallery/GalleryPanel/GalleryDragAndDrop/GalleryDragAndDrop.test.tsx +1 -1
- package/src/api/files.tsx +171 -1
- package/src/api/users.tsx +5 -2
- package/src/components/ActionMenu/index.tsx +5 -13
- package/src/components/BackFolder/index.tsx +28 -0
- package/src/components/BackFolder/style.tsx +33 -0
- package/src/components/BulkSelectionOptions/index.tsx +4 -8
- package/src/components/Button/index.tsx +8 -3
- package/src/components/Button/style.tsx +5 -3
- package/src/components/ElementsTooltip/index.tsx +22 -7
- package/src/components/ElementsTooltip/style.tsx +2 -2
- package/src/components/Fields/FileField/index.tsx +7 -7
- package/src/components/Fields/TextField/index.tsx +3 -0
- package/src/components/FileGallery/FolderItem/index.tsx +39 -0
- package/src/components/FileGallery/FolderItem/style.tsx +31 -0
- package/src/components/FileGallery/GalleryPanel/DetailPanel/index.tsx +164 -0
- package/src/components/FileGallery/GalleryPanel/DetailPanel/style.tsx +113 -0
- package/src/components/FileGallery/GalleryPanel/index.tsx +42 -0
- package/src/components/FileGallery/GalleryPanel/style.tsx +7 -0
- package/src/components/FileGallery/GridItem/index.tsx +47 -0
- package/src/components/FileGallery/GridItem/style.tsx +51 -0
- package/src/components/FileGallery/index.tsx +304 -0
- package/src/components/FileGallery/style.tsx +173 -0
- package/src/components/FileGallery/utils.tsx +19 -0
- package/src/components/Gallery/GalleryPanel/GalleryDragAndDrop/index.tsx +4 -6
- package/src/components/Icon/components/Back.js +10 -0
- package/src/components/Icon/components/ClosePanel.js +12 -0
- package/src/components/Icon/components/NewFolder.js +10 -0
- package/src/components/Icon/components/OpenPanel.js +12 -0
- package/src/components/Icon/svgs/Back.svg +3 -0
- package/src/components/Icon/svgs/Close_panel.svg +3 -0
- package/src/components/Icon/svgs/New-folder.svg +3 -0
- package/src/components/Icon/svgs/Open_panel.svg +3 -0
- package/src/components/Modal/index.tsx +7 -5
- package/src/components/Modal/style.tsx +6 -6
- package/src/components/ProgressBar/index.tsx +3 -2
- package/src/components/ProgressBar/style.tsx +5 -3
- package/src/components/TableList/index.tsx +3 -2
- package/src/components/TableList/style.tsx +4 -0
- package/src/components/Toast/style.tsx +2 -2
- package/src/components/index.tsx +4 -0
- package/src/containers/FileDrive/actions.tsx +386 -0
- package/src/containers/FileDrive/constants.tsx +24 -0
- package/src/containers/FileDrive/index.tsx +7 -0
- package/src/containers/FileDrive/interfaces.tsx +59 -0
- package/src/containers/FileDrive/reducer.tsx +57 -0
- package/src/containers/FileDrive/utils.tsx +37 -0
- package/src/containers/Gallery/actions.tsx +1 -1
- package/src/containers/Gallery/interfaces.tsx +1 -1
- package/src/helpers/index.tsx +2 -0
- package/src/helpers/objects.tsx +6 -0
- package/src/modules/FileDrive/Breadcrumb/index.tsx +42 -0
- package/src/modules/FileDrive/Breadcrumb/style.tsx +18 -0
- package/src/modules/FileDrive/BulkGridHeader/GridHeader/index.tsx +37 -0
- package/src/modules/FileDrive/BulkGridHeader/GridHeader/style.tsx +19 -0
- package/src/modules/FileDrive/BulkGridHeader/index.tsx +35 -0
- package/src/modules/FileDrive/BulkGridHeader/style.tsx +17 -0
- package/src/modules/FileDrive/BulkListHeader/TableHeader/index.tsx +42 -0
- package/src/modules/FileDrive/BulkListHeader/TableHeader/style.tsx +53 -0
- package/src/modules/FileDrive/BulkListHeader/index.tsx +35 -0
- package/src/modules/FileDrive/BulkListHeader/style.tsx +17 -0
- package/src/modules/FileDrive/FileDragAndDrop/index.tsx +249 -0
- package/src/{components/Fields/FileField → modules/FileDrive}/FileDragAndDrop/style.tsx +50 -9
- package/src/modules/FileDrive/FileModal/DetailPanel/index.tsx +170 -0
- package/src/modules/FileDrive/FileModal/DetailPanel/style.tsx +81 -0
- package/src/modules/FileDrive/FileModal/index.tsx +129 -0
- package/src/modules/FileDrive/FileModal/style.tsx +112 -0
- package/src/modules/FileDrive/FolderItem/index.tsx +180 -0
- package/src/modules/FileDrive/FolderItem/style.tsx +39 -0
- package/src/modules/FileDrive/FolderTree/index.tsx +108 -0
- package/src/modules/FileDrive/FolderTree/style.tsx +69 -0
- package/src/modules/FileDrive/FolderTree/utils.tsx +91 -0
- package/src/modules/FileDrive/GridItem/index.tsx +167 -0
- package/src/modules/FileDrive/GridItem/style.tsx +76 -0
- package/src/modules/FileDrive/ListItem/index.tsx +180 -0
- package/src/modules/FileDrive/ListItem/style.tsx +88 -0
- package/src/modules/FileDrive/atoms.tsx +173 -0
- package/src/modules/FileDrive/helpers.tsx +19 -0
- package/src/modules/FileDrive/index.tsx +670 -0
- package/src/modules/FileDrive/style.tsx +145 -0
- package/src/modules/Sites/SitesList/index.tsx +0 -3
- package/src/routes/multisite.tsx +9 -0
- package/src/routes/site.tsx +9 -0
- package/src/types/index.tsx +63 -0
- package/src/components/Fields/FileField/FileDragAndDrop/index.tsx +0 -188
- package/src/components/Fields/FileField/store.tsx +0 -61
|
@@ -0,0 +1,670 @@
|
|
|
1
|
+
import React, { useRef, useEffect, useState, useCallback, useLayoutEffect } from "react";
|
|
2
|
+
import { connect } from "react-redux";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
Button,
|
|
6
|
+
EmptyState,
|
|
7
|
+
ErrorToast,
|
|
8
|
+
Icon,
|
|
9
|
+
IconAction,
|
|
10
|
+
MainWrapper,
|
|
11
|
+
TableList,
|
|
12
|
+
Loading,
|
|
13
|
+
Tooltip,
|
|
14
|
+
Toast,
|
|
15
|
+
Modal,
|
|
16
|
+
Tabs,
|
|
17
|
+
BackFolder,
|
|
18
|
+
} from "@ax/components";
|
|
19
|
+
import { IBulkAction, IFile, IFilesFolder, IFolder, IFolderTree, IGetFolderParams, IRootState } from "@ax/types";
|
|
20
|
+
import { useBulkSelection, useModal, usePermission, useToast } from "@ax/hooks";
|
|
21
|
+
import { fileDriveActions } from "@ax/containers/FileDrive";
|
|
22
|
+
|
|
23
|
+
import GridItem from "./GridItem";
|
|
24
|
+
import ListItem from "./ListItem";
|
|
25
|
+
import BulkListHeader from "./BulkListHeader";
|
|
26
|
+
import FolderItem from "./FolderItem";
|
|
27
|
+
import Breadcrumb from "./Breadcrumb";
|
|
28
|
+
import FolderTree from "./FolderTree";
|
|
29
|
+
import FileDragAndDrop from "./FileDragAndDrop";
|
|
30
|
+
import FileModal from "./FileModal";
|
|
31
|
+
import BulkGridHeader from "./BulkGridHeader";
|
|
32
|
+
import { DeleteFileModal, MoveItemModal, NewFolderModal } from "./atoms";
|
|
33
|
+
|
|
34
|
+
import * as S from "./style";
|
|
35
|
+
|
|
36
|
+
const FileDrive = (props: IProps) => {
|
|
37
|
+
const {
|
|
38
|
+
currentFolderContent,
|
|
39
|
+
currentFolderID,
|
|
40
|
+
currentSiteID,
|
|
41
|
+
getFolderContent,
|
|
42
|
+
getFoldersTree,
|
|
43
|
+
updateCurrentFolder,
|
|
44
|
+
createNewFolder,
|
|
45
|
+
deleteFolder,
|
|
46
|
+
deleteFile,
|
|
47
|
+
moveFile,
|
|
48
|
+
updateDisplayMode,
|
|
49
|
+
updateTab,
|
|
50
|
+
breadcrumb,
|
|
51
|
+
isLoading,
|
|
52
|
+
isSaving,
|
|
53
|
+
displayMode,
|
|
54
|
+
selectedTab,
|
|
55
|
+
} = props;
|
|
56
|
+
|
|
57
|
+
const {
|
|
58
|
+
files: { totalItems, items },
|
|
59
|
+
folders,
|
|
60
|
+
} = currentFolderContent || { files: { totalItems: 0, items: [] }, folders: [] };
|
|
61
|
+
|
|
62
|
+
const [isPanelOpen, setPanelOpen] = useState(false);
|
|
63
|
+
const [fileSelected, setFileSelected] = useState<IFile | null>(null);
|
|
64
|
+
const [selectedFolder, setSelectedFolder] = useState<number>(currentFolderID || 0);
|
|
65
|
+
const filesIds: number[] = items.map((file: any) => file.id) || [];
|
|
66
|
+
const [galleryItems, setGalleryItems] = useState<number[]>(filesIds);
|
|
67
|
+
const [galleryDelete, setGalleryDelete] = useState(true);
|
|
68
|
+
const [numDocs, setNumDocs] = useState(1);
|
|
69
|
+
const tableRef = useRef<HTMLDivElement>(null);
|
|
70
|
+
const { isOpen: isNewOpen, toggleModal: toggleNewModal } = useModal();
|
|
71
|
+
const { isOpen: isUploadOpen, toggleModal: toggleUploadModal } = useModal();
|
|
72
|
+
const { isOpen: isDeleteOpen, toggleModal: toggleDeleteModal } = useModal();
|
|
73
|
+
const { isOpen: isMoveOpen, toggleModal: toggleMoveModal } = useModal();
|
|
74
|
+
const { isOpen, toggleModal } = useModal();
|
|
75
|
+
const { isVisible, toggleToast, setIsVisible } = useToast();
|
|
76
|
+
const { isVisible: isNewVisible, toggleToast: toggleNewToast, setIsVisible: setIsNewVisible } = useToast();
|
|
77
|
+
const { isVisible: isDeleteVisible, toggleToast: toggleDeleteToast, setIsVisible: setIsDeleteVisible } = useToast();
|
|
78
|
+
const { isVisible: isMoveVisible, toggleToast: toggleMoveToast, setIsVisible: setIsMoveVisible } = useToast();
|
|
79
|
+
const {
|
|
80
|
+
isVisible: isMoveFolderVisible,
|
|
81
|
+
toggleToast: toggleMoveFolderToast,
|
|
82
|
+
setIsVisible: setIsMoveFolderVisible,
|
|
83
|
+
} = useToast();
|
|
84
|
+
|
|
85
|
+
const initState = { name: "", folderID: currentFolderID };
|
|
86
|
+
const [folderForm, setFolderForm] = useState<IFormState>(initState);
|
|
87
|
+
|
|
88
|
+
const isSiteView = !!currentSiteID;
|
|
89
|
+
const isTabGlobal = selectedTab === "global";
|
|
90
|
+
const siteID: number | "global" = !isSiteView || isTabGlobal ? "global" : currentSiteID;
|
|
91
|
+
const hasFolders = !!folders.length;
|
|
92
|
+
const isRoot = !breadcrumb.length;
|
|
93
|
+
const isGrid = displayMode === "grid";
|
|
94
|
+
const validFormats = ["pdf", "doc", "docx", "xls", "xlsx", "zip"];
|
|
95
|
+
|
|
96
|
+
const allowedToAccessGlobalFromSite = usePermission("mediaGallery.accessToGlobalFileDriveFromSite");
|
|
97
|
+
|
|
98
|
+
const allowedToAddSiteFile = usePermission("mediaGallery.addFiles");
|
|
99
|
+
const allowedToAddGlobalFile = usePermission("global.mediaGallery.addGlobalFiles");
|
|
100
|
+
const allowedToAddGlobalFileFromSite = usePermission("mediaGallery.addGlobalFilesFromSite");
|
|
101
|
+
const allowedToAddFile = isTabGlobal
|
|
102
|
+
? allowedToAddGlobalFileFromSite
|
|
103
|
+
: isSiteView
|
|
104
|
+
? allowedToAddSiteFile
|
|
105
|
+
: allowedToAddGlobalFile;
|
|
106
|
+
|
|
107
|
+
const allowedToEditSiteFile = usePermission("mediaGallery.editFiles");
|
|
108
|
+
const allowedToEditGlobalFile = usePermission("global.mediaGallery.editGlobalFiles");
|
|
109
|
+
const allowedToEditGlobalFileFromSite = usePermission("mediaGallery.editGlobalFilesInSite");
|
|
110
|
+
const allowedToEditFile = isTabGlobal
|
|
111
|
+
? allowedToEditGlobalFileFromSite
|
|
112
|
+
: isSiteView
|
|
113
|
+
? allowedToEditSiteFile
|
|
114
|
+
: allowedToEditGlobalFile;
|
|
115
|
+
|
|
116
|
+
const allowedToDeleteSiteFile = usePermission("mediaGallery.deleteFiles");
|
|
117
|
+
const allowedToDeleteGlobalFile = usePermission("global.mediaGallery.deleteGlobalFiles");
|
|
118
|
+
const allowedToDeleteGlobalFileFromSite = usePermission("mediaGallery.deleteGlobalFilesInSite");
|
|
119
|
+
const allowedToDeleteFile = isTabGlobal
|
|
120
|
+
? allowedToDeleteGlobalFileFromSite
|
|
121
|
+
: isSiteView
|
|
122
|
+
? allowedToDeleteSiteFile
|
|
123
|
+
: allowedToDeleteGlobalFile;
|
|
124
|
+
|
|
125
|
+
const getParams = useCallback(() => {
|
|
126
|
+
const params = {
|
|
127
|
+
siteID,
|
|
128
|
+
folderID: currentFolderID,
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
return params;
|
|
132
|
+
}, [currentFolderID, selectedTab]);
|
|
133
|
+
|
|
134
|
+
useLayoutEffect(() => {
|
|
135
|
+
return () => {
|
|
136
|
+
updateCurrentFolder(null);
|
|
137
|
+
updateTab("local");
|
|
138
|
+
};
|
|
139
|
+
}, []);
|
|
140
|
+
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
const handleGetContent = async () => {
|
|
143
|
+
const params = getParams();
|
|
144
|
+
await getFolderContent(params);
|
|
145
|
+
};
|
|
146
|
+
handleGetContent();
|
|
147
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
148
|
+
}, [getParams]);
|
|
149
|
+
|
|
150
|
+
useEffect(() => {
|
|
151
|
+
const handleGetTree = async () => await getFoldersTree(siteID);
|
|
152
|
+
handleGetTree();
|
|
153
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
154
|
+
}, [selectedTab]);
|
|
155
|
+
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
const filesIds: number[] = items.map((file: any) => file.id) || [];
|
|
158
|
+
setGalleryItems(filesIds);
|
|
159
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
160
|
+
}, [items]);
|
|
161
|
+
|
|
162
|
+
const {
|
|
163
|
+
resetBulkSelection,
|
|
164
|
+
selectedItems,
|
|
165
|
+
isSelected,
|
|
166
|
+
areItemsSelected,
|
|
167
|
+
checkState,
|
|
168
|
+
addToBulkSelection,
|
|
169
|
+
selectAllItems,
|
|
170
|
+
} = useBulkSelection(filesIds);
|
|
171
|
+
|
|
172
|
+
const handleSelectedTab = (tab: "local" | "global") => {
|
|
173
|
+
if (tab !== selectedTab) {
|
|
174
|
+
updateCurrentFolder(null);
|
|
175
|
+
updateTab(tab);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const handleNewFolder = () => {
|
|
180
|
+
setFolderForm(initState);
|
|
181
|
+
!isNewOpen && toggleNewModal();
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
const changeDisplayMode = (mode: "grid" | "list") => updateDisplayMode(mode);
|
|
185
|
+
|
|
186
|
+
const selectItems = () => (checkState.isAllSelected ? resetBulkSelection() : selectAllItems());
|
|
187
|
+
|
|
188
|
+
const handleBackClick = () => {
|
|
189
|
+
const parentID = breadcrumb.length >= 2 ? breadcrumb[breadcrumb.length - 2].id : null;
|
|
190
|
+
updateCurrentFolder(parentID);
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
const togglePanel = () => setPanelOpen(!isPanelOpen);
|
|
194
|
+
|
|
195
|
+
const handleCreateNewFolder = async () => {
|
|
196
|
+
const isCreated = await createNewFolder({
|
|
197
|
+
site: siteID,
|
|
198
|
+
folderName: folderForm.name,
|
|
199
|
+
parentId: folderForm.folderID || undefined,
|
|
200
|
+
});
|
|
201
|
+
if (isCreated) {
|
|
202
|
+
isNewOpen && toggleNewModal();
|
|
203
|
+
toggleNewToast();
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
const handleDeleteFolder = async (folder: IFolder) => {
|
|
208
|
+
const isDeleted = await deleteFolder(folder);
|
|
209
|
+
if (isDeleted) {
|
|
210
|
+
toggleToast();
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const handleClick = (file: IFile) => {
|
|
215
|
+
setFileSelected(file);
|
|
216
|
+
toggleModal();
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
/*const handleSingleUpload = async (file: IFile) => {
|
|
220
|
+
setFileSelected(file);
|
|
221
|
+
isUploadOpen && toggleUploadModal();
|
|
222
|
+
toggleModal();
|
|
223
|
+
const params = getParams();
|
|
224
|
+
await getFolderContent(params);
|
|
225
|
+
};*/
|
|
226
|
+
|
|
227
|
+
const handleMultipleUpload = async (files: IFile[]) => {
|
|
228
|
+
setFileSelected(files[0]);
|
|
229
|
+
isUploadOpen && toggleUploadModal();
|
|
230
|
+
toggleModal();
|
|
231
|
+
const params = getParams();
|
|
232
|
+
await getFolderContent(params);
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
const handleCloseModal = () => {
|
|
236
|
+
setFileSelected(null);
|
|
237
|
+
setGalleryItems(filesIds);
|
|
238
|
+
setGalleryDelete(true);
|
|
239
|
+
toggleModal();
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
const handleDeleteFile = async (fileID: number) => {
|
|
243
|
+
const isDeleted = await deleteFile(fileID, siteID);
|
|
244
|
+
if (isDeleted) {
|
|
245
|
+
setNumDocs(1);
|
|
246
|
+
toggleDeleteToast();
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
const handleBulkDeleteFile = async () => {
|
|
251
|
+
const isDeleted = await deleteFile(selectedItems.all, siteID);
|
|
252
|
+
if (isDeleted) {
|
|
253
|
+
setNumDocs(selectedItems.all.length);
|
|
254
|
+
toggleDeleteModal();
|
|
255
|
+
toggleDeleteToast();
|
|
256
|
+
resetBulkSelection();
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
const handleMoveFile = async (fileID: number, folderID: number) => {
|
|
261
|
+
const isMoved = await moveFile(fileID, folderID, siteID);
|
|
262
|
+
if (isMoved) {
|
|
263
|
+
setNumDocs(1);
|
|
264
|
+
toggleMoveToast();
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
const handleBulkMoveFile = async () => {
|
|
269
|
+
const isMoved = await moveFile(selectedItems.all, selectedFolder, siteID);
|
|
270
|
+
if (isMoved) {
|
|
271
|
+
setNumDocs(selectedItems.all.length);
|
|
272
|
+
toggleMoveModal();
|
|
273
|
+
toggleMoveToast();
|
|
274
|
+
setSelectedFolder(0);
|
|
275
|
+
resetBulkSelection();
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
const handleBulkEditFile = () => {
|
|
280
|
+
const currentFile = items.find((file: IFile) => file.id === selectedItems.all[0]);
|
|
281
|
+
if (currentFile) {
|
|
282
|
+
setGalleryItems(selectedItems.all);
|
|
283
|
+
setFileSelected(currentFile);
|
|
284
|
+
setGalleryDelete(false);
|
|
285
|
+
toggleModal();
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
const handleModalClose = () => {
|
|
290
|
+
setSelectedFolder(0);
|
|
291
|
+
isMoveOpen && toggleMoveModal();
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
const handleSelectFile = (id: number) => {
|
|
295
|
+
const currentFile = items.find((file: IFile) => file.id === id);
|
|
296
|
+
if (currentFile) {
|
|
297
|
+
setFileSelected(currentFile);
|
|
298
|
+
}
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
let bulkActions: IBulkAction[] = [];
|
|
302
|
+
|
|
303
|
+
if (allowedToEditFile) {
|
|
304
|
+
bulkActions = [
|
|
305
|
+
{
|
|
306
|
+
icon: "edit",
|
|
307
|
+
text: "edit",
|
|
308
|
+
action: handleBulkEditFile,
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
icon: "change",
|
|
312
|
+
text: "Move to",
|
|
313
|
+
action: toggleMoveModal,
|
|
314
|
+
},
|
|
315
|
+
];
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (allowedToDeleteFile) {
|
|
319
|
+
bulkActions = [
|
|
320
|
+
...bulkActions,
|
|
321
|
+
{
|
|
322
|
+
icon: "delete",
|
|
323
|
+
text: "delete",
|
|
324
|
+
action: toggleDeleteModal,
|
|
325
|
+
},
|
|
326
|
+
];
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
const Header = (
|
|
330
|
+
<BulkListHeader
|
|
331
|
+
showBulk={areItemsSelected(filesIds)}
|
|
332
|
+
checkState={checkState}
|
|
333
|
+
selectAllItems={selectItems}
|
|
334
|
+
totalItems={totalItems}
|
|
335
|
+
selectItems={selectItems}
|
|
336
|
+
bulkActions={bulkActions}
|
|
337
|
+
/>
|
|
338
|
+
);
|
|
339
|
+
|
|
340
|
+
const GridList = () => (
|
|
341
|
+
<S.GridWrapper>
|
|
342
|
+
{items.map((file: IFile, i: number) => {
|
|
343
|
+
const isItemSelected = isSelected(file.id);
|
|
344
|
+
return (
|
|
345
|
+
<GridItem
|
|
346
|
+
file={file}
|
|
347
|
+
isSelected={isItemSelected}
|
|
348
|
+
onChange={addToBulkSelection}
|
|
349
|
+
key={file.fileName}
|
|
350
|
+
onClick={handleClick}
|
|
351
|
+
onDelete={handleDeleteFile}
|
|
352
|
+
onMove={handleMoveFile}
|
|
353
|
+
currentFolderID={currentFolderID}
|
|
354
|
+
isAllowedToDelete={allowedToDeleteFile}
|
|
355
|
+
isAllowedToEdit={allowedToEditFile}
|
|
356
|
+
isAllowedToMove={!isRoot || (isRoot && folders.length > 0)}
|
|
357
|
+
/>
|
|
358
|
+
);
|
|
359
|
+
})}
|
|
360
|
+
</S.GridWrapper>
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
const ListTable = () => (
|
|
364
|
+
<TableList tableHeader={Header} hasFixedHeader={true} tableRef={tableRef} className="no-padding">
|
|
365
|
+
{items.map((file: IFile, i: number) => {
|
|
366
|
+
const isItemSelected = isSelected(file.id);
|
|
367
|
+
return (
|
|
368
|
+
<ListItem
|
|
369
|
+
file={file}
|
|
370
|
+
isSelected={isItemSelected}
|
|
371
|
+
onChange={addToBulkSelection}
|
|
372
|
+
key={file.fileName}
|
|
373
|
+
onClick={handleClick}
|
|
374
|
+
onDelete={handleDeleteFile}
|
|
375
|
+
onMove={handleMoveFile}
|
|
376
|
+
currentFolderID={currentFolderID}
|
|
377
|
+
isAllowedToDelete={allowedToDeleteFile}
|
|
378
|
+
isAllowedToEdit={allowedToEditFile}
|
|
379
|
+
isAllowedToMove={!isRoot || (isRoot && folders.length > 0)}
|
|
380
|
+
/>
|
|
381
|
+
);
|
|
382
|
+
})}
|
|
383
|
+
</TableList>
|
|
384
|
+
);
|
|
385
|
+
|
|
386
|
+
const toastDeleteFolderProps = {
|
|
387
|
+
setIsVisible,
|
|
388
|
+
message: "1 folder deleted",
|
|
389
|
+
};
|
|
390
|
+
|
|
391
|
+
const toastNewProps = {
|
|
392
|
+
setIsVisible: setIsNewVisible,
|
|
393
|
+
message: "1 new folder created",
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
const toastDeleteFileProps = {
|
|
397
|
+
setIsVisible: setIsDeleteVisible,
|
|
398
|
+
message: `${numDocs} Document${numDocs > 1 ? "s" : ""} deleted`,
|
|
399
|
+
};
|
|
400
|
+
|
|
401
|
+
const toastMoveFileProps = {
|
|
402
|
+
setIsVisible: setIsMoveVisible,
|
|
403
|
+
message: `${numDocs} Document${numDocs > 1 ? "s" : ""} moved to a folder`,
|
|
404
|
+
};
|
|
405
|
+
|
|
406
|
+
const toastMoveFolderProps = {
|
|
407
|
+
setIsVisible: setIsMoveFolderVisible,
|
|
408
|
+
message: "1 Folder moved to another folder",
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
const rightButtonProps = allowedToAddFile
|
|
412
|
+
? {
|
|
413
|
+
label: "Upload",
|
|
414
|
+
action: () => toggleUploadModal(),
|
|
415
|
+
}
|
|
416
|
+
: undefined;
|
|
417
|
+
|
|
418
|
+
const emptyProps = {
|
|
419
|
+
message: allowedToAddFile ? "To start using files in your site, upload as many documents as you need" : "",
|
|
420
|
+
button: allowedToAddFile ? "Upload file" : undefined,
|
|
421
|
+
action: () => toggleUploadModal(),
|
|
422
|
+
};
|
|
423
|
+
|
|
424
|
+
const mainNewModalAction = {
|
|
425
|
+
title: isSaving ? "Saving..." : "Create New Folder",
|
|
426
|
+
onClick: () => handleCreateNewFolder(),
|
|
427
|
+
disabled: folderForm.name.trim().length === 0 || isSaving,
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
const secondaryNewModalAction = { title: "Cancel", onClick: toggleNewModal };
|
|
431
|
+
|
|
432
|
+
const mainDeleteModalAction = {
|
|
433
|
+
title: "Delete documents",
|
|
434
|
+
onClick: () => handleBulkDeleteFile(),
|
|
435
|
+
};
|
|
436
|
+
|
|
437
|
+
const secondaryDeleteModalAction = { title: "Cancel", onClick: toggleDeleteModal };
|
|
438
|
+
|
|
439
|
+
const mainMoveModalAction = {
|
|
440
|
+
title: "Move",
|
|
441
|
+
onClick: () => handleBulkMoveFile(),
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
const secondaryMoveModalAction = { title: "Cancel", onClick: handleModalClose };
|
|
445
|
+
|
|
446
|
+
const foldersIcon = isPanelOpen ? <Icon name="closePanel" size="24" /> : <Icon name="openPanel" size="24" />;
|
|
447
|
+
|
|
448
|
+
const tabs = ["local", "global"];
|
|
449
|
+
|
|
450
|
+
const NewFolderButton = () =>
|
|
451
|
+
allowedToAddFile ? (
|
|
452
|
+
<S.ButtonWrapper>
|
|
453
|
+
<Button type="button" onClick={handleNewFolder} buttonStyle="line" icon="NewFolder">
|
|
454
|
+
New Folder
|
|
455
|
+
</Button>
|
|
456
|
+
</S.ButtonWrapper>
|
|
457
|
+
) : (
|
|
458
|
+
<></>
|
|
459
|
+
);
|
|
460
|
+
|
|
461
|
+
return (
|
|
462
|
+
<MainWrapper backLink={false} title="File Drive Manager" rightButton={rightButtonProps}>
|
|
463
|
+
<S.Wrapper>
|
|
464
|
+
<S.FolderPanel isOpen={isPanelOpen}>
|
|
465
|
+
<S.FolderPanelContent>
|
|
466
|
+
<FolderTree
|
|
467
|
+
folderID={currentFolderID || 0}
|
|
468
|
+
onClick={updateCurrentFolder}
|
|
469
|
+
title="Folders"
|
|
470
|
+
createAction={allowedToAddFile ? handleNewFolder : undefined}
|
|
471
|
+
trimNames={true}
|
|
472
|
+
/>
|
|
473
|
+
</S.FolderPanelContent>
|
|
474
|
+
</S.FolderPanel>
|
|
475
|
+
<S.ContentWrapper>
|
|
476
|
+
<ErrorToast />
|
|
477
|
+
{isLoading ? (
|
|
478
|
+
<Loading />
|
|
479
|
+
) : (
|
|
480
|
+
<>
|
|
481
|
+
<S.FiltersBar isSite={isSiteView && allowedToAccessGlobalFromSite}>
|
|
482
|
+
{isSiteView && allowedToAccessGlobalFromSite && (
|
|
483
|
+
<S.TabsWrapper>
|
|
484
|
+
<Tabs tabs={tabs} active={selectedTab} setSelectedTab={handleSelectedTab} noMargins />
|
|
485
|
+
</S.TabsWrapper>
|
|
486
|
+
)}
|
|
487
|
+
<S.DisplayModeWrapper>
|
|
488
|
+
<IconAction icon="Grid2" onClick={() => changeDisplayMode("grid")} active={displayMode === "grid"} />
|
|
489
|
+
<IconAction
|
|
490
|
+
icon="BulletList"
|
|
491
|
+
onClick={() => changeDisplayMode("list")}
|
|
492
|
+
active={displayMode === "list"}
|
|
493
|
+
/>
|
|
494
|
+
</S.DisplayModeWrapper>
|
|
495
|
+
</S.FiltersBar>
|
|
496
|
+
{!isRoot && <Breadcrumb breadcrumb={breadcrumb} onClick={updateCurrentFolder} />}
|
|
497
|
+
{(hasFolders || !isRoot) && (
|
|
498
|
+
<S.SectionWrapper>
|
|
499
|
+
<S.SectionHeader>
|
|
500
|
+
<S.SectionTitle>
|
|
501
|
+
<div>Folders</div>
|
|
502
|
+
<S.FoldersIconWrapper onClick={togglePanel}>
|
|
503
|
+
<Tooltip content="Open folder panel">{foldersIcon}</Tooltip>
|
|
504
|
+
</S.FoldersIconWrapper>
|
|
505
|
+
</S.SectionTitle>
|
|
506
|
+
<NewFolderButton />
|
|
507
|
+
</S.SectionHeader>
|
|
508
|
+
<S.FoldersWrapper>
|
|
509
|
+
{!isRoot && <BackFolder onClick={handleBackClick} />}
|
|
510
|
+
<S.FoldersGrid>
|
|
511
|
+
{folders.map((folder: IFolder) => (
|
|
512
|
+
<FolderItem
|
|
513
|
+
folder={folder}
|
|
514
|
+
onClick={updateCurrentFolder}
|
|
515
|
+
onDelete={handleDeleteFolder}
|
|
516
|
+
key={folder.folderName}
|
|
517
|
+
toggleToast={toggleMoveFolderToast}
|
|
518
|
+
isAllowedToDelete={allowedToDeleteFile}
|
|
519
|
+
isAllowedToEdit={allowedToEditFile}
|
|
520
|
+
isAllowedToMove={!isRoot || (isRoot && folders.length > 1)}
|
|
521
|
+
/>
|
|
522
|
+
))}
|
|
523
|
+
</S.FoldersGrid>
|
|
524
|
+
</S.FoldersWrapper>
|
|
525
|
+
</S.SectionWrapper>
|
|
526
|
+
)}
|
|
527
|
+
<S.SectionWrapper>
|
|
528
|
+
<S.SectionHeader>
|
|
529
|
+
<S.SectionTitle>Documents</S.SectionTitle>
|
|
530
|
+
{totalItems > 0 && isGrid && (
|
|
531
|
+
<BulkGridHeader
|
|
532
|
+
showBulk={areItemsSelected(filesIds)}
|
|
533
|
+
checkState={checkState}
|
|
534
|
+
selectAllItems={selectItems}
|
|
535
|
+
totalItems={totalItems}
|
|
536
|
+
selectItems={selectItems}
|
|
537
|
+
bulkActions={bulkActions}
|
|
538
|
+
/>
|
|
539
|
+
)}
|
|
540
|
+
{!hasFolders && isRoot && <NewFolderButton />}
|
|
541
|
+
</S.SectionHeader>
|
|
542
|
+
<S.DocumentsWrapper>
|
|
543
|
+
{items.length > 0 ? (
|
|
544
|
+
isGrid ? (
|
|
545
|
+
<GridList />
|
|
546
|
+
) : (
|
|
547
|
+
<ListTable />
|
|
548
|
+
)
|
|
549
|
+
) : (
|
|
550
|
+
<S.EmptyStateWrapper data-testid="empty-state">
|
|
551
|
+
<EmptyState {...emptyProps} />
|
|
552
|
+
</S.EmptyStateWrapper>
|
|
553
|
+
)}
|
|
554
|
+
</S.DocumentsWrapper>
|
|
555
|
+
</S.SectionWrapper>
|
|
556
|
+
</>
|
|
557
|
+
)}
|
|
558
|
+
</S.ContentWrapper>
|
|
559
|
+
</S.Wrapper>
|
|
560
|
+
{isNewOpen && (
|
|
561
|
+
<NewFolderModal
|
|
562
|
+
isOpen={isNewOpen}
|
|
563
|
+
toggleModal={toggleNewModal}
|
|
564
|
+
mainModalAction={mainNewModalAction}
|
|
565
|
+
secondaryModalAction={secondaryNewModalAction}
|
|
566
|
+
form={folderForm}
|
|
567
|
+
setForm={setFolderForm}
|
|
568
|
+
/>
|
|
569
|
+
)}
|
|
570
|
+
<Modal isOpen={isUploadOpen} hide={toggleUploadModal} size="XL" title="Upload file">
|
|
571
|
+
{isUploadOpen && (
|
|
572
|
+
<FileDragAndDrop
|
|
573
|
+
validFormats={validFormats}
|
|
574
|
+
folderID={currentFolderID}
|
|
575
|
+
handleUpload={handleMultipleUpload}
|
|
576
|
+
siteID={siteID}
|
|
577
|
+
/>
|
|
578
|
+
)}
|
|
579
|
+
</Modal>
|
|
580
|
+
<Modal isOpen={isOpen} hide={handleCloseModal} size="XL" title="Document details">
|
|
581
|
+
{isOpen && fileSelected && (
|
|
582
|
+
<FileModal
|
|
583
|
+
file={fileSelected}
|
|
584
|
+
toggleModal={handleCloseModal}
|
|
585
|
+
onDelete={handleDeleteFile}
|
|
586
|
+
items={galleryItems}
|
|
587
|
+
setFile={handleSelectFile}
|
|
588
|
+
activeDelete={galleryDelete && allowedToDeleteFile}
|
|
589
|
+
setFileSelected={setFileSelected}
|
|
590
|
+
isAllowedToEdit={allowedToEditFile}
|
|
591
|
+
/>
|
|
592
|
+
)}
|
|
593
|
+
</Modal>
|
|
594
|
+
{isDeleteOpen && (
|
|
595
|
+
<DeleteFileModal
|
|
596
|
+
isOpen={isDeleteOpen}
|
|
597
|
+
toggleModal={toggleDeleteModal}
|
|
598
|
+
mainModalAction={mainDeleteModalAction}
|
|
599
|
+
secondaryModalAction={secondaryDeleteModalAction}
|
|
600
|
+
title="these documents"
|
|
601
|
+
/>
|
|
602
|
+
)}
|
|
603
|
+
{isMoveOpen && (
|
|
604
|
+
<MoveItemModal
|
|
605
|
+
isOpen={isMoveOpen}
|
|
606
|
+
toggleModal={handleModalClose}
|
|
607
|
+
mainModalAction={mainMoveModalAction}
|
|
608
|
+
secondaryModalAction={secondaryMoveModalAction}
|
|
609
|
+
folder={selectedFolder}
|
|
610
|
+
setFolder={setSelectedFolder}
|
|
611
|
+
/>
|
|
612
|
+
)}
|
|
613
|
+
{isVisible && <Toast {...toastDeleteFolderProps} />}
|
|
614
|
+
{isDeleteVisible && <Toast {...toastDeleteFileProps} />}
|
|
615
|
+
{isNewVisible && <Toast {...toastNewProps} />}
|
|
616
|
+
{isMoveVisible && <Toast {...toastMoveFileProps} />}
|
|
617
|
+
{isMoveFolderVisible && <Toast {...toastMoveFolderProps} />}
|
|
618
|
+
</MainWrapper>
|
|
619
|
+
);
|
|
620
|
+
};
|
|
621
|
+
|
|
622
|
+
interface IProps {
|
|
623
|
+
isLoading: boolean;
|
|
624
|
+
isSaving: boolean;
|
|
625
|
+
currentFolderContent: IFilesFolder | null;
|
|
626
|
+
currentFolderID: number | null;
|
|
627
|
+
currentSiteID: number | null;
|
|
628
|
+
breadcrumb: IFolderTree[];
|
|
629
|
+
displayMode: "grid" | "list";
|
|
630
|
+
selectedTab: "local" | "global";
|
|
631
|
+
getFolderContent(params: IGetFolderParams): Promise<void>;
|
|
632
|
+
getFoldersTree(siteID: number | "global"): Promise<void>;
|
|
633
|
+
updateCurrentFolder(folderID: number | null): void;
|
|
634
|
+
createNewFolder(data: { folderName: string; site: number | "global"; parentId?: number }): Promise<boolean>;
|
|
635
|
+
deleteFolder(folder: IFolder): Promise<boolean>;
|
|
636
|
+
deleteFile(fileID: number | number[], siteID: number | "global"): Promise<boolean>;
|
|
637
|
+
moveFile(fileID: number | number[], folderID: number, siteID: number | "global"): Promise<boolean>;
|
|
638
|
+
updateDisplayMode(displayMode: "grid" | "list"): Promise<void>;
|
|
639
|
+
updateTab(tab: "local" | "global"): Promise<void>;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
export interface IFormState {
|
|
643
|
+
name: string;
|
|
644
|
+
folderID: number | null;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
const mapDispatchToProps = {
|
|
648
|
+
getFolderContent: fileDriveActions.getFolderContent,
|
|
649
|
+
getFoldersTree: fileDriveActions.getFoldersTree,
|
|
650
|
+
updateCurrentFolder: fileDriveActions.updateCurrentFolder,
|
|
651
|
+
createNewFolder: fileDriveActions.createNewFolder,
|
|
652
|
+
deleteFolder: fileDriveActions.deleteFolder,
|
|
653
|
+
deleteFile: fileDriveActions.deleteFile,
|
|
654
|
+
moveFile: fileDriveActions.moveFile,
|
|
655
|
+
updateDisplayMode: fileDriveActions.updateDisplayMode,
|
|
656
|
+
updateTab: fileDriveActions.updateTab,
|
|
657
|
+
};
|
|
658
|
+
|
|
659
|
+
const mapStateToProps = (state: IRootState) => ({
|
|
660
|
+
isLoading: state.app.isLoading,
|
|
661
|
+
isSaving: state.app.isSaving,
|
|
662
|
+
currentFolderContent: state.fileDrive.currentFolderContent,
|
|
663
|
+
currentFolderID: state.fileDrive.currentFolderID,
|
|
664
|
+
breadcrumb: state.fileDrive.breadcrumb,
|
|
665
|
+
currentSiteID: state.sites.currentSiteInfo && state.sites.currentSiteInfo.id,
|
|
666
|
+
displayMode: state.fileDrive.displayMode,
|
|
667
|
+
selectedTab: state.fileDrive.selectedTab,
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
export default connect(mapStateToProps, mapDispatchToProps)(FileDrive);
|