@payloadcms/ui 3.43.0-canary.7 → 3.43.0-internal.693bd81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/AddNewRelation/index.js +8 -9
- package/dist/elements/AddNewRelation/index.js.map +1 -1
- package/dist/elements/BulkUpload/FileSidebar/index.d.ts.map +1 -1
- package/dist/elements/BulkUpload/FileSidebar/index.js +0 -1
- package/dist/elements/BulkUpload/FileSidebar/index.js.map +1 -1
- package/dist/elements/Drawer/index.d.ts.map +1 -1
- package/dist/elements/Drawer/index.js +67 -51
- package/dist/elements/Drawer/index.js.map +1 -1
- package/dist/elements/FolderView/CollectionTypePill/index.d.ts.map +1 -1
- package/dist/elements/FolderView/CollectionTypePill/index.js +10 -13
- package/dist/elements/FolderView/CollectionTypePill/index.js.map +1 -1
- package/dist/elements/FolderView/CurrentFolderActions/index.d.ts.map +1 -1
- package/dist/elements/FolderView/CurrentFolderActions/index.js +11 -17
- package/dist/elements/FolderView/CurrentFolderActions/index.js.map +1 -1
- package/dist/elements/FolderView/Drawers/EditFolderAction/index.d.ts +3 -1
- package/dist/elements/FolderView/Drawers/EditFolderAction/index.d.ts.map +1 -1
- package/dist/elements/FolderView/Drawers/EditFolderAction/index.js +4 -7
- package/dist/elements/FolderView/Drawers/EditFolderAction/index.js.map +1 -1
- package/dist/elements/FolderView/Drawers/MoveToFolder/index.d.ts +0 -1
- package/dist/elements/FolderView/Drawers/MoveToFolder/index.d.ts.map +1 -1
- package/dist/elements/FolderView/Drawers/MoveToFolder/index.js +201 -230
- package/dist/elements/FolderView/Drawers/MoveToFolder/index.js.map +1 -1
- package/dist/elements/FolderView/FolderFileCard/index.d.ts +0 -8
- package/dist/elements/FolderView/FolderFileCard/index.d.ts.map +1 -1
- package/dist/elements/FolderView/FolderFileCard/index.js +0 -82
- package/dist/elements/FolderView/FolderFileCard/index.js.map +1 -1
- package/dist/elements/FolderView/FolderFileTable/index.d.ts +22 -1
- package/dist/elements/FolderView/FolderFileTable/index.d.ts.map +1 -1
- package/dist/elements/FolderView/FolderFileTable/index.js +163 -245
- package/dist/elements/FolderView/FolderFileTable/index.js.map +1 -1
- package/dist/elements/FolderView/ItemCardGrid/index.d.ts +8 -2
- package/dist/elements/FolderView/ItemCardGrid/index.d.ts.map +1 -1
- package/dist/elements/FolderView/ItemCardGrid/index.js +90 -24
- package/dist/elements/FolderView/ItemCardGrid/index.js.map +1 -1
- package/dist/elements/FolderView/SortByPill/index.d.ts.map +1 -1
- package/dist/elements/FolderView/SortByPill/index.js +15 -17
- package/dist/elements/FolderView/SortByPill/index.js.map +1 -1
- package/dist/elements/ListHeader/DrawerTitleActions/ListDrawerCreateNewDocButton.js +0 -1
- package/dist/elements/ListHeader/DrawerTitleActions/ListDrawerCreateNewDocButton.js.map +1 -1
- package/dist/elements/ListHeader/TitleActions/ListCreateNewDocInFolderButton.d.ts.map +1 -1
- package/dist/elements/ListHeader/TitleActions/ListCreateNewDocInFolderButton.js +10 -8
- package/dist/elements/ListHeader/TitleActions/ListCreateNewDocInFolderButton.js.map +1 -1
- package/dist/elements/ListHeader/index.scss +1 -1
- package/dist/elements/PublishButton/ScheduleDrawer/buildUpcomingColumns.js +0 -1
- package/dist/elements/PublishButton/ScheduleDrawer/buildUpcomingColumns.js.map +1 -1
- package/dist/elements/QueryPresets/cells/ColumnsCell/index.js +0 -1
- package/dist/elements/QueryPresets/cells/ColumnsCell/index.js.map +1 -1
- package/dist/elements/QueryPresets/fields/ColumnsField/index.d.ts.map +1 -1
- package/dist/elements/QueryPresets/fields/ColumnsField/index.js +0 -1
- package/dist/elements/QueryPresets/fields/ColumnsField/index.js.map +1 -1
- package/dist/elements/QueryPresets/fields/WhereField/index.js +0 -1
- package/dist/elements/QueryPresets/fields/WhereField/index.js.map +1 -1
- package/dist/elements/RelationshipTable/index.d.ts +0 -1
- package/dist/elements/RelationshipTable/index.d.ts.map +1 -1
- package/dist/elements/RelationshipTable/index.js +1 -3
- package/dist/elements/RelationshipTable/index.js.map +1 -1
- package/dist/elements/SelectMany/index.d.ts.map +1 -1
- package/dist/elements/SelectMany/index.js +0 -1
- package/dist/elements/SelectMany/index.js.map +1 -1
- package/dist/elements/Table/index.js +2 -2
- package/dist/elements/Table/index.js.map +1 -1
- package/dist/exports/client/index.js +22 -22
- package/dist/exports/client/index.js.map +4 -4
- package/dist/exports/rsc/index.d.ts +0 -1
- package/dist/exports/rsc/index.d.ts.map +1 -1
- package/dist/exports/rsc/index.js +0 -1
- package/dist/exports/rsc/index.js.map +1 -1
- package/dist/fields/FieldLabel/index.d.ts.map +1 -1
- package/dist/fields/FieldLabel/index.js +1 -2
- package/dist/fields/FieldLabel/index.js.map +1 -1
- package/dist/fields/Join/index.d.ts.map +1 -1
- package/dist/fields/Join/index.js +0 -1
- package/dist/fields/Join/index.js.map +1 -1
- package/dist/fields/Relationship/Input.d.ts.map +1 -1
- package/dist/fields/Relationship/Input.js +0 -1
- package/dist/fields/Relationship/Input.js.map +1 -1
- package/dist/providers/Folders/index.d.ts +46 -59
- package/dist/providers/Folders/index.d.ts.map +1 -1
- package/dist/providers/Folders/index.js +572 -163
- package/dist/providers/Folders/index.js.map +1 -1
- package/dist/providers/ServerFunctions/index.d.ts +1 -6
- package/dist/providers/ServerFunctions/index.d.ts.map +1 -1
- package/dist/providers/ServerFunctions/index.js +0 -19
- package/dist/providers/ServerFunctions/index.js.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.d.ts.map +1 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.js +2 -1
- package/dist/providers/TableColumns/buildColumnState/renderCell.js.map +1 -1
- package/dist/providers/TableColumns/index.js +0 -1
- package/dist/providers/TableColumns/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utilities/generateFieldID.d.ts.map +1 -1
- package/dist/utilities/generateFieldID.js +1 -4
- package/dist/utilities/generateFieldID.js.map +1 -1
- package/dist/utilities/renderTable.js +0 -1
- package/dist/utilities/renderTable.js.map +1 -1
- package/dist/views/BrowseByFolder/index.d.ts +4 -1
- package/dist/views/BrowseByFolder/index.d.ts.map +1 -1
- package/dist/views/BrowseByFolder/index.js +158 -219
- package/dist/views/BrowseByFolder/index.js.map +1 -1
- package/dist/views/CollectionFolder/ListSelection/index.d.ts.map +1 -1
- package/dist/views/CollectionFolder/ListSelection/index.js +50 -25
- package/dist/views/CollectionFolder/ListSelection/index.js.map +1 -1
- package/dist/views/CollectionFolder/index.d.ts +1 -1
- package/dist/views/CollectionFolder/index.d.ts.map +1 -1
- package/dist/views/CollectionFolder/index.js +153 -186
- package/dist/views/CollectionFolder/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/utilities/getFolderResultsComponentAndData.d.ts +0 -29
- package/dist/utilities/getFolderResultsComponentAndData.d.ts.map +0 -1
- package/dist/utilities/getFolderResultsComponentAndData.js +0 -128
- package/dist/utilities/getFolderResultsComponentAndData.js.map +0 -1
|
@@ -1,68 +1,82 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
4
|
-
import { useRouter
|
|
4
|
+
import { useRouter } from 'next/navigation.js';
|
|
5
5
|
import { extractID, formatAdminURL, formatFolderOrDocumentItem } from 'payload/shared';
|
|
6
6
|
import * as qs from 'qs-esm';
|
|
7
7
|
import React from 'react';
|
|
8
8
|
import { toast } from 'sonner';
|
|
9
9
|
import { useDrawerDepth } from '../../elements/Drawer/index.js';
|
|
10
|
-
import { parseSearchParams } from '../../utilities/parseSearchParams.js';
|
|
11
10
|
import { useConfig } from '../Config/index.js';
|
|
12
11
|
import { useRouteTransition } from '../RouteTransition/index.js';
|
|
13
12
|
import { useTranslation } from '../Translation/index.js';
|
|
14
13
|
import { getMetaSelection, getShiftSelection, groupItemIDsByRelation } from './selection.js';
|
|
15
14
|
const Context = /*#__PURE__*/React.createContext({
|
|
16
|
-
|
|
17
|
-
allCollectionFolderSlugs: [],
|
|
18
|
-
allowCreateCollectionSlugs: [],
|
|
15
|
+
addItems: () => {},
|
|
19
16
|
breadcrumbs: [],
|
|
20
17
|
clearSelections: () => {},
|
|
21
18
|
currentFolder: null,
|
|
22
19
|
documents: [],
|
|
20
|
+
filterItems: () => undefined,
|
|
23
21
|
focusedRowIndex: -1,
|
|
24
22
|
folderCollectionConfig: null,
|
|
25
23
|
folderCollectionSlug: '',
|
|
24
|
+
folderCollectionSlugs: [],
|
|
26
25
|
folderFieldName: 'folder',
|
|
27
26
|
folderID: undefined,
|
|
28
|
-
FolderResultsComponent: null,
|
|
29
|
-
getFolderRoute: () => '',
|
|
30
27
|
getSelectedItems: () => [],
|
|
31
28
|
isDragging: false,
|
|
32
|
-
itemKeysToMove: undefined,
|
|
33
29
|
lastSelectedIndex: null,
|
|
34
30
|
moveToFolder: () => Promise.resolve(undefined),
|
|
35
31
|
onItemClick: () => undefined,
|
|
36
32
|
onItemKeyPress: () => undefined,
|
|
37
|
-
|
|
33
|
+
removeItems: () => undefined,
|
|
34
|
+
renameFolder: () => undefined,
|
|
38
35
|
search: '',
|
|
39
|
-
|
|
36
|
+
selectedIndexes: new Set(),
|
|
40
37
|
setBreadcrumbs: () => {},
|
|
41
38
|
setFocusedRowIndex: () => -1,
|
|
39
|
+
setFolderID: () => null,
|
|
42
40
|
setIsDragging: () => false,
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
sortAndUpdateState: () => undefined,
|
|
42
|
+
sortDirection: 'asc',
|
|
43
|
+
sortOn: '_folderOrDocumentTitle',
|
|
44
|
+
subfolders: [],
|
|
45
|
+
visibleCollectionSlugs: []
|
|
45
46
|
});
|
|
47
|
+
function filterOutItems({
|
|
48
|
+
items,
|
|
49
|
+
relationTo,
|
|
50
|
+
search
|
|
51
|
+
}) {
|
|
52
|
+
if (typeof search !== 'string' && relationTo === undefined) {
|
|
53
|
+
return items;
|
|
54
|
+
}
|
|
55
|
+
const searchLower = (search || '').toLowerCase();
|
|
56
|
+
return items.filter(item => {
|
|
57
|
+
const itemTitle = item.value._folderOrDocumentTitle.toLowerCase();
|
|
58
|
+
const itemRelationTo = item.relationTo;
|
|
59
|
+
return (relationTo ? relationTo.includes(itemRelationTo) : true) && (!searchLower || itemTitle.includes(searchLower));
|
|
60
|
+
});
|
|
61
|
+
}
|
|
46
62
|
export function FolderProvider({
|
|
47
|
-
activeCollectionFolderSlugs: activeCollectionSlugs,
|
|
48
|
-
allCollectionFolderSlugs = [],
|
|
49
|
-
allowCreateCollectionSlugs,
|
|
50
63
|
allowMultiSelection = true,
|
|
51
|
-
baseFolderPath,
|
|
52
64
|
breadcrumbs: _breadcrumbsFromProps = [],
|
|
53
65
|
children,
|
|
54
|
-
|
|
66
|
+
collectionSlug,
|
|
67
|
+
documents: allDocumentsFromProps = [],
|
|
68
|
+
filteredCollectionSlugs,
|
|
69
|
+
folderCollectionSlugs = [],
|
|
55
70
|
folderFieldName,
|
|
56
|
-
folderID,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
sort = '_folderOrDocumentTitle',
|
|
61
|
-
subfolders
|
|
71
|
+
folderID: _folderIDFromProps = undefined,
|
|
72
|
+
search: _searchFromProps,
|
|
73
|
+
sort,
|
|
74
|
+
subfolders: subfoldersFromProps = []
|
|
62
75
|
}) {
|
|
63
76
|
const parentFolderContext = useFolder();
|
|
64
77
|
const {
|
|
65
|
-
config
|
|
78
|
+
config,
|
|
79
|
+
getEntityConfig
|
|
66
80
|
} = useConfig();
|
|
67
81
|
const {
|
|
68
82
|
routes,
|
|
@@ -76,102 +90,154 @@ export function FolderProvider({
|
|
|
76
90
|
const {
|
|
77
91
|
startRouteTransition
|
|
78
92
|
} = useRouteTransition();
|
|
79
|
-
const [FolderResultsComponent, setFolderResultsComponent] = React.useState(InitialFolderResultsComponent || (() => null));
|
|
80
93
|
const [folderCollectionConfig] = React.useState(() => config.collections.find(collection => config.folders && collection.slug === config.folders.slug));
|
|
81
94
|
const folderCollectionSlug = folderCollectionConfig.slug;
|
|
82
|
-
const rawSearchParams = useSearchParams();
|
|
83
|
-
const searchParams = React.useMemo(() => parseSearchParams(rawSearchParams), [rawSearchParams]);
|
|
84
|
-
const [currentQuery, setCurrentQuery] = React.useState(searchParams);
|
|
85
95
|
const [isDragging, setIsDragging] = React.useState(false);
|
|
86
|
-
const [
|
|
96
|
+
const [selectedIndexes, setSelectedIndexes] = React.useState(() => new Set());
|
|
87
97
|
const [focusedRowIndex, setFocusedRowIndex] = React.useState(-1);
|
|
88
98
|
const [lastSelectedIndex, setLastSelectedIndex] = React.useState(null);
|
|
99
|
+
const [visibleCollectionSlugs, setVisibleCollectionSlugs] = React.useState(filteredCollectionSlugs || [...folderCollectionSlugs, folderCollectionSlug]);
|
|
100
|
+
const [activeFolderID, setActiveFolderID] = React.useState(_folderIDFromProps);
|
|
89
101
|
const [breadcrumbs, setBreadcrumbs] = React.useState(_breadcrumbsFromProps);
|
|
102
|
+
const [allSubfolders, setAllSubfolders] = React.useState(subfoldersFromProps);
|
|
103
|
+
const [subfolders, setSubfolders] = React.useState(() => {
|
|
104
|
+
return filterOutItems({
|
|
105
|
+
items: allSubfolders,
|
|
106
|
+
relationTo: visibleCollectionSlugs.includes(folderCollectionSlug) ? [folderCollectionSlug] : [],
|
|
107
|
+
search: _searchFromProps
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
const [allDocuments, setAllDocuments] = React.useState(allDocumentsFromProps);
|
|
111
|
+
const [documents, setDocuments] = React.useState(() => filterOutItems({
|
|
112
|
+
items: allDocuments,
|
|
113
|
+
relationTo: visibleCollectionSlugs,
|
|
114
|
+
search: _searchFromProps
|
|
115
|
+
}));
|
|
116
|
+
const [search, setSearch] = React.useState(_searchFromProps);
|
|
117
|
+
const [baseFolderPath] = React.useState(() => {
|
|
118
|
+
if (collectionSlug) {
|
|
119
|
+
return `/collections/${collectionSlug}/${folderCollectionSlug}`;
|
|
120
|
+
} else {
|
|
121
|
+
return config.admin.routes.browseByFolder;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
const [sortDirection, setSortDirection] = React.useState(() => {
|
|
125
|
+
if (sort) {
|
|
126
|
+
return sort.startsWith('-') ? 'desc' : 'asc';
|
|
127
|
+
}
|
|
128
|
+
return 'asc';
|
|
129
|
+
});
|
|
130
|
+
const [sortOn, setSortOn] = React.useState(() => {
|
|
131
|
+
if (sort) {
|
|
132
|
+
return sort.replace(/^-/, '');
|
|
133
|
+
}
|
|
134
|
+
return '_folderOrDocumentTitle';
|
|
135
|
+
});
|
|
90
136
|
const lastClickTime = React.useRef(null);
|
|
91
137
|
const totalCount = subfolders.length + documents.length;
|
|
138
|
+
const formatFolderURL = React.useCallback(args => {
|
|
139
|
+
const newFolderID = 'folderID' in args ? args.folderID : activeFolderID;
|
|
140
|
+
const params = {
|
|
141
|
+
relationTo: 'relationTo' in args ? args.relationTo : collectionSlug ? undefined : visibleCollectionSlugs,
|
|
142
|
+
search: 'search' in args ? args.search : search,
|
|
143
|
+
sortBy: 'sortBy' in args ? args.sortBy : sortOn,
|
|
144
|
+
sortDirection: 'sortDirection' in args ? args.sortDirection : sortDirection
|
|
145
|
+
};
|
|
146
|
+
return formatAdminURL({
|
|
147
|
+
adminRoute: config.routes.admin,
|
|
148
|
+
path: `${baseFolderPath}${newFolderID ? `/${newFolderID}` : ''}${qs.stringify(params, {
|
|
149
|
+
addQueryPrefix: true
|
|
150
|
+
})}`
|
|
151
|
+
});
|
|
152
|
+
}, [activeFolderID, baseFolderPath, collectionSlug, config.routes.admin, search, sortDirection, sortOn, visibleCollectionSlugs]);
|
|
92
153
|
const clearSelections = React.useCallback(() => {
|
|
93
154
|
setFocusedRowIndex(-1);
|
|
94
|
-
|
|
155
|
+
setSelectedIndexes(new Set());
|
|
95
156
|
setLastSelectedIndex(undefined);
|
|
96
157
|
}, []);
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
page,
|
|
106
|
-
search: 'search' in newQuery ? newQuery.search : currentQuery?.search,
|
|
107
|
-
sort: 'sort' in newQuery ? newQuery.sort : currentQuery?.sort ?? undefined
|
|
108
|
-
};
|
|
109
|
-
return mergedQuery;
|
|
110
|
-
}, [currentQuery]);
|
|
111
|
-
const refineFolderData = React.useCallback(({
|
|
112
|
-
query,
|
|
113
|
-
updateURL
|
|
158
|
+
/**
|
|
159
|
+
* Used to populate drawer data.
|
|
160
|
+
*
|
|
161
|
+
* This is used when the user navigates to a folder.
|
|
162
|
+
*/
|
|
163
|
+
const getFolderData = React.useCallback(async ({
|
|
164
|
+
folderID,
|
|
165
|
+
search: _search = undefined
|
|
114
166
|
}) => {
|
|
115
|
-
if
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const getFolderRoute = React.useCallback(toFolderID => {
|
|
124
|
-
const newQuery_1 = mergeQuery({
|
|
125
|
-
page: '1',
|
|
126
|
-
search: ''
|
|
167
|
+
// if folderID is not set, we want to search all documents
|
|
168
|
+
const searchFilter = !folderID ? ((typeof _search === 'string' ? _search : search) || '').trim() : undefined;
|
|
169
|
+
const query = qs.stringify({
|
|
170
|
+
collectionSlug,
|
|
171
|
+
folderID,
|
|
172
|
+
search: searchFilter
|
|
173
|
+
}, {
|
|
174
|
+
addQueryPrefix: true
|
|
127
175
|
});
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
serverURL: config.serverURL
|
|
176
|
+
const folderDataReq = await fetch(`${serverURL}${routes.api}/${folderCollectionSlug}/populate-folder-data${query}`, {
|
|
177
|
+
credentials: 'include',
|
|
178
|
+
headers: {
|
|
179
|
+
'content-type': 'application/json'
|
|
180
|
+
}
|
|
134
181
|
});
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
182
|
+
if (folderDataReq.status === 200) {
|
|
183
|
+
const folderDataRes = await folderDataReq.json();
|
|
184
|
+
setAllSubfolders(folderDataRes.subfolders || []);
|
|
185
|
+
setAllDocuments(folderDataRes.documents || []);
|
|
186
|
+
return folderDataRes;
|
|
187
|
+
} else {
|
|
188
|
+
return {
|
|
189
|
+
breadcrumbs: [],
|
|
190
|
+
documents: [],
|
|
191
|
+
subfolders: []
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
}, [folderCollectionSlug, search, routes.api, serverURL, collectionSlug]);
|
|
195
|
+
const setNewActiveFolderID = React.useCallback(async ({
|
|
196
|
+
folderID: toFolderID
|
|
197
|
+
}) => {
|
|
198
|
+
clearSelections();
|
|
199
|
+
if (drawerDepth === 1) {
|
|
200
|
+
// not in a drawer (default is 1)
|
|
201
|
+
startRouteTransition(() => router.push(formatFolderURL({
|
|
202
|
+
folderID: toFolderID
|
|
203
|
+
})));
|
|
204
|
+
} else {
|
|
205
|
+
const folderDataRes_0 = await getFolderData({
|
|
206
|
+
folderID: toFolderID
|
|
207
|
+
});
|
|
208
|
+
setBreadcrumbs(folderDataRes_0?.breadcrumbs || []);
|
|
209
|
+
setSubfolders(folderDataRes_0?.subfolders || []);
|
|
210
|
+
setDocuments(folderDataRes_0?.documents || []);
|
|
211
|
+
setActiveFolderID(toFolderID);
|
|
212
|
+
}
|
|
213
|
+
}, [clearSelections, drawerDepth, startRouteTransition, router, formatFolderURL, getFolderData]);
|
|
139
214
|
const getSelectedItems = React.useCallback(() => {
|
|
140
|
-
return Array.from(
|
|
141
|
-
const item =
|
|
215
|
+
return Array.from(selectedIndexes).reduce((acc, index) => {
|
|
216
|
+
const item = [...subfolders, ...documents][index];
|
|
142
217
|
if (item) {
|
|
143
218
|
acc.push(item);
|
|
144
219
|
}
|
|
145
220
|
return acc;
|
|
146
221
|
}, []);
|
|
147
|
-
}, [
|
|
148
|
-
const navigateAfterSelection = React.useCallback(({
|
|
149
|
-
collectionSlug,
|
|
222
|
+
}, [documents, selectedIndexes, subfolders]);
|
|
223
|
+
const navigateAfterSelection = React.useCallback(async ({
|
|
224
|
+
collectionSlug: collectionSlug_0,
|
|
150
225
|
docID
|
|
151
226
|
}) => {
|
|
152
|
-
if (
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
router.push(formatAdminURL({
|
|
162
|
-
adminRoute: config.routes.admin,
|
|
163
|
-
path: `/collections/${collectionSlug}/${docID}`
|
|
164
|
-
}));
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
if (typeof onItemClickFromProps === 'function') {
|
|
169
|
-
onItemClickFromProps(getItem(`${collectionSlug}-${docID}`));
|
|
227
|
+
if (collectionSlug_0 === folderCollectionSlug) {
|
|
228
|
+
await setNewActiveFolderID({
|
|
229
|
+
folderID: docID
|
|
230
|
+
});
|
|
231
|
+
} else if (collectionSlug_0) {
|
|
232
|
+
router.push(formatAdminURL({
|
|
233
|
+
adminRoute: config.routes.admin,
|
|
234
|
+
path: `/collections/${collectionSlug_0}/${docID}`
|
|
235
|
+
}));
|
|
170
236
|
}
|
|
171
|
-
}, [
|
|
172
|
-
const onItemKeyPress = React.useCallback(({
|
|
237
|
+
}, [setNewActiveFolderID, folderCollectionSlug, router, config.routes.admin]);
|
|
238
|
+
const onItemKeyPress = React.useCallback(async ({
|
|
173
239
|
event,
|
|
174
|
-
index,
|
|
240
|
+
index: index_0,
|
|
175
241
|
item: item_0
|
|
176
242
|
}) => {
|
|
177
243
|
const {
|
|
@@ -182,12 +248,12 @@ export function FolderProvider({
|
|
|
182
248
|
} = event;
|
|
183
249
|
const isShiftPressed = shiftKey;
|
|
184
250
|
const isCtrlPressed = ctrlKey || metaKey;
|
|
185
|
-
let newSelectedIndexes =
|
|
251
|
+
let newSelectedIndexes = selectedIndexes;
|
|
186
252
|
switch (code) {
|
|
187
253
|
case 'ArrowDown':
|
|
188
254
|
{
|
|
189
255
|
event.preventDefault();
|
|
190
|
-
const nextIndex_0 = Math.min(
|
|
256
|
+
const nextIndex_0 = Math.min(index_0 + 1, totalCount - 1);
|
|
191
257
|
setFocusedRowIndex(nextIndex_0);
|
|
192
258
|
if (isCtrlPressed) {
|
|
193
259
|
break;
|
|
@@ -206,7 +272,7 @@ export function FolderProvider({
|
|
|
206
272
|
case 'ArrowUp':
|
|
207
273
|
{
|
|
208
274
|
event.preventDefault();
|
|
209
|
-
const prevIndex_0 = Math.max(
|
|
275
|
+
const prevIndex_0 = Math.max(index_0 - 1, 0);
|
|
210
276
|
setFocusedRowIndex(prevIndex_0);
|
|
211
277
|
if (isCtrlPressed) {
|
|
212
278
|
break;
|
|
@@ -224,7 +290,7 @@ export function FolderProvider({
|
|
|
224
290
|
}
|
|
225
291
|
case 'Enter':
|
|
226
292
|
{
|
|
227
|
-
if (
|
|
293
|
+
if (selectedIndexes.size === 1) {
|
|
228
294
|
newSelectedIndexes = new Set([]);
|
|
229
295
|
setFocusedRowIndex(undefined);
|
|
230
296
|
}
|
|
@@ -233,6 +299,7 @@ export function FolderProvider({
|
|
|
233
299
|
case 'Escape':
|
|
234
300
|
{
|
|
235
301
|
setFocusedRowIndex(undefined);
|
|
302
|
+
setSelectedIndexes(new Set([]));
|
|
236
303
|
newSelectedIndexes = new Set([]);
|
|
237
304
|
break;
|
|
238
305
|
}
|
|
@@ -253,57 +320,49 @@ export function FolderProvider({
|
|
|
253
320
|
event.preventDefault();
|
|
254
321
|
newSelectedIndexes = getMetaSelection({
|
|
255
322
|
currentSelection: newSelectedIndexes,
|
|
256
|
-
toggleIndex:
|
|
323
|
+
toggleIndex: index_0
|
|
257
324
|
});
|
|
258
|
-
setLastSelectedIndex(
|
|
325
|
+
setLastSelectedIndex(index_0);
|
|
259
326
|
} else {
|
|
260
327
|
event.preventDefault();
|
|
261
|
-
newSelectedIndexes = new Set([
|
|
262
|
-
setLastSelectedIndex(
|
|
328
|
+
newSelectedIndexes = new Set([index_0]);
|
|
329
|
+
setLastSelectedIndex(index_0);
|
|
263
330
|
}
|
|
264
331
|
break;
|
|
265
332
|
}
|
|
266
333
|
case 'Tab':
|
|
267
334
|
{
|
|
268
335
|
if (allowMultiSelection && isShiftPressed) {
|
|
269
|
-
const prevIndex =
|
|
270
|
-
if (prevIndex < 0 && newSelectedIndexes
|
|
336
|
+
const prevIndex = index_0 - 1;
|
|
337
|
+
if (prevIndex < 0 && newSelectedIndexes.size > 0) {
|
|
271
338
|
setFocusedRowIndex(prevIndex);
|
|
272
339
|
}
|
|
273
340
|
} else {
|
|
274
|
-
const nextIndex =
|
|
275
|
-
if (nextIndex === totalCount &&
|
|
341
|
+
const nextIndex = index_0 + 1;
|
|
342
|
+
if (nextIndex === totalCount && newSelectedIndexes.size > 0) {
|
|
276
343
|
setFocusedRowIndex(totalCount - 1);
|
|
277
344
|
}
|
|
278
345
|
}
|
|
279
346
|
break;
|
|
280
347
|
}
|
|
281
348
|
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
setSelectedItemKeys([...subfolders, ...documents].reduce((acc_0, item_1, index_0) => {
|
|
286
|
-
if (newSelectedIndexes?.size && newSelectedIndexes.has(index_0)) {
|
|
287
|
-
acc_0.add(item_1.itemKey);
|
|
288
|
-
}
|
|
289
|
-
return acc_0;
|
|
290
|
-
}, new Set()));
|
|
291
|
-
if (selectedItemKeys.size === 1 && code === 'Enter') {
|
|
292
|
-
navigateAfterSelection({
|
|
349
|
+
setSelectedIndexes(newSelectedIndexes);
|
|
350
|
+
if (selectedIndexes.size === 1 && code === 'Enter') {
|
|
351
|
+
await navigateAfterSelection({
|
|
293
352
|
collectionSlug: item_0.relationTo,
|
|
294
353
|
docID: extractID(item_0.value)
|
|
295
354
|
});
|
|
296
355
|
}
|
|
297
|
-
}, [allowMultiSelection,
|
|
298
|
-
const onItemClick = React.useCallback(({
|
|
356
|
+
}, [allowMultiSelection, lastSelectedIndex, navigateAfterSelection, selectedIndexes, totalCount]);
|
|
357
|
+
const onItemClick = React.useCallback(async ({
|
|
299
358
|
event: event_0,
|
|
300
359
|
index: index_1,
|
|
301
|
-
item:
|
|
360
|
+
item: item_1
|
|
302
361
|
}) => {
|
|
303
362
|
let doubleClicked = false;
|
|
304
363
|
const isCtrlPressed_0 = event_0.ctrlKey || event_0.metaKey;
|
|
305
364
|
const isShiftPressed_0 = event_0.shiftKey;
|
|
306
|
-
let newSelectedIndexes_0 =
|
|
365
|
+
let newSelectedIndexes_0 = new Set(selectedIndexes);
|
|
307
366
|
if (allowMultiSelection && isCtrlPressed_0) {
|
|
308
367
|
newSelectedIndexes_0 = getMetaSelection({
|
|
309
368
|
currentSelection: newSelectedIndexes_0,
|
|
@@ -316,7 +375,7 @@ export function FolderProvider({
|
|
|
316
375
|
});
|
|
317
376
|
} else if (allowMultiSelection && event_0.type === 'pointermove') {
|
|
318
377
|
// on drag start of an unselected item
|
|
319
|
-
if (!
|
|
378
|
+
if (!selectedIndexes.has(index_1)) {
|
|
320
379
|
newSelectedIndexes_0 = new Set([index_1]);
|
|
321
380
|
}
|
|
322
381
|
setLastSelectedIndex(index_1);
|
|
@@ -328,42 +387,277 @@ export function FolderProvider({
|
|
|
328
387
|
lastClickTime.current = now;
|
|
329
388
|
setLastSelectedIndex(index_1);
|
|
330
389
|
}
|
|
331
|
-
if (
|
|
390
|
+
if (newSelectedIndexes_0.size === 0) {
|
|
332
391
|
setFocusedRowIndex(undefined);
|
|
333
392
|
} else {
|
|
334
393
|
setFocusedRowIndex(index_1);
|
|
335
394
|
}
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
395
|
+
setSelectedIndexes(newSelectedIndexes_0);
|
|
396
|
+
if (doubleClicked) {
|
|
397
|
+
await navigateAfterSelection({
|
|
398
|
+
collectionSlug: item_1.relationTo,
|
|
399
|
+
docID: extractID(item_1.value)
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}, [selectedIndexes, lastSelectedIndex, allowMultiSelection, navigateAfterSelection]);
|
|
403
|
+
const filterItems = React.useCallback(async ({
|
|
404
|
+
relationTo: _relationTo,
|
|
405
|
+
search: _search_0
|
|
406
|
+
}) => {
|
|
407
|
+
const relationTo = Array.isArray(_relationTo) ? _relationTo : visibleCollectionSlugs;
|
|
408
|
+
const searchFilter_0 = ((typeof _search_0 === 'string' ? _search_0 : search) || '').trim();
|
|
409
|
+
let filteredDocuments = allDocuments;
|
|
410
|
+
let filteredSubfolders = allSubfolders;
|
|
411
|
+
if (collectionSlug && !activeFolderID && _search_0 !== search) {
|
|
412
|
+
// this allows us to search all documents in the collection when we are not in a folder and in the folder-collection view
|
|
413
|
+
const res = await getFolderData({
|
|
414
|
+
folderID: activeFolderID,
|
|
415
|
+
search: searchFilter_0
|
|
416
|
+
});
|
|
417
|
+
filteredDocuments = filterOutItems({
|
|
418
|
+
items: res.documents,
|
|
419
|
+
relationTo,
|
|
420
|
+
search: searchFilter_0
|
|
421
|
+
});
|
|
422
|
+
filteredSubfolders = filterOutItems({
|
|
423
|
+
items: res.subfolders,
|
|
424
|
+
relationTo: [folderCollectionSlug],
|
|
425
|
+
search: searchFilter_0
|
|
426
|
+
});
|
|
427
|
+
} else {
|
|
428
|
+
filteredDocuments = filterOutItems({
|
|
429
|
+
items: allDocuments,
|
|
430
|
+
relationTo,
|
|
431
|
+
search: searchFilter_0
|
|
432
|
+
});
|
|
433
|
+
filteredSubfolders = filterOutItems({
|
|
434
|
+
items: allSubfolders,
|
|
435
|
+
relationTo: relationTo.includes(folderCollectionSlug) ? [folderCollectionSlug] : [],
|
|
436
|
+
search: searchFilter_0
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
setDocuments(filteredDocuments);
|
|
440
|
+
setSubfolders(filteredSubfolders);
|
|
441
|
+
setSearch(searchFilter_0);
|
|
442
|
+
setVisibleCollectionSlugs(relationTo);
|
|
443
|
+
if (drawerDepth === 1) {
|
|
444
|
+
router.replace(formatFolderURL({
|
|
445
|
+
relationTo,
|
|
446
|
+
search: searchFilter_0 || undefined
|
|
447
|
+
}));
|
|
448
|
+
}
|
|
449
|
+
}, [collectionSlug, visibleCollectionSlugs, search, activeFolderID, allDocuments, allSubfolders, folderCollectionSlug, drawerDepth, getFolderData, router, formatFolderURL]);
|
|
450
|
+
const sortItems = React.useCallback(({
|
|
451
|
+
documentsToSort,
|
|
452
|
+
sortDirection: sortDirectionArg,
|
|
453
|
+
sortOn: sortOnArg,
|
|
454
|
+
subfoldersToSort
|
|
455
|
+
}) => {
|
|
456
|
+
let sortedDocuments;
|
|
457
|
+
let sortedSubfolders;
|
|
458
|
+
const sortDirectionToUse = sortDirectionArg || sortDirection;
|
|
459
|
+
const sortOnToUse = sortOnArg || sortOn;
|
|
460
|
+
if (sortOnArg) {
|
|
461
|
+
setSortOn(sortOnArg);
|
|
462
|
+
}
|
|
463
|
+
if (sortDirectionArg) {
|
|
464
|
+
setSortDirection(sortDirectionArg);
|
|
465
|
+
}
|
|
466
|
+
const newURL = formatFolderURL({
|
|
467
|
+
sortBy: sortOnArg || sortOn,
|
|
468
|
+
sortDirection: sortDirectionArg || sortDirection
|
|
469
|
+
});
|
|
470
|
+
if (documentsToSort) {
|
|
471
|
+
sortedDocuments = [...documentsToSort].sort((a, b) => {
|
|
472
|
+
const aValue = a.value[sortOnToUse];
|
|
473
|
+
const bValue = b.value[sortOnToUse];
|
|
474
|
+
if (aValue == null && bValue == null) {
|
|
475
|
+
return 0;
|
|
476
|
+
}
|
|
477
|
+
if (aValue == null) {
|
|
478
|
+
return sortDirectionToUse === 'asc' ? 1 : -1;
|
|
479
|
+
}
|
|
480
|
+
if (bValue == null) {
|
|
481
|
+
return sortDirectionToUse === 'asc' ? -1 : 1;
|
|
340
482
|
}
|
|
341
|
-
|
|
342
|
-
|
|
483
|
+
if (typeof aValue === 'string' && typeof bValue === 'string') {
|
|
484
|
+
return sortDirectionToUse === 'asc' ? aValue.localeCompare(bValue) : bValue.localeCompare(aValue);
|
|
485
|
+
}
|
|
486
|
+
return 0;
|
|
487
|
+
});
|
|
343
488
|
}
|
|
344
|
-
if (
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
489
|
+
if (subfoldersToSort) {
|
|
490
|
+
sortedSubfolders = [...subfoldersToSort].sort((a_0, b_0) => {
|
|
491
|
+
const aValue_0 = a_0.value[sortOnToUse];
|
|
492
|
+
const bValue_0 = b_0.value[sortOnToUse];
|
|
493
|
+
if (aValue_0 == null && bValue_0 == null) {
|
|
494
|
+
return 0;
|
|
495
|
+
}
|
|
496
|
+
if (aValue_0 == null) {
|
|
497
|
+
return sortDirectionToUse === 'asc' ? 1 : -1;
|
|
498
|
+
}
|
|
499
|
+
if (bValue_0 == null) {
|
|
500
|
+
return sortDirectionToUse === 'asc' ? -1 : 1;
|
|
501
|
+
}
|
|
502
|
+
if (typeof aValue_0 === 'string' && typeof bValue_0 === 'string') {
|
|
503
|
+
return sortDirectionToUse === 'asc' ? aValue_0.localeCompare(bValue_0) : bValue_0.localeCompare(aValue_0);
|
|
504
|
+
}
|
|
505
|
+
return 0;
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
return {
|
|
509
|
+
newURL,
|
|
510
|
+
sortedDocuments,
|
|
511
|
+
sortedSubfolders
|
|
512
|
+
};
|
|
513
|
+
}, [formatFolderURL, sortDirection, sortOn]);
|
|
514
|
+
const sortAndUpdateState = React.useCallback(({
|
|
515
|
+
documentsToSort: documentsToSort_0,
|
|
516
|
+
sortDirection: sortDirectionArg_0,
|
|
517
|
+
sortOn: sortOnArg_0,
|
|
518
|
+
subfoldersToSort: subfoldersToSort_0
|
|
519
|
+
}) => {
|
|
520
|
+
const {
|
|
521
|
+
newURL: newURL_0,
|
|
522
|
+
sortedDocuments: sortedDocuments_0,
|
|
523
|
+
sortedSubfolders: sortedSubfolders_0
|
|
524
|
+
} = sortItems({
|
|
525
|
+
documentsToSort: documentsToSort_0,
|
|
526
|
+
sortDirection: sortDirectionArg_0,
|
|
527
|
+
sortOn: sortOnArg_0,
|
|
528
|
+
subfoldersToSort: subfoldersToSort_0
|
|
529
|
+
});
|
|
530
|
+
if (sortedDocuments_0) {
|
|
531
|
+
setDocuments(sortedDocuments_0);
|
|
532
|
+
}
|
|
533
|
+
if (sortedSubfolders_0) {
|
|
534
|
+
setSubfolders(sortedSubfolders_0);
|
|
535
|
+
}
|
|
536
|
+
if (drawerDepth === 1) {
|
|
537
|
+
// not in a drawer (default is 1)
|
|
538
|
+
startRouteTransition(() => {
|
|
539
|
+
router.replace(newURL_0);
|
|
348
540
|
});
|
|
349
541
|
}
|
|
350
|
-
}, [
|
|
542
|
+
}, [drawerDepth, router, sortItems, startRouteTransition]);
|
|
543
|
+
const separateItems = React.useCallback(items => {
|
|
544
|
+
return items.reduce((acc_0, item_2) => {
|
|
545
|
+
if (item_2.relationTo === folderCollectionSlug) {
|
|
546
|
+
acc_0.folders.push(item_2);
|
|
547
|
+
} else {
|
|
548
|
+
acc_0.documents.push(item_2);
|
|
549
|
+
}
|
|
550
|
+
return acc_0;
|
|
551
|
+
}, {
|
|
552
|
+
documents: [],
|
|
553
|
+
folders: []
|
|
554
|
+
});
|
|
555
|
+
}, [folderCollectionSlug]);
|
|
556
|
+
/**
|
|
557
|
+
* Used to remove items from the current state.
|
|
558
|
+
*
|
|
559
|
+
* Does NOT handle the request to the server.
|
|
560
|
+
* Useful when a document is deleted and it needs to be removed
|
|
561
|
+
* from the current state.
|
|
562
|
+
*/
|
|
563
|
+
const removeItems = React.useCallback(items_0 => {
|
|
564
|
+
if (!items_0.length) {
|
|
565
|
+
return;
|
|
566
|
+
}
|
|
567
|
+
const separatedItems = separateItems(items_0);
|
|
568
|
+
if (separatedItems.documents.length) {
|
|
569
|
+
setDocuments(prevDocs => {
|
|
570
|
+
return prevDocs.filter(({
|
|
571
|
+
itemKey
|
|
572
|
+
}) => !separatedItems.documents.some(item_3 => item_3.itemKey === itemKey));
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
if (separatedItems.folders.length) {
|
|
576
|
+
setSubfolders(prevFolders => {
|
|
577
|
+
return prevFolders.filter(({
|
|
578
|
+
itemKey: itemKey_0
|
|
579
|
+
}) => !separatedItems.folders.some(item_4 => item_4.itemKey === itemKey_0));
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
clearSelections();
|
|
583
|
+
}, [clearSelections, separateItems, setDocuments, setSubfolders]);
|
|
584
|
+
/**
|
|
585
|
+
* Used to add items to the current state.
|
|
586
|
+
*
|
|
587
|
+
* Does NOT handle the request to the server.
|
|
588
|
+
* Used when a document needs to be added to the current state.
|
|
589
|
+
*/
|
|
590
|
+
const addItems = React.useCallback(itemsToAdd => {
|
|
591
|
+
const {
|
|
592
|
+
items: items_1,
|
|
593
|
+
parentItems
|
|
594
|
+
} = itemsToAdd.reduce((acc_1, item_5) => {
|
|
595
|
+
const destinationFolderID = item_5.value.folderID || null;
|
|
596
|
+
if (item_5.value.folderID && item_5.value.folderID === activeFolderID || !activeFolderID && !item_5.value.folderID) {
|
|
597
|
+
acc_1.items.push(item_5);
|
|
598
|
+
}
|
|
599
|
+
if (parentFolderContext && (parentFolderContext.folderID && destinationFolderID === parentFolderContext.folderID || !parentFolderContext.folderID && !item_5.value.folderID)) {
|
|
600
|
+
acc_1.parentItems.push(item_5);
|
|
601
|
+
}
|
|
602
|
+
return acc_1;
|
|
603
|
+
}, {
|
|
604
|
+
items: [],
|
|
605
|
+
parentItems: []
|
|
606
|
+
});
|
|
607
|
+
if (parentItems.length) {
|
|
608
|
+
parentFolderContext.addItems(parentItems);
|
|
609
|
+
}
|
|
610
|
+
if (!items_1.length) {
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
613
|
+
const separatedItems_0 = separateItems(items_1);
|
|
614
|
+
let documentsToSort_1 = undefined;
|
|
615
|
+
let subfoldersToSort_1 = undefined;
|
|
616
|
+
if (separatedItems_0.documents.length) {
|
|
617
|
+
documentsToSort_1 = [...documents, ...separatedItems_0.documents];
|
|
618
|
+
}
|
|
619
|
+
if (separatedItems_0.folders.length) {
|
|
620
|
+
subfoldersToSort_1 = [...subfolders, ...separatedItems_0.folders];
|
|
621
|
+
}
|
|
622
|
+
const {
|
|
623
|
+
sortedDocuments: sortedDocuments_1,
|
|
624
|
+
sortedSubfolders: sortedSubfolders_1
|
|
625
|
+
} = sortItems({
|
|
626
|
+
documentsToSort: documentsToSort_1,
|
|
627
|
+
subfoldersToSort: subfoldersToSort_1
|
|
628
|
+
});
|
|
629
|
+
const {
|
|
630
|
+
sortedDocuments: sortedAllDocuments,
|
|
631
|
+
sortedSubfolders: sortedAllSubfolders
|
|
632
|
+
} = sortItems({
|
|
633
|
+
documentsToSort: documentsToSort_1,
|
|
634
|
+
subfoldersToSort: subfoldersToSort_1
|
|
635
|
+
});
|
|
636
|
+
if (sortedDocuments_1) {
|
|
637
|
+
setDocuments(sortedDocuments_1);
|
|
638
|
+
setAllDocuments(sortedAllDocuments);
|
|
639
|
+
}
|
|
640
|
+
if (sortedSubfolders_1) {
|
|
641
|
+
setSubfolders(sortedSubfolders_1);
|
|
642
|
+
setAllSubfolders(sortedAllSubfolders);
|
|
643
|
+
}
|
|
644
|
+
}, [activeFolderID, documents, separateItems, sortItems, subfolders, parentFolderContext]);
|
|
351
645
|
/**
|
|
352
|
-
*
|
|
646
|
+
* Used to move items to a different folder.
|
|
353
647
|
*
|
|
354
|
-
*
|
|
648
|
+
* Handles the request to the server and updates the state.
|
|
355
649
|
*/
|
|
356
|
-
const moveToFolder = React.useCallback(async
|
|
650
|
+
const moveToFolder = React.useCallback(async args_0 => {
|
|
357
651
|
const {
|
|
358
|
-
itemsToMove:
|
|
652
|
+
itemsToMove: items_2,
|
|
359
653
|
toFolderID: toFolderID_0
|
|
360
|
-
} =
|
|
361
|
-
if (!
|
|
654
|
+
} = args_0;
|
|
655
|
+
if (!items_2.length) {
|
|
362
656
|
return;
|
|
363
657
|
}
|
|
364
|
-
const movingCurrentFolder =
|
|
658
|
+
const movingCurrentFolder = items_2.length === 1 && items_2[0].relationTo === folderCollectionSlug && items_2[0].value.id === activeFolderID;
|
|
365
659
|
if (movingCurrentFolder) {
|
|
366
|
-
const req = await fetch(`${serverURL}${routes.api}/${folderCollectionSlug}/${
|
|
660
|
+
const req = await fetch(`${serverURL}${routes.api}/${folderCollectionSlug}/${activeFolderID}?depth=0`, {
|
|
367
661
|
body: JSON.stringify({
|
|
368
662
|
[folderFieldName]: toFolderID_0 || null
|
|
369
663
|
}),
|
|
@@ -375,11 +669,36 @@ export function FolderProvider({
|
|
|
375
669
|
});
|
|
376
670
|
if (req.status !== 200) {
|
|
377
671
|
toast.error(t('general:error'));
|
|
672
|
+
} else {
|
|
673
|
+
const updatedDoc = await req.json();
|
|
674
|
+
const folderRes = await getFolderData({
|
|
675
|
+
folderID: updatedDoc.id
|
|
676
|
+
});
|
|
677
|
+
setBreadcrumbs(folderRes?.breadcrumbs || []);
|
|
678
|
+
setSubfolders(folderRes?.subfolders || []);
|
|
679
|
+
setDocuments(folderRes?.documents || []);
|
|
680
|
+
setActiveFolderID(updatedDoc.id);
|
|
378
681
|
}
|
|
682
|
+
setBreadcrumbs(prevBreadcrumbs => {
|
|
683
|
+
return prevBreadcrumbs.map(breadcrumb => {
|
|
684
|
+
if (breadcrumb.id === activeFolderID) {
|
|
685
|
+
return {
|
|
686
|
+
...breadcrumb,
|
|
687
|
+
id: toFolderID_0
|
|
688
|
+
};
|
|
689
|
+
}
|
|
690
|
+
return breadcrumb;
|
|
691
|
+
});
|
|
692
|
+
});
|
|
379
693
|
} else {
|
|
380
|
-
|
|
694
|
+
const movingToCurrentFolder = toFolderID_0 === activeFolderID;
|
|
695
|
+
const successfullyMovedFolderItems = [];
|
|
696
|
+
const successfullyMovedDocumentItems = [];
|
|
697
|
+
for (const [collectionSlug_1, ids] of Object.entries(groupItemIDsByRelation(items_2))) {
|
|
698
|
+
const collectionConfig = getEntityConfig({
|
|
699
|
+
collectionSlug: collectionSlug_1
|
|
700
|
+
});
|
|
381
701
|
const query_0 = qs.stringify({
|
|
382
|
-
depth: 0,
|
|
383
702
|
limit: 0,
|
|
384
703
|
where: {
|
|
385
704
|
id: {
|
|
@@ -390,7 +709,7 @@ export function FolderProvider({
|
|
|
390
709
|
addQueryPrefix: true
|
|
391
710
|
});
|
|
392
711
|
try {
|
|
393
|
-
await fetch(`${serverURL}${routes.api}/${
|
|
712
|
+
const res_0 = await fetch(`${serverURL}${routes.api}/${collectionSlug_1}${query_0}`, {
|
|
394
713
|
body: JSON.stringify({
|
|
395
714
|
[folderFieldName]: toFolderID_0 || null
|
|
396
715
|
}),
|
|
@@ -400,6 +719,24 @@ export function FolderProvider({
|
|
|
400
719
|
},
|
|
401
720
|
method: 'PATCH'
|
|
402
721
|
});
|
|
722
|
+
if (res_0.status === 200) {
|
|
723
|
+
const json = await res_0.json();
|
|
724
|
+
const {
|
|
725
|
+
docs
|
|
726
|
+
} = json;
|
|
727
|
+
const formattedItems = docs.map(doc => formatFolderOrDocumentItem({
|
|
728
|
+
folderFieldName,
|
|
729
|
+
isUpload: Boolean(collectionConfig.upload),
|
|
730
|
+
relationTo: collectionSlug_1,
|
|
731
|
+
useAsTitle: collectionConfig.admin.useAsTitle,
|
|
732
|
+
value: doc
|
|
733
|
+
}));
|
|
734
|
+
if (collectionSlug_1 === folderCollectionSlug) {
|
|
735
|
+
successfullyMovedFolderItems.push(...formattedItems);
|
|
736
|
+
} else {
|
|
737
|
+
successfullyMovedDocumentItems.push(...formattedItems);
|
|
738
|
+
}
|
|
739
|
+
}
|
|
403
740
|
} catch (error) {
|
|
404
741
|
toast.error(t('general:error'));
|
|
405
742
|
// eslint-disable-next-line no-console
|
|
@@ -407,20 +744,88 @@ export function FolderProvider({
|
|
|
407
744
|
continue;
|
|
408
745
|
}
|
|
409
746
|
}
|
|
747
|
+
if (movingToCurrentFolder) {
|
|
748
|
+
// need to sort if we are moving (adding) items to the current folder
|
|
749
|
+
const {
|
|
750
|
+
newURL: newURL_1,
|
|
751
|
+
sortedDocuments: sortedDocuments_2,
|
|
752
|
+
sortedSubfolders: sortedSubfolders_2
|
|
753
|
+
} = sortItems({
|
|
754
|
+
documentsToSort: successfullyMovedDocumentItems.length ? [...documents, ...successfullyMovedDocumentItems] : undefined,
|
|
755
|
+
subfoldersToSort: successfullyMovedFolderItems.length ? [...subfolders, ...successfullyMovedFolderItems] : undefined
|
|
756
|
+
});
|
|
757
|
+
if (sortedDocuments_2) {
|
|
758
|
+
setDocuments(sortedDocuments_2);
|
|
759
|
+
}
|
|
760
|
+
if (sortedSubfolders_2) {
|
|
761
|
+
setSubfolders(sortedSubfolders_2);
|
|
762
|
+
}
|
|
763
|
+
if (drawerDepth === 1 && newURL_1) {
|
|
764
|
+
// not in a drawer (default is 1)
|
|
765
|
+
router.replace(newURL_1);
|
|
766
|
+
}
|
|
767
|
+
} else {
|
|
768
|
+
// no need to sort, just remove the items from the current state
|
|
769
|
+
const filteredDocuments_0 = successfullyMovedDocumentItems.length ? documents.filter(({
|
|
770
|
+
itemKey: itemKey_1
|
|
771
|
+
}) => !successfullyMovedDocumentItems.some(item_6 => item_6.itemKey === itemKey_1)) : undefined;
|
|
772
|
+
const filteredSubfolders_0 = successfullyMovedFolderItems.length ? subfolders.filter(({
|
|
773
|
+
itemKey: itemKey_2
|
|
774
|
+
}) => !successfullyMovedFolderItems.some(item_7 => item_7.itemKey === itemKey_2)) : undefined;
|
|
775
|
+
if (filteredDocuments_0) {
|
|
776
|
+
setDocuments(filteredDocuments_0);
|
|
777
|
+
}
|
|
778
|
+
if (filteredSubfolders_0) {
|
|
779
|
+
setSubfolders(filteredSubfolders_0);
|
|
780
|
+
}
|
|
781
|
+
}
|
|
410
782
|
}
|
|
411
783
|
clearSelections();
|
|
412
|
-
}, [
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
784
|
+
}, [folderCollectionSlug, activeFolderID, clearSelections, serverURL, routes.api, folderFieldName, t, getFolderData, getEntityConfig, sortItems, documents, subfolders, drawerDepth, router]);
|
|
785
|
+
/**
|
|
786
|
+
* Used to rename a folder in the current state.
|
|
787
|
+
*
|
|
788
|
+
* Does NOT handle the request to the server.
|
|
789
|
+
* Used when the user renames a folder using the drawer
|
|
790
|
+
* and it needs to be updated in the current state.
|
|
791
|
+
*/
|
|
792
|
+
const renameFolder = React.useCallback(({
|
|
793
|
+
folderID: updatedFolderID,
|
|
794
|
+
newName
|
|
795
|
+
}) => {
|
|
796
|
+
if (activeFolderID === updatedFolderID) {
|
|
797
|
+
// updating the curent folder
|
|
798
|
+
setBreadcrumbs(prevBreadcrumbs_0 => {
|
|
799
|
+
return prevBreadcrumbs_0.map(breadcrumb_0 => {
|
|
800
|
+
if (breadcrumb_0.id === updatedFolderID) {
|
|
801
|
+
return {
|
|
802
|
+
...breadcrumb_0,
|
|
803
|
+
name: newName
|
|
804
|
+
};
|
|
805
|
+
}
|
|
806
|
+
return breadcrumb_0;
|
|
807
|
+
});
|
|
808
|
+
});
|
|
809
|
+
} else {
|
|
810
|
+
setSubfolders(prevFolders_0 => {
|
|
811
|
+
return prevFolders_0.map(folder => {
|
|
812
|
+
if (folder.value.id === updatedFolderID && folder.relationTo === folderCollectionSlug) {
|
|
813
|
+
return {
|
|
814
|
+
...folder,
|
|
815
|
+
value: {
|
|
816
|
+
...folder.value,
|
|
817
|
+
_folderOrDocumentTitle: newName
|
|
818
|
+
}
|
|
819
|
+
};
|
|
820
|
+
}
|
|
821
|
+
return folder;
|
|
822
|
+
});
|
|
823
|
+
});
|
|
417
824
|
}
|
|
418
|
-
}, [
|
|
825
|
+
}, [folderCollectionSlug, setSubfolders, activeFolderID]);
|
|
419
826
|
return /*#__PURE__*/_jsx(Context, {
|
|
420
827
|
value: {
|
|
421
|
-
|
|
422
|
-
allCollectionFolderSlugs,
|
|
423
|
-
allowCreateCollectionSlugs,
|
|
828
|
+
addItems,
|
|
424
829
|
breadcrumbs,
|
|
425
830
|
clearSelections,
|
|
426
831
|
currentFolder: breadcrumbs?.[0]?.id ? formatFolderOrDocumentItem({
|
|
@@ -431,28 +836,32 @@ export function FolderProvider({
|
|
|
431
836
|
value: breadcrumbs[breadcrumbs.length - 1]
|
|
432
837
|
}) : null,
|
|
433
838
|
documents,
|
|
839
|
+
filterItems,
|
|
434
840
|
focusedRowIndex,
|
|
435
841
|
folderCollectionConfig,
|
|
436
842
|
folderCollectionSlug,
|
|
843
|
+
folderCollectionSlugs,
|
|
437
844
|
folderFieldName,
|
|
438
|
-
folderID,
|
|
439
|
-
FolderResultsComponent,
|
|
440
|
-
getFolderRoute,
|
|
845
|
+
folderID: activeFolderID,
|
|
441
846
|
getSelectedItems,
|
|
442
847
|
isDragging,
|
|
443
|
-
itemKeysToMove: parentFolderContext.selectedItemKeys,
|
|
444
848
|
lastSelectedIndex,
|
|
445
849
|
moveToFolder,
|
|
446
850
|
onItemClick,
|
|
447
851
|
onItemKeyPress,
|
|
448
|
-
|
|
852
|
+
removeItems,
|
|
853
|
+
renameFolder,
|
|
449
854
|
search,
|
|
450
|
-
|
|
855
|
+
selectedIndexes,
|
|
451
856
|
setBreadcrumbs,
|
|
452
857
|
setFocusedRowIndex,
|
|
858
|
+
setFolderID: setNewActiveFolderID,
|
|
453
859
|
setIsDragging,
|
|
454
|
-
|
|
455
|
-
|
|
860
|
+
sortAndUpdateState,
|
|
861
|
+
sortDirection,
|
|
862
|
+
sortOn,
|
|
863
|
+
subfolders,
|
|
864
|
+
visibleCollectionSlugs
|
|
456
865
|
},
|
|
457
866
|
children: children
|
|
458
867
|
});
|