feat(admin): add stop toggle and badge to route editor UI

This commit is contained in:
RhenCloud 2026-08-08 00:54:13 +08:00
parent feada32e83
commit ab98c84896
5 changed files with 24 additions and 0 deletions

View file

@ -361,6 +361,12 @@ main {
border: 1px solid transparent; border: 1px solid transparent;
} }
.badge.stop {
background: var(--bad-dim);
color: var(--bad);
border: 1px solid transparent;
}
.card-actions { .card-actions {
display: flex; display: flex;
gap: 6px; gap: 6px;

View file

@ -17,6 +17,7 @@
>{{ tg.platform === "telegram" ? "Telegram" : "Discord" }}</span >{{ tg.platform === "telegram" ? "Telegram" : "Discord" }}</span
> >
<span v-if="route.fallback" class="badge fallback">{{ t("route.fallback") }}</span> <span v-if="route.fallback" class="badge fallback">{{ t("route.fallback") }}</span>
<span v-if="route.stop" class="badge stop">{{ t("route.stop") }}</span>
</div> </div>
<div class="card-actions"> <div class="card-actions">
<button <button

View file

@ -64,6 +64,13 @@
<span class="lbl-note">{{ t("routeEditor.fallbackHint") }}</span></span <span class="lbl-note">{{ t("routeEditor.fallbackHint") }}</span></span
> >
</div> </div>
<div class="field inline">
<input v-model="form.stop" type="checkbox" />
<span
>{{ t("routeEditor.stop") }}
<span class="lbl-note">{{ t("routeEditor.stopHint") }}</span></span
>
</div>
<div class="field"> <div class="field">
<label <label
>{{ t("routeEditor.filters") }} >{{ t("routeEditor.filters") }}
@ -195,6 +202,7 @@ const form = reactive({
lang: "", lang: "",
enabled: true, enabled: true,
fallback: false, fallback: false,
stop: false,
targets: [] as TargetForm[], targets: [] as TargetForm[],
filters: [] as FilterForm[], filters: [] as FilterForm[],
}); });
@ -245,6 +253,7 @@ watch(
form.lang = r?.lang ?? ""; form.lang = r?.lang ?? "";
form.enabled = r?.enabled ?? true; form.enabled = r?.enabled ?? true;
form.fallback = r?.fallback ?? false; form.fallback = r?.fallback ?? false;
form.stop = r?.stop ?? false;
form.targets = form.targets =
r && r.targets.length r && r.targets.length
? r.targets.map((tg) => ({ ...blankTarget(), ...tg })) ? r.targets.map((tg) => ({ ...blankTarget(), ...tg }))
@ -311,6 +320,7 @@ function collect(): Route | null {
name: form.name.trim(), name: form.name.trim(),
enabled: form.enabled, enabled: form.enabled,
fallback: form.fallback || undefined, fallback: form.fallback || undefined,
stop: form.stop || undefined,
lang: form.lang.trim() || undefined, lang: form.lang.trim() || undefined,
filters, filters,
targets, targets,

View file

@ -37,6 +37,7 @@ const en: Dict = {
"route.chat": "CHAT", "route.chat": "CHAT",
"route.topic": "TOPIC", "route.topic": "TOPIC",
"route.fallback": "fallback", "route.fallback": "fallback",
"route.stop": "stop",
"route.moveUp": "Move up", "route.moveUp": "Move up",
"route.moveDown": "Move down", "route.moveDown": "Move down",
"filter.event": "Event", "filter.event": "Event",
@ -73,6 +74,8 @@ const en: Dict = {
"routeEditor.enabled": "Route enabled", "routeEditor.enabled": "Route enabled",
"routeEditor.fallback": "Fallback route", "routeEditor.fallback": "Fallback route",
"routeEditor.fallbackHint": "Only fires when no other route matched; filters still apply", "routeEditor.fallbackHint": "Only fires when no other route matched; filters still apply",
"routeEditor.stop": "Stop on match",
"routeEditor.stopHint": "When matched, no further routes are evaluated for this event",
"routeEditor.filters": "Filters", "routeEditor.filters": "Filters",
"routeEditor.filtersNote": "(all must match · AND)", "routeEditor.filtersNote": "(all must match · AND)",
"routeEditor.matchPlaceholder": "match value", "routeEditor.matchPlaceholder": "match value",
@ -194,6 +197,7 @@ const zh: Dict = {
"route.chat": "群组", "route.chat": "群组",
"route.topic": "话题", "route.topic": "话题",
"route.fallback": "兜底", "route.fallback": "兜底",
"route.stop": "停止",
"route.moveUp": "上移", "route.moveUp": "上移",
"route.moveDown": "下移", "route.moveDown": "下移",
"filter.event": "事件", "filter.event": "事件",
@ -230,6 +234,8 @@ const zh: Dict = {
"routeEditor.enabled": "启用路由", "routeEditor.enabled": "启用路由",
"routeEditor.fallback": "兜底路由", "routeEditor.fallback": "兜底路由",
"routeEditor.fallbackHint": "仅当没有其它路由匹配该事件时才发送,其过滤器仍会生效", "routeEditor.fallbackHint": "仅当没有其它路由匹配该事件时才发送,其过滤器仍会生效",
"routeEditor.stop": "匹配后停止",
"routeEditor.stopHint": "该路由匹配后,不再评估后续路由",
"routeEditor.filters": "过滤器", "routeEditor.filters": "过滤器",
"routeEditor.filtersNote": "(全部匹配 · AND", "routeEditor.filtersNote": "(全部匹配 · AND",
"routeEditor.matchPlaceholder": "匹配值", "routeEditor.matchPlaceholder": "匹配值",

View file

@ -21,6 +21,7 @@ export interface Route {
lang?: string; lang?: string;
groupId?: string; groupId?: string;
fallback?: boolean; fallback?: boolean;
stop?: boolean;
} }
export interface Group { export interface Group {