@payload-onpage/plugin 0.0.0-stage → 0.2.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.
- package/LICENSE +21 -0
- package/README.md +15 -2
- package/dist/access.d.ts +20 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +51 -0
- package/dist/access.js.map +1 -0
- package/dist/admin/OnPageAdminControls.d.ts +9 -0
- package/dist/admin/OnPageAdminControls.d.ts.map +1 -0
- package/dist/admin/OnPageAdminControls.js +59 -0
- package/dist/admin/OnPageAdminControls.js.map +1 -0
- package/dist/admin/index.d.ts +3 -0
- package/dist/admin/index.d.ts.map +1 -0
- package/dist/admin/index.js +2 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/endpoints.d.ts +11 -0
- package/dist/endpoints.d.ts.map +1 -0
- package/dist/endpoints.js +223 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/hooks.d.ts +38 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +42 -0
- package/dist/hooks.js.map +1 -0
- package/dist/http.d.ts +23 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +53 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +148 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +59 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +4 -0
- package/dist/options.js.map +1 -0
- package/dist/paths.d.ts +11 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +58 -0
- package/dist/paths.js.map +1 -0
- package/dist/schema.d.ts +34 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +209 -0
- package/dist/schema.js.map +1 -0
- package/dist/tokens.d.ts +18 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +24 -0
- package/dist/tokens.js.map +1 -0
- package/dist/translations.d.ts +45 -0
- package/dist/translations.d.ts.map +1 -0
- package/dist/translations.js +44 -0
- package/dist/translations.js.map +1 -0
- package/package.json +65 -4
- package/src/access.ts +65 -0
- package/src/admin/OnPageAdminControls.tsx +99 -0
- package/src/admin/index.ts +2 -0
- package/src/endpoints.ts +269 -0
- package/src/hooks.ts +79 -0
- package/src/http.ts +57 -0
- package/src/index.ts +167 -0
- package/src/options.ts +65 -0
- package/src/paths.ts +59 -0
- package/src/schema.ts +251 -0
- package/src/tokens.ts +46 -0
- package/src/translations.ts +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/tokens.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface PreviewTokenPayload {
|
|
2
|
+
/** refKey of the shared document */
|
|
3
|
+
ref: string;
|
|
4
|
+
/** Site path the link opens. */
|
|
5
|
+
path: string;
|
|
6
|
+
locale?: string;
|
|
7
|
+
/** Issued at / expires at, seconds since epoch. */
|
|
8
|
+
iat: number;
|
|
9
|
+
exp: number;
|
|
10
|
+
/** Unique id, for audit logs and revocation lists. */
|
|
11
|
+
jti: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function createPreviewToken(payload: Pick<PreviewTokenPayload, 'ref' | 'path' | 'locale'>, secret: string, ttlSeconds: number, now?: number): Promise<{
|
|
14
|
+
token: string;
|
|
15
|
+
payload: PreviewTokenPayload;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function verifyPreviewToken(token: string, secret: string, now?: number): Promise<PreviewTokenPayload | null>;
|
|
18
|
+
//# sourceMappingURL=tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAA;IACX,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAA;IACX,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC,EAC7D,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,GAAG,SAAa,GACf,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,CAAC,CAS1D;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,GAAG,SAAa,GACf,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAMrC"}
|
package/dist/tokens.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preview-link tokens: sealed (AES-GCM) and expiring, bound to one document
|
|
3
|
+
* and path. Opaque to the holder, so the link reveals nothing about the draft.
|
|
4
|
+
*/
|
|
5
|
+
import { SEAL_PURPOSE, seal, unseal } from '@payload-onpage/core';
|
|
6
|
+
export async function createPreviewToken(payload, secret, ttlSeconds, now = Date.now()) {
|
|
7
|
+
const iat = Math.floor(now / 1000);
|
|
8
|
+
const full = {
|
|
9
|
+
...payload,
|
|
10
|
+
iat,
|
|
11
|
+
exp: iat + ttlSeconds,
|
|
12
|
+
jti: crypto.randomUUID(),
|
|
13
|
+
};
|
|
14
|
+
return { token: await seal(full, secret, SEAL_PURPOSE.previewLink), payload: full };
|
|
15
|
+
}
|
|
16
|
+
export async function verifyPreviewToken(token, secret, now = Date.now()) {
|
|
17
|
+
const p = await unseal(token, secret, SEAL_PURPOSE.previewLink);
|
|
18
|
+
if (!p || typeof p.exp !== 'number' || p.exp * 1000 <= now)
|
|
19
|
+
return null;
|
|
20
|
+
if (typeof p.path !== 'string' || typeof p.ref !== 'string' || typeof p.jti !== 'string')
|
|
21
|
+
return null;
|
|
22
|
+
return p;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAejE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAA6D,EAC7D,MAAc,EACd,UAAkB,EAClB,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;IAClC,MAAM,IAAI,GAAwB;QAChC,GAAG,OAAO;QACV,GAAG;QACH,GAAG,EAAE,GAAG,GAAG,UAAU;QACrB,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE;KACzB,CAAA;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACrF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,MAAc,EACd,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAEhB,MAAM,CAAC,GAAG,MAAM,MAAM,CAAsB,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;IACpF,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG;QAAE,OAAO,IAAI,CAAA;IACvE,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ;QACtF,OAAO,IAAI,CAAA;IACb,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin UI strings, registered with Payload's i18n under the `onpage` namespace
|
|
3
|
+
* (so the admin language applies). Add or override languages with
|
|
4
|
+
* `i18n.translations` in your Payload config.
|
|
5
|
+
*/
|
|
6
|
+
export declare const translations: {
|
|
7
|
+
en: {
|
|
8
|
+
onpage: {
|
|
9
|
+
editOnPage: string;
|
|
10
|
+
copyPreviewLink: string;
|
|
11
|
+
copyPreviewLinkHint: string;
|
|
12
|
+
linkCopied: string;
|
|
13
|
+
linkFailed: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
es: {
|
|
17
|
+
onpage: {
|
|
18
|
+
editOnPage: string;
|
|
19
|
+
copyPreviewLink: string;
|
|
20
|
+
copyPreviewLinkHint: string;
|
|
21
|
+
linkCopied: string;
|
|
22
|
+
linkFailed: string;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
fr: {
|
|
26
|
+
onpage: {
|
|
27
|
+
editOnPage: string;
|
|
28
|
+
copyPreviewLink: string;
|
|
29
|
+
copyPreviewLinkHint: string;
|
|
30
|
+
linkCopied: string;
|
|
31
|
+
linkFailed: string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
de: {
|
|
35
|
+
onpage: {
|
|
36
|
+
editOnPage: string;
|
|
37
|
+
copyPreviewLink: string;
|
|
38
|
+
copyPreviewLinkHint: string;
|
|
39
|
+
linkCopied: string;
|
|
40
|
+
linkFailed: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export type OnPageTranslationKey = `onpage:${keyof (typeof translations)['en']['onpage']}`;
|
|
45
|
+
//# sourceMappingURL=translations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../src/translations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCxB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,MAAM,CAAC,OAAO,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin UI strings, registered with Payload's i18n under the `onpage` namespace
|
|
3
|
+
* (so the admin language applies). Add or override languages with
|
|
4
|
+
* `i18n.translations` in your Payload config.
|
|
5
|
+
*/
|
|
6
|
+
export const translations = {
|
|
7
|
+
en: {
|
|
8
|
+
onpage: {
|
|
9
|
+
editOnPage: 'Edit on page',
|
|
10
|
+
copyPreviewLink: 'Copy preview link',
|
|
11
|
+
copyPreviewLinkHint: 'Copy a read-only link to this draft',
|
|
12
|
+
linkCopied: 'Preview link copied — valid until {{date}}',
|
|
13
|
+
linkFailed: "Couldn't create a preview link: {{message}}",
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
es: {
|
|
17
|
+
onpage: {
|
|
18
|
+
editOnPage: 'Editar en la página',
|
|
19
|
+
copyPreviewLink: 'Copiar enlace de vista previa',
|
|
20
|
+
copyPreviewLinkHint: 'Copiar un enlace de solo lectura a este borrador',
|
|
21
|
+
linkCopied: 'Enlace copiado: válido hasta {{date}}',
|
|
22
|
+
linkFailed: 'No se pudo crear el enlace: {{message}}',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
fr: {
|
|
26
|
+
onpage: {
|
|
27
|
+
editOnPage: 'Modifier sur la page',
|
|
28
|
+
copyPreviewLink: 'Copier le lien d’aperçu',
|
|
29
|
+
copyPreviewLinkHint: 'Copier un lien en lecture seule vers ce brouillon',
|
|
30
|
+
linkCopied: 'Lien copié — valide jusqu’au {{date}}',
|
|
31
|
+
linkFailed: 'Impossible de créer le lien : {{message}}',
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
de: {
|
|
35
|
+
onpage: {
|
|
36
|
+
editOnPage: 'Auf der Seite bearbeiten',
|
|
37
|
+
copyPreviewLink: 'Vorschaulink kopieren',
|
|
38
|
+
copyPreviewLinkHint: 'Einen schreibgeschützten Link zu diesem Entwurf kopieren',
|
|
39
|
+
linkCopied: 'Vorschaulink kopiert – gültig bis {{date}}',
|
|
40
|
+
linkFailed: 'Vorschaulink konnte nicht erstellt werden: {{message}}',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=translations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translations.js","sourceRoot":"","sources":["../src/translations.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,EAAE,EAAE;QACF,MAAM,EAAE;YACN,UAAU,EAAE,cAAc;YAC1B,eAAe,EAAE,mBAAmB;YACpC,mBAAmB,EAAE,qCAAqC;YAC1D,UAAU,EAAE,4CAA4C;YACxD,UAAU,EAAE,6CAA6C;SAC1D;KACF;IACD,EAAE,EAAE;QACF,MAAM,EAAE;YACN,UAAU,EAAE,qBAAqB;YACjC,eAAe,EAAE,+BAA+B;YAChD,mBAAmB,EAAE,kDAAkD;YACvE,UAAU,EAAE,uCAAuC;YACnD,UAAU,EAAE,yCAAyC;SACtD;KACF;IACD,EAAE,EAAE;QACF,MAAM,EAAE;YACN,UAAU,EAAE,sBAAsB;YAClC,eAAe,EAAE,yBAAyB;YAC1C,mBAAmB,EAAE,mDAAmD;YACxE,UAAU,EAAE,uCAAuC;YACnD,UAAU,EAAE,2CAA2C;SACxD;KACF;IACD,EAAE,EAAE;QACF,MAAM,EAAE;YACN,UAAU,EAAE,0BAA0B;YACtC,eAAe,EAAE,uBAAuB;YACxC,mBAAmB,EAAE,0DAA0D;YAC/E,UAAU,EAAE,4CAA4C;YACxD,UAAU,EAAE,wDAAwD;SACrE;KACF;CACF,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,67 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payload-onpage/plugin",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "payload-onpage for Payload CMS: on-page editing endpoints, auto-mapping, preview links and admin controls.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/jellologic/payload-onpage.git",
|
|
11
|
+
"directory": "packages/plugin"
|
|
12
|
+
},
|
|
13
|
+
"homepage": "https://github.com/jellologic/payload-onpage#readme",
|
|
14
|
+
"bugs": "https://github.com/jellologic/payload-onpage/issues",
|
|
15
|
+
"keywords": [
|
|
16
|
+
"payload",
|
|
17
|
+
"payloadcms",
|
|
18
|
+
"payload-plugin",
|
|
19
|
+
"nextjs",
|
|
20
|
+
"visual-editing",
|
|
21
|
+
"live-preview",
|
|
22
|
+
"inline-editing",
|
|
23
|
+
"cms"
|
|
24
|
+
],
|
|
25
|
+
"exports": {
|
|
26
|
+
".": {
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"default": "./dist/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./admin": {
|
|
31
|
+
"types": "./dist/admin/index.d.ts",
|
|
32
|
+
"default": "./dist/admin/index.js"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"main": "./dist/index.js",
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"files": [
|
|
38
|
+
"dist",
|
|
39
|
+
"!dist/.tsbuildinfo",
|
|
40
|
+
"src",
|
|
41
|
+
"!src/**/__tests__",
|
|
42
|
+
"README.md",
|
|
43
|
+
"LICENSE"
|
|
44
|
+
],
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc -b",
|
|
47
|
+
"typecheck": "tsc -b",
|
|
48
|
+
"test": "bun test src",
|
|
49
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo"
|
|
50
|
+
},
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public",
|
|
53
|
+
"provenance": true
|
|
54
|
+
},
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@payload-onpage/core": "0.1.0"
|
|
57
|
+
},
|
|
58
|
+
"peerDependencies": {
|
|
59
|
+
"payload": "^3.90.2",
|
|
60
|
+
"@payloadcms/ui": "^3.90.2",
|
|
61
|
+
"@payloadcms/translations": "^3.90.2",
|
|
62
|
+
"react": "^19.0.0"
|
|
63
|
+
},
|
|
64
|
+
"engines": {
|
|
65
|
+
"node": ">=20.9.0"
|
|
66
|
+
}
|
|
67
|
+
}
|
package/src/access.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who may use on-page editing, and edit which documents. Document access is
|
|
3
|
+
* evaluated by Payload itself (`docAccessOperation`), so row-level rules
|
|
4
|
+
* (access functions that return a query) and field permissions behave exactly
|
|
5
|
+
* as in the admin.
|
|
6
|
+
*/
|
|
7
|
+
import type { DocRef } from '@payload-onpage/core'
|
|
8
|
+
import {
|
|
9
|
+
docAccessOperation,
|
|
10
|
+
docAccessOperationGlobal,
|
|
11
|
+
type PayloadRequest,
|
|
12
|
+
type SanitizedCollectionPermission,
|
|
13
|
+
type SanitizedGlobalPermission,
|
|
14
|
+
} from 'payload'
|
|
15
|
+
import type { OnPageOptions } from './options.ts'
|
|
16
|
+
|
|
17
|
+
/** Signed in as an admin user (or allowed by the `access` option). */
|
|
18
|
+
export async function canUseOnPage(req: PayloadRequest, options: OnPageOptions): Promise<boolean> {
|
|
19
|
+
if (!req.user) return false
|
|
20
|
+
if (options.access) return Boolean(await options.access({ req }))
|
|
21
|
+
return req.user.collection === req.payload.config.admin.user
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Payload's sanitized permissions for one document (or the collection, without an id). */
|
|
25
|
+
export async function documentPermissions(
|
|
26
|
+
req: PayloadRequest,
|
|
27
|
+
ref: DocRef | { kind: 'collection'; slug: string; id?: undefined },
|
|
28
|
+
): Promise<SanitizedCollectionPermission | SanitizedGlobalPermission | null> {
|
|
29
|
+
try {
|
|
30
|
+
if (ref.kind === 'global') {
|
|
31
|
+
const globalConfig = req.payload.globals.config.find((g) => g.slug === ref.slug)
|
|
32
|
+
return globalConfig ? await docAccessOperationGlobal({ globalConfig, req }) : null
|
|
33
|
+
}
|
|
34
|
+
const collection = req.payload.collections[ref.slug]
|
|
35
|
+
if (!collection) return null
|
|
36
|
+
return await docAccessOperation({ collection, id: ref.id, req })
|
|
37
|
+
} catch {
|
|
38
|
+
return null
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** May this user edit this document on the page? */
|
|
43
|
+
export async function canEditDocument(
|
|
44
|
+
req: PayloadRequest,
|
|
45
|
+
ref: DocRef,
|
|
46
|
+
options: OnPageOptions,
|
|
47
|
+
): Promise<boolean> {
|
|
48
|
+
if (!req.user) return false
|
|
49
|
+
if (options.access) return Boolean(await options.access({ req, ref }))
|
|
50
|
+
if (!(await canUseOnPage(req, options))) return false
|
|
51
|
+
const perms = await documentPermissions(req, ref)
|
|
52
|
+
const update = perms?.update as
|
|
53
|
+
true | { permission?: boolean; where?: Record<string, unknown> } | undefined
|
|
54
|
+
if (update === true) return true
|
|
55
|
+
if (!update?.permission) return false
|
|
56
|
+
// A row-level rule comes back as a query: check that this document matches it.
|
|
57
|
+
if (!update.where || ref.kind !== 'collection') return !update.where
|
|
58
|
+
const { totalDocs } = await req.payload.count({
|
|
59
|
+
collection: ref.slug as never,
|
|
60
|
+
where: { and: [{ id: { equals: ref.id } }, update.where] } as never,
|
|
61
|
+
overrideAccess: true,
|
|
62
|
+
req,
|
|
63
|
+
})
|
|
64
|
+
return totalDocs > 0
|
|
65
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Document controls added by payload-onpage: open this document's page in edit
|
|
5
|
+
* mode, or copy a sealed read-only preview link. Hidden for users who can't
|
|
6
|
+
* update the document.
|
|
7
|
+
*/
|
|
8
|
+
import { payloadRest } from '@payload-onpage/core/payload'
|
|
9
|
+
import {
|
|
10
|
+
Button,
|
|
11
|
+
toast,
|
|
12
|
+
useConfig,
|
|
13
|
+
useDocumentInfo,
|
|
14
|
+
useLocale,
|
|
15
|
+
useTranslation,
|
|
16
|
+
} from '@payloadcms/ui'
|
|
17
|
+
import type { OnPageTranslationKey } from '../translations.ts'
|
|
18
|
+
import { useMemo, useState } from 'react'
|
|
19
|
+
|
|
20
|
+
export interface OnPageAdminControlsProps {
|
|
21
|
+
kind: 'collection' | 'global'
|
|
22
|
+
slug: string
|
|
23
|
+
/** Plugin endpoint prefix (`routePrefix`). */
|
|
24
|
+
prefix: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Same-origin POST (the endpoint refuses cross-site requests) opened in a new tab.
|
|
29
|
+
* A detached form: these controls render inside the admin's document <form>, and forms can't nest.
|
|
30
|
+
*/
|
|
31
|
+
function postInNewTab(action: string) {
|
|
32
|
+
const form = document.createElement('form')
|
|
33
|
+
form.method = 'post'
|
|
34
|
+
form.action = action
|
|
35
|
+
form.target = '_blank'
|
|
36
|
+
document.body.appendChild(form)
|
|
37
|
+
form.submit()
|
|
38
|
+
form.remove()
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function OnPageAdminControls({ kind, slug, prefix }: OnPageAdminControlsProps) {
|
|
42
|
+
const { id, hasSavePermission } = useDocumentInfo()
|
|
43
|
+
const { config } = useConfig()
|
|
44
|
+
const locale = useLocale()
|
|
45
|
+
const { t: translate } = useTranslation()
|
|
46
|
+
const t = (key: OnPageTranslationKey, vars?: Record<string, string>) =>
|
|
47
|
+
(translate as (k: string, v?: Record<string, string>) => string)(key, vars)
|
|
48
|
+
const [busy, setBusy] = useState(false)
|
|
49
|
+
const apiBase = `${config.serverURL ?? ''}${config.routes.api}`
|
|
50
|
+
const dataSource = useMemo(() => payloadRest({ apiBase, prefix }), [apiBase, prefix])
|
|
51
|
+
|
|
52
|
+
if ((kind === 'collection' && !id) || hasSavePermission === false) return null
|
|
53
|
+
|
|
54
|
+
const ref = kind === 'global' ? ({ kind, slug } as const) : ({ kind, slug, id: id! } as const)
|
|
55
|
+
const params = new URLSearchParams({ kind, slug, mode: 'edit' })
|
|
56
|
+
if (kind === 'collection') params.set('id', String(id))
|
|
57
|
+
if (locale?.code) params.set('locale', locale.code)
|
|
58
|
+
|
|
59
|
+
const copyLink = async () => {
|
|
60
|
+
setBusy(true)
|
|
61
|
+
try {
|
|
62
|
+
const link = await dataSource.createPreviewLink!(ref, { locale: locale?.code })
|
|
63
|
+
await navigator.clipboard.writeText(link.url)
|
|
64
|
+
toast.success(
|
|
65
|
+
`Preview link copied — valid until ${new Date(link.expiresAt).toLocaleString()}`,
|
|
66
|
+
)
|
|
67
|
+
} catch (e) {
|
|
68
|
+
toast.error(t('onpage:linkFailed', { message: (e as Error).message }))
|
|
69
|
+
} finally {
|
|
70
|
+
setBusy(false)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const style = { whiteSpace: 'nowrap' as const, flexShrink: 0 }
|
|
75
|
+
return (
|
|
76
|
+
<div style={{ display: 'flex', gap: 6 }} data-testid="onpage-admin-controls">
|
|
77
|
+
<Button
|
|
78
|
+
buttonStyle="secondary"
|
|
79
|
+
size="medium"
|
|
80
|
+
onClick={() => postInNewTab(`${apiBase}${prefix}/enter?${params}`)}
|
|
81
|
+
extraButtonProps={{ style, 'data-testid': 'onpage-edit-on-page' }}
|
|
82
|
+
>
|
|
83
|
+
{t('onpage:editOnPage')}
|
|
84
|
+
</Button>
|
|
85
|
+
<Button
|
|
86
|
+
buttonStyle="subtle"
|
|
87
|
+
size="medium"
|
|
88
|
+
onClick={() => void copyLink()}
|
|
89
|
+
disabled={busy}
|
|
90
|
+
tooltip={t('onpage:copyPreviewLinkHint')}
|
|
91
|
+
extraButtonProps={{ style, 'data-testid': 'onpage-copy-preview-link' }}
|
|
92
|
+
>
|
|
93
|
+
{t('onpage:copyPreviewLink')}
|
|
94
|
+
</Button>
|
|
95
|
+
</div>
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export default OnPageAdminControls
|