Skip to content

Commit be807d0

Browse files
committed
feat: Remember selected item sort in UXSettings
1 parent 09c9ecd commit be807d0

6 files changed

Lines changed: 31 additions & 26 deletions

File tree

src/components/titleBarFull.vue

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Created Date: 2025-09-17 17:25:36
66
* Author: 3urobeat
77
*
8-
* Last Modified: 2026-04-28 21:58:45
8+
* Last Modified: 2026-04-29 18:45:52
99
* Modified By: 3urobeat
1010
*
1111
* Copyright (c) 2025 - 2026 3urobeat <https://github.com/3urobeat>
@@ -26,11 +26,11 @@
2626
<div class="flex w-full justify-between md:justify-end gap-x-4 p-1.5 rounded-2xl backdrop-blur-lg">
2727
<!-- Sort dropdown -->
2828
<div class="flex min-w-18 sm:min-w-32 justify-end rounded-xl shadow-md select-none bg-bg-field-light dark:bg-bg-field-dark">
29-
<select class="w-full px-2 m-0.5" v-model="selectedSort">
30-
<option :value="sortModes.dateDesc">{{ $t('sortByDateDesc') }}</option>
31-
<option :value="sortModes.dateAsc">{{ $t('sortByDateAsc') }}</option>
32-
<option :value="sortModes.nameDesc">{{ $t('sortByNameDesc') }}</option>
33-
<option :value="sortModes.nameAsc">{{ $t('sortByNameAsc') }}</option>
29+
<select class="w-full px-2 m-0.5" v-model="selectedSort" v-on:change="saveUxSetting">
30+
<option :value="SortMode.dateDesc">{{ $t('sortByDateDesc') }}</option>
31+
<option :value="SortMode.dateAsc">{{ $t('sortByDateAsc') }}</option>
32+
<option :value="SortMode.nameDesc">{{ $t('sortByNameDesc') }}</option>
33+
<option :value="SortMode.nameAsc">{{ $t('sortByNameAsc') }}</option>
3434
</select>
3535
</div>
3636

@@ -95,26 +95,28 @@
9595
<script setup lang="ts">
9696
import { defaultUXSettings } from '~/model/storage';
9797
import type { Label } from '~/model/label';
98-
import { sortModes } from '~/model/sort-modes';
98+
import { SortMode } from '~/model/sort-modes';
9999
100100
101101
// Get global cache from app.vue
102102
const storedLabels = getAllLabelsFromServer();
103103
104104
// Refs
105-
const selectedSort: Ref<sortModes> = ref(sortModes.dateDesc);
105+
const selectedSort: Ref<SortMode> = ref(SortMode.dateDesc);
106106
const selectedFilters: Ref<string[]> = ref([]);
107107
const selectedScaling: Ref<number> = ref(defaultUXSettings.selectedItemCardsScaling);
108108
109109
// Client side only
110110
onBeforeMount(() => {
111111
selectedScaling.value = getUXSettings().selectedItemCardsScaling;
112+
selectedSort.value = getUXSettings().selectedItemSort;
112113
});
113114
114115
115116
// Save scaling setting
116117
function saveUxSetting() {
117118
setUXSetting("selectedItemCardsScaling", selectedScaling.value);
119+
setUXSetting("selectedItemSort", selectedSort.value);
118120
}
119121
120122

src/composables/getItemsToShow.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Created Date: 2025-09-17 17:25:36
55
* Author: 3urobeat
66
*
7-
* Last Modified: 2026-04-29 17:45:11
7+
* Last Modified: 2026-04-29 18:44:22
88
* Modified By: 3urobeat
99
*
1010
* Copyright (c) 2025 - 2026 3urobeat <https://github.com/3urobeat>
@@ -16,7 +16,7 @@
1616

1717

1818
import type { Item } from "~/model/item";
19-
import { sortModes } from "~/model/sort-modes";
19+
import { SortMode } from "~/model/sort-modes";
2020
import { State } from "./state";
2121

