NodeSelector.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <script setup lang="ts">
  2. import type { Ref } from 'vue'
  3. import type { Environment } from '@/api/environment'
  4. import environment from '@/api/environment'
  5. const props = defineProps<{
  6. target: number[]
  7. map?: Record<number, string>
  8. hiddenLocal?: boolean
  9. }>()
  10. const emit = defineEmits(['update:target', 'update:map'])
  11. const data = ref([]) as Ref<Environment[]>
  12. const data_map = ref({}) as Ref<Record<number, Environment>>
  13. onMounted(async () => {
  14. let hasMore = true
  15. let page = 1
  16. while (hasMore) {
  17. await environment.get_list({ page, enabled: true }).then(r => {
  18. data.value.push(...r.data)
  19. r.data?.forEach(node => {
  20. data_map.value[node.id] = node
  21. })
  22. hasMore = r.data.length === r.pagination.per_page
  23. page++
  24. }).catch(() => {
  25. hasMore = false
  26. })
  27. }
  28. })
  29. const value = computed({
  30. get() {
  31. return props.target
  32. },
  33. set(v) {
  34. if (typeof props.map === 'object') {
  35. v.forEach(id => {
  36. if (id !== 0)
  37. emit('update:map', { ...props.map, [id]: data_map.value[id].name })
  38. })
  39. }
  40. emit('update:target', v)
  41. },
  42. })
  43. const noData = computed(() => {
  44. return props.hiddenLocal && !data?.value?.length
  45. })
  46. </script>
  47. <template>
  48. <ACheckboxGroup
  49. v-model:value="value"
  50. style="width: 100%"
  51. :class="{
  52. 'justify-center': noData,
  53. }"
  54. >
  55. <ARow
  56. v-if="!noData"
  57. :gutter="[16, 16]"
  58. >
  59. <ACol
  60. v-if="!hiddenLocal"
  61. :span="8"
  62. >
  63. <ACheckbox :value="0">
  64. {{ $gettext('Local') }}
  65. </ACheckbox>
  66. <ATag color="blue">
  67. {{ $gettext('Online') }}
  68. </ATag>
  69. </ACol>
  70. <ACol
  71. v-for="(node, index) in data"
  72. :key="index"
  73. :span="8"
  74. >
  75. <ACheckbox :value="node.id">
  76. {{ node.name }}
  77. </ACheckbox>
  78. <ATag
  79. v-if="node.status"
  80. color="blue"
  81. >
  82. {{ $gettext('Online') }}
  83. </ATag>
  84. <ATag
  85. v-else
  86. color="error"
  87. >
  88. {{ $gettext('Offline') }}
  89. </ATag>
  90. </ACol>
  91. </ARow>
  92. <AEmpty v-else />
  93. </ACheckboxGroup>
  94. </template>
  95. <style scoped lang="less">
  96. </style>