Release v1.26.14: Studio-style side-by-side Magazine upload layout with Durchsuchen button
Some checks failed
Test and SonarQube / quality (push) Has been cancelled

This commit is contained in:
mARTin-B78 2026-09-10 14:45:00 +02:00
parent 30e01a5cec
commit c1a2d6dc74
5 changed files with 55 additions and 45 deletions

View File

@ -5,6 +5,15 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi
---
## [1.26.14] — 2026-09-10
### Added
- **Studio-Style Side-by-Side Magazine Upload Layout.**
- Re-designed the Magazine upload card to mirror Studio mode's side-by-side layout: left panel contains optional Title & Issue metadata inputs plus a prominent **Durchsuchen** button (`<span class="mdi mdi-folder-open-outline"></span> Durchsuchen`), and right panel contains the clean `.reader-dropzone`.
- Removed the redundant `+ Add magazine` button for a clean, direct, one-action upload flow.
---
## [1.26.13] — 2026-09-10
### Fixed

View File

@ -1 +1 @@
1.26.13
1.26.14

View File

@ -180,29 +180,17 @@
color: var(--subtext);
font-size: 12px;
}
#s-reader .reader-source-grid {
#s-reader .reader-source-grid,
#s-caststudio .reader-source-grid,
#s-magazine .reader-source-grid {
display: grid;
grid-template-columns: minmax(0, 1.4fr) minmax(260px, .8fr);
gap: 12px;
align-items: stretch;
}
#s-caststudio .reader-source-grid {
display: grid;
grid-template-columns: minmax(0, 1.4fr) minmax(260px, .8fr);
gap: 12px;
align-items: stretch;
}
#s-reader .reader-paste-panel {
min-width: 0;
display: flex;
flex-direction: column;
gap: 8px;
padding: 12px;
border: 1px solid var(--border);
border-radius: 8px;
background: var(--surface);
}
#s-caststudio .reader-paste-panel {
#s-reader .reader-paste-panel,
#s-caststudio .reader-paste-panel,
#s-magazine .reader-paste-panel {
min-width: 0;
display: flex;
flex-direction: column;
@ -409,8 +397,9 @@
}
@media (max-width: 860px) {
#s-reader .reader-source-grid { grid-template-columns: 1fr; }
#s-caststudio .reader-source-grid { grid-template-columns: 1fr; }
#s-reader .reader-source-grid,
#s-caststudio .reader-source-grid,
#s-magazine .reader-source-grid { grid-template-columns: 1fr; }
#s-reader .reader-tuning-row { grid-template-columns: 1fr; gap: 5px; }
#s-caststudio .reader-tuning-row { grid-template-columns: 1fr; gap: 5px; }
}

View File