2222

@@ -26,7 +26,7 @@ import { State } from "./state";
2626
* @param selectedSort
2727
* @param selectedFilters
2828
*/
29-
export default function(storedItems: Item[], selectedSort?: sortModes, selectedFilters?: string[]): Item[] {
29+
export default function(storedItems: Item[], selectedSort?: SortMode, selectedFilters?: string[]): Item[] {
3030

3131
// Get search string ref from app.vue
3232
const searchStr: Ref<string|null> = useState(State.GLOBAL_SEARCH_STRING);
@@ -43,19 +43,19 @@ export default function(storedItems: Item[], selectedSort?: sortModes, selectedF
4343

4444
// Apply sort to storedItems
4545
switch (selectedSort) {
46-
case sortModes.dateDesc:
46+
case SortMode.dateDesc:
4747
storedItems = storedItems.sort((a, b) => b.addedTimestamp - a.addedTimestamp);
4848
break;
4949

50-
case sortModes.dateAsc:
50+
case SortMode.dateAsc:
5151
storedItems = storedItems.sort((a, b) => a.addedTimestamp - b.addedTimestamp);
5252
break;
5353

54-
case sortModes.nameDesc:
54+
case SortMode.nameDesc:
5555
storedItems = storedItems.sort((a, b) => a.title.charCodeAt(0) - b.title.charCodeAt(0)); /* TODO: Does not sort e.g. "Bc 1" & "Bd 2" */
5656
break;
5757

58-
case sortModes.nameAsc:
58+
case SortMode.nameAsc:
5959
storedItems = storedItems.sort((a, b) => b.title.charCodeAt(0) - a.title.charCodeAt(0));
6060
break;
6161

src/model/sort-modes.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Created Date: 2025-09-21 00:07:44
55
* Author: 3urobeat
66
*
7-
* Last Modified: 2026-02-02 21:32:26
7+
* Last Modified: 2026-04-29 18:44:22
88
* Modified By: 3urobeat
99
*
1010
* Copyright (c) 2025 - 2026 3urobeat <https://github.com/3urobeat>
@@ -15,11 +15,11 @@
1515
*/
1616

1717

18-
export enum sortModes {
18+
export enum SortMode {
1919
dateDesc,
2020
dateAsc,
2121
nameDesc,
2222
nameAsc
2323
}
2424

25-
export const defaultSortMode = sortModes.dateDesc;
25+
export const defaultSortMode = SortMode.dateDesc;

src/model/storage.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* Created Date: 2025-09-08 15:21:35
55
* Author: 3urobeat
66
*
7-
* Last Modified: 2026-04-05 21:01:49
7+
* Last Modified: 2026-04-29 18:48:38
88
* Modified By: 3urobeat
99
*
1010
* Copyright (c) 2025 - 2026 3urobeat <https://github.com/3urobeat>
@@ -18,6 +18,7 @@
1818
import type { Clothing, Outfit } from "./item";
1919
import type { Label } from "./label";
2020
import type { Category } from "./label-category";
21+
import { SortMode } from "./sort-modes";
2122
import type { Unit } from "./unit";
2223

2324

@@ -58,8 +59,9 @@ export type UXSettings = {
5859
// Boolean if user changed dark mode, null if automatic
5960
darkModeEnabled: boolean | null, // WARN: Used in public/global.js as well
6061

61-
// Selected scaling for item cards in titleBarFull
62+
// Selected scaling and sort mode for item cards in titleBarFull
6263
selectedItemCardsScaling: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9,
64+
selectedItemSort: SortMode,
6365

6466
// Whether user enabled if selected filters should be persisted
6567
saveSelectedFilters: boolean // TODO
@@ -70,6 +72,7 @@ export type UXSettings = {
7072
export const defaultUXSettings: UXSettings = {
7173
darkModeEnabled: null,
7274
selectedItemCardsScaling: 6,
75+
selectedItemSort: SortMode.dateDesc,
7376
saveSelectedFilters: false
7477
};
7578

src/pages/clothing/index.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Created Date: 2024-03-23 13:03:16
66
* Author: 3urobeat
77
*
8-
* Last Modified: 2026-04-28 22:19:29
8+
* Last Modified: 2026-04-29 18:44:22
99
* Modified By: 3urobeat
1010
*
1111
* Copyright (c) 2024 - 2026 3urobeat <https://github.com/3urobeat>
@@ -86,7 +86,7 @@
8686
import TitleBarFull from "~/components/titleBarFull.vue";
8787
import { getAllClothesFromServer } from "~/composables/storage";
8888
import type { Clothing } from "~/model/item";
89-
import { defaultSortMode, sortModes } from "~/model/sort-modes";
89+
import { defaultSortMode, SortMode } from "~/model/sort-modes";
9090
9191
9292
// Set page properties
@@ -100,7 +100,7 @@
100100
const storedClothing = await getAllClothesFromServer();
101101
102102
// Get refs to props exported by defineExpose() in TitleBarFull
103-
const titleBarFull: Ref<{ selectedSort: sortModes, selectedFilters: string[], selectedScaling: number, toggleFilter: (thisFilter: string) => void }> = ref({ selectedSort: defaultSortMode, selectedFilters: [], selectedScaling: 0, toggleFilter: () => {} }); // TODO: Can this be an exported type somewhere?
103+
const titleBarFull: Ref<{ selectedSort: SortMode, selectedFilters: string[], selectedScaling: number, toggleFilter: (thisFilter: string) => void }> = ref({ selectedSort: defaultSortMode, selectedFilters: [], selectedScaling: 0, toggleFilter: () => {} }); // TODO: Can this be an exported type somewhere?
104104
105105
106106
// Pre-calculate items that should be shown. Can be accessed multiple times in template without re-calculation. Updates when sort/filter/search changes due to reactivity

src/pages/outfits/index.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* Created Date: 2025-09-08 15:40:46
66
* Author: 3urobeat
77
*
8-
* Last Modified: 2026-04-28 22:18:48
8+
* Last Modified: 2026-04-29 18:44:22
99
* Modified By: 3urobeat
1010
*
1111
* Copyright (c) 2025 - 2026 3urobeat <https://github.com/3urobeat>
@@ -93,7 +93,7 @@
9393
import ImgLazy from "~/components/imgLazy.vue";
9494
import TitleBarFull from "~/components/titleBarFull.vue";
9595
import type { Outfit } from "~/model/item";
96-
import { defaultSortMode, type sortModes } from "~/model/sort-modes";
96+
import { defaultSortMode, type SortMode } from "~/model/sort-modes";
9797
import { getAllOutfitsFromServer } from "~/composables/storage";
9898
9999
@@ -108,7 +108,7 @@
108108
const storedOutfits = await getAllOutfitsFromServer();
109109
110110
// Get refs to props exported by defineExpose() in TitleBarFull
111-
const titleBarFull: Ref<{ selectedSort: sortModes, selectedFilters: string[], selectedScaling: number, toggleFilter: (thisFilter: string) => void }> = ref({ selectedSort: defaultSortMode, selectedFilters: [], selectedScaling: 0, toggleFilter: () => {} }); // TODO: Can this be an exported type somewhere?
111+
const titleBarFull: Ref<{ selectedSort: SortMode, selectedFilters: string[], selectedScaling: number, toggleFilter: (thisFilter: string) => void }> = ref({ selectedSort: defaultSortMode, selectedFilters: [], selectedScaling: 0, toggleFilter: () => {} }); // TODO: Can this be an exported type somewhere?
112112
113113
114114
// Pre-calculate items that should be shown. Can be accessed multiple times in template without re-calculation. Updates when sort/filter/search changes due to reactivity

0 commit comments

Comments
 (0)