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="刷新分享资源"> <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> <i class="fas fa-sync-alt"></i><span class="share-action-label">刷新</span>
</button> </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> <i class="fas fa-plus"></i><span class="share-action-label">创建分享</span>
</button> </button>
</div> </div>
</header> </header>
<nav class="share-resource-tabs" aria-label="分享资源分类"> <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> 分享链接 <i class="fas fa-share-alt"></i> 分享链接
<span>{{ shares.length }}</span> <span>{{ shares.length }}</span>
</button> </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> 文件直链 <i class="fas fa-link"></i> 文件直链
<span>{{ directLinks.length }}</span> <span>{{ directLinks.length }}</span>
</button> </button>
@@ -3161,22 +3161,12 @@
<span><i class="fas fa-shield-alt"></i> 状态 <strong>运行正常</strong></span> <span><i class="fas fa-shield-alt"></i> 状态 <strong>运行正常</strong></span>
</div> </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"> <div class="share-search-field">
<i class="fas fa-search"></i> <i class="fas fa-search"></i>
<input type="text" v-model="shareFilters.keyword" :placeholder="shareResourceTab === 'shares' ? '搜索文件名、链接或分享码' : '搜索文件名或直链地址'"> <input type="text" v-model="shareFilters.keyword" :placeholder="shareResourceTab === 'shares' ? '搜索文件名、链接或分享码' : '搜索文件名或直链地址'">
</div> </div>
<button <div v-if="shareResourceTab === 'shares'" class="share-filter-controls">
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 }">
<select v-model="shareFilters.type" aria-label="分享类型"> <select v-model="shareFilters.type" aria-label="分享类型">
<option value="all">全部类型</option> <option value="all">全部类型</option>
<option value="file">文件</option> <option value="file">文件</option>
@@ -4051,14 +4041,13 @@
<h3 style="margin: 0;">用户管理</h3> <h3 style="margin: 0;">用户管理</h3>
<button <button
type="button" type="button"
class="mobile-admin-users-filter-toggle" class="mobile-admin-users-reset-btn"
:class="{ active: showMobileAdminUserFilters || activeAdminUserFilterCount > 0 }" :disabled="activeAdminUserFilterCount === 0"
:aria-expanded="showMobileAdminUserFilters ? 'true' : 'false'" @click="resetAdminUserFilters"
@click="showMobileAdminUserFilters = !showMobileAdminUserFilters" aria-label="重置用户筛选"
title="重置筛选"
> >
<i class="fas fa-sliders"></i> <i class="fas fa-filter-circle-xmark"></i>
<span>筛选</span>
<span v-if="activeAdminUserFilterCount" class="mobile-admin-users-filter-count">{{ activeAdminUserFilterCount }}</span>
</button> </button>
<button type="button" class="btn btn-secondary admin-users-refresh-btn" @click="loadUsers" :disabled="adminUsersLoading" style="min-width: 92px;" aria-label="刷新用户列表"> <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> <i :class="adminUsersLoading ? 'fas fa-spinner fa-spin' : 'fas fa-rotate'"></i>
@@ -4066,23 +4055,23 @@
</button> </button>
</div> </div>
<div class="admin-users-toolbar" :class="{ 'is-open': showMobileAdminUserFilters }"> <div class="admin-users-toolbar">
<div class="admin-users-filter admin-users-filter-search"> <div class="admin-users-filter admin-users-filter-search">
<label>搜索</label> <label>搜索</label>
<input type="text" v-model.trim="adminUserFilters.keyword" @input="triggerAdminUsersKeywordSearch" placeholder="ID / 用户名 / 邮箱"> <input type="text" v-model.trim="adminUserFilters.keyword" @input="triggerAdminUsersKeywordSearch" placeholder="ID / 用户名 / 邮箱">
</div> </div>
<div class="admin-users-filter"> <div class="admin-users-filter">
<label>角色</label> <label>角色</label>
<select v-model="adminUserFilters.role" @change="handleAdminUsersFilterChange"> <select v-model="adminUserFilters.role" @change="handleAdminUsersFilterChange" aria-label="用户角色">
<option value="all">全部</option> <option value="all">全部角色</option>
<option value="admin">管理员</option> <option value="admin">管理员</option>
<option value="user">普通用户</option> <option value="user">普通用户</option>
</select> </select>
</div> </div>
<div class="admin-users-filter"> <div class="admin-users-filter">
<label>状态</label> <label>状态</label>
<select v-model="adminUserFilters.status" @change="handleAdminUsersFilterChange"> <select v-model="adminUserFilters.status" @change="handleAdminUsersFilterChange" aria-label="用户状态">
<option value="all">全部</option> <option value="all">全部状态</option>
<option value="active">正常</option> <option value="active">正常</option>
<option value="banned">已封禁</option> <option value="banned">已封禁</option>
<option value="unverified">未激活</option> <option value="unverified">未激活</option>
@@ -4091,8 +4080,8 @@
</div> </div>
<div class="admin-users-filter"> <div class="admin-users-filter">
<label>存储</label> <label>存储</label>
<select v-model="adminUserFilters.storage" @change="handleAdminUsersFilterChange"> <select v-model="adminUserFilters.storage" @change="handleAdminUsersFilterChange" aria-label="用户存储类型">
<option value="all">全部</option> <option value="all">全部存储</option>
<option value="local">当前本地</option> <option value="local">当前本地</option>
<option value="oss">当前OSS</option> <option value="oss">当前OSS</option>
<option value="local_only">仅本地</option> <option value="local_only">仅本地</option>
@@ -4102,7 +4091,7 @@
</div> </div>
<div class="admin-users-filter"> <div class="admin-users-filter">
<label>排序</label> <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_desc">注册时间(新到旧)</option>
<option value="created_asc">注册时间(旧到新)</option> <option value="created_asc">注册时间(旧到新)</option>
<option value="username_asc">用户名A-Z</option> <option value="username_asc">用户名A-Z</option>
@@ -4113,10 +4102,10 @@
</div> </div>
<div class="admin-users-filter admin-users-filter-page-size"> <div class="admin-users-filter admin-users-filter-page-size">
<label>每页</label> <label>每页</label>
<select v-model.number="adminUsersPageSize" @change="handleAdminUsersPageSizeChange"> <select v-model.number="adminUsersPageSize" @change="handleAdminUsersPageSizeChange" aria-label="每页用户数量">
<option :value="20">20</option> <option :value="20">20</option>
<option :value="50">50</option> <option :value="50">50</option>
<option :value="100">100</option> <option :value="100">100</option>
</select> </select>
</div> </div>
<div class="admin-users-filter admin-users-filter-reset"> <div class="admin-users-filter admin-users-filter-reset">

