DefaultSelect.vue 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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="inputClass"
  18. :popup-content-class="popupContentClass"
  19. @update:model-value="error = null"
  20. >
  21. <template v-for="(_, slotName) in $slots" #[slotName]="scope">
  22. <slot :name="slotName" v-bind="scope" />
  23. </template>
  24. </q-select>
  25. </div>
  26. </template>
  27. <script setup>
  28. import { ref, onBeforeMount, useAttrs, computed } from "vue";
  29. defineOptions({
  30. inheritAttrs: false,
  31. });
  32. const { label, inputClass, popupContentClass, rules } = defineProps({
  33. label: {
  34. type: String,
  35. default: "",
  36. },
  37. rules: {
  38. type: Array,
  39. default: () => [],
  40. },
  41. inputClass: {
  42. type: String,
  43. default: null,
  44. },
  45. popupContentClass: {
  46. type: String,
  47. default: null,
  48. },
  49. });
  50. const attrs = useAttrs();
  51. const model = defineModel({ type: [String, Object, Array, Number, null] });
  52. const error = defineModel("error", {
  53. type: [String, Object, Array, Boolean, null],
  54. });
  55. const selectRef = ref(null);
  56. const required = ref(false);
  57. const selectAttrs = computed(() => {
  58. // eslint-disable-next-line
  59. const { class: _, style: __, ...rest } = attrs;
  60. return rest;
  61. });
  62. const errorMessage = computed(() => {
  63. if (error.value == null) {
  64. return void 0;
  65. }
  66. if (typeof error.value === "boolean") {
  67. return void 0;
  68. }
  69. return String(error.value);
  70. });
  71. onBeforeMount(() => {
  72. rules.forEach((r) => {
  73. if (r?.$id === "required") return (required.value = true);
  74. });
  75. });
  76. defineExpose({
  77. selectRef,
  78. });
  79. </script>