Añadir inputs
This commit is contained in:
parent
4fd3364556
commit
018238061a
|
@ -1,22 +1,130 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="custom-input-el">
|
<div class="custom-input-el calendar">
|
||||||
<IconCalendar />
|
<q-btn round size="sm" class="custom-date-btn">
|
||||||
|
<IconCalendar />
|
||||||
|
|
||||||
|
<q-popup-proxy
|
||||||
|
@before-show="updateProxy"
|
||||||
|
cover
|
||||||
|
transition-show="scale"
|
||||||
|
transition-hide="scale"
|
||||||
|
>
|
||||||
|
<q-date
|
||||||
|
v-model="proxyDate"
|
||||||
|
:options="optionsValidDates"
|
||||||
|
mask="DD-MM-YYYY"
|
||||||
|
>
|
||||||
|
<div class="row items-center justify-end q-gutter-sm">
|
||||||
|
<q-btn label="Cancel" color="primary" flat v-close-popup />
|
||||||
|
<q-btn
|
||||||
|
label="OK"
|
||||||
|
color="primary"
|
||||||
|
flat
|
||||||
|
@click="save"
|
||||||
|
v-close-popup
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</q-date>
|
||||||
|
</q-popup-proxy>
|
||||||
|
</q-btn>
|
||||||
|
|
||||||
<div class="custom-block-content">
|
<div class="custom-block-content">
|
||||||
<p class="custom-head-paragraph">¿Cuándo?</p>
|
<p class="custom-head-paragraph">¿Cuándo?</p>
|
||||||
<p class="custom-main-paragraph">Elige una fecha</p>
|
<q-input
|
||||||
|
class="custom-date-input"
|
||||||
|
label="Elige una fecha"
|
||||||
|
placeholder="DD/MM/YYYY"
|
||||||
|
v-model="calendar"
|
||||||
|
mask="##/##/####"
|
||||||
|
:error="!!errors.date"
|
||||||
|
:error-message="errors.date"
|
||||||
|
@blur="onBlur"
|
||||||
|
borderless
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { toTypedSchema } from '@vee-validate/zod';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { useFormStore } from 'src/stores/forms';
|
||||||
|
import { useForm } from 'vee-validate';
|
||||||
|
import { defineComponent, ref } from 'vue';
|
||||||
|
import { z } from 'zod';
|
||||||
import IconCalendar from '../icons/IconCalendar.vue';
|
import IconCalendar from '../icons/IconCalendar.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'calendar-input',
|
name: 'calendar-input',
|
||||||
components: { IconCalendar },
|
components: { IconCalendar },
|
||||||
|
setup() {
|
||||||
|
const getDate = new Date();
|
||||||
|
const currentDay = getDate.getDate().toString().padStart(2, '0');
|
||||||
|
const currentMonth = getDate.getMonth() + 1;
|
||||||
|
const currentYear = getDate.getFullYear();
|
||||||
|
const fullCurrentDate = `${currentYear}/${currentMonth}/${currentDay}`;
|
||||||
|
|
||||||
|
const formStore = useFormStore();
|
||||||
|
const { availability } = storeToRefs(formStore);
|
||||||
|
const proxyDate = ref(fullCurrentDate);
|
||||||
|
|
||||||
|
const validationSchema = toTypedSchema(
|
||||||
|
z.object({
|
||||||
|
date: z.string().refine((val) => {
|
||||||
|
const [day, month, year] = val.split('/');
|
||||||
|
console.log({ day, month, year });
|
||||||
|
const regex = /\//g;
|
||||||
|
const valWithoutSlash = val.replace(regex, '');
|
||||||
|
/* const daysOnMonth = (month: number, year: number) => {
|
||||||
|
const data = new Date(year, month, 0);
|
||||||
|
return data.getDate();
|
||||||
|
};
|
||||||
|
const daysOnMonthValue = daysOnMonth(+month, +year); */
|
||||||
|
|
||||||
|
const data = new Date(`${year}-${month}-${day}`);
|
||||||
|
const today = new Date();
|
||||||
|
|
||||||
|
return (
|
||||||
|
valWithoutSlash.length === 8 &&
|
||||||
|
/* +year >= currentYear &&
|
||||||
|
+month >= currentMonth &&
|
||||||
|
+day >= +currentDay && */
|
||||||
|
data >= today /* &&
|
||||||
|
+month > 0 &&
|
||||||
|
+month <= 12 &&
|
||||||
|
+day > 0 &&
|
||||||
|
+day <= daysOnMonthValue */
|
||||||
|
);
|
||||||
|
}, 'La fecha no puede ser inferior al día de hoy!'),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
const { errors, defineField } = useForm({
|
||||||
|
validationSchema,
|
||||||
|
});
|
||||||
|
const [calendar, calendarAttrs] = defineField('date');
|
||||||
|
const onBlur = () => {
|
||||||
|
availability.value.date = calendar.value as string;
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
availability,
|
||||||
|
proxyDate,
|
||||||
|
calendar,
|
||||||
|
calendarAttrs,
|
||||||
|
errors,
|
||||||
|
onBlur,
|
||||||
|
updateProxy() {
|
||||||
|
proxyDate.value = availability.value.date;
|
||||||
|
},
|
||||||
|
optionsValidDates(date: string) {
|
||||||
|
return date >= fullCurrentDate /* && date <= '2019/02/15' */;
|
||||||
|
},
|
||||||
|
save() {
|
||||||
|
availability.value.date = proxyDate.value;
|
||||||
|
calendar.value = proxyDate.value;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped></style>
|
|
||||||
|
|
|
@ -1,22 +1,74 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="custom-input-el">
|
<div class="custom-input-el postal-code">
|
||||||
<IconPostalCode />
|
<IconPostalCode />
|
||||||
|
|
||||||
<div class="custom-block-content">
|
<div class="custom-block-content">
|
||||||
<p class="custom-head-paragraph">¿Dónde?</p>
|
<p class="custom-head-paragraph">¿Dónde?</p>
|
||||||
<p class="custom-main-paragraph">código postal</p>
|
<!-- <p class="custom-main-paragraph">código postal</p> -->
|
||||||
|
<q-input
|
||||||
|
borderless
|
||||||
|
class="custom-main-paragraph"
|
||||||
|
v-model="postalCode"
|
||||||
|
v-bind="postalCodeAttrs"
|
||||||
|
:error="!!errors.postalCode"
|
||||||
|
:error-message="errors.postalCode"
|
||||||
|
label="código postal"
|
||||||
|
placeholder="00000-000"
|
||||||
|
mask="#####-###"
|
||||||
|
@blur="onBlur"
|
||||||
|
dense
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import { toTypedSchema } from '@vee-validate/zod';
|
||||||
|
import { storeToRefs } from 'pinia';
|
||||||
|
import { useFormStore } from 'src/stores/forms';
|
||||||
|
import { useForm } from 'vee-validate';
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
|
import { z } from 'zod';
|
||||||
import IconPostalCode from '../icons/IconPostalCode.vue';
|
import IconPostalCode from '../icons/IconPostalCode.vue';
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'postal-code',
|
name: 'postal-code',
|
||||||
components: { IconPostalCode },
|
components: { IconPostalCode },
|
||||||
|
setup() {
|
||||||
|
const formStore = useFormStore();
|
||||||
|
const { availability } = storeToRefs(formStore);
|
||||||
|
const validationSchema = toTypedSchema(
|
||||||
|
z
|
||||||
|
.object({
|
||||||
|
postalCode: z.string().refine((val) => {
|
||||||
|
const valWithoutHifen = val.replace('-', '');
|
||||||
|
const valLength = valWithoutHifen.length;
|
||||||
|
const regex = /^[0-9]+$/;
|
||||||
|
|
||||||
|
return (
|
||||||
|
regex.test(valWithoutHifen) && valLength === 8 && valLength > 0
|
||||||
|
);
|
||||||
|
}, 'El código postal no puede contener letras y debe constar de 8 caracteres!'),
|
||||||
|
})
|
||||||
|
.partial()
|
||||||
|
);
|
||||||
|
const { errors, defineField } = useForm({
|
||||||
|
validationSchema,
|
||||||
|
initialValues: {
|
||||||
|
postalCode: availability.value.date,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const [postalCode, postalCodeAttrs] = defineField('postalCode');
|
||||||
|
const onBlur = () => {
|
||||||
|
availability.value.postalCode = postalCode.value as string;
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
postalCode,
|
||||||
|
postalCodeAttrs,
|
||||||
|
errors,
|
||||||
|
onBlur,
|
||||||
|
};
|
||||||
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped></style>
|
|
||||||
|
|
|
@ -34,11 +34,7 @@ export default defineComponent({
|
||||||
setup() {
|
setup() {
|
||||||
const rangePriceStore = useRangePriceStore();
|
const rangePriceStore = useRangePriceStore();
|
||||||
|
|
||||||
const handleChange = (e: Event) => {
|
return { rangePriceStore };
|
||||||
console.log(e);
|
|
||||||
};
|
|
||||||
|
|
||||||
return { rangePriceStore, handleChange };
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
Loading…
Reference in New Issue