logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://hacktivis.me/git/pleroma-fe.git
commit: 89c49b6fb46e607aee07afd5bc436e8f2f605bfe
parent 0e51e824a29204bb193e2707d6f65b6caaee719d
Author: Tusooa Zhu <tusooa@kazv.moe>
Date:   Thu, 17 Mar 2022 17:11:53 -0400

Allow editing announcements

Diffstat:

Msrc/components/announcement/announcement.js31+++++++++++++++++++++++++++++--
Msrc/components/announcement/announcement.vue50++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/components/announcement_editor/announcement_editor.vue24++++++++++++++++--------
Msrc/components/announcements_page/announcements_page.vue7-------
Msrc/modules/announcements.js6++++++
Msrc/services/api/api.service.js23+++++++++++++++++++----
6 files changed, 118 insertions(+), 23 deletions(-)

diff --git a/src/components/announcement/announcement.js b/src/components/announcement/announcement.js @@ -12,8 +12,10 @@ const Announcement = { newAnnouncement: { content: '', startsAt: undefined, - endsAt: undefined - } + endsAt: undefined, + allDay: undefined + }, + editError: '' } }, props: { @@ -58,6 +60,31 @@ const Announcement = { formatTimeOrDate (time, locale) { const d = new Date(time) return this.announcement['all_day'] ? d.toLocaleDateString(locale) : d.toLocaleString(locale) + }, + enterEditMode () { + this.newAnnouncement.content = this.announcement.pleroma['raw_content'] + this.newAnnouncement.startsAt = this.announcement['starts_at'] + this.newAnnouncement.endsAt = this.announcement['ends_at'] + this.newAnnouncement.allDay = this.announcement['all_day'] + this.editing = true + }, + submitEdit () { + this.$store.dispatch('editAnnouncement', { + id: this.announcement.id, + ...this.newAnnouncement + }) + .then(() => { + this.editing = false + }) + .catch(error => { + this.editError = error.error + }) + }, + cancelEdit () { + this.editing = false + }, + clearError () { + this.editError = undefined } } } diff --git a/src/components/announcement/announcement.vue b/src/components/announcement/announcement.vue @@ -16,7 +16,10 @@ /> </div> <div class="footer"> - <div class="times"> + <div + v-if="!editing" + class="times" + > <span v-if="startsAt"> {{ $t('announcements.start_time_display', { time: startsAt }) }} </span> @@ -24,7 +27,10 @@ {{ $t('announcements.end_time_display', { time: endsAt }) }} </span> </div> - <div class="actions"> + <div + v-if="!editing" + class="actions" + > <button v-if="currentUser" class="btn button-default" @@ -36,11 +42,51 @@ <button v-if="currentUser && currentUser.role === 'admin'" class="btn button-default" + @click="enterEditMode" + > + {{ $t('announcements.edit_action') }} + </button> + <button + v-if="currentUser && currentUser.role === 'admin'" + class="btn button-default" @click="deleteAnnouncement" > {{ $t('announcements.delete_action') }} </button> </div> + <div + v-else + class="actions" + > + <button + class="btn button-default" + @click="submitEdit" + > + {{ $t('announcements.submit_edit_action') }} + </button> + <button + class="btn button-default" + @click="cancelEdit" + > + {{ $t('announcements.cancel_edit_action') }} + </button> + <div + v-if="editing && editError" + class="alert error" + > + {{ $t('announcements.edit_error', { error }) }} + <button + class="button-unstyled" + @click="clearError" + > + <FAIcon + class="fa-scale-110 fa-old-padding" + icon="times" + :title="$t('announcements.close_error')" + /> + </button> + </div> + </div> </div> </div> </template> diff --git a/src/components/announcement_editor/announcement_editor.vue b/src/components/announcement_editor/announcement_editor.vue @@ -41,12 +41,20 @@ <script src="./announcement_editor.js"></script> <style lang="scss"> - .announcement-editor { - display: flex; - align-items: stretch; - flex-direction: column; - .announcement-metadata { - margin-top: 0.5em; - } - } +.announcement-editor { + display: flex; + align-items: stretch; + flex-direction: column; + + .announcement-metadata { + margin-top: 0.5em; + } + + .post-textarea { + resize: vertical; + height: 10em; + overflow: none; + box-sizing: content-box; + } +} </style> diff --git a/src/components/announcements_page/announcements_page.vue b/src/components/announcements_page/announcements_page.vue @@ -71,13 +71,6 @@ margin-bottom: var(--status-margin, $status-margin); } - .post-textarea { - resize: vertical; - height: 10em; - overflow: none; - box-sizing: content-box; - } - .post-button { min-width: 10em; } diff --git a/src/modules/announcements.js b/src/modules/announcements.js @@ -65,6 +65,12 @@ const announcements = { return store.dispatch('fetchAnnouncements') }) }, + editAnnouncement (store, { id, content, startsAt, endsAt, allDay }) { + return store.rootState.api.backendInteractor.editAnnouncement({ id, content, startsAt, endsAt, allDay }) + .then(() => { + return store.dispatch('fetchAnnouncements') + }) + }, deleteAnnouncement (store, id) { return store.rootState.api.backendInteractor.deleteAnnouncement({ id }) .then(() => { diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js @@ -104,6 +104,7 @@ const PLEROMA_ADMIN_REPORTS = '/api/pleroma/admin/reports' const PLEROMA_BACKUP_URL = '/api/v1/pleroma/backups' const PLEROMA_ANNOUNCEMENTS_URL = '/api/v1/pleroma/admin/announcements' const PLEROMA_POST_ANNOUNCEMENT_URL = '/api/v1/pleroma/admin/announcements' +const PLEROMA_EDIT_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}` const PLEROMA_DELETE_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}` const oldfetch = window.fetch @@ -1382,26 +1383,39 @@ const dismissAnnouncement = ({ id, credentials }) => { }) } -const postAnnouncement = ({ credentials, content, startsAt, endsAt, allDay }) => { +const announcementToPayload = ({ content, startsAt, endsAt, allDay }) => { const payload = { content } if (typeof startsAt !== 'undefined') { - payload['starts_at'] = new Date(startsAt).toISOString() + payload['starts_at'] = startsAt ? new Date(startsAt).toISOString() : null } if (typeof endsAt !== 'undefined') { - payload['ends_at'] = new Date(endsAt).toISOString() + payload['ends_at'] = endsAt ? new Date(endsAt).toISOString() : null } if (typeof allDay !== 'undefined') { payload['all_day'] = allDay } + return payload +} + +const postAnnouncement = ({ credentials, content, startsAt, endsAt, allDay }) => { return promisedRequest({ url: PLEROMA_POST_ANNOUNCEMENT_URL, credentials, method: 'POST', - payload + payload: announcementToPayload({ content, startsAt, endsAt, allDay }) + }) +} + +const editAnnouncement = ({ id, credentials, content, startsAt, endsAt, allDay }) => { + return promisedRequest({ + url: PLEROMA_EDIT_ANNOUNCEMENT_URL(id), + credentials, + method: 'PATCH', + payload: announcementToPayload({ content, startsAt, endsAt, allDay }) }) } @@ -1743,6 +1757,7 @@ const apiService = { fetchAnnouncements, dismissAnnouncement, postAnnouncement, + editAnnouncement, deleteAnnouncement, adminFetchAnnouncements }