@payloadcms/next 3.80.0-internal.52ab774 → 3.80.0-internal.82dcece
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/cjs/withPayload.cjs +3 -0
- package/dist/cjs/withPayload.cjs.map +3 -3
- package/dist/elements/Nav/getNavPrefs.d.ts.map +1 -1
- package/dist/elements/Nav/getNavPrefs.js +2 -36
- package/dist/elements/Nav/getNavPrefs.js.map +1 -1
- package/dist/elements/Nav/index.client.d.ts.map +1 -1
- package/dist/elements/Nav/index.client.js +44 -27
- package/dist/elements/Nav/index.client.js.map +1 -1
- package/dist/elements/Nav/index.d.ts.map +1 -1
- package/dist/elements/Nav/index.js +7 -35
- package/dist/elements/Nav/index.js.map +1 -1
- package/dist/exports/client.d.ts +1 -2
- package/dist/exports/client.d.ts.map +1 -1
- package/dist/exports/client.js +1 -2
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/rsc.d.ts +1 -2
- package/dist/exports/rsc.d.ts.map +1 -1
- package/dist/exports/rsc.js +1 -2
- package/dist/exports/rsc.js.map +1 -1
- package/dist/exports/utilities.d.ts +0 -2
- package/dist/exports/utilities.d.ts.map +1 -1
- package/dist/exports/utilities.js +0 -1
- package/dist/exports/utilities.js.map +1 -1
- package/dist/layouts/Root/index.d.ts +4 -2
- package/dist/layouts/Root/index.d.ts.map +1 -1
- package/dist/layouts/Root/index.js +25 -3
- package/dist/layouts/Root/index.js.map +1 -1
- package/dist/prod/styles.css +1 -1
- package/dist/utilities/handleServerFunctions.js +2 -2
- package/dist/utilities/handleServerFunctions.js.map +1 -1
- package/dist/views/BrowseByFolder/buildView.d.ts +13 -0
- package/dist/views/BrowseByFolder/buildView.d.ts.map +1 -0
- package/dist/views/BrowseByFolder/buildView.js +170 -0
- package/dist/views/BrowseByFolder/buildView.js.map +1 -0
- package/dist/views/BrowseByFolder/index.d.ts +4 -0
- package/dist/views/BrowseByFolder/index.d.ts.map +1 -0
- package/dist/views/BrowseByFolder/index.js +20 -0
- package/dist/views/BrowseByFolder/index.js.map +1 -0
- package/dist/views/BrowseByFolder/metadata.d.ts +4 -0
- package/dist/views/BrowseByFolder/metadata.d.ts.map +1 -0
- package/dist/views/BrowseByFolder/metadata.js +18 -0
- package/dist/views/BrowseByFolder/metadata.js.map +1 -0
- package/dist/views/CollectionFolders/buildView.d.ts +15 -0
- package/dist/views/CollectionFolders/buildView.d.ts.map +1 -0
- package/dist/views/CollectionFolders/buildView.js +156 -0
- package/dist/views/CollectionFolders/buildView.js.map +1 -0
- package/dist/views/CollectionFolders/index.d.ts +4 -0
- package/dist/views/CollectionFolders/index.d.ts.map +1 -0
- package/dist/views/CollectionFolders/index.js +20 -0
- package/dist/views/CollectionFolders/index.js.map +1 -0
- package/dist/views/CollectionFolders/metadata.d.ts +7 -0
- package/dist/views/CollectionFolders/metadata.d.ts.map +1 -0
- package/dist/views/CollectionFolders/metadata.js +25 -0
- package/dist/views/CollectionFolders/metadata.js.map +1 -0
- package/dist/views/CollectionFolders/renderFolderViewSlots.d.ts +11 -0
- package/dist/views/CollectionFolders/renderFolderViewSlots.d.ts.map +1 -0
- package/dist/views/CollectionFolders/renderFolderViewSlots.js +64 -0
- package/dist/views/CollectionFolders/renderFolderViewSlots.js.map +1 -0
- package/dist/views/Document/renderDocumentSlots.d.ts.map +1 -1
- package/dist/views/Document/renderDocumentSlots.js +0 -8
- package/dist/views/Document/renderDocumentSlots.js.map +1 -1
- package/dist/views/List/index.d.ts.map +1 -1
- package/dist/views/List/index.js +28 -84
- package/dist/views/List/index.js.map +1 -1
- package/dist/views/Root/getRouteData.d.ts +4 -1
- package/dist/views/Root/getRouteData.d.ts.map +1 -1
- package/dist/views/Root/getRouteData.js +91 -27
- package/dist/views/Root/getRouteData.js.map +1 -1
- package/dist/views/Root/index.d.ts.map +1 -1
- package/dist/views/Root/index.js +11 -5
- package/dist/views/Root/index.js.map +1 -1
- package/dist/views/Root/metadata.d.ts.map +1 -1
- package/dist/views/Root/metadata.js +37 -1
- package/dist/views/Root/metadata.js.map +1 -1
- package/dist/withPayload/withPayload.d.ts.map +1 -1
- package/dist/withPayload/withPayload.js +3 -0
- package/dist/withPayload/withPayload.js.map +1 -1
- package/package.json +7 -7
- package/dist/elements/HierarchyTypeField/index.d.ts +0 -9
- package/dist/elements/HierarchyTypeField/index.d.ts.map +0 -1
- package/dist/elements/HierarchyTypeField/index.js +0 -114
- package/dist/elements/HierarchyTypeField/index.js.map +0 -1
- package/dist/elements/HierarchyTypeField/index.server.d.ts +0 -9
- package/dist/elements/HierarchyTypeField/index.server.d.ts.map +0 -1
- package/dist/elements/HierarchyTypeField/index.server.js +0 -32
- package/dist/elements/HierarchyTypeField/index.server.js.map +0 -1
- package/dist/elements/Nav/SidebarTabs/TabError/index.d.ts +0 -8
- package/dist/elements/Nav/SidebarTabs/TabError/index.d.ts.map +0 -1
- package/dist/elements/Nav/SidebarTabs/TabError/index.js +0 -42
- package/dist/elements/Nav/SidebarTabs/TabError/index.js.map +0 -1
- package/dist/elements/Nav/SidebarTabs/constants.d.ts +0 -2
- package/dist/elements/Nav/SidebarTabs/constants.d.ts.map +0 -1
- package/dist/elements/Nav/SidebarTabs/constants.js +0 -2
- package/dist/elements/Nav/SidebarTabs/constants.js.map +0 -1
- package/dist/elements/Nav/SidebarTabs/index.client.d.ts +0 -22
- package/dist/elements/Nav/SidebarTabs/index.client.d.ts.map +0 -1
- package/dist/elements/Nav/SidebarTabs/index.client.js +0 -194
- package/dist/elements/Nav/SidebarTabs/index.client.js.map +0 -1
- package/dist/elements/Nav/SidebarTabs/index.d.ts +0 -17
- package/dist/elements/Nav/SidebarTabs/index.d.ts.map +0 -1
- package/dist/elements/Nav/SidebarTabs/index.js +0 -85
- package/dist/elements/Nav/SidebarTabs/index.js.map +0 -1
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts +0 -10
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.d.ts.map +0 -1
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js +0 -54
- package/dist/elements/Nav/SidebarTabs/renderTabServerFn.js.map +0 -1
- package/dist/utilities/getHierarchyAncestry.d.ts +0 -24
- package/dist/utilities/getHierarchyAncestry.d.ts.map +0 -1
- package/dist/utilities/getHierarchyAncestry.js +0 -103
- package/dist/utilities/getHierarchyAncestry.js.map +0 -1
- package/dist/views/List/handleHierarchy.d.ts +0 -18
- package/dist/views/List/handleHierarchy.d.ts.map +0 -1
- package/dist/views/List/handleHierarchy.js +0 -258
- package/dist/views/List/handleHierarchy.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.client.js","names":["DelayedSpinner","SidebarTabsProvider","Tooltip","usePreferences","useServerFunctions","PREFERENCE_KEYS","React","useCallback","useRef","useState","TabError","SidebarTabsClient","baseClass","initialActiveTabID","initialTabContents","loadingDelay","tabs","setPreference","serverFunction","activeTabID","setActiveTabID","tabContent","setTabContent","loadingTab","setLoadingTab","hoveredTab","setHoveredTab","loadingTabsRef","Set","tabContentRef","useEffect","current","prev","loadTabContent","tabSlug","revalidate","hasCachedContent","Boolean","has","add","result","name","args","newContent","component","error","errorMessage","Error","message","handleRetry","clearedContent","_jsx","onRetry","delete","reloadTabContent","handleTabChange","slug","NAV_SIDEBAR_ACTIVE_TAB","activeTab","tab","find","t","lazyLoadable","handleTabKeyDown","e","currentIndex","key","preventDefault","direction","newIndex","length","newTab","setTimeout","document","querySelector","focus","activeContent","_Fragment","_jsxs","className","role","map","index","isActive","onClick","onKeyDown","onMouseEnter","onMouseLeave","tabIndex","type","position","show","label","icon","delay","isLoading","content","style","undefined","display"],"sources":["../../../../src/elements/Nav/SidebarTabs/index.client.tsx"],"sourcesContent":["'use client'\n\nimport {\n DelayedSpinner,\n SidebarTabsProvider,\n Tooltip,\n usePreferences,\n useServerFunctions,\n} from '@payloadcms/ui'\nimport { PREFERENCE_KEYS } from 'payload/shared'\nimport React, { useCallback, useRef, useState } from 'react'\n\nimport type { RenderTabServerFnArgs, RenderTabServerFnReturnType } from './renderTabServerFn.js'\n\nimport { TabError } from './TabError/index.js'\n\nexport type TabMetadata = {\n icon: React.ReactNode\n isDefaultActive?: boolean\n label: string\n /** Whether this tab can be loaded/revalidated via serverFunction */\n lazyLoadable?: boolean\n slug: string\n}\n\nexport type SidebarTabsClientProps = {\n baseClass: string\n initialActiveTabID: string\n initialTabContents: Record<string, React.ReactNode>\n /**\n * Delay before showing loading spinner (in ms), prevents flashing on fast loads\n * @default 200\n */\n loadingDelay?: number\n tabs: TabMetadata[]\n}\n\nexport const SidebarTabsClient: React.FC<SidebarTabsClientProps> = ({\n baseClass,\n initialActiveTabID,\n initialTabContents,\n loadingDelay = 200,\n tabs,\n}) => {\n const { setPreference } = usePreferences()\n const { serverFunction } = useServerFunctions()\n\n const [activeTabID, setActiveTabID] = useState(initialActiveTabID)\n const [tabContent, setTabContent] = useState<Record<string, React.ReactNode>>(initialTabContents)\n const [loadingTab, setLoadingTab] = useState<null | string>(null)\n const [hoveredTab, setHoveredTab] = useState<null | string>(null)\n const loadingTabsRef = useRef<Set<string>>(new Set())\n const tabContentRef = useRef(initialTabContents)\n\n // Update cached content when server provides new initialTabContents\n // This is needed because useState only uses initialValue on first mount\n React.useEffect(() => {\n tabContentRef.current = { ...tabContentRef.current, ...initialTabContents }\n setTabContent((prev) => ({ ...prev, ...initialTabContents }))\n }, [initialTabContents])\n\n const loadTabContent = useCallback(\n async (tabSlug: string, { revalidate = false }: { revalidate?: boolean } = {}) => {\n const hasCachedContent = Boolean(tabContentRef.current[tabSlug])\n\n // Skip if already loaded (unless revalidating) or currently loading\n if ((hasCachedContent && !revalidate) || loadingTabsRef.current.has(tabSlug)) {\n return\n }\n\n // Mark as loading - only show spinner if no cached content\n loadingTabsRef.current.add(tabSlug)\n if (!hasCachedContent) {\n setLoadingTab(tabSlug)\n }\n\n try {\n const result = (await serverFunction({\n name: 'render-tab',\n args: { tabSlug } as RenderTabServerFnArgs,\n })) as RenderTabServerFnReturnType\n\n const newContent = {\n ...tabContentRef.current,\n [tabSlug]: result.component,\n }\n\n tabContentRef.current = newContent\n setTabContent(newContent)\n } catch (error) {\n // On revalidate failure, keep showing cached content\n if (hasCachedContent && revalidate) {\n return\n }\n\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n\n const handleRetry = () => {\n // Clear the error and retry loading\n const clearedContent = { ...tabContentRef.current }\n delete clearedContent[tabSlug]\n tabContentRef.current = clearedContent\n setTabContent(clearedContent)\n void loadTabContent(tabSlug)\n }\n\n const newContent = {\n ...tabContentRef.current,\n [tabSlug]: <TabError message={errorMessage} onRetry={handleRetry} />,\n }\n\n tabContentRef.current = newContent\n setTabContent(newContent)\n } finally {\n loadingTabsRef.current.delete(tabSlug)\n setLoadingTab(null)\n }\n },\n [serverFunction],\n )\n\n const reloadTabContent = useCallback(\n (tabSlug: string) => {\n // Clear cached content to force reload\n const clearedContent = { ...tabContentRef.current }\n delete clearedContent[tabSlug]\n tabContentRef.current = clearedContent\n setTabContent(clearedContent)\n\n void loadTabContent(tabSlug)\n },\n [loadTabContent],\n )\n\n const handleTabChange = useCallback(\n (slug: string) => {\n setActiveTabID(slug)\n void setPreference(PREFERENCE_KEYS.NAV_SIDEBAR_ACTIVE_TAB, { activeTab: slug })\n // Only revalidate tabs that can be loaded via serverFunction\n // Pre-rendered React elements (like default nav) can't be revalidated\n const tab = tabs.find((t) => t.slug === slug)\n void loadTabContent(slug, { revalidate: tab?.lazyLoadable ?? false })\n },\n [setPreference, loadTabContent, tabs],\n )\n\n const handleTabKeyDown = useCallback(\n (e: React.KeyboardEvent, currentIndex: number) => {\n if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n e.preventDefault()\n const direction = e.key === 'ArrowLeft' ? -1 : 1\n const newIndex = (currentIndex + direction + tabs.length) % tabs.length\n const newTab = tabs[newIndex]\n handleTabChange(newTab.slug)\n // Focus will be handled by the tabIndex change\n setTimeout(() => {\n document.querySelector<HTMLButtonElement>(`.${baseClass}__tab--active`)?.focus()\n }, 0)\n }\n },\n [baseClass, handleTabChange, tabs],\n )\n\n const activeContent = tabContent[activeTabID]\n\n // If there's only one tab (the default nav), render it without tab UI\n if (tabs.length === 1) {\n return <>{activeContent}</>\n }\n\n return (\n <SidebarTabsProvider reloadTabContent={reloadTabContent}>\n <div className={baseClass}>\n <div className={`${baseClass}__tabs`} role=\"tablist\">\n {tabs.map((tab, index) => {\n const isActive = tab.slug === activeTabID\n\n return (\n <button\n aria-selected={isActive}\n className={`${baseClass}__tab ${isActive ? `${baseClass}__tab--active` : ''}`}\n key={tab.slug}\n onClick={() => handleTabChange(tab.slug)}\n onKeyDown={(e) => handleTabKeyDown(e, index)}\n onMouseEnter={() => setHoveredTab(tab.slug)}\n onMouseLeave={() => setHoveredTab(null)}\n role=\"tab\"\n tabIndex={isActive ? 0 : -1}\n type=\"button\"\n >\n <Tooltip\n className={`${baseClass}__tooltip`}\n position={index === 0 ? 'bottom' : 'top'} // TODO: set to \"top\" when we portal tooltips\n show={hoveredTab === tab.slug}\n >\n {tab.label}\n </Tooltip>\n <span className={`${baseClass}__tab-icon`}>{tab.icon}</span>\n <span className={`${baseClass}__tab-label`}>{tab.label}</span>\n </button>\n )\n })}\n </div>\n <div className={`${baseClass}__content`} role=\"tabpanel\">\n <DelayedSpinner\n baseClass={baseClass}\n delay={loadingDelay}\n isLoading={loadingTab === activeTabID}\n />\n {tabs.map((tab) => {\n const content = tabContent[tab.slug]\n if (!content) {\n return null\n }\n const isActive = tab.slug === activeTabID && loadingTab !== activeTabID\n return (\n <div key={tab.slug} style={isActive ? undefined : { display: 'none' }}>\n {content}\n </div>\n )\n })}\n </div>\n </div>\n </SidebarTabsProvider>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { NavPreferences, PayloadComponent, SidebarTab } from 'payload';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import type { NavProps } from '../index.js';
|
|
4
|
-
import './index.scss';
|
|
5
|
-
type SidebarTabWithReactNode = {
|
|
6
|
-
components: {
|
|
7
|
-
Content: PayloadComponent | React.ReactNode;
|
|
8
|
-
Icon: PayloadComponent | React.ReactNode;
|
|
9
|
-
};
|
|
10
|
-
} & Omit<SidebarTab, 'components'>;
|
|
11
|
-
export type SidebarTabsProps = {
|
|
12
|
-
navPreferences: NavPreferences;
|
|
13
|
-
tabs: SidebarTabWithReactNode[];
|
|
14
|
-
} & NavProps;
|
|
15
|
-
export declare const SidebarTabs: React.FC<SidebarTabsProps>;
|
|
16
|
-
export {};
|
|
17
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/elements/Nav/SidebarTabs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAI3E,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,OAAO,cAAc,CAAA;AAErB,KAAK,uBAAuB,GAAG;IAC7B,UAAU,EAAE;QACV,OAAO,EAAE,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAA;QAC3C,IAAI,EAAE,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAA;KACzC,CAAA;CACF,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;AAElC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,cAAc,CAAA;IAC9B,IAAI,EAAE,uBAAuB,EAAE,CAAA;CAChC,GAAG,QAAQ,CAAA;AAIZ,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA4FlD,CAAA"}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { getTranslation } from '@payloadcms/translations';
|
|
3
|
-
import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
|
|
4
|
-
import React from 'react';
|
|
5
|
-
import { SidebarTabsClient } from './index.client.js';
|
|
6
|
-
const baseClass = 'sidebar-tabs';
|
|
7
|
-
export const SidebarTabs = props => {
|
|
8
|
-
const {
|
|
9
|
-
documentSubViewType,
|
|
10
|
-
i18n,
|
|
11
|
-
locale,
|
|
12
|
-
navPreferences,
|
|
13
|
-
params,
|
|
14
|
-
payload,
|
|
15
|
-
permissions,
|
|
16
|
-
req,
|
|
17
|
-
searchParams,
|
|
18
|
-
tabs,
|
|
19
|
-
user,
|
|
20
|
-
viewType
|
|
21
|
-
} = props;
|
|
22
|
-
// Determine which tab should be active on initial load
|
|
23
|
-
// First try saved preference, then default tab, then first tab
|
|
24
|
-
const preferredTabSlug = navPreferences.activeTab || tabs.find(tab => tab.isDefaultActive)?.slug || tabs[0]?.slug;
|
|
25
|
-
// Verify the preferred tab actually exists, otherwise fall back to default or first tab
|
|
26
|
-
const activeTab = tabs.find(t => t.slug === preferredTabSlug) || tabs.find(tab => tab.isDefaultActive) || tabs[0];
|
|
27
|
-
const initialActiveTabID = activeTab?.slug || tabs[0]?.slug;
|
|
28
|
-
// Build initial tab contents
|
|
29
|
-
// Strategy: Pre-render tabs that are already React elements (can't be lazy-loaded),
|
|
30
|
-
// and only render the initially active tab if it's a CustomComponent (can be lazy-loaded)
|
|
31
|
-
const initialTabContents = {};
|
|
32
|
-
const renderComponent = component => {
|
|
33
|
-
// Check if component is already a React node (payload provided React component)
|
|
34
|
-
if (/*#__PURE__*/React.isValidElement(component)) {
|
|
35
|
-
return component;
|
|
36
|
-
} else {
|
|
37
|
-
// Otherwise render it as a CustomComponent
|
|
38
|
-
return RenderServerComponent({
|
|
39
|
-
clientProps: {
|
|
40
|
-
documentSubViewType,
|
|
41
|
-
viewType
|
|
42
|
-
},
|
|
43
|
-
Component: component,
|
|
44
|
-
importMap: payload.importMap,
|
|
45
|
-
serverProps: {
|
|
46
|
-
i18n,
|
|
47
|
-
locale,
|
|
48
|
-
params,
|
|
49
|
-
payload,
|
|
50
|
-
permissions,
|
|
51
|
-
req,
|
|
52
|
-
searchParams,
|
|
53
|
-
user
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
for (const tab of tabs) {
|
|
59
|
-
if (/*#__PURE__*/React.isValidElement(tab.components.Content)) {
|
|
60
|
-
initialTabContents[tab.slug] = tab.components.Content;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// If the active tab is a CustomComponent (lazy-loadable), render it now
|
|
64
|
-
if (activeTab && ! /*#__PURE__*/React.isValidElement(activeTab.components.Content)) {
|
|
65
|
-
initialTabContents[activeTab.slug] = renderComponent(activeTab.components.Content);
|
|
66
|
-
}
|
|
67
|
-
return /*#__PURE__*/_jsx(SidebarTabsClient, {
|
|
68
|
-
baseClass: baseClass,
|
|
69
|
-
initialActiveTabID: initialActiveTabID,
|
|
70
|
-
initialTabContents: initialTabContents,
|
|
71
|
-
tabs: tabs.map(tab => {
|
|
72
|
-
const labelText = tab.label ? getTranslation(tab.label, i18n) : tab.slug;
|
|
73
|
-
// CustomComponents can be lazy-loaded/revalidated, React elements cannot
|
|
74
|
-
const isLazyLoadable = ! /*#__PURE__*/React.isValidElement(tab.components.Content);
|
|
75
|
-
return {
|
|
76
|
-
slug: tab.slug,
|
|
77
|
-
icon: renderComponent(tab.components.Icon),
|
|
78
|
-
isDefaultActive: tab.isDefaultActive,
|
|
79
|
-
label: labelText,
|
|
80
|
-
lazyLoadable: isLazyLoadable
|
|
81
|
-
};
|
|
82
|
-
})
|
|
83
|
-
});
|
|
84
|
-
};
|
|
85
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["getTranslation","RenderServerComponent","React","SidebarTabsClient","baseClass","SidebarTabs","props","documentSubViewType","i18n","locale","navPreferences","params","payload","permissions","req","searchParams","tabs","user","viewType","preferredTabSlug","activeTab","find","tab","isDefaultActive","slug","t","initialActiveTabID","initialTabContents","renderComponent","component","isValidElement","clientProps","Component","importMap","serverProps","components","Content","_jsx","map","labelText","label","isLazyLoadable","icon","Icon","lazyLoadable"],"sources":["../../../../src/elements/Nav/SidebarTabs/index.tsx"],"sourcesContent":["import type { NavPreferences, PayloadComponent, SidebarTab } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport React from 'react'\n\nimport type { NavProps } from '../index.js'\n\nimport { SidebarTabsClient } from './index.client.js'\nimport './index.scss'\n\ntype SidebarTabWithReactNode = {\n components: {\n Content: PayloadComponent | React.ReactNode\n Icon: PayloadComponent | React.ReactNode\n }\n} & Omit<SidebarTab, 'components'>\n\nexport type SidebarTabsProps = {\n navPreferences: NavPreferences\n tabs: SidebarTabWithReactNode[]\n} & NavProps\n\nconst baseClass = 'sidebar-tabs'\n\nexport const SidebarTabs: React.FC<SidebarTabsProps> = (props) => {\n const {\n documentSubViewType,\n i18n,\n locale,\n navPreferences,\n params,\n payload,\n permissions,\n req,\n searchParams,\n tabs,\n user,\n viewType,\n } = props\n\n // Determine which tab should be active on initial load\n // First try saved preference, then default tab, then first tab\n const preferredTabSlug =\n navPreferences.activeTab || tabs.find((tab) => tab.isDefaultActive)?.slug || tabs[0]?.slug\n\n // Verify the preferred tab actually exists, otherwise fall back to default or first tab\n const activeTab =\n tabs.find((t) => t.slug === preferredTabSlug) ||\n tabs.find((tab) => tab.isDefaultActive) ||\n tabs[0]\n\n const initialActiveTabID = activeTab?.slug || tabs[0]?.slug\n\n // Build initial tab contents\n // Strategy: Pre-render tabs that are already React elements (can't be lazy-loaded),\n // and only render the initially active tab if it's a CustomComponent (can be lazy-loaded)\n const initialTabContents: Record<string, React.ReactNode> = {}\n\n const renderComponent = (component: PayloadComponent | React.ReactNode): React.ReactNode => {\n // Check if component is already a React node (payload provided React component)\n if (React.isValidElement(component)) {\n return component\n } else {\n // Otherwise render it as a CustomComponent\n return RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: component as PayloadComponent,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n user,\n },\n })\n }\n }\n\n for (const tab of tabs) {\n if (React.isValidElement(tab.components.Content)) {\n initialTabContents[tab.slug] = tab.components.Content\n }\n }\n\n // If the active tab is a CustomComponent (lazy-loadable), render it now\n if (activeTab && !React.isValidElement(activeTab.components.Content)) {\n initialTabContents[activeTab.slug] = renderComponent(activeTab.components.Content)\n }\n\n return (\n <SidebarTabsClient\n baseClass={baseClass}\n initialActiveTabID={initialActiveTabID}\n initialTabContents={initialTabContents}\n tabs={tabs.map((tab) => {\n const labelText = tab.label ? getTranslation(tab.label, i18n) : tab.slug\n // CustomComponents can be lazy-loaded/revalidated, React elements cannot\n const isLazyLoadable = !React.isValidElement(tab.components.Content)\n\n return {\n slug: tab.slug,\n icon: renderComponent(tab.components.Icon),\n isDefaultActive: tab.isDefaultActive,\n label: labelText,\n lazyLoadable: isLazyLoadable,\n }\n })}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { ServerFunction } from 'payload';
|
|
2
|
-
import type React from 'react';
|
|
3
|
-
export type RenderTabServerFnArgs = {
|
|
4
|
-
tabSlug: string;
|
|
5
|
-
};
|
|
6
|
-
export type RenderTabServerFnReturnType = {
|
|
7
|
-
component: React.ReactNode;
|
|
8
|
-
};
|
|
9
|
-
export declare const renderTabHandler: ServerFunction<RenderTabServerFnArgs, RenderTabServerFnReturnType>;
|
|
10
|
-
//# sourceMappingURL=renderTabServerFn.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"renderTabServerFn.d.ts","sourceRoot":"","sources":["../../../../src/elements/Nav/SidebarTabs/renderTabServerFn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAC3C,qBAAqB,EACrB,2BAA2B,CA6C5B,CAAA"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
|
|
2
|
-
export const renderTabHandler = ({
|
|
3
|
-
req,
|
|
4
|
-
tabSlug
|
|
5
|
-
}) => {
|
|
6
|
-
if (!req.user) {
|
|
7
|
-
throw new Error('Unauthorized');
|
|
8
|
-
}
|
|
9
|
-
const {
|
|
10
|
-
importMap
|
|
11
|
-
} = req.payload;
|
|
12
|
-
const {
|
|
13
|
-
tabs
|
|
14
|
-
} = req.payload.config.admin.components?.sidebar || {};
|
|
15
|
-
if (!tabs) {
|
|
16
|
-
return {
|
|
17
|
-
component: null
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
const tabConfig = tabs.find(tab => tab.slug === tabSlug);
|
|
21
|
-
if (!tabConfig) {
|
|
22
|
-
return {
|
|
23
|
-
component: null
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
try {
|
|
27
|
-
const component = RenderServerComponent({
|
|
28
|
-
Component: tabConfig.components.Content,
|
|
29
|
-
importMap,
|
|
30
|
-
serverProps: {
|
|
31
|
-
i18n: req.i18n,
|
|
32
|
-
locale: req.locale,
|
|
33
|
-
params: req.routeParams,
|
|
34
|
-
payload: req.payload,
|
|
35
|
-
req,
|
|
36
|
-
searchParams: req.query,
|
|
37
|
-
user: req.user
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
return {
|
|
41
|
-
component
|
|
42
|
-
};
|
|
43
|
-
} catch (error) {
|
|
44
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
45
|
-
req.payload.logger.error({
|
|
46
|
-
err: error,
|
|
47
|
-
msg: `Error rendering tab "${tabSlug}": ${errorMessage}`
|
|
48
|
-
});
|
|
49
|
-
return {
|
|
50
|
-
component: null
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
//# sourceMappingURL=renderTabServerFn.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"renderTabServerFn.js","names":["RenderServerComponent","renderTabHandler","req","tabSlug","user","Error","importMap","payload","tabs","config","admin","components","sidebar","component","tabConfig","find","tab","slug","Component","Content","serverProps","i18n","locale","params","routeParams","searchParams","query","error","errorMessage","message","String","logger","err","msg"],"sources":["../../../../src/elements/Nav/SidebarTabs/renderTabServerFn.ts"],"sourcesContent":["import type { ServerFunction } from 'payload'\nimport type React from 'react'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\n\nexport type RenderTabServerFnArgs = {\n tabSlug: string\n}\n\nexport type RenderTabServerFnReturnType = {\n component: React.ReactNode\n}\n\nexport const renderTabHandler: ServerFunction<\n RenderTabServerFnArgs,\n RenderTabServerFnReturnType\n> = ({ req, tabSlug }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const { importMap } = req.payload\n const { tabs } = req.payload.config.admin.components?.sidebar || {}\n\n if (!tabs) {\n return { component: null }\n }\n\n const tabConfig = tabs.find((tab) => tab.slug === tabSlug)\n\n if (!tabConfig) {\n return { component: null }\n }\n\n try {\n const component = RenderServerComponent({\n Component: tabConfig.components.Content,\n importMap,\n serverProps: {\n i18n: req.i18n,\n locale: req.locale,\n params: req.routeParams,\n payload: req.payload,\n req,\n searchParams: req.query,\n user: req.user,\n },\n })\n\n return { component }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n req.payload.logger.error({\n err: error,\n msg: `Error rendering tab \"${tabSlug}\": ${errorMessage}`,\n })\n\n return { component: null }\n }\n}\n"],"mappings":"AAGA,SAASA,qBAAqB,QAAQ;AAUtC,OAAO,MAAMC,gBAAA,GAGTA,CAAC;EAAEC,GAAG;EAAEC;AAAO,CAAE;EACnB,IAAI,CAACD,GAAA,CAAIE,IAAI,EAAE;IACb,MAAM,IAAIC,KAAA,CAAM;EAClB;EAEA,MAAM;IAAEC;EAAS,CAAE,GAAGJ,GAAA,CAAIK,OAAO;EACjC,MAAM;IAAEC;EAAI,CAAE,GAAGN,GAAA,CAAIK,OAAO,CAACE,MAAM,CAACC,KAAK,CAACC,UAAU,EAAEC,OAAA,IAAW,CAAC;EAElE,IAAI,CAACJ,IAAA,EAAM;IACT,OAAO;MAAEK,SAAA,EAAW;IAAK;EAC3B;EAEA,MAAMC,SAAA,GAAYN,IAAA,CAAKO,IAAI,CAAEC,GAAA,IAAQA,GAAA,CAAIC,IAAI,KAAKd,OAAA;EAElD,IAAI,CAACW,SAAA,EAAW;IACd,OAAO;MAAED,SAAA,EAAW;IAAK;EAC3B;EAEA,IAAI;IACF,MAAMA,SAAA,GAAYb,qBAAA,CAAsB;MACtCkB,SAAA,EAAWJ,SAAA,CAAUH,UAAU,CAACQ,OAAO;MACvCb,SAAA;MACAc,WAAA,EAAa;QACXC,IAAA,EAAMnB,GAAA,CAAImB,IAAI;QACdC,MAAA,EAAQpB,GAAA,CAAIoB,MAAM;QAClBC,MAAA,EAAQrB,GAAA,CAAIsB,WAAW;QACvBjB,OAAA,EAASL,GAAA,CAAIK,OAAO;QACpBL,GAAA;QACAuB,YAAA,EAAcvB,GAAA,CAAIwB,KAAK;QACvBtB,IAAA,EAAMF,GAAA,CAAIE;MACZ;IACF;IAEA,OAAO;MAAES;IAAU;EACrB,EAAE,OAAOc,KAAA,EAAO;IACd,MAAMC,YAAA,GAAeD,KAAA,YAAiBtB,KAAA,GAAQsB,KAAA,CAAME,OAAO,GAAGC,MAAA,CAAOH,KAAA;IAErEzB,GAAA,CAAIK,OAAO,CAACwB,MAAM,CAACJ,KAAK,CAAC;MACvBK,GAAA,EAAKL,KAAA;MACLM,GAAA,EAAK,wBAAwB9B,OAAA,MAAayB,YAAA;IAC5C;IAEA,OAAO;MAAEf,SAAA,EAAW;IAAK;EAC3B;AACF","ignoreList":[]}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { Payload, PayloadRequest } from 'payload';
|
|
2
|
-
export type HierarchyAncestryItem = {
|
|
3
|
-
id: number | string;
|
|
4
|
-
path: Array<{
|
|
5
|
-
id: number | string;
|
|
6
|
-
title: string;
|
|
7
|
-
}>;
|
|
8
|
-
title: string;
|
|
9
|
-
};
|
|
10
|
-
export type HierarchyAncestryResult = {
|
|
11
|
-
items: HierarchyAncestryItem[];
|
|
12
|
-
};
|
|
13
|
-
export type GetHierarchyAncestryArgs = {
|
|
14
|
-
hierarchySlug: string;
|
|
15
|
-
ids: (number | string)[];
|
|
16
|
-
payload: Payload;
|
|
17
|
-
user?: PayloadRequest['user'];
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* Returns full ancestry paths for hierarchy items.
|
|
21
|
-
* Each item includes its own title and the path from root to self.
|
|
22
|
-
*/
|
|
23
|
-
export declare function getHierarchyAncestry({ hierarchySlug, ids, payload, user, }: GetHierarchyAncestryArgs): Promise<HierarchyAncestryResult>;
|
|
24
|
-
//# sourceMappingURL=getHierarchyAncestry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getHierarchyAncestry.d.ts","sourceRoot":"","sources":["../../src/utilities/getHierarchyAncestry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAEtD,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;IACnB,IAAI,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACnD,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,qBAAqB,EAAE,CAAA;CAC/B,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,aAAa,EAAE,MAAM,CAAA;IACrB,GAAG,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;CAC9B,CAAA;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,EACzC,aAAa,EACb,GAAG,EACH,OAAO,EACP,IAAI,GACL,EAAE,wBAAwB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAyH7D"}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns full ancestry paths for hierarchy items.
|
|
3
|
-
* Each item includes its own title and the path from root to self.
|
|
4
|
-
*/export async function getHierarchyAncestry({
|
|
5
|
-
hierarchySlug,
|
|
6
|
-
ids,
|
|
7
|
-
payload,
|
|
8
|
-
user
|
|
9
|
-
}) {
|
|
10
|
-
if (ids.length === 0) {
|
|
11
|
-
return {
|
|
12
|
-
items: []
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
const collectionConfig = payload.collections[hierarchySlug]?.config;
|
|
16
|
-
const hierarchyConfig = collectionConfig?.hierarchy && typeof collectionConfig.hierarchy === 'object' ? collectionConfig.hierarchy : undefined;
|
|
17
|
-
if (!hierarchyConfig) {
|
|
18
|
-
throw new Error(`Collection "${hierarchySlug}" is not a hierarchy`);
|
|
19
|
-
}
|
|
20
|
-
const parentFieldName = hierarchyConfig.parentFieldName;
|
|
21
|
-
const useAsTitle = collectionConfig.admin?.useAsTitle || 'id';
|
|
22
|
-
// Cache for already-fetched items to avoid redundant queries
|
|
23
|
-
const itemCache = new Map();
|
|
24
|
-
const fetchItem = async id => {
|
|
25
|
-
const cached = itemCache.get(id);
|
|
26
|
-
if (cached) {
|
|
27
|
-
return cached;
|
|
28
|
-
}
|
|
29
|
-
try {
|
|
30
|
-
const item = await payload.findByID({
|
|
31
|
-
id,
|
|
32
|
-
collection: hierarchySlug,
|
|
33
|
-
depth: 0,
|
|
34
|
-
overrideAccess: false,
|
|
35
|
-
user
|
|
36
|
-
});
|
|
37
|
-
if (item) {
|
|
38
|
-
itemCache.set(id, item);
|
|
39
|
-
}
|
|
40
|
-
return item;
|
|
41
|
-
} catch {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
const getTitle = (item, id) => {
|
|
46
|
-
const rawTitle = item[useAsTitle] || item.id || id;
|
|
47
|
-
if (rawTitle && typeof rawTitle === 'object') {
|
|
48
|
-
return JSON.stringify(rawTitle);
|
|
49
|
-
}
|
|
50
|
-
if (typeof rawTitle === 'string') {
|
|
51
|
-
return rawTitle;
|
|
52
|
-
}
|
|
53
|
-
if (typeof rawTitle === 'number') {
|
|
54
|
-
return String(rawTitle);
|
|
55
|
-
}
|
|
56
|
-
return String(id);
|
|
57
|
-
};
|
|
58
|
-
const getParentId = item => {
|
|
59
|
-
const parentValue = item[parentFieldName];
|
|
60
|
-
if (!parentValue) {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
if (typeof parentValue === 'object' && parentValue !== null && 'id' in parentValue) {
|
|
64
|
-
return parentValue.id;
|
|
65
|
-
}
|
|
66
|
-
return parentValue;
|
|
67
|
-
};
|
|
68
|
-
const buildPath = async (startItem, startId) => {
|
|
69
|
-
const path = [];
|
|
70
|
-
let currentItem = startItem;
|
|
71
|
-
let currentId = startId;
|
|
72
|
-
while (currentItem && currentId !== null) {
|
|
73
|
-
path.unshift({
|
|
74
|
-
id: currentId,
|
|
75
|
-
title: getTitle(currentItem, currentId)
|
|
76
|
-
});
|
|
77
|
-
const nextParentId = getParentId(currentItem);
|
|
78
|
-
if (!nextParentId) {
|
|
79
|
-
break;
|
|
80
|
-
}
|
|
81
|
-
currentItem = await fetchItem(nextParentId);
|
|
82
|
-
currentId = nextParentId;
|
|
83
|
-
}
|
|
84
|
-
return path;
|
|
85
|
-
};
|
|
86
|
-
const items = [];
|
|
87
|
-
for (const id of ids) {
|
|
88
|
-
const item = await fetchItem(id);
|
|
89
|
-
if (!item) {
|
|
90
|
-
continue;
|
|
91
|
-
}
|
|
92
|
-
const path = await buildPath(item, id);
|
|
93
|
-
items.push({
|
|
94
|
-
id,
|
|
95
|
-
path,
|
|
96
|
-
title: getTitle(item, id)
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
return {
|
|
100
|
-
items
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
//# sourceMappingURL=getHierarchyAncestry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getHierarchyAncestry.js","names":["getHierarchyAncestry","hierarchySlug","ids","payload","user","length","items","collectionConfig","collections","config","hierarchyConfig","hierarchy","undefined","Error","parentFieldName","useAsTitle","admin","itemCache","Map","fetchItem","id","cached","get","item","findByID","collection","depth","overrideAccess","set","getTitle","rawTitle","JSON","stringify","String","getParentId","parentValue","buildPath","startItem","startId","path","currentItem","currentId","unshift","title","nextParentId","push"],"sources":["../../src/utilities/getHierarchyAncestry.ts"],"sourcesContent":["import type { Payload, PayloadRequest } from 'payload'\n\nexport type HierarchyAncestryItem = {\n id: number | string\n path: Array<{ id: number | string; title: string }>\n title: string\n}\n\nexport type HierarchyAncestryResult = {\n items: HierarchyAncestryItem[]\n}\n\nexport type GetHierarchyAncestryArgs = {\n hierarchySlug: string\n ids: (number | string)[]\n payload: Payload\n user?: PayloadRequest['user']\n}\n\n/**\n * Returns full ancestry paths for hierarchy items.\n * Each item includes its own title and the path from root to self.\n */\nexport async function getHierarchyAncestry({\n hierarchySlug,\n ids,\n payload,\n user,\n}: GetHierarchyAncestryArgs): Promise<HierarchyAncestryResult> {\n if (ids.length === 0) {\n return { items: [] }\n }\n\n const collectionConfig = payload.collections[hierarchySlug]?.config\n const hierarchyConfig =\n collectionConfig?.hierarchy && typeof collectionConfig.hierarchy === 'object'\n ? collectionConfig.hierarchy\n : undefined\n\n if (!hierarchyConfig) {\n throw new Error(`Collection \"${hierarchySlug}\" is not a hierarchy`)\n }\n\n const parentFieldName = hierarchyConfig.parentFieldName\n const useAsTitle = collectionConfig.admin?.useAsTitle || 'id'\n\n // Cache for already-fetched items to avoid redundant queries\n const itemCache = new Map<number | string, Record<string, unknown>>()\n\n const fetchItem = async (id: number | string): Promise<null | Record<string, unknown>> => {\n const cached = itemCache.get(id)\n if (cached) {\n return cached\n }\n\n try {\n const item = await payload.findByID({\n id,\n collection: hierarchySlug,\n depth: 0,\n overrideAccess: false,\n user,\n })\n\n if (item) {\n itemCache.set(id, item)\n }\n\n return item\n } catch {\n return null\n }\n }\n\n const getTitle = (item: Record<string, unknown>, id: number | string): string => {\n const rawTitle = item[useAsTitle] || item.id || id\n\n if (rawTitle && typeof rawTitle === 'object') {\n return JSON.stringify(rawTitle)\n }\n\n if (typeof rawTitle === 'string') {\n return rawTitle\n }\n\n if (typeof rawTitle === 'number') {\n return String(rawTitle)\n }\n\n return String(id)\n }\n\n const getParentId = (item: Record<string, unknown>): null | number | string => {\n const parentValue = item[parentFieldName]\n\n if (!parentValue) {\n return null\n }\n\n if (typeof parentValue === 'object' && parentValue !== null && 'id' in parentValue) {\n return (parentValue as { id: number | string }).id\n }\n\n return parentValue as number | string\n }\n\n const buildPath = async (\n startItem: Record<string, unknown>,\n startId: number | string,\n ): Promise<Array<{ id: number | string; title: string }>> => {\n const path: Array<{ id: number | string; title: string }> = []\n let currentItem: null | Record<string, unknown> = startItem\n let currentId: null | number | string = startId\n\n while (currentItem && currentId !== null) {\n path.unshift({\n id: currentId,\n title: getTitle(currentItem, currentId),\n })\n\n const nextParentId = getParentId(currentItem)\n if (!nextParentId) {\n break\n }\n\n currentItem = await fetchItem(nextParentId)\n currentId = nextParentId\n }\n\n return path\n }\n\n const items: HierarchyAncestryItem[] = []\n\n for (const id of ids) {\n const item = await fetchItem(id)\n if (!item) {\n continue\n }\n\n const path = await buildPath(item, id)\n items.push({\n id,\n path,\n title: getTitle(item, id),\n })\n }\n\n return { items }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { HierarchyViewData, PayloadRequest, SanitizedCollectionConfig, SanitizedPermissions, Where } from 'payload';
|
|
2
|
-
/**
|
|
3
|
-
* Fetches hierarchy data for a collection with a selected parent.
|
|
4
|
-
* Returns data that can be rendered client-side by HierarchyTable.
|
|
5
|
-
*/
|
|
6
|
-
export declare const handleHierarchy: ({ baseFilter, collectionConfig, collectionSlug, parentId, permissions, req, search, typeFilter, user, }: {
|
|
7
|
-
baseFilter?: null | Where;
|
|
8
|
-
collectionConfig: SanitizedCollectionConfig;
|
|
9
|
-
collectionSlug: string;
|
|
10
|
-
parentId: null | number | string;
|
|
11
|
-
permissions?: SanitizedPermissions;
|
|
12
|
-
req: PayloadRequest;
|
|
13
|
-
search?: string;
|
|
14
|
-
/** Filter hierarchy items by their collectionSpecific type field */
|
|
15
|
-
typeFilter?: string[];
|
|
16
|
-
user: PayloadRequest["user"];
|
|
17
|
-
}) => Promise<HierarchyViewData>;
|
|
18
|
-
//# sourceMappingURL=handleHierarchy.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handleHierarchy.d.ts","sourceRoot":"","sources":["../../../src/views/List/handleHierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EAEd,yBAAyB,EACzB,oBAAoB,EAEpB,KAAK,EACN,MAAM,SAAS,CAAA;AAMhB;;;GAGG;AACH,eAAO,MAAM,eAAe,4GAUzB;IACD,UAAU,CAAC,EAAE,IAAI,GAAG,KAAK,CAAA;IACzB,gBAAgB,EAAE,yBAAyB,CAAA;IAC3C,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAA;IAChC,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,GAAG,EAAE,cAAc,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;CAC7B,KAAG,OAAO,CAAC,iBAAiB,CAkP5B,CAAA"}
|