From d6ed66db7dad05b5a2d9cd29e42b3d9f4ed84095 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Fri, 15 May 2026 17:18:50 +0800 Subject: [PATCH] 1 --- app/server.py | 15 ++++++++------- app/static/styles.css | 36 +++++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 12 deletions(-) diff --git a/app/server.py b/app/server.py index fdc0d38..9ccdd68 100644 --- a/app/server.py +++ b/app/server.py @@ -65,19 +65,20 @@ def parse_json_body(handler: BaseHTTPRequestHandler) -> dict[str, Any]: return value -def target_select_options( +def target_checkbox_options( targets: list[dict[str, Any]], selected_ids: list[int] | None = None, - placeholder: bool = False, ) -> str: selected_ids = selected_ids or [] - options = [''] if placeholder else [] + if not targets: + return '

还没有可用的飞书 Webhook,请先到飞书 Webhook 页面创建。

' + options = [] for target in targets: - selected = "selected" if target["id"] in selected_ids else "" + checked = "checked" if target["id"] in selected_ids else "" disabled = "" if target["enabled"] else "disabled" suffix = "" if target["enabled"] else " (停用)" options.append( - f'' + f'' ) return "".join(options) @@ -436,7 +437,7 @@ class Handler(BaseHTTPRequestHandler): "target_ids": [], "enabled": 1, } - selected_targets = target_select_options(targets, rule.get("target_ids", [])) + selected_targets = target_checkbox_options(targets, rule.get("target_ids", [])) hidden_id = f'' if rule.get("id") else "" button_text = "保存修改" if rule.get("id") else "创建规则" sample_payload = sample_payload or json.dumps( @@ -456,7 +457,7 @@ class Handler(BaseHTTPRequestHandler): - +
发送到
{selected_targets}

规则命中与卡片预览

diff --git a/app/static/styles.css b/app/static/styles.css index e9ccadf..93c7599 100644 --- a/app/static/styles.css +++ b/app/static/styles.css @@ -189,16 +189,42 @@ td textarea { } .field-target { - width: fit-content; max-width: 100%; } -.select-target { - width: clamp(220px, 34vw, 360px); +.field-label { + display: block; + color: var(--muted); + font: 600 13px ui-sans-serif, system-ui, sans-serif; + margin-bottom: 8px; } -.select-target.multi { - min-height: 138px; +.target-choices { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); + gap: 10px; + margin-bottom: 14px; +} + +.target-choice { + display: flex; + align-items: center; + gap: 9px; + margin: 0; + padding: 11px 12px; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; + color: var(--ink); +} + +.target-choice input { + width: auto; +} + +.target-choice:has(input:checked) { + border-color: var(--accent); + background: #eef8f5; } .check {