ViewReport.vue 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <template>
  2. <modal title="View Report">
  3. <div slot="body" v-if="report && report._id">
  4. <router-link
  5. v-if="$route.query.returnToSong"
  6. class="button is-dark back-to-song"
  7. :to="{
  8. path: '/admin/songs',
  9. query: { id: report.songId }
  10. }"
  11. >
  12. <i class="material-icons">keyboard_return</i> &nbsp; Edit Song
  13. </router-link>
  14. <article class="message">
  15. <div class="message-body">
  16. <strong>Song ID:</strong>
  17. {{ report.song.songId }} / {{ report.song._id }}
  18. <br />
  19. <strong>Author:</strong>
  20. <user-id-to-username
  21. :user-id="report.createdBy"
  22. :alt="report.createdBy"
  23. />
  24. <br />
  25. <strong>Time of report:</strong>
  26. <span :title="report.createdAt">
  27. {{
  28. formatDistance(
  29. new Date(report.createdAt),
  30. new Date(),
  31. {
  32. addSuffix: true
  33. }
  34. )
  35. }}
  36. </span>
  37. <br />
  38. <span v-if="report.description">
  39. <strong>Description:</strong>
  40. {{ report.description }}
  41. </span>
  42. </div>
  43. </article>
  44. <table v-if="report.issues.length > 0" class="table is-narrow">
  45. <thead>
  46. <tr>
  47. <td>Issue</td>
  48. <td>Reasons</td>
  49. </tr>
  50. </thead>
  51. <tbody>
  52. <tr v-for="(issue, index) in report.issues" :key="index">
  53. <td>
  54. <span>{{ issue.name }}</span>
  55. </td>
  56. <td>
  57. <span>{{ issue.reasons }}</span>
  58. </td>
  59. </tr>
  60. </tbody>
  61. </table>
  62. </div>
  63. <div slot="footer" v-if="report && report._id">
  64. <a class="button is-primary" href="#" @click="resolve(report._id)">
  65. <span>Resolve</span>
  66. </a>
  67. <a
  68. class="button is-primary"
  69. :href="`/admin/songs?songId=${report.song._id}`"
  70. target="_blank"
  71. >
  72. <span>Go to song</span>
  73. </a>
  74. <a
  75. class="button is-danger"
  76. @click="
  77. closeModal({
  78. sector,
  79. modal: 'viewReport'
  80. })
  81. "
  82. href="#"
  83. >
  84. <span>Cancel</span>
  85. </a>
  86. </div>
  87. </modal>
  88. </template>
  89. <script>
  90. import { mapActions, mapState } from "vuex";
  91. import { formatDistance } from "date-fns";
  92. import Toast from "toasters";
  93. import io from "../../io";
  94. import UserIdToUsername from "../../components/common/UserIdToUsername.vue";
  95. import Modal from "../../components/Modal.vue";
  96. export default {
  97. components: { Modal, UserIdToUsername },
  98. props: {
  99. reportId: { type: String, default: "" },
  100. sector: { type: String, default: "admin" }
  101. },
  102. computed: {
  103. ...mapState("viewReport", {
  104. report: state => state.report
  105. })
  106. },
  107. mounted() {
  108. if (this.$route.query.returnToSong) {
  109. this.closeModal({ sector: this.sector, modal: "editSong" });
  110. }
  111. io.getSocket(socket => {
  112. this.socket = socket;
  113. this.socket.emit(`reports.findOne`, this.reportId, res => {
  114. if (res.status === "success") {
  115. const report = res.data;
  116. this.viewReport(report);
  117. } else {
  118. new Toast({
  119. content: "Report with that ID not found",
  120. timeout: 3000
  121. });
  122. this.closeModal({
  123. sector: this.sector,
  124. modal: "viewReport"
  125. });
  126. }
  127. });
  128. return socket;
  129. });
  130. },
  131. methods: {
  132. formatDistance,
  133. resolve(reportId) {
  134. return this.resolveReport(reportId)
  135. .then(res => {
  136. if (res.status === "success")
  137. this.closeModal({
  138. sector: this.sector,
  139. modal: "viewReport"
  140. });
  141. })
  142. .catch(
  143. err => new Toast({ content: err.message, timeout: 5000 })
  144. );
  145. },
  146. ...mapActions("modals/viewReport", ["viewReport", "resolveReport"]),
  147. ...mapActions("modalVisibility", ["closeModal"])
  148. }
  149. };
  150. </script>
  151. <style lang="scss">
  152. @import "../../styles/global.scss";
  153. .back-to-song {
  154. display: flex;
  155. margin-bottom: 20px;
  156. }
  157. </style>