CloudProviderRegion.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <script>
  2. export default {
  3. name: 'CloudProviderRegion',
  4. inject: ['form'],
  5. props: {
  6. cloudprovideParams: {
  7. type: Object,
  8. },
  9. cloudregionParams: {
  10. type: Object,
  11. },
  12. decorators: {
  13. type: Object,
  14. },
  15. // select默认是否选中第一个option
  16. defaultActiveFirstOption: {
  17. type: Boolean,
  18. default: () => true,
  19. },
  20. isRequired: {
  21. type: Boolean,
  22. default: () => true,
  23. },
  24. },
  25. data () {
  26. return {
  27. cloudproviderLoading: false,
  28. cloudproviderList: [],
  29. cloudregionLoading: false,
  30. cloudregionList: [],
  31. }
  32. },
  33. computed: {
  34. FC () {
  35. if (this.form && this.form.fc) {
  36. return this.form.fc
  37. }
  38. return this.$form.createForm(this)
  39. },
  40. // 设置默认decorators
  41. _decorators () {
  42. const { isRequired } = this
  43. const manager = ['manager', {
  44. rules: [
  45. {
  46. required: isRequired, message: this.$t('storage.text_92'),
  47. },
  48. ],
  49. }]
  50. const cloudregion = ['cloudregion_id', {
  51. rules: [
  52. {
  53. required: isRequired, message: this.$t('storage.text_57'),
  54. },
  55. ],
  56. }]
  57. const _ = {
  58. manager,
  59. cloudregion,
  60. }
  61. return Object.assign({}, _, this.decorators)
  62. },
  63. },
  64. watch: {
  65. cloudprovideParams: {
  66. handler (val, oldVal) {
  67. this.fetchCloudproviders()
  68. },
  69. deep: true,
  70. immediate: true,
  71. },
  72. },
  73. created () {
  74. this.fetchCloudproviders()
  75. },
  76. methods: {
  77. filterOption (input, option) {
  78. return (
  79. option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
  80. )
  81. },
  82. async fetchCloudproviders () {
  83. const params = Object.assign({}, {
  84. limit: 0,
  85. enabled: 1,
  86. details: true,
  87. scope: this.$store.getters.scope,
  88. has_object_storage: true,
  89. }, this.cloudprovideParams)
  90. if (this.$store.getters.isAdminMode && params.project_domain) {
  91. delete params.scope
  92. }
  93. this.cloudproviderLoading = true
  94. const [id] = this._decorators.manager
  95. this.FC.setFieldsValue({
  96. [id]: undefined,
  97. })
  98. try {
  99. const manager = new this.$Manager('cloudproviders', 'v2')
  100. const { data = {} } = await manager.list({ params })
  101. const list = data.data || []
  102. this.cloudproviderList = list
  103. // 选中第一个option
  104. if (list && list.length > 0 && this.defaultActiveFirstOption) {
  105. const [id] = this._decorators.manager
  106. this.FC.setFieldsValue({
  107. [id]: list[0].id,
  108. }, () => {
  109. this.fetchCloudregions({ manager: list[0].id })
  110. })
  111. } else {
  112. const [id] = this._decorators.cloudregion
  113. this.FC.setFieldsValue({
  114. [id]: undefined,
  115. })
  116. this.cloudregionList = []
  117. }
  118. } catch (err) {
  119. throw err
  120. } finally {
  121. this.cloudproviderLoading = false
  122. }
  123. },
  124. async fetchCloudregions (queryParams = {}) {
  125. const params = Object.assign({}, {
  126. limit: 0,
  127. scope: this.$store.getters.scope,
  128. }, this.cloudregionParams, queryParams)
  129. if (this.$store.getters.isAdminMode && params.project_domain) {
  130. delete params.scope
  131. }
  132. this.cloudregionLoading = true
  133. const [id] = this._decorators.cloudregion
  134. this.FC.setFieldsValue({
  135. [id]: undefined,
  136. })
  137. try {
  138. const manager = new this.$Manager('cloudregions', 'v2')
  139. const { data = {} } = await manager.list({ params })
  140. const list = data.data || []
  141. this.cloudregionList = list
  142. if (list && list.length > 0 && this.defaultActiveFirstOption) {
  143. const [id] = this._decorators.cloudregion
  144. this.FC.setFieldsValue({
  145. [id]: list[0].id,
  146. })
  147. this.$emit('cloudregionChange', list[0])
  148. }
  149. } catch (err) {
  150. throw err
  151. } finally {
  152. this.cloudregionLoading = false
  153. }
  154. },
  155. },
  156. render () {
  157. const { getFieldDecorator, setFieldsValue, validateFields } = this.FC
  158. const { cloudproviderLoading, cloudproviderList, cloudregionLoading, cloudregionList } = this
  159. const names = ['manager', 'cloudregion']
  160. const selectConfig = {
  161. manager: {
  162. loading: cloudproviderLoading,
  163. list: cloudproviderList,
  164. onChange: (manager) => {
  165. if (manager) {
  166. this.fetchCloudregions({ manager })
  167. } else {
  168. this.cloudregionList = []
  169. const [id] = this._decorators.cloudregion
  170. setFieldsValue({
  171. [id]: undefined,
  172. }, () => {
  173. validateFields([id])
  174. })
  175. }
  176. },
  177. },
  178. cloudregion: {
  179. loading: cloudregionLoading,
  180. list: cloudregionList,
  181. onChange: (id, vnode) => {
  182. const { row } = vnode.data.attrs
  183. this.$emit('cloudregionChange', row)
  184. },
  185. },
  186. }
  187. const FormItem = ({ children }) => {
  188. return (
  189. <a-col span={12}>
  190. <a-form-item wrapperCol={{ span: 24 }}>
  191. {children}
  192. </a-form-item>
  193. </a-col>
  194. )
  195. }
  196. const selects = names.map(name => {
  197. const { loading, list = [], onChange } = selectConfig[name]
  198. const [id, options = {}] = this._decorators[name]
  199. const select = getFieldDecorator(id, options)(
  200. <a-select class="w-100" allowClear showSearch filterOption={this.filterOption}loading={loading} onChange={onChange}>
  201. {
  202. list.map(item => {
  203. const { id } = item
  204. const name = this._$t(item)
  205. return <a-select-option row={item} value={id} >{name}</a-select-option>
  206. })
  207. }
  208. </a-select>,
  209. )
  210. return (
  211. <FormItem>
  212. {select}
  213. </FormItem>
  214. )
  215. })
  216. return (
  217. <a-row gutter={8}>
  218. {selects}
  219. </a-row>
  220. )
  221. },
  222. }
  223. </script>