fix(servers): 状态/心跳/Agent 列 overlay 后排序
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
# 审计 — 服务器列表实时字段排序
|
||||
|
||||
**Changelog**: `docs/changelog/2026-06-08-servers-live-sort-fix.md`
|
||||
|
||||
## 变更文件
|
||||
|
||||
`server_list_sort.py` · `server_repo.py` · `servers.py` · `ServersPage.vue` · `useServerPagination.ts` · `DashboardPage.vue` · `tests/test_server_list_sort.py` · `web/app/index.html` · `web/app/assets/*`
|
||||
|
||||
## Step 3
|
||||
|
||||
| 项 | 结论 |
|
||||
|----|------|
|
||||
| sort_by 白名单 | PASS(live 字段独立模块) |
|
||||
| Redis pipeline | PASS |
|
||||
| 上限 5000 | PASS |
|
||||
|
||||
## Closure
|
||||
|
||||
Gate 7/7 PASS · 生产部署后更新 commit hash。
|
||||
|
||||
## DoD
|
||||
|
||||
- [x] 实时三列 overlay 后排序
|
||||
- [x] 分类视图组内顺序
|
||||
- [x] 单测
|
||||
@@ -0,0 +1,28 @@
|
||||
# Changelog — 服务器列表实时字段排序修复(2026-06-08)
|
||||
|
||||
## 摘要
|
||||
|
||||
状态 / 心跳 / Agent 列在 Redis overlay 后内存排序;分类视图组内顺序跟随 API。
|
||||
|
||||
## 动机
|
||||
|
||||
DB `ORDER BY` 先于 Redis 覆盖,展示值与排序键不一致,用户点列头排序无感。
|
||||
|
||||
## 涉及文件
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `server/application/services/server_list_sort.py` | overlay 后排序 |
|
||||
| `server/infrastructure/database/server_repo.py` | `get_filtered()` |
|
||||
| `server/api/servers.py` | live sort 分支 + pipeline overlay |
|
||||
| `frontend/src/pages/ServersPage.vue` | 分组视图保留 API 顺序 |
|
||||
| `frontend/src/composables/useServerPagination.ts` | `watch(sortBy)` 触发加载 |
|
||||
| `tests/test_server_list_sort.py` | 单测 |
|
||||
|
||||
## 迁移 / 重启
|
||||
|
||||
需重启 API;前端需 build。
|
||||
|
||||
## 验证
|
||||
|
||||
`pytest tests/test_server_list_sort.py` · `#/servers` 心跳/状态/Agent 列排序
|
||||
@@ -0,0 +1,36 @@
|
||||
# 服务器列表实时字段排序设计
|
||||
|
||||
**日期**: 2026-06-08
|
||||
|
||||
## 背景
|
||||
|
||||
`GET /api/servers/` 在 MySQL 层 `ORDER BY` 后分页,再用 Redis heartbeat 覆盖 `is_online`、`last_heartbeat`、`agent_version`、`status`。展示值与排序键不一致,导致状态/心跳/Agent 列排序无效。
|
||||
|
||||
## 目标
|
||||
|
||||
对 `sort_by ∈ {status, heartbeat, agent_version}`:overlay 全量筛选结果后内存排序,再分页返回。
|
||||
|
||||
## 方案
|
||||
|
||||
1. `server_repo.get_filtered()` 拉取筛选后全量(上限 5000)
|
||||
2. Redis pipeline 批量 `HGETALL heartbeat:{id}`
|
||||
3. `server_list_sort.sort_server_items()` 按 UI 语义排序
|
||||
4. `slice[offset:offset+per_page]`
|
||||
|
||||
静态列(name/domain/category/target_path/id)仍 DB 排序。
|
||||
|
||||
## 排序语义
|
||||
|
||||
| 字段 | 键 |
|
||||
|------|-----|
|
||||
| status | online(0) → offline(1) → unknown(2),tiebreaker name |
|
||||
| heartbeat | ISO 时间;缺失置后(升序/降序均置后) |
|
||||
| agent_version | 字符串;空置后 |
|
||||
|
||||
## 性能
|
||||
|
||||
≤5000 台 × 一次 pipeline + 内存 sort;运维列表低频可接受。
|
||||
|
||||
## 验收
|
||||
|
||||
见 `docs/changelog/2026-06-08-servers-live-sort-fix.md`
|
||||
@@ -4,7 +4,7 @@
|
||||
* Paginated server table with search debounce, page/perPage handlers.
|
||||
* Eliminates the identical pattern in ServersPage and DashboardPage.
|
||||
*/
|
||||
import { ref, onUnmounted } from 'vue'
|
||||
import { ref, watch, onUnmounted } from 'vue'
|
||||
import type { ServerApiItem } from '@/types/api'
|
||||
import { fetchPagePerPage } from '@/utils/paginatedFetch'
|
||||
import { toServerApiSort, type TableSortItem } from '@/utils/serverTableSort'
|
||||
@@ -71,11 +71,14 @@ export function useServerPagination() {
|
||||
loadServers()
|
||||
}
|
||||
|
||||
function onSortByChange(next: TableSortItem[]) {
|
||||
sortBy.value = next
|
||||
page.value = 1
|
||||
loadServers()
|
||||
}
|
||||
watch(
|
||||
sortBy,
|
||||
() => {
|
||||
page.value = 1
|
||||
void loadServers()
|
||||
},
|
||||
{ deep: true },
|
||||
)
|
||||
|
||||
async function loadAllServers(): Promise<ServerApiItem[]> {
|
||||
const res = await fetchPagePerPage<ServerApiItem>(
|
||||
@@ -93,7 +96,7 @@ export function useServerPagination() {
|
||||
|
||||
return {
|
||||
servers, loading, page, itemsPerPage, total, search, categoryFilter, sortBy,
|
||||
loadServers, onSearch, onPageChange, onItemsPerPageChange, onCategoryChange, onSortByChange,
|
||||
loadServers, onSearch, onPageChange, onItemsPerPageChange, onCategoryChange,
|
||||
loadAllServers,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@
|
||||
:items-per-page="itemsPerPage"
|
||||
:items-per-page-options="dataTablePageOptions"
|
||||
v-model:sort-by="sortBy"
|
||||
@update:sort-by="onSortByChange"
|
||||
hover
|
||||
item-value="id"
|
||||
@update:page="onPageChange"
|
||||
@@ -264,7 +263,7 @@ const statItems = ref([
|
||||
// ── Server Table (composable) ──
|
||||
const {
|
||||
servers, loading, page, itemsPerPage, total, search, sortBy,
|
||||
loadServers: _loadServers, onSearch, onPageChange, onItemsPerPageChange, onSortByChange,
|
||||
loadServers: _loadServers, onSearch, onPageChange, onItemsPerPageChange,
|
||||
} = useServerPagination()
|
||||
|
||||
async function loadServers() {
|
||||
|
||||
@@ -115,7 +115,6 @@
|
||||
show-select
|
||||
v-model="selectedItems"
|
||||
v-model:sort-by="sortBy"
|
||||
@update:sort-by="onSortByChange"
|
||||
@update:page="onPageChange"
|
||||
@update:items-per-page="onItemsPerPageChange"
|
||||
@click:row="(_e: Event, { item }: { item: ServerApiItem }) => showDetail(item)"
|
||||
@@ -630,7 +629,7 @@ const router = useRouter()
|
||||
// ── Paginated server list (composable) ──
|
||||
const {
|
||||
servers, loading, page, itemsPerPage, total, search, categoryFilter, sortBy,
|
||||
loadServers: _load, onSearch, onPageChange, onItemsPerPageChange, onCategoryChange, onSortByChange,
|
||||
loadServers: _load, onSearch, onPageChange, onItemsPerPageChange, onCategoryChange,
|
||||
loadAllServers,
|
||||
} = useServerPagination()
|
||||
|
||||
@@ -694,7 +693,7 @@ const groupedServers = computed(() => {
|
||||
.map(([category, list]) => ({
|
||||
category,
|
||||
label: categoryDisplayLabel(category),
|
||||
servers: list.sort((a, b) => a.name.localeCompare(b.name, 'zh')),
|
||||
servers: list,
|
||||
}))
|
||||
.sort((a, b) => {
|
||||
if (a.category === 'uncategorized') return 1
|
||||
@@ -748,7 +747,10 @@ function toggleGroupAll(groupServers: ServerApiItem[]) {
|
||||
}
|
||||
|
||||
watch(categoryFilter, () => { selectedItems.value = [] })
|
||||
watch(sortBy, () => { selectedItems.value = [] }, { deep: true })
|
||||
watch(sortBy, () => {
|
||||
selectedItems.value = []
|
||||
if (viewMode.value === 'group') void loadGroupServers()
|
||||
}, { deep: true })
|
||||
watch(search, () => { selectedItems.value = [] })
|
||||
|
||||
watch(viewMode, mode => {
|
||||
|
||||
+68
-33
@@ -148,49 +148,62 @@ async def list_servers(
|
||||
service: ServerService = Depends(get_server_service),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
):
|
||||
"""List servers with live status from Redis (DB-level pagination)
|
||||
"""List servers with live status from Redis.
|
||||
|
||||
Base info (name/IP/category) from MySQL with DB-level pagination,
|
||||
real-time status from Redis. If Redis heartbeat key exists,
|
||||
override is_online/system_info/last_heartbeat.
|
||||
|
||||
Supports: text search, multi-column sorting, online status filter.
|
||||
When is_online filter is active, over-fetches from DB then post-filters
|
||||
after Redis overlay to ensure accurate results.
|
||||
Static columns sort in MySQL; status/heartbeat/agent_version sort after
|
||||
Redis overlay so order matches displayed values.
|
||||
"""
|
||||
from server.application.services.server_list_sort import (
|
||||
LIVE_SORT_FIELDS,
|
||||
MAX_LIVE_SORT_ROWS,
|
||||
sort_server_items,
|
||||
)
|
||||
from server.infrastructure.database.server_repo import ServerRepositoryImpl
|
||||
|
||||
offset = (page - 1) * per_page
|
||||
repo = ServerRepositoryImpl(db)
|
||||
page_servers, total = await repo.get_paginated(
|
||||
category, platform_id, node_id, offset, per_page,
|
||||
search=search, sort_by=sort_by, sort_order=sort_order, is_online=is_online,
|
||||
)
|
||||
redis = get_redis()
|
||||
order = sort_order if sort_order in ("asc", "desc") else "asc"
|
||||
|
||||
result = []
|
||||
for server in page_servers:
|
||||
server_data = _server_to_dict(server)
|
||||
|
||||
try:
|
||||
heartbeat = await redis.hgetall(f"{REDIS_KEY_PREFIX}{server.id}")
|
||||
_apply_heartbeat_overlay(server_data, server, heartbeat or None)
|
||||
except Exception as e:
|
||||
logger.warning(f"Redis read failed for server {server.id}: {e}")
|
||||
server_data["status"] = _derive_server_status(
|
||||
server_data.get("is_online"), server.agent_version
|
||||
if sort_by in LIVE_SORT_FIELDS:
|
||||
db_online_filter = None if is_online is not None else is_online
|
||||
all_servers, db_total = await repo.get_filtered(
|
||||
category,
|
||||
platform_id,
|
||||
node_id,
|
||||
search=search,
|
||||
is_online=db_online_filter,
|
||||
max_rows=MAX_LIVE_SORT_ROWS,
|
||||
)
|
||||
if db_total > MAX_LIVE_SORT_ROWS:
|
||||
logger.warning(
|
||||
"Live sort capped at %s servers (total matching=%s)",
|
||||
MAX_LIVE_SORT_ROWS,
|
||||
db_total,
|
||||
)
|
||||
|
||||
result.append(server_data)
|
||||
|
||||
# Post-filter: when is_online filter is active, Redis overlay may have
|
||||
# changed a server's status vs what MySQL reported. Remove mismatches.
|
||||
if is_online is not None:
|
||||
result = [s for s in result if s.get("is_online") == is_online]
|
||||
# Recalculate total/pages to reflect actual filtered count
|
||||
result = await _build_server_list_with_overlay(redis, all_servers)
|
||||
if is_online is not None:
|
||||
result = [s for s in result if s.get("is_online") == is_online]
|
||||
total = len(result)
|
||||
# Trim to per_page (we over-fetched from DB to compensate)
|
||||
result = result[:per_page]
|
||||
result = sort_server_items(result, sort_by, order)
|
||||
result = result[offset : offset + per_page]
|
||||
else:
|
||||
page_servers, total = await repo.get_paginated(
|
||||
category,
|
||||
platform_id,
|
||||
node_id,
|
||||
offset,
|
||||
per_page,
|
||||
search=search,
|
||||
sort_by=sort_by,
|
||||
sort_order=order,
|
||||
is_online=is_online,
|
||||
)
|
||||
result = await _build_server_list_with_overlay(redis, page_servers)
|
||||
if is_online is not None:
|
||||
result = [s for s in result if s.get("is_online") == is_online]
|
||||
total = len(result)
|
||||
result = result[:per_page]
|
||||
|
||||
return {
|
||||
"items": result,
|
||||
@@ -2137,6 +2150,28 @@ async def get_server_logs(
|
||||
|
||||
# ── Helper functions ──
|
||||
|
||||
async def _build_server_list_with_overlay(redis, servers: list) -> list[dict]:
|
||||
"""Batch Redis heartbeat overlay for server list rows."""
|
||||
if not servers:
|
||||
return []
|
||||
pipe = redis.pipeline()
|
||||
for server in servers:
|
||||
pipe.hgetall(f"{REDIS_KEY_PREFIX}{server.id}")
|
||||
heartbeats = await pipe.execute()
|
||||
result: list[dict] = []
|
||||
for server, heartbeat in zip(servers, heartbeats):
|
||||
server_data = _server_to_dict(server)
|
||||
try:
|
||||
_apply_heartbeat_overlay(server_data, server, heartbeat or None)
|
||||
except Exception as e:
|
||||
logger.warning(f"Redis read failed for server {server.id}: {e}")
|
||||
server_data["status"] = _derive_server_status(
|
||||
server_data.get("is_online"), server.agent_version
|
||||
)
|
||||
result.append(server_data)
|
||||
return result
|
||||
|
||||
|
||||
def _derive_server_status(is_online: bool | None, agent_version: str | None) -> str:
|
||||
"""Map live/DB fields to frontend status: online | offline | unknown."""
|
||||
has_agent = bool(agent_version and str(agent_version).strip())
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
"""In-memory sort for server list items after Redis heartbeat overlay."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime, timezone
|
||||
from typing import Any, Callable
|
||||
|
||||
LIVE_SORT_FIELDS = frozenset({"status", "heartbeat", "agent_version"})
|
||||
MAX_LIVE_SORT_ROWS = 5000
|
||||
|
||||
_STATUS_ORDER = {"online": 0, "offline": 1, "unknown": 2}
|
||||
|
||||
|
||||
def _parse_heartbeat(raw: Any) -> datetime | None:
|
||||
if not raw:
|
||||
return None
|
||||
text = str(raw).strip()
|
||||
if not text:
|
||||
return None
|
||||
try:
|
||||
if text.endswith("Z"):
|
||||
text = f"{text[:-1]}+00:00"
|
||||
dt = datetime.fromisoformat(text)
|
||||
if dt.tzinfo is None:
|
||||
dt = dt.replace(tzinfo=timezone.utc)
|
||||
return dt
|
||||
except (TypeError, ValueError):
|
||||
return None
|
||||
|
||||
|
||||
def _status_key(item: dict[str, Any]) -> tuple[int, str]:
|
||||
status = item.get("status") or "unknown"
|
||||
rank = _STATUS_ORDER.get(status, 3)
|
||||
return rank, (item.get("name") or "").casefold()
|
||||
|
||||
|
||||
def _heartbeat_key(item: dict[str, Any]) -> datetime | None:
|
||||
return _parse_heartbeat(item.get("last_heartbeat"))
|
||||
|
||||
|
||||
def _agent_version_key(item: dict[str, Any]) -> str | None:
|
||||
ver = (item.get("agent_version") or "").strip()
|
||||
return ver or None
|
||||
|
||||
|
||||
def _sort_with_nulls_last(
|
||||
items: list[dict[str, Any]],
|
||||
key_func: Callable[[dict[str, Any]], Any],
|
||||
*,
|
||||
reverse: bool,
|
||||
) -> list[dict[str, Any]]:
|
||||
with_value: list[dict[str, Any]] = []
|
||||
without_value: list[dict[str, Any]] = []
|
||||
for item in items:
|
||||
if key_func(item) is None:
|
||||
without_value.append(item)
|
||||
else:
|
||||
with_value.append(item)
|
||||
with_value.sort(key=key_func, reverse=reverse)
|
||||
return with_value + without_value
|
||||
|
||||
|
||||
def sort_server_items(
|
||||
items: list[dict[str, Any]],
|
||||
sort_by: str,
|
||||
sort_order: str = "asc",
|
||||
) -> list[dict[str, Any]]:
|
||||
"""Sort server dicts using live overlay fields (post-Redis)."""
|
||||
reverse = sort_order == "desc"
|
||||
if sort_by == "status":
|
||||
return sorted(items, key=_status_key, reverse=reverse)
|
||||
if sort_by == "heartbeat":
|
||||
return _sort_with_nulls_last(items, _heartbeat_key, reverse=reverse)
|
||||
if sort_by == "agent_version":
|
||||
return _sort_with_nulls_last(items, _agent_version_key, reverse=reverse)
|
||||
return items
|
||||
@@ -111,6 +111,43 @@ class ServerRepositoryImpl:
|
||||
|
||||
return servers, total
|
||||
|
||||
async def get_filtered(
|
||||
self,
|
||||
category: Optional[str] = None,
|
||||
platform_id: Optional[int] = None,
|
||||
node_id: Optional[int] = None,
|
||||
search: Optional[str] = None,
|
||||
is_online: Optional[bool] = None,
|
||||
max_rows: int = 5000,
|
||||
) -> Tuple[List[Server], int]:
|
||||
"""All servers matching filters (no sort/pagination), capped at *max_rows*."""
|
||||
filters = []
|
||||
if category:
|
||||
filters.append(_category_filter(category))
|
||||
if platform_id:
|
||||
filters.append(Server.platform_id == platform_id)
|
||||
if node_id:
|
||||
filters.append(Server.node_id == node_id)
|
||||
if search:
|
||||
term = f"%{search}%"
|
||||
filters.append(Server.name.ilike(term) | Server.domain.ilike(term))
|
||||
if is_online is not None:
|
||||
filters.append(Server.is_online == is_online)
|
||||
|
||||
count_query = select(func.count(Server.id))
|
||||
for f in filters:
|
||||
count_query = count_query.where(f)
|
||||
count_result = await self.session.execute(count_query)
|
||||
total = count_result.scalar_one() or 0
|
||||
|
||||
data_query = select(Server)
|
||||
for f in filters:
|
||||
data_query = data_query.where(f)
|
||||
data_query = data_query.order_by(Server.id).limit(max_rows)
|
||||
result = await self.session.execute(data_query)
|
||||
servers = list(result.scalars().all())
|
||||
return servers, total
|
||||
|
||||
async def get_by_category(self, category: str) -> List[Server]:
|
||||
result = await self.session.execute(
|
||||
select(Server).where(Server.category == category).order_by(Server.id)
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
"""Server list in-memory sort after Redis overlay."""
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from server.application.services.server_list_sort import sort_server_items
|
||||
|
||||
|
||||
def _item(
|
||||
*,
|
||||
name: str = "srv",
|
||||
status: str = "unknown",
|
||||
last_heartbeat: str | None = None,
|
||||
agent_version: str | None = None,
|
||||
) -> dict:
|
||||
return {
|
||||
"name": name,
|
||||
"status": status,
|
||||
"last_heartbeat": last_heartbeat,
|
||||
"agent_version": agent_version,
|
||||
}
|
||||
|
||||
|
||||
def test_status_sort_asc():
|
||||
items = [
|
||||
_item(name="c", status="unknown"),
|
||||
_item(name="a", status="online"),
|
||||
_item(name="b", status="offline"),
|
||||
]
|
||||
sorted_items = sort_server_items(items, "status", "asc")
|
||||
assert [i["status"] for i in sorted_items] == ["online", "offline", "unknown"]
|
||||
|
||||
|
||||
def test_status_sort_desc():
|
||||
items = [
|
||||
_item(name="a", status="online"),
|
||||
_item(name="b", status="offline"),
|
||||
_item(name="c", status="unknown"),
|
||||
]
|
||||
sorted_items = sort_server_items(items, "status", "desc")
|
||||
assert [i["status"] for i in sorted_items] == ["unknown", "offline", "online"]
|
||||
|
||||
|
||||
def test_heartbeat_sort_uses_overlay_not_db_order():
|
||||
old = _item(name="old", last_heartbeat="2026-01-01T00:00:00+00:00")
|
||||
new = _item(name="new", last_heartbeat="2026-06-08T12:00:00+00:00")
|
||||
items = [old, new]
|
||||
sorted_items = sort_server_items(items, "heartbeat", "desc")
|
||||
assert sorted_items[0]["name"] == "new"
|
||||
assert sorted_items[1]["name"] == "old"
|
||||
|
||||
|
||||
def test_heartbeat_nulls_last_asc_and_desc():
|
||||
items = [
|
||||
_item(name="with", last_heartbeat="2026-06-01T00:00:00+00:00"),
|
||||
_item(name="empty", last_heartbeat=None),
|
||||
]
|
||||
asc = sort_server_items(items, "heartbeat", "asc")
|
||||
assert asc[0]["name"] == "with"
|
||||
assert asc[-1]["name"] == "empty"
|
||||
desc = sort_server_items(items, "heartbeat", "desc")
|
||||
assert desc[0]["name"] == "with"
|
||||
assert desc[-1]["name"] == "empty"
|
||||
|
||||
|
||||
def test_agent_version_empty_last():
|
||||
items = [
|
||||
_item(name="b", agent_version="2.1.0"),
|
||||
_item(name="a", agent_version=""),
|
||||
_item(name="c", agent_version="1.0.0"),
|
||||
]
|
||||
asc = sort_server_items(items, "agent_version", "asc")
|
||||
assert asc[0]["name"] == "c"
|
||||
assert asc[1]["name"] == "b"
|
||||
assert asc[-1]["name"] == "a"
|
||||
|
||||
|
||||
def test_heartbeat_parse_z_suffix():
|
||||
ts = datetime(2026, 6, 8, 12, 0, tzinfo=timezone.utc).isoformat().replace("+00:00", "Z")
|
||||
items = [
|
||||
_item(name="early", last_heartbeat="2026-01-01T00:00:00+00:00"),
|
||||
_item(name="late", last_heartbeat=ts),
|
||||
]
|
||||
sorted_items = sort_server_items(items, "heartbeat", "desc")
|
||||
assert sorted_items[0]["name"] == "late"
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as e,t,v as n}from"./VSelect-Dy1HeCdk.js";import{n as r,t as i}from"./VRow-CamZ4OJs.js";import{$r as a,A as o,B as s,Dr as c,F as l,Ir as u,N as d,R as f,T as p,Tr as m,Ur as h,Yr as g,Zt as _,_r as v,dr as y,gr as b,hr as x,j as S,kr as C,pr as w,sr as T,ur as E,ut as D}from"./index-C6qJAv49.js";import{n as O}from"./dataTable-esDY4cOk.js";import{t as k}from"./VDataTableServer-Dh4BHVrk.js";var A={class:`font-weight-medium`},j={class:`text-body-2`},M={class:`text-caption text-medium-emphasis`},N=v({__name:`AlertsPage`,setup(v){let N=e(),P=h(!1),F=h([]),I=h(0),L=h(1),R=h(null),z=h(null),B=h([{label:`今日告警`,value:`0`,color:`blue`,icon:`mdi-alert`},{label:`活跃告警`,value:`0`,color:`orange`,icon:`mdi-bell-ring`},{label:`已恢复`,value:`0`,color:`green`,icon:`mdi-check-circle`},{label:`Top 服务器`,value:`—`,color:`red`,icon:`mdi-server`}]),V=[{label:`CPU`,value:`cpu`},{label:`内存`,value:`memory`},{label:`磁盘`,value:`disk`},{label:`连接`,value:`connection`}],H=[{label:`活跃`,value:`active`},{label:`已恢复`,value:`recovered`}],U=O([{title:`类型`,key:`alert_type`,width:100},{title:`服务器`,key:`server_name`},{title:`详情`,key:`value`},{title:`状态`,key:`is_recovery`,width:100},{title:`时间`,key:`created_at`,width:160}]);async function W(){try{let e=await _.get(`/alert-history/stats`);B.value[0].value=String(e.today||0),B.value[1].value=String(e.active||0),B.value[2].value=String(e.recovered||0),B.value[3].value=e.top_server||`—`}catch{N(`加载统计失败`,`error`)}}async function G(){P.value=!0;try{let e=await _.get(`/alert-history/`,{page:L.value,per_page:20,type:R.value||void 0,status:z.value||void 0});F.value=e.items||[],I.value=e.total||0}catch{F.value=[]}finally{P.value=!1}}function K(e){return e===`cpu`||e===`CPU`?`error`:e===`memory`||e===`内存`?`warning`:e===`disk`||e===`磁盘`?`info`:`primary`}function q(e){return e===`cpu`||e===`CPU`?`mdi-chip`:e===`memory`||e===`内存`?`mdi-memory`:e===`disk`||e===`磁盘`?`mdi-harddisk`:`mdi-lan-disconnect`}return m(()=>{W(),G()}),(e,m)=>(c(),y(n,{fluid:``,class:`pa-6`},{default:u(()=>[b(i,{class:`mb-4`},{default:u(()=>[(c(!0),w(T,null,C(B.value,e=>(c(),y(r,{cols:`12`,sm:`6`,lg:`3`,key:e.label},{default:u(()=>[b(p,{elevation:`0`,lines:`two`,rounded:`lg`,border:``},{default:u(()=>[b(o,null,{append:u(()=>[b(D,{color:e.color,size:`30`},{default:u(()=>[x(a(e.icon),1)]),_:2},1032,[`color`])]),default:u(()=>[b(S,{class:`text-body-small`},{default:u(()=>[x(a(e.label),1)]),_:2},1024),b(S,null,{default:u(()=>[x(a(e.value),1)]),_:2},1024)]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1}),b(f,{elevation:`0`,border:``,rounded:`lg`},{default:u(()=>[b(s,{class:`d-flex align-center`},{default:u(()=>[m[5]||=x(` 告警历史 `,-1),b(d),b(t,{modelValue:R.value,"onUpdate:modelValue":[m[0]||=e=>R.value=e,m[1]||=e=>{L.value=1,G()}],items:V,"item-title":`label`,"item-value":`value`,label:`类型`,variant:`outlined`,density:`compact`,"hide-details":``,style:{"max-width":`140px`},clearable:``},null,8,[`modelValue`]),b(t,{modelValue:z.value,"onUpdate:modelValue":[m[2]||=e=>z.value=e,m[3]||=e=>{L.value=1,G()}],items:H,"item-title":`label`,"item-value":`value`,label:`状态`,variant:`outlined`,density:`compact`,"hide-details":``,style:{"max-width":`140px`},class:`ml-3`,clearable:``},null,8,[`modelValue`])]),_:1}),b(k,{items:F.value,headers:g(U),"items-length":I.value,loading:P.value,page:L.value,"items-per-page":20,hover:``,density:`comfortable`,"onUpdate:page":m[4]||=e=>{L.value=e,G()}},{"item.alert_type":u(({item:e})=>[b(l,{color:K(e.alert_type),size:`small`,variant:`tonal`,label:``},{prepend:u(()=>[b(D,{size:`12`},{default:u(()=>[x(a(q(e.alert_type)),1)]),_:2},1024)]),default:u(()=>[x(` `+a(e.alert_type),1)]),_:2},1032,[`color`])]),"item.server_name":u(({item:e})=>[E(`span`,A,a(e.server_name),1)]),"item.value":u(({item:e})=>[E(`span`,j,a(e.value),1)]),"item.is_recovery":u(({item:e})=>[e.is_recovery?(c(),y(l,{key:0,color:`success`,size:`small`,variant:`tonal`,label:``},{default:u(()=>[...m[6]||=[x(`已恢复`,-1)]]),_:1})):(c(),y(l,{key:1,color:`error`,size:`small`,variant:`tonal`,label:``},{default:u(()=>[...m[7]||=[x(`告警中`,-1)]]),_:1}))]),"item.created_at":u(({item:e})=>[E(`span`,M,a(e.created_at),1)]),"no-data":u(()=>[...m[8]||=[E(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无数据`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`])]),_:1})]),_:1}))}});export{N as default};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as e,t,v as n}from"./VSelect-Dy1HeCdk.js";import{$r as r,B as i,Dr as a,F as o,Ir as s,N as c,R as l,Tr as u,Ur as d,Yr as f,Zt as p,_r as m,dr as h,gr as g,hr as _,t as v,ur as y}from"./index-C6qJAv49.js";import{n as b}from"./dataTable-esDY4cOk.js";import{t as x}from"./VDataTableServer-Dh4BHVrk.js";import{a as S,n as C,r as w,t as T}from"./auditNormalize-bmSA0RyN.js";var E={class:`font-weight-medium`},D={class:`text-body-2`},O={class:`text-body-2 text-medium-emphasis text-truncate`,style:{"max-width":`300px`,display:`inline-block`}},k={class:`text-caption text-medium-emphasis`},A={class:`text-caption text-medium-emphasis`},j=m({__name:`AuditPage`,setup(m){let j=e(),M=d(!1),N=d([]),P=d(0),F=d(1),I=d(null),L=d(``),R=d(``),z=C,B=b([{title:`操作`,key:`action`,width:100},{title:`用户`,key:`admin_username`,width:100},{title:`目标`,key:`target`,width:140},{title:`详情`,key:`detail`},{title:`IP`,key:`ip_address`,width:120},{title:`时间`,key:`created_at`,width:160}]);async function V(){M.value=!0;try{let e=(F.value-1)*50,t=await p.get(`/audit/`,{limit:50,offset:e,action:I.value||void 0,admin_username:L.value||void 0,date_from:R.value||void 0});N.value=T(t.items||[]),P.value=t.total||0}catch{N.value=[],j(`加载审计日志失败`,`error`)}finally{M.value=!1}}function H(e){return e.startsWith(`create`)||e===`login`?`success`:e.startsWith(`update`)?`info`:e.startsWith(`delete`)||e===`logout`?`error`:e.includes(`execute`)||e.includes(`push`)||e.includes(`retry`)?`warning`:`primary`}return u(()=>V()),(e,u)=>(a(),h(n,{fluid:``,class:`pa-6`},{default:s(()=>[g(l,{elevation:`0`,border:``,rounded:`lg`},{default:s(()=>[g(i,{class:`d-flex align-center`},{default:s(()=>[u[7]||=_(` 审计日志 `,-1),g(c),g(t,{modelValue:I.value,"onUpdate:modelValue":[u[0]||=e=>I.value=e,u[1]||=e=>{F.value=1,V()}],items:f(z),"item-title":`label`,"item-value":`value`,label:`操作类型`,variant:`outlined`,density:`compact`,"hide-details":``,style:{"max-width":`200px`},clearable:``},null,8,[`modelValue`,`items`]),g(v,{modelValue:L.value,"onUpdate:modelValue":[u[2]||=e=>L.value=e,u[3]||=e=>{F.value=1,V()}],"prepend-inner-icon":`mdi-account`,label:`用户`,variant:`outlined`,density:`compact`,"hide-details":``,style:{"max-width":`140px`},class:`ml-3`,clearable:``},null,8,[`modelValue`]),g(v,{modelValue:R.value,"onUpdate:modelValue":[u[4]||=e=>R.value=e,u[5]||=e=>{F.value=1,V()}],"prepend-inner-icon":`mdi-calendar`,label:`日期`,variant:`outlined`,density:`compact`,"hide-details":``,style:{"max-width":`160px`},class:`ml-3`,type:`date`,clearable:``},null,8,[`modelValue`])]),_:1}),g(x,{items:N.value,headers:f(B),"items-length":P.value,loading:M.value,page:F.value,"items-per-page":50,hover:``,density:`compact`,"onUpdate:page":u[6]||=e=>{F.value=e,V()}},{"item.action":s(({item:e})=>[g(o,{color:H(e.action),size:`small`,variant:`tonal`,label:``},{default:s(()=>[_(r(f(w)(e.action)),1)]),_:2},1032,[`color`])]),"item.admin_username":s(({item:e})=>[y(`span`,E,r(e.admin_username),1)]),"item.target":s(({item:e})=>[y(`span`,D,r(f(S)(e.resource_type))+r(e.resource_id?` #${e.resource_id}`:``),1)]),"item.detail":s(({item:e})=>[y(`span`,O,r(e.detail||`—`),1)]),"item.ip_address":s(({item:e})=>[y(`span`,k,r(e.ip_address||`—`),1)]),"item.created_at":s(({item:e})=>[y(`span`,A,r(e.created_at),1)]),"no-data":s(()=>[...u[8]||=[y(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无数据`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`])]),_:1})]),_:1}))}});export{j as default};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
.dashboard-root[data-v-a2855e8c]{min-width:0;max-width:100%}.dashboard-root[data-v-a2855e8c] .v-table{overflow-x:auto}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{$r as e,Cn as t,Dr as n,Er as r,F as i,Ir as a,Jt as o,Pr as s,Q as c,Qr as l,R as u,Sn as d,Tr as f,Ur as p,Yt as m,Z as h,Zr as g,Zt as _,_r as v,c as y,dr as b,en as x,fr as S,gr as C,hr as w,l as T,lr as E,mn as D,or as O,pr as k,qt as A,t as j,tn as M,ur as N,y as P,yn as F}from"./index-C6qJAv49.js";import{t as I}from"./_plugin-vue_export-helper-BDNMzG2s.js";var L=t({...d(),...T()},`VForm`),R=F()({name:`VForm`,props:L(),emits:{"update:modelValue":e=>!0,submit:e=>!0},setup(e,{slots:t,emit:n}){let r=y(e),i=p();function a(e){e.preventDefault(),r.reset()}function o(e){let t=e,a=r.validate();t.then=a.then.bind(a),t.catch=a.catch.bind(a),t.finally=a.finally.bind(a),n(`submit`,t),t.defaultPrevented||a.then(({valid:e})=>{e&&i.value?.submit()}),t.preventDefault()}return D(()=>N(`form`,{ref:i,class:g([`v-form`,e.class]),style:l(e.style),novalidate:!0,onReset:a,onSubmit:o},[t.default?.({get errors(){return r.errors.value},get isDisabled(){return r.isDisabled.value},get isReadonly(){return r.isReadonly.value},get isValidating(){return r.isValidating.value},get isValid(){return r.isValid.value},get items(){return r.items.value},validate:r.validate,reset:r.reset,resetValidation:r.resetValidation})])),P(r,i)}}),z={class:`login-page`},B={class:`login-center`},V={key:2,class:`text-center mt-4`},H=I(v({__name:`LoginPage`,setup(t){let d=x(),g=M(),v=A(),y=p(``),T=p(``),D=p(``),P=p(!1),F=p(!1),I=p(``),L=p(!1),H=p(0),U=p(null),W=p([]),G=p(0),K=null,q=E(()=>W.value.length===0?``:W.value[G.value]);async function J(){try{let e=await _.get(`/settings/bing-wallpapers`);e?.urls?.length&&(W.value=e.urls,G.value=Math.floor(Math.random()*e.urls.length))}catch{}}function Y(){K&&clearInterval(K),!(W.value.length<=1)&&(K=setInterval(()=>{G.value=(G.value+1)%W.value.length},36e5))}f(async()=>{await J(),Y()}),r(()=>{K&&clearInterval(K),Z&&clearInterval(Z)});let X=p(Date.now()),Z=null,Q=E(()=>{if(!U.value)return 0;let e=new Date(U.value).getTime()-X.value;return Math.max(0,Math.ceil(e/6e4))});s(U,e=>{Z&&=(clearInterval(Z),null),e&&(Z=setInterval(()=>{X.value=Date.now()},3e4))});async function $(){if(!y.value||!T.value){I.value=`请输入用户名和密码`;return}F.value=!0,I.value=``;try{await v.login(y.value,T.value,L.value?D.value:void 0);let e=d.query.redirect||`/`,t=e.startsWith(`/`)&&!e.startsWith(`//`)?e:`/`;g.push(t)}catch(e){e instanceof m?(L.value=!0,I.value=e.message):e instanceof o?e.status===429?(U.value=new Date(Date.now()+900*1e3).toISOString(),I.value=`登录尝试过多,账户已锁定 15 分钟`):(H.value++,I.value=e.message):I.value=`网络错误,请重试`}finally{F.value=!1}}return(t,r)=>(n(),k(`div`,z,[N(`div`,{class:`wallpaper-bg`,style:l({backgroundImage:`url(${q.value})`})},null,4),r[6]||=N(`div`,{class:`wallpaper-overlay`},null,-1),N(`div`,B,[C(u,{elevation:`0`,rounded:`xl`,class:`login-card pa-10`,border:``},{default:a(()=>[I.value?(n(),b(h,{key:0,type:`error`,density:`compact`,class:`mb-4`,closable:``,"onClick:close":r[0]||=e=>I.value=``,rounded:`lg`,variant:`tonal`},{default:a(()=>[w(e(I.value),1)]),_:1})):S(``,!0),U.value?(n(),b(h,{key:1,type:`warning`,density:`compact`,class:`mb-4`,rounded:`lg`,variant:`tonal`},{default:a(()=>[w(` 账户已锁定,请 `+e(Q.value)+` 分钟后重试 `,1)]),_:1})):S(``,!0),C(R,{onSubmit:O($,[`prevent`])},{default:a(()=>[C(j,{modelValue:y.value,"onUpdate:modelValue":r[1]||=e=>y.value=e,label:`用户名`,variant:`outlined`,density:`comfortable`,"prepend-inner-icon":`mdi-account-outline`,disabled:F.value,class:`mb-4`,autocomplete:`username`,rounded:`lg`,"hide-details":`auto`},null,8,[`modelValue`,`disabled`]),C(j,{modelValue:T.value,"onUpdate:modelValue":r[2]||=e=>T.value=e,label:`密码`,variant:`outlined`,density:`comfortable`,"prepend-inner-icon":`mdi-lock-outline`,"append-inner-icon":P.value?`mdi-eye`:`mdi-eye-off`,type:P.value?`text`:`password`,"onClick:appendInner":r[3]||=e=>P.value=!P.value,disabled:F.value,class:`mb-4`,autocomplete:`current-password`,rounded:`lg`,"hide-details":`auto`},null,8,[`modelValue`,`append-inner-icon`,`type`,`disabled`]),L.value?(n(),b(j,{key:0,modelValue:D.value,"onUpdate:modelValue":r[4]||=e=>D.value=e,label:`TOTP 验证码`,variant:`outlined`,density:`comfortable`,"prepend-inner-icon":`mdi-shield-key-outline`,disabled:F.value,class:`mb-4`,autocomplete:`one-time-code`,rounded:`lg`,"hide-details":`auto`},null,8,[`modelValue`,`disabled`])):S(``,!0),C(c,{type:`submit`,color:`primary`,variant:`flat`,block:``,size:`large`,loading:F.value,disabled:!!U.value,rounded:`lg`,class:`mt-2`,height:`48`},{default:a(()=>[...r[5]||=[w(` 登录 `,-1)]]),_:1},8,[`loading`,`disabled`])]),_:1}),H.value>0&&!U.value?(n(),k(`div`,V,[C(i,{size:`small`,variant:`tonal`,color:`warning`,label:``},{default:a(()=>[w(` 已失败 `+e(H.value)+` 次 `,1)]),_:1})])):S(``,!0)]),_:1})])]))}}),[[`__scopeId`,`data-v-c0c6156f`]]);export{H as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{_ as e,t,v as n}from"./VSelect-Dy1HeCdk.js";import{$r as r,B as i,Dr as a,F as o,H as s,Ir as c,N as l,Q as u,R as d,Tr as f,Ur as p,Yr as m,Zt as h,_r as g,dr as _,fr as v,gr as y,hr as b,ur as x,z as S}from"./index-C6qJAv49.js";import{n as C}from"./dataTable-esDY4cOk.js";import{t as w}from"./VDataTableServer-Dh4BHVrk.js";import{t as T}from"./VDialog-P-nMQayc.js";import{t as E}from"./usePageAutoRefresh-qyIz2rJd.js";var D={class:`font-weight-medium text-truncate d-inline-block`,style:{"max-width":`240px`}},O={class:`text-medium-emphasis`},k={class:`text-medium-emphasis`},A={class:`text-caption text-medium-emphasis`},j={class:`text-caption text-medium-emphasis`},M=g({__name:`RetriesPage`,setup(g){let M=e(),N=p(!1),P=p([]),F=p(0),I=p(1),L=p(null),R=p(!1),z=p(null),B=[{label:`待重试`,value:`pending`},{label:`重试中`,value:`retrying`},{label:`成功`,value:`success`},{label:`失败`,value:`failed`}],V=C([{title:`状态`,key:`status`,width:100},{title:`任务`,key:`operation`},{title:`服务器`,key:`server_name`},{title:`次数`,key:`retry_count`,width:100},{title:`下次重试`,key:`next_retry_at`,width:140},{title:`创建时间`,key:`created_at`,width:160},{title:``,key:`actions`,width:120,align:`end`}]);async function H(e=!1){e||(N.value=!0);try{let e=(await h.getList(`/retries/`,{limit:200})).items||[];L.value&&(e=e.filter(e=>e.status===L.value)),F.value=e.length;let t=(I.value-1)*20;P.value=e.slice(t,t+20)}catch(t){e||(P.value=[],F.value=0,M(t instanceof Error?t.message:`加载重试队列失败`,`error`))}finally{e||(N.value=!1)}}async function U(e){try{await h.post(`/retries/${e.id}/retry`),H(),M(`重试已触发`)}catch(e){M(e.message||`操作失败`,`error`)}}function W(e){z.value=e.id,R.value=!0}async function G(){if(z.value)try{await h.delete(`/retries/${z.value}`),R.value=!1,H(),M(`已删除`)}catch(e){M(e.message||`删除失败`,`error`)}}function K(e){return e===`success`?`success`:e===`failed`?`error`:e===`retrying`?`warning`:`info`}function q(e){return e===`pending`?`待重试`:e===`retrying`?`重试中`:e===`success`?`成功`:e===`failed`?`失败`:e}function J(e){return e.source_path&&e.target_path?`${e.source_path} → ${e.target_path}`:e.source_path||e.target_path||`文件推送`}return E(()=>H(!0),15e3),f(()=>H()),(e,f)=>(a(),_(n,{fluid:``,class:`pa-6`},{default:c(()=>[y(d,{elevation:`0`,border:``,rounded:`lg`},{default:c(()=>[y(i,{class:`d-flex align-center text-h6`},{default:c(()=>[f[5]||=b(` 重试队列 `,-1),y(l),y(t,{modelValue:L.value,"onUpdate:modelValue":[f[0]||=e=>L.value=e,f[1]||=e=>{I.value=1,H()}],items:B,"item-title":`label`,"item-value":`value`,label:`状态筛选`,variant:`outlined`,density:`compact`,"hide-details":``,style:{"max-width":`160px`},clearable:``},null,8,[`modelValue`])]),_:1}),y(w,{items:P.value,headers:m(V),"items-length":F.value,loading:N.value,page:I.value,"items-per-page":20,hover:``,density:`comfortable`,"onUpdate:page":f[2]||=e=>{I.value=e,H()}},{"item.status":c(({item:e})=>[y(o,{color:K(e.status),size:`x-small`,variant:`tonal`,label:``,border:`sm`},{default:c(()=>[b(r(q(e.status)),1)]),_:2},1032,[`color`])]),"item.operation":c(({item:e})=>[x(`span`,D,r(J(e)),1)]),"item.server_name":c(({item:e})=>[x(`span`,O,r(e.server_name||`—`),1)]),"item.retry_count":c(({item:e})=>[x(`span`,k,r(e.retry_count||0)+` / `+r(e.max_retries||3),1)]),"item.next_retry_at":c(({item:e})=>[x(`span`,A,r(e.next_retry_at||`—`),1)]),"item.created_at":c(({item:e})=>[x(`span`,j,r(e.created_at),1)]),"item.actions":c(({item:e})=>[e.status===`pending`||e.status===`failed`?(a(),_(u,{key:0,variant:`text`,size:`x-small`,color:`primary`,density:`compact`,onClick:t=>U(e)},{default:c(()=>[...f[6]||=[b(` 重试 `,-1)]]),_:1},8,[`onClick`])):v(``,!0),y(u,{variant:`text`,size:`x-small`,color:`error`,density:`compact`,onClick:t=>W(e)},{default:c(()=>[...f[7]||=[b(` 删除 `,-1)]]),_:1},8,[`onClick`])]),"no-data":c(()=>[...f[8]||=[x(`div`,{class:`text-center text-medium-emphasis py-6`},`暂无数据`,-1)]]),_:1},8,[`items`,`headers`,`items-length`,`loading`,`page`])]),_:1}),y(T,{modelValue:R.value,"onUpdate:modelValue":f[4]||=e=>R.value=e,"max-width":`400`},{default:c(()=>[y(d,{border:``},{default:c(()=>[y(i,null,{default:c(()=>[...f[9]||=[b(`确认删除`,-1)]]),_:1}),y(S,null,{default:c(()=>[...f[10]||=[b(`确定要删除此重试任务吗?`,-1)]]),_:1}),y(s,null,{default:c(()=>[y(l),y(u,{variant:`text`,onClick:f[3]||=e=>R.value=!1},{default:c(()=>[...f[11]||=[b(`取消`,-1)]]),_:1}),y(u,{color:`error`,variant:`flat`,onClick:G},{default:c(()=>[...f[12]||=[b(`删除`,-1)]]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])]),_:1}))}});export{M as default};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{n as e,t}from"./VRow-CamZ4OJs.js";import{$r as n,Dr as r,Er as i,Ir as a,Pr as o,R as s,U as c,Ur as l,Zr as u,_r as d,dr as f,gr as p,kr as m,pr as h,sr as g,ur as _,ut as v,z as y}from"./index-C6qJAv49.js";import{n as b}from"./paginatedFetch-CPtIdw6B.js";import{t as x}from"./_plugin-vue_export-helper-BDNMzG2s.js";var S={status:`status`,name:`name`,domain:`domain`,address:`domain`,category:`category`,target_path:`target_path`,agent_version:`agent_version`,agent:`agent_version`,last_heartbeat:`heartbeat`,heartbeat:`heartbeat`};function C(e){if(!e.length)return{};let t=S[e[0].key];return t?{sort_by:t,sort_order:e[0].order}:{}}function w(){let e=l([]),t=l(!1),n=l(1),r=l(20),a=l(0),s=l(``),c=l(``),u=l([]);async function d(i){i?.silent||(t.value=!0);try{let t=await b(`/servers/`,{search:s.value||void 0,category:c.value||void 0,...C(u.value)},n.value,r.value);e.value=t.items,a.value=t.total,r.value===-1&&(n.value=1)}catch(t){throw e.value=[],a.value=0,t}finally{i?.silent||(t.value=!1)}}let f;i(()=>clearTimeout(f));function p(){clearTimeout(f),f=setTimeout(()=>{n.value=1,d()},300)}function m(e){n.value=e,d()}function h(e){r.value=e,n.value=1,d()}function g(e){c.value=e,n.value=1,d()}o(u,()=>{n.value=1,d()},{deep:!0});async function _(){return(await b(`/servers/`,{search:s.value||void 0,category:c.value||void 0,...C(u.value)},1,-1)).items}return{servers:e,loading:t,page:n,itemsPerPage:r,total:a,search:s,categoryFilter:c,sortBy:u,loadServers:d,onSearch:p,onPageChange:m,onItemsPerPageChange:h,onCategoryChange:g,loadAllServers:_}}function T(e){switch(e){case`online`:return`success`;case`offline`:return`error`;default:return`warning`}}function E(e){switch(e){case`online`:return`在线`;case`offline`:return`离线`;default:return`未知`}}function D(e){if(!e)return`—`;let t=new Date(e);if(isNaN(t.getTime()))return`—`;let n=Date.now()-t.getTime();return n<6e4?`刚刚`:n<36e5?`${Math.floor(n/6e4)} 分钟前`:n<864e5?`${Math.floor(n/36e5)} 小时前`:`${Math.floor(n/864e5)} 天前`}var O={class:`text-caption text-medium-emphasis mb-1`,style:{"font-size":`14px`,"letter-spacing":`0.5px`,"text-transform":`uppercase`}},k=x(d({__name:`StatCardsRow`,props:{items:{}},setup(i){return(o,l)=>(r(),f(t,null,{default:a(()=>[(r(!0),h(g,null,m(i.items,(t,i)=>(r(),f(e,{key:i,cols:`6`,sm:`3`},{default:a(()=>[p(s,{elevation:`0`,rounded:`xl`,border:``,class:`stat-card`},{default:a(()=>[p(y,{class:`pa-4 d-flex align-center justify-space-between`},{default:a(()=>[_(`div`,null,[_(`div`,O,n(t.subtitle),1),_(`div`,{class:u([`font-weight-bold`,`text-`+t.color]),style:{"font-size":`36px`,"line-height":`1.1`}},n(t.title),3)]),p(c,{color:t.color,size:`48`,rounded:`lg`,class:`stat-icon`},{default:a(()=>[p(v,{icon:t.icon,size:`24`,color:`white`},null,8,[`icon`])]),_:2},1032,[`color`])]),_:2},1024)]),_:2},1024)]),_:2},1024))),128))]),_:1}))}}),[[`__scopeId`,`data-v-68b984da`]]);export{w as a,E as i,D as n,T as r,k as t};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{d as e,f as t}from"./VSelect-Dy1HeCdk.js";import{Cn as n,Fn as r,Mr as i,Ur as a,Yn as o,dn as s,gr as c,mn as l,o as u,p as d,s as f,xr as p,y as m,yn as h}from"./index-C6qJAv49.js";var g=n({...o(f(),[`direction`]),...o(t(),[`inline`])},`VCheckbox`),_=h()({name:`VCheckbox`,inheritAttrs:!1,props:g(),emits:{"update:modelValue":e=>!0,"update:focused":e=>!0},setup(t,{attrs:n,slots:o}){let f=s(t,`modelValue`),{isFocused:h,focus:g,blur:_}=d(t),v=a(),y=i();return l(()=>{let[i,a]=r(n),s=u.filterProps(t),l=e.filterProps(t);return c(u,p({ref:v,class:[`v-checkbox`,t.class]},i,s,{modelValue:f.value,"onUpdate:modelValue":e=>f.value=e,id:t.id||`checkbox-${y}`,focused:h.value,style:t.style}),{...o,default:({id:t,messagesId:n,isDisabled:r,isReadonly:i,isValid:s})=>c(e,p(l,{id:t.value,"aria-describedby":n.value,disabled:r.value,readonly:i.value},a,{error:s.value===!1,modelValue:f.value,"onUpdate:modelValue":e=>f.value=e,onFocus:g,onBlur:_}),o)})}),m({},v)}});export{_ as t};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{_ as e,a as t,b as n,c as r,d as i,f as a,g as o,h as s,i as ee,l as c,m as l,n as u,o as d,p as f,r as te,s as p,u as m,v as h,y as g}from"./VDataTable-B6PKw1TS.js";import{Cn as _,Kr as v,Or as ne,P as y,Yn as b,bn as x,gr as S,lr as C,mn as w,qr as T,sr as E,ur as D,xr as O,yn as k}from"./index-C6qJAv49.js";var A=_({itemsLength:{type:[Number,String],required:!0},...g(),...u(),...e()},`VDataTableServer`),j=k()({name:`VDataTableServer`,props:A(),emits:{"update:modelValue":e=>!0,"update:page":e=>!0,"update:itemsPerPage":e=>!0,"update:sortBy":e=>!0,"update:options":e=>!0,"update:expanded":e=>!0,"update:groupBy":e=>!0},setup(e,{attrs:u,slots:g}){let{groupBy:_}=r(e),{initialSortOrder:k,sortBy:A,multiSort:j,mustSort:M}=a(e),{page:N,itemsPerPage:P}=h(e),{disableSort:F}=T(e),I=C(()=>parseInt(e.itemsLength,10)),{columns:L,headers:R}=s(e,{groupBy:_,showSelect:v(()=>e.showSelect),showExpand:v(()=>e.showExpand)}),{items:z}=ee(e,L),{toggleSort:B}=f({initialSortOrder:k,sortBy:A,multiSort:j,mustSort:M,page:N}),{opened:V,isGroupOpen:H,toggleGroup:re,extractRows:U}=c({groupBy:_,sortBy:A,disableSort:F}),{pageCount:W,setItemsPerPage:G,prevPage:K,nextPage:q,setPage:J}=n({page:N,itemsPerPage:P,itemsLength:I}),{flatItems:Y}=m(z,_,V,()=>!!g[`group-summary`]),{isSelected:X,select:ie,selectAll:Z,toggleSelect:ae,someSelected:oe,allSelected:se}=l(e,{allItems:z,currentPage:z}),{isExpanded:ce,toggleExpand:le}=p(e),Q=C(()=>U(z.value));te({page:N,itemsPerPage:P,sortBy:A,groupBy:_,search:v(()=>e.search)}),ne(`v-data-table`,{toggleSort:B,sortBy:A}),x({VDataTableRows:{hideNoData:v(()=>e.hideNoData),noDataText:v(()=>e.noDataText),loading:v(()=>e.loading),loadingText:v(()=>e.loadingText)}});let $=C(()=>({page:N.value,itemsPerPage:P.value,sortBy:A.value,pageCount:W.value,toggleSort:B,setItemsPerPage:G,prevPage:K,nextPage:q,setPage:J,someSelected:oe.value,allSelected:se.value,isSelected:X,select:ie,selectAll:Z,toggleSelect:ae,isExpanded:ce,toggleExpand:le,isGroupOpen:H,toggleGroup:re,items:Q.value.map(e=>e.raw),internalItems:Q.value,groupedItems:Y.value,columns:L.value,headers:R.value}));w(()=>{let n=o.filterProps(e),r=i.filterProps(b(e,[`multiSort`])),a=d.filterProps(e),s=t.filterProps(e);return S(t,O({class:[`v-data-table`,{"v-data-table--loading":e.loading},e.class],style:e.style},s,{fixedHeader:e.fixedHeader||e.sticky}),{top:()=>g.top?.($.value),default:()=>g.default?g.default($.value):D(E,null,[g.colgroup?.($.value),!e.hideDefaultHeader&&D(`thead`,{key:`thead`,class:`v-data-table__thead`,role:`rowgroup`},[S(i,O(r,{multiSort:!!e.multiSort}),g)]),g.thead?.($.value),!e.hideDefaultBody&&D(`tbody`,{class:`v-data-table__tbody`,role:`rowgroup`},[g[`body.prepend`]?.($.value),g.body?g.body($.value):S(d,O(u,a,{items:Y.value}),g),g[`body.append`]?.($.value)]),g.tbody?.($.value),g.tfoot?.($.value)]),bottom:()=>g.bottom?g.bottom($.value):!e.hideDefaultFooter&&D(E,null,[S(y,null,null),S(o,n,{prepend:g[`footer.prepend`]})])})})}});export{j as t};
|
||||
@@ -0,0 +1 @@
|
||||
import{Cn as e,Pr as t,S as n,Sr as r,Ur as i,X as a,Yn as o,b as s,dn as c,ft as l,gr as u,mn as d,x as f,xr as p,y as m,yn as h}from"./index-C6qJAv49.js";var g=e({fullscreen:Boolean,scrollable:Boolean,...o(f({captureFocus:!0,origin:`center center`,scrollStrategy:`block`,transition:{component:a},zIndex:2400,retainFocus:!0}),[`disableInitialFocus`])},`VDialog`),_=h()({name:`VDialog`,props:g(),emits:{"update:modelValue":e=>!0,afterEnter:()=>!0,afterLeave:()=>!0},setup(e,{emit:a,slots:o}){let f=c(e,`modelValue`),{scopeId:h}=n(),g=i();function _(){a(`afterEnter`),(e.scrim||e.retainFocus)&&g.value?.contentEl&&!g.value.contentEl.contains(document.activeElement)&&g.value.contentEl.focus({preventScroll:!0})}function v(){a(`afterLeave`)}return t(f,async e=>{e||(await r(),g.value.activatorEl?.focus({preventScroll:!0}))}),d(()=>{let t=s.filterProps(e),n=p({"aria-haspopup":`dialog`},e.activatorProps),r=p({tabindex:-1},e.contentProps);return u(s,p({ref:g,class:[`v-dialog`,{"v-dialog--fullscreen":e.fullscreen,"v-dialog--scrollable":e.scrollable},e.class],style:e.style},t,{modelValue:f.value,"onUpdate:modelValue":e=>f.value=e,"aria-modal":`true`,activatorProps:n,contentProps:r,height:e.fullscreen?void 0:e.height,width:e.fullscreen?void 0:e.width,maxHeight:e.fullscreen?void 0:e.maxHeight,maxWidth:e.fullscreen?void 0:e.maxWidth,role:`dialog`,onAfterEnter:_,onAfterLeave:v},h),{activator:o.activator,default:(...e)=>u(l,{root:`VDialog`},{default:()=>[o.default?.(...e)]})})}),m({},g)}});export{_ as t};
|
||||
@@ -0,0 +1 @@
|
||||
import{C as e,Cn as t,Ct as n,J as r,Kr as i,Lr as a,Or as o,Qr as s,Sn as c,St as l,Tt as u,Xn as d,Zr as f,_t as p,bn as m,ct as h,et as g,ft as _,gr as v,gt as y,ht as b,in as x,ir as S,lr as C,mn as w,mt as T,pn as E,rn as D,st as O,ur as k,ut as A,w as j,wt as M,xt as N,yn as P,yr as F,yt as I}from"./index-C6qJAv49.js";var L=Symbol.for(`vuetify:v-expansion-panel`),R=t({...c(),...e()},`VExpansionPanelText`),z=P()({name:`VExpansionPanelText`,props:R(),setup(e,{slots:t}){let n=F(L);if(!n)throw Error(`[Vuetify] v-expansion-panel-text needs to be placed inside v-expansion-panel`);let{hasContent:i,onAfterLeave:o}=j(e,n.isSelected);return w(()=>v(r,{onAfterLeave:o},{default:()=>[a(k(`div`,{class:f([`v-expansion-panel-text`,e.class]),style:s(e.style)},[t.default&&i.value&&k(`div`,{class:`v-expansion-panel-text__wrapper`},[t.default?.()])]),[[S,n.isSelected.value]])]})),{}}}),B=t({color:String,expandIcon:{type:E,default:`$expand`},collapseIcon:{type:E,default:`$collapse`},hideActions:Boolean,focusable:Boolean,static:Boolean,ripple:{type:[Boolean,Object],default:!1},readonly:Boolean,...c(),...O()},`VExpansionPanelTitle`),V=P()({name:`VExpansionPanelTitle`,directives:{vRipple:g},props:B(),setup(e,{slots:t}){let n=F(L);if(!n)throw Error(`[Vuetify] v-expansion-panel-title needs to be placed inside v-expansion-panel`);let{backgroundColorClasses:r,backgroundColorStyles:o}=I(()=>e.color),{dimensionStyles:c}=h(e),l=C(()=>({collapseIcon:e.collapseIcon,disabled:n.disabled.value,expanded:n.isSelected.value,expandIcon:e.expandIcon,readonly:e.readonly})),u=i(()=>n.isSelected.value?e.collapseIcon:e.expandIcon);return w(()=>a(k(`button`,{class:f([`v-expansion-panel-title`,{"v-expansion-panel-title--active":n.isSelected.value,"v-expansion-panel-title--focusable":e.focusable,"v-expansion-panel-title--static":e.static},r.value,e.class]),style:s([o.value,c.value,e.style]),type:`button`,tabindex:n.disabled.value?-1:void 0,disabled:n.disabled.value,"aria-expanded":n.isSelected.value,onClick:e.readonly?void 0:n.toggle},[k(`span`,{class:`v-expansion-panel-title__overlay`},null),t.default?.(l.value),!e.hideActions&&v(_,{defaults:{VIcon:{icon:u.value}}},{default:()=>[k(`span`,{class:`v-expansion-panel-title__icon`},[t.actions?.(l.value)??v(A,null,null)])]})]),[[g,e.ripple]])),{}}}),H=t({title:String,text:String,bgColor:String,...M(),...T(),...l(),...N(),...B(),...R()},`VExpansionPanel`),U=P()({name:`VExpansionPanel`,props:H(),emits:{"group:selected":e=>!0},setup(e,{slots:t}){let r=p(e,L),{backgroundColorClasses:a,backgroundColorStyles:c}=I(()=>e.bgColor),{elevationClasses:l}=u(e),{roundedClasses:d}=n(e),m=i(()=>r?.disabled.value||e.disabled),h=C(()=>r.group.items.value.reduce((e,t,n)=>(r.group.selected.value.includes(t.id)&&e.push(n),e),[])),g=C(()=>{let e=r.group.items.value.findIndex(e=>e.id===r.id);return!r.isSelected.value&&h.value.some(t=>t-e===1)}),y=C(()=>{let e=r.group.items.value.findIndex(e=>e.id===r.id);return!r.isSelected.value&&h.value.some(t=>t-e===-1)});return o(L,r),w(()=>{let n=!!(t.text||e.text),i=!!(t.title||e.title),o=V.filterProps(e),u=z.filterProps(e);return v(e.tag,{class:f([`v-expansion-panel`,{"v-expansion-panel--active":r.isSelected.value,"v-expansion-panel--before-active":g.value,"v-expansion-panel--after-active":y.value,"v-expansion-panel--disabled":m.value},d.value,a.value,e.class]),style:s([c.value,e.style])},{default:()=>[k(`div`,{class:f([`v-expansion-panel__shadow`,...l.value])},null),v(_,{defaults:{VExpansionPanelTitle:{...o},VExpansionPanelText:{...u}}},{default:()=>[i&&v(V,{key:`title`},{default:()=>[t.title?t.title():e.title]}),n&&v(z,{key:`text`},{default:()=>[t.text?t.text():e.text]}),t.default?.()]})]})}),{groupItem:r}}}),W=[`default`,`accordion`,`inset`,`popout`],G=t({flat:Boolean,...b(),...d(H(),[`bgColor`,`collapseIcon`,`color`,`eager`,`elevation`,`expandIcon`,`focusable`,`hideActions`,`readonly`,`ripple`,`static`]),...l(),...D(),...c(),...N(),variant:{type:String,default:`default`,validator:e=>W.includes(e)}},`VExpansionPanels`),K=P()({name:`VExpansionPanels`,props:G(),emits:{"update:modelValue":e=>!0},setup(e,{slots:t}){let{next:r,prev:a}=y(e,L),{themeClasses:o}=x(e),{roundedClasses:c}=n(e),l=i(()=>e.variant&&`v-expansion-panels--variant-${e.variant}`);return m({VExpansionPanel:{bgColor:i(()=>e.bgColor),collapseIcon:i(()=>e.collapseIcon),color:i(()=>e.color),eager:i(()=>e.eager),elevation:i(()=>e.elevation),expandIcon:i(()=>e.expandIcon),focusable:i(()=>e.focusable),hideActions:i(()=>e.hideActions),readonly:i(()=>e.readonly),ripple:i(()=>e.ripple),static:i(()=>e.static)}}),w(()=>v(e.tag,{class:f([`v-expansion-panels`,{"v-expansion-panels--flat":e.flat,"v-expansion-panels--tile":e.tile},o.value,c.value,l.value,e.class]),style:s(e.style)},{default:()=>[t.default?.({prev:a,next:r})]})),{next:r,prev:a}}});export{z as i,U as n,V as r,K as t};
|
||||
@@ -0,0 +1 @@
|
||||
import{An as e,Cn as t,Et as n,Kn as r,Sn as i,Xr as a,lr as o,nr as s,on as c,vr as l,xt as u,yn as d}from"./index-C6qJAv49.js";var f=c.reduce((e,t)=>(e[t]={type:[Boolean,String,Number],default:!1},e),{}),p=c.reduce((e,t)=>{let n=`offset`+a(t);return e[n]={type:[String,Number],default:null},e},{}),m={col:r(f),offset:r(p),order:[`order`,`orderSm`,`orderMd`,`orderLg`,`orderXl`,`orderXxl`]};function h(e){if(typeof e==`string`&&e.includes(`/`)){let[t,n]=e.split(`/`);return{cols:Number(t),size:Number(n)}}return{cols:e}}function g(e,t,n){if(n==null||n===!1)return{};let{cols:r,size:i}=h(n),a=t.replace(e,``).toLowerCase();return e===`offset`?{className:`v-col--offset-${a}-${r}`,variables:[{[`--v-col-offset-base-${a}`]:i}]}:e===`order`?{className:`order-${a}-${r}`}:{className:r===``||r===!0?`v-col--${a}`:`v-col--cols-${a}-${r}`,variables:[{[`--v-col-size-base-${a}`]:i}]}}var _=[`auto`,`start`,`end`,`center`,`baseline`,`stretch`],v=e=>_.includes(e),y=t({cols:{type:[Boolean,String,Number],default:!1},...f,offset:{type:[String,Number],default:null},...p,order:{type:[String,Number],default:null},orderSm:{type:[String,Number],default:null},orderMd:{type:[String,Number],default:null},orderLg:{type:[String,Number],default:null},orderXl:{type:[String,Number],default:null},orderXxl:{type:[String,Number],default:null},alignSelf:{type:String,default:null,validator:v},...i(),...u()},`VCol`),b=d()({name:`VCol`,props:y(),setup(e,{slots:t}){let n=o(()=>h(e.cols).size),r=o(()=>h(e.offset).size),i=o(()=>{let t=[`v-col`],n=[],r;for(r in m)m[r].forEach(i=>{let a=e[i],{className:o,variables:s}=g(r,i,a);o&&t.push(o),s&&n.push(...s)});let{cols:i}=h(e.cols),{cols:a}=h(e.offset);return t.push({[`v-col--cols-${i}`]:i,[`v-col--offset-${a}`]:a,[`order-${e.order}`]:e.order,[`align-self-${e.alignSelf}`]:e.alignSelf}),{classes:t,variables:n}});return()=>l(e.tag,{class:[i.value.classes,e.class],style:[{"--v-col-size-base":n.value},{"--v-col-offset-base":r.value},i.value.variables,e.style]},t.default?.())}}),x=[`start`,`end`,`center`],S=[`space-between`,`space-around`,`space-evenly`],C=[...x,`baseline`,`stretch`],w=e=>C.includes(e),T=[...x,...S],E=e=>T.includes(e),D=[...x,...S,`stretch`],O=e=>D.includes(e),k={align:[`align`,`alignSm`,`alignMd`,`alignLg`,`alignXl`,`alignXxl`],justify:[`justify`,`justifySm`,`justifyMd`,`justifyLg`,`justifyXl`,`justifyXxl`],alignContent:[`alignContent`,`alignContentSm`,`alignContentMd`,`alignContentLg`,`alignContentXl`,`alignContentXxl`]},A={align:`align`,justify:`justify`,alignContent:`align-content`};function j(e,t,n){let r=A[e];if(n!=null){if(t){let n=t.replace(e,``);r+=`-${n}`}return r+=`-${n}`,r.toLowerCase()}}var M=t({dense:Boolean,align:{type:String,default:null,validator:w},alignSm:{type:String,default:null,validator:w},alignMd:{type:String,default:null,validator:w},alignLg:{type:String,default:null,validator:w},alignXl:{type:String,default:null,validator:w},alignXxl:{type:String,default:null,validator:w},justify:{type:String,default:null,validator:E},justifySm:{type:String,default:null,validator:E},justifyMd:{type:String,default:null,validator:E},justifyLg:{type:String,default:null,validator:E},justifyXl:{type:String,default:null,validator:E},justifyXxl:{type:String,default:null,validator:E},alignContent:{type:String,default:null,validator:O},alignContentSm:{type:String,default:null,validator:O},alignContentMd:{type:String,default:null,validator:O},alignContentLg:{type:String,default:null,validator:O},alignContentXl:{type:String,default:null,validator:O},alignContentXxl:{type:String,default:null,validator:O},noGutters:Boolean,gap:[Number,String,Array],size:[Number,String],...i(),...n(),...u()},`VRow`),N=d()({name:`VRow`,props:M(),setup(t,{slots:n}){t.dense&&s(`dense`,`density="comfortable"`);let r=o(()=>{let e=[],n;for(n in k)k[n].forEach(r=>{let i=t[r],a=j(n,r,i);a&&e.push(a)});return e.push({"v-row--no-gutters":t.noGutters,"v-row--density-default":t.density===`default`&&!t.noGutters&&!t.dense,"v-row--density-compact":t.density===`compact`,"v-row--density-comfortable":t.density===`comfortable`||t.dense,[`align-${t.align}`]:t.align,[`justify-${t.justify}`]:t.justify,[`align-content-${t.alignContent}`]:t.alignContent}),e}),i=o(()=>Array.isArray(t.gap)?e(t.gap[0]||0):e(t.gap)),a=o(()=>Array.isArray(t.gap)?e(t.gap[1]||0):i.value);return()=>l(t.tag,{class:[`v-row`,r.value,t.class],style:[{"--v-col-gap-x":i.value,"--v-col-gap-y":a.value,"--v-row-columns":t.size},t.style]},n.default?.())}});export{b as n,N as t};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{m as e,p as t}from"./VSelect-Dy1HeCdk.js";import{Cn as n,Fn as r,Kr as i,Mr as a,Qr as o,Ur as s,Y as c,Zr as l,at as u,dn as d,er as f,ft as p,gr as m,lt as h,mn as g,o as _,p as v,rt as y,s as b,sr as x,ur as S,ut as C,xr as w,y as T,yn as E}from"./index-C6qJAv49.js";var D=n({indeterminate:Boolean,inset:Boolean,flat:Boolean,loading:{type:[Boolean,String],default:!1},...b(),...e()},`VSwitch`),O=E()({name:`VSwitch`,inheritAttrs:!1,props:D(),emits:{"update:focused":e=>!0,"update:modelValue":e=>!0,"update:indeterminate":e=>!0},setup(e,{attrs:n,slots:b}){let E=d(e,`indeterminate`),D=d(e,`modelValue`),{loaderClasses:O}=u(e),{isFocused:k,focus:A,blur:j}=v(e),M=s(),N=s(),P=f&&window.matchMedia(`(forced-colors: active)`).matches,F=i(()=>typeof e.loading==`string`&&e.loading!==``?e.loading:e.color),I=a(),L=i(()=>e.id||`switch-${I}`);function R(){E.value&&=!1}function z(e){e.stopPropagation(),e.preventDefault(),M.value?.input?.click()}return g(()=>{let[i,a]=r(n),s=_.filterProps(e),u=t.filterProps(e);return m(_,w({ref:N,class:[`v-switch`,{"v-switch--flat":e.flat},{"v-switch--inset":e.inset},{"v-switch--indeterminate":E.value},O.value,e.class]},i,s,{modelValue:D.value,"onUpdate:modelValue":e=>D.value=e,id:L.value,focused:k.value,style:e.style}),{...b,default:({id:n,messagesId:r,isDisabled:i,isReadonly:s,isValid:d})=>{let f={model:D,isValid:d};return m(t,w({ref:M},u,{modelValue:D.value,"onUpdate:modelValue":[e=>D.value=e,R],id:n.value,"aria-describedby":r.value,type:`checkbox`,"aria-checked":E.value?`mixed`:void 0,disabled:i.value,readonly:s.value,onFocus:A,onBlur:j},a),{...b,default:({backgroundColorClasses:e,backgroundColorStyles:t})=>S(`div`,{class:l([`v-switch__track`,P?void 0:e.value]),style:o(t.value),onClick:z},[b[`track-true`]&&S(`div`,{key:`prepend`,class:`v-switch__track-true`},[b[`track-true`](f)]),b[`track-false`]&&S(`div`,{key:`append`,class:`v-switch__track-false`},[b[`track-false`](f)])]),input:({inputNode:t,icon:n,backgroundColorClasses:r,backgroundColorStyles:i})=>S(x,null,[t,S(`div`,{class:l([`v-switch__thumb`,{"v-switch__thumb--filled":n||e.loading},e.inset||P?void 0:r.value]),style:o(e.inset?void 0:i.value)},[b.thumb?m(p,{defaults:{VIcon:{icon:n,size:`x-small`}}},{default:()=>[b.thumb({...f,icon:n})]}):m(c,null,{default:()=>[e.loading?m(y,{name:`v-switch`,active:!0,color:d.value===!1?void 0:F.value},{default:e=>b.loader?b.loader(e):m(h,{active:e.isActive,color:e.color,indeterminate:!0,size:`16`,width:`2`},null)}):n&&m(C,{key:String(n),icon:n,size:`x-small`},null)]})])])})}})}),T({},N)}});export{O as t};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{Jt as e}from"./index-C6qJAv49.js";function t(t,n){if(t instanceof e){let e=t.detail??t.message;return typeof e==`string`?e:Array.isArray(e)?e.map(e=>e?.msg||JSON.stringify(e)).join(`; `):e&&typeof e==`object`?JSON.stringify(e):t.message||n}return t instanceof Error&&t.message||n}export{t};
|
||||
@@ -0,0 +1 @@
|
||||
import{p as e,s as t}from"./initMonaco-CbTFLcUb.js";import{_ as n,a as r,c as i,d as a,f as o,g as s,h as c,i as l,l as u,m as d,n as f,o as p,p as m,r as h,s as g,t as _,u as v,v as y}from"./lspLanguageFeatures-CrPR27dq.js";var b=120*1e3,x=class{constructor(e){this._defaults=e,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&=(this._worker.dispose(),null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){this._worker&&Date.now()-this._lastUsedTime>b&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||=(this._worker=t({moduleId:`vs/language/css/cssWorker`,createWorker:()=>new Worker(new URL(`/app/assets/css.worker-CvXBzhp8.js`,``+import.meta.url),{type:`module`}),label:this._defaults.languageId,createData:{options:this._defaults.options,languageId:this._defaults.languageId}}),this._worker.getProxy()),this._client}getLanguageServiceWorker(...e){let t;return this._getClient().then(e=>{t=e}).then(t=>{if(this._worker)return this._worker.withSyncedResources(e)}).then(e=>t)}};function S(t){let n=[],s=[],c=new x(t);n.push(c);let g=(...e)=>c.getLanguageServiceWorker(...e);function y(){let{languageId:n,modeConfiguration:c}=t;w(s),c.completionItems&&s.push(e.registerCompletionItemProvider(n,new _(g,[`/`,`-`,`:`]))),c.hovers&&s.push(e.registerHoverProvider(n,new a(g))),c.documentHighlights&&s.push(e.registerDocumentHighlightProvider(n,new p(g))),c.definitions&&s.push(e.registerDefinitionProvider(n,new f(g))),c.references&&s.push(e.registerReferenceProvider(n,new o(g))),c.documentSymbols&&s.push(e.registerDocumentSymbolProvider(n,new u(g))),c.rename&&s.push(e.registerRenameProvider(n,new m(g))),c.colors&&s.push(e.registerColorProvider(n,new l(g))),c.foldingRanges&&s.push(e.registerFoldingRangeProvider(n,new v(g))),c.diagnostics&&s.push(new h(n,g,t.onDidChange)),c.selectionRanges&&s.push(e.registerSelectionRangeProvider(n,new d(g))),c.documentFormattingEdits&&s.push(e.registerDocumentFormattingEditProvider(n,new r(g))),c.documentRangeFormattingEdits&&s.push(e.registerDocumentRangeFormattingEditProvider(n,new i(g)))}return y(),n.push(C(s)),C(n)}function C(e){return{dispose:()=>w(e)}}function w(e){for(;e.length;)e.pop().dispose()}export{_ as CompletionAdapter,f as DefinitionAdapter,h as DiagnosticsAdapter,l as DocumentColorAdapter,r as DocumentFormattingEditProvider,p as DocumentHighlightAdapter,g as DocumentLinkAdapter,i as DocumentRangeFormattingEditProvider,u as DocumentSymbolAdapter,v as FoldingRangeAdapter,a as HoverAdapter,o as ReferenceAdapter,m as RenameAdapter,d as SelectionRangeAdapter,x as WorkerManager,c as fromPosition,s as fromRange,S as setupMode,n as toRange,y as toTextEdit};
|
||||
@@ -0,0 +1,2 @@
|
||||
import{Cr as e,Ft as t,Lt as n}from"./index-C6qJAv49.js";import{t as r}from"./usePageAutoRefresh-qyIz2rJd.js";var i=8e3,a=3e4;function o(o,s){let{runningItems:c}=n();r(async()=>{s?.enabled&&!s.enabled()||await o(!0)},()=>c.value.length>0?i:a);let l=t(()=>{s?.enabled&&!s.enabled()||o(!1)});e(()=>{l()})}function s(e){return e.replace(/\b\d{1,3}(?:\.\d{1,3}){3}\b/g,`<ip>`).replace(/:\d{2,5}\b/g,`:<port>`).replace(/\/[^\s'"]+/g,`/<path>`).replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi,`<uuid>`).replace(/\s+/g,` `).trim()}function c(e){let t=e.trim();return!t||t===`—`?`未知错误`:s(t.split(`
|
||||
`)[0]?.trim()||t).slice(0,200)||`未知错误`}function l(e){let t=new Map;for(let n of e){if(!n.failed)continue;let e=c(n.summary),r=t.get(e);r?r.push(n):t.set(e,[n])}return[...t.entries()].map(([e,t])=>({errorKey:e,rows:t.sort((e,t)=>e.serverName.localeCompare(t.serverName,`zh`)),count:t.length})).sort((e,t)=>t.count-e.count||e.errorKey.localeCompare(t.errorKey,`zh`))}export{o as n,l as t};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{p as e}from"./initMonaco-CbTFLcUb.js";var t=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`menuitem`,`meta`,`param`,`source`,`track`,`wbr`],n={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,comments:{blockComment:[`<!--`,`-->`]},brackets:[[`<!--`,`-->`],[`<`,`>`],[`{`,`}`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`<`,close:`>`}],onEnterRules:[{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}],folding:{markers:{start:RegExp(`^\\s*<!--\\s*#region\\b.*-->`),end:RegExp(`^\\s*<!--\\s*#endregion\\b.*-->`)}}},r={defaultToken:``,tokenPostfix:`.html`,ignoreCase:!0,tokenizer:{root:[[/<!DOCTYPE/,`metatag`,`@doctype`],[/<!--/,`comment`,`@comment`],[/(<)((?:[\w\-]+:)?[\w\-]+)(\s*)(\/>)/,[`delimiter`,`tag`,``,`delimiter`]],[/(<)(script)/,[`delimiter`,{token:`tag`,next:`@script`}]],[/(<)(style)/,[`delimiter`,{token:`tag`,next:`@style`}]],[/(<)((?:[\w\-]+:)?[\w\-]+)/,[`delimiter`,{token:`tag`,next:`@otherTag`}]],[/(<\/)((?:[\w\-]+:)?[\w\-]+)/,[`delimiter`,{token:`tag`,next:`@otherTag`}]],[/</,`delimiter`],[/[^<]+/]],doctype:[[/[^>]+/,`metatag.content`],[/>/,`metatag`,`@pop`]],comment:[[/-->/,`comment`,`@pop`],[/[^-]+/,`comment.content`],[/./,`comment.content`]],otherTag:[[/\/?>/,`delimiter`,`@pop`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/]],script:[[/type/,`attribute.name`,`@scriptAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/(<\/)(script\s*)(>)/,[`delimiter`,`tag`,{token:`delimiter`,next:`@pop`}]]],scriptAfterType:[[/=/,`delimiter`,`@scriptAfterTypeEquals`],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptAfterTypeEquals:[[/"module"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.text/javascript`}],[/'module'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.text/javascript`}],[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@scriptWithCustomType.$1`}],[/>/,{token:`delimiter`,next:`@scriptEmbedded`,nextEmbedded:`text/javascript`}],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptWithCustomType:[[/>/,{token:`delimiter`,next:`@scriptEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/script\s*>/,{token:`@rematch`,next:`@pop`}]],scriptEmbedded:[[/<\/script/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}],[/[^<]+/,``]],style:[[/type/,`attribute.name`,`@styleAfterType`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/(<\/)(style\s*)(>)/,[`delimiter`,`tag`,{token:`delimiter`,next:`@pop`}]]],styleAfterType:[[/=/,`delimiter`,`@styleAfterTypeEquals`],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleAfterTypeEquals:[[/"([^"]*)"/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/'([^']*)'/,{token:`attribute.value`,switchTo:`@styleWithCustomType.$1`}],[/>/,{token:`delimiter`,next:`@styleEmbedded`,nextEmbedded:`text/css`}],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleWithCustomType:[[/>/,{token:`delimiter`,next:`@styleEmbedded.$S2`,nextEmbedded:`$S2`}],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/],[/<\/style\s*>/,{token:`@rematch`,next:`@pop`}]],styleEmbedded:[[/<\/style/,{token:`@rematch`,next:`@pop`,nextEmbedded:`@pop`}],[/[^<]+/,``]]}};export{n as conf,r as language};
|
||||
@@ -0,0 +1 @@
|
||||
import{p as e,s as t}from"./initMonaco-CbTFLcUb.js";import{_ as n,a as r,c as i,d as a,f as o,g as s,h as c,i as l,l as u,m as d,n as f,o as p,p as m,r as h,s as g,t as _,u as v,v as y}from"./lspLanguageFeatures-CrPR27dq.js";var b=120*1e3,x=class{constructor(e){this._defaults=e,this._worker=null,this._client=null,this._idleCheckInterval=window.setInterval(()=>this._checkIfIdle(),30*1e3),this._lastUsedTime=0,this._configChangeListener=this._defaults.onDidChange(()=>this._stopWorker())}_stopWorker(){this._worker&&=(this._worker.dispose(),null),this._client=null}dispose(){clearInterval(this._idleCheckInterval),this._configChangeListener.dispose(),this._stopWorker()}_checkIfIdle(){this._worker&&Date.now()-this._lastUsedTime>b&&this._stopWorker()}_getClient(){return this._lastUsedTime=Date.now(),this._client||=(this._worker=t({moduleId:`vs/language/html/htmlWorker`,createWorker:()=>new Worker(new URL(`/app/assets/html.worker-BO6WuOEO.js`,``+import.meta.url),{type:`module`}),createData:{languageSettings:this._defaults.options,languageId:this._defaults.languageId},label:this._defaults.languageId}),this._worker.getProxy()),this._client}getLanguageServiceWorker(...e){let t;return this._getClient().then(e=>{t=e}).then(t=>{if(this._worker)return this._worker.withSyncedResources(e)}).then(e=>t)}},S=class extends _{constructor(e){super(e,[`.`,`:`,`<`,`"`,`=`,`/`])}};function C(t){let n=new x(t),o=(...e)=>n.getLanguageServiceWorker(...e),s=t.languageId;e.registerCompletionItemProvider(s,new S(o)),e.registerHoverProvider(s,new a(o)),e.registerDocumentHighlightProvider(s,new p(o)),e.registerLinkProvider(s,new g(o)),e.registerFoldingRangeProvider(s,new v(o)),e.registerDocumentSymbolProvider(s,new u(o)),e.registerSelectionRangeProvider(s,new d(o)),e.registerRenameProvider(s,new m(o)),s===`html`&&(e.registerDocumentFormattingEditProvider(s,new r(o)),e.registerDocumentRangeFormattingEditProvider(s,new i(o)))}function w(t){let n=[],o=[],s=new x(t);n.push(s);let c=(...e)=>s.getLanguageServiceWorker(...e);function l(){let{languageId:n,modeConfiguration:s}=t;E(o),s.completionItems&&o.push(e.registerCompletionItemProvider(n,new S(c))),s.hovers&&o.push(e.registerHoverProvider(n,new a(c))),s.documentHighlights&&o.push(e.registerDocumentHighlightProvider(n,new p(c))),s.links&&o.push(e.registerLinkProvider(n,new g(c))),s.documentSymbols&&o.push(e.registerDocumentSymbolProvider(n,new u(c))),s.rename&&o.push(e.registerRenameProvider(n,new m(c))),s.foldingRanges&&o.push(e.registerFoldingRangeProvider(n,new v(c))),s.selectionRanges&&o.push(e.registerSelectionRangeProvider(n,new d(c))),s.documentFormattingEdits&&o.push(e.registerDocumentFormattingEditProvider(n,new r(c))),s.documentRangeFormattingEdits&&o.push(e.registerDocumentRangeFormattingEditProvider(n,new i(c)))}return l(),n.push(T(o)),T(n)}function T(e){return{dispose:()=>E(e)}}function E(e){for(;e.length;)e.pop().dispose()}export{_ as CompletionAdapter,f as DefinitionAdapter,h as DiagnosticsAdapter,l as DocumentColorAdapter,r as DocumentFormattingEditProvider,p as DocumentHighlightAdapter,g as DocumentLinkAdapter,i as DocumentRangeFormattingEditProvider,u as DocumentSymbolAdapter,v as FoldingRangeAdapter,a as HoverAdapter,o as ReferenceAdapter,m as RenameAdapter,d as SelectionRangeAdapter,x as WorkerManager,c as fromPosition,s as fromRange,w as setupMode,C as setupMode1,n as toRange,y as toTextEdit};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{conf as e,language as t}from"./typescript-D5WOfyfO.js";var n=e,r={defaultToken:`invalid`,tokenPostfix:`.js`,keywords:`break.case.catch.class.continue.const.constructor.debugger.default.delete.do.else.export.extends.false.finally.for.from.function.get.if.import.in.instanceof.let.new.null.return.set.static.super.switch.symbol.this.throw.true.try.typeof.undefined.var.void.while.with.yield.async.await.of`.split(`.`),typeKeywords:[],operators:t.operators,symbols:t.symbols,escapes:t.escapes,digits:t.digits,octaldigits:t.octaldigits,binarydigits:t.binarydigits,hexdigits:t.hexdigits,regexpctl:t.regexpctl,regexpesc:t.regexpesc,tokenizer:t.tokenizer};export{n as conf,r as language};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{p as e}from"./initMonaco-CbTFLcUb.js";var t=[`area`,`base`,`br`,`col`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`menuitem`,`meta`,`param`,`source`,`track`,`wbr`],n={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\$\^\&\*\(\)\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\s]+)/g,brackets:[[`<!--`,`-->`],[`<`,`>`],[`{{`,`}}`],[`{%`,`%}`],[`{`,`}`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`%`,close:`%`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`<`,close:`>`},{open:`"`,close:`"`},{open:`'`,close:`'`}],onEnterRules:[{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/(\w[\w\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(?!(?:${t.join(`|`)}))(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}]},r={defaultToken:``,tokenPostfix:``,builtinTags:`if.else.elseif.endif.render.assign.capture.endcapture.case.endcase.comment.endcomment.cycle.decrement.for.endfor.include.increment.layout.raw.endraw.render.tablerow.endtablerow.unless.endunless`.split(`.`),builtinFilters:`abs.append.at_least.at_most.capitalize.ceil.compact.date.default.divided_by.downcase.escape.escape_once.first.floor.join.json.last.lstrip.map.minus.modulo.newline_to_br.plus.prepend.remove.remove_first.replace.replace_first.reverse.round.rstrip.size.slice.sort.sort_natural.split.strip.strip_html.strip_newlines.times.truncate.truncatewords.uniq.upcase.url_decode.url_encode.where`.split(`.`),constants:[`true`,`false`],operators:[`==`,`!=`,`>`,`<`,`>=`,`<=`],symbol:/[=><!]+/,identifier:/[a-zA-Z_][\w]*/,tokenizer:{root:[[/\{\%\s*comment\s*\%\}/,`comment.start.liquid`,`@comment`],[/\{\{/,{token:`@rematch`,switchTo:`@liquidState.root`}],[/\{\%/,{token:`@rematch`,switchTo:`@liquidState.root`}],[/(<)([\w\-]+)(\/>)/,[`delimiter.html`,`tag.html`,`delimiter.html`]],[/(<)([:\w]+)/,[`delimiter.html`,{token:`tag.html`,next:`@otherTag`}]],[/(<\/)([\w\-]+)/,[`delimiter.html`,{token:`tag.html`,next:`@otherTag`}]],[/</,`delimiter.html`],[/\{/,`delimiter.html`],[/[^<{]+/]],comment:[[/\{\%\s*endcomment\s*\%\}/,`comment.end.liquid`,`@pop`],[/./,`comment.content.liquid`]],otherTag:[[/\{\{/,{token:`@rematch`,switchTo:`@liquidState.otherTag`}],[/\{\%/,{token:`@rematch`,switchTo:`@liquidState.otherTag`}],[/\/?>/,`delimiter.html`,`@pop`],[/"([^"]*)"/,`attribute.value`],[/'([^']*)'/,`attribute.value`],[/[\w\-]+/,`attribute.name`],[/=/,`delimiter`],[/[ \t\r\n]+/]],liquidState:[[/\{\{/,`delimiter.output.liquid`],[/\}\}/,{token:`delimiter.output.liquid`,switchTo:`@$S2.$S3`}],[/\{\%/,`delimiter.tag.liquid`],[/raw\s*\%\}/,`delimiter.tag.liquid`,`@liquidRaw`],[/\%\}/,{token:`delimiter.tag.liquid`,switchTo:`@$S2.$S3`}],{include:`liquidRoot`}],liquidRaw:[[/^(?!\{\%\s*endraw\s*\%\}).+/],[/\{\%/,`delimiter.tag.liquid`],[/@identifier/],[/\%\}/,{token:`delimiter.tag.liquid`,next:`@root`}]],liquidRoot:[[/\d+(\.\d+)?/,`number.liquid`],[/"[^"]*"/,`string.liquid`],[/'[^']*'/,`string.liquid`],[/\s+/],[/@symbol/,{cases:{"@operators":`operator.liquid`,"@default":``}}],[/\./],[/@identifier/,{cases:{"@constants":`keyword.liquid`,"@builtinFilters":`predefined.liquid`,"@builtinTags":`predefined.liquid`,"@default":`variable.liquid`}}],[/[^}|%]/,`variable.liquid`]]}};export{n as conf,r as language};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{p as e}from"./initMonaco-CbTFLcUb.js";var t={comments:{blockComment:[`{/*`,`*/}`]},brackets:[[`{`,`}`]],autoClosingPairs:[{open:`"`,close:`"`},{open:`'`,close:`'`},{open:`“`,close:`”`},{open:`‘`,close:`’`},{open:"`",close:"`"},{open:`{`,close:`}`},{open:`(`,close:`)`},{open:`_`,close:`_`},{open:`**`,close:`**`},{open:`<`,close:`>`}],onEnterRules:[{beforeText:/^\s*- .+/,action:{indentAction:e.IndentAction.None,appendText:`- `}},{beforeText:/^\s*\+ .+/,action:{indentAction:e.IndentAction.None,appendText:`+ `}},{beforeText:/^\s*\* .+/,action:{indentAction:e.IndentAction.None,appendText:`* `}},{beforeText:/^> /,action:{indentAction:e.IndentAction.None,appendText:`> `}},{beforeText:/<\w+/,action:{indentAction:e.IndentAction.Indent}},{beforeText:/\s+>\s*$/,action:{indentAction:e.IndentAction.Indent}},{beforeText:/<\/\w+>/,action:{indentAction:e.IndentAction.Outdent}},...Array.from({length:100},(t,n)=>({beforeText:RegExp(`^${n}\\. .+`),action:{indentAction:e.IndentAction.None,appendText:`${n+1}. `}}))]},n={defaultToken:``,tokenPostfix:`.mdx`,control:/[!#()*+.[\\\]_`{}\-]/,escapes:/\\@control/,tokenizer:{root:[[/^---$/,{token:`meta.content`,next:`@frontmatter`,nextEmbedded:`yaml`}],[/^\s*import/,{token:`keyword`,next:`@import`,nextEmbedded:`js`}],[/^\s*export/,{token:`keyword`,next:`@export`,nextEmbedded:`js`}],[/<\w+/,{token:`type.identifier`,next:`@jsx`}],[/<\/?\w+>/,`type.identifier`],[/^(\s*)(>*\s*)(#{1,6}\s)/,[{token:`white`},{token:`comment`},{token:`keyword`,next:`@header`}]],[/^(\s*)(>*\s*)([*+-])(\s+)/,[`white`,`comment`,`keyword`,`white`]],[/^(\s*)(>*\s*)(\d{1,9}\.)(\s+)/,[`white`,`comment`,`number`,`white`]],[/^(\s*)(>*\s*)(\d{1,9}\.)(\s+)/,[`white`,`comment`,`number`,`white`]],[/^(\s*)(>*\s*)(-{3,}|\*{3,}|_{3,})$/,[`white`,`comment`,`keyword`]],[/`{3,}(\s.*)?$/,{token:`string`,next:`@codeblock_backtick`}],[/~{3,}(\s.*)?$/,{token:`string`,next:`@codeblock_tilde`}],[/`{3,}(\S+).*$/,{token:`string`,next:`@codeblock_highlight_backtick`,nextEmbedded:`$1`}],[/~{3,}(\S+).*$/,{token:`string`,next:`@codeblock_highlight_tilde`,nextEmbedded:`$1`}],[/^(\s*)(-{4,})$/,[`white`,`comment`]],[/^(\s*)(>+)/,[`white`,`comment`]],{include:`content`}],content:[[/(\[)(.+)(]\()(.+)(\s+".*")(\))/,[``,`string.link`,``,`type.identifier`,`string.link`,``]],[/(\[)(.+)(]\()(.+)(\))/,[``,`type.identifier`,``,`string.link`,``]],[/(\[)(.+)(]\[)(.+)(])/,[``,`type.identifier`,``,`type.identifier`,``]],[/(\[)(.+)(]:\s+)(\S*)/,[``,`type.identifier`,``,`string.link`]],[/(\[)(.+)(])/,[``,`type.identifier`,``]],[/`.*`/,`variable.source`],[/_/,{token:`emphasis`,next:`@emphasis_underscore`}],[/\*(?!\*)/,{token:`emphasis`,next:`@emphasis_asterisk`}],[/\*\*/,{token:`strong`,next:`@strong`}],[/{/,{token:`delimiter.bracket`,next:`@expression`,nextEmbedded:`js`}]],import:[[/'\s*(;|$)/,{token:`string`,next:`@pop`,nextEmbedded:`@pop`}]],expression:[[/{/,{token:`delimiter.bracket`,next:`@expression`}],[/}/,{token:`delimiter.bracket`,next:`@pop`,nextEmbedded:`@pop`}]],export:[[/^\s*$/,{token:`delimiter.bracket`,next:`@pop`,nextEmbedded:`@pop`}]],jsx:[[/\s+/,``],[/(\w+)(=)("(?:[^"\\]|\\.)*")/,[`attribute.name`,`operator`,`string`]],[/(\w+)(=)('(?:[^'\\]|\\.)*')/,[`attribute.name`,`operator`,`string`]],[/(\w+(?=\s|>|={|$))/,[`attribute.name`]],[/={/,{token:`delimiter.bracket`,next:`@expression`,nextEmbedded:`js`}],[/>/,{token:`type.identifier`,next:`@pop`}]],header:[[/.$/,{token:`keyword`,next:`@pop`}],{include:`content`},[/./,{token:`keyword`}]],strong:[[/\*\*/,{token:`strong`,next:`@pop`}],{include:`content`},[/./,{token:`strong`}]],emphasis_underscore:[[/_/,{token:`emphasis`,next:`@pop`}],{include:`content`},[/./,{token:`emphasis`}]],emphasis_asterisk:[[/\*(?!\*)/,{token:`emphasis`,next:`@pop`}],{include:`content`},[/./,{token:`emphasis`}]],frontmatter:[[/^---$/,{token:`meta.content`,nextEmbedded:`@pop`,next:`@pop`}]],codeblock_highlight_backtick:[[/\s*`{3,}\s*$/,{token:`string`,next:`@pop`,nextEmbedded:`@pop`}],[/.*$/,`variable.source`]],codeblock_highlight_tilde:[[/\s*~{3,}\s*$/,{token:`string`,next:`@pop`,nextEmbedded:`@pop`}],[/.*$/,`variable.source`]],codeblock_backtick:[[/\s*`{3,}\s*$/,{token:`string`,next:`@pop`}],[/.*$/,`variable.source`]],codeblock_tilde:[[/\s*~{3,}\s*$/,{token:`string`,next:`@pop`}],[/.*$/,`variable.source`]]}};export{t as conf,n as language};
|
||||
@@ -0,0 +1 @@
|
||||
import{Zt as e}from"./index-C6qJAv49.js";var t=200;async function n(n,r,i,a){if(a!==-1){let t=await e.get(n,{...r,page:i,per_page:a});return{items:t.items||[],total:t.total??0}}let o=[],s=1,c=1,l=0;do{let i=await e.get(n,{...r,page:s,per_page:t});o.push(...i.items||[]),l=i.total??o.length,c=i.pages??1,s+=1}while(s<=c);return{items:o,total:l}}async function r(e,n,r){if(r!==-1)return e(r,(n-1)*r);let i=[],a=0,o=0;do{let n=await e(t,a);if(i.push(...n.items||[]),o=n.total??i.length,!n.items.length||i.length>=o)break;a+=t}while(!0);return{items:i,total:o}}export{n,r as t};
|
||||
@@ -0,0 +1 @@
|
||||
import{p as e}from"./initMonaco-CbTFLcUb.js";var t={comments:{lineComment:`#`,blockComment:[`'''`,`'''`]},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`,notIn:[`string`]},{open:`'`,close:`'`,notIn:[`string`,`comment`]}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],onEnterRules:[{beforeText:RegExp(`^\\s*(?:def|class|for|if|elif|else|while|try|with|finally|except|async|match|case).*?:\\s*$`),action:{indentAction:e.IndentAction.Indent}}],folding:{offSide:!0,markers:{start:RegExp(`^\\s*#region\\b`),end:RegExp(`^\\s*#endregion\\b`)}}},n={defaultToken:``,tokenPostfix:`.python`,keywords:`False.None.True._.and.as.assert.async.await.break.case.class.continue.def.del.elif.else.except.exec.finally.for.from.global.if.import.in.is.lambda.match.nonlocal.not.or.pass.print.raise.return.try.type.while.with.yield.int.float.long.complex.hex.abs.all.any.apply.basestring.bin.bool.buffer.bytearray.callable.chr.classmethod.cmp.coerce.compile.complex.delattr.dict.dir.divmod.enumerate.eval.execfile.file.filter.format.frozenset.getattr.globals.hasattr.hash.help.id.input.intern.isinstance.issubclass.iter.len.locals.list.map.max.memoryview.min.next.object.oct.open.ord.pow.print.property.reversed.range.raw_input.reduce.reload.repr.reversed.round.self.set.setattr.slice.sorted.staticmethod.str.sum.super.tuple.type.unichr.unicode.vars.xrange.zip.__dict__.__methods__.__members__.__class__.__bases__.__name__.__mro__.__subclasses__.__init__.__import__`.split(`.`),brackets:[{open:`{`,close:`}`,token:`delimiter.curly`},{open:`[`,close:`]`,token:`delimiter.bracket`},{open:`(`,close:`)`,token:`delimiter.parenthesis`}],tokenizer:{root:[{include:`@whitespace`},{include:`@numbers`},{include:`@strings`},[/[,:;]/,`delimiter`],[/[{}\[\]()]/,`@brackets`],[/@[a-zA-Z_]\w*/,`tag`],[/[a-zA-Z_]\w*/,{cases:{"@keywords":`keyword`,"@default":`identifier`}}]],whitespace:[[/\s+/,`white`],[/(^#.*$)/,`comment`],[/'''/,`string`,`@endDocString`],[/"""/,`string`,`@endDblDocString`]],endDocString:[[/[^']+/,`string`],[/\\'/,`string`],[/'''/,`string`,`@popall`],[/'/,`string`]],endDblDocString:[[/[^"]+/,`string`],[/\\"/,`string`],[/"""/,`string`,`@popall`],[/"/,`string`]],numbers:[[/-?0x([abcdef]|[ABCDEF]|\d)+[lL]?/,`number.hex`],[/-?(\d*\.)?\d+([eE][+\-]?\d+)?[jJ]?[lL]?/,`number`]],strings:[[/'$/,`string.escape`,`@popall`],[/f'{1,3}/,`string.escape`,`@fStringBody`],[/'/,`string.escape`,`@stringBody`],[/"$/,`string.escape`,`@popall`],[/f"{1,3}/,`string.escape`,`@fDblStringBody`],[/"/,`string.escape`,`@dblStringBody`]],fStringBody:[[/[^\\'\{\}]+$/,`string`,`@popall`],[/[^\\'\{\}]+/,`string`],[/\{[^\}':!=]+/,`identifier`,`@fStringDetail`],[/\\./,`string`],[/'/,`string.escape`,`@popall`],[/\\$/,`string`]],stringBody:[[/[^\\']+$/,`string`,`@popall`],[/[^\\']+/,`string`],[/\\./,`string`],[/'/,`string.escape`,`@popall`],[/\\$/,`string`]],fDblStringBody:[[/[^\\"\{\}]+$/,`string`,`@popall`],[/[^\\"\{\}]+/,`string`],[/\{[^\}':!=]+/,`identifier`,`@fStringDetail`],[/\\./,`string`],[/"/,`string.escape`,`@popall`],[/\\$/,`string`]],dblStringBody:[[/[^\\"]+$/,`string`,`@popall`],[/[^\\"]+/,`string`],[/\\./,`string`],[/"/,`string.escape`,`@popall`],[/\\$/,`string`]],fStringDetail:[[/[:][^}]+/,`string`],[/[!][ars]/,`string`],[/=/,`string`],[/\}/,`identifier`,`@pop`]]}};export{t as conf,n as language};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
import{p as e}from"./initMonaco-CbTFLcUb.js";var t={wordPattern:/(-?\d*\.\d\w*)|([^\`\~\!\@\#\%\^\&\*\(\)\-\=\+\[\{\]\}\\\|\;\:\'\"\,\.\<\>\/\?\s]+)/g,comments:{lineComment:`//`,blockComment:[`/*`,`*/`]},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],onEnterRules:[{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,afterText:/^\s*\*\/$/,action:{indentAction:e.IndentAction.IndentOutdent,appendText:` * `}},{beforeText:/^\s*\/\*\*(?!\/)([^\*]|\*(?!\/))*$/,action:{indentAction:e.IndentAction.None,appendText:` * `}},{beforeText:/^(\t|(\ \ ))*\ \*(\ ([^\*]|\*(?!\/))*)?$/,action:{indentAction:e.IndentAction.None,appendText:`* `}},{beforeText:/^(\t|(\ \ ))*\ \*\/\s*$/,action:{indentAction:e.IndentAction.None,removeText:1}}],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`,notIn:[`string`]},{open:`'`,close:`'`,notIn:[`string`,`comment`]},{open:"`",close:"`",notIn:[`string`,`comment`]},{open:`/**`,close:` */`,notIn:[`string`]}],folding:{markers:{start:RegExp(`^\\s*//\\s*#?region\\b`),end:RegExp(`^\\s*//\\s*#?endregion\\b`)}}},n={defaultToken:`invalid`,tokenPostfix:`.ts`,keywords:`abstract.any.as.asserts.bigint.boolean.break.case.catch.class.continue.const.constructor.debugger.declare.default.delete.do.else.enum.export.extends.false.finally.for.from.function.get.if.implements.import.in.infer.instanceof.interface.is.keyof.let.module.namespace.never.new.null.number.object.out.package.private.protected.public.override.readonly.require.global.return.satisfies.set.static.string.super.switch.symbol.this.throw.true.try.type.typeof.undefined.unique.unknown.var.void.while.with.yield.async.await.of`.split(`.`),operators:`<=.>=.==.!=.===.!==.=>.+.-.**.*./.%.++.--.<<.</.>>.>>>.&.|.^.!.~.&&.||.??.?.:.=.+=.-=.*=.**=./=.%=.<<=.>>=.>>>=.&=.|=.^=.@`.split(`.`),symbols:/[=><!~?:&|+\-*\/\^%]+/,escapes:/\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,digits:/\d+(_+\d+)*/,octaldigits:/[0-7]+(_+[0-7]+)*/,binarydigits:/[0-1]+(_+[0-1]+)*/,hexdigits:/[[0-9a-fA-F]+(_+[0-9a-fA-F]+)*/,regexpctl:/[(){}\[\]\$\^|\-*+?\.]/,regexpesc:/\\(?:[bBdDfnrstvwWn0\\\/]|@regexpctl|c[A-Z]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4})/,tokenizer:{root:[[/[{}]/,`delimiter.bracket`],{include:`common`}],common:[[/#?[a-z_$][\w$]*/,{cases:{"@keywords":`keyword`,"@default":`identifier`}}],[/[A-Z][\w\$]*/,`type.identifier`],{include:`@whitespace`},[/\/(?=([^\\\/]|\\.)+\/([dgimsuy]*)(\s*)(\.|;|,|\)|\]|\}|$))/,{token:`regexp`,bracket:`@open`,next:`@regexp`}],[/[()\[\]]/,`@brackets`],[/[<>](?!@symbols)/,`@brackets`],[/!(?=([^=]|$))/,`delimiter`],[/@symbols/,{cases:{"@operators":`delimiter`,"@default":``}}],[/(@digits)[eE]([\-+]?(@digits))?/,`number.float`],[/(@digits)\.(@digits)([eE][\-+]?(@digits))?/,`number.float`],[/0[xX](@hexdigits)n?/,`number.hex`],[/0[oO]?(@octaldigits)n?/,`number.octal`],[/0[bB](@binarydigits)n?/,`number.binary`],[/(@digits)n?/,`number`],[/[;,.]/,`delimiter`],[/"([^"\\]|\\.)*$/,`string.invalid`],[/'([^'\\]|\\.)*$/,`string.invalid`],[/"/,`string`,`@string_double`],[/'/,`string`,`@string_single`],[/`/,`string`,`@string_backtick`]],whitespace:[[/[ \t\r\n]+/,``],[/\/\*\*(?!\/)/,`comment.doc`,`@jsdoc`],[/\/\*/,`comment`,`@comment`],[/\/\/.*$/,`comment`]],comment:[[/[^\/*]+/,`comment`],[/\*\//,`comment`,`@pop`],[/[\/*]/,`comment`]],jsdoc:[[/[^\/*]+/,`comment.doc`],[/\*\//,`comment.doc`,`@pop`],[/[\/*]/,`comment.doc`]],regexp:[[/(\{)(\d+(?:,\d*)?)(\})/,[`regexp.escape.control`,`regexp.escape.control`,`regexp.escape.control`]],[/(\[)(\^?)(?=(?:[^\]\\\/]|\\.)+)/,[`regexp.escape.control`,{token:`regexp.escape.control`,next:`@regexrange`}]],[/(\()(\?:|\?=|\?!)/,[`regexp.escape.control`,`regexp.escape.control`]],[/[()]/,`regexp.escape.control`],[/@regexpctl/,`regexp.escape.control`],[/[^\\\/]/,`regexp`],[/@regexpesc/,`regexp.escape`],[/\\\./,`regexp.invalid`],[/(\/)([dgimsuy]*)/,[{token:`regexp`,bracket:`@close`,next:`@pop`},`keyword.other`]]],regexrange:[[/-/,`regexp.escape.control`],[/\^/,`regexp.invalid`],[/@regexpesc/,`regexp.escape`],[/[^\]]/,`regexp`],[/\]/,{token:`regexp.escape.control`,next:`@pop`,bracket:`@close`}]],string_double:[[/[^\\"]+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/"/,`string`,`@pop`]],string_single:[[/[^\\']+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/'/,`string`,`@pop`]],string_backtick:[[/\$\{/,{token:`delimiter.bracket`,next:`@bracketCounting`}],[/[^\\`$]+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/`/,`string`,`@pop`]],bracketCounting:[[/\{/,`delimiter.bracket`,`@bracketCounting`],[/\}/,`delimiter.bracket`,`@pop`],{include:`common`}]}};export{t as conf,n as language};
|
||||
@@ -0,0 +1 @@
|
||||
import{Cr as e,Tr as t}from"./index-C6qJAv49.js";function n(n,r,i={}){let{pauseWhenHidden:a=!0,immediate:o=!1}=i,s=null,c=!1,l=!1;function u(){let e=typeof r==`function`?r():r;return Math.max(1e3,e)}function d(){s&&=(clearTimeout(s),null)}function f(){d(),!c&&(s=setTimeout(()=>{p()},u()))}async function p(){if(!c){if(a&&document.visibilityState===`hidden`){f();return}if(l){f();return}l=!0;try{await n()}finally{l=!1,f()}}}function m(){c||!a||document.visibilityState===`visible`&&p()}return t(()=>{o?p():f(),a&&document.addEventListener(`visibilitychange`,m)}),e(()=>{c=!0,d(),a&&document.removeEventListener(`visibilitychange`,m)}),{refresh:p,stop:()=>{c=!0,d()}}}export{n as t};
|
||||
@@ -0,0 +1 @@
|
||||
import{Ur as e,Zt as t}from"./index-C6qJAv49.js";function n(e){return e===`uncategorized`?`未分类`:e}function r(){let r=e([]),i=e(!1),a=e(0);async function o(){i.value=!0;try{let e=(await t.get(`/servers/categories`)).categories||[];a.value=e.reduce((e,t)=>e+(t.count||0),0),r.value=e.map(e=>({name:e.name,label:n(e.name),count:e.count})).sort((e,t)=>e.name===`uncategorized`?1:t.name===`uncategorized`?-1:e.label.localeCompare(t.label,`zh`))}catch{r.value=[],a.value=0}finally{i.value=!1}}return{categories:r,loading:i,totalCount:a,loadCategories:o}}export{r as n,n as t};
|
||||
@@ -0,0 +1 @@
|
||||
import{_ as e}from"./VSelect-Dy1HeCdk.js";import{Ur as t,Zt as n}from"./index-C6qJAv49.js";import{t as r}from"./apiError-DukIeo5O.js";function i(){let i=t([]),a=t(!1),o=e();async function s(e){a.value=!0;try{let t=e?.perPage??200;if(!e?.all){i.value=(await n.getList(`/servers/`,{per_page:t})).items;return}let r=[],a=1,o=1;do{let e=await n.get(`/servers/`,{page:a,per_page:t});r.push(...e.items||[]),o=e.pages??1,a+=1}while(a<=o);i.value=r}catch(e){i.value=[],o(r(e,`加载服务器列表失败`),`error`)}finally{a.value=!1}}return{servers:i,loading:a,loadServers:s}}export{i as t};
|
||||
@@ -0,0 +1,2 @@
|
||||
import{Dr as e,Sr as t,Ur as n,Zr as r,Zt as i,_r as a,dr as o,fr as s,jr as c,lr as l,pr as u}from"./index-C6qJAv49.js";import{t as d}from"./_plugin-vue_export-helper-BDNMzG2s.js";var f=new Set(`if.then.else.elif.fi.for.while.do.done.case.esac.in.function.return.break.continue.select.until.cd.ls.grep.egrep.fgrep.find.cat.chmod.chown.docker.podman.kubectl.apt.apt-get.yum.dnf.apk.pip.pip3.npm.npx.ssh.scp.rsync.curl.wget.tar.gzip.gunzip.kill.ps.top.htop.nano.vim.vi.journalctl.systemctl.service.supervisorctl.crontab.nginx.df.du.free.mount.uname.hostname.whoami.id.pwd.head.tail.wc.sort.uniq.awk.sed.cut.tr.xargs.tee.netstat.ss.ip.ping.dig.git.make.nohup.timeout.watch`.split(`.`)),p=new Set([`echo`,`printf`,`test`,`read`,`pushd`,`popd`,`exit`,`set`,`unset`,`export`,`source`,`alias`,`type`,`command`,`hash`,`help`,`history`]);function m(e){return e===`sudo`?`sudo`:f.has(e)?`keyword`:p.has(e)?`builtin`:/^[/~]/.test(e)||e.startsWith(`./`)||e.startsWith(`../`)?`path`:/^\d+(?:\.\d+)?$/.test(e)?`number`:`text`}function h(e){let t=[],n=0;for(;n<e.length;){let r=e[n];if(r===`#`){let r=n+1;for(;r<e.length&&e[r]!==`
|
||||
`;)r++;t.push({type:`comment`,value:e.slice(n,r)}),n=r;continue}if(r===`'`||r===`"`){let i=r,a=n+1;for(;a<e.length;){if(e[a]===`\\`&&i===`"`){a+=2;continue}if(e[a]===i){a++;break}a++}t.push({type:`string`,value:e.slice(n,a)}),n=a;continue}if(r==="`"){let r=n+1;for(;r<e.length&&e[r]!=="`";)r++;r<e.length&&r++,t.push({type:`backtick`,value:e.slice(n,r)}),n=r;continue}if(r===`$`){let r=n+1;if(e[r]===`{`){for(;r<e.length&&e[r]!==`}`;)r++;r<e.length&&r++}else if(e[r]===`(`)r++;else for(;r<e.length&&/[\w]/.test(e[r]);)r++;t.push({type:`variable`,value:e.slice(n,r)}),n=r;continue}if(r===`|`||r===`&`||r===`;`){let r=n;e[r]===`|`&&e[r+1]===`|`||e[r]===`&`&&e[r+1]===`&`?r+=2:r+=1;let i=e.slice(n,r);t.push({type:i===`|`||i===`||`?`pipe`:`operator`,value:i}),n=r;continue}if(r===`>`||r===`<`){let r=n;e[r]===`>`&&e[r+1]===`>`||e[r]===`<`&&e[r+1]===`<`?r+=2:r+=1,e[r]===`&`&&r++,t.push({type:`redirect`,value:e.slice(n,r)}),n=r;continue}if(/\s/.test(r)){let r=n;for(;r<e.length&&/\s/.test(e[r]);)r++;t.push({type:`text`,value:e.slice(n,r)}),n=r;continue}if(r===`-`&&e[n+1]===`-`){let r=n+2;for(;r<e.length&&/[\w-]/.test(e[r]);)r++;t.push({type:`flag`,value:e.slice(n,r)}),n=r;continue}if(r===`-`&&/[a-zA-Z]/.test(e[n+1]||``)){let r=n+1;for(;r<e.length&&/[a-zA-Z]/.test(e[r]);)r++;t.push({type:`flag`,value:e.slice(n,r)}),n=r;continue}let i=n;for(;i<e.length&&!/[\s#"'`$|;&<>]/.test(e[i]);)i++;let a=e.slice(n,i);t.push({type:m(a),value:a}),n=i}return t}function g(e){return e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`)}var _={keyword:`sh-keyword`,builtin:`sh-builtin`,sudo:`sh-sudo`,pipe:`sh-pipe`,operator:`sh-operator`,redirect:`sh-redirect`,string:`sh-string`,flag:`sh-flag`,variable:`sh-variable`,backtick:`sh-backtick`,comment:`sh-comment`,number:`sh-number`,path:`sh-path`,text:`sh-text`};function v(e){return e?h(e).map(e=>`<span class="${_[e.type]}">${g(e.value)}</span>`).join(``):``}var y=[`innerHTML`],b=d(a({__name:`ShellHighlightField`,props:{modelValue:{},placeholder:{default:``},disabled:{type:Boolean,default:!1},multiline:{type:Boolean,default:!1},rows:{default:3},size:{default:`default`}},emits:[`update:modelValue`,`keydown`],setup(i,{expose:a,emit:d}){let f=n(null),p=i,m=d,h=l(()=>v(p.modelValue));function g(e){let t=e.target;m(`update:modelValue`,t.value)}function _(e){m(`keydown`,e)}function b(){return f.value}function x(){f.value?.focus()}function S(){let e=f.value;return e?e.value.substring(e.selectionStart??0,e.selectionEnd??0):``}function C(){let e=f.value;e&&(e.focus(),e.select())}async function w(e){let n=f.value;if(!n)return;let r=n.selectionStart??n.value.length,i=n.selectionEnd??r;m(`update:modelValue`,n.value.slice(0,r)+e+n.value.slice(i)),await t(),n.focus();let a=r+e.length;n.setSelectionRange(a,a)}return a({getInputEl:b,focusInput:x,getSelectionText:S,selectAllInput:C,insertAtSelection:w}),(t,n)=>(e(),u(`div`,{class:r([`sh-field position-relative`,{"sh-field--disabled":i.disabled,"sh-field--empty":!i.modelValue,"sh-field--large":i.size===`large`}])},[i.modelValue?(e(),u(`div`,{key:0,class:r([`sh-field__highlight font-mono`,i.multiline?`sh-field__highlight--multi`:`sh-field__highlight--single`]),"aria-hidden":`true`,innerHTML:h.value},null,10,y)):s(``,!0),(e(),o(c(i.multiline?`textarea`:`input`),{ref_key:`inputRef`,ref:f,value:i.modelValue,placeholder:i.placeholder,disabled:i.disabled,rows:i.multiline?i.rows:void 0,class:r([`sh-field__input font-mono`,i.multiline?`sh-field__input--multi`:`sh-field__input--single`]),spellcheck:`false`,autocomplete:`off`,onInput:g,onKeydown:_},null,40,[`value`,`placeholder`,`disabled`,`rows`,`class`]))],2))}}),[[`__scopeId`,`data-v-b73e3452`]]);function x(e){return[...e].sort((e,t)=>e.is_builtin===t.is_builtin?e.sort_order===t.sort_order?e.id-t.id:e.sort_order-t.sort_order:e.is_builtin?1:-1)}function S(){let e=n([]),t=n(!1);async function r(){t.value=!0;try{e.value=x(await i.get(`/terminal/quick-commands`)||[])}catch{throw e.value=[],Error(`加载快捷命令失败`)}finally{t.value=!1}}async function a(e,t){await i.post(`/terminal/quick-commands`,{name:e.trim(),cmd:t.trim()}),await r()}async function o(e,t,n){await i.put(`/terminal/quick-commands/${e}`,{name:t.trim(),cmd:n.trim()}),await r()}async function s(e){await i.delete(`/terminal/quick-commands/${e}`),await r()}async function c(t){e.value=x((await i.put(`/terminal/quick-commands/reorder`,{ids:t})).items||[])}return{commands:e,loading:t,load:r,create:a,update:o,remove:s,reorder:c,customCommands:()=>e.value.filter(e=>!e.is_builtin),builtinCommands:()=>e.value.filter(e=>e.is_builtin)}}export{S as n,b as r,x as t};
|
||||
@@ -0,0 +1 @@
|
||||
import{p as e}from"./initMonaco-CbTFLcUb.js";var t={comments:{blockComment:[`<!--`,`-->`]},brackets:[[`<`,`>`]],autoClosingPairs:[{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`}],surroundingPairs:[{open:`<`,close:`>`},{open:`'`,close:`'`},{open:`"`,close:`"`}],onEnterRules:[{beforeText:RegExp(`<([_:\\w][_:\\w-.\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),afterText:/^<\/([_:\w][_:\w-.\d]*)\s*>$/i,action:{indentAction:e.IndentAction.IndentOutdent}},{beforeText:RegExp(`<(\\w[\\w\\d]*)([^/>]*(?!/)>)[^<]*$`,`i`),action:{indentAction:e.IndentAction.Indent}}]},n={defaultToken:``,tokenPostfix:`.xml`,ignoreCase:!0,qualifiedName:/(?:[\w\.\-]+:)?[\w\.\-]+/,tokenizer:{root:[[/[^<&]+/,``],{include:`@whitespace`},[/(<)(@qualifiedName)/,[{token:`delimiter`},{token:`tag`,next:`@tag`}]],[/(<\/)(@qualifiedName)(\s*)(>)/,[{token:`delimiter`},{token:`tag`},``,{token:`delimiter`}]],[/(<\?)(@qualifiedName)/,[{token:`delimiter`},{token:`metatag`,next:`@tag`}]],[/(<\!)(@qualifiedName)/,[{token:`delimiter`},{token:`metatag`,next:`@tag`}]],[/<\!\[CDATA\[/,{token:`delimiter.cdata`,next:`@cdata`}],[/&\w+;/,`string.escape`]],cdata:[[/[^\]]+/,``],[/\]\]>/,{token:`delimiter.cdata`,next:`@pop`}],[/\]/,``]],tag:[[/[ \t\r\n]+/,``],[/(@qualifiedName)(\s*=\s*)("[^"]*"|'[^']*')/,[`attribute.name`,``,`attribute.value`]],[/(@qualifiedName)(\s*=\s*)("[^">?\/]*|'[^'>?\/]*)(?=[\?\/]\>)/,[`attribute.name`,``,`attribute.value`]],[/(@qualifiedName)(\s*=\s*)("[^">]*|'[^'>]*)/,[`attribute.name`,``,`attribute.value`]],[/@qualifiedName/,`attribute.name`],[/\?>/,{token:`delimiter`,next:`@pop`}],[/(\/)(>)/,[{token:`tag`},{token:`delimiter`,next:`@pop`}]],[/>/,{token:`delimiter`,next:`@pop`}]],whitespace:[[/[ \t\r\n]+/,``],[/<!--/,{token:`comment`,next:`@comment`}]],comment:[[/[^<\-]+/,`comment.content`],[/-->/,{token:`comment`,next:`@pop`}],[/<!--/,`comment.content.invalid`],[/[<\-]/,`comment.content`]]}};export{t as conf,n as language};
|
||||
@@ -0,0 +1 @@
|
||||
import{p as e}from"./initMonaco-CbTFLcUb.js";var t={comments:{lineComment:`#`},brackets:[[`{`,`}`],[`[`,`]`],[`(`,`)`]],autoClosingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],surroundingPairs:[{open:`{`,close:`}`},{open:`[`,close:`]`},{open:`(`,close:`)`},{open:`"`,close:`"`},{open:`'`,close:`'`}],folding:{offSide:!0},onEnterRules:[{beforeText:/:\s*$/,action:{indentAction:e.IndentAction.Indent}}]},n={tokenPostfix:`.yaml`,brackets:[{token:`delimiter.bracket`,open:`{`,close:`}`},{token:`delimiter.square`,open:`[`,close:`]`}],keywords:[`true`,`True`,`TRUE`,`false`,`False`,`FALSE`,`null`,`Null`,`Null`,`~`],numberInteger:/(?:0|[+-]?[0-9]+)/,numberFloat:/(?:0|[+-]?[0-9]+)(?:\.[0-9]+)?(?:e[-+][1-9][0-9]*)?/,numberOctal:/0o[0-7]+/,numberHex:/0x[0-9a-fA-F]+/,numberInfinity:/[+-]?\.(?:inf|Inf|INF)/,numberNaN:/\.(?:nan|Nan|NAN)/,numberDate:/\d{4}-\d\d-\d\d([Tt ]\d\d:\d\d:\d\d(\.\d+)?(( ?[+-]\d\d?(:\d\d)?)|Z)?)?/,escapes:/\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/,tokenizer:{root:[{include:`@whitespace`},{include:`@comment`},[/%[^ ]+.*$/,`meta.directive`],[/---/,`operators.directivesEnd`],[/\.{3}/,`operators.documentEnd`],[/[-?:](?= )/,`operators`],{include:`@anchor`},{include:`@tagHandle`},{include:`@flowCollections`},{include:`@blockStyle`},[/@numberInteger(?![ \t]*\S+)/,`number`],[/@numberFloat(?![ \t]*\S+)/,`number.float`],[/@numberOctal(?![ \t]*\S+)/,`number.octal`],[/@numberHex(?![ \t]*\S+)/,`number.hex`],[/@numberInfinity(?![ \t]*\S+)/,`number.infinity`],[/@numberNaN(?![ \t]*\S+)/,`number.nan`],[/@numberDate(?![ \t]*\S+)/,`number.date`],[/(".*?"|'.*?'|[^#'"]*?)([ \t]*)(:)( |$)/,[`type`,`white`,`operators`,`white`]],{include:`@flowScalars`},[/.+?(?=(\s+#|$))/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],object:[{include:`@whitespace`},{include:`@comment`},[/\}/,`@brackets`,`@pop`],[/,/,`delimiter.comma`],[/:(?= )/,`operators`],[/(?:".*?"|'.*?'|[^,\{\[]+?)(?=: )/,`type`],{include:`@flowCollections`},{include:`@flowScalars`},{include:`@tagHandle`},{include:`@anchor`},{include:`@flowNumber`},[/[^\},]+/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],array:[{include:`@whitespace`},{include:`@comment`},[/\]/,`@brackets`,`@pop`],[/,/,`delimiter.comma`],{include:`@flowCollections`},{include:`@flowScalars`},{include:`@tagHandle`},{include:`@anchor`},{include:`@flowNumber`},[/[^\],]+/,{cases:{"@keywords":`keyword`,"@default":`string`}}]],multiString:[[/^( +).+$/,`string`,`@multiStringContinued.$1`]],multiStringContinued:[[/^( *).+$/,{cases:{"$1==$S2":`string`,"@default":{token:`@rematch`,next:`@popall`}}}]],whitespace:[[/[ \t\r\n]+/,`white`]],comment:[[/#.*$/,`comment`]],flowCollections:[[/\[/,`@brackets`,`@array`],[/\{/,`@brackets`,`@object`]],flowScalars:[[/"([^"\\]|\\.)*$/,`string.invalid`],[/'([^'\\]|\\.)*$/,`string.invalid`],[/'[^']*'/,`string`],[/"/,`string`,`@doubleQuotedString`]],doubleQuotedString:[[/[^\\"]+/,`string`],[/@escapes/,`string.escape`],[/\\./,`string.escape.invalid`],[/"/,`string`,`@pop`]],blockStyle:[[/[>|][0-9]*[+-]?$/,`operators`,`@multiString`]],flowNumber:[[/@numberInteger(?=[ \t]*[,\]\}])/,`number`],[/@numberFloat(?=[ \t]*[,\]\}])/,`number.float`],[/@numberOctal(?=[ \t]*[,\]\}])/,`number.octal`],[/@numberHex(?=[ \t]*[,\]\}])/,`number.hex`],[/@numberInfinity(?=[ \t]*[,\]\}])/,`number.infinity`],[/@numberNaN(?=[ \t]*[,\]\}])/,`number.nan`],[/@numberDate(?=[ \t]*[,\]\}])/,`number.date`]],tagHandle:[[/\![^ ]*/,`tag`]],anchor:[[/[&*][^ ]+/,`namespace`]]}};export{t as conf,n as language};
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<link rel="icon" href="/app/favicon.ico">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Nexus</title>
|
||||
<script type="module" crossorigin src="/app/assets/index-DC1GUjcg.js"></script>
|
||||
<script type="module" crossorigin src="/app/assets/index-C6qJAv49.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/app/assets/index-CtMY4M9Y.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
Reference in New Issue
Block a user