Release v1.45.0
Some checks are pending
Test and SonarQube / quality (push) Waiting to run

This commit is contained in:
mARTin-B78 2026-09-22 21:09:29 +02:00
parent 48acbf6e00
commit 0e75b24a7a
4 changed files with 48 additions and 10 deletions

View File

@ -9,6 +9,13 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi
---
## [1.45.0] — 2026-09-22
### Added
- **Magazine: Title/Author auto-fill from a Headline or Author region.** A newly drawn Headline or Author region, or one retyped from the picker, now fills the article's Title/Author field automatically instead of requiring "Pick from page" by hand — only when that field is still empty, so it never overwrites something already typed or picked.
---
## [1.44.0] — 2026-09-22
### Added
@ -4328,7 +4335,8 @@ Initial feature-complete release.
---
[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.44.0...HEAD
[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.45.0...HEAD
[1.45.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.44.0...v1.45.0
[1.44.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.43.1...v1.44.0
[1.43.1]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.43.0...v1.43.1
[1.26.10]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.26.9...v1.26.10

View File

@ -1 +1 @@
1.44.0
1.45.0

View File

@ -10,7 +10,7 @@
<meta name="format-detection" content="telephone=no">
<meta name="color-scheme" content="light dark">
<meta name="theme-color" content="#2563EB">
<meta name="app-version" content="1.44.0">
<meta name="app-version" content="1.45.0">
<link rel="manifest" href="/manifest.webmanifest">
<link rel="icon" href="/static/icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="/static/icon.svg">
@ -27,12 +27,12 @@
<!-- ── Core styles (local — no CDN dependency for first paint) ────────── -->
<link rel="stylesheet" href="/static/vendor/mdi/materialdesignicons.min.css">
<link rel="stylesheet" href="/static/style.css?v=1.44.0">
<link rel="stylesheet" href="/static/css/resource-diagnostics.css?v=1.44.0">
<link rel="stylesheet" href="/static/css/background-jobs.css?v=1.44.0">
<link rel="stylesheet" href="/static/css/voice-design.css?v=1.44.0">
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.44.0">
<link rel="stylesheet" href="/static/css/audiobook.css?v=1.44.0">
<link rel="stylesheet" href="/static/style.css?v=1.45.0">
<link rel="stylesheet" href="/static/css/resource-diagnostics.css?v=1.45.0">
<link rel="stylesheet" href="/static/css/background-jobs.css?v=1.45.0">
<link rel="stylesheet" href="/static/css/voice-design.css?v=1.45.0">
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.45.0">
<link rel="stylesheet" href="/static/css/audiobook.css?v=1.45.0">
<!-- ── Flag icons — non-blocking (loaded async, icons appear after JS) ── -->
@ -403,7 +403,7 @@ window.toggleNavTree = function(treeId, chevronId) {
</script>
<!-- loader.js: fetches sections → loads JS modules → removes skeleton -->
<script src="/static/loader.js?v=1.44.0"></script>
<script src="/static/loader.js?v=1.45.0"></script>
</body>
</html>

View File

@ -1282,6 +1282,36 @@ function renderReview() {
if (state.selectMode) magSelectRefresh();
setupMagDrawing();
setupMagBoxEdit();
magReviewAutofillTitleAuthor();
}
// A Headline or Author region belonging to this article is exactly what its
// own Title/Author field should say -- confirmed live, they matched
// perfectly for a headline detected at ingestion, but nothing kept them in
// sync afterward: retyping a region to Author, or drawing a new Headline
// region by hand, left the fields blank until "Pick from page" was used
// again by hand. Only fills an EMPTY field, so it never overwrites a
// value the reader already typed or picked deliberately.
function magReviewAutofillTitleAuthor() {
const article = state.article;
if (!article) return;
const titleInput = $('mag-rev-title');
const authorInput = $('mag-rev-author');
if ((!titleInput || titleInput.value.trim()) && (!authorInput || authorInput.value.trim())) return;
const ownIds = new Set(article.blocks || []);
const ownBlocks = (state.layout.blocks || []).filter((b) => ownIds.has(b.id));
if (titleInput && !titleInput.value.trim()) {
const block = ownBlocks.find((b) => b.type === 'title' && (b.text || '').trim());
if (block) { titleInput.value = block.text.trim(); article.title = titleInput.value; }
}
if (authorInput && !authorInput.value.trim()) {
const block = ownBlocks.find((b) => b.type === 'byline' && (b.text || '').trim());
// Same "Von "/"by " credit-prefix strip the initial ingestion pass uses
// (core/magazine.py's looks_like_byline) — approximated here since this
// runs client-side without a round trip.
const name = block ? block.text.replace(/^(von|by)\s+/i, '').trim() : '';
if (name) { authorInput.value = name; article.author = name; }
}
}
// Tracks every ticked block across ALL reviewed pages of this article, not