From 131b101045bbc4419f98afe58557a8d532af9bd6 Mon Sep 17 00:00:00 2001 From: Rémy Raes Date: Wed, 4 Jan 2023 19:21:17 +0100 Subject: feat: Thunderstore mods pagination (#122) * feat: add basic pagination * refactor: put paginator inside filters container * fix: limit filter container width * refactor: filters container is now responsive * fix: add missing type to pagination listener parameter * fix: don't display entire mods list while filtering mods * refactor: filteredMods is now a computed value * refactor: store mods per page value on UI store * feat: user can change modsPerPage count in settings * fix: limit mods count (min=5, max=100) * feat: add control on pages value When leaving settings vue, we check if the pages value is a number and is included in the interval [5-100]. If that's not the case, we reset it to 20. * feat: retrieve and save pages value in persistent store * fix: don't load an empty value from persistent store on boot * fix: cast modsPerPage to string to check if it's empty * refactor: remove search debounce * Update src-vue/src/plugins/store.ts * style: add trailing comma * fix: mention impact on TS mods only * refactor: remove limitations on modsPerPage * style: explicitly cast mods_per_page to number * feat: disable pagination with modsPerPage === 0 * feat: add pagination under thunderstore mod cards * fix: adjust bottom pagination padding * feat: clicking bottom pagination scrolls to page top * fix: use same containers for both paginations * feat: do not display pagination if mods fit on one page * style: trailing spaces * style: trailing spaces * feat: add a button to reset modsPerPage * feat: add explanation text about disabling pagination --- src-vue/src/plugins/store.ts | 15 ++- src-vue/src/views/SettingsView.vue | 48 +++++++++ src-vue/src/views/ThunderstoreModsView.vue | 158 +++++++++++++++++++---------- 3 files changed, 167 insertions(+), 54 deletions(-) diff --git a/src-vue/src/plugins/store.ts b/src-vue/src/plugins/store.ts index 3db85e64..18191555 100644 --- a/src-vue/src/plugins/store.ts +++ b/src-vue/src/plugins/store.ts @@ -36,7 +36,10 @@ export interface FlightCoreStore { installed_mods: NorthstarMod[], northstar_is_running: boolean, - origin_is_running: boolean + origin_is_running: boolean, + + // user custom settings + mods_per_page: number, } let notification_handle: NotificationHandle; @@ -60,7 +63,9 @@ export const store = createStore({ installed_mods: [], northstar_is_running: false, - origin_is_running: false + origin_is_running: false, + + mods_per_page: 20, } }, mutations: { @@ -320,6 +325,12 @@ async function _initializeApp(state: any) { state.enableReleasesSwitch = valueFromStore.value; } + // Grab "Thunderstore mods per page" setting from store if possible + const perPageFromStore: {value: number} | null = await persistentStore.get('thunderstore-mods-per-page'); + if (perPageFromStore && perPageFromStore.value) { + state.mods_per_page = perPageFromStore.value; + } + // Get FlightCore version number state.flightcore_version = await invoke("get_flightcore_version_number"); diff --git a/src-vue/src/views/SettingsView.vue b/src-vue/src/views/SettingsView.vue index ff87c394..1c03fe4f 100644 --- a/src-vue/src/views/SettingsView.vue +++ b/src-vue/src/views/SettingsView.vue @@ -14,6 +14,24 @@ + + +
+

Number of Thunderstore mods per page

+
+ This has an impact on display performances when browsing Thunderstore mods.
+ Set this value to 0 to disable pagination. +
+ + + +
+

About:

FlightCore Version: {{ flightcoreVersion === '' ? 'Unknown version' : `${flightcoreVersion}` }} @@ -64,6 +82,15 @@ export default defineComponent({ this.$store.commit('toggleReleaseCandidate'); } } + }, + modsPerPage: { + get(): number { + return this.$store.state.mods_per_page; + }, + set(value: number) { + this.$store.state.mods_per_page = value; + persistentStore.set('thunderstore-mods-per-page', { value }); + } } }, methods: { @@ -86,6 +113,12 @@ export default defineComponent({ }, mounted() { document.querySelector('input')!.disabled = true; + }, + unmounted() { + if (('' + this.modsPerPage) === '') { + console.warn('Incorrect value for modsPerPage, resetting it to 20.'); + this.modsPerPage = 20; + } } }); @@ -110,4 +143,19 @@ h3:first-of-type { .el-switch { margin-left: 50px; } + + +/* Parameter panel styles */ +.fc_parameter__panel { + margin: 30px 0; +} + +.fc_parameter__panel h3 { + margin-bottom: 5px; +} + +.fc_parameter__panel h6 { + margin-top: 0; + margin-bottom: 12px; +} diff --git a/src-vue/src/views/ThunderstoreModsView.vue b/src-vue/src/views/ThunderstoreModsView.vue index 5b74bd1c..5733d30b 100644 --- a/src-vue/src/views/ThunderstoreModsView.vue +++ b/src-vue/src/views/ThunderstoreModsView.vue @@ -3,7 +3,7 @@
- +
@@ -12,6 +12,16 @@ + + +
@@ -21,16 +31,32 @@
- + +
+ + +
+
+ +