diff --git a/front/src/components/manage/moderation/ReportCard.vue b/front/src/components/manage/moderation/ReportCard.vue index 17bc71f37841772a17eccc34b944cebc14a954fe..7053b2bbb2b1ab1f37e94a4c602f9ba64fd0e22c 100644 --- a/front/src/components/manage/moderation/ReportCard.vue +++ b/front/src/components/manage/moderation/ReportCard.vue @@ -120,6 +120,10 @@ <div v-if="!obj.target" class="ui warning message"> <translate translate-context="Content/Moderation/Message">The object associated with this report was deleted.</translate> </div> + <router-link class="ui basic button" v-if="target && configs[target.type].urls.getDetail" :to="configs[target.type].urls.getDetail(obj.target_state)"> + <i class="eye icon"></i> + <translate translate-context="Content/Moderation/Link">View public page</translate> + </router-link> <router-link class="ui basic button" v-if="target && configs[target.type].urls.getAdminDetail" :to="configs[target.type].urls.getAdminDetail(obj.target_state)"> <i class="wrench icon"></i> <translate translate-context="Content/Moderation/Link">Open in moderation interface</translate> @@ -223,7 +227,7 @@ </button> <template v-for="action in actions"> <dangerous-button - v-if="action.dangerous" + v-if="action.dangerous && action.show(obj)" :class="['ui', {loading: isLoading}, 'button']" color="" :action="action.handler"> @@ -352,15 +356,17 @@ export default { actions.push({ label: this.$pgettext('Content/Moderation/Button/Verb', 'Delete reported object'), modalHeader: this.$pgettext('Content/Moderation/Popup/Header', 'Delete reported object?'), - modalContent: this.$pgettext('Content/Moderation/Popup,Paragraph', 'This will delete the object associated with this report. This action is irreversible.'), + modalContent: this.$pgettext('Content/Moderation/Popup,Paragraph', 'This will delete the object associated with this report and mark the report as resolved. The deletion is irreversible.'), modalConfirmLabel: this.$pgettext('*/*/*/Verb', 'Delete'), icon: 'x', iconColor: 'red', + show: (obj) => { return !!obj.target }, dangerous: true, handler: () => { axios.delete(deleteUrl).then((response) => { console.log('Target deleted') self.obj.target = null + self.resolve(true) }, error => { console.log('Error while deleting target') }) diff --git a/front/src/components/moderation/ReportModal.vue b/front/src/components/moderation/ReportModal.vue index e8a30c512ef7d97a7f38fd63d22f86cf02c88e89..da2c1bfcb57c283272bd3726074b87dd3a91b7ca 100644 --- a/front/src/components/moderation/ReportModal.vue +++ b/front/src/components/moderation/ReportModal.vue @@ -19,19 +19,24 @@ <translate translate-context="*/Moderation/Popup,Paragraph">Use this form to submit a report to our moderation team.</translate> </p> <form v-if="canSubmit" id="report-form" class="ui form" @submit.prevent="submit"> - <div v-if="!$store.state.auth.authenticated" class="ui inline required field"> - <label for="report-submitter-email"> - <translate translate-context="Content/*/*/Noun">Email</translate> - </label> - <input type="email" v-model="submitterEmail" name="report-submitter-email" id="report-submitter-email" required> + <div class="fields"> + <report-category-dropdown + class="ui required eight wide field" + v-model="category" + :required="true" + :empty="true" + :restrict-to="allowedCategories" + :label="true"></report-category-dropdown> + <div v-if="!$store.state.auth.authenticated" class="ui eight wide required field"> + <label for="report-submitter-email"> + <translate translate-context="Content/*/*/Noun">Email</translate> + </label> + <input type="email" v-model="submitterEmail" name="report-submitter-email" id="report-submitter-email" required> + <p> + <translate translate-context="*/*/Field,Help">We'll use this email if we need to contact you regarding this report.</translate> + </p> + </div> </div> - <report-category-dropdown - class="ui inline required field" - v-model="category" - :required="true" - :empty="true" - :restrict-to="allowedCategories" - :label="true"></report-category-dropdown> <div class="ui field"> <label for="report-summary"> <translate translate-context="*/*/Field.Label/Noun">Message</translate> diff --git a/front/src/entities.js b/front/src/entities.js index 18c05b2488d6e921a3811588cfa1fde01d1fcaa9..c86becda9499b2fb45ff802ca6990db8edfddd2b 100644 --- a/front/src/entities.js +++ b/front/src/entities.js @@ -15,7 +15,8 @@ export default { return `manage/library/artists/${obj.id}/` }, urls: { - getAdminDetail: (obj) => { return {name: 'manage.library.artists.detail', params: {id: obj.id}}} + getDetail: (obj) => { return {name: 'library.artists.detail', params: {id: obj.id}}}, + getAdminDetail: (obj) => { return {name: 'manage.library.artists.detail', params: {id: obj.id}}}, }, moderatedFields: [ { @@ -49,6 +50,7 @@ export default { return `manage/library/albums/${obj.id}/` }, urls: { + getDetail: (obj) => { return {name: 'library.albums.detail', params: {id: obj.id}}}, getAdminDetail: (obj) => { return {name: 'manage.library.albums.detail', params: {id: obj.id}}} }, moderatedFields: [ @@ -89,6 +91,7 @@ export default { return `manage/library/tracks/${obj.id}/` }, urls: { + getDetail: (obj) => { return {name: 'library.tracks.detail', params: {id: obj.id}}}, getAdminDetail: (obj) => { return {name: 'manage.library.tracks.detail', params: {id: obj.id}}} }, moderatedFields: [ @@ -156,6 +159,7 @@ export default { label: this.$pgettext('*/*/*', 'Playlist'), icon: 'list', urls: { + getDetail: (obj) => { return {name: 'library.playlists.detail', params: {id: obj.id}}}, // getAdminDetail: (obj) => { return {name: 'manage.playlists.detail', params: {id: obj.id}}} }, moderatedFields: [ diff --git a/front/src/style/_main.scss b/front/src/style/_main.scss index 742d6667338a51d4a5080a32253d796d1879be9b..c53edd14c970cefaa51c87bfe5970170b760896d 100644 --- a/front/src/style/_main.scss +++ b/front/src/style/_main.scss @@ -166,6 +166,9 @@ body { @include media(">widedesktop") { left: $widedesktop-sidebar-width; } + > .ui.message { + box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.7); + } } .main-pusher { padding: 1.5rem 0; diff --git a/front/src/views/admin/moderation/ReportsList.vue b/front/src/views/admin/moderation/ReportsList.vue index 87bf97d2f5765302f3d579feea0e91f7378ed066..73acaf1121144dfa89180075c252456be613d46a 100644 --- a/front/src/views/admin/moderation/ReportsList.vue +++ b/front/src/views/admin/moderation/ReportsList.vue @@ -55,7 +55,7 @@ <empty-state @refresh="fetchData()" :refresh="true"></empty-state> </div> <div v-else-if="mode === 'card'"> - <report-card :obj="obj" v-for="obj in result.results" :key="obj.uuid" /> + <report-card @handled="fetchData" :obj="obj" v-for="obj in result.results" :key="obj.uuid" /> </div> </section> </main>