feat: replace min size filter with key name + type filter

Remove the minSizeKB number input (rarely useful). Add:
- Key name search input (case-insensitive substring match)
- Type dropdown filter (string/hash/list/set/zset/stream)

Updated i18n for all 5 locales (en, zh-CN, ja, ko, de).
This commit is contained in:
2026-07-12 10:16:45 +08:00
parent bb3adeb688
commit d2c1f50f87
6 changed files with 39 additions and 17 deletions
@@ -16,7 +16,8 @@ const entries = shallowRef<KeyEntry[]>([])
const scanning = ref(false)
const paused = ref(false)
const scannedCount = ref(0)
const minSizeKB = ref(0)
const filterKey = ref('')
const filterType = ref('')
const sortAsc = ref(false)
const scanAbort = ref<AbortController | null>(null)
@@ -30,9 +31,14 @@ const ROW_HEIGHT = 36
const BUFFER = 10
const sortedEntries = computed(() => {
const filtered = minSizeKB.value > 0
? entries.value.filter(e => e.size >= minSizeKB.value * 1024)
: entries.value
let filtered = entries.value
if (filterKey.value) {
const kw = filterKey.value.toLowerCase()
filtered = filtered.filter(e => e.key.toLowerCase().includes(kw))
}
if (filterType.value) {
filtered = filtered.filter(e => e.type === filterType.value)
}
return [...filtered].sort((a, b) => sortAsc.value ? a.size - b.size : b.size - a.size)
})
@@ -187,16 +193,27 @@ onUnmounted(() => {
<span class="ma-stat-label">{{ t('memory.totalSize') }}: {{ formatSize(totalFiltered) }}</span>
</div>
<div class="ma-filters">
<el-input-number
v-model="minSizeKB"
:min="0"
:max="10240"
:step="1"
<el-input
v-model="filterKey"
size="small"
controls-position="right"
:placeholder="t('memory.minSize')"
style="width:140px"
clearable
:placeholder="t('memory.filterKey')"
style="width:200px"
/>
<el-select
v-model="filterType"
size="small"
clearable
:placeholder="t('memory.filterType')"
style="width:120px"
>
<el-option :label="t('types.string')" value="string" />
<el-option :label="t('types.hash')" value="hash" />
<el-option :label="t('types.list')" value="list" />
<el-option :label="t('types.set')" value="set" />
<el-option :label="t('types.zset')" value="zset" />
<el-option :label="t('types.stream')" value="stream" />
</el-select>
<el-button size="small" @click="sortAsc = !sortAsc">
{{ sortAsc ? t('memory.sortAsc') : t('memory.sortDesc') }}
</el-button>
+2 -1
View File
@@ -244,7 +244,8 @@ export default {
size: 'Größe',
type: 'Typ',
totalSize: 'Gesamtgröße',
minSize: 'Mindestgröße (KB)',
filterKey: 'Schlüssel suchen...',
filterType: 'Alle Typen',
sortAsc: 'Aufsteigend',
sortDesc: 'Absteigend',
scanned: '{n} Schlüssel gescannt',
+2 -1
View File
@@ -244,7 +244,8 @@ export default {
size: 'Size',
type: 'Type',
totalSize: 'Total Size',
minSize: 'Min Size (KB)',
filterKey: 'Search key...',
filterType: 'All Types',
sortAsc: 'Ascending',
sortDesc: 'Descending',
scanned: '{n} keys scanned',
+2 -1
View File
@@ -244,7 +244,8 @@ export default {
size: 'サイズ',
type: 'タイプ',
totalSize: '合計サイズ',
minSize: '最小サイズ (KB)',
filterKey: 'キー名検索...',
filterType: 'すべてのタイプ',
sortAsc: '昇順',
sortDesc: '降順',
scanned: '{n} 個のキーをスキャンしました',
+2 -1
View File
@@ -244,7 +244,8 @@ export default {
size: '크기',
type: '유형',
totalSize: '총 크기',
minSize: '최소 크기 (KB)',
filterKey: '키 이름 검색...',
filterType: '모든 유형',
sortAsc: '오름차순',
sortDesc: '내림차순',
scanned: '{n}개 키 스캔됨',
+2 -1
View File
@@ -244,7 +244,8 @@ export default {
size: '大小',
type: '类型',
totalSize: '总大小',
minSize: '最小大小 (KB)',
filterKey: '搜索键名...',
filterType: '所有类型',
sortAsc: '升序',
sortDesc: '降序',
scanned: '已扫描 {n} 个',