Skip to content

Commit baa6c50

Browse files
authored
Merge pull request #4 from dancixx/refactor/mutli-tab-support
refactor: query, editor and tabs state
2 parents cdefda1 + 7abb079 commit baa6c50

17 files changed

+243
-241
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rust-sql-gui-ui"
3-
version = "1.0.0-alpha.5"
3+
version = "1.0.0-alpha.6"
44
edition = "2021"
55

66
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Welcome to the Tauri-Leptos PostgreSQL GUI, a fully Rust-based application for e
1212
- [x] **Multi-Connection Support:** Enable the GUI to handle multiple database connections simultaneously.
1313
- [x] **SQL Query Saving:** Allow users to save and manage their frequently used SQL queries.
1414
- [x] **Grid and Record View:** Provide a grid view for query results, as well as a record view for individual records.
15-
- [ ] **Multi Tab Support:** Allow users to open multiple tabs for SQL queries.
15+
- [x] **Multi Tab Support:** Allow users to open multiple tabs for SQL queries.
1616
- [ ] **BigQuery Support:** Add support for BigQuery databases.
1717

1818
## Key Features

common/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "common"
3-
version = "1.0.0-alpha.5"
3+
version = "1.0.0-alpha.6"
44
edition = "2021"
55

66
[dependencies]

src-tauri/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rust-sql-gui"
3-
version = "1.0.0-alpha.5"
3+
version = "1.0.0-alpha.6"
44
description = "PostgreSQL GUI written in Rust"
55
authors = ["Daniel Boros"]
66
license = ""

src/app.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,16 @@ use crate::{
44
enums::QueryTableLayout,
55
layout,
66
store::{
7-
active_project::ActiveProjectStore, editor::EditorStore, projects::ProjectsStore,
8-
query::QueryStore, tabs::Tabs,
7+
active_project::ActiveProjectStore, projects::ProjectsStore, query::QueryStore, tabs::TabsStore,
98
},
109
};
1110

1211
pub fn app() -> impl IntoView {
13-
provide_context(EditorStore::default());
1412
provide_context(QueryStore::default());
1513
provide_context(ProjectsStore::default());
1614
provide_context(create_rw_signal(QueryTableLayout::Grid));
1715
provide_context(ActiveProjectStore::default());
18-
provide_context(Tabs::default());
16+
provide_context(TabsStore::default());
1917

2018
layout::component()
2119
}

src/grid_view.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
use leptos::{html::*, *};
22

3-
use crate::store::query::QueryStore;
3+
use crate::store::tabs::TabsStore;
44

