List.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <template>
  2. <page-list
  3. :list="list"
  4. :columns="templateListColumns || columns"
  5. :show-tag-columns="true"
  6. :show-tag-columns2="true"
  7. :show-tag-filter="true"
  8. :export-data-options="exportDataOptions"
  9. :group-actions="groupActions"
  10. :showSearchbox="showSearchbox"
  11. :showGroupActions="showGroupActions"
  12. :single-actions="singleActions"
  13. :show-single-actions="!isTemplate"
  14. :show-page="!isTemplate" />
  15. </template>
  16. <script>
  17. import * as R from 'ramda'
  18. import { mapGetters } from 'vuex'
  19. import ListMixin from '@/mixins/list'
  20. import ResTemplateListMixin from '@/mixins/resTemplateList'
  21. import expectStatus from '@/constants/expectStatus'
  22. import {
  23. getStatusFilter,
  24. getBrandFilter,
  25. getAccountFilter,
  26. getDomainFilter,
  27. getCloudProviderFilter,
  28. getDescriptionFilter,
  29. getCreatedAtFilter,
  30. getTenantFilter,
  31. } from '@/utils/common/tableFilter'
  32. import { disableDeleteAction } from '@/utils/common/tableActions'
  33. import WindowsMixin from '@/mixins/windows'
  34. import i18n from '@/locales'
  35. import GlobalSearchMixin from '@/mixins/globalSearch'
  36. import SingleActionsMixin from '../mixins/singleActions'
  37. import ColumnsMixin from '../mixins/columns'
  38. export default {
  39. name: 'DomainList',
  40. mixins: [WindowsMixin, ListMixin, GlobalSearchMixin, ColumnsMixin, SingleActionsMixin, ResTemplateListMixin],
  41. props: {
  42. id: String,
  43. getParams: {
  44. type: [Function, Object],
  45. },
  46. hiddenActions: {
  47. type: Array,
  48. default: () => ([]),
  49. },
  50. },
  51. data () {
  52. return {
  53. list: this.$list.createList(this, {
  54. ctx: this,
  55. id: this.id,
  56. resource: 'cdn_domains',
  57. getParams: this.getParam,
  58. isTemplate: this.isTemplate,
  59. templateLimit: this.templateLimit,
  60. steadyStatus: Object.values(expectStatus.cdnDomain).flat(),
  61. filterOptions: {
  62. external_id: {
  63. label: this.$t('table.title.external_id'),
  64. },
  65. id: {
  66. label: this.$t('table.title.id'),
  67. },
  68. name: {
  69. label: this.$t('network.text_21'),
  70. filter: true,
  71. formatter: val => {
  72. return `name.contains("${val}")`
  73. },
  74. },
  75. description: getDescriptionFilter(),
  76. status: getStatusFilter('cdnDomain'),
  77. cloudaccount: getAccountFilter(),
  78. manager: getCloudProviderFilter(),
  79. brand: getBrandFilter('cdn_brands'),
  80. projects: getTenantFilter(),
  81. project_domains: getDomainFilter(),
  82. created_at: getCreatedAtFilter(),
  83. },
  84. responseData: this.responseData,
  85. hiddenColumns: ['created_at'],
  86. }),
  87. groupActions: [
  88. {
  89. label: this.$t('common.create'),
  90. action: () => {
  91. this.$router.push({
  92. path: '/cdn/create',
  93. })
  94. },
  95. meta: () => {
  96. return {
  97. buttonType: 'primary',
  98. validate: true,
  99. }
  100. },
  101. },
  102. {
  103. label: this.$t('network.text_201'),
  104. permission: 'cdn_domains_perform_syncstatus',
  105. action: () => {
  106. this.onManager('batchPerformAction', {
  107. steadyStatus: ['online', 'offline'],
  108. managerArgs: {
  109. action: 'syncstatus',
  110. },
  111. })
  112. },
  113. meta: () => {
  114. if (this.list.selectedItems.some(item => !this.isOwner(item))) {
  115. return {
  116. validate: false,
  117. tooltip: this.$t('network.text_627'),
  118. }
  119. }
  120. return {
  121. validate: this.list.selectedItems.length,
  122. }
  123. },
  124. },
  125. {
  126. label: this.$t('network.text_200'),
  127. actions: (obj) => {
  128. const isOwner = this.list.selectedItems.every(item => this.isOwner(item))
  129. return [
  130. {
  131. label: this.$t('network.text_225', [this.$t('dictionary.project')]),
  132. action: () => {
  133. this.createDialog('ChangeOwenrDialog', {
  134. data: this.list.selectedItems,
  135. columns: this.columns,
  136. onManager: this.onManager,
  137. name: this.$t('dictionary.cdn_domain'),
  138. resource: 'cdn_domains',
  139. })
  140. },
  141. meta: () => {
  142. return {
  143. validate: this.list.selectedItems.length,
  144. }
  145. },
  146. },
  147. {
  148. label: this.$t('compute.text_283'),
  149. permission: 'cdn_domains_perform_set_user_metadata',
  150. action: () => {
  151. this.createDialog('SetTagDialog', {
  152. data: this.list.selectedItems,
  153. columns: this.columns,
  154. onManager: this.onManager,
  155. params: {
  156. resources: 'cdn_domains',
  157. },
  158. mode: 'add',
  159. })
  160. },
  161. },
  162. disableDeleteAction(Object.assign(this, {
  163. permission: 'cdn_domains_update',
  164. }), {
  165. name: this.$t('dictionary.cdn_domain'),
  166. meta: () => {
  167. if (!isOwner) {
  168. return {
  169. validate: false,
  170. tooltip: i18n.t('network.text_627'),
  171. }
  172. }
  173. },
  174. }),
  175. {
  176. label: this.$t('network.text_131'),
  177. permission: 'cdn_domains_delete',
  178. action: () => {
  179. this.createDialog('DeleteResDialog', {
  180. vm: this,
  181. data: this.list.selectedItems,
  182. columns: this.columns,
  183. title: this.$t('network.text_131'),
  184. name: this.$t('dictionary.cdn_domain'),
  185. requestData: { force: true },
  186. onManager: this.onManager,
  187. })
  188. },
  189. meta: () => {
  190. if (!isOwner) {
  191. return {
  192. validate: false,
  193. tooltip: i18n.t('network.text_627'),
  194. }
  195. }
  196. return {
  197. validate: this.list.allowDelete(),
  198. }
  199. },
  200. },
  201. ]
  202. },
  203. meta: () => {
  204. const selectedLength = this.list.selectedItems.length
  205. return {
  206. validate: selectedLength,
  207. tooltip: '',
  208. }
  209. },
  210. },
  211. ],
  212. }
  213. },
  214. computed: {
  215. ...mapGetters(['isAdminMode', 'isDomainMode', 'userInfo']),
  216. exportDataOptions () {
  217. return {
  218. items: [
  219. { label: 'ID', key: 'id' },
  220. ...this.columns,
  221. ],
  222. downloadType: 'local',
  223. title: this.$t('dictionary.cdn_domain'),
  224. }
  225. },
  226. },
  227. created () {
  228. this.initSidePageTab('cdn-detail')
  229. this.list.fetchData()
  230. },
  231. methods: {
  232. isOwner (obj) {
  233. if (this.isAdminMode) return true
  234. if (this.isDomainMode) return obj.domain_id === this.userInfo.projectDomainId
  235. return false
  236. },
  237. getParam () {
  238. const ret = {
  239. ...(R.is(Function, this.getParams) ? this.getParams() : this.getParams),
  240. detail: true,
  241. }
  242. return ret
  243. },
  244. handleOpenSidepage (row, tab) {
  245. this.sidePageTriggerHandle(this, 'CDNSidePage', {
  246. id: row.id,
  247. resource: 'cdn_domains',
  248. getParams: this.getParam,
  249. }, {
  250. list: this.list,
  251. tab,
  252. })
  253. },
  254. },
  255. }
  256. </script>