index.vue 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <template>
  2. <wrapper
  3. fill
  4. margin
  5. padding
  6. background
  7. >
  8. <schema-table
  9. ref="table"
  10. :schema="schema"
  11. />
  12. <confirm-dialog
  13. ref="rejectDialog"
  14. title="Reason of rejection"
  15. @confirm="onConfirmReject"
  16. >
  17. <div class="c-grid-form u-align-self--center">
  18. <span class="c-grid-form__label">
  19. Reason of rejection
  20. </span>
  21. <el-select
  22. v-model="review.type"
  23. placeholder="Please select"
  24. >
  25. <el-option
  26. v-for="option in reviewOptions"
  27. :key="option.label"
  28. :label="option.label"
  29. :value="option.value"
  30. />
  31. </el-select>
  32. <template v-if="review.type === 'reject'">
  33. <span class="c-grid-form__label u-required">
  34. Description
  35. </span>
  36. <el-input
  37. v-model.trim="review.reason"
  38. type="textarea"
  39. placeholder="Please fill in the reason for rejection"
  40. maxlength="50"
  41. :rows="3"
  42. resize="none"
  43. show-word-limit
  44. />
  45. </template>
  46. </div>
  47. </confirm-dialog>
  48. <preview-dialog ref="previewDialog" />
  49. </wrapper>
  50. </template>
  51. <script>
  52. import { State } from '@/constant'
  53. import {
  54. parseByte,
  55. parseDuration,
  56. transformOrderAssetToAsset
  57. } from '@/utils'
  58. import {
  59. getAssets,
  60. resolveAsset,
  61. rejectAsset
  62. } from '../api'
  63. export default {
  64. name: 'AdAssetReview',
  65. data () {
  66. return {
  67. schema: {
  68. list: getAssets,
  69. transform: this.transformAsset,
  70. condition: { status: State.SUBMITTED },
  71. cols: [
  72. { prop: 'typeInfo', type: 'refresh', width: 72, align: 'center' },
  73. { prop: 'file', label: 'Resources', type: 'asset', on: this.onViewAsset },
  74. { prop: 'size', label: 'File Size', align: 'right' },
  75. { prop: 'ratio', label: 'Resolution', align: 'right' },
  76. { prop: 'diff', label: 'Other', align: 'right' },
  77. { prop: 'createTime', label: 'Submission Time', width: 160, align: 'right' },
  78. {
  79. type: 'invoke', width: 160, render: [
  80. { label: 'View', on: this.onViewAsset },
  81. { label: 'Pass', on: this.onResolve },
  82. { label: 'Reject', on: this.onReject }
  83. ]
  84. }
  85. ]
  86. },
  87. reviewOptions: [
  88. { value: 'reject', label: 'Customize' },
  89. { value: 'Content non-compliance' }
  90. ],
  91. review: {
  92. type: '',
  93. reason: ''
  94. }
  95. }
  96. },
  97. methods: {
  98. transformAsset (asset) {
  99. const data = transformOrderAssetToAsset(asset)
  100. if (data.file) {
  101. const { width, height, status, reason, size, duration, createTime } = asset
  102. data.ratio = width && height ? `${width}x${height}` : '-'
  103. data.statusTag = {
  104. type: ['', 'primay', 'success', 'danger'][status],
  105. label: ['-', 'Pending Review', 'Passed', 'Rejected'][status],
  106. msg: reason
  107. }
  108. data.size = parseByte(size)
  109. data.diff = parseDuration(duration)
  110. data.createTime = createTime
  111. }
  112. data.keyName = asset.keyName
  113. return data
  114. },
  115. onResolve (asset) {
  116. resolveAsset(asset).then(() => {
  117. this.$refs.table.decrease(1)
  118. })
  119. },
  120. onReject (asset) {
  121. this.$asset = asset
  122. this.review = {
  123. type: 'reject',
  124. reason: ''
  125. }
  126. this.$refs.rejectDialog.show()
  127. },
  128. onConfirmReject (done) {
  129. const reason = this.review.type === 'reject' ? this.review.reason : this.review.type
  130. if (!reason) {
  131. this.$message({
  132. type: 'warning',
  133. message: 'Please select or fill in the reason for rejection'
  134. })
  135. return
  136. }
  137. rejectAsset(this.$asset, reason).then(() => {
  138. done()
  139. this.$refs.table.decrease(1)
  140. })
  141. },
  142. onViewAsset ({ file }) {
  143. this.$refs.previewDialog.show(file)
  144. }
  145. }
  146. }
  147. </script>