View File

@@ -154,8 +154,6 @@ createApp({
status: 'all', // all/active/expiring/expired/protected/public status: 'all', // all/active/expiring/expired/protected/public
sort: 'created_desc' // created_desc/created_asc/views_desc/downloads_desc/expire_asc sort: 'created_desc' // created_desc/created_asc/views_desc/downloads_desc/expire_asc
}, },
showMobileShareFilters: false,
// 文件重命名 // 文件重命名
showRenameModal: false, showRenameModal: false,
renameForm: { renameForm: {
@@ -217,7 +215,6 @@ createApp({
storage: 'all', // all/local/oss/local_only/oss_only/user_choice 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 sort: 'created_desc' // created_desc/created_asc/username_asc/username_desc/storage_usage_desc/download_usage_desc
}, },
showMobileAdminUserFilters: false,
showResetPwdModal: false, showResetPwdModal: false,
resetPwdUser: {}, resetPwdUser: {},
newPassword: '', 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() { filteredShares() {
let list = [...this.shares]; let list = [...this.shares];
const keyword = this.shareFilters.keyword.trim().toLowerCase(); 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. */ /* Content-first mobile layout for shares, settings and administration. */
body.enterprise-netdisk .mobile-share-filter-toggle {
display: none;
}
body.enterprise-netdisk .share-filter-controls { body.enterprise-netdisk .share-filter-controls {
display: contents; display: contents;
} }
body.enterprise-netdisk .mobile-admin-users-filter-toggle { body.enterprise-netdisk .mobile-admin-users-reset-btn {
display: none; display: none;
} }
@@ -3481,7 +3477,12 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
padding: 0; 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; display: none;
} }
@@ -3547,9 +3548,9 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
margin: 9px 14px 8px; margin: 9px 14px 8px;
padding: 0; padding: 0;
display: grid; display: grid;
grid-template-columns: minmax(0, 1fr) auto; grid-template-columns: minmax(0, 1fr);
align-items: center; align-items: center;
gap: 7px; gap: 6px;
border: 0; border: 0;
border-radius: 0; border-radius: 0;
background: transparent; background: transparent;
@@ -3570,52 +3571,7 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
font-size: 12px; 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 { body.enterprise-netdisk .share-filter-controls {
display: none;
}
body.enterprise-netdisk .share-filter-controls.is-open {
grid-column: 1 / -1; grid-column: 1 / -1;
display: grid; display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr)); 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 { body.enterprise-netdisk .share-resource-card .share-filter-controls select {
width: 100%; width: 100%;
min-width: 0; min-width: 0;
min-height: 38px; min-height: 34px;
padding: 0 7px; padding: 0 7px;
border: 1px solid #dce4ef; border: 1px solid #dce4ef;
border-radius: 9px; border-radius: 9px;
@@ -3997,41 +3953,25 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
font-size: 16px; font-size: 16px;
} }
body.enterprise-netdisk .mobile-admin-users-filter-toggle { body.enterprise-netdisk .mobile-admin-users-reset-btn {
min-width: 68px; width: 38px;
min-height: 38px; min-height: 38px;
padding: 0 9px; padding: 0;
position: relative;
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
gap: 5px;
border: 1px solid #dce4ef; border: 1px solid #dce4ef;
border-radius: 9px; border-radius: 9px;
color: #52627a; color: #52627a;
background: #f7f9fc; background: #f7f9fc;
font-size: 11px; font-size: 12px;
font-weight: 700;
} }
body.enterprise-netdisk .mobile-admin-users-filter-toggle.active, body.enterprise-netdisk .mobile-admin-users-reset-btn:disabled {
body.enterprise-netdisk .mobile-admin-users-filter-toggle[aria-expanded="true"] { color: #aab4c3;
color: var(--ww-blue); background: #f4f6f9;
border-color: #abc9f8; cursor: default;
background: #eef5ff; opacity: 0.65;
}
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 .admin-users-refresh-btn { 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 { body.enterprise-netdisk .admin-users-toolbar {
display: none; margin: 0 10px 7px !important;
} padding: 8px !important;
display: grid !important;
body.enterprise-netdisk .admin-users-toolbar.is-open { grid-template-columns: repeat(6, minmax(0, 1fr));
margin: 0 10px 8px !important; gap: 6px;
padding: 10px !important;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
border-radius: 10px; border-radius: 10px;
} }
body.enterprise-netdisk .admin-users-toolbar.is-open .admin-users-filter-search, body.enterprise-netdisk .admin-users-toolbar .admin-users-filter-search {
body.enterprise-netdisk .admin-users-toolbar.is-open .admin-users-filter-reset {
grid-column: 1 / -1; 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; min-width: 0;
} }
body.enterprise-netdisk .admin-users-toolbar.is-open label { body.enterprise-netdisk .admin-users-toolbar .admin-users-filter:nth-child(2),
margin-bottom: 3px; body.enterprise-netdisk .admin-users-toolbar .admin-users-filter:nth-child(3),
font-size: 10px; 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 .admin-users-filter:nth-child(5) {
body.enterprise-netdisk .admin-users-toolbar.is-open select, grid-column: span 4;
body.enterprise-netdisk .admin-users-toolbar.is-open .btn { }
min-height: 36px;
padding: 0 9px; 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; font-size: 11px;
} }
@@ -4272,7 +4230,7 @@ body.enterprise-netdisk .mobile-admin-users-filter-toggle {
margin-inline: 11px; margin-inline: 11px;
} }
body.enterprise-netdisk .share-filter-controls.is-open { body.enterprise-netdisk .share-filter-controls {
gap: 4px; gap: 4px;
} }