refac: migration crash, real-database tests, site deleted during create, ruels out of the repo, lists

This commit is contained in:
Florian Sylvain committed 2026-11-03 05:06:04 +01:00
1 parent 680b9a1308
commit 9d284e65a9
62 files changed
+1858 -987

No files matched your search

+432 -32
View File
@@ -1,3 +1,4 @@
window.LOC = {
"groups": [
{
@@ -357,6 +358,16 @@ window.LOC = {
"loc.l1b.viewOnly",
"Journal",
"loc.l1b.viewOnly"
],
[
"Invalid host",
"Pattern with an empty host label",
"pu",
"invalidHost",
"",
"loc.l1b.invalidHost",
"Journal",
"loc.l1b.invalidHost"
]
]
},
@@ -470,7 +481,7 @@ window.LOC = {
],
[
"Translation of an article",
"Article picker + language",
"Same fields as Add translation: article, language, source version, title, starting content",
"na",
"translation",
"",
@@ -510,7 +521,7 @@ window.LOC = {
],
[
"Start empty",
"Title only",
"Title only; Source version reads No source, Freshness will show No source",
"at",
"empty",
"",
@@ -560,7 +571,7 @@ window.LOC = {
],
[
"Source deleted",
"Deleted while the dialog was open",
"Deleted while the dialog was open: same neutral message as unreadable, no distinction shown",
"at",
"gone",
"",
@@ -570,7 +581,7 @@ window.LOC = {
],
[
"Source no longer readable",
"Access lost between opening and submitting",
"Access lost between opening and submitting: same neutral message as deleted",
"at",
"unreadable",
"",
@@ -857,6 +868,16 @@ window.LOC = {
"loc.l5.failed",
"Journal",
"loc.l5.failed"
],
[
"Language menu with a disabled language",
"Spanish is disabled: Disabled tag, version stays readable",
"ed",
"menuDisabled",
"",
"loc.l5.menuDisabled",
"Journal",
"loc.l5.menuDisabled"
]
]
},
@@ -1260,6 +1281,86 @@ window.LOC = {
]
]
},
{
"id": "L7s",
"title": "Article list, single-language site",
"route": "/articles?site=archive&q&status&page&size",
"api": "GET /v1/article/?page=&size=&q=&status=&site= (existing; total in X-Total-Count)",
"note": "Replaces the old Articles board frames as the pixel-gate reference for the list. A site with one language has no language filter, no coverage column, no Needs translation or Needs review tabs, and its menu labels name no language. The pager is AppPaginator: summary \"Showing 1–5 of 5\", rows-per-page select, first, previous, page numbers, next and last (390 px: summary and select, then Previous, \"Page N of M\", Next). Hidden controls when everything fits on one page; the summary stays.",
"release": 1,
"states": [
[
"Default",
"Archive: 5 articles on one page, no language filter, coverage column or tabs",
"li",
"single",
"",
"loc.l7s.default",
"Archive",
"loc.l7s.default"
],
[
"Draft filter",
"Status: Draft",
"li",
"singleDraft",
"",
"loc.l7s.draft",
"Archive",
"loc.l7s.draft"
],
[
"No results",
"Search \"zinc\"",
"li",
"singleNoResults",
"",
"loc.l7s.noResults",
"Archive",
"loc.l7s.noResults"
],
[
"Empty",
"Gallery: no articles",
"li",
"singleEmpty",
"",
"loc.l7s.empty",
"Gallery",
"loc.l7s.empty"
],
[
"Loading",
"Counts shown as –",
"li",
"singleLoading",
"",
"loc.l7s.loading",
"Archive",
"loc.l7s.loading"
],
[
"Failed",
"Filters kept",
"li",
"singleFail",
"",
"loc.l7s.fail",
"Archive",
"loc.l7s.fail"
],
[
"Row menu",
"Open, Unpublish, Copy API URL, Delete article: no language named",
"li",
"singleMenu",
"",
"loc.l7s.menu",
"Archive",
"loc.l7s.menu"
]
]
},
{
"id": "L8",
"title": "Publishing and deletion",
@@ -1300,7 +1401,7 @@ window.LOC = {
],
[
"Save failed, nothing published",
"Toast; edits kept and retryable",
"Error banner above the editor and an error toast; Save failed badge, primary Try saving again, edits kept, nothing published",
"pd",
"saveFailPublish",
"",
@@ -1340,7 +1441,7 @@ window.LOC = {
],
[
"Delete a source version",
"Warns about review tracking",
"Names the readable versions that track the source; warns review tracking pauses",
"pd",
"deleteSource",
"",
@@ -1380,7 +1481,7 @@ window.LOC = {
],
[
"Published",
"Toast",
"Toast \"French published\" and the online banner; badge Published, status Saved",
"pd",
"done",
"",
@@ -1397,6 +1498,36 @@ window.LOC = {
"loc.l8.fail",
"Journal",
"loc.l8.fail"
],
[
"French version deleted",
"Toast; editor opens English",
"pd",
"deleteDone",
"",
"loc.l8.deleteDone",
"Journal",
"loc.l8.deleteDone"
],
[
"Delete article failed",
"Dialog error; nothing deleted",
"pd",
"deleteStoryFail",
"",
"loc.l8.deleteStoryFail",
"Journal",
"loc.l8.deleteStoryFail"
],
[
"Article deleted",
"Toast on the Articles list",
"li",
"deleteStoryDone",
"",
"loc.l8.deleteStoryDone",
"Journal",
"loc.l8.deleteStoryDone"
]
]
},
@@ -1530,7 +1661,7 @@ window.LOC = {
"states": [
[
"Search and sharing: French",
"Localized slug, canonical, alternates, fallback labels, Edit slug",
"Search and sharing slide-over on the editor: localized slug, canonical, alternates, fallback labels, Edit slug",
"seo",
"",
"",
@@ -1540,7 +1671,7 @@ window.LOC = {
],
[
"Edit slug",
"Published version: warning about old links",
"Edit slug dialog over the Search and sharing slide-over: published version warns about old links",
"seo",
"editSlug",
"",
@@ -1550,7 +1681,7 @@ window.LOC = {
],
[
"Public URL not configured",
"No pattern, no fabricated URL",
"Search and sharing slide-over: no pattern, no fabricated URL",
"seo",
"unset",
"",
@@ -1560,7 +1691,7 @@ window.LOC = {
],
[
"Social locale not set",
"fr has no region and none is set: og:locale omitted",
"Search and sharing slide-over: fr has no region and none is set, og:locale omitted",
"seo",
"noSocial",
"",
@@ -1570,7 +1701,7 @@ window.LOC = {
],
[
"Integration: languages",
"Exact lookup, resolve by article group, errors",
"Integration page: exact lookup, resolve by article group, errors",
"api",
"",
"",
@@ -1590,7 +1721,7 @@ window.LOC = {
"states": [
[
"Session expired",
"Draft kept locally",
"Draft kept in this browser; editor behind shows the unsaved changes",
"pm",
"session",
"",
@@ -1610,7 +1741,7 @@ window.LOC = {
],
[
"Concurrent update",
"Four choices, local work kept",
"Four choices, local work kept; Save over theirs outlined in error colour with a warning icon",
"pm",
"conflict",
"",
@@ -1730,7 +1861,7 @@ window.LOC = {
],
[
"Address conflict",
"Names the conflicting readable version only",
"Names the conflicting readable version and its address; unreadable ones are never named",
"pm",
"moveSlug",
"",
@@ -1747,6 +1878,16 @@ window.LOC = {
"loc.l11b.movePerm",
"Journal",
"loc.l11b.movePerm"
],
[
"Move failed",
"Server error, nothing moved",
"pm",
"moveFail",
"",
"loc.l11b.moveFail",
"Journal",
"loc.l11b.moveFail"
]
]
},
@@ -1790,7 +1931,7 @@ window.LOC = {
],
[
"Media usage",
"Shared image counted once, versions listed",
"Media page with the image detail panel: shared image counted once, versions listed, \"Used in 2\"",
"sf",
"media",
"tri",
@@ -1799,10 +1940,20 @@ window.LOC = {
"loc.l12.media"
],
[
"Article menu labels",
"Publish and Delete name the language",
"Media usage: used elsewhere only",
"Image used only as an author avatar: badge \"Used in 1\", \"Articles\" with \"No article shows it.\", \"Used elsewhere\" with Author avatar linking to /authors",
"sf",
"menu",
"mediaElsewhere",
"",
"loc.l12.mediaElsewhere",
"Journal",
"loc.l12.mediaElsewhere"
],
[
"Article menu labels",
"Articles list, French selected: row menu names the language (Publish French, Delete French version). Bottom sheet at 390",
"li",
"menuLang",
"",
"loc.l12.menu",
"Journal",
@@ -1810,8 +1961,8 @@ window.LOC = {
],
[
"API URL copy",
"Copies the version URL with ?lang=",
"sf",
"Articles list: toast after Copy API URL with the ?lang= address. Bottom toast at 390",
"li",
"apiCopy",
"",
"loc.l12.apiCopy",
@@ -1820,9 +1971,9 @@ window.LOC = {
],
[
"SEO preview",
"Localized address and canonical",
"sf",
"seoPreview",
"Search and sharing slide-over: localized address and canonical",
"seo",
"preview",
"",
"loc.l12.seoPreview",
"Journal",
@@ -1830,8 +1981,8 @@ window.LOC = {
],
[
"Site text fallback",
"Used only when its language matches the article",
"sf",
"Search and sharing slide-over: site text used only in its own language",
"seo",
"siteFallback",
"",
"loc.l12.siteFallback",
@@ -2133,6 +2284,38 @@ window.LOC = {
"All localization copy",
"None",
"Initial"
],
[
"Languages in the sidebar",
"No sidebar item. Languages is reached only through Settings → Sites → [site] → Languages, which routes.md lists as the only languages route",
"One route, one entry point, per-site scope",
"Sidebar unchanged",
"None",
"Initial"
],
[
"Public URL preview",
"The preview uses the most recently updated article that has a version in the site default language, in that language. A site without articles previews a sample address",
"Predictable and never fabricates a language",
"Public URL page",
"None",
"Initial"
],
[
"Deleting an article",
"Dialog names the readable versions and states that the article and all of its translations are deleted. Failure copy: \"Couldn't delete the article\" with \"Nothing was deleted. Every version is still there. Try again in a moment.\"",
"Delete is atomic, so there is no partial delete",
"Delete dialog",
"None",
"Initial"
],
[
"Destructive cue in the conflict dialog",
"Keep my changes is the only filled button. Save over theirs is outlined in --ui-error with a triangle-alert icon, the same size as the other secondary buttons",
"Marks the destructive choice without changing the equal-weight rule",
"Conflict dialog",
"None",
"Initial"
]
]
},
@@ -2398,7 +2581,7 @@ window.LOC = {
"Public URL pattern",
"Proposed",
"GET/PUT /v1/site/{key} { public_url_pattern }. Placeholders {lang}, {slug}. Owner only",
"422 unknown_placeholder · invalid_scheme · not_encoded · missing_slug · 403"
"422 unknown_placeholder · invalid_scheme · invalid_host · not_encoded · missing_slug · 403"
],
[
"Social locale",
@@ -2638,7 +2821,7 @@ window.LOC = {
],
[
"Source unavailable",
"Deleted: \"The source was deleted.\"",
"Deleted or unreadable at submit: the same neutral 404, shown as \"The source isn't available to you.\" The review banner (L9) says \"Source deleted\" only for a source the user already knew about",
"\"The source isn't available to you.\""
],
[
@@ -2877,7 +3060,7 @@ window.LOC = {
],
[
"Conflict",
"\"Someone else saved this version at <time>.\" Choices: Keep my changes (filled; nothing sent), Download my version, Reload theirs (confirm: \"This discards your unsaved changes.\"), Save over theirs (sends the version fetched now; a newer save gives a new conflict)"
"\"Someone else saved this version at <time>.\" Choices: Keep my changes (filled; nothing sent), Download my version, Reload theirs (confirm: \"This discards your unsaved changes.\"), Save over theirs (sends the version fetched now; a newer save gives a new conflict) Save over theirs is outlined in the error colour with a warning icon."
],
[
"Overwrite scope",
@@ -3369,7 +3552,7 @@ window.LOC = {
[
"Valid",
"https://journal.example.com/{lang}/{slug}",
"Preview: https://journal.example.com/fr/comment-nous-chiffrons-une-renovation"
"Preview: https://journal.example.com/en/how-we-price-a-bathroom-renovation"
],
[
"Unknown placeholder",
@@ -3391,6 +3574,11 @@ window.LOC = {
"https://journal.example.com/{lang}",
"Add {slug} so each article has its own address."
],
[
"Invalid host",
"https://journal..example.com/{lang}/{slug}",
"Enter a valid host name, such as journal.example.com."
],
[
"Unset",
"",
@@ -3475,7 +3663,219 @@ window.LOC = {
"Drawn in full so the checker has frames"
]
]
},
{
"title": "Copy decisions (pass 3)",
"cols": [
"Item",
"Final copy or rule"
],
"rows": [
[
"Editor banner: save failed",
"Couldn't save French. Your changes are kept here. Nothing was published. Try saving again."
],
[
"Editor banner: publish failed",
"Saved as a draft. Publishing failed. Try publishing again. (detail: Your edits are saved. Only the publishing step failed.)"
],
[
"Editor banner: online",
"This version is online. Saving updates the live page right away."
],
[
"Row menu, all languages",
"Open <language>, Open another language…, Add translation…, Unpublish <language>, Copy API URL, Delete <language> version"
],
[
"Row menu, language selected",
"Open <language>, Open another language…, Publish or Unpublish <language>, Copy API URL, Delete <language> version"
],
[
"Disabled-language version in the menu",
"Row shows the Disabled tag. Footer: \"<Language> is disabled on this site. Its version stays readable and editable. It can't be published until an owner re-enables <Language>.\""
],
[
"Setup done",
"Languages assigned. N articles now have a language. Nothing was translated, and no articles were grouped."
],
[
"Languages list on 390 px",
"The version count line (\"4 versions · 2 published\") is shown, on its own line under the language name"
],
[
"Single-language card on 390 px",
"\"Social locale\" and \"Derived: pt_BR\" sit on their own line below the language"
],
[
"Partial or failed delete",
"Couldn't delete the article. Nothing was deleted. Every version is still there. Try again in a moment."
],
[
"Version deleted toast",
"French version deleted. \"<title>\" was deleted. English and German weren't changed."
],
[
"Article deleted toast",
"Article deleted. The article and all of its translations were deleted."
],
[
"Move failed",
"Couldn't move the article. Nothing was moved. All 4 versions are still on Journal. Try again."
],
[
"Second conflict",
"Their version changed again. Someone else saved this version again at <time>, before your save went through. Nothing was overwritten. Your changes are still here."
],
[
"New article, language help",
"Default language for <site>."
],
[
"Invalid host",
"Enter a valid host name, such as journal.example.com."
],
[
"Toast icon box",
"28 × 28 px, 16 px icon, tone colour on its -soft ground (--rc-success-soft, --rc-info-soft, --rc-warning-soft, --rc-error-soft). Body and title as in the Toast table"
],
[
"Activity: site.language.add",
"Added <language> to <site>"
],
[
"Activity: site.language.enable",
"Re-enabled <language> on <site>"
],
[
"Activity: site.language.disable",
"Disabled <language> on <site>"
],
[
"Activity: site.language.remove",
"Removed <language> from <site>"
],
[
"Activity: site.language.default",
"Made <language> the default language of <site>"
],
[
"Activity: site.language.social_locale",
"Set the social locale for <language> on <site> to <value>"
],
[
"Activity: site.public_url.update",
"Changed the public URL pattern of <site>"
],
[
"Activity: site.language.setup",
"Assigned languages to N articles on <sites>"
],
[
"Activity: article.move",
"Moved \"<title>\" from <site> to <site>"
]
]
}
]
],
"changes": {
"added": [
"L1|sl|broader",
"L1|sl|defaultFail",
"L1|sl|stale",
"L1|sl|reenableDone",
"L1|sl|reenableFail",
"L1|sl|removeFail",
"L1|sl|social",
"L1|sl|socialEdit",
"L1|sl|socialInvalid",
"L1b|pu|set",
"L1b|pu|editing",
"L1b|pu|unknown",
"L1b|pu|scheme",
"L1b|pu|encoded",
"L1b|pu|noSlug",
"L1b|pu|saved",
"L1b|pu|unset",
"L1b|pu|viewOnly",
"L2|su|noLocale",
"L2|su|inProgress",
"L4|at|unreadable",
"L4|at|langOff",
"L5|ed|cleanOnline",
"L5|ed|pubFail",
"L5|ed|ovf",
"L5|ed|titleEdit",
"L5|ed|titleUnsaved",
"L5|ed|titleShort",
"L5|ed|titleLong",
"L5b|perm|ro",
"L5b|perm|roMenu",
"L5b|perm|p2",
"L5b|perm|p3",
"L5b|perm|p4",
"L5b|perm|p5",
"L5b|perm|p6",
"L5b|perm|noAdd",
"L5b|perm|withAdd",
"L6|src|arRef",
"L7|li|page2",
"L7|li|review",
"L7|li|author",
"L7|li|langFilter",
"L7|li|rowMenu",
"L8|pd|publishDisabled",
"L8|pd|unpublishDirty",
"L8|pd|deleteStoryOk",
"L9|li|frReview",
"L10|seo|editSlug",
"L11|pm|restored",
"L11|pm|conflictRestored",
"L11|pm|reloadConfirm",
"L11|pm|conflict2",
"L11|pm|download",
"L11b|pm|moveSelect",
"L11b|pm|moveSelectHidden",
"L11b|pm|moveConfirm",
"L11b|pm|moveBusy",
"L11b|pm|moveDone",
"L11b|pm|move",
"L11b|pm|moveSlug",
"L11b|pm|movePerm",
"L12|sf|home",
"L12|sf|homeFr",
"L12|sf|activity",
"L12|sf|media",
"L12|sf|menu",
"L12|sf|apiCopy",
"L12|sf|seoPreview",
"L12|sf|siteFallback",
"L5|ed|menuDisabled",
"L1b|pu|invalidHost",
"L8|pd|deleteDone",
"L8|pd|deleteStoryFail",
"L8|li|deleteStoryDone",
"L11b|pm|moveFail",
"L7s|li|single",
"L7s|li|singleDraft",
"L7s|li|singleNoResults",
"L7s|li|singleEmpty",
"L7s|li|singleLoading",
"L7s|li|singleFail",
"L7s|li|singleMenu"
],
"removed": [
"L5b|ed|ro (Read-only version)",
"L5b|ed|roMenu (Read-only: menu)",
"L5b|ed|p2 (Edit, no publish)",
"L5b|ed|p3 (Publish, no edit)",
"L5b|ed|p4 (Sibling readable, not editable)",
"L5b|ed|p5 (Sibling not readable)",
"L5b|ed|p6 (Can create, not modify all)",
"L11|pm|move (Move: language missing)",
"L11|pm|moveSlug (Move: address conflict)",
"L11|pm|movePerm (Move: no permission)"
]
}
}
window.LOC.changes = {"added":["L1|sl|broader","L1|sl|defaultFail","L1|sl|stale","L1|sl|reenableDone","L1|sl|reenableFail","L1|sl|removeFail","L1|sl|social","L1|sl|socialEdit","L1|sl|socialInvalid","L1b|pu|set","L1b|pu|editing","L1b|pu|unknown","L1b|pu|scheme","L1b|pu|encoded","L1b|pu|noSlug","L1b|pu|saved","L1b|pu|unset","L1b|pu|viewOnly","L2|su|noLocale","L2|su|inProgress","L4|at|unreadable","L4|at|langOff","L5|ed|cleanOnline","L5|ed|pubFail","L5|ed|ovf","L5|ed|titleEdit","L5|ed|titleUnsaved","L5|ed|titleShort","L5|ed|titleLong","L5b|perm|ro","L5b|perm|roMenu","L5b|perm|p2","L5b|perm|p3","L5b|perm|p4","L5b|perm|p5","L5b|perm|p6","L5b|perm|noAdd","L5b|perm|withAdd","L6|src|arRef","L7|li|page2","L7|li|review","L7|li|author","L7|li|langFilter","L7|li|rowMenu","L8|pd|publishDisabled","L8|pd|unpublishDirty","L8|pd|deleteStoryOk","L9|li|frReview","L10|seo|editSlug","L11|pm|restored","L11|pm|conflictRestored","L11|pm|reloadConfirm","L11|pm|conflict2","L11|pm|download","L11b|pm|moveSelect","L11b|pm|moveSelectHidden","L11b|pm|moveConfirm","L11b|pm|moveBusy","L11b|pm|moveDone","L11b|pm|move","L11b|pm|moveSlug","L11b|pm|movePerm","L12|sf|home","L12|sf|homeFr","L12|sf|activity","L12|sf|media","L12|sf|menu","L12|sf|apiCopy","L12|sf|seoPreview","L12|sf|siteFallback"],"removed":["L5b|ed|ro (Read-only version)","L5b|ed|roMenu (Read-only: menu)","L5b|ed|p2 (Edit, no publish)","L5b|ed|p3 (Publish, no edit)","L5b|ed|p4 (Sibling readable, not editable)","L5b|ed|p5 (Sibling not readable)","L5b|ed|p6 (Can create, not modify all)","L11|pm|move (Move: language missing)","L11|pm|moveSlug (Move: address conflict)","L11|pm|movePerm (Move: no permission)"]}
window.LOC.changes = {"added":["L1|sl|broader","L1|sl|defaultFail","L1|sl|stale","L1|sl|reenableDone","L1|sl|reenableFail","L1|sl|removeFail","L1|sl|social","L1|sl|socialEdit","L1|sl|socialInvalid","L1b|pu|set","L1b|pu|editing","L1b|pu|unknown","L1b|pu|scheme","L1b|pu|encoded","L1b|pu|noSlug","L1b|pu|saved","L1b|pu|unset","L1b|pu|viewOnly","L2|su|noLocale","L2|su|inProgress","L4|at|unreadable","L4|at|langOff","L5|ed|cleanOnline","L5|ed|pubFail","L5|ed|ovf","L5|ed|titleEdit","L5|ed|titleUnsaved","L5|ed|titleShort","L5|ed|titleLong","L5b|perm|ro","L5b|perm|roMenu","L5b|perm|p2","L5b|perm|p3","L5b|perm|p4","L5b|perm|p5","L5b|perm|p6","L5b|perm|noAdd","L5b|perm|withAdd","L6|src|arRef","L7|li|page2","L7|li|review","L7|li|author","L7|li|langFilter","L7|li|rowMenu","L8|pd|publishDisabled","L8|pd|unpublishDirty","L8|pd|deleteStoryOk","L9|li|frReview","L10|seo|editSlug","L11|pm|restored","L11|pm|conflictRestored","L11|pm|reloadConfirm","L11|pm|conflict2","L11|pm|download","L11b|pm|moveSelect","L11b|pm|moveSelectHidden","L11b|pm|moveConfirm","L11b|pm|moveBusy","L11b|pm|moveDone","L11b|pm|move","L11b|pm|moveSlug","L11b|pm|movePerm","L12|sf|home","L12|sf|homeFr","L12|sf|activity","L12|sf|media","L12|sf|menu","L12|sf|apiCopy","L12|sf|seoPreview","L12|sf|siteFallback","L5|ed|menuDisabled","L1b|pu|invalidHost","L8|pd|deleteDone","L8|pd|deleteStoryFail","L8|li|deleteStoryDone","L11b|pm|moveFail","L7s|li|single","L7s|li|singleDraft","L7s|li|singleNoResults","L7s|li|singleEmpty","L7s|li|singleLoading","L7s|li|singleFail","L7s|li|singleMenu","L12|sf|mediaElsewhere"],"removed":["L5b|ed|ro (Read-only version)","L5b|ed|roMenu (Read-only: menu)","L5b|ed|p2 (Edit, no publish)","L5b|ed|p3 (Publish, no edit)","L5b|ed|p4 (Sibling readable, not editable)","L5b|ed|p5 (Sibling not readable)","L5b|ed|p6 (Can create, not modify all)","L11|pm|move (Move: language missing)","L11|pm|moveSlug (Move: address conflict)","L11|pm|movePerm (Move: no permission)"]}