@payloadcms/next 3.0.0-beta.106 → 3.0.0-beta.108

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 (104) hide show
  1. package/dist/cjs/withPayload.js +4 -4
  2. package/dist/cjs/withPayload.js.map +1 -1
  3. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.d.ts.map +1 -1
  4. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js +28 -24
  5. package/dist/elements/DocumentHeader/Tabs/tabs/VersionsPill/index.js.map +1 -1
  6. package/dist/elements/DocumentLocked/index.d.ts +12 -0
  7. package/dist/elements/DocumentLocked/index.d.ts.map +1 -0
  8. package/dist/elements/DocumentLocked/index.js +142 -0
  9. package/dist/elements/DocumentLocked/index.js.map +1 -0
  10. package/dist/elements/DocumentLocked/index.scss +37 -0
  11. package/dist/elements/DocumentTakeOver/index.d.ts +8 -0
  12. package/dist/elements/DocumentTakeOver/index.d.ts.map +1 -0
  13. package/dist/elements/DocumentTakeOver/index.js +98 -0
  14. package/dist/elements/DocumentTakeOver/index.js.map +1 -0
  15. package/dist/elements/DocumentTakeOver/index.scss +37 -0
  16. package/dist/elements/Nav/NavWrapper/index.scss +5 -0
  17. package/dist/elements/Nav/index.scss +5 -1
  18. package/dist/layouts/Root/index.d.ts.map +1 -1
  19. package/dist/layouts/Root/index.js +52 -20
  20. package/dist/layouts/Root/index.js.map +1 -1
  21. package/dist/prod/styles.css +1 -1
  22. package/dist/routes/rest/collections/find.d.ts.map +1 -1
  23. package/dist/routes/rest/collections/find.js +3 -0
  24. package/dist/routes/rest/collections/find.js.map +1 -1
  25. package/dist/routes/rest/collections/findByID.d.ts.map +1 -1
  26. package/dist/routes/rest/collections/findByID.js +2 -0
  27. package/dist/routes/rest/collections/findByID.js.map +1 -1
  28. package/dist/routes/rest/collections/updateByID.d.ts.map +1 -1
  29. package/dist/routes/rest/collections/updateByID.js +2 -0
  30. package/dist/routes/rest/collections/updateByID.js.map +1 -1
  31. package/dist/routes/rest/globals/update.d.ts.map +1 -1
  32. package/dist/routes/rest/globals/update.js +2 -0
  33. package/dist/routes/rest/globals/update.js.map +1 -1
  34. package/dist/routes/rest/utilities/sanitizeJoinParams.d.ts +13 -0
  35. package/dist/routes/rest/utilities/sanitizeJoinParams.d.ts.map +1 -0
  36. package/dist/routes/rest/utilities/sanitizeJoinParams.js +17 -0
  37. package/dist/routes/rest/utilities/sanitizeJoinParams.js.map +1 -0
  38. package/dist/templates/Default/index.d.ts.map +1 -1
  39. package/dist/templates/Default/index.js +18 -6
  40. package/dist/templates/Default/index.js.map +1 -1
  41. package/dist/templates/Default/index.scss +13 -3
  42. package/dist/utilities/initPage/index.d.ts.map +1 -1
  43. package/dist/utilities/initPage/index.js +22 -32
  44. package/dist/utilities/initPage/index.js.map +1 -1
  45. package/dist/utilities/initReq.d.ts +11 -0
  46. package/dist/utilities/initReq.d.ts.map +1 -0
  47. package/dist/utilities/initReq.js +46 -0
  48. package/dist/utilities/initReq.js.map +1 -0
  49. package/dist/views/CreateFirstUser/index.client.d.ts.map +1 -1
  50. package/dist/views/CreateFirstUser/index.client.js +4 -1
  51. package/dist/views/CreateFirstUser/index.client.js.map +1 -1
  52. package/dist/views/Dashboard/Default/index.d.ts +8 -1
  53. package/dist/views/Dashboard/Default/index.d.ts.map +1 -1
  54. package/dist/views/Dashboard/Default/index.js +14 -2
  55. package/dist/views/Dashboard/Default/index.js.map +1 -1
  56. package/dist/views/Dashboard/Default/index.scss +5 -0
  57. package/dist/views/Dashboard/index.d.ts.map +1 -1
  58. package/dist/views/Dashboard/index.js +16 -1
  59. package/dist/views/Dashboard/index.js.map +1 -1
  60. package/dist/views/Document/getDocumentData.d.ts +5 -2
  61. package/dist/views/Document/getDocumentData.d.ts.map +1 -1
  62. package/dist/views/Document/getDocumentData.js +13 -2
  63. package/dist/views/Document/getDocumentData.js.map +1 -1
  64. package/dist/views/Edit/Default/index.d.ts.map +1 -1
  65. package/dist/views/Edit/Default/index.js +162 -14
  66. package/dist/views/Edit/Default/index.js.map +1 -1
  67. package/dist/views/ForgotPassword/ForgotPasswordForm/index.js +3 -0
  68. package/dist/views/ForgotPassword/ForgotPasswordForm/index.js.map +1 -1
  69. package/dist/views/List/Default/index.d.ts.map +1 -1
  70. package/dist/views/List/Default/index.js +62 -58
  71. package/dist/views/List/Default/index.js.map +1 -1
  72. package/dist/views/List/Default/index.scss +1 -1
  73. package/dist/views/List/index.d.ts.map +1 -1
  74. package/dist/views/List/index.js +1 -0
  75. package/dist/views/List/index.js.map +1 -1
  76. package/dist/views/LivePreview/index.client.d.ts.map +1 -1
  77. package/dist/views/LivePreview/index.client.js +4 -1
  78. package/dist/views/LivePreview/index.client.js.map +1 -1
  79. package/dist/views/LivePreview/usePopupWindow.js +119 -74
  80. package/dist/views/LivePreview/usePopupWindow.js.map +1 -1
  81. package/dist/views/Login/LoginForm/index.js +2 -2
  82. package/dist/views/Login/LoginForm/index.js.map +1 -1
  83. package/dist/views/Version/Default/index.d.ts.map +1 -1
  84. package/dist/views/Version/Default/index.js +2 -0
  85. package/dist/views/Version/Default/index.js.map +1 -1
  86. package/dist/views/Version/SelectComparison/index.d.ts.map +1 -1
  87. package/dist/views/Version/SelectComparison/index.js +24 -3
  88. package/dist/views/Version/SelectComparison/index.js.map +1 -1
  89. package/dist/views/Version/SelectComparison/types.d.ts +1 -0
  90. package/dist/views/Version/SelectComparison/types.d.ts.map +1 -1
  91. package/dist/views/Version/SelectComparison/types.js.map +1 -1
  92. package/dist/views/Versions/buildColumns.d.ts.map +1 -1
  93. package/dist/views/Versions/buildColumns.js +63 -48
  94. package/dist/views/Versions/buildColumns.js.map +1 -1
  95. package/dist/views/Versions/cells/AutosaveCell/index.d.ts.map +1 -1
  96. package/dist/views/Versions/cells/AutosaveCell/index.js +48 -20
  97. package/dist/views/Versions/cells/AutosaveCell/index.js.map +1 -1
  98. package/dist/views/Versions/index.d.ts.map +1 -1
  99. package/dist/views/Versions/index.js +23 -6
  100. package/dist/views/Versions/index.js.map +1 -1
  101. package/dist/withPayload.d.ts.map +1 -1
  102. package/dist/withPayload.js +4 -4
  103. package/dist/withPayload.js.map +1 -1
  104. package/package.json +24 -16
@@ -1,8 +1,15 @@
1
1
  import type { groupNavItems } from '@payloadcms/ui/shared';
2
- import type { Permissions, ServerProps, VisibleEntities } from 'payload';
2
+ import type { ClientUser, Permissions, ServerProps, VisibleEntities } from 'payload';
3
3
  import React from 'react';
4
4
  import './index.scss';
