@forumone/throughline 2.1.0 → 2.2.0-next-623d42c
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/CHANGELOG.md +41 -0
- package/dist/approvals/endpoints/action.d.ts.map +1 -1
- package/dist/approvals/endpoints/action.js +27 -8
- package/dist/approvals/endpoints/action.js.map +1 -1
- package/dist/approvals/tokens.d.ts +3 -0
- package/dist/approvals/tokens.d.ts.map +1 -1
- package/dist/approvals/tokens.js +1 -1
- package/dist/approvals/tokens.js.map +1 -1
- package/dist/authoring/tools.d.ts.map +1 -1
- package/dist/authoring/tools.js +6 -1
- package/dist/authoring/tools.js.map +1 -1
- package/dist/components/tools/validate-composition.d.ts.map +1 -1
- package/dist/components/tools/validate-composition.js +4 -1
- package/dist/components/tools/validate-composition.js.map +1 -1
- package/dist/components/validation/composition.d.ts +9 -1
- package/dist/components/validation/composition.d.ts.map +1 -1
- package/dist/components/validation/composition.js +9 -7
- package/dist/components/validation/composition.js.map +1 -1
- package/dist/exports/client.d.ts +3 -0
- package/dist/exports/client.d.ts.map +1 -1
- package/dist/exports/client.js +2 -0
- package/dist/exports/client.js.map +1 -1
- package/dist/fields/slug.d.ts.map +1 -1
- package/dist/fields/slug.js +4 -1
- package/dist/fields/slug.js.map +1 -1
- package/dist/integrations/admin/SyncButton.d.ts.map +1 -1
- package/dist/integrations/admin/SyncButton.js +11 -5
- package/dist/integrations/admin/SyncButton.js.map +1 -1
- package/dist/integrations/admin/sync-client.d.ts +2 -0
- package/dist/integrations/admin/sync-client.d.ts.map +1 -1
- package/dist/integrations/admin/sync-client.js +7 -1
- package/dist/integrations/admin/sync-client.js.map +1 -1
- package/dist/integrations/collection.d.ts +1 -1
- package/dist/integrations/collection.d.ts.map +1 -1
- package/dist/integrations/collection.js +11 -4
- package/dist/integrations/collection.js.map +1 -1
- package/dist/integrations/sync/status.d.ts +17 -4
- package/dist/integrations/sync/status.d.ts.map +1 -1
- package/dist/integrations/sync/status.js +37 -6
- package/dist/integrations/sync/status.js.map +1 -1
- package/dist/media/hooks.d.ts.map +1 -1
- package/dist/media/hooks.js +11 -9
- package/dist/media/hooks.js.map +1 -1
- package/dist/migrate/exports.json +16 -0
- package/dist/publishing/admin/FirstErrorProvider.d.ts +24 -0
- package/dist/publishing/admin/FirstErrorProvider.d.ts.map +1 -0
- package/dist/publishing/admin/FirstErrorProvider.js +100 -0
- package/dist/publishing/admin/FirstErrorProvider.js.map +1 -0
- package/dist/publishing/admin/PublishButton.d.ts.map +1 -1
- package/dist/publishing/admin/PublishButton.js +18 -3
- package/dist/publishing/admin/PublishButton.js.map +1 -1
- package/dist/publishing/admin/SchedulePublishField.d.ts.map +1 -1
- package/dist/publishing/admin/SchedulePublishField.js +25 -10
- package/dist/publishing/admin/SchedulePublishField.js.map +1 -1
- package/dist/publishing/admin/UnpublishButton.d.ts.map +1 -1
- package/dist/publishing/admin/UnpublishButton.js +9 -3
- package/dist/publishing/admin/UnpublishButton.js.map +1 -1
- package/dist/publishing/admin/first-error.d.ts +60 -0
- package/dist/publishing/admin/first-error.d.ts.map +1 -0
- package/dist/publishing/admin/first-error.js +211 -0
- package/dist/publishing/admin/first-error.js.map +1 -0
- package/dist/publishing/admin/publishing-client.d.ts +33 -4
- package/dist/publishing/admin/publishing-client.d.ts.map +1 -1
- package/dist/publishing/admin/publishing-client.js +56 -21
- package/dist/publishing/admin/publishing-client.js.map +1 -1
- package/dist/publishing/admin/schedule-state.d.ts +31 -4
- package/dist/publishing/admin/schedule-state.d.ts.map +1 -1
- package/dist/publishing/admin/schedule-state.js +26 -14
- package/dist/publishing/admin/schedule-state.js.map +1 -1
- package/dist/publishing/checks/alt-text.d.ts.map +1 -1
- package/dist/publishing/checks/alt-text.js +3 -1
- package/dist/publishing/checks/alt-text.js.map +1 -1
- package/dist/publishing/checks/heading-hierarchy.d.ts +9 -3
- package/dist/publishing/checks/heading-hierarchy.d.ts.map +1 -1
- package/dist/publishing/checks/heading-hierarchy.js +19 -6
- package/dist/publishing/checks/heading-hierarchy.js.map +1 -1
- package/dist/publishing/checks/link-labels.js +1 -1
- package/dist/publishing/checks/link-labels.js.map +1 -1
- package/dist/publishing/endpoints/admin.d.ts.map +1 -1
- package/dist/publishing/endpoints/admin.js +26 -7
- package/dist/publishing/endpoints/admin.js.map +1 -1
- package/dist/publishing/events.d.ts +15 -1
- package/dist/publishing/events.d.ts.map +1 -1
- package/dist/publishing/events.js +17 -2
- package/dist/publishing/events.js.map +1 -1
- package/dist/publishing/hooks/block-status-writes.js +5 -2
- package/dist/publishing/hooks/block-status-writes.js.map +1 -1
- package/dist/publishing/hooks/schedule-events.d.ts.map +1 -1
- package/dist/publishing/hooks/schedule-events.js +5 -7
- package/dist/publishing/hooks/schedule-events.js.map +1 -1
- package/dist/publishing/index.d.ts +9 -1
- package/dist/publishing/index.d.ts.map +1 -1
- package/dist/publishing/index.js +7 -0
- package/dist/publishing/index.js.map +1 -1
- package/dist/publishing/messages.d.ts +63 -0
- package/dist/publishing/messages.d.ts.map +1 -0
- package/dist/publishing/messages.js +84 -0
- package/dist/publishing/messages.js.map +1 -0
- package/dist/publishing/options.d.ts +46 -1
- package/dist/publishing/options.d.ts.map +1 -1
- package/dist/publishing/options.js +8 -0
- package/dist/publishing/options.js.map +1 -1
- package/dist/publishing/pipeline/finish.d.ts +12 -0
- package/dist/publishing/pipeline/finish.d.ts.map +1 -0
- package/dist/publishing/pipeline/finish.js +24 -0
- package/dist/publishing/pipeline/finish.js.map +1 -0
- package/dist/publishing/pipeline/index.d.ts.map +1 -1
- package/dist/publishing/pipeline/index.js +11 -8
- package/dist/publishing/pipeline/index.js.map +1 -1
- package/dist/publishing/pipeline/steps/accessibility.d.ts +3 -3
- package/dist/publishing/pipeline/steps/accessibility.d.ts.map +1 -1
- package/dist/publishing/pipeline/steps/accessibility.js +17 -9
- package/dist/publishing/pipeline/steps/accessibility.js.map +1 -1
- package/dist/publishing/pipeline/steps/approval.d.ts.map +1 -1
- package/dist/publishing/pipeline/steps/approval.js +6 -4
- package/dist/publishing/pipeline/steps/approval.js.map +1 -1
- package/dist/publishing/pipeline/steps/composition.d.ts.map +1 -1
- package/dist/publishing/pipeline/steps/composition.js +36 -17
- package/dist/publishing/pipeline/steps/composition.js.map +1 -1
- package/dist/publishing/pipeline/steps/embargo.d.ts +4 -0
- package/dist/publishing/pipeline/steps/embargo.d.ts.map +1 -1
- package/dist/publishing/pipeline/steps/embargo.js +13 -4
- package/dist/publishing/pipeline/steps/embargo.js.map +1 -1
- package/dist/publishing/pipeline/steps/execute.d.ts.map +1 -1
- package/dist/publishing/pipeline/steps/execute.js +48 -5
- package/dist/publishing/pipeline/steps/execute.js.map +1 -1
- package/dist/publishing/pipeline/steps/exist.d.ts +2 -0
- package/dist/publishing/pipeline/steps/exist.d.ts.map +1 -1
- package/dist/publishing/pipeline/steps/exist.js +5 -3
- package/dist/publishing/pipeline/steps/exist.js.map +1 -1
- package/dist/publishing/pipeline/steps/link-targets.d.ts +3 -0
- package/dist/publishing/pipeline/steps/link-targets.d.ts.map +1 -0
- package/dist/publishing/pipeline/steps/link-targets.js +293 -0
- package/dist/publishing/pipeline/steps/link-targets.js.map +1 -0
- package/dist/publishing/pipeline/steps/required-fields.d.ts.map +1 -1
- package/dist/publishing/pipeline/steps/required-fields.js +7 -5
- package/dist/publishing/pipeline/steps/required-fields.js.map +1 -1
- package/dist/publishing/pipeline/types.d.ts +25 -0
- package/dist/publishing/pipeline/types.d.ts.map +1 -1
- package/dist/publishing/pipeline/where.d.ts +13 -0
- package/dist/publishing/pipeline/where.d.ts.map +1 -0
- package/dist/publishing/pipeline/where.js +44 -0
- package/dist/publishing/pipeline/where.js.map +1 -0
- package/dist/publishing/plugin.d.ts.map +1 -1
- package/dist/publishing/plugin.js +22 -0
- package/dist/publishing/plugin.js.map +1 -1
- package/dist/publishing/service.d.ts +26 -17
- package/dist/publishing/service.d.ts.map +1 -1
- package/dist/publishing/service.js +43 -32
- package/dist/publishing/service.js.map +1 -1
- package/dist/publishing/tools/get-publish-status.d.ts.map +1 -1
- package/dist/publishing/tools/get-publish-status.js +4 -0
- package/dist/publishing/tools/get-publish-status.js.map +1 -1
- package/dist/publishing/tools/rollback.d.ts.map +1 -1
- package/dist/publishing/tools/rollback.js +1 -1
- package/dist/publishing/tools/rollback.js.map +1 -1
- package/dist/references/UsedOnPanel.d.ts.map +1 -1
- package/dist/references/UsedOnPanel.js +1 -1
- package/dist/references/UsedOnPanel.js.map +1 -1
- package/dist/references/find.d.ts +12 -1
- package/dist/references/find.d.ts.map +1 -1
- package/dist/references/find.js +24 -5
- package/dist/references/find.js.map +1 -1
- package/dist/references/guards.d.ts.map +1 -1
- package/dist/references/guards.js +9 -2
- package/dist/references/guards.js.map +1 -1
- package/dist/references/index.d.ts +4 -2
- package/dist/references/index.d.ts.map +1 -1
- package/dist/references/index.js +2 -1
- package/dist/references/index.js.map +1 -1
- package/dist/references/links.d.ts +45 -0
- package/dist/references/links.d.ts.map +1 -0
- package/dist/references/links.js +117 -0
- package/dist/references/links.js.map +1 -0
- package/dist/references/walk.d.ts +70 -0
- package/dist/references/walk.d.ts.map +1 -1
- package/dist/references/walk.js +88 -41
- package/dist/references/walk.js.map +1 -1
- package/dist/utils/field-path.d.ts +56 -0
- package/dist/utils/field-path.d.ts.map +1 -0
- package/dist/utils/field-path.js +146 -0
- package/dist/utils/field-path.js.map +1 -0
- package/package.json +6 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FirstErrorProvider.js","sourceRoot":"","sources":["../../../src/publishing/admin/FirstErrorProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublishButton.d.ts","sourceRoot":"","sources":["../../../src/publishing/admin/PublishButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"PublishButton.d.ts","sourceRoot":"","sources":["../../../src/publishing/admin/PublishButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAA;AAmBpD,MAAM,WAAW,6BAA6B;IAC5C,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,KAAK,GAAE,6BAAkC,GAAG,KAAK,CAAC,SAAS,CA2LxF"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useCallback, useState } from 'react';
|
|
4
4
|
import { FormSubmit, toast, useConfig, useDocumentInfo, useForm, useFormModified, useTranslation, } from '@payloadcms/ui';
|
|
5
|
-
import {
|
|
5
|
+
import { disarmFirstError, goToFirstError } from './first-error.js';
|
|
6
|
+
import { SHOW_ME, blockToastId, callPublishingEndpoint, describeBlock, fieldErrorsFromBlock, } from './publishing-client.js';
|
|
6
7
|
/**
|
|
7
8
|
* Replaces Payload's Publish button on collections the publishing plugin
|
|
8
9
|
* governs.
|
|
@@ -68,8 +69,15 @@ export function PublishButton(props = {}) {
|
|
|
68
69
|
collection: collectionSlug,
|
|
69
70
|
id,
|
|
70
71
|
});
|
|
72
|
+
/*
|
|
73
|
+
Every error this raises stays until it is closed, and has one id per
|
|
74
|
+
document, so a second click replaces the toast rather than stacking a
|
|
75
|
+
copy (forumone-2026#805). A notification three lines long is not read in
|
|
76
|
+
the default four seconds.
|
|
77
|
+
*/
|
|
78
|
+
const toastId = blockToastId('publish', collectionSlug, id);
|
|
71
79
|
if (!result.ok) {
|
|
72
|
-
toast.error(result.message);
|
|
80
|
+
toast.error(result.message, { id: toastId, duration: Infinity });
|
|
73
81
|
return;
|
|
74
82
|
}
|
|
75
83
|
if (!result.body.published) {
|
|
@@ -93,16 +101,23 @@ export function PublishButton(props = {}) {
|
|
|
93
101
|
dispatchFields({ type: 'ADD_SERVER_ERRORS', errors: fieldErrors });
|
|
94
102
|
setIsValid(false);
|
|
95
103
|
setSubmitted(true);
|
|
104
|
+
// Straight to the first of them. The provider would do it too on
|
|
105
|
+
// this toast; this is the one place that knows it should.
|
|
106
|
+
disarmFirstError();
|
|
107
|
+
void goToFirstError();
|
|
96
108
|
}
|
|
97
109
|
const { title, description } = describeBlock(result.body, {
|
|
98
110
|
markedFields: fieldErrors.length,
|
|
99
111
|
});
|
|
100
112
|
toast.error(title, {
|
|
113
|
+
id: toastId,
|
|
101
114
|
...(description ? { description } : {}),
|
|
102
|
-
duration:
|
|
115
|
+
duration: Infinity,
|
|
116
|
+
...(fieldErrors.length > 0 ? { action: SHOW_ME } : {}),
|
|
103
117
|
});
|
|
104
118
|
return;
|
|
105
119
|
}
|
|
120
|
+
toast.dismiss(toastId);
|
|
106
121
|
// Deliberately not resetting the form here. The draft save above
|
|
107
122
|
// already merged the server's response into form state, so the fields
|
|
108
123
|
// on screen are what was just written. Resetting from
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PublishButton.js","sourceRoot":"","sources":["../../../src/publishing/admin/PublishButton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,EACL,UAAU,EACV,KAAK,EACL,SAAS,EACT,eAAe,EACf,OAAO,EACP,eAAe,EACf,cAAc,GACf,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"PublishButton.js","sourceRoot":"","sources":["../../../src/publishing/admin/PublishButton.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchedulePublishField.d.ts","sourceRoot":"","sources":["../../../src/publishing/admin/SchedulePublishField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"SchedulePublishField.d.ts","sourceRoot":"","sources":["../../../src/publishing/admin/SchedulePublishField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAA;AAsBpD,MAAM,WAAW,oCAAoC;IACnD,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAA;IACZ,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oCAAoC,GAAG,KAAK,CAAC,SAAS,CAqJjG"}
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useCallback, useState } from 'react';
|
|
4
4
|
import { Button, DatePicker, FieldLabel, toast, useConfig, useDocumentInfo, useField, useForm, useFormModified, } from '@payloadcms/ui';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { disarmFirstError, goToFirstError } from './first-error.js';
|
|
6
|
+
import { SHOW_ME, blockToastId, callPublishingEndpoint, describeBlock, fieldErrorsFromBlock, } from './publishing-client.js';
|
|
7
|
+
import { formatScheduledTime, scheduleState, unscheduleOutcome } from './schedule-state.js';
|
|
7
8
|
/**
|
|
8
9
|
* The Schedule control, rendered in place of the scheduled-publish date field.
|
|
9
10
|
*
|
|
@@ -59,8 +60,10 @@ export function SchedulePublishField(props) {
|
|
|
59
60
|
id,
|
|
60
61
|
publishAt: chosen.toISOString(),
|
|
61
62
|
});
|
|
63
|
+
// Errors stay until closed, one per document (forumone-2026#805).
|
|
64
|
+
const toastId = blockToastId('schedule', collectionSlug, id);
|
|
62
65
|
if (!result.ok) {
|
|
63
|
-
toast.error(result.message);
|
|
66
|
+
toast.error(result.message, { id: toastId, duration: Infinity });
|
|
64
67
|
return;
|
|
65
68
|
}
|
|
66
69
|
if (!result.body.scheduled || !result.body.scheduledFor) {
|
|
@@ -71,16 +74,21 @@ export function SchedulePublishField(props) {
|
|
|
71
74
|
dispatchFields({ type: 'ADD_SERVER_ERRORS', errors: fieldErrors });
|
|
72
75
|
setIsValid(false);
|
|
73
76
|
setSubmitted(true);
|
|
77
|
+
disarmFirstError();
|
|
78
|
+
void goToFirstError();
|
|
74
79
|
}
|
|
75
80
|
const { title, description } = describeBlock(result.body, {
|
|
76
81
|
markedFields: fieldErrors.length,
|
|
77
82
|
});
|
|
78
83
|
toast.error(`Not scheduled. ${title}`, {
|
|
84
|
+
id: toastId,
|
|
79
85
|
...(description ? { description } : {}),
|
|
80
|
-
duration:
|
|
86
|
+
duration: Infinity,
|
|
87
|
+
...(fieldErrors.length > 0 ? { action: SHOW_ME } : {}),
|
|
81
88
|
});
|
|
82
89
|
return;
|
|
83
90
|
}
|
|
91
|
+
toast.dismiss(toastId);
|
|
84
92
|
setValue(result.body.scheduledFor, true);
|
|
85
93
|
setChosen(null);
|
|
86
94
|
incrementVersionCount();
|
|
@@ -126,15 +134,22 @@ export function SchedulePublishField(props) {
|
|
|
126
134
|
collection: collectionSlug,
|
|
127
135
|
id,
|
|
128
136
|
});
|
|
137
|
+
const toastId = blockToastId('unschedule', collectionSlug, id);
|
|
129
138
|
if (!result.ok) {
|
|
130
|
-
toast.error(result.message);
|
|
139
|
+
toast.error(result.message, { id: toastId, duration: Infinity });
|
|
131
140
|
return;
|
|
132
141
|
}
|
|
133
|
-
|
|
134
|
-
|
|
142
|
+
const outcome = unscheduleOutcome(result.body);
|
|
143
|
+
if (outcome.clear)
|
|
144
|
+
setValue(null, true);
|
|
135
145
|
if (result.body.unscheduled)
|
|
136
146
|
incrementVersionCount();
|
|
137
|
-
|
|
147
|
+
if (outcome.kind === 'error')
|
|
148
|
+
toast.error(outcome.message, { id: toastId, duration: Infinity });
|
|
149
|
+
else if (outcome.kind === 'info')
|
|
150
|
+
toast.info(outcome.message, { id: toastId });
|
|
151
|
+
else
|
|
152
|
+
toast.success(outcome.message, { id: toastId });
|
|
138
153
|
}
|
|
139
154
|
finally {
|
|
140
155
|
setBusy(false);
|
|
@@ -147,13 +162,13 @@ function Body(props) {
|
|
|
147
162
|
if (state.kind !== 'none') {
|
|
148
163
|
return (_jsxs(_Fragment, { children: [_jsx("p", { style: { margin: '0 0 0.5rem' }, children: state.kind === 'upcoming'
|
|
149
164
|
? `Publishes automatically ${state.label}.`
|
|
150
|
-
: `
|
|
165
|
+
: `This was due to publish ${state.label} but hasn't. Click Publish to see what's stopping it.` }), props.canSchedule ? (_jsx(Button, { buttonStyle: "secondary", size: "small", disabled: props.busy, onClick: props.onCancel, children: "Cancel schedule" })) : null] }));
|
|
151
166
|
}
|
|
152
167
|
if (!props.hasDocument) {
|
|
153
168
|
return _jsx("p", { style: { margin: 0 }, children: "Save a draft first, then schedule it." });
|
|
154
169
|
}
|
|
155
170
|
if (!props.canSchedule) {
|
|
156
|
-
return _jsx("p", { style: { margin: 0 }, children: "
|
|
171
|
+
return _jsx("p", { style: { margin: 0 }, children: "You don't have permission to schedule publishing." });
|
|
157
172
|
}
|
|
158
173
|
return (_jsxs(_Fragment, { children: [_jsx(DatePicker, { pickerAppearance: "dayAndTime", minDate: new Date(), timeIntervals: 15, ...(props.chosen ? { value: props.chosen } : {}), onChange: (date) => props.onChoose(date ?? null), readOnly: props.busy }), _jsx("div", { style: { marginTop: '0.5rem' }, children: _jsx(Button, { buttonStyle: "secondary", size: "small", disabled: !props.chosen || props.busy, onClick: props.onSchedule, children: props.busy ? 'Scheduling…' : 'Schedule' }) })] }));
|
|
159
174
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchedulePublishField.js","sourceRoot":"","sources":["../../../src/publishing/admin/SchedulePublishField.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,EACL,MAAM,EACN,UAAU,EACV,UAAU,EACV,KAAK,EACL,SAAS,EACT,eAAe,EACf,QAAQ,EACR,OAAO,EACP,eAAe,GAChB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"SchedulePublishField.js","sourceRoot":"","sources":["../../../src/publishing/admin/SchedulePublishField.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnpublishButton.d.ts","sourceRoot":"","sources":["../../../src/publishing/admin/UnpublishButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAA;AAapD,MAAM,WAAW,+BAA+B;IAC9C,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,KAAK,GAAE,+BAAoC,GAC1C,KAAK,CAAC,SAAS,
|
|
1
|
+
{"version":3,"file":"UnpublishButton.d.ts","sourceRoot":"","sources":["../../../src/publishing/admin/UnpublishButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAA;AAapD,MAAM,WAAW,+BAA+B;IAC9C,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,KAAK,GAAE,+BAAoC,GAC1C,KAAK,CAAC,SAAS,CAkHjB"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import React, { useCallback, useState } from 'react';
|
|
4
4
|
import { ConfirmationModal, PopupList, toast, useConfig, useDocumentInfo, useForm, useModal, useTranslation, } from '@payloadcms/ui';
|
|
5
|
-
import { callPublishingEndpoint } from './publishing-client.js';
|
|
5
|
+
import { blockToastId, callPublishingEndpoint } from './publishing-client.js';
|
|
6
6
|
/**
|
|
7
7
|
* Replaces Payload's Unpublish control on collections the publishing plugin
|
|
8
8
|
* governs. Same reasoning as the Publish button: the native control writes
|
|
@@ -35,14 +35,20 @@ export function UnpublishButton(props = {}) {
|
|
|
35
35
|
collection: collectionSlug,
|
|
36
36
|
id,
|
|
37
37
|
});
|
|
38
|
+
// Errors stay until closed, one per document (forumone-2026#805).
|
|
39
|
+
const toastId = blockToastId('unpublish', collectionSlug, id);
|
|
38
40
|
if (!result.ok) {
|
|
39
|
-
toast.error(result.message);
|
|
41
|
+
toast.error(result.message, { id: toastId, duration: Infinity });
|
|
40
42
|
return;
|
|
41
43
|
}
|
|
42
44
|
if (!result.body.unpublished) {
|
|
43
|
-
toast.error(result.body.reason ?? t('error:unPublishingDocument')
|
|
45
|
+
toast.error(result.body.reason ?? t('error:unPublishingDocument'), {
|
|
46
|
+
id: toastId,
|
|
47
|
+
duration: Infinity,
|
|
48
|
+
});
|
|
44
49
|
return;
|
|
45
50
|
}
|
|
51
|
+
toast.dismiss(toastId);
|
|
46
52
|
await reset({ ...(data ?? {}), _status: 'draft' });
|
|
47
53
|
incrementVersionCount();
|
|
48
54
|
setUnpublishedVersionCount(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UnpublishButton.js","sourceRoot":"","sources":["../../../src/publishing/admin/UnpublishButton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACpD,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,KAAK,EACL,SAAS,EACT,eAAe,EACf,OAAO,EACP,QAAQ,EACR,cAAc,GACf,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"UnpublishButton.js","sourceRoot":"","sources":["../../../src/publishing/admin/UnpublishButton.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/** What to do next to reach the first error. */
|
|
2
|
+
export type FirstErrorStep =
|
|
3
|
+
/** Open this tab: the first error is among its fields, which are not rendered yet. */
|
|
4
|
+
{
|
|
5
|
+
kind: 'tab';
|
|
6
|
+
element: HTMLElement;
|
|
7
|
+
}
|
|
8
|
+
/** Click this toggle: the first error is inside a collapsed row. Outermost first. */
|
|
9
|
+
| {
|
|
10
|
+
kind: 'expand';
|
|
11
|
+
element: HTMLElement;
|
|
12
|
+
}
|
|
13
|
+
/** The field itself: scroll to it and focus it. */
|
|
14
|
+
| {
|
|
15
|
+
kind: 'field';
|
|
16
|
+
element: HTMLElement;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The next step towards the first error under `root`, or `null` when nothing
|
|
20
|
+
* is marked. Call it again after each step: opening a tab renders fields that
|
|
21
|
+
* were not there to find.
|
|
22
|
+
*/
|
|
23
|
+
export declare function nextStep(root: ParentNode): FirstErrorStep | null;
|
|
24
|
+
/** Every collapsed container around `element`, outermost first. */
|
|
25
|
+
export declare function collapsedAncestors(element: Element): HTMLElement[];
|
|
26
|
+
/** The first thing inside a field that takes focus, if any. */
|
|
27
|
+
export declare function focusTarget(field: HTMLElement): HTMLElement | null;
|
|
28
|
+
/**
|
|
29
|
+
* How far below the top of the viewport a field must land to clear whatever
|
|
30
|
+
* is stuck there — Payload's app header and the document's controls bar.
|
|
31
|
+
*/
|
|
32
|
+
export declare function stickyOffset(doc?: Document): number;
|
|
33
|
+
export interface GoToFirstErrorOptions {
|
|
34
|
+
/** Where to look. Default: the whole document. */
|
|
35
|
+
root?: ParentNode;
|
|
36
|
+
/** Steps to try before giving up. A tab and two nested rows is three. */
|
|
37
|
+
maxSteps?: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Brings the first invalid field into view and focuses it. Resolves `true`
|
|
41
|
+
* when it found one.
|
|
42
|
+
*
|
|
43
|
+
* Waits a frame before looking, and a little longer when nothing is marked
|
|
44
|
+
* yet, because it is called straight after the errors are dispatched and the
|
|
45
|
+
* form has not rendered them.
|
|
46
|
+
*/
|
|
47
|
+
export declare function goToFirstError(options?: GoToFirstErrorOptions): Promise<boolean>;
|
|
48
|
+
/** Scrolls `field` to just below the sticky header and focuses its input. */
|
|
49
|
+
export declare function reveal(field: HTMLElement): void;
|
|
50
|
+
/** How long after a click a failure still counts as that click's. */
|
|
51
|
+
export declare const ARMED_FOR_MS = 20000;
|
|
52
|
+
export declare function armFirstError(now?: number): void;
|
|
53
|
+
export declare function disarmFirstError(): void;
|
|
54
|
+
/** Whether a failure now belongs to an explicit save, consuming the arm if so. */
|
|
55
|
+
export declare function takeArmed(now?: number): boolean;
|
|
56
|
+
/** The save buttons Payload renders, by the ids it gives them. */
|
|
57
|
+
export declare const SAVE_BUTTON = "#action-save, #action-save-draft";
|
|
58
|
+
/** Whether `event` is the editor asking to save: a save button, or the shortcut. */
|
|
59
|
+
export declare function isExplicitSave(event: Event): boolean;
|
|
60
|
+
//# sourceMappingURL=first-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"first-error.d.ts","sourceRoot":"","sources":["../../../src/publishing/admin/first-error.ts"],"names":[],"mappings":"AA6BA,gDAAgD;AAChD,MAAM,MAAM,cAAc;AACxB,sFAAsF;AACpF;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE;AACvC,qFAAqF;GACnF;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE;AAC1C,mDAAmD;GACjD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAA;AAE3C;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,IAAI,CA0BhE;AAED,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,EAAE,CAMlE;AAOD,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI,CAWlE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,GAAE,QAAmB,GAAG,MAAM,CAY7D;AAED,MAAM,WAAW,qBAAqB;IACpC,kDAAkD;IAClD,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAYD;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,OAAO,CAAC,CA4B1F;AAED,6EAA6E;AAC7E,wBAAgB,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAwB/C;AAaD,qEAAqE;AACrE,eAAO,MAAM,YAAY,QAAS,CAAA;AAElC,wBAAgB,aAAa,CAAC,GAAG,SAAa,GAAG,IAAI,CAEpD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,GAAG,SAAa,GAAG,OAAO,CAInD;AAED,kEAAkE;AAClE,eAAO,MAAM,WAAW,qCAAqC,CAAA;AAE7D,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUpD"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Go to the first field that is wrong. forumone-2026#805.
|
|
3
|
+
|
|
4
|
+
A failed save, publish or schedule marks its fields red and leaves the editor to
|
|
5
|
+
find them — further down the page, on a tab they are not on, or inside a block
|
|
6
|
+
that is collapsed. This finds the first one in page order, opens whatever hides
|
|
7
|
+
it, scrolls it into view below the sticky header, and moves focus to it, which
|
|
8
|
+
also tells a screen-reader user where the problem is.
|
|
9
|
+
|
|
10
|
+
It reads the DOM Payload's admin renders, because that is where "invalid" and
|
|
11
|
+
"hidden" both live, and nothing in form state says which tab is open or which
|
|
12
|
+
row is collapsed. The classes it reads are Payload's own (`@payloadcms/ui` 3.x):
|
|
13
|
+
|
|
14
|
+
- `.field-type.error` — a field showing its error;
|
|
15
|
+
- `.tabs-field__tab-button--has-error` — a tab whose fields have errors, and
|
|
16
|
+
`--active` on the one that is open (only its fields are rendered);
|
|
17
|
+
- `.collapsible--collapsed` — a block row, array row or collapsible that is
|
|
18
|
+
closed, whose fields are rendered but not displayed; `.collapsible__toggle`
|
|
19
|
+
opens it.
|
|
20
|
+
|
|
21
|
+
No JSX, so the decision is testable against a document built by hand.
|
|
22
|
+
*/
|
|
23
|
+
const FIELD_ERROR = '.field-type.error';
|
|
24
|
+
const TAB_ERROR = '.tabs-field__tab-button--has-error';
|
|
25
|
+
const TAB_ACTIVE = 'tabs-field__tab-button--active';
|
|
26
|
+
const TAB_HIDDEN = 'tabs-field__tab-button--hidden';
|
|
27
|
+
const COLLAPSED = 'collapsible--collapsed';
|
|
28
|
+
/**
|
|
29
|
+
* The next step towards the first error under `root`, or `null` when nothing
|
|
30
|
+
* is marked. Call it again after each step: opening a tab renders fields that
|
|
31
|
+
* were not there to find.
|
|
32
|
+
*/
|
|
33
|
+
export function nextStep(root) {
|
|
34
|
+
const candidates = root.querySelectorAll(`${FIELD_ERROR}, ${TAB_ERROR}`);
|
|
35
|
+
for (const candidate of Array.from(candidates)) {
|
|
36
|
+
if (candidate.matches(TAB_ERROR)) {
|
|
37
|
+
if (candidate.classList.contains(TAB_ACTIVE) || candidate.classList.contains(TAB_HIDDEN)) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
/*
|
|
41
|
+
The open tab's fields render after the whole tab bar, so an inactive tab
|
|
42
|
+
with errors comes first in the document even when the open one has
|
|
43
|
+
errors of its own. Those are the ones on screen: go to them first.
|
|
44
|
+
*/
|
|
45
|
+
const bar = candidate.parentElement;
|
|
46
|
+
if (bar?.querySelector(`.${TAB_ACTIVE}${TAB_ERROR}`))
|
|
47
|
+
continue;
|
|
48
|
+
return { kind: 'tab', element: candidate };
|
|
49
|
+
}
|
|
50
|
+
const collapsed = collapsedAncestors(candidate);
|
|
51
|
+
if (collapsed.length > 0) {
|
|
52
|
+
const toggle = toggleOf(collapsed[0]);
|
|
53
|
+
if (toggle)
|
|
54
|
+
return { kind: 'expand', element: toggle };
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
return { kind: 'field', element: candidate };
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/** Every collapsed container around `element`, outermost first. */
|
|
62
|
+
export function collapsedAncestors(element) {
|
|
63
|
+
const found = [];
|
|
64
|
+
for (let at = element.parentElement; at; at = at.parentElement) {
|
|
65
|
+
if (at.classList.contains(COLLAPSED))
|
|
66
|
+
found.unshift(at);
|
|
67
|
+
}
|
|
68
|
+
return found;
|
|
69
|
+
}
|
|
70
|
+
/** A collapsible's own toggle: its header comes before its content. */
|
|
71
|
+
function toggleOf(collapsible) {
|
|
72
|
+
return collapsible.querySelector('.collapsible__toggle');
|
|
73
|
+
}
|
|
74
|
+
/** The first thing inside a field that takes focus, if any. */
|
|
75
|
+
export function focusTarget(field) {
|
|
76
|
+
return field.querySelector([
|
|
77
|
+
'input:not([type="hidden"]):not([disabled])',
|
|
78
|
+
'textarea:not([disabled])',
|
|
79
|
+
'select:not([disabled])',
|
|
80
|
+
'[contenteditable="true"]',
|
|
81
|
+
'button:not([disabled])',
|
|
82
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
83
|
+
].join(', '));
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* How far below the top of the viewport a field must land to clear whatever
|
|
87
|
+
* is stuck there — Payload's app header and the document's controls bar.
|
|
88
|
+
*/
|
|
89
|
+
export function stickyOffset(doc = document) {
|
|
90
|
+
let bottom = 0;
|
|
91
|
+
const headers = doc.querySelectorAll('.app-header, .doc-header, .doc-controls, [data-sticky-header]');
|
|
92
|
+
for (const element of Array.from(headers)) {
|
|
93
|
+
const position = doc.defaultView?.getComputedStyle(element).position;
|
|
94
|
+
if (position !== 'sticky' && position !== 'fixed')
|
|
95
|
+
continue;
|
|
96
|
+
const rect = element.getBoundingClientRect();
|
|
97
|
+
if (rect.top <= 1)
|
|
98
|
+
bottom = Math.max(bottom, rect.bottom);
|
|
99
|
+
}
|
|
100
|
+
return bottom;
|
|
101
|
+
}
|
|
102
|
+
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
103
|
+
const nextFrame = () => new Promise((resolve) => {
|
|
104
|
+
if (typeof requestAnimationFrame === 'function')
|
|
105
|
+
requestAnimationFrame(() => resolve());
|
|
106
|
+
else
|
|
107
|
+
setTimeout(resolve, 16);
|
|
108
|
+
});
|
|
109
|
+
/** How long a collapsible takes to open: `AnimateHeight`'s default duration. */
|
|
110
|
+
const EXPAND_MS = 320;
|
|
111
|
+
/**
|
|
112
|
+
* Brings the first invalid field into view and focuses it. Resolves `true`
|
|
113
|
+
* when it found one.
|
|
114
|
+
*
|
|
115
|
+
* Waits a frame before looking, and a little longer when nothing is marked
|
|
116
|
+
* yet, because it is called straight after the errors are dispatched and the
|
|
117
|
+
* form has not rendered them.
|
|
118
|
+
*/
|
|
119
|
+
export async function goToFirstError(options = {}) {
|
|
120
|
+
if (typeof document === 'undefined')
|
|
121
|
+
return false;
|
|
122
|
+
const root = options.root ?? document;
|
|
123
|
+
const maxSteps = options.maxSteps ?? 8;
|
|
124
|
+
let empty = 0;
|
|
125
|
+
for (let step = 0; step < maxSteps; step++) {
|
|
126
|
+
await nextFrame();
|
|
127
|
+
const next = nextStep(root);
|
|
128
|
+
if (!next) {
|
|
129
|
+
// Not rendered yet, or nothing to find. Three tries, then the latter.
|
|
130
|
+
if (++empty > 3)
|
|
131
|
+
return false;
|
|
132
|
+
await wait(100);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (next.kind === 'tab') {
|
|
136
|
+
next.element.click();
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (next.kind === 'expand') {
|
|
140
|
+
next.element.click();
|
|
141
|
+
await wait(EXPAND_MS);
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
reveal(next.element);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
/** Scrolls `field` to just below the sticky header and focuses its input. */
|
|
150
|
+
export function reveal(field) {
|
|
151
|
+
const reduced = typeof window !== 'undefined' &&
|
|
152
|
+
typeof window.matchMedia === 'function' &&
|
|
153
|
+
window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
154
|
+
// `scroll-margin-top` is what `scrollIntoView` honours, in whichever element
|
|
155
|
+
// scrolls. Put back afterwards so it never affects anything else.
|
|
156
|
+
const previous = field.style.scrollMarginTop;
|
|
157
|
+
field.style.scrollMarginTop = `${Math.round(stickyOffset(field.ownerDocument) + 16)}px`;
|
|
158
|
+
field.scrollIntoView({ block: 'start', behavior: reduced ? 'auto' : 'smooth' });
|
|
159
|
+
setTimeout(() => {
|
|
160
|
+
field.style.scrollMarginTop = previous;
|
|
161
|
+
}, 1000);
|
|
162
|
+
const target = focusTarget(field);
|
|
163
|
+
if (target) {
|
|
164
|
+
target.focus({ preventScroll: true });
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// Nothing inside takes focus: the field itself does, so a screen reader
|
|
168
|
+
// still lands on it.
|
|
169
|
+
if (!field.hasAttribute('tabindex'))
|
|
170
|
+
field.setAttribute('tabindex', '-1');
|
|
171
|
+
field.focus({ preventScroll: true });
|
|
172
|
+
}
|
|
173
|
+
/*
|
|
174
|
+
A save, publish or schedule the editor asked for, as opposed to an autosave.
|
|
175
|
+
|
|
176
|
+
The provider arms this when one of Payload's save buttons is clicked, or the
|
|
177
|
+
save shortcut pressed, and goes to the first error only if an error toast
|
|
178
|
+
follows while it is armed. An autosave has no click, so the page never moves
|
|
179
|
+
while somebody is typing. A control that goes to the first error itself — the
|
|
180
|
+
Publish button — disarms it first, so the error is not gone to twice.
|
|
181
|
+
*/
|
|
182
|
+
let armedUntil = 0;
|
|
183
|
+
/** How long after a click a failure still counts as that click's. */
|
|
184
|
+
export const ARMED_FOR_MS = 20_000;
|
|
185
|
+
export function armFirstError(now = Date.now()) {
|
|
186
|
+
armedUntil = now + ARMED_FOR_MS;
|
|
187
|
+
}
|
|
188
|
+
export function disarmFirstError() {
|
|
189
|
+
armedUntil = 0;
|
|
190
|
+
}
|
|
191
|
+
/** Whether a failure now belongs to an explicit save, consuming the arm if so. */
|
|
192
|
+
export function takeArmed(now = Date.now()) {
|
|
193
|
+
const armed = now <= armedUntil;
|
|
194
|
+
armedUntil = 0;
|
|
195
|
+
return armed;
|
|
196
|
+
}
|
|
197
|
+
/** The save buttons Payload renders, by the ids it gives them. */
|
|
198
|
+
export const SAVE_BUTTON = '#action-save, #action-save-draft';
|
|
199
|
+
/** Whether `event` is the editor asking to save: a save button, or the shortcut. */
|
|
200
|
+
export function isExplicitSave(event) {
|
|
201
|
+
if (event.type === 'click') {
|
|
202
|
+
const target = event.target;
|
|
203
|
+
return Boolean(target?.closest?.(SAVE_BUTTON));
|
|
204
|
+
}
|
|
205
|
+
if (event.type === 'keydown') {
|
|
206
|
+
const key = event;
|
|
207
|
+
return (key.metaKey || key.ctrlKey) && key.key.toLowerCase() === 's';
|
|
208
|
+
}
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=first-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"first-error.js","sourceRoot":"","sources":["../../../src/publishing/admin/first-error.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
* Client-side helpers shared by the admin Publish and Unpublish controls.
|
|
3
3
|
* No JSX here so the message formatting can be unit tested directly.
|
|
4
4
|
*/
|
|
5
|
+
import { type HumanDateOptions, type MessageDate } from '../messages.js';
|
|
5
6
|
export interface PublishingIssue {
|
|
6
7
|
field?: string;
|
|
7
8
|
message: string;
|
|
8
9
|
severity?: 'error' | 'warning';
|
|
9
10
|
rule?: string;
|
|
11
|
+
/** Where `field` is, in the editor's words: `Block 3 (Image Hero) › Image`. */
|
|
12
|
+
where?: string;
|
|
10
13
|
}
|
|
11
14
|
export interface PublishingResponse {
|
|
12
15
|
published?: boolean;
|
|
@@ -20,6 +23,10 @@ export interface PublishingResponse {
|
|
|
20
23
|
code?: string;
|
|
21
24
|
issues?: PublishingIssue[];
|
|
22
25
|
suggestion?: string;
|
|
26
|
+
/** The date `reason` names, for saying it in the editor's own zone. */
|
|
27
|
+
when?: MessageDate;
|
|
28
|
+
/** Setup detail for a developer. Never shown to the editor. */
|
|
29
|
+
detail?: string;
|
|
23
30
|
/** Non-fatal problems on an action that otherwise succeeded. */
|
|
24
31
|
warnings?: string[];
|
|
25
32
|
error?: string;
|
|
@@ -91,15 +98,37 @@ export declare function toFormPath(field: string): string;
|
|
|
91
98
|
*/
|
|
92
99
|
export declare function fieldErrorsFromBlock(body: PublishingResponse, formPaths: Iterable<string>): PublishingFieldError[];
|
|
93
100
|
/**
|
|
94
|
-
* Turns a pipeline block into something an editor can act on:
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
101
|
+
* Turns a pipeline block into something an editor can act on: what is wrong,
|
|
102
|
+
* where, and what to do about it. forumone-2026#805.
|
|
103
|
+
*
|
|
104
|
+
* Which step refused is software's business — it stays in `failedAt` and
|
|
105
|
+
* `code` — and an issue's location is said the way the edit view says it,
|
|
106
|
+
* `Block 3 (Image Hero) › Image`, from the `where` the pipeline attached.
|
|
107
|
+
* An issue the pipeline could not place is listed by its message alone, never
|
|
108
|
+
* by its raw path. A date the server wrote in its own zone is rewritten into
|
|
109
|
+
* the editor's.
|
|
98
110
|
*/
|
|
99
111
|
export declare function describeBlock(body: PublishingResponse, options?: {
|
|
100
112
|
markedFields?: number;
|
|
113
|
+
date?: HumanDateOptions;
|
|
101
114
|
}): {
|
|
102
115
|
title: string;
|
|
103
116
|
description: string;
|
|
104
117
|
};
|
|
118
|
+
/**
|
|
119
|
+
* The "Show me" action on an error toast whose problems are marked on fields:
|
|
120
|
+
* takes the editor to the first of them again, for one who has scrolled away.
|
|
121
|
+
* The toast stays open, since it is still the list of what to fix.
|
|
122
|
+
*/
|
|
123
|
+
export declare const SHOW_ME: {
|
|
124
|
+
label: string;
|
|
125
|
+
onClick: (event: {
|
|
126
|
+
preventDefault: () => void;
|
|
127
|
+
}) => void;
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* The toast id for a refusal of `action` on one document, so a second click
|
|
131
|
+
* replaces the first toast rather than stacking a copy on it.
|
|
132
|
+
*/
|
|
133
|
+
export declare function blockToastId(action: CallPublishingEndpointArgs['action'], collection: string, id: number | string): string;
|
|
105
134
|
//# sourceMappingURL=publishing-client.d.ts.map
|