DefaultInput.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. <template>
  2. <div class="column" :class="attrs.class" :style="attrs.style">
  3. <div class="col">
  4. <q-input
  5. ref="inputRef"
  6. v-model="model"
  7. v-bind="inputAttrs"
  8. :label
  9. label-color="secondary"
  10. :error="!!error"
  11. :error-message="errorMessage"
  12. :rules
  13. hide-bottom-space
  14. :class="inputClass"
  15. :input-class="nativeInputClass"
  16. @update:model-value="error = null"
  17. >
  18. <template v-for="(_, slotName) in $slots" #[slotName]>
  19. <slot :name="slotName" />
  20. </template>
  21. <template #append>
  22. <q-icon v-if="icon" :name="icon" size="sm" color="secondary" />
  23. </template>
  24. </q-input>
  25. </div>
  26. </div>
  27. </template>
  28. <script setup>
  29. import {
  30. ref,
  31. onBeforeMount,
  32. useAttrs,
  33. computed,
  34. watch,
  35. useTemplateRef,
  36. } from "vue";
  37. defineOptions({
  38. inheritAttrs: false,
  39. });
  40. const { label, nativeInputClass, inputClass, rules, icon } = defineProps({
  41. label: {
  42. type: String,
  43. default: "",
  44. },
  45. icon: {
  46. type: String,
  47. default: "",
  48. },
  49. rules: {
  50. type: Array,
  51. default: () => [],
  52. },
  53. nativeInputClass: {
  54. type: String,
  55. default: null,
  56. },
  57. inputClass: {
  58. type: String,
  59. default: null,
  60. },
  61. });
  62. const attrs = useAttrs();
  63. const inputRef = useTemplateRef("inputRef");
  64. const model = defineModel({ type: [String, Object, Array, Boolean, null] });
  65. const error = defineModel("error", {
  66. type: [String, Object, Array, Boolean, null],
  67. });
  68. const required = ref(false);
  69. const inputAttrs = computed(() => {
  70. // eslint-disable-next-line
  71. const { class: _, style: __, ...rest } = attrs;
  72. return rest;
  73. });
  74. const errorMessage = computed(() => {
  75. if (error.value == null) {
  76. return void 0;
  77. }
  78. if (typeof error.value === "boolean") {
  79. return void 0;
  80. }
  81. return String(error.value);
  82. });
  83. watch(
  84. () => rules,
  85. (values) => {
  86. values.forEach((r) => {
  87. if (r?.$id === "required") return (required.value = true);
  88. });
  89. },
  90. );
  91. onBeforeMount(() => {
  92. rules.forEach((r) => {
  93. if (r?.$id === "required") return (required.value = true);
  94. });
  95. });
  96. defineExpose({
  97. inputRef,
  98. });
  99. </script>
  100. <style scoped></style>