Spaces:
Paused
Paused
File size: 3,848 Bytes
6ca8ec7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
import dash
from dash import dcc, html, Input, Output, State, callback
import dash_bootstrap_components as dbc
import uuid
import sqlite3
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
# Initialize SQLite database
conn = sqlite3.connect('links.db', check_same_thread=False)
c = conn.cursor()
# Create table if it doesn't exist
c.execute('''CREATE TABLE IF NOT EXISTS links
(id TEXT PRIMARY KEY, name TEXT, url TEXT)''')
conn.commit()
# Function to get all links from the database
def get_links():
c.execute("SELECT * FROM links")
return [{"id": row[0], "name": row[1], "url": row[2]} for row in c.fetchall()]
# Initialize with some example URLs if the table is empty
if not get_links():
initial_urls = [
{"id": str(uuid.uuid4()), "name": "Google", "url": "https://www.google.com"},
{"id": str(uuid.uuid4()), "name": "Bing", "url": "https://www.bing.com"},
]
c.executemany("INSERT INTO links VALUES (:id, :name, :url)", initial_urls)
conn.commit()
app.layout = dbc.Container([
dbc.Row([
# Left navigation column
dbc.Col([
html.H2("My URL App", className="mt-3 mb-4"),
html.Div(id='url-list'),
dbc.Input(id='new-url-name', placeholder="New URL Name", className="mb-2"),
dbc.Input(id='new-url-link', placeholder="New URL", className="mb-2"),
dbc.Button("Add URL", id='add-url-button', color="primary", className="mb-3"),
], width=3, className="bg-light p-3"),
# Main content column with iframe
dbc.Col([
html.Iframe(id='content-iframe', style={'width': '100%', 'height': '800px'})
], width=9)
])
], fluid=True)
@callback(
Output('url-list', 'children'),
Input('add-url-button', 'n_clicks'),
State('new-url-name', 'value'),
State('new-url-link', 'value')
)
def update_url_list(n_clicks, new_name, new_link):
ctx = dash.callback_context
if ctx.triggered_id == 'add-url-button' and new_name and new_link:
new_id = str(uuid.uuid4())
c.execute("INSERT INTO links VALUES (?, ?, ?)", (new_id, new_name, new_link))
conn.commit()
links = get_links()
return [
dbc.Button(
link['name'],
id={'type': 'url-button', 'index': link['id']},
color="link",
className="d-block text-left mb-2"
) for link in links
] + [
dbc.Button(
"Delete",
id={'type': 'delete-button', 'index': link['id']},
color="danger",
size="sm",
className="mr-2 mb-2"
) for link in links
]
@callback(
Output('content-iframe', 'src'),
Input({'type': 'url-button', 'index': dash.ALL}, 'n_clicks')
)
def update_iframe(n_clicks):
ctx = dash.callback_context
if not ctx.triggered:
return dash.no_update
button_id = ctx.triggered[0]['prop_id'].split('.')[0]
clicked_id = eval(button_id)['index']
c.execute("SELECT url FROM links WHERE id = ?", (clicked_id,))
result = c.fetchone()
if result:
return result[0]
return dash.no_update
@callback(
Output('url-list', 'children', allow_duplicate=True),
Input({'type': 'delete-button', 'index': dash.ALL}, 'n_clicks'),
prevent_initial_call=True
)
def delete_url(n_clicks):
ctx = dash.callback_context
if not ctx.triggered:
return dash.no_update
button_id = ctx.triggered[0]['prop_id'].split('.')[0]
delete_id = eval(button_id)['index']
c.execute("DELETE FROM links WHERE id = ?", (delete_id,))
conn.commit()
return update_url_list(None, None, None)
if __name__ == '__main__':
print("Starting the Dash application...")
app.run(debug=True, host='0.0.0.0', port=7860)
print("Dash application has finished running.") |