Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
97788e3
fix(nextly): take the live row's verdict only for a field the promoti…
mobeenabdullah Sep 13, 2026
d20fc1a
fix(nextly): collect declared names through named containers, and giv…
mobeenabdullah Sep 13, 2026
003a340
fix(nextly): expand a live-side denied container to its leaves before…
mobeenabdullah Sep 13, 2026
9315be9
refactor(nextly): split the promotion resolver so each function answe…
mobeenabdullah Sep 13, 2026
da32ad7
fix(nextly): a publish may carry a group edit, and provenance is what…
mobeenabdullah Sep 13, 2026
8c6bce7
fix(nextly): return promotion checks to fail-closed where the looser …
mobeenabdullah Sep 13, 2026
cfb2a55
test(nextly): pin the refusal of a deleted field the final document w…
mobeenabdullah Sep 13, 2026
f68a8e4
docs(nextly): state the promotion resolver's rules, not how they came…
mobeenabdullah Sep 13, 2026
3cb2f37
fix(admin): show why publishing all languages failed, not one fixed m…
mobeenabdullah Sep 13, 2026
c6fe70b
feat(nextly): fold every language's pending change by field, not by save
mobeenabdullah Sep 13, 2026
47d7d69
fix(nextly): a whole-document publish applies every language's pendin…
mobeenabdullah Sep 13, 2026
887e82a
fix(nextly): a language's publish writes only the component translati…
mobeenabdullah Sep 13, 2026
df8bfae
fix(nextly): publish all languages runs through the one update path, …
mobeenabdullah Sep 13, 2026
b90eb37
refactor(nextly): remove the second publish-all write path
mobeenabdullah Sep 13, 2026
4713e55
chore(nextly): describe publish all languages on one write path for t…
mobeenabdullah Sep 13, 2026
1cf33c2
Merge remote-tracking branch 'origin/main' into fix/publish-all-runs-…
claude Sep 15, 2026
4274860
chore(root): lower the comment allowlist to what collection-mutation-…
claude Sep 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .changeset/publish-all-languages-publishes-every-pending-change.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
---
"nextly": patch
"create-nextly-app": patch
"@nextlyhq/admin": patch
"@nextlyhq/admin-css": patch
"@nextlyhq/blocks-engine": patch
"@nextlyhq/blocks-react": patch
"@nextlyhq/ui": patch
"@nextlyhq/adapter-drizzle": patch
"@nextlyhq/adapter-postgres": patch
"@nextlyhq/adapter-mysql": patch
"@nextlyhq/adapter-sqlite": patch
"@nextlyhq/storage-s3": patch
"@nextlyhq/storage-uploadthing": patch
"@nextlyhq/storage-vercel-blob": patch
"@nextlyhq/plugin-form-builder": patch
"@nextlyhq/plugin-mcp": patch
"@nextlyhq/plugin-page-builder": patch
"@nextlyhq/plugin-seo": patch
"@nextlyhq/plugin-sdk": patch
"@nextlyhq/eslint-config": patch
"@nextlyhq/eslint-plugin": patch
"@nextlyhq/prettier-config": patch
"@nextlyhq/telemetry": patch
"@nextlyhq/tsconfig": patch
"@nextlyhq/builder": patch
"@nextlyhq/module-specifiers": patch
---

"Publish all languages" and "Unpublish all languages" on a collection entry now run through the same update path as any other edit, so update hooks, field rules and validation apply to them.

Moving every language at once, from the button or from a scheduled release, now applies every language's pending change instead of refusing when another language holds one. A shared field keeps the edit of the language that changed it, and when two languages changed the same shared field the later save wins. Each language's translations, including those inside components, come from its own pending change. A pending change held for a language the app no longer configures is left in place.

When publishing every language fails, the admin now shows the server's reason instead of one fixed message.
13 changes: 11 additions & 2 deletions packages/admin/src/hooks/queries/usePublishAllLocales.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,17 @@ export function usePublishAllLocales({
});
if (!silent) toast.success("All languages published.");
},
onError: () => {
if (!silent) toast.error("Couldn't publish all languages.");
onError: (error: unknown) => {
// The server's own message, which is the only thing that says WHY. This
// call can refuse for reasons an editor can act on, and a fixed string
// turns every one of them into the same unexplained failure.
if (!silent) {
toast.error(
error instanceof Error && error.message
? error.message
: "Couldn't publish all languages."
);
}
},
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@ function allLocalesLifecycle(
successMessage: string
): MethodHandler<CollectionsHandlerType> {
return {
execute: async (svc, p) => {
execute: async (svc, p, _body, request) => {
// `requireParam` rather than an inline throw: a missing route parameter is
// caller-fixable, and a bare `Error` here would surface it as a 500.
const collectionName = requireParam(p, "collectionName");
Expand All @@ -212,6 +212,8 @@ function allLocalesLifecycle(
userRoles: readAuthenticatedRoles(p),
routeAuthorized: true,
authenticatedScope: readAuthenticatedScope(p),
// The request this operation's hooks are told about.
request,
});
const entry = unwrapServiceResult(result, { collectionName, entryId });
return respondMutation(result.message ?? successMessage, entry);
Expand Down
Loading
Loading