columns.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import {
  2. getNameDescriptionTableColumn,
  3. getProjectDomainTableColumn,
  4. getStatusTableColumn,
  5. getEnabledTableColumn,
  6. getTimeTableColumn,
  7. getPublicScopeTableColumn,
  8. } from '@/utils/common/tableColumn'
  9. import i18n from '@/locales'
  10. import { getTagColor, getTagTitle } from '@/utils/common/tag'
  11. import { getTargetColumns } from '../utils'
  12. export default {
  13. created () {
  14. this.columns = [
  15. getNameDescriptionTableColumn({
  16. onManager: this.onManager,
  17. hideField: true,
  18. edit: (row) => {
  19. const { isDomainMode, userInfo } = this.$store.getters
  20. if (isDomainMode && (userInfo.projectDomainId !== row.domain_id)) {
  21. return false
  22. }
  23. return true
  24. },
  25. showDesc: (row) => {
  26. const { isDomainMode, userInfo } = this.$store.getters
  27. if (isDomainMode && (userInfo.projectDomainId !== row.domain_id)) {
  28. return false
  29. }
  30. return true
  31. },
  32. slotCallback: row => {
  33. return (
  34. <side-page-trigger onTrigger={() => this.handleOpenSidepage(row)}>{row.name}</side-page-trigger>
  35. )
  36. },
  37. }),
  38. getStatusTableColumn({
  39. statusModule: 'projectMapping',
  40. minWidth: 100,
  41. }),
  42. getEnabledTableColumn(),
  43. {
  44. field: 'rules',
  45. title: i18n.t('cloudenv.text_582'),
  46. slots: {
  47. default: ({ row }) => {
  48. const columns = [
  49. {
  50. field: 'tags',
  51. title: i18n.t('cloudenv.text_582'),
  52. slots: {
  53. default: ({ row }) => {
  54. if (!row.tags) return '-'
  55. return [<div>{this.getRuleCondition(row)}</div>, <div>{
  56. row.tags.map(item => {
  57. const rgb = getTagColor(item.key, item.value, 'rgb')
  58. const strRgb = rgb.join(',')
  59. const text = getTagTitle('user:' + item.key, item.value)
  60. return (<span
  61. class="tag mb-1 text-truncate d-inline-block"
  62. title={getTagTitle(item.key, item.value)}
  63. key={`${item.key}${item.value}`}
  64. style={{ backgroundColor: `rgba(${strRgb},.1)`, boxSizing: 'border-box', color: `rgb(${strRgb})`, border: `solid 1px rgb(${strRgb})`, padding: '0 5px', marginRight: '10px' }}>
  65. { text }
  66. </span>)
  67. })
  68. }</div>]
  69. },
  70. },
  71. },
  72. {
  73. field: 'project_name',
  74. title: i18n.t('cloudenv.text_584'),
  75. formatter: ({ row }) => {
  76. if (row.condition === 'and' && !row.hasOwnProperty('project_id') && !row.hasOwnProperty('project')) {
  77. return i18n.t('cloudenv.project_same_as_tag_value')
  78. }
  79. let project = row.project
  80. if (project) {
  81. if (row.project_id) {
  82. project += ` (${this.$t('cloudenv.target_project')})`
  83. } else {
  84. project += ` (${this.$t('cloudenv.target_name')})`
  85. }
  86. }
  87. return project || '-'
  88. },
  89. },
  90. ]
  91. return [<list-body-cell-popover text={this.$t('common_701', [row.rules ? row.rules.length : 0])} min-width="600px">
  92. <vxe-grid size="mini" border showOverflow={false} row-config={{ isHover: true }} column-config={{ resizable: false }} columns={columns} data={row.rules ? row.rules : []} />
  93. </list-body-cell-popover>]
  94. },
  95. },
  96. },
  97. {
  98. title: this.$t('cloudenv.text_503'),
  99. field: 'account',
  100. slots: {
  101. default: ({ row }) => {
  102. const ret = []
  103. if (row.accounts && row.accounts.length) {
  104. const resIds = row.accounts.map(v => v.id)
  105. ret.push(<div><a onClick={() => {
  106. this.createDialog('CommonDialog', {
  107. hiddenCancel: true,
  108. header: this.$t('cloudenv.text_589'),
  109. body: () => {
  110. return (
  111. <dialog-table
  112. vxeGridProps={{ showOverflow: 'title' }}
  113. resource='cloudaccounts'
  114. params={{ scope: this.$store.getters.scope, filter: `id.in(${resIds.join(',')})` }}
  115. columns={getTargetColumns('accounts')} />
  116. )
  117. },
  118. })
  119. }}>{row.accounts.length}</a><span class="text-color-secondary">{' (' + this.$t('cloudenv.project_mapping_account') + ')'}</span></div>)
  120. }
  121. if (row.managers && row.managers.length) {
  122. const resIds = row.managers.map(v => v.id)
  123. ret.push(<div><a onClick={() => {
  124. this.createDialog('CommonDialog', {
  125. hiddenCancel: true,
  126. header: this.$t('cloudenv.project_mapping_use_cloudprovider'),
  127. body: () => {
  128. return (
  129. <dialog-table
  130. vxeGridProps={{ showOverflow: 'title' }}
  131. resource='cloudproviders'
  132. params={{ scope: this.$store.getters.scope, filter: `id.in(${resIds.join(',')})` }}
  133. columns={getTargetColumns('providers')} />
  134. )
  135. },
  136. })
  137. }}>{row.managers.length}</a><span class="text-color-secondary">{' (' + this.$t('cloudenv.project_mapping_cloudprovider') + ')'}</span></div>)
  138. }
  139. if (!ret.length) return '-'
  140. return ret
  141. },
  142. },
  143. },
  144. getPublicScopeTableColumn({ vm: this }),
  145. getProjectDomainTableColumn({ sortable: false }),
  146. getTimeTableColumn(),
  147. ]
  148. },
  149. methods: {
  150. getRuleCondition (data) {
  151. const { condition } = data
  152. if (condition === 'or') {
  153. return i18n.t('cloudenv.text_587')
  154. } else if (data.hasOwnProperty('project_id') || data.hasOwnProperty('project')) {
  155. return i18n.t('cloudenv.text_588')
  156. } else {
  157. return i18n.t('cloudenv.match_by_tag_key')
  158. }
  159. },
  160. },
  161. }