Skip to content

Commit 9982c91

Browse files
committed
refactor: multi tab support
1 parent 9d12f23 commit 9982c91

File tree

13 files changed

+176
-224
lines changed

13 files changed

+176
-224
lines changed

src/app.rs

Lines changed: 2 additions & 4 deletions
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

Lines changed: 4 additions & 4 deletions
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

Lines changed: 1 addition & 1 deletion
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")

src/query_editor.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
use std::{cell::RefCell, rc::Rc};
1+
use std::{
2+
cell::RefCell,
3+
rc::Rc,
4+
sync::{Arc, Mutex},
5+
};
26

37
use leptos::{html::*, *};
48
use leptos_use::{use_document, use_event_listener};
@@ -8,19 +12,16 @@ use monaco::{
812
};
913
use wasm_bindgen::{closure::Closure, JsCast};
1014

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

1617
pub type ModelCell = Rc<RefCell<Option<CodeEditor>>>;
1718

1819
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;
20+
let tabs_store = Arc::new(Mutex::new(use_context::<TabsStore>().unwrap()));
21+
let run_query = create_action(move |tabs_store: &Arc<Mutex<TabsStore>>| {
22+
let tabs_store = tabs_store.clone();
2223
async move {
23-
query_store.run_query().await.unwrap();
24+
tabs_store.lock().unwrap().run_query().await.unwrap();
2425
}
2526
});
2627
let show = create_rw_signal(false);
@@ -29,14 +30,14 @@ pub fn component() -> impl IntoView {
2930
show.set(false);
3031
}
3132
});
32-
let mut editors = use_context::<EditorStore>().unwrap();
3333
let node_ref = create_node_ref();
34+
let tabs_store_clone = tabs_store.clone();
3435
let _ = use_event_listener(node_ref, ev::keydown, move |event| {
3536
if event.key() == "Enter" && event.ctrl_key() {
36-
run_query.dispatch(query_store);
37+
run_query.dispatch(tabs_store_clone.clone());
3738
}
3839
});
39-
40+
let tabs_store_clone = tabs_store.clone();
4041
node_ref.on_load(move |node| {
4142
let div_element: &web_sys::HtmlDivElement = &node;
4243
let html_element = div_element.unchecked_ref::<web_sys::HtmlElement>();
@@ -61,7 +62,7 @@ pub fn component() -> impl IntoView {
6162

6263
// TODO: Fix this
6364
let e = Rc::new(RefCell::new(Some(e)));
64-
editors.add_editor(e);
65+
tabs_store_clone.lock().unwrap().add_editor(e);
6566
});
6667

6768
div()
@@ -85,7 +86,7 @@ pub fn component() -> impl IntoView {
8586
.child(
8687
button()
8788
.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))
89+
.on(ev::click, move |_| run_query.dispatch(tabs_store.clone()))
8990
.child("Query"),
9091
),
9192
),

src/query_table.rs

Lines changed: 4 additions & 4 deletions
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

Lines changed: 5 additions & 6 deletions
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,27 @@
1+
use std::sync::{Arc, Mutex};
2+
13
use leptos::{html::*, *};
24
use leptos_icons::*;
35

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

68
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();
9+
let tabs_store = Arc::new(Mutex::new(use_context::<TabsStore>().unwrap()));
910
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-
});
11+
let query = create_action(
12+
move |(schema, table, tabs_store): &(String, String, Arc<Mutex<TabsStore>>)| {
13+
let project = project.clone();
14+
let schema = schema.clone();
15+
let table = table.clone();
16+
active_project.0.set(Some(project.clone()));
17+
tabs_store
18+
.lock()
19+
.unwrap()
20+
.set_editor_value(&format!("SELECT * FROM {}.{} LIMIT 100;", schema, table));
21+
let tabs_store = tabs_store.clone();
22+
async move { tabs_store.lock().unwrap().run_query().await.unwrap() }
23+
},
24+
);
1825

1926
div()
2027
.classes("flex flex-row justify-between items-center hover:font-semibold cursor-pointer")
@@ -33,6 +40,6 @@ pub fn component(table: (String, String), project: String, schema: String) -> im
3340
.child(p().child(table.clone().1))
3441
.on(ev::click, {
3542
let table = table.clone();
36-
move |_| query.dispatch((schema.clone(), table.0.clone()))
43+
move |_| query.dispatch((schema.clone(), table.0.clone(), tabs_store.clone()))
3744
})
3845
}

src/store/editor.rs

Lines changed: 0 additions & 75 deletions
This file was deleted.

0 commit comments

Comments
 (0)