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:
@@ -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,
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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")]
|
||||
|
||||
Reference in New Issue
Block a user