Archiv-Formular mit Titel-Feld; Panel-Fenster einzeilige Overlay-Titelbar; Header name@pool ohne Chip

- Archivieren: Titel-Feld, vorbelegt mit der ersten Ueberschrift
  (panel_title_cmd), bestimmt Frontmatter-title und Dateinamen-Slug;
  archive_panel (MCP) nimmt title ebenfalls
- Panel-/Archiv-Fenster (macOS): TitleBarStyle::Overlay + hidden_title,
  Ampel in der Topbar (84px), eigener Schliessen-Knopf dort aus
- Terminal-Header: Pool direkt am Projektnamen als name@pool,
  Chip und Pipe entfernt
This commit is contained in:
marcus.hinz
2026-07-26 22:44:28 +02:00
parent 082422c32a
commit 9b509a2aae
12 changed files with 70 additions and 8 deletions
+1
View File
@@ -288,6 +288,7 @@ fn invoke_handlers() -> impl Fn(tauri::ipc::Invoke<tauri::Wry>) -> bool + Send +
commands::set_apikey,
commands::panel_archive_dir_cmd,
commands::panel_archive_cmd,
commands::panel_title_cmd,
commands::set_archive_home_cmd,
commands::change_archive_home_cmd,
commands::clear_archive_home_cmd,
+8
View File
@@ -448,6 +448,7 @@ pub(crate) fn clear_archive_home_cmd(project: String) -> Result<(), String> {
pub(crate) fn panel_archive_cmd(
project: String,
dir: Option<String>,
title: Option<String>,
folder: Option<String>,
description: Option<String>,
tags: Option<Vec<String>>,
@@ -470,6 +471,7 @@ pub(crate) fn panel_archive_cmd(
None => None,
};
let meta = ArchiveMeta {
title: title.filter(|t| !t.trim().is_empty()),
folder,
description: description.filter(|d| !d.trim().is_empty()),
tags: tags.unwrap_or_default(),
@@ -477,6 +479,12 @@ pub(crate) fn panel_archive_cmd(
archive_panel_content(&project, dir.as_deref(), &meta).map(|p| p.display().to_string())
}
/// Titel-Vorbelegung fürs Archiv-Formular: erste Überschrift des Entwurfs.
#[tauri::command]
pub(crate) fn panel_title_cmd(project: String) -> String {
crate::domain::archive::panel_title(&project)
}
/// Dokumentliste des Archiv-Index (frisch gescannt) fürs Panel.
#[tauri::command]
pub(crate) fn archive_docs_cmd(
+9 -1
View File
@@ -180,6 +180,8 @@ pub(crate) fn remove_archive_permission(
/// Metadaten beim Archivieren: Unterordner im Archiv-Home plus Frontmatter-Felder.
#[derive(Default)]
pub(crate) struct ArchiveMeta {
/// Titel aus dem Archiv-Formular; ohne ihn gilt die erste Überschrift.
pub(crate) title: Option<String>,
/// Unterordner relativ zum Archiv-Home (wird angelegt).
pub(crate) folder: Option<String>,
/// Einzeiler fürs Frontmatter.
@@ -220,7 +222,7 @@ pub(crate) fn archive_panel_content(
.map_err(|e| e.to_string())?
.as_secs();
let (stamp, iso) = utc_stamp(secs);
let title = first_line(&text);
let title = meta.title.clone().unwrap_or_else(|| first_line(&text));
let (path, mut file) = create_unique(&dir, &stamp, &slugify(&title))?;
// Frontmatter trägt den Anzeigenamen, nicht die Projekt-ID.
let name = crate::domain::project::display_name_in(&Paths::real(), project)?;
@@ -365,6 +367,12 @@ pub(crate) fn strip_stamp(stem: &str) -> &str {
}
/// Titelzeile: erste Überschrift (## …) oder sonst erste nicht-leere Zeile.
/// Titel des aktuellen Panel-Entwurfs (erste Überschrift bzw. erste Zeile) —
/// Vorbelegung für das Titel-Feld im Archiv-Formular.
pub(crate) fn panel_title(project: &str) -> String {
first_line(&fs::read_to_string(panel_file(project)).unwrap_or_default())
}
fn first_line(text: &str) -> String {
let mut fallback: Option<&str> = None;
for line in text.lines() {
+7
View File
@@ -223,6 +223,12 @@ fn tool_def(name: &str) -> Value {
"inputSchema": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description":
"Titel des Dokuments; ohne ihn gilt die erste Überschrift \
des Entwurfs.",
},
"folder": {
"type": "string",
"description":
@@ -516,6 +522,7 @@ fn call_archive(req: &Value) -> Value {
let project = std::env::var("AI_CONTROL_PROJECT").unwrap_or_default();
let args = &req["params"]["arguments"];
let meta = crate::domain::archive::ArchiveMeta {
title: args["title"].as_str().map(str::to_string),
folder: args["folder"].as_str().map(str::to_string),
description: args["description"].as_str().map(str::to_string),
tags: args["tags"]
+7
View File
@@ -811,6 +811,13 @@ pub async fn open_panel_window(
None => builder.center(),
};
// macOS: Titelbar als Overlay über der eigenen Kopfleiste — eine Zeile,
// wie im Terminal-Fenster; die Topbar in panel.html ist Drag-Region.
#[cfg(target_os = "macos")]
let builder = builder
.title_bar_style(tauri::TitleBarStyle::Overlay)
.hidden_title(true);
// Linux/GNOME: keine GTK-Deko — eigene Kopfleiste in panel.html, wie beim
// Terminal-Fenster.
#[cfg(target_os = "linux")]