From 855f8640b2c017dd3c12490bc8430e2e29f6feab Mon Sep 17 00:00:00 2001
From: Angelina Filippova <linakirsanova@gmail.com>
Date: Tue, 27 Oct 2020 01:46:51 +0300
Subject: [PATCH] Extract Report content into a separate component and reuse it
 in single report component

---
 src/views/reports/components/Report.vue       | 149 +-------------
 .../reports/components/ReportContent.vue      | 182 ++++++++++++++++++
 src/views/reports/show.vue                    |   7 +-
 3 files changed, 190 insertions(+), 148 deletions(-)
 create mode 100644 src/views/reports/components/ReportContent.vue

diff --git a/src/views/reports/components/Report.vue b/src/views/reports/components/Report.vue
index 7b2bbe7e..81847635 100644
--- a/src/views/reports/components/Report.vue
+++ b/src/views/reports/components/Report.vue
@@ -28,83 +28,7 @@
             </div>
           </div>
           <el-divider class="divider"/>
-          <div class="report-account-container">
-            <span class="report-row-key">{{ $t('reports.account') }}:</span>
-            <div class="report-account">
-              <router-link
-                v-if="propertyExists(report.account, 'id')"
-                :to="{ name: 'UsersShow', params: { id: report.account.id }}"
-                class="router-link">
-                <img
-                  v-if="propertyExists(report.account, 'avatar')"
-                  :src="report.account.avatar"
-                  alt="avatar"
-                  class="avatar-img">
-                <span v-if="propertyExists(report.account, 'nickname')" class="report-account-name">{{ report.account.nickname }}</span>
-                <span v-else class="report-account-name deactivated">({{ $t('users.invalidNickname') }})</span>
-              </router-link>
-              <span v-else class="report-account-name deactivated">({{ $t('users.invalidNickname') }})</span>
-              <a v-if="propertyExists(report.account, 'url')" :href="report.account.url" target="_blank" class="account">
-                {{ $t('userProfile.openAccountInInstance') }}
-                <i class="el-icon-top-right"/>
-              </a>
-            </div>
-          </div>
-          <div v-if="report.content && report.content.length > 0">
-            <el-divider class="divider"/>
-            <span class="report-row-key">{{ $t('reports.content') }}:
-              <span>{{ report.content }}</span>
-            </span>
-          </div>
-          <el-divider class="divider"/>
-          <div :style="showStatuses(report.statuses) ? '' : 'margin-bottom:15px'" class="report-account-container">
-            <span class="report-row-key">{{ $t('reports.actor') }}:</span>
-            <div class="report-account">
-              <router-link
-                v-if="propertyExists(report.actor, 'id')"
-                :to="{ name: 'UsersShow', params: { id: report.actor.id }}"
-                class="router-link">
-                <img
-                  v-if="propertyExists(report.actor, 'avatar')"
-                  :src="report.actor.avatar"
-                  alt="avatar"
-                  class="avatar-img">
-                <span v-if="propertyExists(report.actor, 'nickname')" class="report-account-name">{{ report.actor.nickname }}</span>
-                <span v-else class="report-account-name deactivated">({{ $t('users.invalidNickname') }})</span>
-              </router-link>
-              <span v-else class="report-account-name deactivated">({{ $t('users.invalidNickname') }})</span>
-              <a v-if="propertyExists(report.actor, 'url')" :href="report.actor.url" target="_blank" class="account">
-                {{ $t('userProfile.openAccountInInstance') }}
-                <i class="el-icon-top-right"/>
-              </a>
-            </div>
-          </div>
-          <div v-if="showStatuses(report.statuses)" class="reported-statuses">
-            <el-collapse>
-              <el-collapse-item :title="getStatusesTitle(report.statuses)">
-                <div v-for="status in report.statuses" :key="status.id">
-                  <status :status="status" :account="status.account.nickname ? status.account : report.account" :show-checkbox="false" :page="currentPage"/>
-                </div>
-              </el-collapse-item>
-            </el-collapse>
-          </div>
-          <div class="report-notes">
-            <el-collapse>
-              <el-collapse-item :title="getNotesTitle(report.notes)">
-                <note-card v-for="(note, index) in report.notes" :key="index" :note="note" :report="report"/>
-              </el-collapse-item>
-            </el-collapse>
-            <div class="report-note-form">
-              <el-input
-                v-model="notes[report.id]"
-                :placeholder="$t('reports.leaveNote')"
-                type="textarea"
-                rows="2"/>
-              <div class="report-post-note">
-                <el-button @click="handleNewNote(report.id)">{{ $t('reports.postNote') }}</el-button>
-              </div>
-            </div>
-          </div>
+          <report-content :report="report"/>
         </el-card>
       </el-timeline-item>
     </el-timeline>
@@ -123,24 +47,18 @@
 
 <script>
 import moment from 'moment'
-import NoteCard from './NoteCard'
-import Status from '@/components/Status'
 import ModerateUserDropdown from './ModerateUserDropdown'
