diff options
| author | taehoon <th.dev91@gmail.com> | 2019-03-19 04:53:11 -0400 |
|---|---|---|
| committer | taehoon <th.dev91@gmail.com> | 2019-05-03 11:40:05 -0400 |
| commit | 2cda9010df6192b008515b2138a2e071473bc40b (patch) | |
| tree | b753369b2c9803fa5c0cae0e70895f5d0dfae0cc /src/components/user_reporting_modal | |
| parent | 0438031da44a70816716de40625541d569a49c85 (diff) | |
add user reporting modal
Diffstat (limited to 'src/components/user_reporting_modal')
| -rw-r--r-- | src/components/user_reporting_modal/user_reporting_modal.js | 81 | ||||
| -rw-r--r-- | src/components/user_reporting_modal/user_reporting_modal.vue | 111 |
2 files changed, 192 insertions, 0 deletions
diff --git a/src/components/user_reporting_modal/user_reporting_modal.js b/src/components/user_reporting_modal/user_reporting_modal.js new file mode 100644 index 00000000..fb9ea16d --- /dev/null +++ b/src/components/user_reporting_modal/user_reporting_modal.js @@ -0,0 +1,81 @@ + +import Status from '../status/status.vue' +import Checkbox from '../checkbox/checkbox.js' + +const UserReportingModal = { + components: { + Status, + Checkbox + }, + data () { + return { + comment: '', + forward: false, + statusIdsToReport: [] + } + }, + computed: { + isLoggedIn () { + return !!this.$store.state.users.currentUser + }, + isOpen () { + return this.isLoggedIn && this.$store.state.reports.modalActivated + }, + userId () { + return this.$store.state.reports.userId + }, + user () { + return this.$store.getters.findUser(this.userId) + }, + remoteInstance () { + return !this.user.is_local && this.user.screen_name.substr(this.user.screen_name.indexOf('@') + 1) + }, + statuses () { + return this.$store.state.reports.statuses + } + }, + watch: { + userId (value) { + this.statusIdsToReport = [] + } + }, + methods: { + closeModal () { + this.$store.dispatch('closeUserReportingModal') + }, + reportUser () { + const payload = { + comment: this.comment, + forward: this.forward, + statusIdsToReport: this.statusIdsToReport + } + this.$store.dispatch('reportUser', payload) + }, + isChecked (statusId) { + return this.statusIdsToReport.indexOf(statusId) !== -1 + }, + toggleStatus (checked, statusId) { + if (checked === this.isChecked(statusId)) { + return + } + + if (checked) { + this.statusIdsToReport.push(statusId) + } else { + this.statusIdsToReport.splice(this.statusIdsToReport.indexOf(statusId), 1) + } + }, + resize (e) { + const target = e.target || e + if (!(target instanceof window.Element)) { return } + // Auto is needed to make textbox shrink when removing lines + target.style.height = 'auto' + target.style.height = `${target.scrollHeight}px` + if (target.value === '') { + target.style.height = null + } + } + } +} + +export default UserReportingModal diff --git a/src/components/user_reporting_modal/user_reporting_modal.vue b/src/components/user_reporting_modal/user_reporting_modal.vue new file mode 100644 index 00000000..49839da3 --- /dev/null +++ b/src/components/user_reporting_modal/user_reporting_modal.vue @@ -0,0 +1,111 @@ +<template> +<div class="modal-view" @click="closeModal" v-if="isOpen"> + <div class="user-reporting-panel panel" @click.stop=""> + <div class="panel-heading">Reporting {{user.screen_name}}</div> + <div class="panel-body"> + <div class="user-reporting-panel-left"> + <div> + <p>The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:</p> + <textarea + v-model="comment" + class="form-control" + placeholder="Additional comments" + rows="1" + @input="resize" + /> + </div> + <div v-if="!user.is_local"> + <p>The account is from another server. Send an anonymized copy of the report there as well?</p> + <Checkbox v-model="forward">Forward to {{remoteInstance}}</Checkbox> + </div> + <div> + <button class="btn btn-default" @click="reportUser">Submit</button> + </div> + </div> + <div class="user-reporting-panel-right"> + <div v-for="status in statuses" :key="status.id" class="status-fadein"> + <Status :inConversation="false" :focused="false" :statusoid="status" /> + <Checkbox :checked="isChecked(status.id)" @change="checked => toggleStatus(checked, status.id)" /> + </div> + </div> + </div> + </div> +</div> +</template> + +<script src="./user_reporting_modal.js"></script> + +<style lang="scss"> +@import '../../_variables.scss'; + +.user-reporting-panel { + width: 90vw; + max-width: 700px; + + .panel-body { + display: flex; + border-top: 1px solid; + border-color: $fallback--border; + border-color: var(--border, $fallback--border); + } + + &-left { + width: 50%; + padding: 1.1em; + border-right: 1px solid; + border-color: $fallback--border; + border-color: var(--border, $fallback--border); + max-width: 320px; + line-height: 1.4em; + box-sizing: border-box; + + > div { + margin-bottom: 2em; + + &:last-child { + margin-bottom: 0; + } + } + + p { + margin-top: 0; + } + + textarea.form-control { + line-height: 16px; + resize: none; + overflow: hidden; + transition: min-height 200ms 100ms; + min-height: 44px; + width: 100%; + } + + .btn { + min-width: 10em; + padding: 0 2em; + } + } + + &-right { + width: 50%; + flex: 1 1 auto; + min-height: 20vh; + max-height: 80vh; + overflow-y: auto; + overflow-x: hidden; + + > div { + display: flex; + justify-content: space-between; + border-bottom-width: 1px; + border-bottom-style: solid; + border-color: $fallback--border; + border-color: var(--border, $fallback--border); + + .checkbox { + margin: 0.75em; + } + } + } +} +</style> |
