Add REST endpoints and frontend wiring for per-language project actions:
- POST /api/workspace/{project}/translation/{lang}/queue — queue translation
- POST /api/workspace/{project}/audio/{lang}/queue — queue audio generation
- GET/POST /api/workspace/{project}/format/{lang} — format metadata (EPUB/PDF)
- GET /api/workspace/{project}/review/{lang}/chapters/{chapter} — utterance review
- GET/POST /api/workspace/{project}/front-matter/{lang} — front matter editor
- GET /api/workspace/{project}/chapters/{lang} — chapter list
- GET /api/workspace/{project}/chapter-content/{lang}/{chapter} — chapter text
Frontend fixes:
- Review page shows per-language text (English source, Chinese translation, etc.)
- Non-translated languages show 'Queue translation' button only
- Speaker data from English source matched by paragraph ID
- UmbraAudio column layout: Speaker, Variation, Text, Actions
- Chapter tree in left sidebar: Front matter, Back matter, Body
- Audio Format label at top of sidebar
- Pandoc formatting toolbar for front matter text editing
81 lines
3.4 KiB
HTML
81 lines
3.4 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
<meta name="description" content="Umbra Tools workspace">
|
|
<title>Umbra Tools</title>
|
|
<link rel="icon" type="image/png" href="assets/umbratrans-emblem.png">
|
|
<link rel="stylesheet" href="assets/styles.css">
|
|
</head>
|
|
<body>
|
|
<!--
|
|
The Umbra Tools shell. Every signed-in session lands here.
|
|
|
|
Banner: brand and activity switch (left), the program selector (middle-left),
|
|
the selected language/project name (middle), the account and role (right).
|
|
|
|
Two-level navigation:
|
|
1. Activity: Control Panel, Program, Edit, Audio
|
|
2. Program: "Select Program" until one is chosen; then the dropdown lists
|
|
the program's languages as "IT - Deal Hunter", "SP - Deal Hunter", etc.
|
|
|
|
A Program is a book being translated and produced as audiobooks. Each
|
|
language under a program is a "project" with its own state: metadata/ISBN,
|
|
utterance review, audio generation, epub/pdf formatting, production download.
|
|
|
|
The control panel is mounted inline from `assets/admin-view.js`, which the
|
|
standalone `uadmin/` page also uses, so the two cannot drift.
|
|
-->
|
|
<div class="umbra-shell">
|
|
<header class="umbra-topbar">
|
|
<div class="umbra-topbar__left">
|
|
<a class="umbra-topbar__brandlink" href="umbra-app.html" aria-label="Umbra Tools home">
|
|
<img class="umbra-topbar__logo" src="assets/umbratrans-emblem.png" alt="" aria-hidden="true">
|
|
<span class="umbra-topbar__brand">Umbra Tools</span>
|
|
</a>
|
|
<select id="activity-select" class="umbra-topbar__mode" aria-label="Active activity">
|
|
<option value="control">Control Panel</option>
|
|
<option value="program">Program</option>
|
|
<option value="edit">Edit</option>
|
|
<option value="audio">Audio</option>
|
|
<option value="format">Format</option>
|
|
<option value="review">Review</option>
|
|
</select>
|
|
</div>
|
|
<div class="umbra-topbar__middle">
|
|
<select id="program-select" class="umbra-topbar__mode umbra-topbar__mode--hidden" aria-label="Program">
|
|
<option value="">Select Program</option>
|
|
</select>
|
|
<div id="topbar-language-name" class="umbra-topbar__name" aria-live="polite"></div>
|
|
</div>
|
|
<div class="umbra-topbar__right">
|
|
<div class="umbra-user">
|
|
<span class="avatar" id="topbar-avatar" aria-hidden="true">··</span>
|
|
<span class="umbra-user__meta">
|
|
<span class="umbra-user__name" id="topbar-username">Loading…</span>
|
|
<span class="umbra-user__role" id="topbar-role">Checking session</span>
|
|
</span>
|
|
</div>
|
|
<select id="account-menu" class="umbra-dropdown" aria-label="Account menu">
|
|
<option value="">Account ▾</option>
|
|
<option value="settings">Account settings</option>
|
|
<option value="signout">Sign out</option>
|
|
</select>
|
|
</div>
|
|
</header>
|
|
|
|
<aside class="umbra-sidebar" id="sidebar" aria-label="Activity navigation"></aside>
|
|
|
|
<main class="umbra-main" id="main">
|
|
<noscript>Umbra Tools needs JavaScript enabled.</noscript>
|
|
</main>
|
|
</div>
|
|
|
|
<div id="toast" class="toast" role="status" aria-live="polite"></div>
|
|
<script src="assets/api.js" defer></script>
|
|
<script src="assets/admin-view.js" defer></script>
|
|
<script src="assets/umbra-app.js" defer></script>
|
|
</body>
|
|
</html>
|