Open Blogmarks through the standard tab flow

This commit is contained in:
2026-07-20 21:13:21 +02:00
parent dc11155aac
commit fe6bf3e1f4
2 changed files with 62 additions and 27 deletions

View File

@@ -1627,26 +1627,7 @@ impl BdsApp {
}
// ── Tabs ──
Message::OpenTab(tab) => {
self.flush_active_post_editor();
let idx = tabs::open_tab(&mut self.tabs, tab);
let mut semantic_post_id = None;
if let Some(t) = self.tabs.get(idx) {
self.active_tab = Some(t.id.clone());
let tab_clone = t.clone();
if tab_clone.tab_type == TabType::Post {
semantic_post_id = Some(tab_clone.id.clone());
}
self.load_editor_for_tab(&tab_clone);
}
self.enforce_panel_tab_fallback();
self.sync_menu_state();
let mut tasks = vec![self.sync_embedded_previews()];
if let Some(post_id) = semantic_post_id {
tasks.push(Task::done(Message::LoadSemanticTagSuggestions(post_id)));
}
Task::batch(tasks)
}
Message::OpenTab(tab) => self.open_tab(tab),
Message::CloseTab(id) => {
if self.active_tab.as_deref() == Some(id.as_str()) {
self.flush_active_post_editor();
@@ -2611,13 +2592,9 @@ impl BdsApp {
is_transient: false,
is_dirty: false,
};
let index = tabs::open_tab(&mut self.tabs, tab);
self.active_tab = self.tabs.get(index).map(|tab| tab.id.clone());
if let Some(tab) = self.tabs.get(index).cloned() {
self.load_editor_for_tab(&tab);
}
let open_editor = self.open_tab(tab);
self.notify(ToastLevel::Success, &t(self.ui_locale, "blogmark.imported"));
self.refresh_counts()
Task::batch([open_editor, self.refresh_counts()])
}
Err(error) => {
if self.task_manager.status(task_id) != Some(TaskStatus::Cancelled) {
@@ -5522,6 +5499,26 @@ impl BdsApp {
})
}
fn open_tab(&mut self, tab: Tab) -> Task<Message> {
self.flush_active_post_editor();
let index = tabs::open_tab(&mut self.tabs, tab);
let mut semantic_post_id = None;
if let Some(tab) = self.tabs.get(index).cloned() {
self.active_tab = Some(tab.id.clone());
if tab.tab_type == TabType::Post {
semantic_post_id = Some(tab.id.clone());
}
self.load_editor_for_tab(&tab);
}
self.enforce_panel_tab_fallback();
self.sync_menu_state();
let mut tasks = vec![self.sync_embedded_previews()];
if let Some(post_id) = semantic_post_id {
tasks.push(Task::done(Message::LoadSemanticTagSuggestions(post_id)));
}
Task::batch(tasks)
}
fn find_next_in_active_editor(&mut self, query: &str) -> bool {
let Some(id) = self.active_tab.clone() else {
return false;
@@ -9596,6 +9593,16 @@ mod tests {
#[test]
fn imported_blogmark_activates_posts_and_opens_its_editor() {
let (db, project, temp) = setup();
ai::save_endpoint(
db.conn(),
&ai::AiEndpointConfig {
kind: ai::AiEndpointKind::Airplane,
url: "http://127.0.0.1:9".to_string(),
model: "test".to_string(),
api_key: None,
},
)
.unwrap();
let created = post::create_post(
db.conn(),
temp.path(),
@@ -9610,6 +9617,10 @@ mod tests {
)
.unwrap();
let mut app = BdsApp::new_for_tests(db, project, temp.path().to_path_buf());
let mut settings = SettingsViewState::default();
settings.default_mode = "preview".to_string();
app.settings_state = Some(settings);
app.offline_mode = true;
app.sidebar_view = SidebarView::Settings;
app.sidebar_visible = false;
let task_id = app.task_manager.submit("Importing blogmark");
@@ -9627,6 +9638,13 @@ mod tests {
assert!(app.sidebar_visible);
assert_eq!(app.active_tab.as_deref(), Some(created.id.as_str()));
assert!(app.post_editors.contains_key(&created.id));
assert!(app.embedded_preview.is_some());
assert!(
app.task_manager
.snapshots()
.iter()
.all(|task| task.group_name.as_deref() != Some("AI"))
);
}
#[test]
@@ -11078,6 +11096,16 @@ mod tests {
#[test]
fn task_tick_autosaves_dirty_post_editor() {
let (db, project, tmp) = setup();
ai::save_endpoint(
db.conn(),
&ai::AiEndpointConfig {
kind: ai::AiEndpointKind::Airplane,
url: "http://127.0.0.1:9".to_string(),
model: "test".to_string(),
api_key: None,
},
)
.unwrap();
let created = post::create_post(
db.conn(),
tmp.path(),
@@ -11108,6 +11136,7 @@ mod tests {
editor.last_edit_at_ms = bds_core::util::now_unix_ms() - POST_AUTO_SAVE_DELAY_MS - 100;
let mut app = make_app(db, project, &tmp);
app.offline_mode = true;
app.post_editors.insert(created.id.clone(), editor);
app.tabs.push(crate::state::tabs::Tab {
id: created.id.clone(),
@@ -11127,6 +11156,12 @@ mod tests {
.unwrap();
assert_eq!(saved.title, "Autosaved");
assert!(!app.post_editors.get(&created.id).unwrap().is_dirty);
assert!(
app.task_manager
.snapshots()
.iter()
.all(|task| task.group_name.as_deref() != Some("AI"))
);
}
#[test]