Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
185 lines
5.7 KiB
Plaintext
185 lines
5.7 KiB
Plaintext
'use client';
|
|
|
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
import { useModal } from '@faceless-ui/modal';
|
|
import { hoistQueryParamsToAnd } from 'payload/shared';
|
|
import React, { useCallback, useEffect, useState } from 'react';
|
|
import { useDocumentDrawer } from '../../elements/DocumentDrawer/index.js';
|
|
import { useEffectEvent } from '../../hooks/useEffectEvent.js';
|
|
import { useConfig } from '../../providers/Config/index.js';
|
|
import { useServerFunctions } from '../../providers/ServerFunctions/index.js';
|
|
import { ListDrawerContextProvider } from '../ListDrawer/Provider.js';
|
|
import { LoadingOverlay } from '../Loading/index.js';
|
|
export const ListDrawerContent = ({
|
|
allowCreate = true,
|
|
collectionSlugs,
|
|
disableQueryPresets,
|
|
drawerSlug,
|
|
enableRowSelections,
|
|
filterOptions,
|
|
onBulkSelect,
|
|
onSelect,
|
|
overrideEntityVisibility = true,
|
|
selectedCollection: collectionSlugFromProps
|
|
}) => {
|
|
const {
|
|
closeModal,
|
|
isModalOpen
|
|
} = useModal();
|
|
const {
|
|
serverFunction
|
|
} = useServerFunctions();
|
|
const [ListView, setListView] = useState(undefined);
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
const {
|
|
config: {
|
|
collections
|
|
},
|
|
getEntityConfig
|
|
} = useConfig();
|
|
const isOpen = isModalOpen(drawerSlug);
|
|
const enabledCollections = collections.filter(({
|
|
slug
|
|
}) => {
|
|
return collectionSlugs.includes(slug);
|
|
});
|
|
const [selectedOption, setSelectedOption] = useState(() => {
|
|
const initialSelection = collectionSlugFromProps || enabledCollections[0]?.slug;
|
|
const found = getEntityConfig({
|
|
collectionSlug: initialSelection
|
|
});
|
|
return found ? {
|
|
label: found.labels,
|
|
value: found.slug
|
|
} : undefined;
|
|
});
|
|
const [DocumentDrawer, DocumentDrawerToggler, {
|
|
drawerSlug: documentDrawerSlug
|
|
}] = useDocumentDrawer({
|
|
collectionSlug: selectedOption.value
|
|
});
|
|
const updateSelectedOption = useEffectEvent(collectionSlug => {
|
|
if (collectionSlug && collectionSlug !== selectedOption?.value) {
|
|
setSelectedOption({
|
|
label: getEntityConfig({
|
|
collectionSlug
|
|
})?.labels,
|
|
value: collectionSlug
|
|
});
|
|
}
|
|
});
|
|
useEffect(() => {
|
|
updateSelectedOption(collectionSlugFromProps);
|
|
}, [collectionSlugFromProps]);
|
|
/**
|
|
* This performs a full server round trip to get the list view for the selected collection.
|
|
* On the server, the data is freshly queried for the list view and all components are fully rendered.
|
|
* This work includes building column state, rendering custom components, etc.
|
|
*/
|
|
const refresh = useCallback(async ({
|
|
slug: slug_0,
|
|
query
|
|
}) => {
|
|
try {
|
|
const newQuery = {
|
|
...(query || {}),
|
|
where: {
|
|
...(query?.where || {})
|
|
}
|
|
};
|
|
const filterOption = filterOptions?.[slug_0];
|
|
if (filterOptions && typeof filterOption !== 'boolean') {
|
|
newQuery.where = hoistQueryParamsToAnd(newQuery.where, filterOption);
|
|
}
|
|
if (slug_0) {
|
|
const result = await serverFunction({
|
|
name: 'render-list',
|
|
args: {
|
|
collectionSlug: slug_0,
|
|
disableBulkDelete: true,
|
|
disableBulkEdit: true,
|
|
disableQueryPresets,
|
|
drawerSlug,
|
|
enableRowSelections,
|
|
overrideEntityVisibility,
|
|
query: newQuery
|
|
}
|
|
});
|
|
setListView(result?.List || null);
|
|
} else {
|
|
setListView(null);
|
|
}
|
|
setIsLoading(false);
|
|
} catch (_err) {
|
|
console.error('Error rendering List View: ', _err); // eslint-disable-line no-console
|
|
if (isOpen) {
|
|
closeModal(drawerSlug);
|
|
}
|
|
}
|
|
}, [serverFunction, closeModal, drawerSlug, isOpen, enableRowSelections, filterOptions, overrideEntityVisibility, disableQueryPresets]);
|
|
useEffect(() => {
|
|
if (!ListView) {
|
|
void refresh({
|
|
slug: selectedOption?.value
|
|
});
|
|
}
|
|
}, [refresh, ListView, selectedOption.value]);
|
|
const onCreateNew = useCallback(({
|
|
doc
|
|
}) => {
|
|
if (typeof onSelect === 'function') {
|
|
onSelect({
|
|
collectionSlug: selectedOption?.value,
|
|
doc,
|
|
docID: doc.id
|
|
});
|
|
}
|
|
closeModal(documentDrawerSlug);
|
|
closeModal(drawerSlug);
|
|
}, [closeModal, documentDrawerSlug, drawerSlug, onSelect, selectedOption.value]);
|
|
const onQueryChange = useCallback(query_0 => {
|
|
void refresh({
|
|
slug: selectedOption?.value,
|
|
query: query_0
|
|
});
|
|
}, [refresh, selectedOption.value]);
|
|
const setMySelectedOption = useCallback(incomingSelection => {
|
|
setSelectedOption(incomingSelection);
|
|
void refresh({
|
|
slug: incomingSelection?.value
|
|
});
|
|
}, [refresh]);
|
|
const refreshSelf = useCallback(async incomingCollectionSlug => {
|
|
if (incomingCollectionSlug) {
|
|
setSelectedOption({
|
|
label: getEntityConfig({
|
|
collectionSlug: incomingCollectionSlug
|
|
})?.labels,
|
|
value: incomingCollectionSlug
|
|
});
|
|
}
|
|
await refresh({
|
|
slug: selectedOption.value || incomingCollectionSlug
|
|
});
|
|
}, [getEntityConfig, refresh, selectedOption.value]);
|
|
if (isLoading) {
|
|
return /*#__PURE__*/_jsx(LoadingOverlay, {});
|
|
}
|
|
return /*#__PURE__*/_jsxs(ListDrawerContextProvider, {
|
|
allowCreate: allowCreate,
|
|
createNewDrawerSlug: documentDrawerSlug,
|
|
DocumentDrawerToggler: DocumentDrawerToggler,
|
|
drawerSlug: drawerSlug,
|
|
enabledCollections: collectionSlugs,
|
|
onBulkSelect: onBulkSelect,
|
|
onQueryChange: onQueryChange,
|
|
onSelect: onSelect,
|
|
refresh: refreshSelf,
|
|
selectedOption: selectedOption,
|
|
setSelectedOption: setMySelectedOption,
|
|
children: [ListView, /*#__PURE__*/_jsx(DocumentDrawer, {
|
|
onSave: onCreateNew
|
|
})]
|
|
});
|
|
};
|
|
//# sourceMappingURL=DrawerContent.js.map |