@payloadcms/next 3.74.0 → 3.75.0

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.
Files changed (64) hide show
  1. package/dist/auth/login.d.ts +9 -12
  2. package/dist/auth/login.d.ts.map +1 -1
  3. package/dist/auth/login.js.map +1 -1
  4. package/dist/auth/logout.d.ts +2 -2
  5. package/dist/auth/logout.d.ts.map +1 -1
  6. package/dist/auth/logout.js.map +1 -1
  7. package/dist/auth/refresh.d.ts +2 -1
  8. package/dist/auth/refresh.d.ts.map +1 -1
  9. package/dist/auth/refresh.js.map +1 -1
  10. package/dist/cjs/withPayload.cjs +1 -1
  11. package/dist/cjs/withPayload.cjs.map +1 -1
  12. package/dist/elements/Nav/getNavPrefs.d.ts.map +1 -1
  13. package/dist/elements/Nav/getNavPrefs.js +2 -1
  14. package/dist/elements/Nav/getNavPrefs.js.map +1 -1
  15. package/dist/elements/Nav/index.d.ts.map +1 -1
  16. package/dist/elements/Nav/index.js +76 -38
  17. package/dist/elements/Nav/index.js.map +1 -1
  18. package/dist/exports/client.d.ts +1 -1
  19. package/dist/exports/client.d.ts.map +1 -1
  20. package/dist/exports/client.js +1 -1
  21. package/dist/exports/client.js.map +1 -1
  22. package/dist/exports/rsc.d.ts +1 -1
  23. package/dist/exports/rsc.d.ts.map +1 -1
  24. package/dist/exports/rsc.js +1 -1
  25. package/dist/exports/rsc.js.map +1 -1
  26. package/dist/utilities/handleServerFunctions.d.ts.map +1 -1
  27. package/dist/utilities/handleServerFunctions.js +7 -5
  28. package/dist/utilities/handleServerFunctions.js.map +1 -1
  29. package/dist/utilities/initReq.d.ts +2 -13
  30. package/dist/utilities/initReq.d.ts.map +1 -1
  31. package/dist/utilities/initReq.js.map +1 -1
  32. package/dist/views/BrowseByFolder/buildView.d.ts.map +1 -1
  33. package/dist/views/BrowseByFolder/buildView.js +2 -1
  34. package/dist/views/BrowseByFolder/buildView.js.map +1 -1
  35. package/dist/views/Dashboard/Default/ModularDashboard/index.d.ts.map +1 -1
  36. package/dist/views/Dashboard/Default/ModularDashboard/index.js +8 -1
  37. package/dist/views/Dashboard/Default/ModularDashboard/index.js.map +1 -1
  38. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.d.ts.map +1 -1
  39. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js +6 -0
  40. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js.map +1 -1
  41. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.d.ts.map +1 -1
  42. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js +7 -1
  43. package/dist/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js.map +1 -1
  44. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.d.ts.map +1 -1
  45. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.js +9 -2
  46. package/dist/views/Dashboard/Default/ModularDashboard/useDashboardLayout.js.map +1 -1
  47. package/dist/views/Document/handleServerFunction.d.ts.map +1 -1
  48. package/dist/views/Document/handleServerFunction.js +5 -7
  49. package/dist/views/Document/handleServerFunction.js.map +1 -1
  50. package/dist/views/Document/index.js +3 -3
  51. package/dist/views/Document/index.js.map +1 -1
  52. package/dist/views/Document/renderDocumentSlots.d.ts +3 -2
  53. package/dist/views/Document/renderDocumentSlots.d.ts.map +1 -1
  54. package/dist/views/Document/renderDocumentSlots.js +9 -2
  55. package/dist/views/Document/renderDocumentSlots.js.map +1 -1
  56. package/dist/views/List/handleServerFunction.d.ts.map +1 -1
  57. package/dist/views/List/handleServerFunction.js +7 -7
  58. package/dist/views/List/handleServerFunction.js.map +1 -1
  59. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.d.ts.map +1 -1
  60. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js +3 -1
  61. package/dist/views/Version/RenderFieldsToDiff/fields/Relationship/index.js.map +1 -1
  62. package/dist/withPayload/withPayload.js +1 -1
  63. package/dist/withPayload/withPayload.js.map +1 -1
  64. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"file":"handleServerFunctions.js","names":["_internal_renderFieldHandler","copyDataFromLocaleHandler","buildFormStateHandler","buildTableStateHandler","getFolderResultsComponentAndDataHandler","schedulePublishHandler","getDefaultLayoutHandler","renderWidgetHandler","renderDocumentHandler","renderDocumentSlotsHandler","renderListHandler","initReq","slugifyHandler","baseServerFunctions","slugify","handleServerFunctions","args","name","fnKey","fnArgs","config","configPromise","importMap","serverFunctions","extraServerFunctions","req","key","augmentedArgs","fn","Error"],"sources":["../../src/utilities/handleServerFunctions.ts"],"sourcesContent":["import type { ServerFunction, ServerFunctionHandler } from 'payload'\n\nimport { _internal_renderFieldHandler, copyDataFromLocaleHandler } from '@payloadcms/ui/rsc'\nimport { buildFormStateHandler } from '@payloadcms/ui/utilities/buildFormState'\nimport { buildTableStateHandler } from '@payloadcms/ui/utilities/buildTableState'\nimport { getFolderResultsComponentAndDataHandler } from '@payloadcms/ui/utilities/getFolderResultsComponentAndData'\nimport { schedulePublishHandler } from '@payloadcms/ui/utilities/schedulePublishHandler'\n\nimport { getDefaultLayoutHandler } from '../views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js'\nimport { renderWidgetHandler } from '../views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js'\nimport { renderDocumentHandler } from '../views/Document/handleServerFunction.js'\nimport { renderDocumentSlotsHandler } from '../views/Document/renderDocumentSlots.js'\nimport { renderListHandler } from '../views/List/handleServerFunction.js'\nimport { initReq } from './initReq.js'\nimport { slugifyHandler } from './slugify.js'\n\nconst baseServerFunctions: Record<string, ServerFunction<any, any>> = {\n 'copy-data-from-locale': copyDataFromLocaleHandler,\n 'form-state': buildFormStateHandler,\n 'get-default-layout': getDefaultLayoutHandler,\n 'get-folder-results-component-and-data': getFolderResultsComponentAndDataHandler,\n 'render-document': renderDocumentHandler,\n 'render-document-slots': renderDocumentSlotsHandler,\n 'render-field': _internal_renderFieldHandler,\n 'render-list': renderListHandler,\n 'render-widget': renderWidgetHandler,\n 'schedule-publish': schedulePublishHandler,\n slugify: slugifyHandler,\n 'table-state': buildTableStateHandler,\n}\n\nexport const handleServerFunctions: ServerFunctionHandler = async (args) => {\n const {\n name: fnKey,\n args: fnArgs,\n config: configPromise,\n importMap,\n serverFunctions: extraServerFunctions,\n } = args\n\n const { req } = await initReq({\n configPromise,\n importMap,\n key: 'RootLayout',\n })\n\n const augmentedArgs: Parameters<ServerFunction>[0] = {\n ...fnArgs,\n importMap,\n req,\n }\n\n const serverFunctions = {\n ...baseServerFunctions,\n ...(extraServerFunctions || {}),\n }\n\n const fn = serverFunctions[fnKey]\n\n if (!fn) {\n throw new Error(`Unknown Server Function: ${fnKey}`)\n }\n\n return fn(augmentedArgs)\n}\n"],"mappings":"AAEA,SAASA,4BAA4B,EAAEC,yBAAyB,QAAQ;AACxE,SAASC,qBAAqB,QAAQ;AACtC,SAASC,sBAAsB,QAAQ;AACvC,SAASC,uCAAuC,QAAQ;AACxD,SAASC,sBAAsB,QAAQ;AAEvC,SAASC,uBAAuB,QAAQ;AACxC,SAASC,mBAAmB,QAAQ;AACpC,SAASC,qBAAqB,QAAQ;AACtC,SAASC,0BAA0B,QAAQ;AAC3C,SAASC,iBAAiB,QAAQ;AAClC,SAASC,OAAO,QAAQ;AACxB,SAASC,cAAc,QAAQ;AAE/B,MAAMC,mBAAA,GAAgE;EACpE,yBAAyBZ,yBAAA;EACzB,cAAcC,qBAAA;EACd,sBAAsBI,uBAAA;EACtB,yCAAyCF,uCAAA;EACzC,mBAAmBI,qBAAA;EACnB,yBAAyBC,0BAAA;EACzB,gBAAgBT,4BAAA;EAChB,eAAeU,iBAAA;EACf,iBAAiBH,mBAAA;EACjB,oBAAoBF,sBAAA;EACpBS,OAAA,EAASF,cAAA;EACT,eAAeT;AACjB;AAEA,OAAO,MAAMY,qBAAA,GAA+C,MAAOC,IAAA;EACjE,MAAM;IACJC,IAAA,EAAMC,KAAK;IACXF,IAAA,EAAMG,MAAM;IACZC,MAAA,EAAQC,aAAa;IACrBC,SAAS;IACTC,eAAA,EAAiBC;EAAoB,CACtC,GAAGR,IAAA;EAEJ,MAAM;IAAES;EAAG,CAAE,GAAG,MAAMd,OAAA,CAAQ;IAC5BU,aAAA;IACAC,SAAA;IACAI,GAAA,EAAK;EACP;EAEA,MAAMC,aAAA,GAA+C;IACnD,GAAGR,MAAM;IACTG,SAAA;IACAG;EACF;EAEA,MAAMF,eAAA,GAAkB;IACtB,GAAGV,mBAAmB;IACtB,IAAIW,oBAAA,IAAwB,CAAC,CAAC;EAChC;EAEA,MAAMI,EAAA,GAAKL,eAAe,CAACL,KAAA,CAAM;EAEjC,IAAI,CAACU,EAAA,EAAI;IACP,MAAM,IAAIC,KAAA,CAAM,4BAA4BX,KAAA,EAAO;EACrD;EAEA,OAAOU,EAAA,CAAGD,aAAA;AACZ","ignoreList":[]}
1
+ {"version":3,"file":"handleServerFunctions.js","names":["_internal_renderFieldHandler","copyDataFromLocaleHandler","buildFormStateHandler","buildTableStateHandler","getFolderResultsComponentAndDataHandler","schedulePublishHandler","getDefaultLayoutHandler","renderWidgetHandler","renderDocumentHandler","renderDocumentSlotsHandler","renderListHandler","initReq","slugifyHandler","baseServerFunctions","slugify","handleServerFunctions","args","name","fnKey","fnArgs","config","configPromise","importMap","serverFunctions","extraServerFunctions","cookies","locale","permissions","req","key","augmentedArgs","fn","Error"],"sources":["../../src/utilities/handleServerFunctions.ts"],"sourcesContent":["import type { DefaultServerFunctionArgs, ServerFunction, ServerFunctionHandler } from 'payload'\n\nimport { _internal_renderFieldHandler, copyDataFromLocaleHandler } from '@payloadcms/ui/rsc'\nimport { buildFormStateHandler } from '@payloadcms/ui/utilities/buildFormState'\nimport { buildTableStateHandler } from '@payloadcms/ui/utilities/buildTableState'\nimport { getFolderResultsComponentAndDataHandler } from '@payloadcms/ui/utilities/getFolderResultsComponentAndData'\nimport { schedulePublishHandler } from '@payloadcms/ui/utilities/schedulePublishHandler'\n\nimport { getDefaultLayoutHandler } from '../views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.js'\nimport { renderWidgetHandler } from '../views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.js'\nimport { renderDocumentHandler } from '../views/Document/handleServerFunction.js'\nimport { renderDocumentSlotsHandler } from '../views/Document/renderDocumentSlots.js'\nimport { renderListHandler } from '../views/List/handleServerFunction.js'\nimport { initReq } from './initReq.js'\nimport { slugifyHandler } from './slugify.js'\n\nconst baseServerFunctions: Record<string, ServerFunction<any, any>> = {\n 'copy-data-from-locale': copyDataFromLocaleHandler,\n 'form-state': buildFormStateHandler,\n 'get-default-layout': getDefaultLayoutHandler,\n 'get-folder-results-component-and-data': getFolderResultsComponentAndDataHandler,\n 'render-document': renderDocumentHandler,\n 'render-document-slots': renderDocumentSlotsHandler,\n 'render-field': _internal_renderFieldHandler,\n 'render-list': renderListHandler,\n 'render-widget': renderWidgetHandler,\n 'schedule-publish': schedulePublishHandler,\n slugify: slugifyHandler,\n 'table-state': buildTableStateHandler,\n}\n\nexport const handleServerFunctions: ServerFunctionHandler = async (args) => {\n const {\n name: fnKey,\n args: fnArgs,\n config: configPromise,\n importMap,\n serverFunctions: extraServerFunctions,\n } = args\n\n const { cookies, locale, permissions, req } = await initReq({\n configPromise,\n importMap,\n key: 'RootLayout',\n })\n\n const augmentedArgs: DefaultServerFunctionArgs = {\n ...fnArgs,\n cookies,\n importMap,\n locale,\n permissions,\n req,\n }\n\n const fn = extraServerFunctions?.[fnKey] || baseServerFunctions[fnKey]\n\n if (!fn) {\n throw new Error(`Unknown Server Function: ${fnKey}`)\n }\n\n return fn(augmentedArgs)\n}\n"],"mappings":"AAEA,SAASA,4BAA4B,EAAEC,yBAAyB,QAAQ;AACxE,SAASC,qBAAqB,QAAQ;AACtC,SAASC,sBAAsB,QAAQ;AACvC,SAASC,uCAAuC,QAAQ;AACxD,SAASC,sBAAsB,QAAQ;AAEvC,SAASC,uBAAuB,QAAQ;AACxC,SAASC,mBAAmB,QAAQ;AACpC,SAASC,qBAAqB,QAAQ;AACtC,SAASC,0BAA0B,QAAQ;AAC3C,SAASC,iBAAiB,QAAQ;AAClC,SAASC,OAAO,QAAQ;AACxB,SAASC,cAAc,QAAQ;AAE/B,MAAMC,mBAAA,GAAgE;EACpE,yBAAyBZ,yBAAA;EACzB,cAAcC,qBAAA;EACd,sBAAsBI,uBAAA;EACtB,yCAAyCF,uCAAA;EACzC,mBAAmBI,qBAAA;EACnB,yBAAyBC,0BAAA;EACzB,gBAAgBT,4BAAA;EAChB,eAAeU,iBAAA;EACf,iBAAiBH,mBAAA;EACjB,oBAAoBF,sBAAA;EACpBS,OAAA,EAASF,cAAA;EACT,eAAeT;AACjB;AAEA,OAAO,MAAMY,qBAAA,GAA+C,MAAOC,IAAA;EACjE,MAAM;IACJC,IAAA,EAAMC,KAAK;IACXF,IAAA,EAAMG,MAAM;IACZC,MAAA,EAAQC,aAAa;IACrBC,SAAS;IACTC,eAAA,EAAiBC;EAAoB,CACtC,GAAGR,IAAA;EAEJ,MAAM;IAAES,OAAO;IAAEC,MAAM;IAAEC,WAAW;IAAEC;EAAG,CAAE,GAAG,MAAMjB,OAAA,CAAQ;IAC1DU,aAAA;IACAC,SAAA;IACAO,GAAA,EAAK;EACP;EAEA,MAAMC,aAAA,GAA2C;IAC/C,GAAGX,MAAM;IACTM,OAAA;IACAH,SAAA;IACAI,MAAA;IACAC,WAAA;IACAC;EACF;EAEA,MAAMG,EAAA,GAAKP,oBAAA,GAAuBN,KAAA,CAAM,IAAIL,mBAAmB,CAACK,KAAA,CAAM;EAEtE,IAAI,CAACa,EAAA,EAAI;IACP,MAAM,IAAIC,KAAA,CAAM,4BAA4Bd,KAAA,EAAO;EACrD;EAEA,OAAOa,EAAA,CAAGD,aAAA;AACZ","ignoreList":[]}
@@ -1,15 +1,5 @@
1
- import type { AcceptedLanguages } from '@payloadcms/translations';
2
- import type { ImportMap, Locale, PayloadRequest, SanitizedConfig, SanitizedPermissions } from 'payload';
3
- import { headers as getHeaders } from 'next/headers.js';
1
+ import type { ImportMap, InitReqResult, SanitizedConfig } from 'payload';
4
2
  import { createLocalReq } from 'payload';
