Spaces:
Paused
Paused
File size: 4,410 Bytes
6ca8ec7 6fe716c 6ca8ec7 6fe716c 6ca8ec7 6fe716c 6ca8ec7 6fe716c 6ca8ec7 e15ce8c 6ca8ec7 e15ce8c 6ca8ec7 e15ce8c 6ca8ec7 e15ce8c 6ca8ec7 6fe716c 6ca8ec7 6fe716c 6ca8ec7 e15ce8c 6ca8ec7 6fe716c 6ca8ec7 6fe716c 6ca8ec7 6fe716c 6ca8ec7 6fe716c 6ca8ec7 6fe716c 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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
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])
DB_FILE = 'links.db'
def get_db_connection():
conn = sqlite3.connect(DB_FILE, check_same_thread=False)
conn.row_factory = sqlite3.Row
return conn
def init_db():
conn = get_db_connection()
c = conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS links
(id TEXT PRIMARY KEY, name TEXT, url TEXT)''')
conn.commit()
conn.close()
init_db()
def get_links():
conn = get_db_connection()
c = conn.cursor()
c.execute("SELECT * FROM links")
links = [dict(row) for row in c.fetchall()]
conn.close()
return links
app.layout = dbc.Container([
dbc.Modal([
dbc.ModalHeader("Add New URL"),
dbc.ModalBody([
dbc.Input(id='new-url-name', placeholder="URL Name", className="mb-2"),
dbc.Input(id='new-url-link', placeholder="URL", className="mb-2"),
]),
dbc.ModalFooter(
dbc.Button("Add", id="add-url-button", className="ml-auto")
),
], id="add-url-modal"),
dbc.Row([
dbc.Col([
html.H2("My URL App", className="mt-3 mb-4"),
dbc.Button("Add URL", id="open-modal-button", color="primary", className="mb-3"),
html.Div(id='url-list'),
], width=3, className="bg-light p-3"),
dbc.Col([
html.Iframe(id='content-iframe', style={'width': '100%', 'height': '800px'}, sandbox="allow-scripts allow-same-origin")
], width=9)
])
], fluid=True)
@callback(
Output("add-url-modal", "is_open"),
[Input("open-modal-button", "n_clicks"), Input("add-url-button", "n_clicks")],
[State("add-url-modal", "is_open")],
)
def toggle_modal(n1, n2, is_open):
if n1 or n2:
return not is_open
return is_open
@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:
conn = get_db_connection()
c = conn.cursor()
new_id = str(uuid.uuid4())
c.execute("INSERT INTO links VALUES (?, ?, ?)", (new_id, new_name, new_link))
conn.commit()
conn.close()
links = get_links()
return [
dbc.ListGroupItem([
dbc.Button(
link['name'],
id={'type': 'url-button', 'index': link['id']},
color="link",
className="text-left"
),
html.Span(
"✕",
id={'type': 'delete-button', 'index': link['id']},
className="float-right text-danger",
style={"cursor": "pointer"}
)
], className="d-flex justify-content-between align-items-center")
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']
conn = get_db_connection()
c = conn.cursor()
c.execute("SELECT url FROM links WHERE id = ?", (clicked_id,))
result = c.fetchone()
conn.close()
if result:
return result['url']
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']
conn = get_db_connection()
c = conn.cursor()
c.execute("DELETE FROM links WHERE id = ?", (delete_id,))
conn.commit()
conn.close()
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.") |