55
pub fn component() -> impl IntoView {
6-
let query_state = use_context::<QueryStore>().unwrap();
6+
let tabs_store = use_context::<TabsStore>().unwrap();
77

88
table()
99
.classes("table-auto w-full")
1010
.child(
1111
thead()
1212
.classes("sticky top-0 bg-white")
1313
.child(tr().classes("bg-gray-100").child(For(ForProps {
14-
each: move || query_state.sql_result.get().unwrap().0.clone(),
14+
each: move || tabs_store.select_active_editor_sql_result().unwrap().0,
1515
key: |n| n.clone(),
1616
children: move |col| th().classes("text-xs px-4").child(col),
1717
}))),
1818
)
1919
.child(tbody().child(For(ForProps {
20-
each: move || query_state.sql_result.get().unwrap().1.clone(),
20+
each: move || tabs_store.select_active_editor_sql_result().unwrap().1,
2121
key: |n| n.clone(),
2222
children: move |row| {
2323
tr()

src/layout.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use thaw::{Button, ButtonProps, Tab, TabProps, Tabs, TabsProps};
44
use crate::{footer, query_editor, query_table, sidebar, store::tabs};
55

66
pub fn component() -> impl IntoView {
7-
let tabs = use_context::<tabs::Tabs>().unwrap();
7+
let tabs = use_context::<tabs::TabsStore>().unwrap();
88

99
div()
1010
.classes("flex h-screen")
@@ -55,7 +55,7 @@ pub fn component() -> impl IntoView {
5555
tabs.active_tabs.update(|prev| *prev += 1);
5656
tabs
5757
.selected_tab
58-
.update(|prev| *prev = (tabs.active_tabs.get() - 1).to_string());
58+
.update(|prev| *prev = (prev.parse::<usize>().unwrap() + 1).to_string());
5959
})),
6060
children: Some(Box::new(move || {
6161
Fragment::new(vec![p().child("+").into_view()])

src/query_editor.rs

+20-20
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
use std::{cell::RefCell, rc::Rc};
1+
use std::{cell::RefCell, rc::Rc, sync::Arc};
22

3+
use futures::lock::Mutex;
34
use leptos::{html::*, *};
45
use leptos_use::{use_document, use_event_listener};
56
use monaco::{
@@ -8,35 +9,21 @@ use monaco::{
89
};
910
use wasm_bindgen::{closure::Closure, JsCast};
1011

11-
use crate::{
12-
modals,
13-
store::{editor::EditorStore, query::QueryStore},
14-
};
12+
use crate::{modals, store::tabs::TabsStore};
1513

1614
pub type ModelCell = Rc<RefCell<Option<CodeEditor>>>;
1715

1816
pub fn component() -> impl IntoView {
19-
let query_store = use_context::<QueryStore>().unwrap();
20-
let run_query = create_action(move |query_store: &QueryStore| {
21-
let query_store = *query_store;
22-
async move {
23-
query_store.run_query().await.unwrap();
24-
}
25-
});
17+
let tabs_store = Rc::new(RefCell::new(use_context::<TabsStore>().unwrap()));
2618
let show = create_rw_signal(false);
2719
let _ = use_event_listener(use_document(), ev::keydown, move |event| {
2820
if event.key() == "Escape" {
2921
show.set(false);
3022
}
3123
});
32-
let mut editors = use_context::<EditorStore>().unwrap();
3324
let node_ref = create_node_ref();
34-
let _ = use_event_listener(node_ref, ev::keydown, move |event| {
35-
if event.key() == "Enter" && event.ctrl_key() {
36-
run_query.dispatch(query_store);
37-
}
38-
});
3925

26+
let tabs_store_clone = tabs_store.clone();
4027
node_ref.on_load(move |node| {
4128
let div_element: &web_sys::HtmlDivElement = &node;
4229
let html_element = div_element.unchecked_ref::<web_sys::HtmlElement>();
@@ -61,7 +48,20 @@ pub fn component() -> impl IntoView {
6148

6249
// TODO: Fix this
6350
let e = Rc::new(RefCell::new(Some(e)));
64-
editors.add_editor(e);
51+
tabs_store_clone.borrow_mut().add_editor(e);
52+
});
53+
let tabs_store = Arc::new(Mutex::new(use_context::<TabsStore>().unwrap()));
54+
let run_query = create_action(move |tabs_store: &Arc<Mutex<TabsStore>>| {
55+
let tabs_store = tabs_store.clone();
56+
async move {
57+
tabs_store.lock().await.run_query().await.unwrap();
58+
}
59+
});
60+
let tabs_store_clone = tabs_store.clone();
61+
let _ = use_event_listener(node_ref, ev::keydown, move |event| {
62+
if event.key() == "Enter" && event.ctrl_key() {
63+
run_query.dispatch(tabs_store_clone.clone());
64+
}
6565
});
6666

6767
div()
@@ -85,7 +85,7 @@ pub fn component() -> impl IntoView {
8585
.child(
8686
button()
8787
.classes("p-1 border-1 border-neutral-200 bg-white hover:bg-neutral-200 rounded-md")
88-
.on(ev::click, move |_| run_query.dispatch(query_store))
88+
.on(ev::click, move |_| run_query.dispatch(tabs_store.clone()))
8989
.child("Query"),
9090
),
9191
),

src/query_table.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
use crate::{enums::QueryTableLayout, grid_view, record_view, store::query::QueryStore};
1+
use crate::{enums::QueryTableLayout, grid_view, record_view, store::tabs::TabsStore};
22
use leptos::{html::*, *};
33

44
pub fn component() -> impl IntoView {
5-
let query_state = use_context::<QueryStore>().unwrap();
5+
let tabs_store = use_context::<TabsStore>().unwrap();
66
let table_view = use_context::<RwSignal<QueryTableLayout>>().unwrap();
7-
let table_layout = move || match query_state.sql_result.get() {
7+
let table_layout = move || match tabs_store.select_active_editor_sql_result() {
88
None => div(),
99
Some(_) => match table_view() {
1010
QueryTableLayout::Grid => div().child(grid_view::component()),
1111
QueryTableLayout::Records => div().child(record_view::component()),
1212
},
1313
};
14-
let when = move || !query_state.is_loading.get();
14+
let when = move || !tabs_store.is_loading.get();
1515
let fallback = ViewFn::from(|| p().classes("pl-2").child("Loading..."));
1616
let children = ChildrenFn::to_children(move || Fragment::new(vec![table_layout().into_view()]));
1717

src/record_view.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
use leptos::{html::*, *};
22

3-
use crate::store::query::QueryStore;
3+
use crate::store::tabs::TabsStore;
44

55
pub fn component() -> impl IntoView {
6-
let query_state = use_context::<QueryStore>().unwrap();
7-
let columns = query_state.sql_result.get().unwrap().0.clone();
8-
let first_row = query_state
9-
.sql_result
10-
.get()
6+
let tabs_store = use_context::<TabsStore>().unwrap();
7+
let columns = tabs_store.select_active_editor_sql_result().unwrap().0;
8+
let first_row = tabs_store
9+
.select_active_editor_sql_result()
1110
.unwrap()
1211
.1
1312
.first()

src/sidebar/queries.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use super::query;
66
pub fn component() -> impl IntoView {
77
let query_state = use_context::<QueryStore>().unwrap();
88
let queries = create_resource(
9-
move || query_state.saved_queries.get(),
9+
move || query_state.0.get(),
1010
move |_| async move { query_state.select_queries().await.unwrap() },
1111
);
1212

src/sidebar/query.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use leptos::{html::*, *};
22
use leptos_icons::*;
33

4-
use crate::store::query::QueryStore;
4+
use crate::store::{query::QueryStore, tabs::TabsStore};
55

66
pub fn component(key: String) -> impl IntoView {
77
let query_store = use_context::<QueryStore>().unwrap();
8+
let tabs_store = use_context::<TabsStore>().unwrap();
89
let key_clone = key.clone();
910
let splitted_key = create_memo(move |_| {
1011
let key = key_clone.clone();
@@ -35,7 +36,7 @@ pub fn component(key: String) -> impl IntoView {
3536
.on(ev::click, {
3637
let key = key.clone();
3738
move |_| {
38-
query_store.load_query(&key).unwrap();
39+
tabs_store.load_query(&key).unwrap();
3940
}
4041
}),
4142
)

src/sidebar/table.rs

+23-12
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,31 @@
1+
use std::sync::Arc;
2+
3+
use futures::lock::Mutex;
14
use leptos::{html::*, *};
25
use leptos_icons::*;
36

4-
use crate::store::{active_project::ActiveProjectStore, editor::EditorStore, query::QueryStore};
7+
use crate::store::{active_project::ActiveProjectStore, tabs::TabsStore};
58

69
pub fn component(table: (String, String), project: String, schema: String) -> impl IntoView {
7-
let query_store = use_context::<QueryStore>().unwrap();
8-
let editor_store = use_context::<EditorStore>().unwrap();
10+
let tabs_store = Arc::new(Mutex::new(use_context::<TabsStore>().unwrap()));
911
let active_project = use_context::<ActiveProjectStore>().unwrap();
10-
let query = create_action(move |(schema, table): &(String, String)| {
11-
let project = project.clone();
12-
let schema = schema.clone();
13-
let table = table.clone();
14-
active_project.0.set(Some(project.clone()));
15-
editor_store.set_editor_value(&format!("SELECT * FROM {}.{} LIMIT 100;", schema, table));
16-
async move { query_store.run_query().await.unwrap() }
17-
});
12+
let query = create_action(
13+
move |(schema, table, tabs_store): &(String, String, Arc<Mutex<TabsStore>>)| {
14+
let tabs_store = tabs_store.clone();
15+
let project = project.clone();
16+
let schema = schema.clone();
17+
let table = table.clone();
18+
active_project.0.set(Some(project.clone()));
19+
20+
async move {
21+
tabs_store
22+
.lock()
23+
.await
24+
.set_editor_value(&format!("SELECT * FROM {}.{} LIMIT 100;", schema, table));
25+
tabs_store.lock().await.run_query().await.unwrap()
26+
}
27+
},
28+
);
1829

1930
div()
2031
.classes("flex flex-row justify-between items-center hover:font-semibold cursor-pointer")
@@ -33,6 +44,6 @@ pub fn component(table: (String, String), project: String, schema: String) -> im
3344
.child(p().child(table.clone().1))
3445
.on(ev::click, {
3546
let table = table.clone();
36-
move |_| query.dispatch((schema.clone(), table.0.clone()))
47+
move |_| query.dispatch((schema.clone(), table.0.clone(), tabs_store.clone()))
3748
})
3849
}

src/store/editor.rs

-75
This file was deleted.

src/store/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
pub mod active_project;
2-
pub mod editor;
32
pub mod projects;
43
pub mod query;
54
pub mod tabs;

0 commit comments

Comments
 (0)