Focus request/folder after creation

This commit is contained in:
Gregory Schier
2025-11-11 14:11:43 -08:00
parent 8164a61376
commit 7b6278405c
19 changed files with 138 additions and 86 deletions

View File

@@ -8,7 +8,7 @@ use crate::{
};
use chrono::Utc;
use cookie::Cookie;
use log::{debug, error};
use log::error;
use tauri::{AppHandle, Emitter, Manager, Runtime};
use tauri_plugin_clipboard_manager::ClipboardExt;
use yaak_common::window::WorkspaceWindowTrait;

View File

@@ -46,7 +46,7 @@ export type HttpUrlParameter = { enabled?: boolean, name: string, value: string,
export type KeyValue = { model: "key_value", id: string, createdAt: string, updatedAt: string, key: string, namespace: string, value: string, };
export type ModelChangeEvent = { "type": "upsert" } | { "type": "delete" };
export type ModelChangeEvent = { "type": "upsert", created: boolean, } | { "type": "delete" };
export type ModelPayload = { model: AnyModel, updateSource: UpdateSource, change: ModelChangeEvent, };

View File

@@ -12,31 +12,23 @@ export function initModelStore(store: JotaiStore) {
_store = store;
getCurrentWebviewWindow()
.listen<ModelPayload>('upserted_model', ({ payload }) => {
.listen<ModelPayload>('model_write', ({ payload }) => {
if (shouldIgnoreModel(payload)) return;
mustStore().set(modelStoreDataAtom, (prev: ModelStoreData) => {
return {
...prev,
[payload.model.model]: {
...prev[payload.model.model],
[payload.model.id]: payload.model,
},
};
});
})
.catch(console.error);
getCurrentWebviewWindow()
.listen<ModelPayload>('deleted_model', ({ payload }) => {
if (shouldIgnoreModel(payload)) return;
console.log('Delete model', payload);
mustStore().set(modelStoreDataAtom, (prev: ModelStoreData) => {
const modelData = { ...prev[payload.model.model] };
delete modelData[payload.model.id];
return { ...prev, [payload.model.model]: modelData };
if (payload.change.type === 'upsert') {
return {
...prev,
[payload.model.model]: {
...prev[payload.model.model],
[payload.model.id]: payload.model,
},
};
} else {
const modelData = { ...prev[payload.model.model] };
delete modelData[payload.model.id];
return { ...prev, [payload.model.model]: modelData };
}
});
})
.catch(console.error);

View File

@@ -3,11 +3,11 @@ use crate::error::Error::ModelNotFound;
use crate::error::Result;
use crate::models::{AnyModel, UpsertModelInfo};
use crate::util::{ModelChangeEvent, ModelPayload, UpdateSource};
use log::error;
use log::{error, warn};
use rusqlite::OptionalExtension;
use sea_query::{
Asterisk, Expr, IntoColumnRef, IntoIden, IntoTableRef, OnConflict, Query, SimpleExpr,
SqliteQueryBuilder,
Alias, Asterisk, Expr, Func, IntoColumnRef, IntoIden, IntoTableRef, OnConflict, Query,
ReturningClause, SimpleExpr, SqliteQueryBuilder,
};
use sea_query_rusqlite::RusqliteBinder;
use std::fmt::Debug;
@@ -152,21 +152,32 @@ impl<'a> DbContext<'a> {
}
let on_conflict = OnConflict::column(id_iden).update_columns(update_columns).to_owned();
let (sql, params) = Query::insert()
.into_table(table)
.columns(column_vec)
.values_panic(value_vec)
.on_conflict(on_conflict)
.returning_all()
.returning(Query::returning().exprs(vec![
Expr::col(Asterisk),
Expr::expr(Func::cust("last_insert_rowid")),
Expr::col("rowid"),
]))
.build_rusqlite(SqliteQueryBuilder);
let mut stmt = self.conn.resolve().prepare(sql.as_str())?;
let m: M = stmt.query_row(&*params.as_params(), |row| M::from_row(row))?;
let (m, created): (M, bool) = stmt.query_row(&*params.as_params(), |row| {
M::from_row(row).and_then(|m| {
let rowid: i64 = row.get("rowid")?;
let last_rowid: i64 = row.get("last_insert_rowid()")?;
Ok((m, rowid == last_rowid))
})
})?;
let payload = ModelPayload {
model: m.clone().into(),
update_source: source.clone(),
change: ModelChangeEvent::Upsert,
change: ModelChangeEvent::Upsert { created },
};
if let Err(e) = self.events_tx.send(payload.clone()) {

View File

@@ -77,11 +77,7 @@ pub fn init<R: Runtime>() -> TauriPlugin<R> {
let app_handle = app_handle.clone();
tauri::async_runtime::spawn(async move {
for p in rx {
let name = match p.change {
ModelChangeEvent::Upsert => "upserted_model",
ModelChangeEvent::Delete => "deleted_model",
};
app_handle.emit(name, p).unwrap();
app_handle.emit("model_write", p).unwrap();
}
});
}

View File

@@ -3,7 +3,6 @@ use crate::models::{
AnyModel, Environment, Folder, GrpcRequest, HttpRequest, UpsertModelInfo, WebsocketRequest,
Workspace, WorkspaceIden,
};
use yaak_common::window::WorkspaceWindowTrait;
use crate::query_manager::QueryManagerExt;
use chrono::{NaiveDateTime, Utc};
use log::warn;
@@ -12,6 +11,7 @@ use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use tauri::{AppHandle, Listener, Runtime, WebviewWindow};
use ts_rs::TS;
use yaak_common::window::WorkspaceWindowTrait;
pub fn generate_prefixed_id(prefix: &str) -> String {
format!("{prefix}_{}", generate_id())
@@ -45,7 +45,7 @@ pub struct ModelPayload {
#[serde(rename_all = "snake_case", tag = "type")]
#[ts(export, export_to = "gen_models.ts")]
pub enum ModelChangeEvent {
Upsert,
Upsert { created: bool },
Delete,
}