+import ReportContent from './ReportContent'
 
 export default {
   name: 'Report',
-  components: { Status, ModerateUserDropdown, NoteCard },
+  components: { ModerateUserDropdown, ReportContent },
   props: {
     reports: {
       type: Array,
       required: true
     }
   },
-  data() {
-    return {
-      notes: {}
-    }
-  },
   computed: {
     loading() {
       return this.$store.state.reports.loading
@@ -172,16 +90,6 @@ export default {
           return 'primary'
       }
     },
-    getStatusesTitle(statuses = []) {
-      return `Reported statuses: ${statuses.length} item(s)`
-    },
-    getNotesTitle(notes = []) {
-      return `Notes: ${notes.length} item(s)`
-    },
-    handleNewNote(reportID) {
-      this.$store.dispatch('CreateReportNote', { content: this.notes[reportID], reportID })
-      this.notes[reportID] = ''
-    },
     handlePageChange(page) {
       this.$store.dispatch('FetchReports', page)
     },
@@ -193,9 +101,6 @@ export default {
         return account[property] && account[_secondProperty]
       }
       return account[property]
-    },
-    showStatuses(statuses = []) {
-      return statuses.length > 0
     }
   }
 }
@@ -206,25 +111,9 @@ export default {
     margin: 0;
     height: 17px;
   }
-  .account {
-    line-height: 26px;
-    font-size: 13px;
-    color: #606266;
-  }
-  .account:hover {
-    text-decoration: underline;
-  }
-  .avatar-img {
-    vertical-align: bottom;
-    width: 15px;
-    height: 15px;
-  }
   .divider {
     margin: 15px 0;
   }
-  .deactivated {
-    color: gray;
-  }
   .el-card__body {
     padding: 17px;
   }
@@ -279,35 +168,9 @@ export default {
       height: 40px;
     }
   }
-  .report-account {
-    display: flex;
-    align-items: baseline;
-    justify-content: space-between;
-    flex-grow: 2;
-  }
-  .report-account-container {
-    display: flex;
-    align-items: baseline;
-  }
-  .report-account-name {
-    font-size: 15px;
-    font-weight: 500;
-  }
-  .report-row-key {
-    font-size: 14px;
-    font-weight: 500;
-    padding-right: 5px;
-  }
   .report-title {
     margin: 0;
   }
