Enum.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <template>
  2. <main>
  3. <v-skeleton-loader
  4. v-if="$fetchState.pending"
  5. type="list-item"
  6. loading
  7. />
  8. <v-select
  9. v-else
  10. :label="$t(label_field)"
  11. :value="data"
  12. :items="items"
  13. item-text="label"
  14. item-value="value"
  15. :rules="rules"
  16. :disabled="readOnly"
  17. @change="$emit('update', $event, field)"
  18. />
  19. </main>
  20. </template>
  21. <script lang="ts">
  22. import { defineComponent, ref, useContext, useFetch, Ref } from '@nuxtjs/composition-api'
  23. import { EnumChoices } from '~/types/interfaces'
  24. import { QUERY_TYPE } from '~/types/enums'
  25. export default defineComponent({
  26. props: {
  27. enumType: {
  28. type: String,
  29. required: true
  30. },
  31. label: {
  32. type: String,
  33. required: false
  34. },
  35. field: {
  36. type: String,
  37. required: false
  38. },
  39. data: {
  40. type: String,
  41. required: false
  42. },
  43. readOnly: {
  44. type: Boolean,
  45. required: false
  46. },
  47. rules: {
  48. type: Array,
  49. required: false
  50. }
  51. },
  52. setup (props) {
  53. const label_field = props.label ?? props.field
  54. const { enumType } = props
  55. const { $dataProvider } = useContext()
  56. const items: Ref<Array<EnumChoices>> = ref([])
  57. useFetch(async () => {
  58. items.value = await $dataProvider.invoke({
  59. type: QUERY_TYPE.ENUM,
  60. enumType
  61. })
  62. })
  63. return {
  64. items,
  65. label_field
  66. }
  67. }
  68. })
  69. </script>
  70. <style scoped>
  71. </style>