Update app.py
Browse files
app.py
CHANGED
@@ -72,8 +72,8 @@ app.layout = html.Div([
|
|
72 |
|
73 |
# Tabs
|
74 |
dcc.Tabs(id="data-tabs", value="api", children=[
|
75 |
-
dcc.Tab(label="
|
76 |
-
dcc.Tab(label="
|
77 |
]),
|
78 |
|
79 |
html.Div(id="data-tab-content"),
|
@@ -250,7 +250,7 @@ def render_tab_content(tab):
|
|
250 |
if tab == "omeka":
|
251 |
return html.Div([
|
252 |
html.Div([
|
253 |
-
html.H5("
|
254 |
# API URL input with full width
|
255 |
dbc.InputGroup([
|
256 |
dbc.Input(
|
@@ -310,11 +310,21 @@ def render_tab_content(tab):
|
|
310 |
], className="border rounded bg-white shadow-sm")
|
311 |
elif tab == "lance":
|
312 |
return html.Div([
|
313 |
-
html.H5("
|
314 |
-
|
315 |
-
|
316 |
-
|
317 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
318 |
])
|
319 |
|
320 |
return html.Div("Invalid tab selected.")
|
@@ -372,18 +382,6 @@ def load_item_sets(n_clicks, base_url):
|
|
372 |
except Exception as e:
|
373 |
return dash.no_update, dash.no_update
|
374 |
|
375 |
-
## -------------------- Load LanceDB tables callback--------------------
|
376 |
-
@app.callback(
|
377 |
-
Output("db-tables-dropdown", "options", allow_duplicate=True),
|
378 |
-
Input("load-tables", "n_clicks"),
|
379 |
-
prevent_initial_call=True
|
380 |
-
)
|
381 |
-
def list_tables(n_clicks):
|
382 |
-
if not n_clicks:
|
383 |
-
raise PreventUpdate
|
384 |
-
tables = manager.list_tables()
|
385 |
-
return [{"label": t, "value": t} for t in tables]
|
386 |
-
|
387 |
## -------------------- Load & Process Omeka items callback--------------------
|
388 |
@app.callback(
|
389 |
Output("umap-graph", "figure"),
|
@@ -457,7 +455,7 @@ def handle_omeka_data(n_clicks, item_set_id, client_config, table_name):
|
|
457 |
Output("umap-graph", "figure", allow_duplicate=True),
|
458 |
Output("status", "children", allow_duplicate=True),
|
459 |
Input("load-data-db", "n_clicks"),
|
460 |
-
State("db-tables-
|
461 |
prevent_initial_call=True
|
462 |
)
|
463 |
def handle_db_data(n_clicks, db_table):
|
@@ -500,7 +498,7 @@ def show_point_details(hoverData):
|
|
500 |
Input("search-button", "n_clicks"),
|
501 |
Input("search-limit-slider", "value"), # Add slider input
|
502 |
State("search-input", "value"),
|
503 |
-
State("db-tables-
|
504 |
State("umap-graph", "figure"),
|
505 |
prevent_initial_call=True
|
506 |
)
|
@@ -568,30 +566,27 @@ def clear_search(n_clicks, current_fig):
|
|
568 |
|
569 |
return fig, "" # Return cleared figure and empty search input
|
570 |
|
571 |
-
## --------------------
|
572 |
@app.callback(
|
573 |
Output("db-tables-dropdown", "options",allow_duplicate=True), # Update dropdown options
|
574 |
Output("status", "children",allow_duplicate=True), # Show status message
|
575 |
-
Output("db-tables-dropdown", "value",allow_duplicate=True), # Clear current selection
|
576 |
Input("drop-data-db", "n_clicks"),
|
577 |
-
State("db-tables-
|
|
|
578 |
prevent_initial_call=True
|
579 |
)
|
580 |
-
def drop_db_data(n_clicks, db_table):
|
581 |
if not n_clicks or not db_table:
|
582 |
raise PreventUpdate
|
583 |
|
584 |
try:
|
585 |
-
# Delete the table
|
586 |
success = manager.drop_table(db_table)
|
587 |
|
588 |
if success:
|
589 |
-
#
|
590 |
-
|
591 |
-
options = [{"label": t, "value": t} for t in tables]
|
592 |
-
return options, f"Table '{db_table}' successfully deleted", None
|
593 |
else:
|
594 |
-
return dash.no_update, f"Failed to delete table '{db_table}'"
|
595 |
|
596 |
except Exception as e:
|
597 |
print(f"Error dropping table: {str(e)}")
|
|
|
72 |
|
73 |
# Tabs
|
74 |
dcc.Tabs(id="data-tabs", value="api", children=[
|
75 |
+
dcc.Tab(label="Harvest data from Omeka S", value="omeka"),
|
76 |
+
dcc.Tab(label="Visualize existing collections", value="lance")
|
77 |
]),
|
78 |
|
79 |
html.Div(id="data-tab-content"),
|
|
|
250 |
if tab == "omeka":
|
251 |
return html.Div([
|
252 |
html.Div([
|
253 |
+
html.H5("Harvest data from an Omeka S instance", className="mb-3"),
|
254 |
# API URL input with full width
|
255 |
dbc.InputGroup([
|
256 |
dbc.Input(
|
|
|
310 |
], className="border rounded bg-white shadow-sm")
|
311 |
elif tab == "lance":
|
312 |
return html.Div([
|
313 |
+
html.H5("Visualize existing collections already loaded"),
|
314 |
+
tables = manager.list_tables()
|
315 |
+
return html.Div([
|
316 |
+
html.H5("From LanceDB", className="mb-3"),
|
317 |
+
html.Div([
|
318 |
+
dbc.RadioItems(
|
319 |
+
id="db-tables-radio",
|
320 |
+
options=[{"label": t, "value": t} for t in tables],
|
321 |
+
value=tables[0] if tables else None,
|
322 |
+
className="mb-3"
|
323 |
+
),
|
324 |
+
dbc.Button("Display Table", id="load-data-db", color="success", size="sm", className="me-2"),
|
325 |
+
dbc.Button("Drop Table", id="drop-data-db", color="danger", size="sm"),
|
326 |
+
]) if tables else html.P("No tables available in LanceDB", className="text-muted"),
|
327 |
+
], className="border rounded bg-white shadow-sm p-3")
|
328 |
])
|
329 |
|
330 |
return html.Div("Invalid tab selected.")
|
|
|
382 |
except Exception as e:
|
383 |
return dash.no_update, dash.no_update
|
384 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
385 |
## -------------------- Load & Process Omeka items callback--------------------
|
386 |
@app.callback(
|
387 |
Output("umap-graph", "figure"),
|
|
|
455 |
Output("umap-graph", "figure", allow_duplicate=True),
|
456 |
Output("status", "children", allow_duplicate=True),
|
457 |
Input("load-data-db", "n_clicks"),
|
458 |
+
State("db-tables-radio", "value"),
|
459 |
prevent_initial_call=True
|
460 |
)
|
461 |
def handle_db_data(n_clicks, db_table):
|
|
|
498 |
Input("search-button", "n_clicks"),
|
499 |
Input("search-limit-slider", "value"), # Add slider input
|
500 |
State("search-input", "value"),
|
501 |
+
State("db-tables-radio", "value"),
|
502 |
State("umap-graph", "figure"),
|
503 |
prevent_initial_call=True
|
504 |
)
|
|
|
566 |
|
567 |
return fig, "" # Return cleared figure and empty search input
|
568 |
|
569 |
+
## -------------------- Drop table callback--------------------
|
570 |
@app.callback(
|
571 |
Output("db-tables-dropdown", "options",allow_duplicate=True), # Update dropdown options
|
572 |
Output("status", "children",allow_duplicate=True), # Show status message
|
|
|
573 |
Input("drop-data-db", "n_clicks"),
|
574 |
+
State("db-tables-radio", "value"),
|
575 |
+
State("data-tabs", "value"),
|
576 |
prevent_initial_call=True
|
577 |
)
|
578 |
+
def drop_db_data(n_clicks, db_table, current_tab):
|
579 |
if not n_clicks or not db_table:
|
580 |
raise PreventUpdate
|
581 |
|
582 |
try:
|
|
|
583 |
success = manager.drop_table(db_table)
|
584 |
|
585 |
if success:
|
586 |
+
# Re-render the entire tab content to show updated radio buttons
|
587 |
+
return render_tab_content("lance"), f"Table '{db_table}' successfully deleted"
|
|
|
|
|
588 |
else:
|
589 |
+
return dash.no_update, f"Failed to delete table '{db_table}'"
|
590 |
|
591 |
except Exception as e:
|
592 |
print(f"Error dropping table: {str(e)}")
|