@payloadcms/next 3.80.0-internal.8d9ec7c → 3.80.0-internal.cdd7ef7

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.
@@ -3,6 +3,8 @@ export type TabMetadata = {
3
3
  icon: React.ReactNode;
4
4
  isDefaultActive?: boolean;
5
5
  label: string;
6
+ /** Whether this tab can be loaded/revalidated via serverFunction */
7
+ lazyLoadable?: boolean;
6
8
  slug: string;
7
9
  };
8
10
  export type SidebarTabsClientProps = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../../src/elements/Nav/SidebarTabs/index.client.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAwC,MAAM,OAAO,CAAA;AAM5D,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IACnD;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,WAAW,EAAE,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAkK9D,CAAA"}
1
+ {"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../../src/elements/Nav/SidebarTabs/index.client.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAwC,MAAM,OAAO,CAAA;AAM5D,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;IACrB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,oEAAoE;IACpE,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IACnD;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,WAAW,EAAE,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CA4L9D,CAAA"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
4
- import { DelayedSpinner, Tooltip, usePreferences, useServerFunctions } from '@payloadcms/ui';
4
+ import { DelayedSpinner, SidebarTabsProvider, Tooltip, usePreferences, useServerFunctions } from '@payloadcms/ui';
5
5
  import { PREFERENCE_KEYS } from 'payload/shared';
6
6
  import React, { useCallback, useRef, useState } from 'react';
7
7
  import { TabError } from './TabError/index.js';
@@ -24,10 +24,9 @@ export const SidebarTabsClient = ({
24
24
  const [hoveredTab, setHoveredTab] = useState(null);
25
25
  const loadingTabsRef = useRef(new Set());
26
26
  const tabContentRef = useRef(initialTabContents);
27
- // Update cached content when server provides new initialTabContents (e.g., after tenant change)
27
+ // Update cached content when server provides new initialTabContents
28
28
  // This is needed because useState only uses initialValue on first mount
29
29
  React.useEffect(() => {
30
- // Update the cache with new server-rendered content
31
30
  tabContentRef.current = {
32
31
  ...tabContentRef.current,
33
32
  ...initialTabContents
@@ -37,14 +36,19 @@ export const SidebarTabsClient = ({
37
36
  ...initialTabContents
38
37
  }));
39
38
  }, [initialTabContents]);
40
- const loadTabContent = useCallback(async tabSlug => {
41
- // Check if already loaded or currently loading
42
- if (tabContentRef.current[tabSlug] || loadingTabsRef.current.has(tabSlug)) {
39
+ const loadTabContent = useCallback(async (tabSlug, {
40
+ revalidate = false
41
+ } = {}) => {
42
+ const hasCachedContent = Boolean(tabContentRef.current[tabSlug]);
43
+ // Skip if already loaded (unless revalidating) or currently loading
44
+ if (hasCachedContent && !revalidate || loadingTabsRef.current.has(tabSlug)) {
43
45
  return;
44
46
  }
45
- // Mark as loading
47
+ // Mark as loading - only show spinner if no cached content
46
48
  loadingTabsRef.current.add(tabSlug);
47
- setLoadingTab(tabSlug);
49
+ if (!hasCachedContent) {
50
+ setLoadingTab(tabSlug);
51
+ }
48
52
  try {
49
53
  const result = await serverFunction({
50
54
  name: 'render-tab',
@@ -59,6 +63,10 @@ export const SidebarTabsClient = ({
59
63
  tabContentRef.current = newContent_0;
60
64
  setTabContent(newContent_0);
61
65
  } catch (error) {
66
+ // On revalidate failure, keep showing cached content
67
+ if (hasCachedContent && revalidate) {
68
+ return;
69
+ }
62
70
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
63
71
  const handleRetry = () => {
64
72
  // Clear the error and retry loading
@@ -84,13 +92,28 @@ export const SidebarTabsClient = ({
84
92
  setLoadingTab(null);
85
93
  }
86
94
  }, [serverFunction]);
95
+ const reloadTabContent = useCallback(tabSlug_0 => {
96
+ // Clear cached content to force reload
97
+ const clearedContent_0 = {
98
+ ...tabContentRef.current
99
+ };
100
+ delete clearedContent_0[tabSlug_0];
101
+ tabContentRef.current = clearedContent_0;
102
+ setTabContent(clearedContent_0);
103
+ void loadTabContent(tabSlug_0);
104
+ }, [loadTabContent]);
87
105
  const handleTabChange = useCallback(slug => {
88
106
  setActiveTabID(slug);
89
107
  void setPreference(PREFERENCE_KEYS.NAV_SIDEBAR_ACTIVE_TAB, {
90
108
  activeTab: slug
91
109
  });
92
- void loadTabContent(slug);
93
- }, [setPreference, loadTabContent]);
110
+ // Only revalidate tabs that can be loaded via serverFunction
111
+ // Pre-rendered React elements (like default nav) can't be revalidated
112
+ const tab = tabs.find(t => t.slug === slug);
113
+ void loadTabContent(slug, {
114
+ revalidate: tab?.lazyLoadable ?? false
115
+ });
116
+ }, [setPreference, loadTabContent, tabs]);
94
117
  const handleTabKeyDown = useCallback((e, currentIndex) => {
95
118
  if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
96
119
  e.preventDefault();
@@ -111,58 +134,61 @@ export const SidebarTabsClient = ({
111
134
  children: activeContent
112
135
  });
113
136
  }
114
- return /*#__PURE__*/_jsxs("div", {
115
- className: baseClass,
116
- children: [/*#__PURE__*/_jsx("div", {
117
- className: `${baseClass}__tabs`,
118
- role: "tablist",
119
- children: tabs.map((tab, index) => {
120
- const isActive = tab.slug === activeTabID;
121
- return /*#__PURE__*/_jsxs("button", {
122
- "aria-selected": isActive,
123
- className: `${baseClass}__tab ${isActive ? `${baseClass}__tab--active` : ''}`,
124
- onClick: () => handleTabChange(tab.slug),
125
- onKeyDown: e_0 => handleTabKeyDown(e_0, index),
126
- onMouseEnter: () => setHoveredTab(tab.slug),
127
- onMouseLeave: () => setHoveredTab(null),
128
- role: "tab",
129
- tabIndex: isActive ? 0 : -1,
130
- type: "button",
131
- children: [/*#__PURE__*/_jsx(Tooltip, {
132
- className: `${baseClass}__tooltip`,
133
- position: index === 0 ? 'bottom' : 'top',
134
- show: hoveredTab === tab.slug,
135
- children: tab.label
136
- }), /*#__PURE__*/_jsx("span", {
137
- className: `${baseClass}__tab-icon`,
138
- children: tab.icon
139
- }), /*#__PURE__*/_jsx("span", {
140
- className: `${baseClass}__tab-label`,
141
- children: tab.label
142
- })]
143
- }, tab.slug);
144
- })
145
- }), /*#__PURE__*/_jsxs("div", {
146
- className: `${baseClass}__content`,
147
- role: "tabpanel",
148
- children: [/*#__PURE__*/_jsx(DelayedSpinner, {
149
- baseClass: baseClass,
150
- delay: loadingDelay,
151
- isLoading: loadingTab === activeTabID
152
- }), tabs.map(tab_0 => {
153
- const content = tabContent[tab_0.slug];
154
- if (!content) {
155
- return null;
156
- }
157
- const isActive_0 = tab_0.slug === activeTabID && loadingTab !== activeTabID;
158
- return /*#__PURE__*/_jsx("div", {
159
- style: isActive_0 ? undefined : {
160
- display: 'none'
161
- },
162
- children: content
163
- }, tab_0.slug);
137
+ return /*#__PURE__*/_jsx(SidebarTabsProvider, {
138
+ reloadTabContent: reloadTabContent,
139
+ children: /*#__PURE__*/_jsxs("div", {
140
+ className: baseClass,
141
+ children: [/*#__PURE__*/_jsx("div", {
142
+ className: `${baseClass}__tabs`,
143
+ role: "tablist",
144
+ children: tabs.map((tab_0, index) => {
145
+ const isActive = tab_0.slug === activeTabID;
146
+ return /*#__PURE__*/_jsxs("button", {
147
+ "aria-selected": isActive,
148
+ className: `${baseClass}__tab ${isActive ? `${baseClass}__tab--active` : ''}`,
149
+ onClick: () => handleTabChange(tab_0.slug),
150
+ onKeyDown: e_0 => handleTabKeyDown(e_0, index),
151
+ onMouseEnter: () => setHoveredTab(tab_0.slug),
152
+ onMouseLeave: () => setHoveredTab(null),
153
+ role: "tab",
154
+ tabIndex: isActive ? 0 : -1,
155
+ type: "button",
156
+ children: [/*#__PURE__*/_jsx(Tooltip, {
157
+ className: `${baseClass}__tooltip`,
158
+ position: index === 0 ? 'bottom' : 'top',
159
+ show: hoveredTab === tab_0.slug,
160
+ children: tab_0.label
161
+ }), /*#__PURE__*/_jsx("span", {
162
+ className: `${baseClass}__tab-icon`,
163
+ children: tab_0.icon
164
+ }), /*#__PURE__*/_jsx("span", {
165
+ className: `${baseClass}__tab-label`,
166
+ children: tab_0.label
167
+ })]
168
+ }, tab_0.slug);
169
+ })
170
+ }), /*#__PURE__*/_jsxs("div", {
171
+ className: `${baseClass}__content`,
172
+ role: "tabpanel",
173
+ children: [/*#__PURE__*/_jsx(DelayedSpinner, {
174
+ baseClass: baseClass,
175
+ delay: loadingDelay,
176
+ isLoading: loadingTab === activeTabID
177
+ }), tabs.map(tab_1 => {
178
+ const content = tabContent[tab_1.slug];
179
+ if (!content) {
180
+ return null;
181
+ }
182
+ const isActive_0 = tab_1.slug === activeTabID && loadingTab !== activeTabID;
183
+ return /*#__PURE__*/_jsx("div", {
184
+ style: isActive_0 ? undefined : {
185
+ display: 'none'
186
+ },
187
+ children: content
188
+ }, tab_1.slug);
189
+ })]
164
190
  })]
165
- })]
191
+ })
166
192
  });
167
193
  };
168
194
  //# sourceMappingURL=index.client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.client.js","names":["DelayedSpinner","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","has","add","result","name","args","newContent","component","error","errorMessage","Error","message","handleRetry","clearedContent","_jsx","onRetry","delete","handleTabChange","slug","NAV_SIDEBAR_ACTIVE_TAB","activeTab","handleTabKeyDown","e","currentIndex","key","preventDefault","direction","newIndex","length","newTab","setTimeout","document","querySelector","focus","activeContent","_Fragment","_jsxs","className","role","map","tab","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 { DelayedSpinner, Tooltip, usePreferences, useServerFunctions } 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 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 (e.g., after tenant change)\n // This is needed because useState only uses initialValue on first mount\n React.useEffect(() => {\n // Update the cache with new server-rendered content\n tabContentRef.current = { ...tabContentRef.current, ...initialTabContents }\n setTabContent((prev) => ({ ...prev, ...initialTabContents }))\n }, [initialTabContents])\n\n const loadTabContent = useCallback(\n async (tabSlug: string) => {\n // Check if already loaded or currently loading\n if (tabContentRef.current[tabSlug] || loadingTabsRef.current.has(tabSlug)) {\n return\n }\n\n // Mark as loading\n loadingTabsRef.current.add(tabSlug)\n setLoadingTab(tabSlug)\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 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 handleTabChange = useCallback(\n (slug: string) => {\n setActiveTabID(slug)\n void setPreference(PREFERENCE_KEYS.NAV_SIDEBAR_ACTIVE_TAB, { activeTab: slug })\n void loadTabContent(slug)\n },\n [setPreference, loadTabContent],\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 <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 )\n}\n"],"mappings":"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","ignoreList":[]}
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 +1 @@
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,CAyFlD,CAAA"}
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"}
@@ -70,11 +70,14 @@ export const SidebarTabs = props => {
70
70
  initialTabContents: initialTabContents,
71
71
  tabs: tabs.map(tab => {
72
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);
73
75
  return {
74
76
  slug: tab.slug,
75
77
  icon: renderComponent(tab.components.Icon),
76
78
  isDefaultActive: tab.isDefaultActive,
77
- label: labelText
79
+ label: labelText,
80
+ lazyLoadable: isLazyLoadable
78
81
  };
79
82
  })
80
83
  });
@@ -1 +1 @@
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","icon","Icon"],"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\n return {\n slug: tab.slug,\n icon: renderComponent(tab.components.Icon),\n isDefaultActive: tab.isDefaultActive,\n label: labelText,\n }\n })}\n />\n )\n}\n"],"mappings":";AAEA,SAASA,cAAc,QAAQ;AAC/B,SAASC,qBAAqB,QAAQ;AACtC,OAAOC,KAAA,MAAW;AAIlB,SAASC,iBAAiB,QAAQ;AAelC,MAAMC,SAAA,GAAY;AAElB,OAAO,MAAMC,WAAA,GAA2CC,KAAA;EACtD,MAAM;IACJC,mBAAmB;IACnBC,IAAI;IACJC,MAAM;IACNC,cAAc;IACdC,MAAM;IACNC,OAAO;IACPC,WAAW;IACXC,GAAG;IACHC,YAAY;IACZC,IAAI;IACJC,IAAI;IACJC;EAAQ,CACT,GAAGZ,KAAA;EAEJ;EACA;EACA,MAAMa,gBAAA,GACJT,cAAA,CAAeU,SAAS,IAAIJ,IAAA,CAAKK,IAAI,CAAEC,GAAA,IAAQA,GAAA,CAAIC,eAAe,GAAGC,IAAA,IAAQR,IAAI,CAAC,EAAE,EAAEQ,IAAA;EAExF;EACA,MAAMJ,SAAA,GACJJ,IAAA,CAAKK,IAAI,CAAEI,CAAA,IAAMA,CAAA,CAAED,IAAI,KAAKL,gBAAA,KAC5BH,IAAA,CAAKK,IAAI,CAAEC,GAAA,IAAQA,GAAA,CAAIC,eAAe,KACtCP,IAAI,CAAC,EAAE;EAET,MAAMU,kBAAA,GAAqBN,SAAA,EAAWI,IAAA,IAAQR,IAAI,CAAC,EAAE,EAAEQ,IAAA;EAEvD;EACA;EACA;EACA,MAAMG,kBAAA,GAAsD,CAAC;EAE7D,MAAMC,eAAA,GAAmBC,SAAA;IACvB;IACA,iBAAI3B,KAAA,CAAM4B,cAAc,CAACD,SAAA,GAAY;MACnC,OAAOA,SAAA;IACT,OAAO;MACL;MACA,OAAO5B,qBAAA,CAAsB;QAC3B8B,WAAA,EAAa;UACXxB,mBAAA;UACAW;QACF;QACAc,SAAA,EAAWH,SAAA;QACXI,SAAA,EAAWrB,OAAA,CAAQqB,SAAS;QAC5BC,WAAA,EAAa;UACX1B,IAAA;UACAC,MAAA;UACAE,MAAA;UACAC,OAAA;UACAC,WAAA;UACAC,GAAA;UACAC,YAAA;UACAE;QACF;MACF;IACF;EACF;EAEA,KAAK,MAAMK,GAAA,IAAON,IAAA,EAAM;IACtB,iBAAId,KAAA,CAAM4B,cAAc,CAACR,GAAA,CAAIa,UAAU,CAACC,OAAO,GAAG;MAChDT,kBAAkB,CAACL,GAAA,CAAIE,IAAI,CAAC,GAAGF,GAAA,CAAIa,UAAU,CAACC,OAAO;IACvD;EACF;EAEA;EACA,IAAIhB,SAAA,IAAa,eAAClB,KAAA,CAAM4B,cAAc,CAACV,SAAA,CAAUe,UAAU,CAACC,OAAO,GAAG;IACpET,kBAAkB,CAACP,SAAA,CAAUI,IAAI,CAAC,GAAGI,eAAA,CAAgBR,SAAA,CAAUe,UAAU,CAACC,OAAO;EACnF;EAEA,oBACEC,IAAA,CAAClC,iBAAA;IACCC,SAAA,EAAWA,SAAA;IACXsB,kBAAA,EAAoBA,kBAAA;IACpBC,kBAAA,EAAoBA,kBAAA;IACpBX,IAAA,EAAMA,IAAA,CAAKsB,GAAG,CAAEhB,GAAA;MACd,MAAMiB,SAAA,GAAYjB,GAAA,CAAIkB,KAAK,GAAGxC,cAAA,CAAesB,GAAA,CAAIkB,KAAK,EAAEhC,IAAA,IAAQc,GAAA,CAAIE,IAAI;MAExE,OAAO;QACLA,IAAA,EAAMF,GAAA,CAAIE,IAAI;QACdiB,IAAA,EAAMb,eAAA,CAAgBN,GAAA,CAAIa,UAAU,CAACO,IAAI;QACzCnB,eAAA,EAAiBD,GAAA,CAAIC,eAAe;QACpCiB,KAAA,EAAOD;MACT;IACF;;AAGN","ignoreList":[]}
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 +1 @@
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,CA4C5B,CAAA"}
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"}
@@ -32,6 +32,7 @@ export const renderTabHandler = ({
32
32
  locale: req.locale,
33
33
  params: req.routeParams,
34
34
  payload: req.payload,
35
+ req,
35
36
  searchParams: req.query,
36
37
  user: req.user
37
38
  }
@@ -1 +1 @@
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 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;QACpBkB,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
+ {"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,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { ListViewIcon, Logout } from '@payloadcms/ui';
2
+ import { Logout, TableViewIcon } from '@payloadcms/ui';
3
3
  import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
4
4
  import { EntityType, groupNavItems } from '@payloadcms/ui/shared';
5
5
  import React from 'react';
@@ -169,7 +169,7 @@ export const DefaultNav = async props => {
169
169
  navPreferences: navPreferences
170
170
  }), RenderedAfterNavLinks]
171
171
  }),
172
- Icon: /*#__PURE__*/_jsx(ListViewIcon, {})
172
+ Icon: /*#__PURE__*/_jsx(TableViewIcon, {})
173
173
  },
174
174
  isDefaultActive: true,
175
175
  label: i18n.t('general:collections')
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["ListViewIcon","Logout","RenderServerComponent","EntityType","groupNavItems","React","DefaultNavClient","NavHamburger","NavWrapper","SettingsMenuButton","SidebarTabs","baseClass","getNavPrefs","DefaultNav","props","documentSubViewType","i18n","locale","params","payload","permissions","req","searchParams","user","viewType","visibleEntities","config","admin","components","afterNav","afterNavLinks","beforeNav","beforeNavLinks","logout","settingsMenu","collections","globals","groups","filter","slug","includes","map","collection","type","entity","global","navPreferences","LogoutComponent","clientProps","Component","Button","Fallback","importMap","serverProps","RenderedSettingsMenu","Array","isArray","item","index","key","RenderedBeforeNav","RenderedBeforeNavLinks","RenderedAfterNavLinks","RenderedAfterNav","allTabs","Content","_jsxs","_Fragment","_jsx","Icon","isDefaultActive","label","t","sidebar","tabs","tab","disabled","className"],"sources":["../../../src/elements/Nav/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type { PayloadRequest, ServerProps } from 'payload'\n\nimport { ListViewIcon, Logout } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport React from 'react'\n\nimport { DefaultNavClient } from './index.client.js'\nimport { NavHamburger } from './NavHamburger/index.js'\nimport { NavWrapper } from './NavWrapper/index.js'\nimport { SettingsMenuButton } from './SettingsMenuButton/index.js'\nimport { SidebarTabs } from './SidebarTabs/index.js'\nimport './index.scss'\n\nconst baseClass = 'nav'\n\nimport { getNavPrefs } from './getNavPrefs.js'\n\nexport type NavProps = {\n req?: PayloadRequest\n} & ServerProps\n\nexport const DefaultNav: React.FC<NavProps> = async (props) => {\n const {\n documentSubViewType,\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n user,\n viewType,\n visibleEntities,\n } = props\n\n if (!payload?.config) {\n return null\n }\n\n const {\n admin: {\n components: { afterNav, afterNavLinks, beforeNav, beforeNavLinks, logout, settingsMenu },\n },\n collections,\n globals,\n } = payload.config\n\n // Group collections and globals for nav display\n // These groups are passed to SidebarTabs -> CollectionsTab to avoid recomputing\n const groups = groupNavItems(\n [\n ...collections\n .filter(({ slug }) => visibleEntities.collections.includes(slug))\n .map(\n (collection) =>\n ({\n type: EntityType.collection,\n entity: collection,\n }) satisfies EntityToGroup,\n ),\n ...globals\n .filter(({ slug }) => visibleEntities.globals.includes(slug))\n .map(\n (global) =>\n ({\n type: EntityType.global,\n entity: global,\n }) satisfies EntityToGroup,\n ),\n ],\n permissions,\n i18n,\n )\n\n const navPreferences = await getNavPrefs(req)\n\n const LogoutComponent = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: logout?.Button,\n Fallback: Logout,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n const RenderedSettingsMenu =\n settingsMenu && Array.isArray(settingsMenu)\n ? settingsMenu.map((item, index) =>\n RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: item,\n importMap: payload.importMap,\n key: `settings-menu-item-${index}`,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n }),\n )\n : []\n\n const RenderedBeforeNav = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: beforeNav,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n const RenderedBeforeNavLinks = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: beforeNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n const RenderedAfterNavLinks = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: afterNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n const RenderedAfterNav = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: afterNav,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n // Build the full tabs array, starting with the default nav tab\n const allTabs = [\n {\n slug: 'nav',\n components: {\n Content: (\n <>\n {RenderedBeforeNavLinks}\n <DefaultNavClient groups={groups} navPreferences={navPreferences} />\n {RenderedAfterNavLinks}\n </>\n ),\n Icon: <ListViewIcon />,\n },\n isDefaultActive: true,\n label: i18n.t('general:collections'),\n },\n ...(payload.config.admin?.components?.sidebar?.tabs?.filter((tab) => !tab.disabled) || []),\n ]\n\n return (\n <NavWrapper baseClass={baseClass}>\n {RenderedBeforeNav}\n <nav className={`${baseClass}__wrap`}>\n <SidebarTabs\n documentSubViewType={documentSubViewType}\n i18n={i18n}\n locale={locale}\n navPreferences={navPreferences}\n params={params}\n payload={payload}\n permissions={permissions}\n req={req}\n searchParams={searchParams}\n tabs={allTabs}\n user={user}\n viewType={viewType}\n />\n <div className={`${baseClass}__controls`}>\n <SettingsMenuButton settingsMenu={RenderedSettingsMenu} />\n {LogoutComponent}\n </div>\n </nav>\n {RenderedAfterNav}\n <div className={`${baseClass}__header`}>\n <div className={`${baseClass}__header-content`}>\n <NavHamburger baseClass={baseClass} />\n </div>\n </div>\n </NavWrapper>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["Logout","TableViewIcon","RenderServerComponent","EntityType","groupNavItems","React","DefaultNavClient","NavHamburger","NavWrapper","SettingsMenuButton","SidebarTabs","baseClass","getNavPrefs","DefaultNav","props","documentSubViewType","i18n","locale","params","payload","permissions","req","searchParams","user","viewType","visibleEntities","config","admin","components","afterNav","afterNavLinks","beforeNav","beforeNavLinks","logout","settingsMenu","collections","globals","groups","filter","slug","includes","map","collection","type","entity","global","navPreferences","LogoutComponent","clientProps","Component","Button","Fallback","importMap","serverProps","RenderedSettingsMenu","Array","isArray","item","index","key","RenderedBeforeNav","RenderedBeforeNavLinks","RenderedAfterNavLinks","RenderedAfterNav","allTabs","Content","_jsxs","_Fragment","_jsx","Icon","isDefaultActive","label","t","sidebar","tabs","tab","disabled","className"],"sources":["../../../src/elements/Nav/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type { PayloadRequest, ServerProps } from 'payload'\n\nimport { Logout, TableViewIcon } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { EntityType, groupNavItems } from '@payloadcms/ui/shared'\nimport React from 'react'\n\nimport { DefaultNavClient } from './index.client.js'\nimport { NavHamburger } from './NavHamburger/index.js'\nimport { NavWrapper } from './NavWrapper/index.js'\nimport { SettingsMenuButton } from './SettingsMenuButton/index.js'\nimport { SidebarTabs } from './SidebarTabs/index.js'\nimport './index.scss'\n\nconst baseClass = 'nav'\n\nimport { getNavPrefs } from './getNavPrefs.js'\n\nexport type NavProps = {\n req?: PayloadRequest\n} & ServerProps\n\nexport const DefaultNav: React.FC<NavProps> = async (props) => {\n const {\n documentSubViewType,\n i18n,\n locale,\n params,\n payload,\n permissions,\n req,\n searchParams,\n user,\n viewType,\n visibleEntities,\n } = props\n\n if (!payload?.config) {\n return null\n }\n\n const {\n admin: {\n components: { afterNav, afterNavLinks, beforeNav, beforeNavLinks, logout, settingsMenu },\n },\n collections,\n globals,\n } = payload.config\n\n // Group collections and globals for nav display\n // These groups are passed to SidebarTabs -> CollectionsTab to avoid recomputing\n const groups = groupNavItems(\n [\n ...collections\n .filter(({ slug }) => visibleEntities.collections.includes(slug))\n .map(\n (collection) =>\n ({\n type: EntityType.collection,\n entity: collection,\n }) satisfies EntityToGroup,\n ),\n ...globals\n .filter(({ slug }) => visibleEntities.globals.includes(slug))\n .map(\n (global) =>\n ({\n type: EntityType.global,\n entity: global,\n }) satisfies EntityToGroup,\n ),\n ],\n permissions,\n i18n,\n )\n\n const navPreferences = await getNavPrefs(req)\n\n const LogoutComponent = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: logout?.Button,\n Fallback: Logout,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n const RenderedSettingsMenu =\n settingsMenu && Array.isArray(settingsMenu)\n ? settingsMenu.map((item, index) =>\n RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: item,\n importMap: payload.importMap,\n key: `settings-menu-item-${index}`,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n }),\n )\n : []\n\n const RenderedBeforeNav = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: beforeNav,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n const RenderedBeforeNavLinks = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: beforeNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n const RenderedAfterNavLinks = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: afterNavLinks,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n const RenderedAfterNav = RenderServerComponent({\n clientProps: {\n documentSubViewType,\n viewType,\n },\n Component: afterNav,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n // Build the full tabs array, starting with the default nav tab\n const allTabs = [\n {\n slug: 'nav',\n components: {\n Content: (\n <>\n {RenderedBeforeNavLinks}\n <DefaultNavClient groups={groups} navPreferences={navPreferences} />\n {RenderedAfterNavLinks}\n </>\n ),\n Icon: <TableViewIcon />,\n },\n isDefaultActive: true,\n label: i18n.t('general:collections'),\n },\n ...(payload.config.admin?.components?.sidebar?.tabs?.filter((tab) => !tab.disabled) || []),\n ]\n\n return (\n <NavWrapper baseClass={baseClass}>\n {RenderedBeforeNav}\n <nav className={`${baseClass}__wrap`}>\n <SidebarTabs\n documentSubViewType={documentSubViewType}\n i18n={i18n}\n locale={locale}\n navPreferences={navPreferences}\n params={params}\n payload={payload}\n permissions={permissions}\n req={req}\n searchParams={searchParams}\n tabs={allTabs}\n user={user}\n viewType={viewType}\n />\n <div className={`${baseClass}__controls`}>\n <SettingsMenuButton settingsMenu={RenderedSettingsMenu} />\n {LogoutComponent}\n </div>\n </nav>\n {RenderedAfterNav}\n <div className={`${baseClass}__header`}>\n <div className={`${baseClass}__header-content`}>\n <NavHamburger baseClass={baseClass} />\n </div>\n </div>\n </NavWrapper>\n )\n}\n"],"mappings":"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","ignoreList":[]}