diff --git a/apps/desktop/src/components/redis/RedisValueViewer.vue b/apps/desktop/src/components/redis/RedisValueViewer.vue index a52cb0966..e9d801df1 100644 --- a/apps/desktop/src/components/redis/RedisValueViewer.vue +++ b/apps/desktop/src/components/redis/RedisValueViewer.vue @@ -3,7 +3,7 @@ import { computed, ref, nextTick, onBeforeUnmount, onMounted } from "vue"; import { useI18n } from "vue-i18n"; import { onClickOutside } from "@vueuse/core"; import { DynamicScroller, DynamicScrollerItem, RecycleScroller } from "vue-virtual-scroller"; -import { Braces, Copy, Eye, FileText, Terminal, Trash2, Save, RefreshCw, Plus, Loader2, Pencil, WrapText, IndentIncrease, IndentDecrease } from "@lucide/vue"; +import { Braces, Copy, Eye, FileText, Terminal, Trash2, Save, RefreshCw, Plus, Loader2, Pencil, WrapText, IndentIncrease, IndentDecrease, ArrowUp, ArrowDown, ArrowUpDown } from "@lucide/vue"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; @@ -76,6 +76,41 @@ const stringValueView = ref("raw"); const memberValueView = ref("raw"); const redisJsonWordWrap = ref(readRedisJsonWordWrap()); const redisJsonHighlighter = ref(); +const hashSortBy = ref<"field" | "value" | null>(null); +const hashSortDir = ref<"asc" | "desc">("asc"); + +function toggleHashSort(column: "field" | "value") { + if (hashSortBy.value === column && hashSortDir.value === "desc") { + hashSortBy.value = null; + } else if (hashSortBy.value === column) { + hashSortDir.value = "desc"; + } else { + hashSortBy.value = column; + hashSortDir.value = "asc"; + } +} + +const sortedHashItems = computed(() => { + if (!hashSortBy.value) return collectionItems.value; + const items = [...collectionItems.value]; + const multiplier = hashSortDir.value === "asc" ? 1 : -1; + const key = hashSortBy.value; + items.sort((a, b) => { + const av = String(a[key] ?? ""); + const bv = String(b[key] ?? ""); + return av.localeCompare(bv) * multiplier; + }); + return items; +}); + +const hashCollectionRows = computed(() => + sortedHashItems.value.map((value, index) => ({ + id: `hash-sorted-${index}`, + index, + value, + })), +); + const selectedMemberDetail = computed(() => formatRedisMemberDetail(selectedMemberRaw.value)); const selectedMemberJsonDetail = computed(() => selectedMemberDetail.value.json ?? null); const stringValueDetail = computed(() => (data.value?.key_type === "string" ? formatRedisMemberDetail(data.value.value) : null)); @@ -940,14 +975,27 @@ onBeforeUnmount(() => {
-
+
Field + + +
-
Value
+
+ Value + + + +
- +