diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/api/routes/files/albumAddPOST.js | 3 | ||||
| -rw-r--r-- | src/api/routes/files/albumDelPOST.js | 3 | ||||
| -rw-r--r-- | src/site/components/grid/Grid.vue | 83 | ||||
| -rw-r--r-- | src/site/pages/dashboard/albums/_id.vue | 1 | ||||
| -rw-r--r-- | src/site/pages/dashboard/index.vue | 9 | ||||
| -rw-r--r-- | src/site/pages/index.vue | 9 | ||||
| -rw-r--r-- | src/site/store/album.js | 57 | ||||
| -rw-r--r-- | src/site/store/images.js | 69 |
8 files changed, 128 insertions, 106 deletions
diff --git a/src/api/routes/files/albumAddPOST.js b/src/api/routes/files/albumAddPOST.js index af39caa..a88e636 100644 --- a/src/api/routes/files/albumAddPOST.js +++ b/src/api/routes/files/albumAddPOST.js @@ -24,7 +24,8 @@ class albumAddPOST extends Route { } return res.json({ - message: 'Successfully added file to album' + message: 'Successfully added file to album', + data: { fileId, album: { id: album.id, name: album.name } }, }); } } diff --git a/src/api/routes/files/albumDelPOST.js b/src/api/routes/files/albumDelPOST.js index 9a4b87b..6e4d576 100644 --- a/src/api/routes/files/albumDelPOST.js +++ b/src/api/routes/files/albumDelPOST.js @@ -25,7 +25,8 @@ class albumDelPOST extends Route { } return res.json({ - message: 'Successfully removed file from album' + message: 'Successfully removed file from album', + data: { fileId, album: { id: album.id, name: album.name } }, }); } } diff --git a/src/site/components/grid/Grid.vue b/src/site/components/grid/Grid.vue index f98108e..42dcc6b 100644 --- a/src/site/components/grid/Grid.vue +++ b/src/site/components/grid/Grid.vue @@ -70,7 +70,7 @@ </a> </b-tooltip> <b-tooltip label="Tags" position="is-top"> - <a class="btn" @click="manageTags(item)"> + <a class="btn" @click="false && manageTags(item)"> <i class="icon-ecommerce-tag-c" /> </a> </b-tooltip> @@ -163,7 +163,7 @@ <hr> <div class="albums-container"> - <div v-for="(album, index) in albums" :key="index" class="album"> + <div v-for="(album, index) in albums" :key="album.id" class="album"> <div class="field"> <b-checkbox :value="isAlbumSelected(album.id)" @@ -224,7 +224,6 @@ export default { showWaterfall: true, searchTerm: null, showList: false, - albums: [], hoveredItems: [], isAlbumsModalActive: false, showingModalForFile: null, @@ -236,6 +235,8 @@ export default { computed: { ...mapState({ user: (state) => state.auth.user, + albums: (state) => state.albums.tinyDetails, + images: (state) => state.images, }), blank() { // eslint-disable-next-line global-require, import/no-unresolved @@ -245,33 +246,31 @@ export default { return this.files; }, }, + created() { + this.getAlbums(); + }, methods: { async search() { const data = await this.$search.do(this.searchTerm, ['name', 'original', 'type', 'albums:name']); console.log('> Search result data', data); }, deleteFile(file) { - this.$emit('delete', file); - /* this.$buefy.dialog.confirm({ + // this.$emit('delete', file); + this.$buefy.dialog.confirm({ title: 'Deleting file', message: 'Are you sure you want to <b>delete</b> this file?', confirmText: 'Delete File', type: 'is-danger', onConfirm: async () => { - const response = await this.$axios.$delete(`file/${file.id}`); - if (this.showList) { - file.hideFromList = true; - this.$forceUpdate(); - } else { - this.showWaterfall = false; - this.files.splice(index, 1); - this.$nextTick(() => { - this.showWaterfall = true; - }); + try { + const response = await this.$store.dispatch('images/deleteFile', file.id); + + this.$buefy.toast.open(response.message); + } catch (e) { + this.$store.dispatch('alert/set', { text: e.message, error: true }, { root: true }); } - return this.$buefy.toast.open(response.message); }, - }); */ + }); }, isAlbumSelected(id) { if (!this.showingModalForFile) return false; @@ -279,38 +278,52 @@ export default { return !!(found && found.id); }, async openAlbumModal(file) { + const { id } = file; this.showingModalForFile = file; this.showingModalForFile.albums = []; - this.isAlbumsModalActive = true; - const response = await this.$axios.$get(`file/${file.id}/albums`); - this.showingModalForFile.albums = response.albums; + try { + await this.$store.dispatch('images/getFileAlbums', id); + } catch (e) { + this.$store.dispatch('alert/set', { text: e.message, error: true }, { root: true }); + } + this.showingModalForFile.albums = this.images.filesAlbums[id]; - this.getAlbums(); + this.isAlbumsModalActive = true; }, - async albumCheckboxClicked(value, id) { - const response = await this.$axios.$post(`file/album/${value ? 'add' : 'del'}`, { - albumId: id, - fileId: this.showingModalForFile.id, - }); - this.$buefy.toast.open(response.message); - - // Not the prettiest solution to refetch on each click but it'll do for now - this.$parent.getFiles(); + async albumCheckboxClicked(add, id) { + try { + let response; + if (add) { + response = await this.$store.dispatch('images/addToAlbum', { + albumId: id, + fileId: this.showingModalForFile.id, + }); + } else { + response = await this.$store.dispatch('images/removeFromAlbum', { + albumId: id, + fileId: this.showingModalForFile.id, + }); + } + + this.$buefy.toast.open(response.message); + } catch (e) { + this.$store.dispatch('alert/set', { text: e.message, error: true }, { root: true }); + } }, async getAlbums() { - const response = await this.$axios.$get('albums/dropdown'); - this.albums = response.albums; - this.$forceUpdate(); + try { + await this.$store.dispatch('albums/getTinyDetails'); + } catch (e) { + this.$store.dispatch('alert/set', { text: e.message, error: true }, { root: true }); + } }, mouseOver(id) { - console.log('in', id); const foundIndex = this.hoveredItems.indexOf(id); if (foundIndex > -1) return; this.hoveredItems.push(id); }, mouseOut(id) { - console.log('out', id); const foundIndex = this.hoveredItems.indexOf(id); if (foundIndex > -1) this.hoveredItems.splice(foundIndex, 1); }, diff --git a/src/site/pages/dashboard/albums/_id.vue b/src/site/pages/dashboard/albums/_id.vue index 33b0319..b25762e 100644 --- a/src/site/pages/dashboard/albums/_id.vue +++ b/src/site/pages/dashboard/albums/_id.vue @@ -83,6 +83,7 @@ export default { Grid, }, middleware: ['auth', ({ route, store }) => { + store.commit('images/resetState'); store.dispatch('images/fetchByAlbumId', { id: route.params.id }); }], data() { diff --git a/src/site/pages/dashboard/index.vue b/src/site/pages/dashboard/index.vue index 71df7eb..2f06c7e 100644 --- a/src/site/pages/dashboard/index.vue +++ b/src/site/pages/dashboard/index.vue @@ -33,14 +33,13 @@ </nav> <hr> - <b-loading :active="images.isLoading" /> + <!-- <b-loading :active="images.isLoading" /> --> <Grid v-if="totalFiles && !isLoading" :files="images.files" :enableSearch="false" - class="grid" - @delete="handleFileDelete"> + class="grid"> <template v-slot:pagination> <b-pagination v-if="shouldPaginate" @@ -77,6 +76,7 @@ export default { Grid, }, middleware: ['auth', ({ store }) => { + store.commit('images/resetState'); store.dispatch('images/fetch'); }], data() { @@ -108,9 +108,6 @@ export default { await this.fetch(this.current); this.isLoading = false; }, - handleFileDelete(file) { - console.log('yep!', file.id); - }, }, }; </script> diff --git a/src/site/pages/index.vue b/src/site/pages/index.vue index bb35be3..c8fb7b8 100644 --- a/src/site/pages/index.vue +++ b/src/site/pages/index.vue @@ -19,7 +19,8 @@ </div> <div class="container uploader"> <Uploader v-if="config.publicMode || (!config.publicMode && loggedIn)" /> - <div v-else + <div + v-else class="has-text-centered is-size-4 has-text-danger"> This site has disabled public uploads. You need an account. </div> @@ -39,15 +40,15 @@ export default { components: { Logo, Uploader, - Links + Links, }, data() { return { albums: [] }; }, computed: { ...mapGetters({ loggedIn: 'auth/isLoggedIn' }), - ...mapState(['config']) - } + ...mapState(['config']), + }, }; </script> <style lang="scss" scoped> diff --git a/src/site/store/album.js b/src/site/store/album.js deleted file mode 100644 index d8ffacc..0000000 --- a/src/site/store/album.js +++ /dev/null @@ -1,57 +0,0 @@ -export const state = () => ({ - files: [], - name: null, - isLoading: false, - pagination: { - page: 1, - limit: 30, - totalFiles: 0, - }, - downloadEnabled: false, -}); - -export const getters = { - getTotalFiles: ({ pagination }) => pagination.totalFiles, - getFetchedCount: ({ files }) => files.length, - shouldPaginate: ({ pagination }) => pagination.totalFiles > pagination.limit, - getLimit: ({ pagination }) => pagination.limit, - getName: ({ name }) => name, -}; - -export const actions = { - async fetchById({ commit, dispatch, state }, { id, page }) { - commit('setIsLoading'); - - page = page || 1; - - try { - const response = await this.$axios.$get(`album/${id}/full`, { - params: { limit: state.pagination.limit, page }, - }); - - commit('setFiles', response); - commit('updatePaginationMeta', { totalFiles: response.count, page }); - } catch (e) { - dispatch('alert/set', { text: e.message, error: true }, { root: true }); - } - }, - // TODO: Fix duplicate code between this store and files store - deleteFile({ commit }, fileId) { - - }, -}; - -export const mutations = { - setIsLoading(state) { - state.isLoading = true; - }, - setFiles(state, { files, name }) { - state.files = files || []; - state.name = name; - state.isLoading = false; - }, - updatePaginationMeta(state, { page, totalFiles }) { - state.pagination.page = page || 1; - state.pagination.totalFiles = totalFiles || 0; - }, -}; diff --git a/src/site/store/images.js b/src/site/store/images.js index d02219f..3019d85 100644 --- a/src/site/store/images.js +++ b/src/site/store/images.js @@ -1,4 +1,6 @@ -export const state = () => ({ +import Vue from 'vue'; + +export const getDefaultState = () => ({ files: [], isLoading: false, pagination: { @@ -8,8 +10,11 @@ export const state = () => ({ }, name: null, downloadEnabled: false, + filesAlbums: {}, }); +export const state = getDefaultState; + export const getters = { getTotalFiles: ({ pagination }) => pagination.totalFiles, getFetchedCount: ({ files }) => files.length, @@ -28,11 +33,15 @@ export const actions = { const response = await this.$axios.$get('files', { params: { limit: state.pagination.limit, page } }); commit('setFilesAndMeta', { ...response, page }); + + return response; } catch (e) { dispatch('alert/set', { text: e.message, error: true }, { root: true }); } + + return null; }, - async fetchByAlbumId({ commit, dispatch, state }, { id, page }) { + async fetchByAlbumId({ commit, state }, { id, page }) { commit('setIsLoading'); page = page || 1; @@ -42,6 +51,36 @@ export const actions = { }); commit('setFilesAndMeta', { ...response, page }); + + return response; + }, + async getFileAlbums({ commit }, fileId) { + const response = await this.$axios.$get(`file/${fileId}/albums`); + + commit('setFileAlbums', { ...response, fileId }); + + return response; + }, + async addToAlbum({ commit }, { fileId, albumId }) { + const response = await this.$axios.$post('file/album/add', { fileId, albumId }); + + commit('addAlbumToFile', { fileId, albumId, ...response.data }); + + return response; + }, + async removeFromAlbum({ commit }, { fileId, albumId }) { + const response = await this.$axios.$post('file/album/del', { fileId, albumId }); + + commit('removeAlbumFromFile', { fileId, albumId }); + + return response; + }, + async deleteFile({ commit }, fileId) { + const response = await this.$axios.$delete(`file/${fileId}`); + + commit('removeFile', fileId); + + return response; }, }; @@ -58,4 +97,30 @@ export const mutations = { state.pagination.page = page || 1; state.pagination.totalFiles = count || 0; }, + removeFile(state, fileId) { + const foundIndex = state.files.findIndex(({ id }) => id === fileId); + if (foundIndex > -1) { + state.files.splice(foundIndex, 1); + state.pagination.totalFiles -= 1; + } + }, + setFileAlbums(state, { fileId, albums }) { + Vue.set(state.filesAlbums, fileId, albums); + }, + addAlbumToFile(state, { fileId, album }) { + if (!state.filesAlbums[fileId]) return; + + state.filesAlbums[fileId].push(album); + }, + removeAlbumFromFile(state, { fileId, albumId }) { + if (!state.filesAlbums[fileId]) return; + + const foundIndex = state.filesAlbums[fileId].findIndex(({ id }) => id === albumId); + if (foundIndex > -1) { + state.filesAlbums[fileId].splice(foundIndex, 1); + } + }, + resetState(state) { + Object.assign(state, getDefaultState()); + }, }; |