fix: keep mobile filters compact and visible
Some checks failed
Build and tests / test (push) Has been cancelled
Some checks failed
Build and tests / test (push) Has been cancelled
This commit is contained in:
@@ -3137,18 +3137,18 @@
|
||||
<button type="button" class="btn btn-secondary share-refresh-btn" @click="refreshShareResources" aria-label="刷新分享资源">
|
||||
<i class="fas fa-sync-alt"></i><span class="share-action-label">刷新</span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-primary share-create-btn" @click="switchView('files')">
|
||||
<button type="button" class="btn btn-primary share-create-btn" @click="switchView('files')" aria-label="创建分享" title="创建分享">
|
||||
<i class="fas fa-plus"></i><span class="share-action-label">创建分享</span>
|
||||
</button>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<nav class="share-resource-tabs" aria-label="分享资源分类">
|
||||
<button type="button" :class="{ active: shareResourceTab === 'shares' }" @click="shareResourceTab = 'shares'; showMobileShareFilters = false">
|
||||
<button type="button" :class="{ active: shareResourceTab === 'shares' }" @click="shareResourceTab = 'shares'">
|
||||
<i class="fas fa-share-alt"></i> 分享链接
|
||||
<span>{{ shares.length }}</span>
|
||||
</button>
|
||||
<button type="button" :class="{ active: shareResourceTab === 'directLinks' }" @click="shareResourceTab = 'directLinks'; showMobileShareFilters = false">
|
||||
<button type="button" :class="{ active: shareResourceTab === 'directLinks' }" @click="shareResourceTab = 'directLinks'">
|
||||
<i class="fas fa-link"></i> 文件直链
|
||||
<span>{{ directLinks.length }}</span>
|
||||
</button>
|
||||
@@ -3161,22 +3161,12 @@
|
||||
<span><i class="fas fa-shield-alt"></i> 状态 <strong>运行正常</strong></span>
|
||||
</div>
|
||||
|
||||
<div class="share-toolbar shares-toolbar" :class="{ 'share-filters-open': showMobileShareFilters, 'share-toolbar-direct': shareResourceTab === 'directLinks' }">
|
||||
<div class="share-toolbar shares-toolbar" :class="{ 'share-toolbar-direct': shareResourceTab === 'directLinks' }">
|
||||
<div class="share-search-field">
|
||||
<i class="fas fa-search"></i>
|
||||
<input type="text" v-model="shareFilters.keyword" :placeholder="shareResourceTab === 'shares' ? '搜索文件名、链接或分享码' : '搜索文件名或直链地址'">
|
||||
</div>
|
||||
<button
|
||||
v-if="shareResourceTab === 'shares'"
|
||||
type="button"
|
||||
class="mobile-share-filter-toggle"
|
||||
:class="{ active: activeShareFilterCount > 0 }"
|
||||
:aria-expanded="showMobileShareFilters"
|
||||
@click="showMobileShareFilters = !showMobileShareFilters">
|
||||
<i class="fas fa-sliders-h"></i><span>筛选</span>
|
||||
<span v-if="activeShareFilterCount > 0" class="mobile-share-filter-count">{{ activeShareFilterCount }}</span>
|
||||
</button>
|
||||
<div v-if="shareResourceTab === 'shares'" class="share-filter-controls" :class="{ 'is-open': showMobileShareFilters }">
|
||||
<div v-if="shareResourceTab === 'shares'" class="share-filter-controls">
|
||||
<select v-model="shareFilters.type" aria-label="分享类型">
|
||||
<option value="all">全部类型</option>
|
||||
<option value="file">文件</option>
|
||||
@@ -4051,14 +4041,13 @@
|
||||
<h3 style="margin: 0;">用户管理</h3>
|
||||
<button
|
||||
type="button"
|
||||
class="mobile-admin-users-filter-toggle"
|
||||
:class="{ active: showMobileAdminUserFilters || activeAdminUserFilterCount > 0 }"
|
||||
:aria-expanded="showMobileAdminUserFilters ? 'true' : 'false'"
|
||||
@click="showMobileAdminUserFilters = !showMobileAdminUserFilters"
|
||||
class="mobile-admin-users-reset-btn"
|
||||
:disabled="activeAdminUserFilterCount === 0"
|
||||
@click="resetAdminUserFilters"
|
||||
aria-label="重置用户筛选"
|
||||
title="重置筛选"
|
||||
>
|
||||
<i class="fas fa-sliders"></i>
|
||||
<span>筛选</span>
|
||||
<span v-if="activeAdminUserFilterCount" class="mobile-admin-users-filter-count">{{ activeAdminUserFilterCount }}</span>
|
||||
<i class="fas fa-filter-circle-xmark"></i>
|
||||
</button>
|
||||
<button type="button" class="btn btn-secondary admin-users-refresh-btn" @click="loadUsers" :disabled="adminUsersLoading" style="min-width: 92px;" aria-label="刷新用户列表">
|
||||
<i :class="adminUsersLoading ? 'fas fa-spinner fa-spin' : 'fas fa-rotate'"></i>
|
||||
@@ -4066,23 +4055,23 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="admin-users-toolbar" :class="{ 'is-open': showMobileAdminUserFilters }">
|
||||
<div class="admin-users-toolbar">
|
||||
<div class="admin-users-filter admin-users-filter-search">
|
||||
<label>搜索</label>
|
||||
<input type="text" v-model.trim="adminUserFilters.keyword" @input="triggerAdminUsersKeywordSearch" placeholder="ID / 用户名 / 邮箱">
|
||||
</div>
|
||||
<div class="admin-users-filter">
|
||||
<label>角色</label>
|
||||
<select v-model="adminUserFilters.role" @change="handleAdminUsersFilterChange">
|
||||
<option value="all">全部</option>
|
||||
<select v-model="adminUserFilters.role" @change="handleAdminUsersFilterChange" aria-label="用户角色">
|
||||
<option value="all">全部角色</option>
|
||||
<option value="admin">管理员</option>
|
||||
<option value="user">普通用户</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="admin-users-filter">
|
||||
<label>状态</label>
|
||||
<select v-model="adminUserFilters.status" @change="handleAdminUsersFilterChange">
|
||||
<option value="all">全部</option>
|
||||
<select v-model="adminUserFilters.status" @change="handleAdminUsersFilterChange" aria-label="用户状态">
|
||||
<option value="all">全部状态</option>
|
||||
<option value="active">正常</option>
|
||||
<option value="banned">已封禁</option>
|
||||
<option value="unverified">未激活</option>
|
||||
@@ -4091,8 +4080,8 @@
|
||||
</div>
|
||||
<div class="admin-users-filter">
|
||||
<label>存储</label>
|
||||
<select v-model="adminUserFilters.storage" @change="handleAdminUsersFilterChange">
|
||||
<option value="all">全部</option>
|
||||
<select v-model="adminUserFilters.storage" @change="handleAdminUsersFilterChange" aria-label="用户存储类型">
|
||||
<option value="all">全部存储</option>
|
||||
<option value="local">当前本地</option>
|
||||
<option value="oss">当前OSS</option>
|
||||
<option value="local_only">仅本地</option>
|
||||
@@ -4102,7 +4091,7 @@
|
||||
</div>
|
||||
<div class="admin-users-filter">
|
||||
<label>排序</label>
|
||||
<select v-model="adminUserFilters.sort" @change="handleAdminUsersFilterChange">
|
||||
<select v-model="adminUserFilters.sort" @change="handleAdminUsersFilterChange" aria-label="用户排序方式">
|
||||
<option value="created_desc">注册时间(新到旧)</option>
|
||||
<option value="created_asc">注册时间(旧到新)</option>
|
||||
<option value="username_asc">用户名(A-Z)</option>
|
||||
@@ -4113,10 +4102,10 @@
|
||||
</div>
|
||||
<div class="admin-users-filter admin-users-filter-page-size">
|
||||
<label>每页</label>
|
||||
<select v-model.number="adminUsersPageSize" @change="handleAdminUsersPageSizeChange">
|
||||
<option :value="20">20</option>
|
||||
<option :value="50">50</option>
|
||||
<option :value="100">100</option>
|
||||
<select v-model.number="adminUsersPageSize" @change="handleAdminUsersPageSizeChange" aria-label="每页用户数量">
|
||||
<option :value="20">20 条</option>
|
||||
<option :value="50">50 条</option>
|
||||
<option :value="100">100 条</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="admin-users-filter admin-users-filter-reset">
|
||||
|
||||
@@ -154,8 +154,6 @@ createApp({
|
||||
status: 'all', // all/active/expiring/expired/protected/public
|
||||
sort: 'created_desc' // created_desc/created_asc/views_desc/downloads_desc/expire_asc
|
||||
},
|
||||
showMobileShareFilters: false,
|
||||
|
||||
// 文件重命名
|
||||
showRenameModal: false,
|
||||
renameForm: {
|
||||
@@ -217,7 +215,6 @@ createApp({
|
||||
storage: 'all', // all/local/oss/local_only/oss_only/user_choice
|
||||
sort: 'created_desc' // created_desc/created_asc/username_asc/username_desc/storage_usage_desc/download_usage_desc
|
||||
},
|
||||
showMobileAdminUserFilters: false,
|
||||
showResetPwdModal: false,
|
||||
resetPwdUser: {},
|
||||
newPassword: '',
|
||||
@@ -644,14 +641,6 @@ createApp({
|
||||
},
|
||||
|
||||
// 分享筛选+排序后的列表
|
||||
activeShareFilterCount() {
|
||||
return [
|
||||
this.shareFilters.type !== 'all',
|
||||
this.shareFilters.status !== 'all',
|
||||
this.shareFilters.sort !== 'created_desc'
|
||||
].filter(Boolean).length;
|
||||
},
|
||||
|
||||
filteredShares() {
|
||||
let list = [...this.shares];
|
||||
const keyword = this.shareFilters.keyword.trim().toLowerCase();
|
||||
|
||||
@@ -3403,15 +3403,11 @@ body.enterprise-netdisk .mobile-file-create-trigger {
|
||||
}
|
||||
|
||||
/* Content-first mobile layout for shares, settings and administration. */
|
||||
body.enterprise-netdisk .mobile-share-filter-toggle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .share-filter-controls {
|
||||
display: contents;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .mobile-admin-users-filter-toggle {
|
||||
body.enterprise-netdisk .mobile-admin-users-reset-btn {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@@ -3481,7 +3477,12 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .share-refresh-btn .share-action-label {
|
||||
body.enterprise-netdisk .shares-page-actions .share-create-btn {
|
||||
width: 40px;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .shares-page-actions .share-action-label {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@@ -3547,9 +3548,9 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
|
||||
margin: 9px 14px 8px;
|
||||
padding: 0;
|
||||
display: grid;
|
||||
grid-template-columns: minmax(0, 1fr) auto;
|
||||
grid-template-columns: minmax(0, 1fr);
|
||||
align-items: center;
|
||||
gap: 7px;
|
||||
gap: 6px;
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
background: transparent;
|
||||
@@ -3570,52 +3571,7 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .share-toolbar-direct .share-search-field {
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .mobile-share-filter-toggle {
|
||||
min-width: 72px;
|
||||
min-height: 42px;
|
||||
padding: 0 10px;
|
||||
position: relative;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 6px;
|
||||
border: 1px solid #dce4ef;
|
||||
border-radius: 10px;
|
||||
color: #52627a;
|
||||
background: #f7f9fc;
|
||||
font-size: 12px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .mobile-share-filter-toggle.active,
|
||||
body.enterprise-netdisk .mobile-share-filter-toggle[aria-expanded="true"] {
|
||||
color: var(--ww-blue);
|
||||
border-color: #abc9f8;
|
||||
background: #eef5ff;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .mobile-share-filter-count {
|
||||
min-width: 17px;
|
||||
height: 17px;
|
||||
padding: 0 4px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 999px;
|
||||
color: #fff;
|
||||
background: var(--ww-blue);
|
||||
font-size: 9px;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .share-filter-controls {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .share-filter-controls.is-open {
|
||||
grid-column: 1 / -1;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, minmax(0, 1fr));
|
||||
@@ -3625,7 +3581,7 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
|
||||
body.enterprise-netdisk .share-resource-card .share-filter-controls select {
|
||||
width: 100%;
|
||||
min-width: 0;
|
||||
min-height: 38px;
|
||||
min-height: 34px;
|
||||
padding: 0 7px;
|
||||
border: 1px solid #dce4ef;
|
||||
border-radius: 9px;
|
||||
@@ -3997,41 +3953,25 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .mobile-admin-users-filter-toggle {
|
||||
min-width: 68px;
|
||||
body.enterprise-netdisk .mobile-admin-users-reset-btn {
|
||||
width: 38px;
|
||||
min-height: 38px;
|
||||
padding: 0 9px;
|
||||
position: relative;
|
||||
padding: 0;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 5px;
|
||||
border: 1px solid #dce4ef;
|
||||
border-radius: 9px;
|
||||
color: #52627a;
|
||||
background: #f7f9fc;
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .mobile-admin-users-filter-toggle.active,
|
||||
body.enterprise-netdisk .mobile-admin-users-filter-toggle[aria-expanded="true"] {
|
||||
color: var(--ww-blue);
|
||||
border-color: #abc9f8;
|
||||
background: #eef5ff;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .mobile-admin-users-filter-count {
|
||||
min-width: 16px;
|
||||
height: 16px;
|
||||
padding: 0 4px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 999px;
|
||||
color: #fff;
|
||||
background: var(--ww-blue);
|
||||
font-size: 9px;
|
||||
body.enterprise-netdisk .mobile-admin-users-reset-btn:disabled {
|
||||
color: #aab4c3;
|
||||
background: #f4f6f9;
|
||||
cursor: default;
|
||||
opacity: 0.65;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-refresh-btn {
|
||||
@@ -4047,37 +3987,55 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-toolbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-toolbar.is-open {
|
||||
margin: 0 10px 8px !important;
|
||||
padding: 10px !important;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
gap: 8px;
|
||||
margin: 0 10px 7px !important;
|
||||
padding: 8px !important;
|
||||
display: grid !important;
|
||||
grid-template-columns: repeat(6, minmax(0, 1fr));
|
||||
gap: 6px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-toolbar.is-open .admin-users-filter-search,
|
||||
body.enterprise-netdisk .admin-users-toolbar.is-open .admin-users-filter-reset {
|
||||
body.enterprise-netdisk .admin-users-toolbar .admin-users-filter-search {
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-toolbar.is-open .admin-users-filter {
|
||||
body.enterprise-netdisk .admin-users-toolbar .admin-users-filter {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-toolbar.is-open label {
|
||||
margin-bottom: 3px;
|
||||
font-size: 10px;
|
||||
body.enterprise-netdisk .admin-users-toolbar .admin-users-filter:nth-child(2),
|
||||
body.enterprise-netdisk .admin-users-toolbar .admin-users-filter:nth-child(3),
|
||||
body.enterprise-netdisk .admin-users-toolbar .admin-users-filter:nth-child(4) {
|
||||
grid-column: span 2;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-toolbar.is-open input,
|
||||
body.enterprise-netdisk .admin-users-toolbar.is-open select,
|
||||
body.enterprise-netdisk .admin-users-toolbar.is-open .btn {
|
||||
min-height: 36px;
|
||||
padding: 0 9px;
|
||||
body.enterprise-netdisk .admin-users-toolbar .admin-users-filter:nth-child(5) {
|
||||
grid-column: span 4;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-toolbar .admin-users-filter-page-size {
|
||||
grid-column: span 2;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-toolbar .admin-users-filter-reset {
|
||||
display: none;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-toolbar label {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
clip: rect(0, 0, 0, 0);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .admin-users-toolbar input,
|
||||
body.enterprise-netdisk .admin-users-toolbar select {
|
||||
min-height: 34px;
|
||||
padding: 0 8px;
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
@@ -4272,7 +4230,7 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
|
||||
margin-inline: 11px;
|
||||
}
|
||||
|
||||
body.enterprise-netdisk .share-filter-controls.is-open {
|
||||
body.enterprise-netdisk .share-filter-controls {
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user