From e750480fd00cdec128a6af904f0fce2b2a12b946 Mon Sep 17 00:00:00 2001 From: MarcZierle Date: Sun, 16 Jan 2022 20:52:54 +0100 Subject: [PATCH] add photo picker --- public/favicon.ico | Bin 4286 -> 0 bytes public/favicon.png | Bin 0 -> 3980 bytes public/index.html | 2 +- src/api/index.js | 36 ++++ src/components/PhotoSelectModal.vue | 157 ++++++++++++++++ src/router/index.js | 11 +- src/store/index.js | 128 ++++++++++++- src/views/CreateLog.vue | 268 +++++++++++++++++++++++++++- src/views/LogsList.vue | 9 +- 9 files changed, 600 insertions(+), 11 deletions(-) delete mode 100644 public/favicon.ico create mode 100644 public/favicon.png create mode 100644 src/components/PhotoSelectModal.vue diff --git a/public/favicon.ico b/public/favicon.ico deleted file mode 100644 index df36fcfb72584e00488330b560ebcf34a41c64c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a6a97696053f0e1d2bcea27ed476b2f6fc29a7 GIT binary patch literal 3980 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 NA=30_*$s5m{{eVxX(j*w literal 0 HcmV?d00001 diff --git a/public/index.html b/public/index.html index 32e2d00..dc4bbbf 100644 --- a/public/index.html +++ b/public/index.html @@ -4,7 +4,7 @@ - + <%= htmlWebpackPlugin.options.title %> diff --git a/src/api/index.js b/src/api/index.js index f7d0add..6a016ac 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -12,4 +12,40 @@ const apiClient = axios.create({ export function getPhotoLogList() { return apiClient.get('/photologs/') +} + +export function getPhotoLog(id) { + return apiClient.get('/photolog/'+id+'/') +} + +export function addNewPhotoLog(title, date) { + return apiClient.post('/addphotolog/', { + title, + date: date, + render_date: true, + start_slide_image: null, + slides: [] + }) +} + +export function updatePhotoLog({id, title, date, render_date, start_slide_image, slides}) { + return apiClient.put('/updatephotolog/'+id+'/', { + title, + date, + render_date, + start_slide_image, + slides + }) +} + +export function deletePhotoLog(id) { + return apiClient.delete('/deletephotolog/'+id+'/') +} + +export function getPhotoGroups() { + return apiClient.get('/photogroups/') +} + +export function getPhotosByGroup(group_id) { + return apiClient.get('/photos/?photogroup='+group_id) } \ No newline at end of file diff --git a/src/components/PhotoSelectModal.vue b/src/components/PhotoSelectModal.vue new file mode 100644 index 0000000..c8134ac --- /dev/null +++ b/src/components/PhotoSelectModal.vue @@ -0,0 +1,157 @@ + + + + + + \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js index 5792f42..e76698a 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -17,9 +17,16 @@ const routes = [ component: LogsList }, { - path: '/logs/create', + path: '/logs/create/:e?', name: 'CreateLog', - component: CreateLog + component: CreateLog, + props: (route) => { + const e = Number.parseInt(route.params.e) + if (Number.isNaN(e)) { + return '' + } + return {e} + } } ] diff --git a/src/store/index.js b/src/store/index.js index 374b65e..0cebec5 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -1,22 +1,142 @@ import { createStore } from 'vuex' -import { getPhotoLogList } from '@/api' +import { + getPhotoLogList, + deletePhotoLog, + addNewPhotoLog, + getPhotoLog, + updatePhotoLog, + getPhotoGroups, + getPhotosByGroup +} from '@/api' export default createStore({ state: { - photoLogList: [] + photoLogList: [], + photoLogs: [], + photoGroups: [], + photos: [] }, mutations: { SET_PHOTO_LOG_LIST(state, newPhotoLogList) { state.photoLogList = newPhotoLogList + }, + SET_PHOTO_LOG(state, photoLog) { + let log_index = state.photoLogs.findIndex(log => log.id === photoLog.id) + if (log_index > -1) { + state.photoLogs[log_index] = photoLog + } else { + state.photoLogs.push(photoLog) + } + }, + REMOVE_PHOTO_LOG(state, id) { + let log_index = state.photoLogList.findIndex(log => log.id === id) + state.photoLogList.splice(log_index, 1) + }, + SET_PHOTO_GROUPS(state, groups) { + state.photoGroups = groups + }, + SET_PHOTOS_IN_GROUP(state, {group_id, photos}) { + if (group_id in state.photos) { + state.photos.group_id = photos + } else { + state.photos = {...state.photos, [group_id]: photos} + } } }, actions: { loadPhotoLogList({commit}) { - getPhotoLogList().then((response) => { - commit('SET_PHOTO_LOG_LIST', response.data) + return new Promise((resolve, reject) => { + getPhotoLogList().then((response) => { + commit('SET_PHOTO_LOG_LIST', response.data) + resolve() + }).catch((error) => { + console.log(error) + reject() + }) + }) + }, + loadPhotoLog({commit}, id) { + return new Promise((resolve, reject) => { + getPhotoLog(id).then((response) => { + commit('SET_PHOTO_LOG', response.data) + resolve() + }).catch((error) => { + console.log(error) + reject() + }) + }) + }, + deletePhotoLog({commit}, id) { + deletePhotoLog(id).then(() => { + commit('REMOVE_PHOTO_LOG', id) }).catch((error) => { console.log(error) }) + }, + addNewPhotoLog({dispatch}, {title, date}) { + return new Promise((resolve, reject) => { + addNewPhotoLog(title, date).then((response) => { + dispatch('loadPhotoLogList') + resolve(response.data.id) + }).catch((error) => { + console.log(error) + reject(error) + }) + }) + }, + updatePhotoLogDetails({commit}, photolog) { + if (photolog !== null) { + commit('SET_PHOTO_LOG', photolog) + return updatePhotoLog(photolog) + } + }, + loadPhotoGroups({commit}) { + return new Promise((resolve, reject) => { + getPhotoGroups().then((response) => { + commit('SET_PHOTO_GROUPS', response.data) + resolve(response.data) + }).catch((error) => { + reject(error) + }) + }) + }, + loadPhotosInGroup({commit}, group_id) { + return new Promise((resolve, reject) => { + getPhotosByGroup(group_id).then((response) => { + commit('SET_PHOTOS_IN_GROUP', {group_id, photos: response.data}) + resolve(response.data) + }).catch((error) => { + reject(error) + }) + }) + }, + loadPhotosInAllGroups({dispatch, getters}) { + for (const index in getters.photoGroups) { + const group_id = getters.photoGroups[index].id + dispatch('loadPhotosInGroup', group_id) + } + } + }, + getters: { + photoLogById: (state) => (id) => { + let log = state.photoLogList.filter(log => log.id == id) + if (log.length > 0) { + return log[0] + } + return null + }, + photoLogDetailsById: (state) => (id) => { + let log = state.photoLogs.filter(log => log.id == id) + if (log.length > 0) { + return log[0] + } + return null + }, + photoGroups (state) { + return state.photoGroups + }, + photos (state) { + return state.photos } }, modules: {}, diff --git a/src/views/CreateLog.vue b/src/views/CreateLog.vue index 1b7ca5a..81e9beb 100644 --- a/src/views/CreateLog.vue +++ b/src/views/CreateLog.vue @@ -1,14 +1,278 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/src/views/LogsList.vue b/src/views/LogsList.vue index 0fbe104..bfa3e02 100644 --- a/src/views/LogsList.vue +++ b/src/views/LogsList.vue @@ -9,7 +9,9 @@ - {{ photolog.title }} + + {{ photolog.title }} + {{ photolog.date }} Delete @@ -72,7 +74,10 @@ export default { this.deleteModalContent = 'Do you want to permanently delete "' + logtitle + '"?' }, deleteLog() { - console.log('delete ' + this.deleteId) + if (this.deleteId !== null) { + this.$store.dispatch('deletePhotoLog', this.deleteId) + this.deleteId = null + } } } }