ACMEUserSelector.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <script setup lang="ts">
  2. import type { AcmeUser } from '@/api/acme_user'
  3. import type { AutoCertOptions } from '@/api/auto_cert'
  4. import type { SelectProps } from 'ant-design-vue'
  5. import type { Ref } from 'vue'
  6. import acme_user from '@/api/acme_user'
  7. const users = ref([]) as Ref<AcmeUser[]>
  8. const data = defineModel<AutoCertOptions>('options', {
  9. default: () => {
  10. return {}
  11. },
  12. required: true,
  13. })
  14. const id = computed(() => {
  15. return data.value?.acme_user_id
  16. })
  17. const user_idx = ref()
  18. function init() {
  19. users.value?.forEach((v: AcmeUser, k: number) => {
  20. if (v.id === id.value)
  21. user_idx.value = k
  22. })
  23. }
  24. const current = computed(() => {
  25. return users.value?.[user_idx.value]
  26. })
  27. const mounted = ref(false)
  28. watch(id, init)
  29. watch(current, () => {
  30. if (mounted.value)
  31. data.value!.acme_user_id = current.value.id
  32. })
  33. onMounted(async () => {
  34. users.value = []
  35. let page = 1
  36. while (true) {
  37. try {
  38. const r = await acme_user.get_list({ page })
  39. users.value.push(...r.data)
  40. if (r?.data?.length < r?.pagination?.per_page)
  41. break
  42. page++
  43. }
  44. catch {
  45. break
  46. }
  47. }
  48. init()
  49. // prevent the acme_user_id from being overwritten
  50. mounted.value = true
  51. })
  52. const options = computed<SelectProps['options']>(() => {
  53. const list: SelectProps['options'] = []
  54. users.value.forEach((v, k: number) => {
  55. list!.push({
  56. value: k,
  57. label: v.name,
  58. })
  59. })
  60. return list
  61. })
  62. function filterOption(input: string, option: { label: string }) {
  63. return option.label.toLowerCase().includes(input.toLowerCase())
  64. }
  65. </script>
  66. <template>
  67. <AForm layout="vertical">
  68. <AFormItem :label="$gettext('ACME User')">
  69. <ASelect
  70. v-model:value="user_idx"
  71. :placeholder="$gettext('System Initial User')"
  72. show-search
  73. :options
  74. :filter-option="filterOption"
  75. />
  76. </AFormItem>
  77. </AForm>
  78. </template>
  79. <style lang="less" scoped>
  80. </style>