5
5
  export type DashboardProps = {
6
+ globalData: Array<{
7
+ data: {
8
+ _isLocked: boolean;
9
+ _userEditing: ClientUser | null;
10
+ };
11
+ slug: string;
12
+ }>;
6
13
  Link: React.ComponentType<any>;
7
14
  navGroups?: ReturnType<typeof groupNavItems>;
8
15
  permissions: Permissions;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Dashboard/Default/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAUxE,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,cAAc,CAAA;AAIrB,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAC9B,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAA;IAC5C,WAAW,EAAE,WAAW,CAAA;IACxB,eAAe,EAAE,eAAe,CAAA;CACjC,GAAG,WAAW,CAAA;AAEf,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA4IrD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Dashboard/Default/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAUpF,OAAO,KAAmB,MAAM,OAAO,CAAA;AAEvC,OAAO,cAAc,CAAA;AAIrB,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE;YAAE,SAAS,EAAE,OAAO,CAAC;YAAC,YAAY,EAAE,UAAU,GAAG,IAAI,CAAA;SAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAClG,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAC9B,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAA;IAC5C,WAAW,EAAE,WAAW,CAAA;IACxB,eAAe,EAAE,eAAe,CAAA;CACjC,GAAG,WAAW,CAAA;AAEf,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA0JrD,CAAA"}
@@ -1,11 +1,12 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { getTranslation } from '@payloadcms/translations';
3
- import { Button, Card, Gutter, SetStepNav, SetViewActions } from '@payloadcms/ui';
3
+ import { Button, Card, Gutter, Locked, SetStepNav, SetViewActions } from '@payloadcms/ui';
4
4
  import { EntityType, formatAdminURL, getCreateMappedComponent, RenderComponent } from '@payloadcms/ui/shared';
5
5
  import React, { Fragment } from 'react';
6
6
  const baseClass = 'dashboard';
7
7
  export const DefaultDashboard = props => {
8
8
  const {
9
+ globalData,
9
10
  i18n,
10
11
  i18n: {
11
12
  t
@@ -81,6 +82,8 @@ export const DefaultDashboard = props => {
81
82
  let createHREF;
82
83
  let href;
83
84
  let hasCreatePermission;
85
+ let lockStatus = null;
86
+ let userEditing = null;
84
87
  if (type === EntityType.collection) {
85
88
  title = getTranslation(entity.labels.plural, i18n);
86
89
  buttonAriaLabel = t('general:showAllLabel', {
@@ -105,10 +108,19 @@ export const DefaultDashboard = props => {
105
108
  adminRoute,
106
109
  path: `/globals/${entity.slug}`
107
110
  });
111
+ // Find the lock status for the global
112
+ const globalLockData = globalData.find(global => global.slug === entity.slug);
113
+ if (globalLockData) {
114
+ lockStatus = globalLockData.data._isLocked;
115
+ userEditing = globalLockData.data._userEditing;
116
+ }
108
117
  }
109
118
  return /*#__PURE__*/_jsx("li", {
110
119
  children: /*#__PURE__*/_jsx(Card, {
111
- actions: hasCreatePermission && type === EntityType.collection ? /*#__PURE__*/_jsx(Button, {
120
+ actions: lockStatus && user?.id !== userEditing?.id ? /*#__PURE__*/_jsx(Locked, {
121
+ className: `${baseClass}__locked`,
122
+ user: userEditing
123
+ }) : hasCreatePermission && type === EntityType.collection ? /*#__PURE__*/_jsx(Button, {
112
124
  "aria-label": t('general:createNewLabel', {
113
125
  label: getTranslation(entity.labels.singular, i18n)
114
126
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["getTranslation","Button","Card","Gutter","SetStepNav","SetViewActions","EntityType","formatAdminURL","getCreateMappedComponent","RenderComponent","React","Fragment","baseClass","DefaultDashboard","props","i18n","t","Link","locale","navGroups","params","payload","config","admin","components","afterDashboard","beforeDashboard","routes","adminRoute","permissions","searchParams","user","createMappedComponent","importMap","serverProps","mappedBeforeDashboards","undefined","mappedAfterDashboards","_jsxs","className","_jsx","nav","actions","mappedComponent","length","map","entities","label","groupIndex","type","entity","entityIndex","title","buttonAriaLabel","createHREF","href","hasCreatePermission","collection","labels","plural","path","slug","collections","create","permission","global","singular","buttonStyle","el","icon","iconStyle","round","to","id","titleAs"],"sources":["../../../../src/views/Dashboard/Default/index.tsx"],"sourcesContent":["import type { groupNavItems } from '@payloadcms/ui/shared'\nimport type { Permissions, ServerProps, VisibleEntities } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Button, Card, Gutter, SetStepNav, SetViewActions } from '@payloadcms/ui'\nimport {\n EntityType,\n formatAdminURL,\n getCreateMappedComponent,\n RenderComponent,\n} from '@payloadcms/ui/shared'\nimport React, { Fragment } from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'dashboard'\n\nexport type DashboardProps = {\n Link: React.ComponentType<any>\n navGroups?: ReturnType<typeof groupNavItems>\n permissions: Permissions\n visibleEntities: VisibleEntities\n} & ServerProps\n\nexport const DefaultDashboard: React.FC<DashboardProps> = (props) => {\n const {\n i18n,\n i18n: { t },\n Link,\n locale,\n navGroups,\n params,\n payload: {\n config: {\n admin: {\n components: { afterDashboard, beforeDashboard },\n },\n routes: { admin: adminRoute },\n },\n },\n payload,\n permissions,\n searchParams,\n user,\n } = props\n\n const createMappedComponent = getCreateMappedComponent({\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n const mappedBeforeDashboards = createMappedComponent(\n beforeDashboard,\n undefined,\n undefined,\n 'beforeDashboard',\n )\n\n const mappedAfterDashboards = createMappedComponent(\n afterDashboard,\n undefined,\n undefined,\n 'afterDashboard',\n )\n\n return (\n <div className={baseClass}>\n <SetStepNav nav={[]} />\n <SetViewActions actions={[]} />\n <Gutter className={`${baseClass}__wrap`}>\n <RenderComponent mappedComponent={mappedBeforeDashboards} />\n <Fragment>\n <SetViewActions actions={[]} />\n {!navGroups || navGroups?.length === 0 ? (\n <p>no nav groups....</p>\n ) : (\n navGroups.map(({ entities, label }, groupIndex) => {\n return (\n <div className={`${baseClass}__group`} key={groupIndex}>\n <h2 className={`${baseClass}__label`}>{label}</h2>\n <ul className={`${baseClass}__card-list`}>\n {entities.map(({ type, entity }, entityIndex) => {\n let title: string\n let buttonAriaLabel: string\n let createHREF: string\n let href: string\n let hasCreatePermission: boolean\n\n if (type === EntityType.collection) {\n title = getTranslation(entity.labels.plural, i18n)\n\n buttonAriaLabel = t('general:showAllLabel', { label: title })\n\n href = formatAdminURL({ adminRoute, path: `/collections/${entity.slug}` })\n\n createHREF = formatAdminURL({\n adminRoute,\n path: `/collections/${entity.slug}/create`,\n })\n\n hasCreatePermission =\n permissions?.collections?.[entity.slug]?.create?.permission\n }\n\n if (type === EntityType.global) {\n title = getTranslation(entity.label, i18n)\n\n buttonAriaLabel = t('general:editLabel', {\n label: getTranslation(entity.label, i18n),\n })\n\n href = formatAdminURL({\n adminRoute,\n path: `/globals/${entity.slug}`,\n })\n }\n\n return (\n <li key={entityIndex}>\n <Card\n actions={\n hasCreatePermission && type === EntityType.collection ? (\n <Button\n aria-label={t('general:createNewLabel', {\n label: getTranslation(entity.labels.singular, i18n),\n })}\n buttonStyle=\"icon-label\"\n el=\"link\"\n icon=\"plus\"\n iconStyle=\"with-border\"\n Link={Link}\n round\n to={createHREF}\n />\n ) : undefined\n }\n buttonAriaLabel={buttonAriaLabel}\n href={href}\n id={`card-${entity.slug}`}\n Link={Link}\n title={title}\n titleAs=\"h3\"\n />\n </li>\n )\n })}\n </ul>\n </div>\n )\n })\n )}\n </Fragment>\n <RenderComponent mappedComponent={mappedAfterDashboards} />\n </Gutter>\n </div>\n )\n}\n"],"mappings":";AAGA,SAASA,cAAc,QAAQ;AAC/B,SAASC,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAEC,UAAU,EAAEC,cAAc,QAAQ;AACjE,SACEC,UAAU,EACVC,cAAc,EACdC,wBAAwB,EACxBC,eAAe,QACV;AACP,OAAOC,KAAA,IAASC,QAAQ,QAAQ;AAIhC,MAAMC,SAAA,GAAY;AASlB,OAAO,MAAMC,gBAAA,GAA8CC,KAAA;EACzD,MAAM;IACJC,IAAI;IACJA,IAAA,EAAM;MAAEC;IAAC,CAAE;IACXC,IAAI;IACJC,MAAM;IACNC,SAAS;IACTC,MAAM;IACNC,OAAA,EAAS;MACPC,MAAA,EAAQ;QACNC,KAAA,EAAO;UACLC,UAAA,EAAY;YAAEC,cAAc;YAAEC;UAAe;QAAE,CAChD;QACDC,MAAA,EAAQ;UAAEJ,KAAA,EAAOK;QAAU;MAAE;IAC9B,CACF;IACDP,OAAO;IACPQ,WAAW;IACXC,YAAY;IACZC;EAAI,CACL,GAAGjB,KAAA;EAEJ,MAAMkB,qBAAA,GAAwBxB,wBAAA,CAAyB;IACrDyB,SAAA,EAAWZ,OAAA,CAAQY,SAAS;IAC5BC,WAAA,EAAa;MACXnB,IAAA;MACAG,MAAA;MACAE,MAAA;MACAC,OAAA;MACAQ,WAAA;MACAC,YAAA;MACAC;IACF;EACF;EAEA,MAAMI,sBAAA,GAAyBH,qBAAA,CAC7BN,eAAA,EACAU,SAAA,EACAA,SAAA,EACA;EAGF,MAAMC,qBAAA,GAAwBL,qBAAA,CAC5BP,cAAA,EACAW,SAAA,EACAA,SAAA,EACA;EAGF,oBACEE,KAAA,CAAC;IAAIC,SAAA,EAAW3B,SAAA;4BACd4B,IAAA,CAACpC,UAAA;MAAWqC,GAAA,EAAK;qBACjBD,IAAA,CAACnC,cAAA;MAAeqC,OAAA,EAAS;qBACzBJ,KAAA,CAACnC,MAAA;MAAOoC,SAAA,EAAW,GAAG3B,SAAA,QAAiB;8BACrC4B,IAAA,CAAC/B,eAAA;QAAgBkC,eAAA,EAAiBR;uBAClCG,KAAA,CAAC3B,QAAA;gCACC6B,IAAA,CAACnC,cAAA;UAAeqC,OAAA,EAAS;YACxB,CAACvB,SAAA,IAAaA,SAAA,EAAWyB,MAAA,KAAW,iBACnCJ,IAAA,CAAC;oBAAE;aAEHrB,SAAA,CAAU0B,GAAG,CAAC,CAAC;UAAEC,QAAQ;UAAEC;QAAK,CAAE,EAAEC,UAAA;UAClC,oBACEV,KAAA,CAAC;YAAIC,SAAA,EAAW,GAAG3B,SAAA,SAAkB;oCACnC4B,IAAA,CAAC;cAAGD,SAAA,EAAW,GAAG3B,SAAA,SAAkB;wBAAGmC;6BACvCP,IAAA,CAAC;cAAGD,SAAA,EAAW,GAAG3B,SAAA,aAAsB;wBACrCkC,QAAA,CAASD,GAAG,CAAC,CAAC;gBAAEI,IAAI;gBAAEC;cAAM,CAAE,EAAEC,WAAA;gBAC/B,IAAIC,KAAA;gBACJ,IAAIC,eAAA;gBACJ,IAAIC,UAAA;gBACJ,IAAIC,IAAA;gBACJ,IAAIC,mBAAA;gBAEJ,IAAIP,IAAA,KAAS3C,UAAA,CAAWmD,UAAU,EAAE;kBAClCL,KAAA,GAAQpD,cAAA,CAAekD,MAAA,CAAOQ,MAAM,CAACC,MAAM,EAAE5C,IAAA;kBAE7CsC,eAAA,GAAkBrC,CAAA,CAAE,wBAAwB;oBAAE+B,KAAA,EAAOK;kBAAM;kBAE3DG,IAAA,GAAOhD,cAAA,CAAe;oBAAEqB,UAAA;oBAAYgC,IAAA,EAAM,gBAAgBV,MAAA,CAAOW,IAAI;kBAAG;kBAExEP,UAAA,GAAa/C,cAAA,CAAe;oBAC1BqB,UAAA;oBACAgC,IAAA,EAAM,gBAAgBV,MAAA,CAAOW,IAAI;kBACnC;kBAEAL,mBAAA,GACE3B,WAAA,EAAaiC,WAAA,GAAcZ,MAAA,CAAOW,IAAI,CAAC,EAAEE,MAAA,EAAQC,UAAA;gBACrD;gBAEA,IAAIf,IAAA,KAAS3C,UAAA,CAAW2D,MAAM,EAAE;kBAC9Bb,KAAA,GAAQpD,cAAA,CAAekD,MAAA,CAAOH,KAAK,EAAEhC,IAAA;kBAErCsC,eAAA,GAAkBrC,CAAA,CAAE,qBAAqB;oBACvC+B,KAAA,EAAO/C,cAAA,CAAekD,MAAA,CAAOH,KAAK,EAAEhC,IAAA;kBACtC;kBAEAwC,IAAA,GAAOhD,cAAA,CAAe;oBACpBqB,UAAA;oBACAgC,IAAA,EAAM,YAAYV,MAAA,CAAOW,IAAI;kBAC/B;gBACF;gBAEA,oBACErB,IAAA,CAAC;4BACC,aAAAA,IAAA,CAACtC,IAAA;oBACCwC,OAAA,EACEc,mBAAA,IAAuBP,IAAA,KAAS3C,UAAA,CAAWmD,UAAU,gBACnDjB,IAAA,CAACvC,MAAA;sBACC,cAAYe,CAAA,CAAE,0BAA0B;wBACtC+B,KAAA,EAAO/C,cAAA,CAAekD,MAAA,CAAOQ,MAAM,CAACQ,QAAQ,EAAEnD,IAAA;sBAChD;sBACAoD,WAAA,EAAY;sBACZC,EAAA,EAAG;sBACHC,IAAA,EAAK;sBACLC,SAAA,EAAU;sBACVrD,IAAA,EAAMA,IAAA;sBACNsD,KAAK;sBACLC,EAAA,EAAIlB;yBAEJlB,SAAA;oBAENiB,eAAA,EAAiBA,eAAA;oBACjBE,IAAA,EAAMA,IAAA;oBACNkB,EAAA,EAAI,QAAQvB,MAAA,CAAOW,IAAI,EAAE;oBACzB5C,IAAA,EAAMA,IAAA;oBACNmC,KAAA,EAAOA,KAAA;oBACPsB,OAAA,EAAQ;;mBAvBHvB,WAAA;cA2Bb;;aAnEwCH,UAAA;QAuEhD;uBAGJR,IAAA,CAAC/B,eAAA;QAAgBkC,eAAA,EAAiBN;;;;AAI1C","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["getTranslation","Button","Card","Gutter","Locked","SetStepNav","SetViewActions","EntityType","formatAdminURL","getCreateMappedComponent","RenderComponent","React","Fragment","baseClass","DefaultDashboard","props","globalData","i18n","t","Link","locale","navGroups","params","payload","config","admin","components","afterDashboard","beforeDashboard","routes","adminRoute","permissions","searchParams","user","createMappedComponent","importMap","serverProps","mappedBeforeDashboards","undefined","mappedAfterDashboards","_jsxs","className","_jsx","nav","actions","mappedComponent","length","map","entities","label","groupIndex","type","entity","entityIndex","title","buttonAriaLabel","createHREF","href","hasCreatePermission","lockStatus","userEditing","collection","labels","plural","path","slug","collections","create","permission","global","globalLockData","find","data","_isLocked","_userEditing","id","singular","buttonStyle","el","icon","iconStyle","round","to","titleAs"],"sources":["../../../../src/views/Dashboard/Default/index.tsx"],"sourcesContent":["import type { groupNavItems } from '@payloadcms/ui/shared'\nimport type { ClientUser, Permissions, ServerProps, VisibleEntities } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport { Button, Card, Gutter, Locked, SetStepNav, SetViewActions } from '@payloadcms/ui'\nimport {\n EntityType,\n formatAdminURL,\n getCreateMappedComponent,\n RenderComponent,\n} from '@payloadcms/ui/shared'\nimport React, { Fragment } from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'dashboard'\n\nexport type DashboardProps = {\n globalData: Array<{ data: { _isLocked: boolean; _userEditing: ClientUser | null }; slug: string }>\n Link: React.ComponentType<any>\n navGroups?: ReturnType<typeof groupNavItems>\n permissions: Permissions\n visibleEntities: VisibleEntities\n} & ServerProps\n\nexport const DefaultDashboard: React.FC<DashboardProps> = (props) => {\n const {\n globalData,\n i18n,\n i18n: { t },\n Link,\n locale,\n navGroups,\n params,\n payload: {\n config: {\n admin: {\n components: { afterDashboard, beforeDashboard },\n },\n routes: { admin: adminRoute },\n },\n },\n payload,\n permissions,\n searchParams,\n user,\n } = props\n\n const createMappedComponent = getCreateMappedComponent({\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n },\n })\n\n const mappedBeforeDashboards = createMappedComponent(\n beforeDashboard,\n undefined,\n undefined,\n 'beforeDashboard',\n )\n\n const mappedAfterDashboards = createMappedComponent(\n afterDashboard,\n undefined,\n undefined,\n 'afterDashboard',\n )\n\n return (\n <div className={baseClass}>\n <SetStepNav nav={[]} />\n <SetViewActions actions={[]} />\n <Gutter className={`${baseClass}__wrap`}>\n <RenderComponent mappedComponent={mappedBeforeDashboards} />\n <Fragment>\n <SetViewActions actions={[]} />\n {!navGroups || navGroups?.length === 0 ? (\n <p>no nav groups....</p>\n ) : (\n navGroups.map(({ entities, label }, groupIndex) => {\n return (\n <div className={`${baseClass}__group`} key={groupIndex}>\n <h2 className={`${baseClass}__label`}>{label}</h2>\n <ul className={`${baseClass}__card-list`}>\n {entities.map(({ type, entity }, entityIndex) => {\n let title: string\n let buttonAriaLabel: string\n let createHREF: string\n let href: string\n let hasCreatePermission: boolean\n let lockStatus = null\n let userEditing = null\n\n if (type === EntityType.collection) {\n title = getTranslation(entity.labels.plural, i18n)\n\n buttonAriaLabel = t('general:showAllLabel', { label: title })\n\n href = formatAdminURL({ adminRoute, path: `/collections/${entity.slug}` })\n\n createHREF = formatAdminURL({\n adminRoute,\n path: `/collections/${entity.slug}/create`,\n })\n\n hasCreatePermission =\n permissions?.collections?.[entity.slug]?.create?.permission\n }\n\n if (type === EntityType.global) {\n title = getTranslation(entity.label, i18n)\n\n buttonAriaLabel = t('general:editLabel', {\n label: getTranslation(entity.label, i18n),\n })\n\n href = formatAdminURL({\n adminRoute,\n path: `/globals/${entity.slug}`,\n })\n\n // Find the lock status for the global\n const globalLockData = globalData.find(\n (global) => global.slug === entity.slug,\n )\n if (globalLockData) {\n lockStatus = globalLockData.data._isLocked\n userEditing = globalLockData.data._userEditing\n }\n }\n\n return (\n <li key={entityIndex}>\n <Card\n actions={\n lockStatus && user?.id !== userEditing?.id ? (\n <Locked className={`${baseClass}__locked`} user={userEditing} />\n ) : hasCreatePermission && type === EntityType.collection ? (\n <Button\n aria-label={t('general:createNewLabel', {\n label: getTranslation(entity.labels.singular, i18n),\n })}\n buttonStyle=\"icon-label\"\n el=\"link\"\n icon=\"plus\"\n iconStyle=\"with-border\"\n Link={Link}\n round\n to={createHREF}\n />\n ) : undefined\n }\n buttonAriaLabel={buttonAriaLabel}\n href={href}\n id={`card-${entity.slug}`}\n Link={Link}\n title={title}\n titleAs=\"h3\"\n />\n </li>\n )\n })}\n </ul>\n </div>\n )\n })\n )}\n </Fragment>\n <RenderComponent mappedComponent={mappedAfterDashboards} />\n </Gutter>\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -35,6 +35,11 @@
35
35
  }
36
36
  }
37
37
 
38
+ &__locked.locked {
39
+ align-items: unset;
40
+ justify-content: unset;
41
+ }
42
+
38
43
  @include large-break {
39
44
  --cols: 4;
40
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/Dashboard/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAU7C,OAAO,KAAmB,MAAM,OAAO,CAAA;AAIvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;AAIrD,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAqF9C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/Dashboard/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAU7C,OAAO,KAAmB,MAAM,OAAO,CAAA;AAIvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAA;AAIrD,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAiH9C,CAAA"}
@@ -6,7 +6,7 @@ import React, { Fragment } from 'react';
6
6
  import { DefaultDashboard } from './Default/index.js';
7
7
  export { generateDashboardMetadata } from './meta.js';
8
8
  const Link = LinkImport.default || LinkImport;
9
- export const Dashboard = ({
9
+ export const Dashboard = async ({
10
10
  initPageResult,
11
11
  params,
12
12
  searchParams
@@ -27,6 +27,20 @@ export const Dashboard = ({
27
27
  const CustomDashboardComponent = config.admin.components?.views?.Dashboard;
28
28
  const collections = config.collections.filter(collection => permissions?.collections?.[collection.slug]?.read?.permission && visibleEntities.collections.includes(collection.slug));
29
29
  const globals = config.globals.filter(global => permissions?.globals?.[global.slug]?.read?.permission && visibleEntities.globals.includes(global.slug));
30
+ const globalSlugs = config.globals.map(global => global.slug);
31
+ // Filter the slugs based on permissions and visibility
32
+ const filteredGlobalSlugs = globalSlugs.filter(slug => permissions?.globals?.[slug]?.read?.permission && visibleEntities.globals.includes(slug));
33
+ const globalData = await Promise.all(filteredGlobalSlugs.map(async slug => {
34
+ const data = await payload.findGlobal({
35
+ slug,
36
+ depth: 0,
37
+ includeLockStatus: true
38
+ });
39
+ return {
40
+ slug,
41
+ data
42
+ };
43
+ }));
30
44
  const navGroups = groupNavItems([...(collections.map(collection => {
31
45
  const entityToGroup = {
32
46
  type: EntityType.collection,
@@ -43,6 +57,7 @@ export const Dashboard = ({
43
57
  const createMappedComponent = getCreateMappedComponent({
44
58
  importMap: payload.importMap,
45
59
  serverProps: {
60
+ globalData,
46
61
  i18n,
47
62
  Link,
48
63
  locale,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["HydrateAuthProvider","EntityType","getCreateMappedComponent","groupNavItems","RenderComponent","LinkImport","React","Fragment","DefaultDashboard","generateDashboardMetadata","Link","default","Dashboard","initPageResult","params","searchParams","locale","permissions","req","i18n","payload","config","user","visibleEntities","CustomDashboardComponent","admin","components","views","collections","filter","collection","slug","read","permission","includes","globals","global","navGroups","map","entityToGroup","type","entity","createMappedComponent","importMap","serverProps","mappedDashboardComponent","Component","undefined","_jsxs","_jsx","clientProps","mappedComponent"],"sources":["../../../src/views/Dashboard/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type { AdminViewProps } from 'payload'\n\nimport { HydrateAuthProvider } from '@payloadcms/ui'\nimport {\n EntityType,\n getCreateMappedComponent,\n groupNavItems,\n RenderComponent,\n} from '@payloadcms/ui/shared'\nimport LinkImport from 'next/link.js'\nimport React, { Fragment } from 'react'\n\nimport { DefaultDashboard } from './Default/index.js'\n\nexport { generateDashboardMetadata } from './meta.js'\n\nconst Link = (LinkImport.default || LinkImport) as unknown as typeof LinkImport.default\n\nexport const Dashboard: React.FC<AdminViewProps> = ({ initPageResult, params, searchParams }) => {\n const {\n locale,\n permissions,\n req: {\n i18n,\n payload: { config },\n payload,\n user,\n },\n visibleEntities,\n } = initPageResult\n\n const CustomDashboardComponent = config.admin.components?.views?.Dashboard\n\n const collections = config.collections.filter(\n (collection) =>\n permissions?.collections?.[collection.slug]?.read?.permission &&\n visibleEntities.collections.includes(collection.slug),\n )\n\n const globals = config.globals.filter(\n (global) =>\n permissions?.globals?.[global.slug]?.read?.permission &&\n visibleEntities.globals.includes(global.slug),\n )\n\n const navGroups = groupNavItems(\n [\n ...(collections.map((collection) => {\n const entityToGroup: EntityToGroup = {\n type: EntityType.collection,\n entity: collection,\n }\n\n return entityToGroup\n }) ?? []),\n ...(globals.map((global) => {\n const entityToGroup: EntityToGroup = {\n type: EntityType.global,\n entity: global,\n }\n\n return entityToGroup\n }) ?? []),\n ],\n permissions,\n i18n,\n )\n\n const createMappedComponent = getCreateMappedComponent({\n importMap: payload.importMap,\n serverProps: {\n i18n,\n Link,\n locale,\n navGroups,\n params,\n payload,\n permissions,\n searchParams,\n user,\n visibleEntities,\n },\n })\n\n const mappedDashboardComponent = createMappedComponent(\n CustomDashboardComponent?.Component,\n undefined,\n DefaultDashboard,\n 'CustomDashboardComponent.Component',\n )\n\n return (\n <Fragment>\n <HydrateAuthProvider permissions={permissions} />\n <RenderComponent\n clientProps={{\n Link,\n locale,\n }}\n mappedComponent={mappedDashboardComponent}\n />\n </Fragment>\n )\n}\n"],"mappings":";AAGA,SAASA,mBAAmB,QAAQ;AACpC,SACEC,UAAU,EACVC,wBAAwB,EACxBC,aAAa,EACbC,eAAe,QACV;AACP,OAAOC,UAAA,MAAgB;AACvB,OAAOC,KAAA,IAASC,QAAQ,QAAQ;AAEhC,SAASC,gBAAgB,QAAQ;AAEjC,SAASC,yBAAyB,QAAQ;AAE1C,MAAMC,IAAA,GAAQL,UAAA,CAAWM,OAAO,IAAIN,UAAA;AAEpC,OAAO,MAAMO,SAAA,GAAsCA,CAAC;EAAEC,cAAc;EAAEC,MAAM;EAAEC;AAAY,CAAE;EAC1F,MAAM;IACJC,MAAM;IACNC,WAAW;IACXC,GAAA,EAAK;MACHC,IAAI;MACJC,OAAA,EAAS;QAAEC;MAAM,CAAE;MACnBD,OAAO;MACPE;IAAI,CACL;IACDC;EAAe,CAChB,GAAGV,cAAA;EAEJ,MAAMW,wBAAA,GAA2BH,MAAA,CAAOI,KAAK,CAACC,UAAU,EAAEC,KAAA,EAAOf,SAAA;EAEjE,MAAMgB,WAAA,GAAcP,MAAA,CAAOO,WAAW,CAACC,MAAM,CAC1CC,UAAA,IACCb,WAAA,EAAaW,WAAA,GAAcE,UAAA,CAAWC,IAAI,CAAC,EAAEC,IAAA,EAAMC,UAAA,IACnDV,eAAA,CAAgBK,WAAW,CAACM,QAAQ,CAACJ,UAAA,CAAWC,IAAI;EAGxD,MAAMI,OAAA,GAAUd,MAAA,CAAOc,OAAO,CAACN,MAAM,CAClCO,MAAA,IACCnB,WAAA,EAAakB,OAAA,GAAUC,MAAA,CAAOL,IAAI,CAAC,EAAEC,IAAA,EAAMC,UAAA,IAC3CV,eAAA,CAAgBY,OAAO,CAACD,QAAQ,CAACE,MAAA,CAAOL,IAAI;EAGhD,MAAMM,SAAA,GAAYlC,aAAA,CAChB,C,IACMyB,WAAA,CAAYU,GAAG,CAAER,UAAA;IACnB,MAAMS,aAAA,GAA+B;MACnCC,IAAA,EAAMvC,UAAA,CAAW6B,UAAU;MAC3BW,MAAA,EAAQX;IACV;IAEA,OAAOS,aAAA;EACT,MAAM,EAAE,G,IACJJ,OAAA,CAAQG,GAAG,CAAEF,MAAA;IACf,MAAMG,aAAA,GAA+B;MACnCC,IAAA,EAAMvC,UAAA,CAAWmC,MAAM;MACvBK,MAAA,EAAQL;IACV;IAEA,OAAOG,aAAA;EACT,MAAM,EAAE,EACT,EACDtB,WAAA,EACAE,IAAA;EAGF,MAAMuB,qBAAA,GAAwBxC,wBAAA,CAAyB;IACrDyC,SAAA,EAAWvB,OAAA,CAAQuB,SAAS;IAC5BC,WAAA,EAAa;MACXzB,IAAA;MACAT,IAAA;MACAM,MAAA;MACAqB,SAAA;MACAvB,MAAA;MACAM,OAAA;MACAH,WAAA;MACAF,YAAA;MACAO,IAAA;MACAC;IACF;EACF;EAEA,MAAMsB,wBAAA,GAA2BH,qBAAA,CAC/BlB,wBAAA,EAA0BsB,SAAA,EAC1BC,SAAA,EACAvC,gBAAA,EACA;EAGF,oBACEwC,KAAA,CAACzC,QAAA;4BACC0C,IAAA,CAACjD,mBAAA;MAAoBiB,WAAA,EAAaA;qBAClCgC,IAAA,CAAC7C,eAAA;MACC8C,WAAA,EAAa;QACXxC,IAAA;QACAM;MACF;MACAmC,eAAA,EAAiBN;;;AAIzB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["HydrateAuthProvider","EntityType","getCreateMappedComponent","groupNavItems","RenderComponent","LinkImport","React","Fragment","DefaultDashboard","generateDashboardMetadata","Link","default","Dashboard","initPageResult","params","searchParams","locale","permissions","req","i18n","payload","config","user","visibleEntities","CustomDashboardComponent","admin","components","views","collections","filter","collection","slug","read","permission","includes","globals","global","globalSlugs","map","filteredGlobalSlugs","globalData","Promise","all","data","findGlobal","depth","includeLockStatus","navGroups","entityToGroup","type","entity","createMappedComponent","importMap","serverProps","mappedDashboardComponent","Component","undefined","_jsxs","_jsx","clientProps","mappedComponent"],"sources":["../../../src/views/Dashboard/index.tsx"],"sourcesContent":["import type { EntityToGroup } from '@payloadcms/ui/shared'\nimport type { AdminViewProps } from 'payload'\n\nimport { HydrateAuthProvider } from '@payloadcms/ui'\nimport {\n EntityType,\n getCreateMappedComponent,\n groupNavItems,\n RenderComponent,\n} from '@payloadcms/ui/shared'\nimport LinkImport from 'next/link.js'\nimport React, { Fragment } from 'react'\n\nimport { DefaultDashboard } from './Default/index.js'\n\nexport { generateDashboardMetadata } from './meta.js'\n\nconst Link = (LinkImport.default || LinkImport) as unknown as typeof LinkImport.default\n\nexport const Dashboard: React.FC<AdminViewProps> = async ({\n initPageResult,\n params,\n searchParams,\n}) => {\n const {\n locale,\n permissions,\n req: {\n i18n,\n payload: { config },\n payload,\n user,\n },\n visibleEntities,\n } = initPageResult\n\n const CustomDashboardComponent = config.admin.components?.views?.Dashboard\n\n const collections = config.collections.filter(\n (collection) =>\n permissions?.collections?.[collection.slug]?.read?.permission &&\n visibleEntities.collections.includes(collection.slug),\n )\n\n const globals = config.globals.filter(\n (global) =>\n permissions?.globals?.[global.slug]?.read?.permission &&\n visibleEntities.globals.includes(global.slug),\n )\n\n const globalSlugs = config.globals.map((global) => global.slug)\n\n // Filter the slugs based on permissions and visibility\n const filteredGlobalSlugs = globalSlugs.filter(\n (slug) =>\n permissions?.globals?.[slug]?.read?.permission && visibleEntities.globals.includes(slug),\n )\n\n const globalData = await Promise.all(\n filteredGlobalSlugs.map(async (slug) => {\n const data = await payload.findGlobal({\n slug,\n depth: 0,\n includeLockStatus: true,\n })\n\n return {\n slug,\n data,\n }\n }),\n )\n\n const navGroups = groupNavItems(\n [\n ...(collections.map((collection) => {\n const entityToGroup: EntityToGroup = {\n type: EntityType.collection,\n entity: collection,\n }\n\n return entityToGroup\n }) ?? []),\n ...(globals.map((global) => {\n const entityToGroup: EntityToGroup = {\n type: EntityType.global,\n entity: global,\n }\n\n return entityToGroup\n }) ?? []),\n ],\n permissions,\n i18n,\n )\n\n const createMappedComponent = getCreateMappedComponent({\n importMap: payload.importMap,\n serverProps: {\n globalData,\n i18n,\n Link,\n locale,\n navGroups,\n params,\n payload,\n permissions,\n searchParams,\n user,\n visibleEntities,\n },\n })\n\n const mappedDashboardComponent = createMappedComponent(\n CustomDashboardComponent?.Component,\n undefined,\n DefaultDashboard,\n 'CustomDashboardComponent.Component',\n )\n\n return (\n <Fragment>\n <HydrateAuthProvider permissions={permissions} />\n <RenderComponent\n clientProps={{\n Link,\n locale,\n }}\n mappedComponent={mappedDashboardComponent}\n />\n </Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import type { Data, Locale, PayloadRequest, SanitizedCollectionConfig, SanitizedGlobalConfig } from 'payload';
1
+ import type { Data, FormState, Locale, PayloadRequest, SanitizedCollectionConfig, SanitizedGlobalConfig } from 'payload';
2
2
  export declare const getDocumentData: (args: {
3
3
  collectionConfig?: SanitizedCollectionConfig;
4
4
  globalConfig?: SanitizedGlobalConfig;
@@ -6,5 +6,8 @@ export declare const getDocumentData: (args: {
6
6
  locale: Locale;
7
7
  req: PayloadRequest;
8
8
  schemaPath?: string;
9
- }) => Promise<Data>;
9
+ }) => Promise<{
10
+ data: Data;
11
+ formState: FormState;
12
+ }>;
10
13
  //# sourceMappingURL=getDocumentData.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getDocumentData.d.ts","sourceRoot":"","sources":["../../../src/views/Document/getDocumentData.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,MAAM,EACN,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAKhB,eAAO,MAAM,eAAe,SAAgB;IAC1C,gBAAgB,CAAC,EAAE,yBAAyB,CAAA;IAC5C,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,KAAG,OAAO,CAAC,IAAI,CA8Bf,CAAA"}
1
+ {"version":3,"file":"getDocumentData.d.ts","sourceRoot":"","sources":["../../../src/views/Document/getDocumentData.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,SAAS,EACT,MAAM,EACN,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACtB,MAAM,SAAS,CAAA;AAKhB,eAAO,MAAM,eAAe,SAAgB;IAC1C,gBAAgB,CAAC,EAAE,yBAAyB,CAAA;IAC5C,YAAY,CAAC,EAAE,qBAAqB,CAAA;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,cAAc,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,KAAG,OAAO,CAAC;IACV,IAAI,EAAE,IAAI,CAAA;IACV,SAAS,EAAE,SAAS,CAAA;CACrB,CAuCA,CAAA"}
@@ -11,7 +11,9 @@ export const getDocumentData = async args => {
11
11
  } = args;
12
12
  const schemaPath = schemaPathFromProps || collectionConfig?.slug || globalConfig?.slug;
13
13
  try {
14
- const formState = await buildFormState({
14
+ const {
15
+ state: formState
16
+ } = await buildFormState({
15
17
  req: {
16
18
  ...req,
17
19
  data: {
@@ -32,7 +34,16 @@ export const getDocumentData = async args => {
32
34
  } catch (error) {
33
35
  console.error('Error getting document data', error) // eslint-disable-line no-console
34
36
  ;
35
- return {};
37
+ return {
38
+ data: null,
39
+ formState: {
40
+ fields: {
41
+ initialValue: undefined,
42
+ valid: false,
43
+ value: undefined
44
+ }
45
+ }
46
+ };
36
47
  }
37
48
  };
38
49
  //# sourceMappingURL=getDocumentData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getDocumentData.js","names":["buildFormState","reduceFieldsToValues","getDocumentData","args","id","collectionConfig","globalConfig","locale","req","schemaPath","schemaPathFromProps","slug","formState","data","collectionSlug","globalSlug","code","operation","error","console"],"sources":["../../../src/views/Document/getDocumentData.tsx"],"sourcesContent":["import type {\n Data,\n Locale,\n PayloadRequest,\n SanitizedCollectionConfig,\n SanitizedGlobalConfig,\n} from 'payload'\n\nimport { buildFormState } from '@payloadcms/ui/utilities/buildFormState'\nimport { reduceFieldsToValues } from 'payload/shared'\n\nexport const getDocumentData = async (args: {\n collectionConfig?: SanitizedCollectionConfig\n globalConfig?: SanitizedGlobalConfig\n id?: number | string\n locale: Locale\n req: PayloadRequest\n schemaPath?: string\n}): Promise<Data> => {\n const { id, collectionConfig, globalConfig, locale, req, schemaPath: schemaPathFromProps } = args\n\n const schemaPath = schemaPathFromProps || collectionConfig?.slug || globalConfig?.slug\n\n try {\n const formState = await buildFormState({\n req: {\n ...req,\n data: {\n id,\n collectionSlug: collectionConfig?.slug,\n globalSlug: globalConfig?.slug,\n locale: locale?.code,\n operation: (collectionConfig && id) || globalConfig ? 'update' : 'create',\n schemaPath,\n },\n },\n })\n\n const data = reduceFieldsToValues(formState, true)\n\n return {\n data,\n formState,\n }\n } catch (error) {\n console.error('Error getting document data', error) // eslint-disable-line no-console\n return {}\n }\n}\n"],"mappings":"AAQA,SAASA,cAAc,QAAQ;AAC/B,SAASC,oBAAoB,QAAQ;AAErC,OAAO,MAAMC,eAAA,GAAkB,MAAOC,IAAA;EAQpC,MAAM;IAAEC,EAAE;IAAEC,gBAAgB;IAAEC,YAAY;IAAEC,MAAM;IAAEC,GAAG;IAAEC,UAAA,EAAYC;EAAmB,CAAE,GAAGP,IAAA;EAE7F,MAAMM,UAAA,GAAaC,mBAAA,IAAuBL,gBAAA,EAAkBM,IAAA,IAAQL,YAAA,EAAcK,IAAA;EAElF,IAAI;IACF,MAAMC,SAAA,GAAY,MAAMZ,cAAA,CAAe;MACrCQ,GAAA,EAAK;QACH,GAAGA,GAAG;QACNK,IAAA,EAAM;UACJT,EAAA;UACAU,cAAA,EAAgBT,gBAAA,EAAkBM,IAAA;UAClCI,UAAA,EAAYT,YAAA,EAAcK,IAAA;UAC1BJ,MAAA,EAAQA,MAAA,EAAQS,IAAA;UAChBC,SAAA,EAAWZ,gBAAC,IAAoBD,EAAA,IAAOE,YAAA,GAAe,WAAW;UACjEG;QACF;MACF;IACF;IAEA,MAAMI,IAAA,GAAOZ,oBAAA,CAAqBW,SAAA,EAAW;IAE7C,OAAO;MACLC,IAAA;MACAD;IACF;EACF,EAAE,OAAOM,KAAA,EAAO;IACdC,OAAA,CAAQD,KAAK,CAAC,+BAA+BA,KAAA,EAAO;IAAA;IACpD,OAAO,CAAC;EACV;AACF","ignoreList":[]}
1
+ {"version":3,"file":"getDocumentData.js","names":["buildFormState","reduceFieldsToValues","getDocumentData","args","id","collectionConfig","globalConfig","locale","req","schemaPath","schemaPathFromProps","slug","state","formState","data","collectionSlug","globalSlug","code","operation","error","console","fields","initialValue","undefined","valid","value"],"sources":["../../../src/views/Document/getDocumentData.tsx"],"sourcesContent":["import type {\n Data,\n FormState,\n Locale,\n PayloadRequest,\n SanitizedCollectionConfig,\n SanitizedGlobalConfig,\n} from 'payload'\n\nimport { buildFormState } from '@payloadcms/ui/utilities/buildFormState'\nimport { reduceFieldsToValues } from 'payload/shared'\n\nexport const getDocumentData = async (args: {\n collectionConfig?: SanitizedCollectionConfig\n globalConfig?: SanitizedGlobalConfig\n id?: number | string\n locale: Locale\n req: PayloadRequest\n schemaPath?: string\n}): Promise<{\n data: Data\n formState: FormState\n}> => {\n const { id, collectionConfig, globalConfig, locale, req, schemaPath: schemaPathFromProps } = args\n\n const schemaPath = schemaPathFromProps || collectionConfig?.slug || globalConfig?.slug\n\n try {\n const { state: formState } = await buildFormState({\n req: {\n ...req,\n data: {\n id,\n collectionSlug: collectionConfig?.slug,\n globalSlug: globalConfig?.slug,\n locale: locale?.code,\n operation: (collectionConfig && id) || globalConfig ? 'update' : 'create',\n schemaPath,\n },\n },\n })\n\n const data = reduceFieldsToValues(formState, true)\n\n return {\n data,\n formState,\n }\n } catch (error) {\n console.error('Error getting document data', error) // eslint-disable-line no-console\n return {\n data: null,\n formState: {\n fields: {\n initialValue: undefined,\n valid: false,\n value: undefined,\n },\n },\n }\n }\n}\n"],"mappings":"AASA,SAASA,cAAc,QAAQ;AAC/B,SAASC,oBAAoB,QAAQ;AAErC,OAAO,MAAMC,eAAA,GAAkB,MAAOC,IAAA;EAWpC,MAAM;IAAEC,EAAE;IAAEC,gBAAgB;IAAEC,YAAY;IAAEC,MAAM;IAAEC,GAAG;IAAEC,UAAA,EAAYC;EAAmB,CAAE,GAAGP,IAAA;EAE7F,MAAMM,UAAA,GAAaC,mBAAA,IAAuBL,gBAAA,EAAkBM,IAAA,IAAQL,YAAA,EAAcK,IAAA;EAElF,IAAI;IACF,MAAM;MAAEC,KAAA,EAAOC;IAAS,CAAE,GAAG,MAAMb,cAAA,CAAe;MAChDQ,GAAA,EAAK;QACH,GAAGA,GAAG;QACNM,IAAA,EAAM;UACJV,EAAA;UACAW,cAAA,EAAgBV,gBAAA,EAAkBM,IAAA;UAClCK,UAAA,EAAYV,YAAA,EAAcK,IAAA;UAC1BJ,MAAA,EAAQA,MAAA,EAAQU,IAAA;UAChBC,SAAA,EAAWb,gBAAC,IAAoBD,EAAA,IAAOE,YAAA,GAAe,WAAW;UACjEG;QACF;MACF;IACF;IAEA,MAAMK,IAAA,GAAOb,oBAAA,CAAqBY,SAAA,EAAW;IAE7C,OAAO;MACLC,IAAA;MACAD;IACF;EACF,EAAE,OAAOM,KAAA,EAAO;IACdC,OAAA,CAAQD,KAAK,CAAC,+BAA+BA,KAAA,EAAO;IAAA;IACpD,OAAO;MACLL,IAAA,EAAM;MACND,SAAA,EAAW;QACTQ,MAAA,EAAQ;UACNC,YAAA,EAAcC,SAAA;UACdC,KAAA,EAAO;UACPC,KAAA,EAAOF;QACT;MACF;IACF;EACF;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Edit/Default/index.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAA0C,MAAM,OAAO,CAAA;AAI9D,OAAO,cAAc,CAAA;AASrB,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAqQnC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Edit/Default/index.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAA6D,MAAM,OAAO,CAAA;AAMjF,OAAO,cAAc,CAAA;AASrB,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EA6enC,CAAA"}
@@ -4,7 +4,9 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  import { DocumentControls, DocumentFields, Form, OperationProvider, RenderComponent, Upload, useAuth, useConfig, useDocumentEvents, useDocumentInfo, useEditDepth, useUploadEdits } from '@payloadcms/ui';
5
5
  import { formatAdminURL, getFormState } from '@payloadcms/ui/shared';
6
6
  import { useRouter, useSearchParams } from 'next/navigation.js';
7
- import React, { Fragment, useCallback, useState } from 'react';
7
+ import React, { Fragment, useCallback, useEffect, useRef, useState } from 'react';
8
+ import { DocumentLocked } from '../../../elements/DocumentLocked/index.js';
9
+ import { DocumentTakeOver } from '../../../elements/DocumentTakeOver/index.js';
8
10
  import { LeaveWithoutSaving } from '../../../elements/LeaveWithoutSaving/index.js';
9
11
  import { Auth } from './Auth/index.js';
10
12
  import { SetDocumentStepNav } from './SetDocumentStepNav/index.js';
@@ -23,10 +25,12 @@ export const DefaultEditView = () => {
23
25
  BeforeDocument,
24
26
  BeforeFields,
25
27
  collectionSlug,
28
+ currentEditor,
26
29
  disableActions,
27
30
  disableCreate,
28
31
  disableLeaveWithoutSaving,
29
32
  docPermissions,
33
+ documentIsLocked,
30
34
  getDocPreferences,
31
35
  getVersions,
32
36
  globalSlug,
@@ -41,7 +45,11 @@ export const DefaultEditView = () => {
41
45
  onDuplicate,
42
46
  onSave: onSaveFromContext,
43
47
  redirectAfterDelete,
44
- redirectAfterDuplicate
48
+ redirectAfterDuplicate,
49
+ setCurrentEditor,
50
+ setDocumentIsLocked,
51
+ unlockDocument,
52
+ updateDocumentEditor
45
53
  } = useDocumentInfo();
46
54
  const {
47
55
  refreshCookieAsync,
@@ -81,15 +89,26 @@ export const DefaultEditView = () => {
81
89
  const operation = collectionSlug && !id ? 'create' : 'update';
82
90
  const auth = collectionConfig ? collectionConfig.auth : undefined;
83
91
  const upload = collectionConfig ? collectionConfig.upload : undefined;
92
+ const docConfig = collectionConfig || globalConfig;
93
+ const lockDocumentsProp = docConfig?.lockDocuments !== undefined ? docConfig?.lockDocuments : true;
94
+ const isLockingEnabled = lockDocumentsProp !== false;
84
95
  const preventLeaveWithoutSaving = (!(collectionConfig?.versions?.drafts && collectionConfig?.versions?.drafts?.autosave) || !(globalConfig?.versions?.drafts && globalConfig?.versions?.drafts?.autosave)) && !disableLeaveWithoutSaving;
85
- const classes = [baseClass, id && `${baseClass}--is-editing`];
96
+ const [isReadOnlyForIncomingUser, setIsReadOnlyForIncomingUser] = useState(false);
97
+ const [showTakeOverModal, setShowTakeOverModal] = useState(false);
98
+ const documentLockStateRef = useRef({
99
+ hasShownLockedModal: false,
100
+ isLocked: false,
101
+ user: null
102
+ });
103
+ const [lastUpdateTime, setLastUpdateTime] = useState(Date.now());
104
+ const classes = [baseClass, (id || globalSlug) && `${baseClass}--is-editing`];
86
105
  if (globalSlug) {
87
106
  classes.push(`global-edit--${globalSlug}`);
88
107
  }
89
108
  if (collectionSlug) {
90
109
  classes.push(`collection-edit--${collectionSlug}`);
91
110
  }
92
- const [schemaPath, setSchemaPath] = React.useState(() => {
111
+ const [schemaPath, setSchemaPath] = useState(() => {
93
112
  if (operation === 'create' && auth && !auth.disableLocalStrategy) {
94
113
  return `_${entitySlug}.auth`;
95
114
  }
@@ -101,6 +120,62 @@ export const DefaultEditView = () => {
101
120
  }
102
121
  return false;
103
122
  });
123
+ const handleTakeOver = useCallback(() => {
124
+ if (!isLockingEnabled) {
125
+ return;
126
+ }
127
+ try {
128
+ // Call updateDocumentEditor to update the document's owner to the current user
129
+ void updateDocumentEditor(id, collectionSlug ?? globalSlug, user);
130
+ documentLockStateRef.current.hasShownLockedModal = true;
131
+ // Update the locked state to reflect the current user as the owner
132
+ documentLockStateRef.current = {
133
+ hasShownLockedModal: documentLockStateRef.current?.hasShownLockedModal,
134
+ isLocked: true,
135
+ user
136
+ };
137
+ setCurrentEditor(user);
138
+ } catch (error) {
139
+ // eslint-disable-next-line no-console
140
+ console.error('Error during document takeover:', error);
141
+ }
142
+ }, [updateDocumentEditor, id, collectionSlug, globalSlug, user, setCurrentEditor, isLockingEnabled]);
143
+ const handleTakeOverWithinDoc = useCallback(() => {
144
+ if (!isLockingEnabled) {
145
+ return;
146
+ }
147
+ try {
148
+ // Call updateDocumentEditor to update the document's owner to the current user
149
+ void updateDocumentEditor(id, collectionSlug ?? globalSlug, user);
150
+ // Update the locked state to reflect the current user as the owner
151
+ documentLockStateRef.current = {
152
+ hasShownLockedModal: documentLockStateRef.current?.hasShownLockedModal,
153
+ isLocked: true,
154
+ user
155
+ };
156
+ setCurrentEditor(user);
157
+ // Ensure the document is editable for the incoming user
158
+ setIsReadOnlyForIncomingUser(false);
159
+ } catch (error_0) {
160
+ // eslint-disable-next-line no-console
161
+ console.error('Error during document takeover:', error_0);
162
+ }
163
+ }, [updateDocumentEditor, id, collectionSlug, globalSlug, user, setCurrentEditor, isLockingEnabled]);
164
+ const handleGoBack = useCallback(() => {
165
+ const redirectRoute = formatAdminURL({
166
+ adminRoute,
167
+ path: collectionSlug ? `/collections/${collectionSlug}` : '/'
168
+ });
169
+ router.push(redirectRoute);
170
+ }, [adminRoute, collectionSlug, router]);
171
+ const handleBackToDashboard = useCallback(() => {
172
+ setShowTakeOverModal(false);
173
+ const redirectRoute_0 = formatAdminURL({
174
+ adminRoute,
175
+ path: '/'
176
+ });
177
+ router.push(redirectRoute_0);
178
+ }, [adminRoute, router]);
104
179
  const onSave = useCallback(json => {
105
180
  reportUpdate({
106
181
  id,
@@ -119,22 +194,36 @@ export const DefaultEditView = () => {
119
194
  operation: id ? 'update' : 'create'
120
195
  });
121
196
  }
197
+ // Unlock the document after save
198
+ if ((id || globalSlug) && isLockingEnabled) {
199
+ setDocumentIsLocked(false);
200
+ }
122
201
  if (!isEditing && depth < 2) {
123
202
  // Redirect to the same locale if it's been set
124
- const redirectRoute = formatAdminURL({
203
+ const redirectRoute_1 = formatAdminURL({
125
204
  adminRoute,
126
205
  path: `/collections/${collectionSlug}/${json?.doc?.id}${locale ? `?locale=${locale}` : ''}`
127
206
  });
128
- router.push(redirectRoute);
207
+ router.push(redirectRoute_1);
129
208
  } else {
130
209
  resetUploadEdits();
131
210
  }
132
- }, [onSaveFromContext, userSlug, reportUpdate, id, entitySlug, user, depth, collectionSlug, getVersions, isEditing, refreshCookieAsync, adminRoute, router, locale, resetUploadEdits]);
211
+ }, [onSaveFromContext, userSlug, reportUpdate, id, entitySlug, user, depth, collectionSlug, getVersions, isEditing, refreshCookieAsync, adminRoute, router, locale, resetUploadEdits, globalSlug, isLockingEnabled, setDocumentIsLocked]);
133
212
  const onChange = useCallback(async ({
134
213
  formState: prevFormState
135
214
  }) => {
215
+ const currentTime = Date.now();
216
+ const timeSinceLastUpdate = currentTime - lastUpdateTime;
217
+ const updateLastEdited = isLockingEnabled && timeSinceLastUpdate >= 10000 // 10 seconds
218
+ ;
219
+ if (updateLastEdited) {
220
+ setLastUpdateTime(currentTime);
221
+ }
136
222
  const docPreferences = await getDocPreferences();
137
- return getFormState({
223
+ const {
224
+ lockedState,
225
+ state
226
+ } = await getFormState({
138
227
  apiRoute,
139
228
  body: {
140
229
  id,
@@ -143,11 +232,50 @@ export const DefaultEditView = () => {
143
232
  formState: prevFormState,
144
233
  globalSlug,
145
234
  operation,
146
- schemaPath
235
+ returnLockStatus: isLockingEnabled ? true : false,
236
+ schemaPath,
237
+ updateLastEdited
147
238
  },
148
239
  serverURL
149
240
  });
150
- }, [apiRoute, collectionSlug, schemaPath, getDocPreferences, globalSlug, id, operation, serverURL]);
241
+ setDocumentIsLocked(true);
242
+ if (isLockingEnabled) {
243
+ const previousOwnerId = documentLockStateRef.current?.user?.id;
244
+ if (lockedState) {
245
+ if (!documentLockStateRef.current || lockedState.user.id !== previousOwnerId) {
246
+ if (previousOwnerId === user.id && lockedState.user.id !== user.id) {
247
+ setShowTakeOverModal(true);
248
+ documentLockStateRef.current.hasShownLockedModal = true;
249
+ }
250
+ documentLockStateRef.current = documentLockStateRef.current = {
251
+ hasShownLockedModal: documentLockStateRef.current?.hasShownLockedModal || false,
252
+ isLocked: true,
253
+ user: lockedState.user
254
+ };
255
+ setCurrentEditor(lockedState.user);
256
+ }
257
+ }
258
+ }
259
+ return state;
260
+ }, [apiRoute, collectionSlug, schemaPath, getDocPreferences, globalSlug, id, operation, serverURL, user, documentLockStateRef, setCurrentEditor, isLockingEnabled, setDocumentIsLocked, lastUpdateTime]);
261
+ // Clean up when the component unmounts or when the document is unlocked
262
+ useEffect(() => {
263
+ return () => {
264
+ if (!isLockingEnabled) {
265
+ return;
266
+ }
267
+ if ((id || globalSlug) && documentIsLocked) {
268
+ // Check if this user is still the current editor
269
+ if (documentLockStateRef.current?.user?.id === user.id) {
270
+ void unlockDocument(id, collectionSlug ?? globalSlug);
271
+ setDocumentIsLocked(false);
272
+ setCurrentEditor(null);
273
+ }
274
+ }
275
+ setShowTakeOverModal(false);
276
+ };
277
+ }, [collectionSlug, globalSlug, id, unlockDocument, user.id, setCurrentEditor, isLockingEnabled, documentIsLocked, setDocumentIsLocked]);
278
+ const shouldShowDocumentLockedModal = documentIsLocked && currentEditor && currentEditor.id !== user.id && !isReadOnlyForIncomingUser && !showTakeOverModal && !documentLockStateRef.current?.hasShownLockedModal;
151
279
  return /*#__PURE__*/_jsx("main", {
152
280
  className: classes.filter(Boolean).join(' '),
153
281
  children: /*#__PURE__*/_jsx(OperationProvider, {
@@ -155,14 +283,31 @@ export const DefaultEditView = () => {
155
283
  children: /*#__PURE__*/_jsxs(Form, {
156
284
  action: action,
157
285
  className: `${baseClass}__form`,
158
- disabled: isInitializing || !hasSavePermission,
286
+ disabled: isReadOnlyForIncomingUser || isInitializing || !hasSavePermission,
159
287
  disableValidationOnSubmit: !validateBeforeSubmit,
160
288
  initialState: !isInitializing && initialState,
161
289
  isInitializing: isInitializing,
162
290
  method: id ? 'PATCH' : 'POST',
163
291
  onChange: [onChange],
164
292
  onSuccess: onSave,
165
- children: [BeforeDocument, preventLeaveWithoutSaving && /*#__PURE__*/_jsx(LeaveWithoutSaving, {}), /*#__PURE__*/_jsx(SetDocumentStepNav, {
293
+ children: [BeforeDocument, isLockingEnabled && shouldShowDocumentLockedModal && !isReadOnlyForIncomingUser && /*#__PURE__*/_jsx(DocumentLocked, {
294
+ handleGoBack: handleGoBack,
295
+ isActive: shouldShowDocumentLockedModal,
296
+ onReadOnly: () => {
297
+ setIsReadOnlyForIncomingUser(true);
298
+ setShowTakeOverModal(false);
299
+ },
300
+ onTakeOver: handleTakeOver,
301
+ updatedAt: lastUpdateTime,
302
+ user: currentEditor
303
+ }), isLockingEnabled && showTakeOverModal && /*#__PURE__*/_jsx(DocumentTakeOver, {
304
+ handleBackToDashboard: handleBackToDashboard,
305
+ isActive: showTakeOverModal,
306
+ onReadOnly: () => {
307
+ setIsReadOnlyForIncomingUser(true);
308
+ setShowTakeOverModal(false);
309
+ }
310
+ }), !isReadOnlyForIncomingUser && preventLeaveWithoutSaving && /*#__PURE__*/_jsx(LeaveWithoutSaving, {}), /*#__PURE__*/_jsx(SetDocumentStepNav, {
166
311
  collectionSlug: collectionConfig?.slug,
167
312
  globalSlug: globalConfig?.slug,
168
313
  id: id,
@@ -186,10 +331,13 @@ export const DefaultEditView = () => {
186
331
  onDrawerCreate: onDrawerCreate,
187
332
  onDuplicate: onDuplicate,
188
333
  onSave: onSave,
334
+ onTakeOver: handleTakeOverWithinDoc,
189
335
  permissions: docPermissions,
336
+ readOnlyForIncomingUser: isReadOnlyForIncomingUser,
190
337
  redirectAfterDelete: redirectAfterDelete,
191
338
  redirectAfterDuplicate: redirectAfterDuplicate,
192
- slug: collectionConfig?.slug || globalConfig?.slug
339
+ slug: collectionConfig?.slug || globalConfig?.slug,
340
+ user: currentEditor
193
341
  }), /*#__PURE__*/_jsx(DocumentFields, {
194
342
  AfterFields: AfterFields,
195
343
  BeforeFields: BeforeFields || /*#__PURE__*/_jsxs(Fragment, {
@@ -219,7 +367,7 @@ export const DefaultEditView = () => {
219
367
  }),
220
368
  docPermissions: docPermissions,
221
369
  fields: (collectionConfig || globalConfig)?.fields,
222
- readOnly: !hasSavePermission,
370
+ readOnly: isReadOnlyForIncomingUser || !hasSavePermission,
223
371
  schemaPath: schemaPath
224
372
  }), AfterDocument]
225
373
  })