diff options
| author | Pitu <[email protected]> | 2021-01-20 00:43:03 +0900 |
|---|---|---|
| committer | Pitu <[email protected]> | 2021-01-20 00:43:03 +0900 |
| commit | bf0b0f64bf84f2e2b3073b1b351681508bc1e625 (patch) | |
| tree | edbe1cb93190e25809807587537ecdb4ab909684 /src | |
| parent | Merge pull request #253 from Zephyrrus/fix/fetching_restricted_data_on_public... (diff) | |
| download | host.fuwn.me-bf0b0f64bf84f2e2b3073b1b351681508bc1e625.tar.xz host.fuwn.me-bf0b0f64bf84f2e2b3073b1b351681508bc1e625.zip | |
feat: add pagination to user files in admin view
Diffstat (limited to 'src')
| -rw-r--r-- | src/api/routes/admin/userGET.js | 22 | ||||
| -rw-r--r-- | src/site/pages/dashboard/admin/user/_id.vue | 49 | ||||
| -rw-r--r-- | src/site/store/admin.js | 10 |
3 files changed, 68 insertions, 13 deletions
diff --git a/src/api/routes/admin/userGET.js b/src/api/routes/admin/userGET.js index 48c6e9b..430dfd7 100644 --- a/src/api/routes/admin/userGET.js +++ b/src/api/routes/admin/userGET.js @@ -15,10 +15,27 @@ class usersGET extends Route { .select('id', 'username', 'enabled', 'createdAt', 'editedAt', 'apiKeyEditedAt', 'isAdmin') .where({ id }) .first(); - const files = await db.table('files') + + let count = 0; + let files = db.table('files') .where({ userId: user.id }) .orderBy('id', 'desc'); + const { page, limit = 100 } = req.query; + if (page && page >= 0) { + files = await files.offset((page - 1) * limit).limit(limit); + + const dbRes = await db.table('files') + .count('* as count') + .where({ userId: user.id }) + .first(); + + count = dbRes.count; + } else { + files = await files; // execute the query + count = files.length; + } + for (let file of files) { file = Util.constructFilePublicLink(file); } @@ -26,7 +43,8 @@ class usersGET extends Route { return res.json({ message: 'Successfully retrieved user', user, - files + files, + count }); } catch (error) { return super.error(res, error); diff --git a/src/site/pages/dashboard/admin/user/_id.vue b/src/site/pages/dashboard/admin/user/_id.vue index 0ed3e86..6079bab 100644 --- a/src/site/pages/dashboard/admin/user/_id.vue +++ b/src/site/pages/dashboard/admin/user/_id.vue @@ -61,7 +61,24 @@ <Grid v-if="user.files.length" - :files="user.files" /> + :files="user.files"> + <template v-slot:pagination> + <b-pagination + :total="user.totalFiles" + :per-page="limit" + :current.sync="current" + range-before="2" + range-after="2" + class="pagination-slot" + icon-prev="icon-interface-arrow-left" + icon-next="icon-interface-arrow-right" + icon-pack="icon" + aria-next-label="Next page" + aria-previous-label="Previous page" + aria-page-label="Page" + aria-current-label="Current page" /> + </template> + </Grid> </div> </div> </div> @@ -69,7 +86,7 @@ </template> <script> -import { mapState } from 'vuex'; +import { mapState, mapGetters, mapActions } from 'vuex'; import Sidebar from '~/components/sidebar/Sidebar.vue'; import Grid from '~/components/grid/Grid.vue'; @@ -80,7 +97,7 @@ export default { }, middleware: ['auth', 'admin', ({ route, store }) => { try { - store.dispatch('admin/fetchUser', route.params.id); + store.dispatch('admin/fetchUser', { id: route.params.id }); } catch (e) { // eslint-disable-next-line no-console console.error(e); @@ -88,13 +105,31 @@ export default { }], data() { return { - options: {} + options: {}, + current: 1, + isLoading: false }; }, - computed: mapState({ - user: state => state.admin.user - }), + computed: { + ...mapGetters({ + limit: 'images/getLimit' + }), + ...mapState({ + user: state => state.admin.user + }) + }, + watch: { + current: 'fetchPaginate' + }, methods: { + ...mapActions({ + fetch: 'admin/fetchUser' + }), + async fetchPaginate() { + this.isLoading = true; + await this.fetch({ id: this.$route.params.id, page: this.current }); + this.isLoading = false; + }, promptDisableUser() { this.$buefy.dialog.confirm({ type: 'is-danger', diff --git a/src/site/store/admin.js b/src/site/store/admin.js index 0d0360b..cac1cca 100644 --- a/src/site/store/admin.js +++ b/src/site/store/admin.js @@ -35,9 +35,10 @@ export const actions = { return response; }, - async fetchUser({ commit }, id) { - const response = await this.$axios.$get(`admin/users/${id}`); - commit('setUserInfo', response); + async fetchUser({ commit }, { id, page }) { + page = page || 1; + const response = await this.$axios.$get(`admin/users/${id}`, { params: { limit: 50, page } }); + commit('setUserInfo', { ...response, page }); return response; }, @@ -107,9 +108,10 @@ export const mutations = { setUsers(state, { users }) { state.users = users; }, - setUserInfo(state, { user, files }) { + setUserInfo(state, { user, files, count }) { state.user = { ...state.user, ...user }; state.user.files = files || []; + state.user.totalFiles = count; }, setFile(state, { file }) { state.file = file || {}; |