-  .report-note-form {
-    margin: 15px 0 0 0;
-  }
-  .report-post-note {
-    margin: 5px 0 0 0;
-    text-align: right;
-  }
   .reports-pagination {
     margin: 25px 0;
     text-align: center;
@@ -316,12 +179,6 @@ export default {
     margin: 30px 45px 45px 19px;
     padding: 0px;
   }
-  .router-link {
-    text-decoration: none;
-  }
-  .reported-statuses {
-    margin-top: 15px;
-  }
   .submit-button {
     display: block;
     margin: 7px 0 17px auto;
diff --git a/src/views/reports/components/ReportContent.vue b/src/views/reports/components/ReportContent.vue
new file mode 100644
index 00000000..67cf16b4
--- /dev/null
+++ b/src/views/reports/components/ReportContent.vue
@@ -0,0 +1,182 @@
+<template>
+  <div>
+    <div class="report-account-container">
+      <span class="report-row-key">{{ $t('reports.account') }}:</span>
+      <div class="report-account">
+        <router-link
+          v-if="propertyExists(report.account, 'id')"
+          :to="{ name: 'UsersShow', params: { id: report.account.id }}"
+          class="router-link">
+          <img
+            v-if="propertyExists(report.account, 'avatar')"
+            :src="report.account.avatar"
+            alt="avatar"
+            class="avatar-img">
+          <span v-if="propertyExists(report.account, 'nickname')" class="report-account-name">{{ report.account.nickname }}</span>
+          <span v-else class="report-account-name deactivated">({{ $t('users.invalidNickname') }})</span>
+        </router-link>
+        <span v-else class="report-account-name deactivated">({{ $t('users.invalidNickname') }})</span>
+        <a v-if="propertyExists(report.account, 'url')" :href="report.account.url" target="_blank" class="account">
+          {{ $t('userProfile.openAccountInInstance') }}
+          <i class="el-icon-top-right"/>
+        </a>
+      </div>
+    </div>
+    <div v-if="report.content && report.content.length > 0">
+      <el-divider class="divider"/>
+      <span class="report-row-key">{{ $t('reports.content') }}:
+        <span>{{ report.content }}</span>
+      </span>
+    </div>
+    <el-divider class="divider"/>
+    <div :style="showStatuses(report.statuses) ? '' : 'margin-bottom:15px'" class="report-account-container">
+      <span class="report-row-key">{{ $t('reports.actor') }}:</span>
+      <div class="report-account">
+        <router-link
+          v-if="propertyExists(report.actor, 'id')"
+          :to="{ name: 'UsersShow', params: { id: report.actor.id }}"
+          class="router-link">
+          <img
+            v-if="propertyExists(report.actor, 'avatar')"
+            :src="report.actor.avatar"
+            alt="avatar"
+            class="avatar-img">
+          <span v-if="propertyExists(report.actor, 'nickname')" class="report-account-name">{{ report.actor.nickname }}</span>
+          <span v-else class="report-account-name deactivated">({{ $t('users.invalidNickname') }})</span>
+        </router-link>
+        <span v-else class="report-account-name deactivated">({{ $t('users.invalidNickname') }})</span>
+        <a v-if="propertyExists(report.actor, 'url')" :href="report.actor.url" target="_blank" class="account">
+          {{ $t('userProfile.openAccountInInstance') }}
+          <i class="el-icon-top-right"/>
+        </a>
+      </div>
+    </div>
+    <div v-if="showStatuses(report.statuses)" class="reported-statuses">
+      <el-collapse>
+        <el-collapse-item :title="getStatusesTitle(report.statuses)">
+          <div v-for="status in report.statuses" :key="status.id">
+            <status :status="status" :account="status.account.nickname ? status.account : report.account" :show-checkbox="false" :page="currentPage"/> // check why it's currentPage here
+          </div>
+        </el-collapse-item>
+      </el-collapse>
+    </div>
+    <div>
+      <el-collapse>
+        <el-collapse-item :title="getNotesTitle(report.notes)">
+          <note-card v-for="(note, index) in report.notes" :key="index" :note="note" :report="report"/>
+        </el-collapse-item>
+      </el-collapse>
+      <div class="report-note-form">
+        <el-input
+          v-model="notes[report.id]"
+          :placeholder="$t('reports.leaveNote')"
+          type="textarea"
+          rows="2"/>
+        <div class="report-post-note">
+          <el-button @click="handleNewNote(report.id)">{{ $t('reports.postNote') }}</el-button>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import NoteCard from './NoteCard'
+import Status from '@/components/Status'
+
+export default {
+  name: 'ReportContent',
+  components: { NoteCard, Status },
+  props: {
+    report: {
+      type: Object,
+      required: true
+    }
+  },
+  data() {
+    return {
+      notes: {}
+    }
+  },
+  computed: {
+    currentPage() {
+      return this.$store.state.reports.currentPage
+    }
+  },
+  methods: {
+    getNotesTitle(notes = []) {
+      return `Notes: ${notes.length} item(s)`
+    },
+    getStatusesTitle(statuses = []) {
+      return `Reported statuses: ${statuses.length} item(s)`
+    },
+    handleNewNote(reportID) {
+      this.$store.dispatch('CreateReportNote', { content: this.notes[reportID], reportID })
+      this.notes[reportID] = ''
+    },
+    propertyExists(account, property, _secondProperty) {
+      if (_secondProperty) {
+        return account[property] && account[_secondProperty]
+      }
+      return account[property]
+    },
+    showStatuses(statuses = []) {
+      return statuses.length > 0
+    }
+  }
+}
+</script>
+
+<style rel='stylesheet/scss' lang='scss'>
+  .account {
+    line-height: 26px;
+    font-size: 13px;
+    color: #606266;
+  }
+  .account:hover {
+    text-decoration: underline;
+  }
+  .avatar-img {
+    vertical-align: bottom;
+    width: 15px;
+    height: 15px;
+  }
+  .deactivated {
+    color: gray;
+  }
+  .divider {
+    margin: 15px 0;
+  }
+  .report-account {
+    display: flex;
+    align-items: baseline;
+    justify-content: space-between;
+    flex-grow: 2;
+  }
+  .report-account-container {
+    display: flex;
+    align-items: baseline;
+  }
+  .report-account-name {
+    font-size: 15px;
+    font-weight: 500;
+  }
+  .report-note-form {
+    margin: 15px 0 0 0;
+  }
+  .report-post-note {
+    margin: 5px 0 0 0;
+    text-align: right;
+  }
+  .report-row-key {
+    font-size: 14px;
+    font-weight: 500;
+    padding-right: 5px;
+  }
+  .reported-statuses {
+    margin-top: 15px;
+  }
+  .router-link {
+    text-decoration: none;
+  }
+</style>
diff --git a/src/views/reports/show.vue b/src/views/reports/show.vue
index e393afc0..676a518b 100644
--- a/src/views/reports/show.vue
+++ b/src/views/reports/show.vue
@@ -15,16 +15,19 @@
       </div>
       <reboot-button/>
     </header>
-    <el-card class="report"/>
+    <el-card class="report">
+      <report-content :report="report"/>
+    </el-card>
   </div>
 </template>
 
 <script>
 import RebootButton from '@/components/RebootButton'
+import ReportContent from './components/ReportContent'
 
 export default {
   name: 'ReportsShow',
-  components: { RebootButton },
+  components: { RebootButton, ReportContent },
   computed: {
     loading() {
       return this.$store.state.reports.loading
-- 
GitLab