5
- type Result = {
6
- cookies: Map<string, string>;
7
- headers: Awaited<ReturnType<typeof getHeaders>>;
8
- languageCode: AcceptedLanguages;
9
- locale?: Locale;
10
- permissions: SanitizedPermissions;
11
- req: PayloadRequest;
12
- };
13
3
  /**
14
4
  * Initializes a full request object, including the `req` object and access control.
15
5
  * As access control and getting the request locale is dependent on the current URL and
@@ -20,6 +10,5 @@ export declare const initReq: ({ canSetHeaders, configPromise, importMap, key, o
20
10
  importMap: ImportMap;
21
11
  key: string;
22
12
  overrides?: Parameters<typeof createLocalReq>[0];
23
- }) => Promise<Result>;
24
- export {};
13
+ }) => Promise<InitReqResult>;
25
14
  //# sourceMappingURL=initReq.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"initReq.d.ts","sourceRoot":"","sources":["../../src/utilities/initReq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,0BAA0B,CAAA;AACnF,OAAO,KAAK,EACV,SAAS,EACT,MAAM,EAEN,cAAc,EACd,eAAe,EACf,oBAAoB,EAErB,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EACL,cAAc,EAMf,MAAM,SAAS,CAAA;AAKhB,KAAK,MAAM,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAA;IAC/C,YAAY,EAAE,iBAAiB,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,oBAAoB,CAAA;IACjC,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAcD;;;GAGG;AACH,eAAO,MAAM,OAAO,iEAMjB;IACD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,aAAa,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IACzD,SAAS,EAAE,SAAS,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;CACjD,KAAG,OAAO,CAAC,MAAM,CA0FjB,CAAA"}
1
+ {"version":3,"file":"initReq.d.ts","sourceRoot":"","sources":["../../src/utilities/initReq.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAkB,eAAe,EAAE,MAAM,SAAS,CAAA;AAIxF,OAAO,EACL,cAAc,EAMf,MAAM,SAAS,CAAA;AAchB;;;GAGG;AACH,eAAO,MAAM,OAAO,iEAMjB;IACD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,aAAa,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IACzD,SAAS,EAAE,SAAS,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;CACjD,KAAG,OAAO,CAAC,aAAa,CA0FxB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"initReq.js","names":["initI18n","headers","getHeaders","createLocalReq","executeAuthStrategies","getAccessResults","getPayload","getRequestLanguage","parseCookies","getRequestLocale","selectiveCache","partialReqCache","reqCache","initReq","canSetHeaders","configPromise","importMap","key","overrides","cookies","partialResult","get","config","payload","cron","languageCode","i18n","context","language","responseHeaders","user","req","reqOverrides","optionsOverrides","host","locale","code","permissions","then","result"],"sources":["../../src/utilities/initReq.ts"],"sourcesContent":["import type { AcceptedLanguages, I18n, I18nClient } from '@payloadcms/translations'\nimport type {\n ImportMap,\n Locale,\n Payload,\n PayloadRequest,\n SanitizedConfig,\n SanitizedPermissions,\n TypedUser,\n} from 'payload'\n\nimport { initI18n } from '@payloadcms/translations'\nimport { headers as getHeaders } from 'next/headers.js'\nimport {\n createLocalReq,\n executeAuthStrategies,\n getAccessResults,\n getPayload,\n getRequestLanguage,\n parseCookies,\n} from 'payload'\n\nimport { getRequestLocale } from './getRequestLocale.js'\nimport { selectiveCache } from './selectiveCache.js'\n\ntype Result = {\n cookies: Map<string, string>\n headers: Awaited<ReturnType<typeof getHeaders>>\n languageCode: AcceptedLanguages\n locale?: Locale\n permissions: SanitizedPermissions\n req: PayloadRequest\n}\n\ntype PartialResult = {\n i18n: I18nClient\n languageCode: AcceptedLanguages\n payload: Payload\n responseHeaders: Headers\n user: null | TypedUser\n}\n\n// Create cache instances for different parts of our application\nconst partialReqCache = selectiveCache<PartialResult>('partialReq')\nconst reqCache = selectiveCache<Result>('req')\n\n/**\n * Initializes a full request object, including the `req` object and access control.\n * As access control and getting the request locale is dependent on the current URL and\n */\nexport const initReq = async function ({\n canSetHeaders,\n configPromise,\n importMap,\n key,\n overrides,\n}: {\n canSetHeaders?: boolean\n configPromise: Promise<SanitizedConfig> | SanitizedConfig\n importMap: ImportMap\n key: string\n overrides?: Parameters<typeof createLocalReq>[0]\n}): Promise<Result> {\n const headers = await getHeaders()\n const cookies = parseCookies(headers)\n\n const partialResult = await partialReqCache.get(async () => {\n const config = await configPromise\n const payload = await getPayload({ config, cron: true, importMap })\n const languageCode = getRequestLanguage({\n config,\n cookies,\n headers,\n })\n\n const i18n: I18nClient = await initI18n({\n config: config.i18n,\n context: 'client',\n language: languageCode,\n })\n\n const { responseHeaders, user } = await executeAuthStrategies({\n canSetHeaders,\n headers,\n payload,\n })\n\n return {\n i18n,\n languageCode,\n payload,\n responseHeaders,\n user,\n }\n }, 'global')\n\n return reqCache\n .get(async () => {\n const { i18n, languageCode, payload, responseHeaders, user } = partialResult\n\n const { req: reqOverrides, ...optionsOverrides } = overrides || {}\n\n const req = await createLocalReq(\n {\n req: {\n headers,\n host: headers.get('host'),\n i18n: i18n as I18n,\n responseHeaders,\n user,\n ...(reqOverrides || {}),\n },\n ...(optionsOverrides || {}),\n },\n payload,\n )\n\n const locale = await getRequestLocale({\n req,\n })\n\n req.locale = locale?.code\n\n const permissions = await getAccessResults({\n req,\n })\n\n return {\n cookies,\n headers,\n languageCode,\n locale,\n permissions,\n req,\n }\n }, key)\n .then((result) => {\n // CRITICAL: Create a shallow copy of req before returning to prevent\n // mutations from propagating to the cached req object.\n // This ensures parallel operations using the same cache key don't affect each other.\n return {\n ...result,\n req: {\n ...result.req,\n ...(result.req?.context\n ? {\n context: { ...result.req.context },\n }\n : {}),\n },\n }\n })\n}\n"],"mappings":"AAWA,SAASA,QAAQ,QAAQ;AACzB,SAASC,OAAA,IAAWC,UAAU,QAAQ;AACtC,SACEC,cAAc,EACdC,qBAAqB,EACrBC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,YAAY,QACP;AAEP,SAASC,gBAAgB,QAAQ;AACjC,SAASC,cAAc,QAAQ;AAmB/B;AACA,MAAMC,eAAA,GAAkBD,cAAA,CAA8B;AACtD,MAAME,QAAA,GAAWF,cAAA,CAAuB;AAExC;;;;AAIA,OAAO,MAAMG,OAAA,GAAU,eAAAA,CAAgB;EACrCC,aAAa;EACbC,aAAa;EACbC,SAAS;EACTC,GAAG;EACHC;AAAS,CAOV;EACC,MAAMjB,OAAA,GAAU,MAAMC,UAAA;EACtB,MAAMiB,OAAA,GAAUX,YAAA,CAAaP,OAAA;EAE7B,MAAMmB,aAAA,GAAgB,MAAMT,eAAA,CAAgBU,GAAG,CAAC;IAC9C,MAAMC,MAAA,GAAS,MAAMP,aAAA;IACrB,MAAMQ,OAAA,GAAU,MAAMjB,UAAA,CAAW;MAAEgB,MAAA;MAAQE,IAAA,EAAM;MAAMR;IAAU;IACjE,MAAMS,YAAA,GAAelB,kBAAA,CAAmB;MACtCe,MAAA;MACAH,OAAA;MACAlB;IACF;IAEA,MAAMyB,IAAA,GAAmB,MAAM1B,QAAA,CAAS;MACtCsB,MAAA,EAAQA,MAAA,CAAOI,IAAI;MACnBC,OAAA,EAAS;MACTC,QAAA,EAAUH;IACZ;IAEA,MAAM;MAAEI,eAAe;MAAEC;IAAI,CAAE,GAAG,MAAM1B,qBAAA,CAAsB;MAC5DU,aAAA;MACAb,OAAA;MACAsB;IACF;IAEA,OAAO;MACLG,IAAA;MACAD,YAAA;MACAF,OAAA;MACAM,eAAA;MACAC;IACF;EACF,GAAG;EAEH,OAAOlB,QAAA,CACJS,GAAG,CAAC;IACH,MAAM;MAAEK,IAAI;MAAED,YAAY;MAAEF,OAAO;MAAEM,eAAe;MAAEC;IAAI,CAAE,GAAGV,aAAA;IAE/D,MAAM;MAAEW,GAAA,EAAKC,YAAY;MAAE,GAAGC;IAAA,CAAkB,GAAGf,SAAA,IAAa,CAAC;IAEjE,MAAMa,GAAA,GAAM,MAAM5B,cAAA,CAChB;MACE4B,GAAA,EAAK;QACH9B,OAAA;QACAiC,IAAA,EAAMjC,OAAA,CAAQoB,GAAG,CAAC;QAClBK,IAAA,EAAMA,IAAA;QACNG,eAAA;QACAC,IAAA;QACA,IAAIE,YAAA,IAAgB,CAAC,CAAC;MACxB;MACA,IAAIC,gBAAA,IAAoB,CAAC,CAAC;IAC5B,GACAV,OAAA;IAGF,MAAMY,MAAA,GAAS,MAAM1B,gBAAA,CAAiB;MACpCsB;IACF;IAEAA,GAAA,CAAII,MAAM,GAAGA,MAAA,EAAQC,IAAA;IAErB,MAAMC,WAAA,GAAc,MAAMhC,gBAAA,CAAiB;MACzC0B;IACF;IAEA,OAAO;MACLZ,OAAA;MACAlB,OAAA;MACAwB,YAAA;MACAU,MAAA;MACAE,WAAA;MACAN;IACF;EACF,GAAGd,GAAA,EACFqB,IAAI,CAAEC,MAAA;IACL;IACA;IACA;IACA,OAAO;MACL,GAAGA,MAAM;MACTR,GAAA,EAAK;QACH,GAAGQ,MAAA,CAAOR,GAAG;QACb,IAAIQ,MAAA,CAAOR,GAAG,EAAEJ,OAAA,GACZ;UACEA,OAAA,EAAS;YAAE,GAAGY,MAAA,CAAOR,GAAG,CAACJ;UAAQ;QACnC,IACA,CAAC,CAAC;MACR;IACF;EACF;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"initReq.js","names":["initI18n","headers","getHeaders","createLocalReq","executeAuthStrategies","getAccessResults","getPayload","getRequestLanguage","parseCookies","getRequestLocale","selectiveCache","partialReqCache","reqCache","initReq","canSetHeaders","configPromise","importMap","key","overrides","cookies","partialResult","get","config","payload","cron","languageCode","i18n","context","language","responseHeaders","user","req","reqOverrides","optionsOverrides","host","locale","code","permissions","then","result"],"sources":["../../src/utilities/initReq.ts"],"sourcesContent":["import type { I18n, I18nClient } from '@payloadcms/translations'\nimport type { ImportMap, InitReqResult, PayloadRequest, SanitizedConfig } from 'payload'\n\nimport { initI18n } from '@payloadcms/translations'\nimport { headers as getHeaders } from 'next/headers.js'\nimport {\n createLocalReq,\n executeAuthStrategies,\n getAccessResults,\n getPayload,\n getRequestLanguage,\n parseCookies,\n} from 'payload'\n\nimport { getRequestLocale } from './getRequestLocale.js'\nimport { selectiveCache } from './selectiveCache.js'\n\ntype PartialResult = {\n i18n: I18nClient\n} & Pick<InitReqResult, 'languageCode'> &\n Pick<PayloadRequest, 'payload' | 'responseHeaders' | 'user'>\n\n// Create cache instances for different parts of our application\nconst partialReqCache = selectiveCache<PartialResult>('partialReq')\nconst reqCache = selectiveCache<InitReqResult>('req')\n\n/**\n * Initializes a full request object, including the `req` object and access control.\n * As access control and getting the request locale is dependent on the current URL and\n */\nexport const initReq = async function ({\n canSetHeaders,\n configPromise,\n importMap,\n key,\n overrides,\n}: {\n canSetHeaders?: boolean\n configPromise: Promise<SanitizedConfig> | SanitizedConfig\n importMap: ImportMap\n key: string\n overrides?: Parameters<typeof createLocalReq>[0]\n}): Promise<InitReqResult> {\n const headers = await getHeaders()\n const cookies = parseCookies(headers)\n\n const partialResult = await partialReqCache.get(async () => {\n const config = await configPromise\n const payload = await getPayload({ config, cron: true, importMap })\n const languageCode = getRequestLanguage({\n config,\n cookies,\n headers,\n })\n\n const i18n: I18nClient = await initI18n({\n config: config.i18n,\n context: 'client',\n language: languageCode,\n })\n\n const { responseHeaders, user } = await executeAuthStrategies({\n canSetHeaders,\n headers,\n payload,\n })\n\n return {\n i18n,\n languageCode,\n payload,\n responseHeaders,\n user,\n }\n }, 'global')\n\n return reqCache\n .get(async () => {\n const { i18n, languageCode, payload, responseHeaders, user } = partialResult\n\n const { req: reqOverrides, ...optionsOverrides } = overrides || {}\n\n const req = await createLocalReq(\n {\n req: {\n headers,\n host: headers.get('host'),\n i18n: i18n as I18n,\n responseHeaders,\n user,\n ...(reqOverrides || {}),\n },\n ...(optionsOverrides || {}),\n },\n payload,\n )\n\n const locale = await getRequestLocale({\n req,\n })\n\n req.locale = locale?.code\n\n const permissions = await getAccessResults({\n req,\n })\n\n return {\n cookies,\n headers,\n languageCode,\n locale,\n permissions,\n req,\n }\n }, key)\n .then((result) => {\n // CRITICAL: Create a shallow copy of req before returning to prevent\n // mutations from propagating to the cached req object.\n // This ensures parallel operations using the same cache key don't affect each other.\n return {\n ...result,\n req: {\n ...result.req,\n ...(result.req?.context\n ? {\n context: { ...result.req.context },\n }\n : {}),\n },\n }\n })\n}\n"],"mappings":"AAGA,SAASA,QAAQ,QAAQ;AACzB,SAASC,OAAA,IAAWC,UAAU,QAAQ;AACtC,SACEC,cAAc,EACdC,qBAAqB,EACrBC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,YAAY,QACP;AAEP,SAASC,gBAAgB,QAAQ;AACjC,SAASC,cAAc,QAAQ;AAO/B;AACA,MAAMC,eAAA,GAAkBD,cAAA,CAA8B;AACtD,MAAME,QAAA,GAAWF,cAAA,CAA8B;AAE/C;;;;AAIA,OAAO,MAAMG,OAAA,GAAU,eAAAA,CAAgB;EACrCC,aAAa;EACbC,aAAa;EACbC,SAAS;EACTC,GAAG;EACHC;AAAS,CAOV;EACC,MAAMjB,OAAA,GAAU,MAAMC,UAAA;EACtB,MAAMiB,OAAA,GAAUX,YAAA,CAAaP,OAAA;EAE7B,MAAMmB,aAAA,GAAgB,MAAMT,eAAA,CAAgBU,GAAG,CAAC;IAC9C,MAAMC,MAAA,GAAS,MAAMP,aAAA;IACrB,MAAMQ,OAAA,GAAU,MAAMjB,UAAA,CAAW;MAAEgB,MAAA;MAAQE,IAAA,EAAM;MAAMR;IAAU;IACjE,MAAMS,YAAA,GAAelB,kBAAA,CAAmB;MACtCe,MAAA;MACAH,OAAA;MACAlB;IACF;IAEA,MAAMyB,IAAA,GAAmB,MAAM1B,QAAA,CAAS;MACtCsB,MAAA,EAAQA,MAAA,CAAOI,IAAI;MACnBC,OAAA,EAAS;MACTC,QAAA,EAAUH;IACZ;IAEA,MAAM;MAAEI,eAAe;MAAEC;IAAI,CAAE,GAAG,MAAM1B,qBAAA,CAAsB;MAC5DU,aAAA;MACAb,OAAA;MACAsB;IACF;IAEA,OAAO;MACLG,IAAA;MACAD,YAAA;MACAF,OAAA;MACAM,eAAA;MACAC;IACF;EACF,GAAG;EAEH,OAAOlB,QAAA,CACJS,GAAG,CAAC;IACH,MAAM;MAAEK,IAAI;MAAED,YAAY;MAAEF,OAAO;MAAEM,eAAe;MAAEC;IAAI,CAAE,GAAGV,aAAA;IAE/D,MAAM;MAAEW,GAAA,EAAKC,YAAY;MAAE,GAAGC;IAAA,CAAkB,GAAGf,SAAA,IAAa,CAAC;IAEjE,MAAMa,GAAA,GAAM,MAAM5B,cAAA,CAChB;MACE4B,GAAA,EAAK;QACH9B,OAAA;QACAiC,IAAA,EAAMjC,OAAA,CAAQoB,GAAG,CAAC;QAClBK,IAAA,EAAMA,IAAA;QACNG,eAAA;QACAC,IAAA;QACA,IAAIE,YAAA,IAAgB,CAAC,CAAC;MACxB;MACA,IAAIC,gBAAA,IAAoB,CAAC,CAAC;IAC5B,GACAV,OAAA;IAGF,MAAMY,MAAA,GAAS,MAAM1B,gBAAA,CAAiB;MACpCsB;IACF;IAEAA,GAAA,CAAII,MAAM,GAAGA,MAAA,EAAQC,IAAA;IAErB,MAAMC,WAAA,GAAc,MAAMhC,gBAAA,CAAiB;MACzC0B;IACF;IAEA,OAAO;MACLZ,OAAA;MACAlB,OAAA;MACAwB,YAAA;MACAU,MAAA;MACAE,WAAA;MACAN;IACF;EACF,GAAGd,GAAA,EACFqB,IAAI,CAAEC,MAAA;IACL;IACA;IACA;IACA,OAAO;MACL,GAAGA,MAAM;MACTR,GAAA,EAAK;QACH,GAAGQ,MAAA,CAAOR,GAAG;QACb,IAAIQ,MAAA,CAAOR,GAAG,EAAEJ,OAAA,GACZ;UACEA,OAAA,EAAS;YAAE,GAAGY,MAAA,CAAOR,GAAG,CAACJ;UAAQ;QACnC,IACA,CAAC,CAAC;MACR;IACF;EACF;AACJ","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"buildView.d.ts","sourceRoot":"","sources":["../../../src/views/BrowseByFolder/buildView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,+BAA+B,EAI/B,SAAS,EACV,MAAM,SAAS,CAAA;AAShB,MAAM,MAAM,mBAAmB,GAAG;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACrC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,KAAK,EAAE,SAAS,CAAA;CACjB,GAAG,oBAAoB,CAAA;AAExB,eAAO,MAAM,uBAAuB,SAC5B,mBAAmB,KACxB,OAAO,CAAC,+BAA+B,CAwMzC,CAAA"}
1
+ {"version":3,"file":"buildView.d.ts","sourceRoot":"","sources":["../../../src/views/BrowseByFolder/buildView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,+BAA+B,EAI/B,SAAS,EACV,MAAM,SAAS,CAAA;AAUhB,MAAM,MAAM,mBAAmB,GAAG;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACrC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,KAAK,EAAE,SAAS,CAAA;CACjB,GAAG,oBAAoB,CAAA;AAExB,eAAO,MAAM,uBAAuB,SAC5B,mBAAmB,KACxB,OAAO,CAAC,+BAA+B,CAwMzC,CAAA"}
@@ -4,6 +4,7 @@ import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerCompo
4
4
  import { getFolderResultsComponentAndData, upsertPreferences } from '@payloadcms/ui/rsc';
5
5
  import { formatAdminURL } from '@payloadcms/ui/shared';
6
6
  import { redirect } from 'next/navigation.js';
7
+ import { PREFERENCE_KEYS } from 'payload/shared';
7
8
  import React from 'react';
8
9
  export const buildBrowseByFolderView = async args => {
9
10
  const {
@@ -69,7 +70,7 @@ export const buildBrowseByFolderView = async args => {
69
70
  * This could potentially be done by injecting a `sessionID` into the params and comparing it against a session cookie
70
71
  */
71
72
  const browseByFolderPreferences = await upsertPreferences({
72
- key: 'browse-by-folder',
73
+ key: PREFERENCE_KEYS.BROWSE_BY_FOLDER,
73
74
  req: initPageResult.req,
74
75
  value: {
75
76
  sort: query?.sort
@@ -1 +1 @@
1
- {"version":3,"file":"buildView.js","names":["DefaultBrowseByFolderView","HydrateAuthProvider","RenderServerComponent","getFolderResultsComponentAndData","upsertPreferences","formatAdminURL","redirect","React","buildBrowseByFolderView","args","browseByFolderSlugs","browseByFolderSlugsFromArgs","disableBulkDelete","disableBulkEdit","enableRowSelections","folderID","initPageResult","isInDrawer","params","query","queryFromArgs","searchParams","locale","fullLocale","permissions","req","i18n","payload","config","queryFromReq","user","visibleEntities","folders","browseByFolder","Error","foldersSlug","slug","allowReadCollectionSlugs","filter","collectionSlug","collections","read","includes","relationTo","JSON","parse","undefined","collectionsToDisplay","Array","isArray","routes","admin","adminRoute","browseByFolderPreferences","key","value","sort","sortPreference","viewPreference","breadcrumbs","documents","folderAssignedCollections","FolderResultsComponent","subfolders","displayAs","resolvedFolderID","length","id","path","serverProps","allAvailableCollectionSlugs","availableActiveCollectionFolderSlugs","allowCreateCollectionSlugs","create","View","_jsxs","_Fragment","_jsx","clientProps","activeCollectionFolderSlugs","allCollectionFolderSlugs","baseFolderPath","folderFieldName","fieldName","Fallback","importMap"],"sources":["../../../src/views/BrowseByFolder/buildView.tsx"],"sourcesContent":["import type {\n AdminViewServerProps,\n BuildCollectionFolderViewResult,\n FolderListViewClientProps,\n FolderListViewServerPropsOnly,\n FolderSortKeys,\n ListQuery,\n} from 'payload'\n\nimport { DefaultBrowseByFolderView, HydrateAuthProvider } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { getFolderResultsComponentAndData, upsertPreferences } from '@payloadcms/ui/rsc'\nimport { formatAdminURL } from '@payloadcms/ui/shared'\nimport { redirect } from 'next/navigation.js'\nimport React from 'react'\n\nexport type BuildFolderViewArgs = {\n customCellProps?: Record<string, any>\n disableBulkDelete?: boolean\n disableBulkEdit?: boolean\n enableRowSelections: boolean\n folderID?: number | string\n isInDrawer?: boolean\n overrideEntityVisibility?: boolean\n query: ListQuery\n} & AdminViewServerProps\n\nexport const buildBrowseByFolderView = async (\n args: BuildFolderViewArgs,\n): Promise<BuildCollectionFolderViewResult> => {\n const {\n browseByFolderSlugs: browseByFolderSlugsFromArgs = [],\n disableBulkDelete,\n disableBulkEdit,\n enableRowSelections,\n folderID,\n initPageResult,\n isInDrawer,\n params,\n query: queryFromArgs,\n searchParams,\n } = args\n\n const {\n locale: fullLocale,\n permissions,\n req: {\n i18n,\n payload,\n payload: { config },\n query: queryFromReq,\n user,\n },\n visibleEntities,\n } = initPageResult\n\n if (config.folders === false || config.folders.browseByFolder === false) {\n throw new Error('not-found')\n }\n\n const foldersSlug = config.folders.slug\n\n /**\n * All visiible folder enabled collection slugs that the user has read permissions for.\n */\n const allowReadCollectionSlugs = browseByFolderSlugsFromArgs.filter(\n (collectionSlug) =>\n permissions?.collections?.[collectionSlug]?.read &&\n visibleEntities.collections.includes(collectionSlug),\n )\n\n const query =\n queryFromArgs ||\n ((queryFromReq\n ? {\n ...queryFromReq,\n relationTo:\n typeof queryFromReq?.relationTo === 'string'\n ? JSON.parse(queryFromReq.relationTo)\n : undefined,\n }\n : {}) as ListQuery)\n\n /**\n * If a folderID is provided and the relationTo query param exists,\n * we filter the collection slugs to only those that are allowed to be read.\n *\n * If no folderID is provided, only folders should be active and displayed (the root view).\n */\n let collectionsToDisplay: string[] = []\n if (folderID && Array.isArray(query?.relationTo)) {\n collectionsToDisplay = query.relationTo.filter(\n (slug) => allowReadCollectionSlugs.includes(slug) || slug === foldersSlug,\n )\n } else if (folderID) {\n collectionsToDisplay = [...allowReadCollectionSlugs, foldersSlug]\n } else {\n collectionsToDisplay = [foldersSlug]\n }\n\n const {\n routes: { admin: adminRoute },\n } = config\n\n /**\n * @todo: find a pattern to avoid setting preferences on hard navigation, i.e. direct links, page refresh, etc.\n * This will ensure that prefs are only updated when explicitly set by the user\n * This could potentially be done by injecting a `sessionID` into the params and comparing it against a session cookie\n */\n const browseByFolderPreferences = await upsertPreferences<{\n sort?: FolderSortKeys\n viewPreference?: 'grid' | 'list'\n }>({\n key: 'browse-by-folder',\n req: initPageResult.req,\n value: {\n sort: query?.sort as FolderSortKeys,\n },\n })\n\n const sortPreference: FolderSortKeys = browseByFolderPreferences?.sort || 'name'\n const viewPreference = browseByFolderPreferences?.viewPreference || 'grid'\n\n const { breadcrumbs, documents, folderAssignedCollections, FolderResultsComponent, subfolders } =\n await getFolderResultsComponentAndData({\n browseByFolder: true,\n collectionsToDisplay,\n displayAs: viewPreference,\n folderAssignedCollections: collectionsToDisplay.filter((slug) => slug !== foldersSlug) || [],\n folderID,\n req: initPageResult.req,\n sort: sortPreference,\n })\n\n const resolvedFolderID = breadcrumbs[breadcrumbs.length - 1]?.id\n\n if (\n !isInDrawer &&\n ((resolvedFolderID && folderID && folderID !== resolvedFolderID) ||\n (folderID && !resolvedFolderID))\n ) {\n redirect(\n formatAdminURL({\n adminRoute,\n path: config.admin.routes.browseByFolder,\n }),\n )\n }\n\n const serverProps: Omit<FolderListViewServerPropsOnly, 'collectionConfig' | 'listPreferences'> = {\n documents,\n i18n,\n locale: fullLocale,\n params,\n payload,\n permissions,\n searchParams,\n subfolders,\n user,\n }\n\n // const folderViewSlots = renderFolderViewSlots({\n // clientProps: {\n // },\n // description: staticDescription,\n // payload,\n // serverProps,\n // })\n\n // Filter down allCollectionFolderSlugs by the ones the current folder is assingned to\n const allAvailableCollectionSlugs =\n folderID && Array.isArray(folderAssignedCollections) && folderAssignedCollections.length\n ? allowReadCollectionSlugs.filter((slug) => folderAssignedCollections.includes(slug))\n : allowReadCollectionSlugs\n\n // Filter down activeCollectionFolderSlugs by the ones the current folder is assingned to\n const availableActiveCollectionFolderSlugs = collectionsToDisplay.filter((slug) => {\n if (slug === foldersSlug) {\n return permissions?.collections?.[foldersSlug]?.read\n } else {\n return !folderAssignedCollections || folderAssignedCollections.includes(slug)\n }\n })\n\n // Documents cannot be created without a parent folder in this view\n const allowCreateCollectionSlugs = (\n resolvedFolderID ? [foldersSlug, ...allAvailableCollectionSlugs] : [foldersSlug]\n ).filter((collectionSlug) => {\n if (collectionSlug === foldersSlug) {\n return permissions?.collections?.[foldersSlug]?.create\n }\n return (\n permissions?.collections?.[collectionSlug]?.create &&\n visibleEntities.collections.includes(collectionSlug)\n )\n })\n\n return {\n View: (\n <>\n <HydrateAuthProvider permissions={permissions} />\n {RenderServerComponent({\n clientProps: {\n // ...folderViewSlots,\n activeCollectionFolderSlugs: availableActiveCollectionFolderSlugs,\n allCollectionFolderSlugs: allAvailableCollectionSlugs,\n allowCreateCollectionSlugs,\n baseFolderPath: `/browse-by-folder`,\n breadcrumbs,\n disableBulkDelete,\n disableBulkEdit,\n documents,\n enableRowSelections,\n folderAssignedCollections,\n folderFieldName: config.folders.fieldName,\n folderID: resolvedFolderID || null,\n FolderResultsComponent,\n sort: sortPreference,\n subfolders,\n viewPreference,\n } satisfies FolderListViewClientProps,\n // Component:config.folders?.components?.views?.BrowseByFolders?.Component,\n Fallback: DefaultBrowseByFolderView,\n importMap: payload.importMap,\n serverProps,\n })}\n </>\n ),\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"buildView.js","names":["DefaultBrowseByFolderView","HydrateAuthProvider","RenderServerComponent","getFolderResultsComponentAndData","upsertPreferences","formatAdminURL","redirect","PREFERENCE_KEYS","React","buildBrowseByFolderView","args","browseByFolderSlugs","browseByFolderSlugsFromArgs","disableBulkDelete","disableBulkEdit","enableRowSelections","folderID","initPageResult","isInDrawer","params","query","queryFromArgs","searchParams","locale","fullLocale","permissions","req","i18n","payload","config","queryFromReq","user","visibleEntities","folders","browseByFolder","Error","foldersSlug","slug","allowReadCollectionSlugs","filter","collectionSlug","collections","read","includes","relationTo","JSON","parse","undefined","collectionsToDisplay","Array","isArray","routes","admin","adminRoute","browseByFolderPreferences","key","BROWSE_BY_FOLDER","value","sort","sortPreference","viewPreference","breadcrumbs","documents","folderAssignedCollections","FolderResultsComponent","subfolders","displayAs","resolvedFolderID","length","id","path","serverProps","allAvailableCollectionSlugs","availableActiveCollectionFolderSlugs","allowCreateCollectionSlugs","create","View","_jsxs","_Fragment","_jsx","clientProps","activeCollectionFolderSlugs","allCollectionFolderSlugs","baseFolderPath","folderFieldName","fieldName","Fallback","importMap"],"sources":["../../../src/views/BrowseByFolder/buildView.tsx"],"sourcesContent":["import type {\n AdminViewServerProps,\n BuildCollectionFolderViewResult,\n FolderListViewClientProps,\n FolderListViewServerPropsOnly,\n FolderSortKeys,\n ListQuery,\n} from 'payload'\n\nimport { DefaultBrowseByFolderView, HydrateAuthProvider } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { getFolderResultsComponentAndData, upsertPreferences } from '@payloadcms/ui/rsc'\nimport { formatAdminURL } from '@payloadcms/ui/shared'\nimport { redirect } from 'next/navigation.js'\nimport { PREFERENCE_KEYS } from 'payload/shared'\nimport React from 'react'\n\nexport type BuildFolderViewArgs = {\n customCellProps?: Record<string, any>\n disableBulkDelete?: boolean\n disableBulkEdit?: boolean\n enableRowSelections: boolean\n folderID?: number | string\n isInDrawer?: boolean\n overrideEntityVisibility?: boolean\n query: ListQuery\n} & AdminViewServerProps\n\nexport const buildBrowseByFolderView = async (\n args: BuildFolderViewArgs,\n): Promise<BuildCollectionFolderViewResult> => {\n const {\n browseByFolderSlugs: browseByFolderSlugsFromArgs = [],\n disableBulkDelete,\n disableBulkEdit,\n enableRowSelections,\n folderID,\n initPageResult,\n isInDrawer,\n params,\n query: queryFromArgs,\n searchParams,\n } = args\n\n const {\n locale: fullLocale,\n permissions,\n req: {\n i18n,\n payload,\n payload: { config },\n query: queryFromReq,\n user,\n },\n visibleEntities,\n } = initPageResult\n\n if (config.folders === false || config.folders.browseByFolder === false) {\n throw new Error('not-found')\n }\n\n const foldersSlug = config.folders.slug\n\n /**\n * All visiible folder enabled collection slugs that the user has read permissions for.\n */\n const allowReadCollectionSlugs = browseByFolderSlugsFromArgs.filter(\n (collectionSlug) =>\n permissions?.collections?.[collectionSlug]?.read &&\n visibleEntities.collections.includes(collectionSlug),\n )\n\n const query =\n queryFromArgs ||\n ((queryFromReq\n ? {\n ...queryFromReq,\n relationTo:\n typeof queryFromReq?.relationTo === 'string'\n ? JSON.parse(queryFromReq.relationTo)\n : undefined,\n }\n : {}) as ListQuery)\n\n /**\n * If a folderID is provided and the relationTo query param exists,\n * we filter the collection slugs to only those that are allowed to be read.\n *\n * If no folderID is provided, only folders should be active and displayed (the root view).\n */\n let collectionsToDisplay: string[] = []\n if (folderID && Array.isArray(query?.relationTo)) {\n collectionsToDisplay = query.relationTo.filter(\n (slug) => allowReadCollectionSlugs.includes(slug) || slug === foldersSlug,\n )\n } else if (folderID) {\n collectionsToDisplay = [...allowReadCollectionSlugs, foldersSlug]\n } else {\n collectionsToDisplay = [foldersSlug]\n }\n\n const {\n routes: { admin: adminRoute },\n } = config\n\n /**\n * @todo: find a pattern to avoid setting preferences on hard navigation, i.e. direct links, page refresh, etc.\n * This will ensure that prefs are only updated when explicitly set by the user\n * This could potentially be done by injecting a `sessionID` into the params and comparing it against a session cookie\n */\n const browseByFolderPreferences = await upsertPreferences<{\n sort?: FolderSortKeys\n viewPreference?: 'grid' | 'list'\n }>({\n key: PREFERENCE_KEYS.BROWSE_BY_FOLDER,\n req: initPageResult.req,\n value: {\n sort: query?.sort as FolderSortKeys,\n },\n })\n\n const sortPreference: FolderSortKeys = browseByFolderPreferences?.sort || 'name'\n const viewPreference = browseByFolderPreferences?.viewPreference || 'grid'\n\n const { breadcrumbs, documents, folderAssignedCollections, FolderResultsComponent, subfolders } =\n await getFolderResultsComponentAndData({\n browseByFolder: true,\n collectionsToDisplay,\n displayAs: viewPreference,\n folderAssignedCollections: collectionsToDisplay.filter((slug) => slug !== foldersSlug) || [],\n folderID,\n req: initPageResult.req,\n sort: sortPreference,\n })\n\n const resolvedFolderID = breadcrumbs[breadcrumbs.length - 1]?.id\n\n if (\n !isInDrawer &&\n ((resolvedFolderID && folderID && folderID !== resolvedFolderID) ||\n (folderID && !resolvedFolderID))\n ) {\n redirect(\n formatAdminURL({\n adminRoute,\n path: config.admin.routes.browseByFolder,\n }),\n )\n }\n\n const serverProps: Omit<FolderListViewServerPropsOnly, 'collectionConfig' | 'listPreferences'> = {\n documents,\n i18n,\n locale: fullLocale,\n params,\n payload,\n permissions,\n searchParams,\n subfolders,\n user,\n }\n\n // const folderViewSlots = renderFolderViewSlots({\n // clientProps: {\n // },\n // description: staticDescription,\n // payload,\n // serverProps,\n // })\n\n // Filter down allCollectionFolderSlugs by the ones the current folder is assingned to\n const allAvailableCollectionSlugs =\n folderID && Array.isArray(folderAssignedCollections) && folderAssignedCollections.length\n ? allowReadCollectionSlugs.filter((slug) => folderAssignedCollections.includes(slug))\n : allowReadCollectionSlugs\n\n // Filter down activeCollectionFolderSlugs by the ones the current folder is assingned to\n const availableActiveCollectionFolderSlugs = collectionsToDisplay.filter((slug) => {\n if (slug === foldersSlug) {\n return permissions?.collections?.[foldersSlug]?.read\n } else {\n return !folderAssignedCollections || folderAssignedCollections.includes(slug)\n }\n })\n\n // Documents cannot be created without a parent folder in this view\n const allowCreateCollectionSlugs = (\n resolvedFolderID ? [foldersSlug, ...allAvailableCollectionSlugs] : [foldersSlug]\n ).filter((collectionSlug) => {\n if (collectionSlug === foldersSlug) {\n return permissions?.collections?.[foldersSlug]?.create\n }\n return (\n permissions?.collections?.[collectionSlug]?.create &&\n visibleEntities.collections.includes(collectionSlug)\n )\n })\n\n return {\n View: (\n <>\n <HydrateAuthProvider permissions={permissions} />\n {RenderServerComponent({\n clientProps: {\n // ...folderViewSlots,\n activeCollectionFolderSlugs: availableActiveCollectionFolderSlugs,\n allCollectionFolderSlugs: allAvailableCollectionSlugs,\n allowCreateCollectionSlugs,\n baseFolderPath: `/browse-by-folder`,\n breadcrumbs,\n disableBulkDelete,\n disableBulkEdit,\n documents,\n enableRowSelections,\n folderAssignedCollections,\n folderFieldName: config.folders.fieldName,\n folderID: resolvedFolderID || null,\n FolderResultsComponent,\n sort: sortPreference,\n subfolders,\n viewPreference,\n } satisfies FolderListViewClientProps,\n // Component:config.folders?.components?.views?.BrowseByFolders?.Component,\n Fallback: DefaultBrowseByFolderView,\n importMap: payload.importMap,\n serverProps,\n })}\n </>\n ),\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAK3D,OAAO,cAAc,CAAA;AAIrB,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,8BA0CrE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/index.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAK3D,OAAO,cAAc,CAAA;AAIrB,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,wBAAwB,8BA6CrE"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
3
+ import { PREFERENCE_KEYS } from 'payload/shared';
3
4
  import React from 'react';
4
5
  import { getPreferences } from '../../../../utilities/getPreferences.js';
5
6
  import { ModularDashboardClient } from './index.client.js';
@@ -15,6 +16,9 @@ export async function ModularDashboard(props) {
15
16
  user
16
17
  } = props;
17
18
  const {
19
+ cookies,
20
+ locale,
21
+ permissions,
18
22
  req
19
23
  } = props.initPageResult;
20
24
  const {
@@ -28,6 +32,9 @@ export async function ModularDashboard(props) {
28
32
  Component: widgets.find(widget => widget.slug === widgetSlug)?.ComponentPath,
29
33
  importMap,
30
34
  serverProps: {
35
+ cookies,
36
+ locale,
37
+ permissions,
31
38
  req,
32
39
  widgetSlug
33
40
  }
@@ -58,7 +65,7 @@ export async function ModularDashboard(props) {
58
65
  });
59
66
  }
60
67
  async function getItemsFromPreferences(payload, user) {
61
- const savedPreferences = await getPreferences('dashboard-layout', payload, user.id, user.collection);
68
+ const savedPreferences = await getPreferences(PREFERENCE_KEYS.DASHBOARD_LAYOUT, payload, user.id, user.collection);
62
69
  if (!savedPreferences?.value || typeof savedPreferences.value !== 'object' || !('layouts' in savedPreferences.value)) {
63
70
  return null;
64
71
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["RenderServerComponent","React","getPreferences","ModularDashboardClient","ModularDashboard","props","defaultLayout","widgets","payload","config","admin","dashboard","importMap","user","req","initPageResult","i18n","layout","getItemsFromPreferences","getItemsFromConfig","serverLayout","map","layoutItem","widgetSlug","id","slice","lastIndexOf","component","Component","find","widget","slug","ComponentPath","serverProps","item","clientWidgets","_","label","rest","t","_jsx","clientLayout","savedPreferences","collection","value","layouts","widgetInstances","widgetInstance","index","maxWidth","minWidth","width"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/index.tsx"],"sourcesContent":["import type { TFunction } from '@payloadcms/translations'\nimport type {\n BasePayload,\n ClientWidget,\n DashboardConfig,\n PayloadRequest,\n TypedUser,\n Widget,\n WidgetInstance,\n WidgetServerProps,\n} from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport React from 'react'\n\nimport type { DashboardViewServerProps } from '../index.js'\nimport type { WidgetInstanceClient, WidgetItem } from './index.client.js'\n\nimport { getPreferences } from '../../../../utilities/getPreferences.js'\nimport { ModularDashboardClient } from './index.client.js'\nimport './index.scss'\n\ntype ServerLayout = WidgetInstanceClient[]\n\nexport async function ModularDashboard(props: DashboardViewServerProps) {\n const { defaultLayout = [], widgets = [] } = props.payload.config.admin.dashboard || {}\n const { importMap } = props.payload\n const { user } = props\n const { req } = props.initPageResult\n const { i18n } = req\n\n const layout =\n (await getItemsFromPreferences(props.payload, user)) ??\n (await getItemsFromConfig(defaultLayout, req, widgets))\n\n const serverLayout: ServerLayout = layout.map((layoutItem) => {\n const widgetSlug = layoutItem.id.slice(0, layoutItem.id.lastIndexOf('-'))\n return {\n component: RenderServerComponent({\n Component: widgets.find((widget) => widget.slug === widgetSlug)?.ComponentPath,\n importMap,\n serverProps: {\n req,\n widgetSlug,\n // TODO: widgets will support state in the future\n // widgetData: layoutItem.data,\n } satisfies WidgetServerProps,\n }),\n item: layoutItem,\n }\n })\n\n // Resolve function labels to static labels for client components\n const clientWidgets: ClientWidget[] = widgets.map((widget) => {\n const { ComponentPath: _, label, ...rest } = widget\n return {\n ...rest,\n label: typeof label === 'function' ? label({ i18n, t: i18n.t as TFunction }) : label,\n }\n })\n\n return (\n <div>\n <ModularDashboardClient clientLayout={serverLayout} widgets={clientWidgets} />\n </div>\n )\n}\n\nasync function getItemsFromPreferences(\n payload: BasePayload,\n user: TypedUser,\n): Promise<null | WidgetItem[]> {\n const savedPreferences = await getPreferences(\n 'dashboard-layout',\n payload,\n user.id,\n user.collection,\n )\n if (\n !savedPreferences?.value ||\n typeof savedPreferences.value !== 'object' ||\n !('layouts' in savedPreferences.value)\n ) {\n return null\n }\n return savedPreferences.value.layouts as null | WidgetItem[]\n}\n\nasync function getItemsFromConfig(\n defaultLayout: NonNullable<DashboardConfig['defaultLayout']>,\n req: PayloadRequest,\n widgets: Widget[],\n): Promise<WidgetItem[]> {\n // Handle function format\n let widgetInstances: WidgetInstance[]\n if (typeof defaultLayout === 'function') {\n widgetInstances = await defaultLayout({ req })\n } else {\n widgetInstances = defaultLayout\n }\n\n return widgetInstances.map((widgetInstance, index) => {\n const widget = widgets.find((widget) => widget.slug === widgetInstance.widgetSlug)\n return {\n id: `${widgetInstance.widgetSlug}-${index}`,\n maxWidth: widget?.maxWidth ?? 'full',\n minWidth: widget?.minWidth ?? 'x-small',\n width: widgetInstance.width || 'x-small',\n }\n })\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["RenderServerComponent","PREFERENCE_KEYS","React","getPreferences","ModularDashboardClient","ModularDashboard","props","defaultLayout","widgets","payload","config","admin","dashboard","importMap","user","cookies","locale","permissions","req","initPageResult","i18n","layout","getItemsFromPreferences","getItemsFromConfig","serverLayout","map","layoutItem","widgetSlug","id","slice","lastIndexOf","component","Component","find","widget","slug","ComponentPath","serverProps","item","clientWidgets","_","label","rest","t","_jsx","clientLayout","savedPreferences","DASHBOARD_LAYOUT","collection","value","layouts","widgetInstances","widgetInstance","index","maxWidth","minWidth","width"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/index.tsx"],"sourcesContent":["import type { TFunction } from '@payloadcms/translations'\nimport type {\n BasePayload,\n ClientWidget,\n DashboardConfig,\n PayloadRequest,\n TypedUser,\n Widget,\n WidgetInstance,\n WidgetServerProps,\n} from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { PREFERENCE_KEYS } from 'payload/shared'\nimport React from 'react'\n\nimport type { DashboardViewServerProps } from '../index.js'\nimport type { WidgetInstanceClient, WidgetItem } from './index.client.js'\n\nimport { getPreferences } from '../../../../utilities/getPreferences.js'\nimport { ModularDashboardClient } from './index.client.js'\nimport './index.scss'\n\ntype ServerLayout = WidgetInstanceClient[]\n\nexport async function ModularDashboard(props: DashboardViewServerProps) {\n const { defaultLayout = [], widgets = [] } = props.payload.config.admin.dashboard || {}\n const { importMap } = props.payload\n const { user } = props\n const { cookies, locale, permissions, req } = props.initPageResult\n const { i18n } = req\n\n const layout =\n (await getItemsFromPreferences(props.payload, user)) ??\n (await getItemsFromConfig(defaultLayout, req, widgets))\n\n const serverLayout: ServerLayout = layout.map((layoutItem) => {\n const widgetSlug = layoutItem.id.slice(0, layoutItem.id.lastIndexOf('-'))\n return {\n component: RenderServerComponent({\n Component: widgets.find((widget) => widget.slug === widgetSlug)?.ComponentPath,\n importMap,\n serverProps: {\n cookies,\n locale,\n permissions,\n req,\n widgetSlug,\n // TODO: widgets will support state in the future\n // widgetData: layoutItem.data,\n } satisfies WidgetServerProps,\n }),\n item: layoutItem,\n }\n })\n\n // Resolve function labels to static labels for client components\n const clientWidgets: ClientWidget[] = widgets.map((widget) => {\n const { ComponentPath: _, label, ...rest } = widget\n return {\n ...rest,\n label: typeof label === 'function' ? label({ i18n, t: i18n.t as TFunction }) : label,\n }\n })\n\n return (\n <div>\n <ModularDashboardClient clientLayout={serverLayout} widgets={clientWidgets} />\n </div>\n )\n}\n\nasync function getItemsFromPreferences(\n payload: BasePayload,\n user: TypedUser,\n): Promise<null | WidgetItem[]> {\n const savedPreferences = await getPreferences(\n PREFERENCE_KEYS.DASHBOARD_LAYOUT,\n payload,\n user.id,\n user.collection,\n )\n if (\n !savedPreferences?.value ||\n typeof savedPreferences.value !== 'object' ||\n !('layouts' in savedPreferences.value)\n ) {\n return null\n }\n return savedPreferences.value.layouts as null | WidgetItem[]\n}\n\nasync function getItemsFromConfig(\n defaultLayout: NonNullable<DashboardConfig['defaultLayout']>,\n req: PayloadRequest,\n widgets: Widget[],\n): Promise<WidgetItem[]> {\n // Handle function format\n let widgetInstances: WidgetInstance[]\n if (typeof defaultLayout === 'function') {\n widgetInstances = await defaultLayout({ req })\n } else {\n widgetInstances = defaultLayout\n }\n\n return widgetInstances.map((widgetInstance, index) => {\n const widget = widgets.find((widget) => widget.slug === widgetInstance.widgetSlug)\n return {\n id: `${widgetInstance.widgetSlug}-${index}`,\n maxWidth: widget?.maxWidth ?? 'full',\n minWidth: widget?.minWidth ?? 'x-small',\n width: widgetInstance.width || 'x-small',\n }\n })\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"getDefaultLayoutServerFn.d.ts","sourceRoot":"","sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAGf,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,oBAAoB,CAAA;AAE1E,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAEhE,MAAM,MAAM,kCAAkC,GAAG;IAC/C,MAAM,EAAE,oBAAoB,EAAE,CAAA;CAC/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAAc,CAClD,4BAA4B,EAC5B,OAAO,CAAC,kCAAkC,CAAC,CA2B5C,CAAA"}
1
+ {"version":3,"file":"getDefaultLayoutServerFn.d.ts","sourceRoot":"","sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAGf,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,oBAAoB,CAAA;AAE1E,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAEhE,MAAM,MAAM,kCAAkC,GAAG;IAC/C,MAAM,EAAE,oBAAoB,EAAE,CAAA;CAC/B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,cAAc,CAClD,4BAA4B,EAC5B,OAAO,CAAC,kCAAkC,CAAC,CA8B5C,CAAA"}
@@ -4,6 +4,9 @@ import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerCompo
4
4
  * Used when resetting the dashboard to its default configuration.
5
5
  */
6
6
  export const getDefaultLayoutHandler = async ({
7
+ cookies,
8
+ locale,
9
+ permissions,
7
10
  req
8
11
  }) => {
9
12
  if (!req.user) {
@@ -24,6 +27,9 @@ export const getDefaultLayoutHandler = async ({
24
27
  Component: widgets.find(widget => widget.slug === widgetSlug)?.ComponentPath,
25
28
  importMap,
26
29
  serverProps: {
30
+ cookies,
31
+ locale,
32
+ permissions,
27
33
  req,
28
34
  widgetSlug
29
35
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getDefaultLayoutServerFn.js","names":["RenderServerComponent","getDefaultLayoutHandler","req","user","Error","defaultLayout","widgets","payload","config","admin","dashboard","importMap","layoutItems","getItemsFromConfig","layout","map","layoutItem","widgetSlug","id","slice","lastIndexOf","component","Component","find","widget","slug","ComponentPath","serverProps","item","widgetInstances","widgetInstance","index","w","maxWidth","minWidth","width"],"sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.ts"],"sourcesContent":["import type {\n DashboardConfig,\n PayloadRequest,\n ServerFunction,\n Widget,\n WidgetServerProps,\n} from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\n\nimport type { WidgetInstanceClient, WidgetItem } from '../index.client.js'\n\nexport type GetDefaultLayoutServerFnArgs = Record<string, never>\n\nexport type GetDefaultLayoutServerFnReturnType = {\n layout: WidgetInstanceClient[]\n}\n\n/**\n * Server function to get the default dashboard layout on-demand.\n * Used when resetting the dashboard to its default configuration.\n */\nexport const getDefaultLayoutHandler: ServerFunction<\n GetDefaultLayoutServerFnArgs,\n Promise<GetDefaultLayoutServerFnReturnType>\n> = async ({ req }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const { defaultLayout = [], widgets = [] } = req.payload.config.admin.dashboard || {}\n const { importMap } = req.payload\n\n const layoutItems = await getItemsFromConfig(defaultLayout, req, widgets)\n\n const layout: WidgetInstanceClient[] = layoutItems.map((layoutItem) => {\n const widgetSlug = layoutItem.id.slice(0, layoutItem.id.lastIndexOf('-'))\n return {\n component: RenderServerComponent({\n Component: widgets.find((widget) => widget.slug === widgetSlug)?.ComponentPath,\n importMap,\n serverProps: {\n req,\n widgetSlug,\n } satisfies WidgetServerProps,\n }),\n item: layoutItem,\n }\n })\n\n return { layout }\n}\n\nasync function getItemsFromConfig(\n defaultLayout: NonNullable<DashboardConfig['defaultLayout']>,\n req: PayloadRequest,\n widgets: Widget[],\n): Promise<WidgetItem[]> {\n // Handle function format\n let widgetInstances\n if (typeof defaultLayout === 'function') {\n widgetInstances = await defaultLayout({ req })\n } else {\n widgetInstances = defaultLayout\n }\n\n return widgetInstances.map((widgetInstance, index) => {\n const widget = widgets.find((w) => w.slug === widgetInstance.widgetSlug)\n return {\n id: `${widgetInstance.widgetSlug}-${index}`,\n maxWidth: widget?.maxWidth ?? 'full',\n minWidth: widget?.minWidth ?? 'x-small',\n width: widgetInstance.width || 'x-small',\n }\n })\n}\n"],"mappings":"AAQA,SAASA,qBAAqB,QAAQ;AAUtC;;;;AAIA,OAAO,MAAMC,uBAAA,GAGT,MAAAA,CAAO;EAAEC;AAAG,CAAE;EAChB,IAAI,CAACA,GAAA,CAAIC,IAAI,EAAE;IACb,MAAM,IAAIC,KAAA,CAAM;EAClB;EAEA,MAAM;IAAEC,aAAA,GAAgB,EAAE;IAAEC,OAAA,GAAU;EAAE,CAAE,GAAGJ,GAAA,CAAIK,OAAO,CAACC,MAAM,CAACC,KAAK,CAACC,SAAS,IAAI,CAAC;EACpF,MAAM;IAAEC;EAAS,CAAE,GAAGT,GAAA,CAAIK,OAAO;EAEjC,MAAMK,WAAA,GAAc,MAAMC,kBAAA,CAAmBR,aAAA,EAAeH,GAAA,EAAKI,OAAA;EAEjE,MAAMQ,MAAA,GAAiCF,WAAA,CAAYG,GAAG,CAAEC,UAAA;IACtD,MAAMC,UAAA,GAAaD,UAAA,CAAWE,EAAE,CAACC,KAAK,CAAC,GAAGH,UAAA,CAAWE,EAAE,CAACE,WAAW,CAAC;IACpE,OAAO;MACLC,SAAA,EAAWrB,qBAAA,CAAsB;QAC/BsB,SAAA,EAAWhB,OAAA,CAAQiB,IAAI,CAAEC,MAAA,IAAWA,MAAA,CAAOC,IAAI,KAAKR,UAAA,GAAaS,aAAA;QACjEf,SAAA;QACAgB,WAAA,EAAa;UACXzB,GAAA;UACAe;QACF;MACF;MACAW,IAAA,EAAMZ;IACR;EACF;EAEA,OAAO;IAAEF;EAAO;AAClB;AAEA,eAAeD,mBACbR,aAA4D,EAC5DH,GAAmB,EACnBI,OAAiB;EAEjB;EACA,IAAIuB,eAAA;EACJ,IAAI,OAAOxB,aAAA,KAAkB,YAAY;IACvCwB,eAAA,GAAkB,MAAMxB,aAAA,CAAc;MAAEH;IAAI;EAC9C,OAAO;IACL2B,eAAA,GAAkBxB,aAAA;EACpB;EAEA,OAAOwB,eAAA,CAAgBd,GAAG,CAAC,CAACe,cAAA,EAAgBC,KAAA;IAC1C,MAAMP,MAAA,GAASlB,OAAA,CAAQiB,IAAI,CAAES,CAAA,IAAMA,CAAA,CAAEP,IAAI,KAAKK,cAAA,CAAeb,UAAU;IACvE,OAAO;MACLC,EAAA,EAAI,GAAGY,cAAA,CAAeb,UAAU,IAAIc,KAAA,EAAO;MAC3CE,QAAA,EAAUT,MAAA,EAAQS,QAAA,IAAY;MAC9BC,QAAA,EAAUV,MAAA,EAAQU,QAAA,IAAY;MAC9BC,KAAA,EAAOL,cAAA,CAAeK,KAAK,IAAI;IACjC;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"getDefaultLayoutServerFn.js","names":["RenderServerComponent","getDefaultLayoutHandler","cookies","locale","permissions","req","user","Error","defaultLayout","widgets","payload","config","admin","dashboard","importMap","layoutItems","getItemsFromConfig","layout","map","layoutItem","widgetSlug","id","slice","lastIndexOf","component","Component","find","widget","slug","ComponentPath","serverProps","item","widgetInstances","widgetInstance","index","w","maxWidth","minWidth","width"],"sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/getDefaultLayoutServerFn.ts"],"sourcesContent":["import type {\n DashboardConfig,\n PayloadRequest,\n ServerFunction,\n Widget,\n WidgetServerProps,\n} from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\n\nimport type { WidgetInstanceClient, WidgetItem } from '../index.client.js'\n\nexport type GetDefaultLayoutServerFnArgs = Record<string, never>\n\nexport type GetDefaultLayoutServerFnReturnType = {\n layout: WidgetInstanceClient[]\n}\n\n/**\n * Server function to get the default dashboard layout on-demand.\n * Used when resetting the dashboard to its default configuration.\n */\nexport const getDefaultLayoutHandler: ServerFunction<\n GetDefaultLayoutServerFnArgs,\n Promise<GetDefaultLayoutServerFnReturnType>\n> = async ({ cookies, locale, permissions, req }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const { defaultLayout = [], widgets = [] } = req.payload.config.admin.dashboard || {}\n const { importMap } = req.payload\n\n const layoutItems = await getItemsFromConfig(defaultLayout, req, widgets)\n\n const layout: WidgetInstanceClient[] = layoutItems.map((layoutItem) => {\n const widgetSlug = layoutItem.id.slice(0, layoutItem.id.lastIndexOf('-'))\n return {\n component: RenderServerComponent({\n Component: widgets.find((widget) => widget.slug === widgetSlug)?.ComponentPath,\n importMap,\n serverProps: {\n cookies,\n locale,\n permissions,\n req,\n widgetSlug,\n } satisfies WidgetServerProps,\n }),\n item: layoutItem,\n }\n })\n\n return { layout }\n}\n\nasync function getItemsFromConfig(\n defaultLayout: NonNullable<DashboardConfig['defaultLayout']>,\n req: PayloadRequest,\n widgets: Widget[],\n): Promise<WidgetItem[]> {\n // Handle function format\n let widgetInstances\n if (typeof defaultLayout === 'function') {\n widgetInstances = await defaultLayout({ req })\n } else {\n widgetInstances = defaultLayout\n }\n\n return widgetInstances.map((widgetInstance, index) => {\n const widget = widgets.find((w) => w.slug === widgetInstance.widgetSlug)\n return {\n id: `${widgetInstance.widgetSlug}-${index}`,\n maxWidth: widget?.maxWidth ?? 'full',\n minWidth: widget?.minWidth ?? 'x-small',\n width: widgetInstance.width || 'x-small',\n }\n })\n}\n"],"mappings":"AAQA,SAASA,qBAAqB,QAAQ;AAUtC;;;;AAIA,OAAO,MAAMC,uBAAA,GAGT,MAAAA,CAAO;EAAEC,OAAO;EAAEC,MAAM;EAAEC,WAAW;EAAEC;AAAG,CAAE;EAC9C,IAAI,CAACA,GAAA,CAAIC,IAAI,EAAE;IACb,MAAM,IAAIC,KAAA,CAAM;EAClB;EAEA,MAAM;IAAEC,aAAA,GAAgB,EAAE;IAAEC,OAAA,GAAU;EAAE,CAAE,GAAGJ,GAAA,CAAIK,OAAO,CAACC,MAAM,CAACC,KAAK,CAACC,SAAS,IAAI,CAAC;EACpF,MAAM;IAAEC;EAAS,CAAE,GAAGT,GAAA,CAAIK,OAAO;EAEjC,MAAMK,WAAA,GAAc,MAAMC,kBAAA,CAAmBR,aAAA,EAAeH,GAAA,EAAKI,OAAA;EAEjE,MAAMQ,MAAA,GAAiCF,WAAA,CAAYG,GAAG,CAAEC,UAAA;IACtD,MAAMC,UAAA,GAAaD,UAAA,CAAWE,EAAE,CAACC,KAAK,CAAC,GAAGH,UAAA,CAAWE,EAAE,CAACE,WAAW,CAAC;IACpE,OAAO;MACLC,SAAA,EAAWxB,qBAAA,CAAsB;QAC/ByB,SAAA,EAAWhB,OAAA,CAAQiB,IAAI,CAAEC,MAAA,IAAWA,MAAA,CAAOC,IAAI,KAAKR,UAAA,GAAaS,aAAA;QACjEf,SAAA;QACAgB,WAAA,EAAa;UACX5B,OAAA;UACAC,MAAA;UACAC,WAAA;UACAC,GAAA;UACAe;QACF;MACF;MACAW,IAAA,EAAMZ;IACR;EACF;EAEA,OAAO;IAAEF;EAAO;AAClB;AAEA,eAAeD,mBACbR,aAA4D,EAC5DH,GAAmB,EACnBI,OAAiB;EAEjB;EACA,IAAIuB,eAAA;EACJ,IAAI,OAAOxB,aAAA,KAAkB,YAAY;IACvCwB,eAAA,GAAkB,MAAMxB,aAAA,CAAc;MAAEH;IAAI;EAC9C,OAAO;IACL2B,eAAA,GAAkBxB,aAAA;EACpB;EAEA,OAAOwB,eAAA,CAAgBd,GAAG,CAAC,CAACe,cAAA,EAAgBC,KAAA;IAC1C,MAAMP,MAAA,GAASlB,OAAA,CAAQiB,IAAI,CAAES,CAAA,IAAMA,CAAA,CAAEP,IAAI,KAAKK,cAAA,CAAeb,UAAU;IACvE,OAAO;MACLC,EAAA,EAAI,GAAGY,cAAA,CAAeb,UAAU,IAAIc,KAAA,EAAO;MAC3CE,QAAA,EAAUT,MAAA,EAAQS,QAAA,IAAY;MAC9BC,QAAA,EAAUV,MAAA,EAAQU,QAAA,IAAY;MAC9BC,KAAA,EAAOL,cAAA,CAAeK,KAAK,IAAI;IACjC;EACF;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"renderWidgetServerFn.d.ts","sourceRoot":"","sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,SAAS,CAAA;AAGhE,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IAGH;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,SAAS,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,cAAc,CAC9C,wBAAwB,EACxB,8BAA8B,CAwE/B,CAAA"}
1
+ {"version":3,"file":"renderWidgetServerFn.d.ts","sourceRoot":"","sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAqB,MAAM,SAAS,CAAA;AAGhE,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,MAAM,wBAAwB,GAAG;IACrC;;OAEG;IAGH;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,8BAA8B,GAAG;IAC3C,SAAS,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,cAAc,CAC9C,wBAAwB,EACxB,8BAA8B,CA2E/B,CAAA"}
@@ -5,8 +5,11 @@ import React from 'react';
5
5
  * Similar to render-field but specifically for dashboard widgets.
6
6
  */
7
7
  export const renderWidgetHandler = ({
8
+ cookies,
9
+ locale,
10
+ permissions,
8
11
  req,
9
- /* widgetData, */widgetSlug
12
+ widgetSlug
10
13
  }) => {
11
14
  if (!req.user) {
12
15
  throw new Error('Unauthorized');
@@ -38,6 +41,9 @@ export const renderWidgetHandler = ({
38
41
  const serverProps = {
39
42
  req,
40
43
  // TODO: widgetData: widgetData || {},
44
+ cookies,
45
+ locale,
46
+ permissions,
41
47
  widgetSlug
42
48
  };
43
49
  // Render the widget server component
@@ -1 +1 @@
1
- {"version":3,"file":"renderWidgetServerFn.js","names":["RenderServerComponent","React","renderWidgetHandler","req","widgetSlug","user","Error","widgets","payload","config","admin","dashboard","importMap","widgetConfig","find","widget","slug","component","createElement","style","background","border","borderRadius","color","padding","textAlign","serverProps","Component","ComponentPath","error","errorMessage","message","String","logger","err","msg"],"sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.ts"],"sourcesContent":["import type { ServerFunction, WidgetServerProps } from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport React from 'react'\n\nexport type RenderWidgetServerFnArgs = {\n /**\n * Instance-specific data for this widget\n */\n // TODO: widgets will support state in the future\n // widgetData?: Record<string, unknown>\n /**\n * The slug of the widget to render\n */\n widgetSlug: string\n}\n\nexport type RenderWidgetServerFnReturnType = {\n component: React.ReactNode\n}\n\n/**\n * Server function to render a widget on-demand.\n * Similar to render-field but specifically for dashboard widgets.\n */\nexport const renderWidgetHandler: ServerFunction<\n RenderWidgetServerFnArgs,\n RenderWidgetServerFnReturnType\n> = ({ req, /* widgetData, */ widgetSlug }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const { widgets } = req.payload.config.admin.dashboard\n const { importMap } = req.payload\n\n // Find the widget configuration\n const widgetConfig = widgets.find((widget) => widget.slug === widgetSlug)\n\n if (!widgetConfig) {\n return {\n component: React.createElement(\n 'div',\n {\n style: {\n background: 'var(--theme-elevation-50)',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: '4px',\n color: 'var(--theme-text)',\n padding: '20px',\n textAlign: 'center',\n },\n },\n `Widget \"${widgetSlug}\" not found`,\n ),\n }\n }\n\n try {\n // Create server props for the widget\n const serverProps: WidgetServerProps = {\n req,\n // TODO: widgetData: widgetData || {},\n widgetSlug,\n }\n\n // Render the widget server component\n const component = RenderServerComponent({\n Component: widgetConfig.ComponentPath,\n importMap,\n serverProps,\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 widget \"${widgetSlug}\": ${errorMessage}`,\n })\n\n return {\n component: React.createElement(\n 'div',\n {\n style: {\n background: 'var(--theme-error-50)',\n border: '1px solid var(--theme-error-200)',\n borderRadius: '4px',\n color: 'var(--theme-error-text)',\n padding: '20px',\n textAlign: 'center',\n },\n },\n 'Error loading widget',\n ),\n }\n }\n}\n"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ;AACtC,OAAOC,KAAA,MAAW;AAkBlB;;;;AAIA,OAAO,MAAMC,mBAAA,GAGTA,CAAC;EAAEC,GAAG;EAAE,iBAAkBC;AAAU,CAAE;EACxC,IAAI,CAACD,GAAA,CAAIE,IAAI,EAAE;IACb,MAAM,IAAIC,KAAA,CAAM;EAClB;EAEA,MAAM;IAAEC;EAAO,CAAE,GAAGJ,GAAA,CAAIK,OAAO,CAACC,MAAM,CAACC,KAAK,CAACC,SAAS;EACtD,MAAM;IAAEC;EAAS,CAAE,GAAGT,GAAA,CAAIK,OAAO;EAEjC;EACA,MAAMK,YAAA,GAAeN,OAAA,CAAQO,IAAI,CAAEC,MAAA,IAAWA,MAAA,CAAOC,IAAI,KAAKZ,UAAA;EAE9D,IAAI,CAACS,YAAA,EAAc;IACjB,OAAO;MACLI,SAAA,EAAWhB,KAAA,CAAMiB,aAAa,CAC5B,OACA;QACEC,KAAA,EAAO;UACLC,UAAA,EAAY;UACZC,MAAA,EAAQ;UACRC,YAAA,EAAc;UACdC,KAAA,EAAO;UACPC,OAAA,EAAS;UACTC,SAAA,EAAW;QACb;MACF,GACA,WAAWrB,UAAA,aAAuB;IAEtC;EACF;EAEA,IAAI;IACF;IACA,MAAMsB,WAAA,GAAiC;MACrCvB,GAAA;MACA;MACAC;IACF;IAEA;IACA,MAAMa,SAAA,GAAYjB,qBAAA,CAAsB;MACtC2B,SAAA,EAAWd,YAAA,CAAae,aAAa;MACrChB,SAAA;MACAc;IACF;IAEA,OAAO;MAAET;IAAU;EACrB,EAAE,OAAOY,KAAA,EAAO;IACd,MAAMC,YAAA,GAAeD,KAAA,YAAiBvB,KAAA,GAAQuB,KAAA,CAAME,OAAO,GAAGC,MAAA,CAAOH,KAAA;IAErE1B,GAAA,CAAIK,OAAO,CAACyB,MAAM,CAACJ,KAAK,CAAC;MACvBK,GAAA,EAAKL,KAAA;MACLM,GAAA,EAAK,2BAA2B/B,UAAA,MAAgB0B,YAAA;IAClD;IAEA,OAAO;MACLb,SAAA,EAAWhB,KAAA,CAAMiB,aAAa,CAC5B,OACA;QACEC,KAAA,EAAO;UACLC,UAAA,EAAY;UACZC,MAAA,EAAQ;UACRC,YAAA,EAAc;UACdC,KAAA,EAAO;UACPC,OAAA,EAAS;UACTC,SAAA,EAAW;QACb;MACF,GACA;IAEJ;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"renderWidgetServerFn.js","names":["RenderServerComponent","React","renderWidgetHandler","cookies","locale","permissions","req","widgetSlug","user","Error","widgets","payload","config","admin","dashboard","importMap","widgetConfig","find","widget","slug","component","createElement","style","background","border","borderRadius","color","padding","textAlign","serverProps","Component","ComponentPath","error","errorMessage","message","String","logger","err","msg"],"sources":["../../../../../../src/views/Dashboard/Default/ModularDashboard/renderWidget/renderWidgetServerFn.ts"],"sourcesContent":["import type { ServerFunction, WidgetServerProps } from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport React from 'react'\n\nexport type RenderWidgetServerFnArgs = {\n /**\n * Instance-specific data for this widget\n */\n // TODO: widgets will support state in the future\n // widgetData?: Record<string, unknown>\n /**\n * The slug of the widget to render\n */\n widgetSlug: string\n}\n\nexport type RenderWidgetServerFnReturnType = {\n component: React.ReactNode\n}\n\n/**\n * Server function to render a widget on-demand.\n * Similar to render-field but specifically for dashboard widgets.\n */\nexport const renderWidgetHandler: ServerFunction<\n RenderWidgetServerFnArgs,\n RenderWidgetServerFnReturnType\n> = ({ cookies, locale, permissions, req, widgetSlug }) => {\n if (!req.user) {\n throw new Error('Unauthorized')\n }\n\n const { widgets } = req.payload.config.admin.dashboard\n const { importMap } = req.payload\n\n // Find the widget configuration\n const widgetConfig = widgets.find((widget) => widget.slug === widgetSlug)\n\n if (!widgetConfig) {\n return {\n component: React.createElement(\n 'div',\n {\n style: {\n background: 'var(--theme-elevation-50)',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: '4px',\n color: 'var(--theme-text)',\n padding: '20px',\n textAlign: 'center',\n },\n },\n `Widget \"${widgetSlug}\" not found`,\n ),\n }\n }\n\n try {\n // Create server props for the widget\n const serverProps: WidgetServerProps = {\n req,\n // TODO: widgetData: widgetData || {},\n cookies,\n locale,\n permissions,\n widgetSlug,\n }\n\n // Render the widget server component\n const component = RenderServerComponent({\n Component: widgetConfig.ComponentPath,\n importMap,\n serverProps,\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 widget \"${widgetSlug}\": ${errorMessage}`,\n })\n\n return {\n component: React.createElement(\n 'div',\n {\n style: {\n background: 'var(--theme-error-50)',\n border: '1px solid var(--theme-error-200)',\n borderRadius: '4px',\n color: 'var(--theme-error-text)',\n padding: '20px',\n textAlign: 'center',\n },\n },\n 'Error loading widget',\n ),\n }\n }\n}\n"],"mappings":"AAEA,SAASA,qBAAqB,QAAQ;AACtC,OAAOC,KAAA,MAAW;AAkBlB;;;;AAIA,OAAO,MAAMC,mBAAA,GAGTA,CAAC;EAAEC,OAAO;EAAEC,MAAM;EAAEC,WAAW;EAAEC,GAAG;EAAEC;AAAU,CAAE;EACpD,IAAI,CAACD,GAAA,CAAIE,IAAI,EAAE;IACb,MAAM,IAAIC,KAAA,CAAM;EAClB;EAEA,MAAM;IAAEC;EAAO,CAAE,GAAGJ,GAAA,CAAIK,OAAO,CAACC,MAAM,CAACC,KAAK,CAACC,SAAS;EACtD,MAAM;IAAEC;EAAS,CAAE,GAAGT,GAAA,CAAIK,OAAO;EAEjC;EACA,MAAMK,YAAA,GAAeN,OAAA,CAAQO,IAAI,CAAEC,MAAA,IAAWA,MAAA,CAAOC,IAAI,KAAKZ,UAAA;EAE9D,IAAI,CAACS,YAAA,EAAc;IACjB,OAAO;MACLI,SAAA,EAAWnB,KAAA,CAAMoB,aAAa,CAC5B,OACA;QACEC,KAAA,EAAO;UACLC,UAAA,EAAY;UACZC,MAAA,EAAQ;UACRC,YAAA,EAAc;UACdC,KAAA,EAAO;UACPC,OAAA,EAAS;UACTC,SAAA,EAAW;QACb;MACF,GACA,WAAWrB,UAAA,aAAuB;IAEtC;EACF;EAEA,IAAI;IACF;IACA,MAAMsB,WAAA,GAAiC;MACrCvB,GAAA;MACA;MACAH,OAAA;MACAC,MAAA;MACAC,WAAA;MACAE;IACF;IAEA;IACA,MAAMa,SAAA,GAAYpB,qBAAA,CAAsB;MACtC8B,SAAA,EAAWd,YAAA,CAAae,aAAa;MACrChB,SAAA;MACAc;IACF;IAEA,OAAO;MAAET;IAAU;EACrB,EAAE,OAAOY,KAAA,EAAO;IACd,MAAMC,YAAA,GAAeD,KAAA,YAAiBvB,KAAA,GAAQuB,KAAA,CAAME,OAAO,GAAGC,MAAA,CAAOH,KAAA;IAErE1B,GAAA,CAAIK,OAAO,CAACyB,MAAM,CAACJ,KAAK,CAAC;MACvBK,GAAA,EAAKL,KAAA;MACLM,GAAA,EAAK,2BAA2B/B,UAAA,MAAgB0B,YAAA;IAClD;IAEA,OAAO;MACLb,SAAA,EAAWnB,KAAA,CAAMoB,aAAa,CAC5B,OACA;QACEC,KAAA,EAAO;UACLC,UAAA,EAAY;UACZC,MAAA,EAAQ;UACRC,YAAA,EAAc;UACdC,KAAA,EAAO;UACPC,OAAA,EAAS;UACTC,SAAA,EAAW;QACb;MACF,GACA;IAEJ;EACF;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useDashboardLayout.d.ts","sourceRoot":"","sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/useDashboardLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAW1C,OAAO,KAAgC,MAAM,OAAO,CAAA;AAEpD,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,mBAAmB,CAAA;AAKzE,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,oBAAoB,EAAE;4BA4EvD,MAAM;;;;6BAiDR,MAAM;;iDA9DgB;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;;6BAwEpE,MAAM,YAAY,WAAW;;;EA0C3C"}
1
+ {"version":3,"file":"useDashboardLayout.d.ts","sourceRoot":"","sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/useDashboardLayout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAY1C,OAAO,KAA2C,MAAM,OAAO,CAAA;AAE/D,OAAO,KAAK,EAAE,oBAAoB,EAAc,MAAM,mBAAmB,CAAA;AAKzE,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,oBAAoB,EAAE;4BAmFvD,MAAM;;;;6BAiDR,MAAM;;iDA9DgB;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE;;6BAwEpE,MAAM,YAAY,WAAW;;;EA0C3C"}
@@ -1,6 +1,7 @@
1
1
  import { arrayMove } from '@dnd-kit/sortable';
2
2
  import { ConfirmationModal, toast, useConfig, useModal, usePreferences, useServerFunctions } from '@payloadcms/ui';
3
- import React, { useCallback, useState } from 'react';
3
+ import { PREFERENCE_KEYS } from 'payload/shared';
4
+ import React, { useCallback, useEffect, useState } from 'react';
4
5
  import { RenderWidget } from './renderWidget/RenderWidget.js';
5
6
  export function useDashboardLayout(initialLayout) {
6
7
  const setLayoutPreference = useSetLayoutPreference();
@@ -16,6 +17,12 @@ export function useDashboardLayout(initialLayout) {
16
17
  const {
17
18
  serverFunction
18
19
  } = useServerFunctions();
20
+ // Sync state when initialLayout prop changes (e.g., when query params change and server component re-renders)
21
+ useEffect(() => {
22
+ if (!isEditing) {
23
+ setCurrentLayout(initialLayout);
24
+ }
25
+ }, [initialLayout, isEditing]);
19
26
  const saveLayout = useCallback(async () => {
20
27
  try {
21
28
  const layoutData = currentLayout.map(item => item.item);
@@ -150,7 +157,7 @@ function useSetLayoutPreference() {
150
157
  setPreference
151
158
  } = usePreferences();
152
159
  return useCallback(async layout => {
153
- await setPreference('dashboard-layout', {
160
+ await setPreference(PREFERENCE_KEYS.DASHBOARD_LAYOUT, {
154
161
  layouts: layout
155
162
  }, false);
156
163
  }, [setPreference]);
@@ -1 +1 @@
1
- {"version":3,"file":"useDashboardLayout.js","names":["arrayMove","ConfirmationModal","toast","useConfig","useModal","usePreferences","useServerFunctions","React","useCallback","useState","RenderWidget","useDashboardLayout","initialLayout","setLayoutPreference","useSetLayoutPreference","isEditing","setIsEditing","widgets","config","admin","dashboard","currentLayout","setCurrentLayout","openModal","cancelModalSlug","serverFunction","saveLayout","layoutData","map","item","error","resetLayout","result","name","args","layout","performCancel","cancel","hasChanges","length","some","widget","index","initialWidget","id","width","moveWidget","moveFromIndex","moveToIndex","prev","addWidget","widgetSlug","widgetId","Date","now","find","slug","newWidgetInstance","component","createElement","maxWidth","minWidth","setTimeout","element","document","getElementById","scrollIntoView","behavior","block","closest","classList","add","remove","deleteWidget","filter","resizeWidget","newWidth","cancelModal","body","confirmLabel","heading","modalSlug","onConfirm","setPreference","layouts"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/useDashboardLayout.ts"],"sourcesContent":["import type { WidgetWidth } from 'payload'\n\nimport { arrayMove } from '@dnd-kit/sortable'\nimport {\n ConfirmationModal,\n toast,\n useConfig,\n useModal,\n usePreferences,\n useServerFunctions,\n} from '@payloadcms/ui'\nimport React, { useCallback, useState } from 'react'\n\nimport type { WidgetInstanceClient, WidgetItem } from './index.client.js'\nimport type { GetDefaultLayoutServerFnReturnType } from './renderWidget/getDefaultLayoutServerFn.js'\n\nimport { RenderWidget } from './renderWidget/RenderWidget.js'\n\nexport function useDashboardLayout(initialLayout: WidgetInstanceClient[]) {\n const setLayoutPreference = useSetLayoutPreference()\n const [isEditing, setIsEditing] = useState(false)\n const { widgets = [] } = useConfig().config.admin.dashboard ?? {}\n const [currentLayout, setCurrentLayout] = useState<WidgetInstanceClient[]>(initialLayout)\n const { openModal } = useModal()\n const cancelModalSlug = 'cancel-dashboard-changes'\n const { serverFunction } = useServerFunctions()\n\n const saveLayout = useCallback(async () => {\n try {\n const layoutData: WidgetItem[] = currentLayout.map((item) => item.item)\n setIsEditing(false)\n await setLayoutPreference(layoutData)\n } catch {\n setIsEditing(true)\n toast.error('Failed to save layout')\n }\n }, [setLayoutPreference, currentLayout])\n\n const resetLayout = useCallback(async () => {\n try {\n await setLayoutPreference(null)\n\n const result = (await serverFunction({\n name: 'get-default-layout',\n args: {},\n })) as GetDefaultLayoutServerFnReturnType\n\n setCurrentLayout(result.layout)\n setIsEditing(false)\n } catch {\n toast.error('Failed to reset layout')\n }\n }, [setLayoutPreference, serverFunction])\n\n const performCancel = useCallback(() => {\n setCurrentLayout(initialLayout)\n setIsEditing(false)\n }, [initialLayout])\n\n const cancel = useCallback(() => {\n // Check if layout has changed\n const hasChanges =\n currentLayout.length !== initialLayout.length ||\n currentLayout.some((widget, index) => {\n const initialWidget = initialLayout[index]\n return (\n !initialWidget ||\n widget.item.id !== initialWidget.item.id ||\n widget.item.width !== initialWidget.item.width\n )\n })\n\n // If there are changes, show confirmation modal\n if (hasChanges) {\n openModal(cancelModalSlug)\n } else {\n performCancel()\n }\n }, [currentLayout, initialLayout, openModal, cancelModalSlug, performCancel])\n\n const moveWidget = useCallback(\n ({ moveFromIndex, moveToIndex }: { moveFromIndex: number; moveToIndex: number }) => {\n if (moveFromIndex === moveToIndex || moveFromIndex < 0 || moveToIndex < 0) {\n return\n }\n\n setCurrentLayout((prev) => {\n return arrayMove(prev, moveFromIndex, moveToIndex)\n })\n },\n [],\n )\n\n const addWidget = useCallback(\n (widgetSlug: string) => {\n if (!isEditing) {\n return\n }\n\n const widgetId = `${widgetSlug}-${Date.now()}`\n const widget = widgets.find((widget) => widget.slug === widgetSlug)\n\n // Create a new widget instance using RenderWidget\n const newWidgetInstance: WidgetInstanceClient = {\n component: React.createElement(RenderWidget, {\n widgetId,\n // TODO: widgetData can be added here for custom props\n }),\n item: {\n id: widgetId,\n maxWidth: widget?.maxWidth ?? 'full',\n minWidth: widget?.minWidth ?? 'x-small',\n width: widget?.minWidth ?? 'x-small',\n },\n }\n\n setCurrentLayout((prev) => [...prev, newWidgetInstance])\n\n // Scroll to the newly added widget after it's rendered and highlight it\n setTimeout(() => {\n const element = document.getElementById(widgetId)\n if (element) {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n })\n\n // Add highlight animation to the widget element\n const widget = element.closest('.widget')\n if (widget) {\n widget.classList.add('widget--highlight')\n // Remove the class after animation completes (1.5s fade out)\n setTimeout(() => {\n widget.classList.remove('widget--highlight')\n }, 1500)\n }\n }\n }, 100)\n },\n [isEditing, widgets],\n )\n\n const deleteWidget = useCallback(\n (widgetId: string) => {\n if (!isEditing) {\n return\n }\n setCurrentLayout((prev) => prev.filter((item) => item.item.id !== widgetId))\n },\n [isEditing],\n )\n\n const resizeWidget = useCallback(\n (widgetId: string, newWidth: WidgetWidth) => {\n if (!isEditing) {\n return\n }\n setCurrentLayout((prev) =>\n prev.map((item) =>\n item.item.id === widgetId\n ? {\n ...item,\n item: {\n ...item.item,\n width: newWidth,\n } satisfies WidgetItem,\n }\n : item,\n ),\n )\n },\n [isEditing],\n )\n\n const cancelModal = React.createElement(ConfirmationModal, {\n body: 'You have unsaved changes to your dashboard layout. Are you sure you want to discard them?',\n confirmLabel: 'Discard',\n heading: 'Discard changes?',\n modalSlug: cancelModalSlug,\n onConfirm: performCancel,\n })\n\n return {\n addWidget,\n cancel,\n cancelModal,\n currentLayout,\n deleteWidget,\n isEditing,\n moveWidget,\n resetLayout,\n resizeWidget,\n saveLayout,\n setIsEditing,\n }\n}\n\nfunction useSetLayoutPreference() {\n const { setPreference } = usePreferences()\n return useCallback(\n async (layout: null | WidgetItem[]) => {\n await setPreference('dashboard-layout', { layouts: layout }, false)\n },\n [setPreference],\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"useDashboardLayout.js","names":["arrayMove","ConfirmationModal","toast","useConfig","useModal","usePreferences","useServerFunctions","PREFERENCE_KEYS","React","useCallback","useEffect","useState","RenderWidget","useDashboardLayout","initialLayout","setLayoutPreference","useSetLayoutPreference","isEditing","setIsEditing","widgets","config","admin","dashboard","currentLayout","setCurrentLayout","openModal","cancelModalSlug","serverFunction","saveLayout","layoutData","map","item","error","resetLayout","result","name","args","layout","performCancel","cancel","hasChanges","length","some","widget","index","initialWidget","id","width","moveWidget","moveFromIndex","moveToIndex","prev","addWidget","widgetSlug","widgetId","Date","now","find","slug","newWidgetInstance","component","createElement","maxWidth","minWidth","setTimeout","element","document","getElementById","scrollIntoView","behavior","block","closest","classList","add","remove","deleteWidget","filter","resizeWidget","newWidth","cancelModal","body","confirmLabel","heading","modalSlug","onConfirm","setPreference","DASHBOARD_LAYOUT","layouts"],"sources":["../../../../../src/views/Dashboard/Default/ModularDashboard/useDashboardLayout.ts"],"sourcesContent":["import type { WidgetWidth } from 'payload'\n\nimport { arrayMove } from '@dnd-kit/sortable'\nimport {\n ConfirmationModal,\n toast,\n useConfig,\n useModal,\n usePreferences,\n useServerFunctions,\n} from '@payloadcms/ui'\nimport { PREFERENCE_KEYS } from 'payload/shared'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport type { WidgetInstanceClient, WidgetItem } from './index.client.js'\nimport type { GetDefaultLayoutServerFnReturnType } from './renderWidget/getDefaultLayoutServerFn.js'\n\nimport { RenderWidget } from './renderWidget/RenderWidget.js'\n\nexport function useDashboardLayout(initialLayout: WidgetInstanceClient[]) {\n const setLayoutPreference = useSetLayoutPreference()\n const [isEditing, setIsEditing] = useState(false)\n const { widgets = [] } = useConfig().config.admin.dashboard ?? {}\n const [currentLayout, setCurrentLayout] = useState<WidgetInstanceClient[]>(initialLayout)\n const { openModal } = useModal()\n const cancelModalSlug = 'cancel-dashboard-changes'\n const { serverFunction } = useServerFunctions()\n\n // Sync state when initialLayout prop changes (e.g., when query params change and server component re-renders)\n useEffect(() => {\n if (!isEditing) {\n setCurrentLayout(initialLayout)\n }\n }, [initialLayout, isEditing])\n\n const saveLayout = useCallback(async () => {\n try {\n const layoutData: WidgetItem[] = currentLayout.map((item) => item.item)\n setIsEditing(false)\n await setLayoutPreference(layoutData)\n } catch {\n setIsEditing(true)\n toast.error('Failed to save layout')\n }\n }, [setLayoutPreference, currentLayout])\n\n const resetLayout = useCallback(async () => {\n try {\n await setLayoutPreference(null)\n\n const result = (await serverFunction({\n name: 'get-default-layout',\n args: {},\n })) as GetDefaultLayoutServerFnReturnType\n\n setCurrentLayout(result.layout)\n setIsEditing(false)\n } catch {\n toast.error('Failed to reset layout')\n }\n }, [setLayoutPreference, serverFunction])\n\n const performCancel = useCallback(() => {\n setCurrentLayout(initialLayout)\n setIsEditing(false)\n }, [initialLayout])\n\n const cancel = useCallback(() => {\n // Check if layout has changed\n const hasChanges =\n currentLayout.length !== initialLayout.length ||\n currentLayout.some((widget, index) => {\n const initialWidget = initialLayout[index]\n return (\n !initialWidget ||\n widget.item.id !== initialWidget.item.id ||\n widget.item.width !== initialWidget.item.width\n )\n })\n\n // If there are changes, show confirmation modal\n if (hasChanges) {\n openModal(cancelModalSlug)\n } else {\n performCancel()\n }\n }, [currentLayout, initialLayout, openModal, cancelModalSlug, performCancel])\n\n const moveWidget = useCallback(\n ({ moveFromIndex, moveToIndex }: { moveFromIndex: number; moveToIndex: number }) => {\n if (moveFromIndex === moveToIndex || moveFromIndex < 0 || moveToIndex < 0) {\n return\n }\n\n setCurrentLayout((prev) => {\n return arrayMove(prev, moveFromIndex, moveToIndex)\n })\n },\n [],\n )\n\n const addWidget = useCallback(\n (widgetSlug: string) => {\n if (!isEditing) {\n return\n }\n\n const widgetId = `${widgetSlug}-${Date.now()}`\n const widget = widgets.find((widget) => widget.slug === widgetSlug)\n\n // Create a new widget instance using RenderWidget\n const newWidgetInstance: WidgetInstanceClient = {\n component: React.createElement(RenderWidget, {\n widgetId,\n // TODO: widgetData can be added here for custom props\n }),\n item: {\n id: widgetId,\n maxWidth: widget?.maxWidth ?? 'full',\n minWidth: widget?.minWidth ?? 'x-small',\n width: widget?.minWidth ?? 'x-small',\n },\n }\n\n setCurrentLayout((prev) => [...prev, newWidgetInstance])\n\n // Scroll to the newly added widget after it's rendered and highlight it\n setTimeout(() => {\n const element = document.getElementById(widgetId)\n if (element) {\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n })\n\n // Add highlight animation to the widget element\n const widget = element.closest('.widget')\n if (widget) {\n widget.classList.add('widget--highlight')\n // Remove the class after animation completes (1.5s fade out)\n setTimeout(() => {\n widget.classList.remove('widget--highlight')\n }, 1500)\n }\n }\n }, 100)\n },\n [isEditing, widgets],\n )\n\n const deleteWidget = useCallback(\n (widgetId: string) => {\n if (!isEditing) {\n return\n }\n setCurrentLayout((prev) => prev.filter((item) => item.item.id !== widgetId))\n },\n [isEditing],\n )\n\n const resizeWidget = useCallback(\n (widgetId: string, newWidth: WidgetWidth) => {\n if (!isEditing) {\n return\n }\n setCurrentLayout((prev) =>\n prev.map((item) =>\n item.item.id === widgetId\n ? {\n ...item,\n item: {\n ...item.item,\n width: newWidth,\n } satisfies WidgetItem,\n }\n : item,\n ),\n )\n },\n [isEditing],\n )\n\n const cancelModal = React.createElement(ConfirmationModal, {\n body: 'You have unsaved changes to your dashboard layout. Are you sure you want to discard them?',\n confirmLabel: 'Discard',\n heading: 'Discard changes?',\n modalSlug: cancelModalSlug,\n onConfirm: performCancel,\n })\n\n return {\n addWidget,\n cancel,\n cancelModal,\n currentLayout,\n deleteWidget,\n isEditing,\n moveWidget,\n resetLayout,\n resizeWidget,\n saveLayout,\n setIsEditing,\n }\n}\n\nfunction useSetLayoutPreference() {\n const { setPreference } = usePreferences()\n return useCallback(\n async (layout: null | WidgetItem[]) => {\n await setPreference(PREFERENCE_KEYS.DASHBOARD_LAYOUT, { layouts: layout }, false)\n },\n [setPreference],\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"handleServerFunction.d.ts","sourceRoot":"","sources":["../../../src/views/Document/handleServerFunction.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAA;AAUlE,eAAO,MAAM,qBAAqB,EAAE,4BA0HnC,CAAA"}
1
+ {"version":3,"file":"handleServerFunction.d.ts","sourceRoot":"","sources":["../../../src/views/Document/handleServerFunction.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAA;AASlE,eAAO,MAAM,qBAAqB,EAAE,4BAsHnC,CAAA"}
@@ -1,11 +1,11 @@
1
1
  import { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig';
2
- import { headers as getHeaders } from 'next/headers.js';
3
- import { canAccessAdmin, getAccessResults, isEntityHidden, parseCookies } from 'payload';
2
+ import { canAccessAdmin, isEntityHidden } from 'payload';
4
3
  import { applyLocaleFiltering } from 'payload/shared';
5
4
  import { renderDocument } from './index.js';
6
5
  export const renderDocumentHandler = async args => {
7
6
  const {
8
7
  collectionSlug,
8
+ cookies,
9
9
  disableActions,
10
10
  docID,
11
11
  drawerSlug,
@@ -13,6 +13,7 @@ export const renderDocumentHandler = async args => {
13
13
  locale,
14
14
  overrideEntityVisibility,
15
15
  paramsOverride,
16
+ permissions,
16
17
  redirectAfterCreate,
17
18
  redirectAfterDelete,
18
19
  redirectAfterDuplicate,
@@ -28,8 +29,6 @@ export const renderDocumentHandler = async args => {
28
29
  searchParams = {},
29
30
  versions
30
31
  } = args;
31
- const headers = await getHeaders();
32
- const cookies = parseCookies(headers);
33
32
  await canAccessAdmin({
34
33
  req
35
34
  });
@@ -88,9 +87,6 @@ export const renderDocumentHandler = async args => {
88
87
  user
89
88
  }) ? slug : null).filter(Boolean)
90
89
  };
91
- const permissions = await getAccessResults({
92
- req
93
- });
94
90
  const {
95
91
  data,
96
92
  Document
@@ -114,11 +110,13 @@ export const renderDocumentHandler = async args => {
114
110
  translations: undefined,
115
111
  visibleEntities
116
112
  },
113
+ locale,
117
114
  overrideEntityVisibility,
118
115
  params: paramsOverride ?? {
119
116
  segments: ['collections', collectionSlug, String(docID)]
120
117
  },
121
118
  payload,
119
+ permissions,
122
120
  redirectAfterCreate,
123
121
  redirectAfterDelete,
124
122
  redirectAfterDuplicate,
@@ -1 +1 @@
1
- {"version":3,"file":"handleServerFunction.js","names":["getClientConfig","headers","getHeaders","canAccessAdmin","getAccessResults","isEntityHidden","parseCookies","applyLocaleFiltering","renderDocument","renderDocumentHandler","args","collectionSlug","disableActions","docID","drawerSlug","initialData","locale","overrideEntityVisibility","paramsOverride","redirectAfterCreate","redirectAfterDelete","redirectAfterDuplicate","req","i18n","payload","config","user","searchParams","versions","cookies","clientConfig","importMap","preferences","preferencesKey","find","collection","depth","limit","where","and","key","equals","id","then","res","docs","value","visibleEntities","collections","map","slug","admin","hidden","filter","Boolean","globals","permissions","data","Document","documentSubViewType","initPageResult","collectionConfig","globalConfig","global","languageOptions","undefined","translations","params","segments","String","viewType"],"sources":["../../../src/views/Document/handleServerFunction.tsx"],"sourcesContent":["import type { RenderDocumentServerFunction } from '@payloadcms/ui'\nimport type { DocumentPreferences, VisibleEntities } from 'payload'\n\nimport { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'\nimport { headers as getHeaders } from 'next/headers.js'\nimport { canAccessAdmin, getAccessResults, isEntityHidden, parseCookies } from 'payload'\nimport { applyLocaleFiltering } from 'payload/shared'\n\nimport { renderDocument } from './index.js'\n\nexport const renderDocumentHandler: RenderDocumentServerFunction = async (args) => {\n const {\n collectionSlug,\n disableActions,\n docID,\n drawerSlug,\n initialData,\n locale,\n overrideEntityVisibility,\n paramsOverride,\n redirectAfterCreate,\n redirectAfterDelete,\n redirectAfterDuplicate,\n req,\n req: {\n i18n,\n payload,\n payload: { config },\n user,\n },\n searchParams = {},\n versions,\n } = args\n\n const headers = await getHeaders()\n\n const cookies = parseCookies(headers)\n\n await canAccessAdmin({ req })\n\n const clientConfig = getClientConfig({\n config,\n i18n,\n importMap: req.payload.importMap,\n user,\n })\n await applyLocaleFiltering({ clientConfig, config, req })\n\n let preferences: DocumentPreferences\n\n if (docID) {\n const preferencesKey = `${collectionSlug}-edit-${docID}`\n\n preferences = await payload\n .find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n where: {\n and: [\n {\n key: {\n equals: preferencesKey,\n },\n },\n {\n 'user.relationTo': {\n equals: user.collection,\n },\n },\n {\n 'user.value': {\n equals: user.id,\n },\n },\n ],\n },\n })\n .then((res) => res.docs[0]?.value as DocumentPreferences)\n }\n\n const visibleEntities: VisibleEntities = {\n collections: payload.config.collections\n .map(({ slug, admin: { hidden } }) => (!isEntityHidden({ hidden, user }) ? slug : null))\n .filter(Boolean),\n globals: payload.config.globals\n .map(({ slug, admin: { hidden } }) => (!isEntityHidden({ hidden, user }) ? slug : null))\n .filter(Boolean),\n }\n\n const permissions = await getAccessResults({\n req,\n })\n\n const { data, Document } = await renderDocument({\n clientConfig,\n disableActions,\n documentSubViewType: 'default',\n drawerSlug,\n i18n,\n importMap: payload.importMap,\n initialData,\n initPageResult: {\n collectionConfig: payload?.collections?.[collectionSlug]?.config,\n cookies,\n docID,\n globalConfig: payload.config.globals.find((global) => global.slug === collectionSlug),\n languageOptions: undefined, // TODO\n locale,\n permissions,\n req,\n translations: undefined, // TODO\n visibleEntities,\n },\n overrideEntityVisibility,\n params: paramsOverride ?? {\n segments: ['collections', collectionSlug, String(docID)],\n },\n payload,\n redirectAfterCreate,\n redirectAfterDelete,\n redirectAfterDuplicate,\n searchParams,\n versions,\n viewType: 'document',\n })\n\n return {\n data,\n Document,\n preferences,\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"handleServerFunction.js","names":["getClientConfig","canAccessAdmin","isEntityHidden","applyLocaleFiltering","renderDocument","renderDocumentHandler","args","collectionSlug","cookies","disableActions","docID","drawerSlug","initialData","locale","overrideEntityVisibility","paramsOverride","permissions","redirectAfterCreate","redirectAfterDelete","redirectAfterDuplicate","req","i18n","payload","config","user","searchParams","versions","clientConfig","importMap","preferences","preferencesKey","find","collection","depth","limit","where","and","key","equals","id","then","res","docs","value","visibleEntities","collections","map","slug","admin","hidden","filter","Boolean","globals","data","Document","documentSubViewType","initPageResult","collectionConfig","globalConfig","global","languageOptions","undefined","translations","params","segments","String","viewType"],"sources":["../../../src/views/Document/handleServerFunction.tsx"],"sourcesContent":["import type { RenderDocumentServerFunction } from '@payloadcms/ui'\nimport type { DocumentPreferences, VisibleEntities } from 'payload'\n\nimport { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'\nimport { canAccessAdmin, isEntityHidden } from 'payload'\nimport { applyLocaleFiltering } from 'payload/shared'\n\nimport { renderDocument } from './index.js'\n\nexport const renderDocumentHandler: RenderDocumentServerFunction = async (args) => {\n const {\n collectionSlug,\n cookies,\n disableActions,\n docID,\n drawerSlug,\n initialData,\n locale,\n overrideEntityVisibility,\n paramsOverride,\n permissions,\n redirectAfterCreate,\n redirectAfterDelete,\n redirectAfterDuplicate,\n req,\n req: {\n i18n,\n payload,\n payload: { config },\n user,\n },\n searchParams = {},\n versions,\n } = args\n\n await canAccessAdmin({ req })\n\n const clientConfig = getClientConfig({\n config,\n i18n,\n importMap: req.payload.importMap,\n user,\n })\n await applyLocaleFiltering({ clientConfig, config, req })\n\n let preferences: DocumentPreferences\n\n if (docID) {\n const preferencesKey = `${collectionSlug}-edit-${docID}`\n\n preferences = await payload\n .find({\n collection: 'payload-preferences',\n depth: 0,\n limit: 1,\n where: {\n and: [\n {\n key: {\n equals: preferencesKey,\n },\n },\n {\n 'user.relationTo': {\n equals: user.collection,\n },\n },\n {\n 'user.value': {\n equals: user.id,\n },\n },\n ],\n },\n })\n .then((res) => res.docs[0]?.value as DocumentPreferences)\n }\n\n const visibleEntities: VisibleEntities = {\n collections: payload.config.collections\n .map(({ slug, admin: { hidden } }) => (!isEntityHidden({ hidden, user }) ? slug : null))\n .filter(Boolean),\n globals: payload.config.globals\n .map(({ slug, admin: { hidden } }) => (!isEntityHidden({ hidden, user }) ? slug : null))\n .filter(Boolean),\n }\n\n const { data, Document } = await renderDocument({\n clientConfig,\n disableActions,\n documentSubViewType: 'default',\n drawerSlug,\n i18n,\n importMap: payload.importMap,\n initialData,\n initPageResult: {\n collectionConfig: payload?.collections?.[collectionSlug]?.config,\n cookies,\n docID,\n globalConfig: payload.config.globals.find((global) => global.slug === collectionSlug),\n languageOptions: undefined, // TODO\n locale,\n permissions,\n req,\n translations: undefined, // TODO\n visibleEntities,\n },\n locale,\n overrideEntityVisibility,\n params: paramsOverride ?? {\n segments: ['collections', collectionSlug, String(docID)],\n },\n payload,\n permissions,\n redirectAfterCreate,\n redirectAfterDelete,\n redirectAfterDuplicate,\n searchParams,\n versions,\n viewType: 'document',\n })\n\n return {\n data,\n Document,\n preferences,\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -59,8 +59,7 @@ export const renderDocument = async ({
59
59
  routes: {
60
60
  admin: adminRoute,
61
61
  api: apiRoute
62
- },
63
- serverURL
62
+ }
64
63
  }
65
64
  },
66
65
  user
@@ -278,7 +277,8 @@ export const renderDocument = async ({
278
277
  collectionConfig,
279
278
  globalConfig,
280
279
  hasSavePermission,
281
- permissions: docPermissions,
280
+ locale,
281
+ permissions,
282
282
  req
283
283
  });
284
284
  // Extract Description from documentSlots to pass to DocumentHeader