columns.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import FileProcess from '@Compute/views/image/components/FileProcess'
  2. import { sizestr } from '@/utils/utils'
  3. import SystemIcon from '@/sections/SystemIcon'
  4. import { getNameDescriptionTableColumn, getProjectTableColumn, getTimeTableColumn, getPublicScopeTableColumn, getTagTableColumn, getOsArch } from '@/utils/common/tableColumn'
  5. import i18n from '@/locales'
  6. export default {
  7. created () {
  8. this.columns = [
  9. getNameDescriptionTableColumn({
  10. width: 200,
  11. onManager: this.onManager,
  12. hideField: true,
  13. addLock: true,
  14. addEncrypt: true,
  15. slotCallback: (row, h) => {
  16. return (
  17. <side-page-trigger onTrigger={() => this.handleOpenSidepage(row)}>{ row.name }</side-page-trigger>
  18. )
  19. },
  20. formRules: [
  21. { required: true, message: i18n.t('compute.text_210') },
  22. { validator: this.$validate('imageName') },
  23. ],
  24. }),
  25. {
  26. field: 'status',
  27. title: i18n.t('common.status'),
  28. sortable: true,
  29. showOverflow: 'ellipsis',
  30. minWidth: 80,
  31. slots: {
  32. default: ({ row }, h) => {
  33. const fileProcess = row.status === 'saving' ? <FileProcess size={ row.size }></FileProcess> : null
  34. const log = <side-page-trigger class="ml-1" onTrigger={ () => this.handleOpenSidepage(row, 'event-drawer') }>{ this.$t('common.view_logs') }</side-page-trigger>
  35. return [
  36. <div class='text-truncate'>
  37. <div class="d-flex align-items-center">
  38. <status status={ row.status } statusModule={ 'image' } process={ row.progress } />
  39. { row.status?.includes('fail') ? log : null }
  40. </div>
  41. { fileProcess }
  42. </div>,
  43. ]
  44. },
  45. },
  46. formatter: ({ row }) => {
  47. return this.$te(`status.image.${row.status}`) ? this.$t(`status.image.${row.status}`) : row.status
  48. },
  49. },
  50. getTagTableColumn({ onManager: this.onManager, resource: 'images', columns: () => this.columns }),
  51. {
  52. field: 'disk_format',
  53. title: i18n.t('table.title.disk_format'),
  54. width: 100,
  55. formatter: ({ cellValue, row }) => {
  56. return (cellValue && cellValue.toUpperCase()) || row.info?.disk_format || '-'
  57. },
  58. },
  59. getOsArch({ field: 'properties.os_arch' }),
  60. {
  61. field: 'os_type',
  62. title: i18n.t('table.title.os'),
  63. width: 60,
  64. slots: {
  65. default: ({ row }, h) => {
  66. if (!row.properties && !row.os_type) return
  67. const dist = row.properties?.os_distribution || row.properties?.distro || row.os_type
  68. const version = row.properties?.os_version || row.properties?.version || row.os_version
  69. let name = ''
  70. let tooltip = ''
  71. if (dist) {
  72. tooltip = version ? (version.includes(dist) ? version : `${decodeURI(dist)} ${version}`) : dist
  73. } else if (row.properties?.os_type) {
  74. tooltip = row.properties?.os_type
  75. } else {
  76. tooltip = i18n.t('compute.text_339')
  77. }
  78. name = dist || row.properties?.os_type || ''
  79. if (name.includes('Windows') || name.includes('windows')) {
  80. name = 'Windows'
  81. } else if (name.startsWith('Linux') || name.startsWith('linux')) {
  82. name = 'Linux'
  83. }
  84. return [
  85. <SystemIcon tooltip={ tooltip } name={ name } />,
  86. ]
  87. },
  88. },
  89. formatter: ({ row }) => {
  90. if (!row.properties && !row.os_type) return
  91. const dist = row.properties?.os_distribution || row.properties?.distro || row.os_type
  92. let name = ''
  93. name = dist || row.properties?.os_type || ''
  94. if (name.includes('Windows') || name.includes('windows')) {
  95. name = 'Windows'
  96. } else if (name.includes('Linux') || name.includes('linux')) {
  97. name = 'Linux'
  98. }
  99. return name
  100. },
  101. },
  102. {
  103. field: 'size',
  104. title: i18n.t('table.title.image_size'),
  105. minWidth: 100,
  106. formatter: ({ cellValue, row }) => {
  107. return sizestr(cellValue, 'B', 1024)
  108. },
  109. },
  110. {
  111. field: 'is_standard',
  112. title: i18n.t('table.title.image_type'),
  113. width: 100,
  114. formatter: ({ cellValue }) => {
  115. if (cellValue === true || cellValue === 'true') return i18n.t('compute.text_620')
  116. return i18n.t('compute.text_621')
  117. },
  118. },
  119. getTimeTableColumn(),
  120. getPublicScopeTableColumn({ vm: this, resource: 'images' }),
  121. getProjectTableColumn(),
  122. // isPublicTableColumn(),
  123. ]
  124. },
  125. }