mirror of
https://github.com/ReCloudStudio/WebHooker.git
synced 2026-09-23 00:21:28 +00:00
chore: auto-fix lint & formatting [skip ci]
This commit is contained in:
parent
4edd468ace
commit
2e4cb24c1d
17 changed files with 386 additions and 120 deletions
|
|
@ -167,7 +167,11 @@ header {
|
|||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
transition: border-color 0.15s, background 0.15s, color 0.15s, transform 0.1s;
|
||||
transition:
|
||||
border-color 0.15s,
|
||||
background 0.15s,
|
||||
color 0.15s,
|
||||
transform 0.1s;
|
||||
}
|
||||
|
||||
.btn:hover {
|
||||
|
|
@ -279,7 +283,9 @@ main {
|
|||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
padding: 20px 22px;
|
||||
transition: border-color 0.15s, transform 0.15s;
|
||||
transition:
|
||||
border-color 0.15s,
|
||||
transform 0.15s;
|
||||
animation: rise 0.35s cubic-bezier(0.2, 0.7, 0.2, 1) both;
|
||||
}
|
||||
|
||||
|
|
@ -407,7 +413,9 @@ main {
|
|||
border: 1px solid var(--border-strong);
|
||||
border-radius: 999px;
|
||||
cursor: pointer;
|
||||
transition: background 0.18s, border-color 0.18s;
|
||||
transition:
|
||||
background 0.18s,
|
||||
border-color 0.18s;
|
||||
}
|
||||
|
||||
.switch .track::after {
|
||||
|
|
@ -620,7 +628,9 @@ main {
|
|||
color: var(--text);
|
||||
font-family: var(--ui);
|
||||
font-size: 13.5px;
|
||||
transition: border-color 0.15s, box-shadow 0.15s;
|
||||
transition:
|
||||
border-color 0.15s,
|
||||
box-shadow 0.15s;
|
||||
}
|
||||
|
||||
.field input[type="text"]:focus {
|
||||
|
|
@ -733,7 +743,9 @@ main {
|
|||
|
||||
.toast-enter-active,
|
||||
.toast-leave-active {
|
||||
transition: opacity 0.22s, transform 0.22s;
|
||||
transition:
|
||||
opacity 0.22s,
|
||||
transform 0.22s;
|
||||
}
|
||||
|
||||
.toast-enter-from,
|
||||
|
|
@ -782,7 +794,9 @@ main {
|
|||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: background 0.15s, color 0.15s;
|
||||
transition:
|
||||
background 0.15s,
|
||||
color 0.15s;
|
||||
}
|
||||
|
||||
.tab:hover {
|
||||
|
|
|
|||
|
|
@ -13,7 +13,12 @@
|
|||
<div class="row2">
|
||||
<div class="field">
|
||||
<label>{{ t("groupEditor.name") }}</label>
|
||||
<input v-model="form.name" type="text" :placeholder="t('groupEditor.namePlaceholder')" required />
|
||||
<input
|
||||
v-model="form.name"
|
||||
type="text"
|
||||
:placeholder="t('groupEditor.namePlaceholder')"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>{{ t("groupEditor.id") }}</label>
|
||||
|
|
@ -28,19 +33,35 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>{{ t("groupEditor.admins") }} <span class="lbl-note">{{ t("groupEditor.adminsNote") }}</span></label>
|
||||
<input v-model="form.adminIds" type="text" :placeholder="t('groupEditor.adminsPlaceholder')" />
|
||||
<label
|
||||
>{{ t("groupEditor.admins") }}
|
||||
<span class="lbl-note">{{ t("groupEditor.adminsNote") }}</span></label
|
||||
>
|
||||
<input
|
||||
v-model="form.adminIds"
|
||||
type="text"
|
||||
:placeholder="t('groupEditor.adminsPlaceholder')"
|
||||
/>
|
||||
<div class="hint">{{ t("groupEditor.adminsHint") }}</div>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>{{ t("groupEditor.owners") }} <span class="lbl-note">{{ t("groupEditor.ownersNote") }}</span></label>
|
||||
<input v-model="form.owners" type="text" :placeholder="t('groupEditor.ownersPlaceholder')" />
|
||||
<label
|
||||
>{{ t("groupEditor.owners") }}
|
||||
<span class="lbl-note">{{ t("groupEditor.ownersNote") }}</span></label
|
||||
>
|
||||
<input
|
||||
v-model="form.owners"
|
||||
type="text"
|
||||
:placeholder="t('groupEditor.ownersPlaceholder')"
|
||||
/>
|
||||
<div class="hint">{{ t("groupEditor.ownersHint") }}</div>
|
||||
</div>
|
||||
<div class="err">{{ formError }}</div>
|
||||
</form>
|
||||
<div class="editor-foot">
|
||||
<button class="btn btn-ghost" type="button" @click="close">{{ t("groupEditor.cancel") }}</button>
|
||||
<button class="btn btn-ghost" type="button" @click="close">
|
||||
{{ t("groupEditor.cancel") }}
|
||||
</button>
|
||||
<button class="btn btn-accent" type="button" :disabled="saving" @click="save">
|
||||
{{ t("groupEditor.save") }}
|
||||
</button>
|
||||
|
|
|
|||
|
|
@ -12,20 +12,38 @@
|
|||
<span v-if="route.fallback" class="badge fallback">{{ t("route.fallback") }}</span>
|
||||
</div>
|
||||
<div class="card-actions">
|
||||
<button class="icon-btn" :title="t('routeEditor.editTitle')" @click="$emit('edit', route)">✎</button>
|
||||
<button class="icon-btn danger" :title="t('routeEditor.close')" @click="$emit('delete', route)">✕</button>
|
||||
<button class="icon-btn" :title="t('routeEditor.editTitle')" @click="$emit('edit', route)">
|
||||
✎
|
||||
</button>
|
||||
<button
|
||||
class="icon-btn danger"
|
||||
:title="t('routeEditor.close')"
|
||||
@click="$emit('delete', route)"
|
||||
>
|
||||
✕
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="chips">
|
||||
<span v-for="(f, i) in route.filters" :key="i" class="chip" :class="{ exclude: f.exclude }">
|
||||
<span class="f-type">{{ f.exclude ? t("routeEditor.not") + " " : "" }}{{ t("filter." + f.type) }}</span>
|
||||
<span class="f-type"
|
||||
>{{ f.exclude ? t("routeEditor.not") + " " : "" }}{{ t("filter." + f.type) }}</span
|
||||
>
|
||||
<span class="f-val">{{ fmtMatch(f.match) }}</span>
|
||||
</span>
|
||||
<span v-if="!route.filters.length" class="chip"><span class="f-type">{{ t("route.noFilters") }}</span></span>
|
||||
<span v-if="!route.filters.length" class="chip"
|
||||
><span class="f-type">{{ t("route.noFilters") }}</span></span
|
||||
>
|
||||
</div>
|
||||
<div class="target">
|
||||
<span><b>{{ t("route.channel") }}</b><code>{{ route.target.channelId }}</code></span>
|
||||
<span v-if="route.target.threadId"><b>{{ t("route.thread") }}</b><code>{{ route.target.threadId }}</code></span>
|
||||
<span
|
||||
><b>{{ t("route.channel") }}</b
|
||||
><code>{{ route.target.channelId }}</code></span
|
||||
>
|
||||
<span v-if="route.target.threadId"
|
||||
><b>{{ t("route.thread") }}</b
|
||||
><code>{{ route.target.threadId }}</code></span
|
||||
>
|
||||
</div>
|
||||
</article>
|
||||
</template>
|
||||
|
|
|
|||
|
|
@ -12,7 +12,12 @@
|
|||
<form class="editor-body" @submit.prevent="save">
|
||||
<div class="field">
|
||||
<label>{{ t("routeEditor.name") }}</label>
|
||||
<input v-model="form.name" type="text" :placeholder="t('routeEditor.namePlaceholder')" required />
|
||||
<input
|
||||
v-model="form.name"
|
||||
type="text"
|
||||
:placeholder="t('routeEditor.namePlaceholder')"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div class="row2">
|
||||
<div class="field">
|
||||
|
|
@ -22,7 +27,11 @@
|
|||
</div>
|
||||
<div class="field">
|
||||
<label>{{ t("routeEditor.language") }}</label>
|
||||
<input v-model="form.lang" type="text" :placeholder="t('routeEditor.langPlaceholder')" />
|
||||
<input
|
||||
v-model="form.lang"
|
||||
type="text"
|
||||
:placeholder="t('routeEditor.langPlaceholder')"
|
||||
/>
|
||||
<div class="hint">{{ t("routeEditor.langHint") }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -32,38 +41,70 @@
|
|||
</div>
|
||||
<div class="field inline">
|
||||
<input v-model="form.fallback" type="checkbox" />
|
||||
<span>{{ t("routeEditor.fallback") }} <span class="lbl-note">{{ t("routeEditor.fallbackHint") }}</span></span>
|
||||
<span
|
||||
>{{ t("routeEditor.fallback") }}
|
||||
<span class="lbl-note">{{ t("routeEditor.fallbackHint") }}</span></span
|
||||
>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>{{ t("routeEditor.filters") }} <span class="lbl-note">{{ t("routeEditor.filtersNote") }}</span></label>
|
||||
<label
|
||||
>{{ t("routeEditor.filters") }}
|
||||
<span class="lbl-note">{{ t("routeEditor.filtersNote") }}</span></label
|
||||
>
|
||||
<div v-for="(f, i) in form.filters" :key="i" class="filter-row">
|
||||
<select v-model="f.type">
|
||||
<option v-for="ft in FILTER_TYPES" :key="ft" :value="ft">{{ t("filter." + ft) }}</option>
|
||||
<option v-for="ft in FILTER_TYPES" :key="ft" :value="ft">
|
||||
{{ t("filter." + ft) }}
|
||||
</option>
|
||||
</select>
|
||||
<input v-model="f.matchText" type="text" :placeholder="t('routeEditor.matchPlaceholder')" />
|
||||
<input
|
||||
v-model="f.matchText"
|
||||
type="text"
|
||||
:placeholder="t('routeEditor.matchPlaceholder')"
|
||||
/>
|
||||
<label class="inline">
|
||||
<input v-model="f.exclude" type="checkbox" /><span>{{ t("routeEditor.not") }}</span>
|
||||
</label>
|
||||
<button type="button" class="icon-btn danger" @click="form.filters.splice(i, 1)">✕</button>
|
||||
<button type="button" class="icon-btn danger" @click="form.filters.splice(i, 1)">
|
||||
✕
|
||||
</button>
|
||||
</div>
|
||||
<button type="button" class="btn btn-ghost add-filter" @click="addFilter">{{ t("routeEditor.addFilter") }}</button>
|
||||
<button type="button" class="btn btn-ghost add-filter" @click="addFilter">
|
||||
{{ t("routeEditor.addFilter") }}
|
||||
</button>
|
||||
<div class="err">{{ filterError }}</div>
|
||||
</div>
|
||||
<div class="row2">
|
||||
<div class="field">
|
||||
<label>{{ t("routeEditor.channel") }}</label>
|
||||
<input v-model="form.channelId" type="text" :placeholder="t('routeEditor.channelPlaceholder')" required />
|
||||
<input
|
||||
v-model="form.channelId"
|
||||
type="text"
|
||||
:placeholder="t('routeEditor.channelPlaceholder')"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>{{ t("routeEditor.thread") }} <span class="lbl-note">{{ t("routeEditor.threadNote") }}</span></label>
|
||||
<input v-model="form.threadId" type="text" :placeholder="t('routeEditor.threadPlaceholder')" />
|
||||
<label
|
||||
>{{ t("routeEditor.thread") }}
|
||||
<span class="lbl-note">{{ t("routeEditor.threadNote") }}</span></label
|
||||
>
|
||||
<input
|
||||
v-model="form.threadId"
|
||||
type="text"
|
||||
:placeholder="t('routeEditor.threadPlaceholder')"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="err">{{ formError }}</div>
|
||||
</form>
|
||||
<div class="editor-foot">
|
||||
<button class="btn btn-ghost" type="button" @click="close">{{ t("routeEditor.cancel") }}</button>
|
||||
<button class="btn btn-accent" type="button" :disabled="saving" @click="save">{{ t("routeEditor.save") }}</button>
|
||||
<button class="btn btn-ghost" type="button" @click="close">
|
||||
{{ t("routeEditor.cancel") }}
|
||||
</button>
|
||||
<button class="btn btn-accent" type="button" :disabled="saving" @click="save">
|
||||
{{ t("routeEditor.save") }}
|
||||
</button>
|
||||
</div>
|
||||
</aside>
|
||||
</Transition>
|
||||
|
|
@ -131,11 +172,12 @@ watch(
|
|||
form.fallback = r?.fallback ?? false;
|
||||
form.channelId = r?.target.channelId ?? "";
|
||||
form.threadId = r?.target.threadId ?? "";
|
||||
form.filters = (r && r.filters.length
|
||||
? r.filters
|
||||
: form.fallback
|
||||
? []
|
||||
: [{ type: "event", match: "", exclude: false }]
|
||||
form.filters = (
|
||||
r && r.filters.length
|
||||
? r.filters
|
||||
: form.fallback
|
||||
? []
|
||||
: [{ type: "event", match: "", exclude: false }]
|
||||
).map((f) => ({ ...f, matchText: fmtMatch(f.match) })) as FilterForm[];
|
||||
filterError.value = "";
|
||||
formError.value = "";
|
||||
|
|
|
|||
|
|
@ -2,7 +2,9 @@
|
|||
<div>
|
||||
<div class="log-toolbar">
|
||||
<span class="kpi-label">{{ t("logs.lastSends", { n: logs.length }) }}</span>
|
||||
<button class="btn btn-ghost btn-sm" :disabled="loading" @click="refresh">{{ t("logs.refresh") }}</button>
|
||||
<button class="btn btn-ghost btn-sm" :disabled="loading" @click="refresh">
|
||||
{{ t("logs.refresh") }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<p v-if="error" class="err">{{ error }}</p>
|
||||
|
|
@ -17,8 +19,14 @@
|
|||
<span class="log-time">{{ fmtTime(l.ts) }}</span>
|
||||
</div>
|
||||
<div class="log-meta">
|
||||
<span v-if="l.repo"><b>{{ t("logs.repo") }}</b><code>{{ l.repo }}</code></span>
|
||||
<span><b>{{ t("logs.target") }}</b><code>{{ l.target }}</code></span>
|
||||
<span v-if="l.repo"
|
||||
><b>{{ t("logs.repo") }}</b
|
||||
><code>{{ l.repo }}</code></span
|
||||
>
|
||||
<span
|
||||
><b>{{ t("logs.target") }}</b
|
||||
><code>{{ l.target }}</code></span
|
||||
>
|
||||
</div>
|
||||
<div v-if="!l.ok && l.error" class="log-error">{{ l.error }}</div>
|
||||
</article>
|
||||
|
|
|
|||
|
|
@ -192,7 +192,8 @@ const zh: Dict = {
|
|||
"groupEditor.owners": "来源限定",
|
||||
"groupEditor.ownersNote": "(GitHub 组织 / 用户登录名,逗号分隔)",
|
||||
"groupEditor.ownersPlaceholder": "my-org, some-user",
|
||||
"groupEditor.ownersHint": "只有来自这些组织/用户的 webhook 事件才会进入本分组的路由。留空表示不限制。",
|
||||
"groupEditor.ownersHint":
|
||||
"只有来自这些组织/用户的 webhook 事件才会进入本分组的路由。留空表示不限制。",
|
||||
"groupEditor.cancel": "取消",
|
||||
"groupEditor.save": "保存分组",
|
||||
"groupEditor.errIdFormat": "ID 只能是 a-z / 0-9 / 短横线",
|
||||
|
|
|
|||
|
|
@ -112,7 +112,11 @@
|
|||
<span class="route-id">{{ g.id }}</span>
|
||||
</div>
|
||||
<div v-if="isSuper" class="card-actions" @click.stop>
|
||||
<button class="icon-btn" :title="t('groupEditor.editTitle')" @click="openEditGroup(g)">
|
||||
<button
|
||||
class="icon-btn"
|
||||
:title="t('groupEditor.editTitle')"
|
||||
@click="openEditGroup(g)"
|
||||
>
|
||||
✎
|
||||
</button>
|
||||
<button class="icon-btn danger" @click="onDeleteGroup(g)">✕</button>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue