fix: keep mobile filters compact and visible
Some checks failed
Build and tests / test (push) Has been cancelled

This commit is contained in:
237899745
2026-08-03 23:21:22 +08:00
parent c92ad8b096
commit d0535c7208
3 changed files with 81 additions and 145 deletions

View File

@@ -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">

View File

@@ -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();

View File

@@ -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;
}