Detail.vue 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. <template>
  2. <detail
  3. :on-manager="onManager"
  4. :data="data"
  5. statusModule="lb"
  6. resource="lbs"
  7. :base-info="baseInfo"
  8. :extra-info="extraInfo"
  9. auto-hidden-columns-key="slb_hidden_columns" />
  10. </template>
  11. <script>
  12. import * as R from 'ramda'
  13. import _ from 'lodash'
  14. import { LB_SPEC, CHARGE_TYPE } from '@Network/views/lb/constants'
  15. import { getBrandTableColumn, getCopyWithContentTableColumn, getZone1TableColumn, getSwitchTableColumn } from '@/utils/common/tableColumn'
  16. import {
  17. getUserTagColumn,
  18. // getExtTagColumn,
  19. } from '@/utils/common/detailColumn'
  20. import WindowsMixin from '@/mixins/windows'
  21. export default {
  22. name: 'LbDetail',
  23. mixins: [WindowsMixin],
  24. props: {
  25. data: {
  26. type: Object,
  27. required: true,
  28. },
  29. onManager: {
  30. type: Function,
  31. required: true,
  32. },
  33. columns: Array,
  34. },
  35. data () {
  36. return {
  37. baseInfo: [
  38. getUserTagColumn({ onManager: this.onManager, resource: 'loadbalancer', columns: () => this.columns }),
  39. // getExtTagColumn({ onManager: this.onManager, resource: 'loadbalancer', columns: () => this.columns }),
  40. {
  41. field: 'loadbalancer_spec',
  42. title: this.$t('network.text_268'),
  43. formatter: ({ row }) => {
  44. let { provider } = row
  45. if (provider) {
  46. provider = provider.toLowerCase()
  47. const platformList = LB_SPEC[provider]
  48. if (platformList) {
  49. const specItem = platformList.find(val => val.key === row.loadbalancer_spec)
  50. if (specItem) return specItem.label
  51. }
  52. }
  53. return row.loadbalancer_spec || '-'
  54. },
  55. },
  56. {
  57. field: 'cluster',
  58. title: this.$t('network.text_19'),
  59. formatter: ({ row }) => {
  60. return row.cluster || '-'
  61. },
  62. },
  63. getBrandTableColumn(),
  64. getCopyWithContentTableColumn({
  65. field: 'region',
  66. title: this.$t('network.text_199'),
  67. hideField: true,
  68. slotCallback: row => {
  69. if (!row.region) return '-'
  70. return [
  71. <side-page-trigger permission='areas_get' name='CloudregionSidePage' id={row.region_id} vm={this}>{ row.region }</side-page-trigger>,
  72. ]
  73. },
  74. }),
  75. {
  76. field: 'zone',
  77. title: this.$t('network.text_199'),
  78. slots: {
  79. default: ({ row }) => {
  80. if (row.zone_1) {
  81. const ret = [<div>{ row.zone }({this.$t('db.text_165')})</div>]
  82. ret.push(
  83. <div>
  84. {row.zone_1_name}({this.$t('db.text_164')})
  85. </div>,
  86. )
  87. return ret
  88. }
  89. return row.zone || '-'
  90. },
  91. },
  92. },
  93. ],
  94. extraInfo: [
  95. {
  96. title: this.$t('network.text_308'),
  97. items: [
  98. {
  99. field: 'capacity',
  100. title: this.$t('network.lb.instance_number'),
  101. formatter: ({ row }) => {
  102. const c = R.path(['metadata', 'sys:capacity'], row)
  103. const max = R.path(['metadata', 'sys:max_capacity'], row)
  104. const min = R.path(['metadata', 'sys:min_capacity'], row)
  105. if (c) {
  106. if (max && min && max !== '0') {
  107. return `${c} (min: ${min}, max: ${max})`
  108. }
  109. return c
  110. }
  111. return '-'
  112. },
  113. },
  114. getZone1TableColumn(),
  115. {
  116. field: 'address',
  117. title: this.$t('network.text_248'),
  118. slots: {
  119. default: ({ row }) => {
  120. const ret = []
  121. if (row.eip) {
  122. let weakTip = ''
  123. if (row.eip_mode === 'elastic_ip') {
  124. weakTip = this.$t('network.text_304')
  125. } else if (row.eip_mode === 'public_ip') {
  126. weakTip = this.$t('network.text_305')
  127. }
  128. ret.push(<div>
  129. <span>{row.eip}</span>
  130. <span className="text-color-secondary">{weakTip}</span>
  131. <copy message={row.eip}/>
  132. </div>)
  133. }
  134. if (ret.length === 0 || (ret.length > 0 && row.address_type === 'intranet' && !!row.address)) {
  135. ret.push(<div>
  136. <span>{row.address || '-'}</span>
  137. <span className="text-color-secondary">{row.address_type === 'intranet' ? this.$t('network.text_306') : this.$t('network.text_307')}</span>
  138. <copy message={row.address}/>
  139. </div>)
  140. }
  141. const _ips = _.get(row, ['metadata', 'sys:FrontendIPs'])
  142. if (_ips !== undefined && _ips.length > 0) {
  143. const ips = _ips.split(',')
  144. for (const v of ips) {
  145. if (v !== row.address && v !== row.eip) {
  146. ret.push(<div>
  147. <span>{ v }</span>
  148. <copy class="ml-2" message={row.address}/>
  149. </div>)
  150. }
  151. }
  152. }
  153. return ret
  154. },
  155. },
  156. },
  157. {
  158. field: 'secgroups',
  159. title: this.$t('compute.text_105'),
  160. slots: {
  161. default: ({ row }) => {
  162. if (!row.secgroups) return '-'
  163. return row.secgroups.map((item) => {
  164. return <list-body-cell-wrap copy hideField={true} field='name' row={item} message={item.name}>
  165. <side-page-trigger permission='secgroups_get' name='SecGroupSidePage' id={item.id} vm={this}>{ item.name }</side-page-trigger>
  166. </list-body-cell-wrap>
  167. })
  168. },
  169. },
  170. hidden: () => this.$isScopedPolicyMenuHidden('slb_hidden_columns.secgroups'),
  171. },
  172. getCopyWithContentTableColumn({
  173. field: 'vpc',
  174. title: 'VPC',
  175. hideField: true,
  176. slotCallback: row => {
  177. if (!row.vpc) return '-'
  178. return [
  179. <side-page-trigger permission='vpcs_get' name='VpcSidePage' id={row.vpc_id} vm={this}>{ row.vpc }</side-page-trigger>,
  180. ]
  181. },
  182. hidden: this.$store.getters.isProjectMode,
  183. }),
  184. getCopyWithContentTableColumn({
  185. field: 'network',
  186. title: this.$t('network.text_565'),
  187. hideField: true,
  188. slotCallback: row => {
  189. if (!row.network) return '-'
  190. return [
  191. <side-page-trigger permission='networks_get' name='NetworkSidePage' id={row.network_id} vm={this}>{ row.network }</side-page-trigger>,
  192. ]
  193. },
  194. hidden: this.$store.getters.isProjectMode,
  195. }),
  196. {
  197. field: 'charge_type',
  198. title: this.$t('network.text_192_0'),
  199. formatter: ({ row }) => {
  200. if (row.charge_type) return CHARGE_TYPE[row.charge_type] || row.charge_type
  201. return '-'
  202. },
  203. },
  204. ],
  205. hidden: () => this.$isScopedPolicyMenuHidden('slb_hidden_columns.loadbalancer_spec'),
  206. },
  207. {
  208. title: this.$t('db.text_179'),
  209. items: [
  210. getSwitchTableColumn({
  211. field: 'disable_delete',
  212. title: this.$t('common.text00076'),
  213. change: val => {
  214. this.onManager('update', {
  215. id: this.data.id,
  216. managerArgs: {
  217. data: { disable_delete: val },
  218. },
  219. })
  220. },
  221. }),
  222. ],
  223. hidden: () => this.$isScopedPolicyMenuHidden('slb_hidden_columns.perform_action'),
  224. },
  225. ],
  226. }
  227. },
  228. }
  229. </script>