List.vue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <template>
  2. <page-list
  3. :list="list"
  4. :columns="columns"
  5. :group-actions="groupActions"
  6. :single-actions="singleActions"
  7. :export-data-options="exportDataOptions" />
  8. </template>
  9. <script>
  10. import * as R from 'ramda'
  11. import { getNameFilter, getStatusFilter, getEnabledFilter, getRegionFilter, getBrandFilter, getDescriptionFilter, getCreatedAtFilter } from '@/utils/common/tableFilter'
  12. import { getEnabledSwitchActions } from '@/utils/common/tableActions'
  13. import WindowsMixin from '@/mixins/windows'
  14. import { sizestr } from '@/utils/utils'
  15. import ListMixin from '@/mixins/list'
  16. import SingleActionsMixin from '../mixins/singleActions'
  17. import ColumnsMixin from '../mixins/columns'
  18. import { findPlatform } from '@/utils/common/hypervisor'
  19. import { SERVER_TYPE } from '../../../constants'
  20. export default {
  21. name: 'SkuList',
  22. mixins: [WindowsMixin, ListMixin, ColumnsMixin, SingleActionsMixin],
  23. props: {
  24. id: String,
  25. getParams: {
  26. type: [Function, Object],
  27. },
  28. cloudEnv: String,
  29. },
  30. data () {
  31. return {
  32. list: this.$list.createList(this, {
  33. id: this.id,
  34. resource: 'serverskus',
  35. getParams: this.getParam,
  36. filterOptions: {
  37. name: getNameFilter(),
  38. description: getDescriptionFilter(),
  39. status: getStatusFilter('sku'),
  40. enabled: getEnabledFilter(),
  41. cpu_core_count: {
  42. label: this.$t('compute.text_1051'),
  43. dropdown: true,
  44. multiple: true,
  45. distinctField: {
  46. type: 'field',
  47. key: 'cpu_core_count',
  48. },
  49. mapper: (data) => {
  50. return R.sort((a, b) => { return a.key - b.key }, data.map(({ key }) => {
  51. return { label: this.$t('compute.text_120', [key]), key }
  52. }))
  53. },
  54. },
  55. memory_size_mb: {
  56. label: this.$t('compute.text_1052'),
  57. dropdown: true,
  58. multiple: true,
  59. distinctField: {
  60. type: 'field',
  61. key: 'memory_size_mb',
  62. },
  63. mapper: (data) => {
  64. return R.sort((a, b) => { return a.key - b.key }, data.map(({ key }) => {
  65. return { label: sizestr(key, 'M', 1024), key }
  66. }))
  67. },
  68. },
  69. region: getRegionFilter(),
  70. provider: getBrandFilter(),
  71. created_at: getCreatedAtFilter(),
  72. },
  73. hiddenColumns: ['prepaid_status', 'created_at'],
  74. }),
  75. exportDataOptions: {
  76. items: [
  77. { label: 'ID', key: 'id' },
  78. { label: this.$t('compute.text_228'), key: 'name' },
  79. { label: this.$t('compute.text_1051'), key: 'cpu_core_count' },
  80. { label: this.$t('compute.text_1052'), key: 'memory_size_mb' },
  81. { label: this.$t('compute.text_268'), key: 'status' },
  82. { label: this.$t('compute.text_699', [this.$t('dictionary.server')]), key: 'total_guest_count' },
  83. { label: this.$t('compute.text_241'), key: 'enabled' },
  84. { label: this.$t('common.createdAt'), key: 'created_at' },
  85. ],
  86. },
  87. groupActions: [
  88. {
  89. label: this.$t('compute.perform_create'),
  90. permission: 'skus_create',
  91. action: () => {
  92. this.createDialog('CreateSkuDialog', {
  93. title: this.$t('compute.perform_create'),
  94. onManager: this.onManager,
  95. })
  96. },
  97. meta: () => {
  98. const validate = this.cloudEnv !== 'public' && this.cloudEnv !== 'private'
  99. const meta = {
  100. buttonType: 'primary',
  101. validate,
  102. tooltip: validate ? '' : this.$t(`commpute.${this.cloudEnv}_sku_disable_tooltip`),
  103. }
  104. return meta
  105. },
  106. },
  107. {
  108. label: this.$t('commpute.sku_sync_title'),
  109. permission: 'cloudregions_perform_sync_skus', // 套餐这里因为接口是cloudregions的,所以权限也只能走cloudregions的
  110. action: () => {
  111. this.createDialog('SkuSyncDialog')
  112. },
  113. hidden: () => this.cloudEnv !== 'public',
  114. },
  115. {
  116. label: this.$t('common.batchAction'),
  117. actions: () => {
  118. return [
  119. ...getEnabledSwitchActions(this, undefined, ['skus_update', 'skus_update'], {
  120. extraMetas: [
  121. () => {
  122. let tooltip = ''
  123. let validate = this.list.selectedItems.length > 0
  124. if (this.list.selectedItems.some(item => {
  125. const env = findPlatform(item.provider, 'provider')
  126. if (env === SERVER_TYPE.private) {
  127. return true
  128. }
  129. return false
  130. })) {
  131. validate = false
  132. tooltip = this.$t('commpute.private_sku_disable_tooltip')
  133. }
  134. return {
  135. validate,
  136. tooltip,
  137. }
  138. },
  139. () => {
  140. let tooltip = ''
  141. let validate = this.list.selectedItems.length > 0
  142. if (this.list.selectedItems.some(item => {
  143. const env = findPlatform(item.provider, 'provider')
  144. if (env === SERVER_TYPE.private) {
  145. return true
  146. }
  147. return false
  148. })) {
  149. validate = false
  150. tooltip = this.$t('commpute.private_sku_disable_tooltip')
  151. }
  152. return {
  153. validate,
  154. tooltip,
  155. }
  156. },
  157. ],
  158. }),
  159. {
  160. label: this.$t('compute.sku.setup.sell.status'),
  161. permission: 'skus_update',
  162. action: () => {
  163. this.createDialog('ServerSkuUpdateDialog', {
  164. data: this.list.selectedItems,
  165. columns: this.columns,
  166. onManager: this.onManager,
  167. })
  168. },
  169. meta: () => {
  170. let tooltip = ''
  171. let validate = this.list.selectedItems.length > 0
  172. if (this.list.selectedItems.some(item => {
  173. const env = findPlatform(item.provider, 'provider')
  174. if (env === SERVER_TYPE.private) {
  175. return true
  176. }
  177. return false
  178. })) {
  179. validate = false
  180. tooltip = this.$t('commpute.private_sku_disable_tooltip')
  181. }
  182. return {
  183. validate,
  184. tooltip,
  185. }
  186. },
  187. },
  188. {
  189. label: this.$t('compute.perform_delete'),
  190. permission: 'skus_delete',
  191. action: () => {
  192. this.createDialog('DeleteResDialog', {
  193. vm: this,
  194. data: this.list.selectedItems,
  195. columns: this.columns,
  196. title: this.$t('compute.text_1053'),
  197. name: this.$t('dictionary.sku'),
  198. onManager: this.onManager,
  199. })
  200. },
  201. meta: () => {
  202. return this.$getDeleteResult(this.list.selectedItems)
  203. },
  204. },
  205. ]
  206. },
  207. },
  208. ],
  209. }
  210. },
  211. watch: {
  212. cloudEnv (val) {
  213. this.$nextTick(() => {
  214. this.list.fetchData(0)
  215. })
  216. },
  217. },
  218. created () {
  219. this.initSidePageTab('sku-detail')
  220. this.list.fetchData()
  221. },
  222. methods: {
  223. getParam () {
  224. const ret = {
  225. details: true,
  226. with_meta: true,
  227. ...(R.is(Function, this.getParams) ? this.getParams() : this.getParams),
  228. }
  229. if (this.cloudEnv) ret.cloud_env = this.cloudEnv
  230. return ret
  231. },
  232. handleOpenSidepage (row) {
  233. this.sidePageTriggerHandle(this, 'SkuSidePage', {
  234. id: row.id,
  235. resource: 'serverskus',
  236. getParams: this.getParam,
  237. cloudEnv: this.cloudEnv,
  238. }, {
  239. list: this.list,
  240. })
  241. },
  242. },
  243. }
  244. </script>