Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 27 additions & 7 deletions packages/ui/src/elements/BulkUpload/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,10 @@ export function BulkUploadModal() {
const {
modalSlug,
onCancel,
setCurrentActivePath,
setInitialFiles,
setInitialForms,
setOnCancel,
setOnSuccess,
setParentID,
setSelectableCollections,
setSuccessfullyUploaded,
Expand Down Expand Up @@ -116,7 +116,7 @@ export function BulkUploadModal() {
setInitialFiles(undefined)
setInitialForms(undefined)
setOnCancel(() => () => null)
setOnSuccess(() => () => null)
setCurrentActivePath(undefined)
setSelectableCollections(null)
setSuccessfullyUploaded(false)
}
Expand Down Expand Up @@ -147,6 +147,14 @@ export function BulkUploadModal() {

export type BulkUploadContext = {
collectionSlug: CollectionSlug
/**
* The field path (or collection slug, for the list view's bulk upload) that currently owns the
* open bulk upload modal. Used to look up the correct entry in the onSuccess map below, so that
* when multiple hasMany upload fields are mounted on the same page (e.g. a top-level gallery
* plus per-row galleries inside an array field), an upload always resolves against the field
* whose "Create New" button was actually clicked — not whichever field's effect last ran.
*/
currentActivePath: string
initialFiles: FileList
/**
* Like initialFiles, but allows manually providing initial form state or the form ID for each file
Expand All @@ -173,13 +181,14 @@ export type BulkUploadContext = {
*/
selectableCollections?: null | string[]
setCollectionSlug: (slug: string) => void
setCurrentActivePath: (path: string) => void
setInitialFiles: (files: FileList) => void
setInitialForms: (
forms: ((forms: InitialForms | undefined) => InitialForms | undefined) | InitialForms,
) => void
setMaxFiles: (maxFiles: number) => void
setOnCancel: (onCancel: BulkUploadContext['onCancel']) => void
setOnSuccess: (onSuccess: BulkUploadContext['onSuccess']) => void
setOnSuccess: (path: string, onSuccess: BulkUploadContext['onSuccess']) => void
setParentID: (parentID: number | string | undefined) => void
/**
* Set the collections that can be selected in the collection dropdown (if applicable)
Expand All @@ -193,6 +202,7 @@ export type BulkUploadContext = {

const Context = React.createContext<BulkUploadContext>({
collectionSlug: '',
currentActivePath: undefined,
initialFiles: undefined,
initialForms: [],
maxFiles: undefined,
Expand All @@ -202,6 +212,7 @@ const Context = React.createContext<BulkUploadContext>({
parentID: undefined,
selectableCollections: null,
setCollectionSlug: () => null,
setCurrentActivePath: () => null,
setInitialFiles: () => null,
setInitialForms: () => null,
setMaxFiles: () => null,
Expand All @@ -222,7 +233,9 @@ export function BulkUploadProvider({
const [selectableCollections, setSelectableCollections] = React.useState<null | string[]>(null)
const [collection, setCollection] = React.useState<string>()
const [parentID, setParentID] = React.useState<number | string | undefined>(undefined)
const [onSuccessFunction, setOnSuccessFunction] = React.useState<BulkUploadContext['onSuccess']>()
const [currentActivePath, setCurrentActivePath] = React.useState<string>(undefined)
const [onSuccessFunctionMap, setOnSuccessFunctionMap] =
React.useState<Record<string, BulkUploadContext['onSuccess']>>()
const [onCancelFunction, setOnCancelFunction] = React.useState<BulkUploadContext['onCancel']>()
const [initialFiles, setInitialFiles] = React.useState<FileList>(undefined)
const [initialForms, setInitialForms] = React.useState<InitialForms>(undefined)
Expand All @@ -231,9 +244,12 @@ export function BulkUploadProvider({

const modalSlug = `${modalSlugPrefix ? `${modalSlugPrefix}-` : ''}${useBulkUploadModalSlug()}`

const setOnSuccess: BulkUploadContext['setOnSuccess'] = (onSuccess) => {
setOnSuccessFunction(() => onSuccess)
}
const setOnSuccess: BulkUploadContext['setOnSuccess'] = React.useCallback((path, onSuccess) => {
setOnSuccessFunctionMap((prev) => ({
...prev,
[path]: onSuccess,
}))
}, [])
const setOnCancel: BulkUploadContext['setOnCancel'] = (onCancel) => {
setOnCancelFunction(() => onCancel)
}
Expand All @@ -242,6 +258,7 @@ export function BulkUploadProvider({
<Context
value={{
collectionSlug: collection,
currentActivePath,
initialFiles,
initialForms,
maxFiles,
Expand All @@ -252,13 +269,16 @@ export function BulkUploadProvider({
}
},
onSuccess: (newDocs, errorCount) => {
const onSuccessFunction =
currentActivePath !== undefined ? onSuccessFunctionMap?.[currentActivePath] : undefined
if (typeof onSuccessFunction === 'function') {
onSuccessFunction(newDocs, errorCount)
}
},
parentID,
selectableCollections,
setCollectionSlug: setCollection,
setCurrentActivePath,
setInitialFiles,
setInitialForms,
setMaxFiles,
Expand Down
6 changes: 5 additions & 1 deletion packages/ui/src/fields/Upload/Input.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ export function UploadInput(props: UploadInputProps) {
const {
modalSlug: drawerSlug,
setCollectionSlug,
setCurrentActivePath,
setInitialFiles,
setMaxFiles,
setOnSuccess,
Expand Down Expand Up @@ -394,6 +395,7 @@ export function UploadInput(props: UploadInputProps) {
setMaxFiles(maxRows)
}

setCurrentActivePath(path)
openModal(drawerSlug)
},
[
Expand All @@ -408,6 +410,8 @@ export function UploadInput(props: UploadInputProps) {
setInitialFiles,
setSelectableCollections,
setMaxFiles,
path,
setCurrentActivePath,
],
)

Expand Down Expand Up @@ -637,7 +641,7 @@ export function UploadInput(props: UploadInputProps) {
}, [populateDocs, value, relationTo])

useEffect(() => {
setOnSuccess(onUploadSuccess)
setOnSuccess(path, onUploadSuccess)
}, [value, path, onUploadSuccess, setOnSuccess])

const showDropzone =
Expand Down
20 changes: 17 additions & 3 deletions packages/ui/src/views/List/index.client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,12 @@ export function DefaultListView(props: ListViewClientProps) {
}, [query?.where])

const { openModal } = useModal()
const { modalSlug: bulkUploadModalSlug, setCollectionSlug, setOnSuccess } = useBulkUpload()
const {
modalSlug: bulkUploadModalSlug,
setCollectionSlug,
setCurrentActivePath,
setOnSuccess,
} = useBulkUpload()

const collectionConfig = getEntityConfig({ collectionSlug })

Expand Down Expand Up @@ -135,9 +140,18 @@ export function DefaultListView(props: ListViewClientProps) {

const openBulkUpload = React.useCallback(() => {
setCollectionSlug(collectionSlug)
setCurrentActivePath(collectionSlug)
openModal(bulkUploadModalSlug)
setOnSuccess(() => router.refresh())
}, [router, collectionSlug, bulkUploadModalSlug, openModal, setCollectionSlug, setOnSuccess])
setOnSuccess(collectionSlug, () => router.refresh())
}, [
router,
collectionSlug,
bulkUploadModalSlug,
openModal,
setCollectionSlug,
setCurrentActivePath,
setOnSuccess,
])

useEffect(() => {
if (!isInDrawer) {
Expand Down
Loading