IpSelect.vue 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <template>
  2. <base-select
  3. v-if="showType === 'select'"
  4. :value="value"
  5. :options="options"
  6. @change="change"
  7. :select-props="{
  8. allowClear: true,
  9. loading: loading,
  10. placeholder: $t('common.tips.select', ['IP']),
  11. }" />
  12. <a-input v-else :value="value" @change="ipChange" />
  13. </template>
  14. <script>
  15. import { uuid } from '@/utils/utils'
  16. export default {
  17. props: {
  18. value: {
  19. required: true,
  20. },
  21. network: {
  22. type: Object,
  23. default: () => ({}),
  24. },
  25. },
  26. data () {
  27. return {
  28. loading: false,
  29. options: [],
  30. showType: 'select',
  31. }
  32. },
  33. watch: {
  34. 'network.id': {
  35. handler (val, oldVal) {
  36. if (val) {
  37. this.fetchIps(val)
  38. } else if (oldVal && !val) {
  39. this.options = []
  40. this.$emit('change', null)
  41. }
  42. },
  43. immediate: true,
  44. },
  45. },
  46. created () {
  47. this.$iM = new this.$Manager('networks', 'v1')
  48. },
  49. methods: {
  50. async fetchIps (val) {
  51. const { ports = 0 } = this.network
  52. if (ports > 1024) {
  53. this.showType = 'input'
  54. this.$emit('change', null)
  55. return
  56. }
  57. try {
  58. this.loading = true
  59. const res = await new this.$Manager(`networks/${val}/available-addresses`).list({
  60. params: {
  61. $t: uuid(),
  62. scope: this.$store.getters.scope,
  63. },
  64. })
  65. const { addresses = [] } = res.data || {}
  66. this.options = addresses.map(ip => {
  67. return {
  68. id: ip,
  69. name: ip,
  70. }
  71. })
  72. if (!addresses.includes(this.value)) {
  73. this.options.unshift({
  74. ip: this.value,
  75. name: this.value,
  76. })
  77. // this.$emit('change', null)
  78. }
  79. this.showType = 'select'
  80. this.loading = false
  81. } catch (err) {
  82. this.loading = false
  83. this.showType = 'input'
  84. throw err
  85. }
  86. },
  87. change (val) {
  88. this.$emit('change', val)
  89. },
  90. ipChange (e) {
  91. this.$emit('change', e.target.value)
  92. },
  93. },
  94. }
  95. </script>