Detail.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <template>
  2. <detail
  3. :data="data"
  4. :base-info="baseInfo"
  5. :extra-info="extraInfo"
  6. :on-manager="onManager"
  7. :resource="resource"
  8. status-module="image" />
  9. </template>
  10. <script>
  11. import {
  12. getUserTagColumn,
  13. getExtTagColumn,
  14. } from '@/utils/common/detailColumn'
  15. import { sizestr } from '@/utils/utils'
  16. import { getStatusTableColumn, getCopyWithContentTableColumn, getSwitchTableColumn, getPublicScopeTableColumn, getOsArch } from '@/utils/common/tableColumn'
  17. const isStandard = status => status === true || status === 'true'
  18. export default {
  19. name: 'HostImageDetail',
  20. props: {
  21. data: {
  22. type: Object,
  23. required: true,
  24. },
  25. onManager: {
  26. type: Function,
  27. required: true,
  28. },
  29. resource: String,
  30. columns: Array,
  31. },
  32. data () {
  33. return {
  34. baseInfo: [
  35. getUserTagColumn({ onManager: this.onManager, resource: 'guestimage', columns: () => this.columns, tipName: this.$t('dictionary.guestimage') }),
  36. getExtTagColumn({ onManager: this.onManager, resource: 'guestimage', columns: () => this.columns, tipName: this.$t('dictionary.guestimage') }),
  37. {
  38. field: 'project_domain',
  39. title: this.$t('dictionary.domain'),
  40. formatter: ({ row }) => {
  41. return <side-page-trigger permission="domains_get" name="DomainSidePage" id={row.domain_id} vm={this}>{ row.project_domain }</side-page-trigger>
  42. },
  43. },
  44. {
  45. field: 'tenant',
  46. title: this.$t('dictionary.project'),
  47. formatter: ({ row }) => {
  48. return <side-page-trigger permission="projects_get" name="ProjectSidePage" id={row.tenant_id} vm={this}>{ row.tenant }</side-page-trigger>
  49. },
  50. },
  51. getPublicScopeTableColumn({ vm: this, resource: 'guestimages' }),
  52. {
  53. field: 'type',
  54. title: this.$t('compute.text_175'),
  55. formatter: ({ cellValue, row }) => {
  56. return isStandard(row.is_standard) ? this.$t('compute.text_620') : this.$t('compute.text_621')
  57. },
  58. },
  59. {
  60. field: 'child_image',
  61. title: this.$t('table.title.child_image'),
  62. width: 150,
  63. slots: {
  64. default: ({ row }) => {
  65. const arr = [...(row.data_images || [])]
  66. arr.push(row.root_image.name)
  67. return <a onClick={ () => this.$emit('tab-change', 'children-image-list') }>{arr.length}</a>
  68. },
  69. },
  70. },
  71. {
  72. field: 'size',
  73. title: this.$t('compute.text_377'),
  74. formatter: ({ cellValue, row }) => {
  75. return sizestr(cellValue, 'B', 1024)
  76. },
  77. },
  78. ],
  79. extraInfo: [
  80. {
  81. title: this.$t('compute.text_629'),
  82. items: [
  83. getOsArch(),
  84. {
  85. field: 'disk_format',
  86. title: this.$t('compute.text_630'),
  87. },
  88. {
  89. field: 'os_lang',
  90. title: this.$t('compute.text_631'),
  91. formatter: ({ cellValue, row }) => {
  92. return (row.properties && row.properties.os_lang) || '-'
  93. },
  94. },
  95. {
  96. field: 'min_ram',
  97. title: this.$t('compute.text_632'),
  98. formatter: ({ cellValue, row }) => {
  99. return sizestr(cellValue, 'M', 1024)
  100. },
  101. },
  102. {
  103. field: 'min_disk',
  104. title: this.$t('compute.text_633'),
  105. formatter: ({ cellValue, row }) => {
  106. return sizestr(cellValue, 'M', 1024)
  107. },
  108. },
  109. {
  110. field: 'disk_driver',
  111. title: this.$t('compute.text_634'),
  112. formatter: ({ cellValue, row }) => {
  113. return (row.properties && row.properties.disk_driver) || '-'
  114. },
  115. },
  116. {
  117. field: 'net_driver',
  118. title: this.$t('compute.text_635'),
  119. formatter: ({ cellValue, row }) => {
  120. return (row.properties && row.properties.net_driver) || '-'
  121. },
  122. },
  123. {
  124. field: 'hypervisor',
  125. title: this.$t('compute.text_636'),
  126. },
  127. ],
  128. },
  129. {
  130. title: this.$t('compute.title.encryption'),
  131. items: [
  132. {
  133. field: 'encrypt_key_id',
  134. title: this.$t('compute.title.encryption_key'),
  135. formatter: ({ callValue, row }) => {
  136. if (row.encrypt_key_id) {
  137. if (row.encrypt_key && row.encrypt_alg) {
  138. return row.encrypt_key + ' (' + row.encrypt_key_id + ')'
  139. } else {
  140. return row.encrypt_key_id
  141. }
  142. } else {
  143. return this.$t('compute.no_encryption')
  144. }
  145. },
  146. },
  147. {
  148. field: 'encrypt_alg',
  149. title: this.$t('compute.title.encrypt_alg'),
  150. formatter: ({ callValue, row }) => {
  151. if (row.encrypt_alg) {
  152. return row.encrypt_alg.toUpperCase()
  153. } else {
  154. return '-'
  155. }
  156. },
  157. },
  158. {
  159. field: 'encrypt_key_user',
  160. title: this.$t('compute.title.encrypt_key_user'),
  161. formatter: ({ callValue, row }) => {
  162. if (row.encrypt_key_user) {
  163. return row.encrypt_key_user + ' / ' + row.encrypt_key_user_domain
  164. } else {
  165. return '-'
  166. }
  167. },
  168. },
  169. ],
  170. },
  171. {
  172. title: this.$t('compute.text_637'),
  173. field: 'cloudy_mirroring',
  174. slots: {
  175. default: ({ row }, h) => {
  176. return [
  177. <vxe-grid class="mb-2" data={ this.imgSubformat } columns={ this.imageColumns } />,
  178. ]
  179. },
  180. },
  181. },
  182. {
  183. title: this.$t('compute.text_497'),
  184. items: [
  185. getSwitchTableColumn({
  186. field: 'protected',
  187. title: this.$t('common.text00076'),
  188. change: val => {
  189. this.onManager('update', {
  190. id: this.data.id,
  191. managerArgs: {
  192. data: { protected: val },
  193. },
  194. })
  195. },
  196. }),
  197. ],
  198. },
  199. ],
  200. imageColumns: [
  201. getCopyWithContentTableColumn({
  202. field: 'checksum',
  203. title: this.$t('compute.text_638'),
  204. }),
  205. {
  206. field: 'format',
  207. title: this.$t('compute.text_398'),
  208. },
  209. {
  210. field: 'size',
  211. title: this.$t('compute.text_377'),
  212. formatter: ({ cellValue, row }) => {
  213. return sizestr(cellValue, 'B', 1024)
  214. },
  215. },
  216. getStatusTableColumn({ statusModule: 'image' }),
  217. ],
  218. imgSubformat: [],
  219. }
  220. },
  221. created () {
  222. // this.updateDetailData()
  223. },
  224. methods: {
  225. updateDetailData () {
  226. new this.$Manager('images', 'v1').getSpecific({
  227. id: this.data.id,
  228. spec: 'subformats',
  229. }).then(({ data }) => {
  230. this.imgSubformat = data
  231. })
  232. },
  233. },
  234. }
  235. </script>