aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPitu <[email protected]>2021-01-20 00:43:03 +0900
committerPitu <[email protected]>2021-01-20 00:43:03 +0900
commitbf0b0f64bf84f2e2b3073b1b351681508bc1e625 (patch)
treeedbe1cb93190e25809807587537ecdb4ab909684 /src
parentMerge pull request #253 from Zephyrrus/fix/fetching_restricted_data_on_public... (diff)
downloadhost.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.js22
-rw-r--r--src/site/pages/dashboard/admin/user/_id.vue49
-rw-r--r--src/site/store/admin.js10
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 || {};