commit d21294fe151cadbc9f195c294544221ba9ce8392
parent 66e0cd2b6dc1540d4b7debbf25806df193d2c9df
Author: Andy Khramtsov <>
Date: Sat, 30 May 2026 02:57:56 +0300
feat: add clear buttons
Diffstat:
1 file changed, 55 insertions(+), 6 deletions(-)
diff --git a/src/deps/pages/home.py b/src/deps/pages/home.py
@@ -19,6 +19,8 @@ dash.register_page(__name__, path="/", order=1)
class ids:
cargo_toml_textarea: str = "cargo-toml-textarea"
cargo_lock_textarea: str = "cargo-lock-textarea"
+ cargo_toml_clear: str = "cargo-toml-clear"
+ cargo_lock_clear: str = "cargo-lock-clear"
upload_files: str = "upload-files"
@@ -96,12 +98,22 @@ def layout():
placeholder="Cargo.toml contents",
persistence=True,
),
+ html.Button(
+ className="button",
+ id=ids.cargo_toml_clear,
+ children="Clear Cargo.toml",
+ ),
html.Div("Cargo lock:"),
dcc.Textarea(
id=ids.cargo_lock_textarea,
placeholder="Cargo.lock contents",
persistence=True,
),
+ html.Button(
+ className="button",
+ id=ids.cargo_lock_clear,
+ children="Clear Cargo.toml",
+ ),
],
),
CollapseAIO(
@@ -194,6 +206,9 @@ def parse_cargo_lock(contents: str) -> pl.DataFrame:
)
),
missing_columns=dict(
+ name=pl.lit(""),
+ version=pl.lit(""),
+ source=pl.lit(""),
checksum=pl.lit(""),
dependencies=pl.lit([], dtype=pl.List(pl.String)),
),
@@ -201,8 +216,7 @@ def parse_cargo_lock(contents: str) -> pl.DataFrame:
)
-def files_into_graph(cargo_toml: pl.DataFrame, cargo_lock: pl.DataFrame) -> DfGraph:
- print(cargo_toml, cargo_lock)
+def files_into_graph(cargo_toml: pl.DataFrame | None, cargo_lock: pl.DataFrame) -> DfGraph:
arcs = (
(
cargo_lock.select(
@@ -253,7 +267,9 @@ def files_into_graph(cargo_toml: pl.DataFrame, cargo_lock: pl.DataFrame) -> DfGr
cargo_toml.select(
pl.col("name"),
pl.lit(True).alias("explicit"),
- ),
+ )
+ if cargo_toml is not None
+ else pl.DataFrame(dict(name=[])),
pl.col("name"),
"left",
).select(
@@ -468,14 +484,15 @@ def draw_graph_figure(
@callback(
dict(
- cargo_toml_textarea=Output(ids.cargo_toml_textarea, "value"),
- cargo_lock_textarea=Output(ids.cargo_lock_textarea, "value"),
+ cargo_toml_textarea=Output(ids.cargo_toml_textarea, "value", allow_duplicate=True),
+ cargo_lock_textarea=Output(ids.cargo_lock_textarea, "value", allow_duplicate=True),
),
dict(
contents=Input(ids.upload_files, "contents"),
filename=Input(ids.upload_files, "filename"),
),
dict(),
+ prevent_initial_call=True,
)
def upload_files(inputs, state):
contents: list[str] = inputs["contents"]
@@ -511,6 +528,34 @@ def upload_files(inputs, state):
@callback(
dict(
+ cargo_toml_textarea=Output(ids.cargo_toml_textarea, "value", allow_duplicate=True),
+ ),
+ dict(
+ clean=Input(ids.cargo_toml_clear, "n_clicks"),
+ ),
+ dict(),
+ prevent_initial_call=True,
+)
+def clean_cargo_toml(inputs, state):
+ return dict(cargo_toml_textarea="")
+
+
+@callback(
+ dict(
+ cargo_lock_textarea=Output(ids.cargo_lock_textarea, "value", allow_duplicate=True),
+ ),
+ dict(
+ clean=Input(ids.cargo_lock_clear, "n_clicks"),
+ ),
+ dict(),
+ prevent_initial_call=True,
+)
+def clean_cargo_lock(inputs, state):
+ return dict(cargo_lock_textarea="")
+
+
+@callback(
+ dict(
table_rows=Output(TableAIO.ids.ag_grid(ids.cargo_toml_table), "rowData"),
),
dict(
@@ -565,6 +610,7 @@ def display_cargo_lock_packages(inputs, state):
cargo_lock=State(ids.cargo_lock_textarea, "value"),
cache=State(ids.cache_store, "data"),
),
+ prevent_initial_call=True,
)
def visualize(inputs, state):
if (
@@ -588,10 +634,13 @@ def visualize(inputs, state):
selected = None
if clean:
- if not state["cargo_toml"] or not state["cargo_lock"]:
+ if not state["cargo_lock"]:
raise PreventUpdate
try:
cargo_toml = parse_cargo_toml(state["cargo_toml"])
+ except tomllib.TOMLDecodeError:
+ cargo_toml = None
+ try:
cargo_lock = parse_cargo_lock(state["cargo_lock"])
except tomllib.TOMLDecodeError as error:
raise PreventUpdate from error