@ -205,7 +205,7 @@ function magShowDroppedFile(file) {
} else {
if (dropzone) dropzone.classList.remove('is-selected', 'is-uploading');
if (noteEl) noteEl.textContent = MAG_DROPZONE_DEFAULT_NOTE;
if (titleEl) titleEl.textContent = 'Drop a PDF or click to browse';
if (titleEl) titleEl.textContent = 'Drop a PDF document';
if (iconEl) iconEl.className = 'mdi mdi-cloud-upload-outline reader-dropzone-icon';
}
}
@ -306,6 +306,7 @@ async function magCreate(droppedFile = null) {
const issue = ($('mag-new-issue')?.value || '').trim();
const addBtn = $('mag-add-btn');
const browseBtn = $('mag-browse-btn');
const dropzone = $('mag-dropzone');
const titleInp = $('mag-new-title');
const issueInp = $('mag-new-issue');
@ -325,6 +326,7 @@ async function magCreate(droppedFile = null) {
}
if (progress) progress.hidden = false;
if (pickBtn) pickBtn.hidden = true;
if (browseBtn) browseBtn.hidden = true;
if (iconEl) iconEl.className = 'mdi mdi-loading mdi-spin reader-dropzone-icon';
if (titleEl) titleEl.textContent = 'Uploading & Ingesting PDF...';
if (noteEl) noteEl.textContent = `Processing "${file.name}" (${sizeMb} MB). Transferring source file and extracting layout...`;
@ -341,6 +343,7 @@ async function magCreate(droppedFile = null) {
}
if (progress) progress.hidden = true;
if (pickBtn) pickBtn.hidden = false;
if (browseBtn) browseBtn.hidden = false;
if (addBtn) {
addBtn.disabled = false;
addBtn.innerHTML = origBtnText;

View File

@ -10,30 +10,39 @@
<div id="mag-view-library">
<div class="card mag-new">
<h3>Add a magazine or paper</h3>
<div class="mag-new-grid">
<label for="mag-new-title">Title <span class="muted">(optional)</span>
<input id="mag-new-title" type="text" placeholder="Auto-filled from PDF filename if blank" autocomplete="off">
</label>
<label for="mag-new-issue">Issue <span class="muted">(optional)</span>
<input id="mag-new-issue" type="text" placeholder="September 2026" autocomplete="off">
</label>
</div>
<div class="reader-dropzone" id="mag-dropzone" style="cursor: pointer;">
<span class="mdi mdi-cloud-upload-outline reader-dropzone-icon" id="mag-dropzone-icon"></span>
<strong id="mag-dropzone-title">Drop a PDF or click to browse</strong>
<span class="note" id="mag-dropzone-note">Scanned issues work too &mdash; pages without selectable text are read with OCR.</span>
<div class="mag-dropzone-progress" id="mag-dropzone-progress" hidden>
<div class="mag-dropzone-progress-bar"></div>
<div class="reader-source-grid">
<div class="reader-paste-panel">
<div class="reader-source-method">
<span class="mdi mdi-file-document-edit-outline"></span>
<div><strong>Import &amp; Metadata</strong><span>Select a PDF file or configure optional title and issue details.</span></div>
</div>
<div class="mag-new-grid" style="margin-top: 4px; margin-bottom: 4px;">
<label for="mag-new-title">Title <span class="muted">(optional)</span>
<input id="mag-new-title" type="text" placeholder="Auto-filled from PDF filename if blank" autocomplete="off">
</label>
<label for="mag-new-issue">Issue <span class="muted">(optional)</span>
<input id="mag-new-issue" type="text" placeholder="e.g. September 2026" autocomplete="off">
</label>
</div>
<div class="reader-paste-actions" style="margin-top: auto; padding-top: 6px;">
<label class="btn-primary btn-sm reader-file-pick" id="mag-browse-btn" title="Choose a PDF file from your computer">
<span class="mdi mdi-folder-open-outline"></span> Durchsuchen
<input type="file" id="mag-new-file" accept="application/pdf" style="display:none">
</label>
</div>
</div>
<div class="reader-dropzone" id="mag-dropzone" style="cursor: pointer;">
<span class="mdi mdi-cloud-upload-outline reader-dropzone-icon" id="mag-dropzone-icon"></span>
<strong id="mag-dropzone-title">Drop a PDF document</strong>
<span class="note" id="mag-dropzone-note">Scanned issues work too &mdash; pages without selectable text are read with OCR.</span>
<div class="mag-dropzone-progress" id="mag-dropzone-progress" hidden>
<div class="mag-dropzone-progress-bar"></div>
</div>
<label class="btn-secondary btn-sm reader-file-pick" id="mag-dropzone-pick-btn" title="Choose a PDF file" onclick="event.stopPropagation()">
<span class="mdi mdi-file-upload-outline"></span> Import PDF
</label>
</div>
<label class="btn-secondary btn-sm reader-file-pick" id="mag-dropzone-pick-btn" title="Choose a PDF file" onclick="event.stopPropagation()">
<span class="mdi mdi-file-upload-outline"></span> Choose file
<input type="file" id="mag-new-file" accept="application/pdf" style="display:none">
</label>
</div>
<div class="mag-new-actions">
<button type="button" class="btn primary" id="mag-add-btn" onclick="magCreate()">
<span class="mdi mdi-plus"></span> Add magazine
</button>
</div>
</div>