DefaultSelect.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <template>
  2. <div class="column no-wrap" :class="attrs.class" :style="attrs.style">
  3. <div v-if="label || $slots.label" class="q-pl-xs">
  4. <slot name="label">
  5. <span>{{ label }}</span>
  6. </slot>
  7. <span v-if="required" class="text-negative q-ml-xs">*</span>
  8. </div>
  9. <q-select
  10. ref="selectRef"
  11. v-model="model"
  12. v-bind="selectAttrs"
  13. :error="!!error"
  14. :error-message="errorMessage"
  15. :rules
  16. hide-bottom-space
  17. class="input-violet"
  18. :class="inputClass"
  19. :popup-content-class="popupContentClass"
  20. @update:model-value="error = null"
  21. >
  22. <template v-for="(_, slotName) in $slots" #[slotName]="scope">
  23. <slot :name="slotName" v-bind="scope" />
  24. </template>
  25. </q-select>
  26. </div>
  27. </template>
  28. <script setup>
  29. import { ref, onBeforeMount, useAttrs, computed } from "vue";
  30. defineOptions({
  31. inheritAttrs: false,
  32. });
  33. const { label, inputClass, popupContentClass, rules } = defineProps({
  34. label: {
  35. type: String,
  36. default: "",
  37. },
  38. rules: {
  39. type: Array,
  40. default: () => [],
  41. },
  42. inputClass: {
  43. type: String,
  44. default: null,
  45. },
  46. popupContentClass: {
  47. type: String,
  48. default: null,
  49. },
  50. });
  51. const attrs = useAttrs();
  52. const model = defineModel({ type: [String, Object, Array, Number, null] });
  53. const error = defineModel("error", {
  54. type: [String, Object, Array, Boolean, null],
  55. });
  56. const selectRef = ref(null);
  57. const required = ref(false);
  58. const selectAttrs = computed(() => {
  59. // eslint-disable-next-line
  60. const { class: _, style: __, ...rest } = attrs;
  61. return rest;
  62. });
  63. const errorMessage = computed(() => {
  64. if (error.value == null) {
  65. return void 0;
  66. }
  67. if (typeof error.value === "boolean") {
  68. return void 0;
  69. }
  70. return String(error.value);
  71. });
  72. onBeforeMount(() => {
  73. rules.forEach((r) => {
  74. if (r?.$id === "required") return (required.value = true);
  75. });
  76. });
  77. defineExpose({
  78. selectRef,
  79. });
  80. </script>