añadir los banners y ajustes checkout

This commit is contained in:
Jaume Solís 2024-03-15 12:07:42 +01:00
parent a91038f8b8
commit 7d035b0a57
4 changed files with 174 additions and 334 deletions

View File

@ -10,10 +10,10 @@ import { useVerticalCarouselImgs } from "src/hooks/useVerticalCarouselImgs";
export default defineComponent({ export default defineComponent({
name: "vertical-carousel-imgs", name: "vertical-carousel-imgs",
props: { props: {
imgsArr: { banners: {
type: Array, type: Array,
default: () => [""], default: () => [""],
}, }
}, },
components: { IconSearch, Calendar, PostalCode }, components: { IconSearch, Calendar, PostalCode },
setup() { setup() {
@ -45,65 +45,42 @@ export default defineComponent({
</script> </script>
<template> <template>
<div <div ref="target" class="vertical-carousel-container" style="min-height: 100dvh">
ref="target" <q-carousel navigation-position="right" style="min-height: 100dvh" v-model="slide" navigation autoplay infinite
class="vertical-carousel-container" animated v-if="!!banners.length" class="custom-carousel">
style="min-height: 100dvh" <q-carousel-slide v-for="(item, i) in banners" :key="i" :name="item.title" :img-src="item.image">
> <div class="vertical-carousel-content">
<q-carousel <header class="carousel-content-header">
navigation-position="right" <h1 class="carousel-header-title">
style="min-height: 100dvh" {{ item.title }}
v-model="slide" </h1>
navigation </header>
autoplay
infinite <form @submit="onSubmit" class="carousel-content-body">
animated <div class="carousel-content-item">
v-if="!!imgsArr.length" <PostalCode v-model="postalCode" v-bind:bindValue="postalCodeAttrs" :setFieldError="setFieldError" />
class="custom-carousel" </div>
>
<q-carousel-slide <div class="carousel-content-item">
v-for="(img, i) in imgsArr" <Calendar v-model="calendar" v-bind:bindValue="calendarAttrs" :setValues="setValues" />
:key="i" </div>
:name="img"
:img-src="img" <q-btn type="submit" class="btn carousel-content-item">
/> <IconSearch /> ver disponibilidad
</q-btn>
</form>
</div>
</q-carousel-slide>
</q-carousel> </q-carousel>
<div class="vertical-carousel-content">
<header class="carousel-content-header">
<h1 class="carousel-header-title">
Regala un verano lleno de flores y plantas
</h1>
</header>
<form @submit="onSubmit" class="carousel-content-body">
<div class="carousel-content-item">
<PostalCode
v-model="postalCode"
v-bind:bindValue="postalCodeAttrs"
:setFieldError="setFieldError"
/>
</div>
<div class="carousel-content-item">
<Calendar
v-model="calendar"
v-bind:bindValue="calendarAttrs"
:setValues="setValues"
/>
</div>
<q-btn type="submit" class="btn carousel-content-item">
<IconSearch /> ver disponibilidad
</q-btn>
</form>
</div>
</div> </div>
</template> </template>
<style lang="scss" scoped> <style lang="scss" scoped>
.vertical-carousel-container { .vertical-carousel-container {
position: relative; position: relative;
& .custom-carousel { & .custom-carousel {
user-select: none; user-select: none;
} }
@ -116,6 +93,7 @@ export default defineComponent({
bottom: 110px; bottom: 110px;
width: min(100%, 845px); width: min(100%, 845px);
margin: 0 auto; margin: 0 auto;
& .carousel-content-header { & .carousel-content-header {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -123,6 +101,7 @@ export default defineComponent({
color: $white; color: $white;
text-align: center; text-align: center;
margin-bottom: 27px; margin-bottom: 27px;
& .carousel-header-title { & .carousel-header-title {
font-size: $font-35; font-size: $font-35;
font-weight: 500; font-weight: 500;
@ -161,6 +140,7 @@ export default defineComponent({
padding-inline: 53px 34px; padding-inline: 53px 34px;
flex: 1; flex: 1;
position: relative; position: relative;
&:first-child::after { &:first-child::after {
content: ""; content: "";
position: absolute; position: absolute;
@ -170,11 +150,14 @@ export default defineComponent({
right: 0; right: 0;
top: 27px; top: 27px;
bottom: 29px; bottom: 29px;
@media only screen and (max-width: $med-md) { @media only screen and (max-width: $med-md) {
display: none; display: none;
} }
} }
&.btn { &.btn {
&:focus, &:focus,
&:focus-visible { &:focus-visible {
outline: none; outline: none;
@ -205,6 +188,7 @@ export default defineComponent({
& .carousel-content-header { & .carousel-content-header {
gap: 15px; gap: 15px;
margin-bottom: 49px; margin-bottom: 49px;
& .carousel-header-title { & .carousel-header-title {
font-size: $font-28; font-size: $font-28;
line-height: 34px; line-height: 34px;
@ -215,16 +199,20 @@ export default defineComponent({
font-weight: 500; font-weight: 500;
} }
} }
& .carousel-content-body { & .carousel-content-body {
margin-bottom: initial; margin-bottom: initial;
flex-direction: column; flex-direction: column;
width: min(100%, 276px); width: min(100%, 276px);
margin: 0 auto; margin: 0 auto;
& .carousel-content-item { & .carousel-content-item {
padding-block: 24px; padding-block: 24px;
&:first-child { &:first-child {
border-radius: 10px 10px 0px 0px; border-radius: 10px 10px 0px 0px;
} }
&:last-child { &:last-child {
border-radius: 0 0 10px 10px; border-radius: 0 0 10px 10px;
} }
@ -236,8 +224,7 @@ export default defineComponent({
} }
} }
@media only screen and (max-width: $med-md) { @media only screen and (max-width: $med-md) {}
}
@media only screen and (max-height: 360px) { @media only screen and (max-height: 360px) {
/* background-color: tomato; */ /* background-color: tomato; */

View File

@ -241,7 +241,6 @@ export function useCheckoutForm() {
type: values.paymentMethod, type: values.paymentMethod,
}; };
addItem("payment", values.paymentMethod); addItem("payment", values.paymentMethod);
const typeObj = { const typeObj = {
paypal: async () => { paypal: async () => {
const { const {
@ -254,8 +253,10 @@ export function useCheckoutForm() {
const { const {
data: { data }, data: { data },
} = await apiBack.post("payment", productData); } = await apiBack.post("payment", productData);
redsysData.value = data; redsysData.value = await data;
document.querySelector("input[name='Ds_SignatureVersion']").value = redsysData.value.Ds_SignatureVersion;
document.querySelector("input[name='Ds_MerchantParameters']").value = redsysData.value.Ds_MerchantParameters;
document.querySelector("input[name='Ds_Signature']").value = redsysData.value.Ds_Signature;
redsysFormRef.value.click(); redsysFormRef.value.click();
}, },
default: () => { default: () => {

View File

@ -151,29 +151,19 @@ export default defineComponent({
<div class="checkout-container"> <div class="checkout-container">
<div class="checkout-steps"> <div class="checkout-steps">
<div <div v-for="({ active, description, name, value }, i) in stepsFormated" class="step-item-container" :key="i">
v-for="({ active, description, name, value }, i) in stepsFormated"
class="step-item-container"
:key="i"
>
<div class="step-item"> <div class="step-item">
<div class="circle-step-container"> <div class="circle-step-container">
<span class="border-step" :class="[i == 0 && 'transparent']" /> <span class="border-step" :class="[i == 0 && 'transparent']" />
<div <div class="circle-step" :class="[
class="circle-step" (active || (meta.valid && i == 1) || !checkoutBlock) &&
:class="[ 'active',
(active || (meta.valid && i == 1) || !checkoutBlock) && ]">
'active',
]"
>
<span class="step-value">{{ value }}</span> <span class="step-value">{{ value }}</span>
</div> </div>
<span <span class="border-step" :class="[i == stepList['data'].length - 1 && 'transparent']" />
class="border-step"
:class="[i == stepList['data'].length - 1 && 'transparent']"
/>
</div> </div>
<div class="step-content"> <div class="step-content">
@ -199,85 +189,37 @@ export default defineComponent({
<div class="checkout-fields"> <div class="checkout-fields">
<div class="field-control field-input"> <div class="field-control field-input">
<q-input <q-input placeholder="Nombre*" name="name" type="text" v-model="name" v-bind:="nameAttrs"
placeholder="Nombre*" :error="!!errors.name" :error-message="errors.name" outlined />
name="name"
type="text"
v-model="name"
v-bind:="nameAttrs"
:error="!!errors.name"
:error-message="errors.name"
outlined
/>
</div> </div>
<div class="field-control field-input"> <div class="field-control field-input">
<q-input <q-input placeholder="Apellidos*" name="surname" type="text" v-model="surname"
placeholder="Apellidos*" v-bind:="surnameAttrs" :error="!!errors.surname" :error-message="errors.surname" outlined />
name="surname"
type="text"
v-model="surname"
v-bind:="surnameAttrs"
:error="!!errors.surname"
:error-message="errors.surname"
outlined
/>
</div> </div>
<div class="field-control field-input"> <div class="field-control field-input">
<q-input <q-input placeholder="Dirección*" name="address" type="text" v-model="address"
placeholder="Dirección*" v-bind:="addressAttrs" :error="!!errors.address" :error-message="errors.address" outlined />
name="address"
type="text"
v-model="address"
v-bind:="addressAttrs"
:error="!!errors.address"
:error-message="errors.address"
outlined
/>
</div> </div>
<div class="field-control field-input"> <div class="field-control field-input">
<q-input <q-input placeholder="Código postal*" name="postalCode" type="text" mask="#####"
placeholder="Código postal*" v-model="postalCode" v-bind:="postalCodeAttrs" :error="!!errors.postalCode"
name="postalCode" :error-message="errors.postalCode" ref="postalCodeRef" readonly outlined @mouseenter="showTooltip"
type="text" @mouseleave="hideTooltip">
mask="#####"
v-model="postalCode"
v-bind:="postalCodeAttrs"
:error="!!errors.postalCode"
:error-message="errors.postalCode"
ref="postalCodeRef"
readonly
outlined
@mouseenter="showTooltip"
@mouseleave="hideTooltip"
>
<template #after> <template #after>
<q-btn <q-btn to="/" :style="'--clr: #ffffff'" class="btn custom-btn-input paragraph-sm"
to="/" label="EDITAR" />
:style="'--clr: #ffffff'"
class="btn custom-btn-input paragraph-sm"
label="EDITAR"
/>
</template> </template>
</q-input> </q-input>
<div <div ref="postalCodeTooltip" :style="[floatingStyles, '--clr: #117564']"
ref="postalCodeTooltip" :class="['tooltip ', isHidden && 'hidden']" @mouseenter="showTooltip" @mouseleave="hideTooltip">
:style="[floatingStyles, '--clr: #117564']"
:class="['tooltip ', isHidden && 'hidden']"
@mouseenter="showTooltip"
@mouseleave="hideTooltip"
>
<p class="paragraph-sm"> <p class="paragraph-sm">
No se puede editar este campo No se puede editar este campo
<a <a href="https://www.google.com/maps" rel="noreferrer noopener" target="_blank"
href="https://www.google.com/maps" class="paragraph-sm link">
rel="noreferrer noopener"
target="_blank"
class="paragraph-sm link"
>
¿No conoce su código postal? ¿No conoce su código postal?
</a> </a>
</p> </p>
@ -285,49 +227,23 @@ export default defineComponent({
</div> </div>
<div class="field-control field-select"> <div class="field-control field-select">
<q-select <q-select name="province" v-model="province" v-bind:="provinceAttrs" :error="!!errors.province"
name="province" :error-message="errors.province" :options="provinceOptions" option-value="code"
v-model="province" option-label="name" label="País*" stack-label map-options emit-value outlined />
v-bind:="provinceAttrs"
:error="!!errors.province"
:error-message="errors.province"
:options="provinceOptions"
option-value="code"
option-label="name"
label="País*"
stack-label
map-options
emit-value
outlined
/>
</div> </div>
<div class="field-control field-select"> <div class="field-control field-select">
<q-input <q-input placeholder="Ciudad*" name="city" type="text" v-model="city" v-bind:="cityAttrs"
placeholder="Ciudad*" :error="!!errors.city" :error-message="errors.city" outlined />
name="city"
type="text"
v-model="city"
v-bind:="cityAttrs"
:error="!!errors.city"
:error-message="errors.city"
outlined
/>
</div> </div>
<div class="field-control field-input telephone"> <div class="field-control field-input telephone">
<vue-tel-input <vue-tel-input v-model="phone" v-bind="phoneAttrs" :styleClasses="[
v-model="phone" 'custom-input',
v-bind="phoneAttrs" !!errors.phone && 'error',
:styleClasses="[ ]" ref="phoneInputRef" :inputOptions="{
'custom-input', placeholder: 'Teléfono*',
!!errors.phone && 'error', }" />
]"
ref="phoneInputRef"
:inputOptions="{
placeholder: 'Teléfono*',
}"
/>
<p v-if="!!errors.phone" class="error"> <p v-if="!!errors.phone" class="error">
{{ errors.phone }} {{ errors.phone }}
</p> </p>
@ -342,57 +258,30 @@ export default defineComponent({
<div class="checkout-fields"> <div class="checkout-fields">
<div class="field-control field-input"> <div class="field-control field-input">
<q-input <q-input placeholder="Nombre y apellidos o nombre de empresa" name="senderName" type="text"
placeholder="Nombre y apellidos o nombre de empresa" v-model="senderName" v-bind:="senderNameAttrs" :error="!!errors.senderName"
name="senderName" :error-message="errors.senderName" outlined />
type="text"
v-model="senderName"
v-bind:="senderNameAttrs"
:error="!!errors.senderName"
:error-message="errors.senderName"
outlined
/>
</div> </div>
<div class="field-control field-input"> <div class="field-control field-input">
<q-input <q-input placeholder="CIF / NIF" name="senderCifNif" type="text" v-model="senderCifNif"
placeholder="CIF / NIF" v-bind:="senderCifNifAttrs" :error="!!errors.senderCifNif" :error-message="errors.senderCifNif"
name="senderCifNif" outlined />
type="text"
v-model="senderCifNif"
v-bind:="senderCifNifAttrs"
:error="!!errors.senderCifNif"
:error-message="errors.senderCifNif"
outlined
/>
</div> </div>
<div class="field-control field-input"> <div class="field-control field-input">
<q-input <q-input placeholder="Email" name="senderEmail" type="email" v-model="senderEmail"
placeholder="Email" v-bind:="senderEmailAttrs" :error="!!errors.senderEmail" :error-message="errors.senderEmail"
name="senderEmail" outlined />
type="email"
v-model="senderEmail"
v-bind:="senderEmailAttrs"
:error="!!errors.senderEmail"
:error-message="errors.senderEmail"
outlined
/>
</div> </div>
<div class="field-control field-input telephone"> <div class="field-control field-input telephone">
<vue-tel-input <vue-tel-input v-model="senderPhone" v-bind="senderPhoneAttrs" :styleClasses="[
v-model="senderPhone" 'custom-input',
v-bind="senderPhoneAttrs" !!errors.senderPhone && 'error',
:styleClasses="[ ]" ref="phoneSenderInputRef" :inputOptions="{
'custom-input', placeholder: 'Teléfono*',
!!errors.senderPhone && 'error', }" />
]"
ref="phoneSenderInputRef"
:inputOptions="{
placeholder: 'Teléfono*',
}"
/>
<p v-if="!!errors.senderPhone" class="error"> <p v-if="!!errors.senderPhone" class="error">
{{ errors.senderPhone }} {{ errors.senderPhone }}
</p> </p>
@ -401,43 +290,19 @@ export default defineComponent({
<div class="field-control field-input"> <div class="field-control field-input">
<q-input <q-input
placeholder="Notas sobre tu pedido (Opcional), por ejemplo, notas especiales para la entrega" placeholder="Notas sobre tu pedido (Opcional), por ejemplo, notas especiales para la entrega"
name="senderNotes" name="senderNotes" type="textarea" v-model="senderNotes" v-bind:="senderNotesAttrs"
type="textarea" :error="!!errors.senderNotes" :error-message="errors.senderNotes" class="message" autogrow
v-model="senderNotes" outlined />
v-bind:="senderNotesAttrs"
:error="!!errors.senderNotes"
:error-message="errors.senderNotes"
class="message"
autogrow
outlined
/>
</div> </div>
</div> </div>
</div> </div>
</q-form> </q-form>
<form <form v-if="paymentMethod === 'redsys' && meta.valid" name="from"
v-if="paymentMethod === 'redsys' && meta.valid" action="https://sis-t.redsys.es:25443/sis/realizarPago" method="POST" class="hide">
name="from" <input type="text" name="Ds_SignatureVersion" :value="redsysData.Ds_SignatureVersion" />
action="https://sis-t.redsys.es:25443/sis/realizarPago" <input type="text" name="Ds_MerchantParameters" :value="redsysData.Ds_MerchantParameters" />
method="POST" <input type="text" name="Ds_Signature" :value="redsysData.Ds_Signature" />
class="hide"
>
<input
type="hidden"
name="Ds_SignatureVersion"
:value="redsysData.Ds_SignatureVersion"
/>
<input
type="hidden"
name="Ds_MerchantParameters"
:value="redsysData.Ds_MerchantParameters"
/>
<input
type="hidden"
name="Ds_Signature"
:value="redsysData.Ds_Signature"
/>
<input ref="redsysFormRef" type="submit" value="Go to pay" /> <input ref="redsysFormRef" type="submit" value="Go to pay" />
</form> </form>
</div> </div>
@ -462,11 +327,7 @@ export default defineComponent({
<div class="checkout-summary-body gray-bg"> <div class="checkout-summary-body gray-bg">
<ul class="checkout-summary-list"> <ul class="checkout-summary-list">
<li <li class="checkout-summary-item" v-for="({ name, price }, index) in cart" :key="index">
class="checkout-summary-item"
v-for="({ name, price }, index) in cart"
:key="index"
>
<p> <p>
{{ name }} {{ name }}
<span>{{ price }}</span> <span>{{ price }}</span>
@ -487,31 +348,18 @@ export default defineComponent({
<div class="checkout-payment-methods gray-bg"> <div class="checkout-payment-methods gray-bg">
<header class="checkout-aside-header"> <header class="checkout-aside-header">
<strong <strong class="checkout-aside-title" :style="!!errors.paymentMethod && 'color: red'">
class="checkout-aside-title"
:style="!!errors.paymentMethod && 'color: red'"
>
Método de pago Método de pago
</strong> </strong>
<p v-if="!!errors.paymentMethod"></p> <p v-if="!!errors.paymentMethod"></p>
</header> </header>
<div class="checkout-payment-body"> <div class="checkout-payment-body">
<q-radio <q-radio v-model="paymentMethod" v-bind="paymentMethodAttrs" val="paypal" color="primary">
v-model="paymentMethod"
v-bind="paymentMethodAttrs"
val="paypal"
color="primary"
>
<p>Paypal</p> <p>Paypal</p>
</q-radio> </q-radio>
<q-radio <q-radio v-model="paymentMethod" v-bind="paymentMethodAttrs" val="redsys" color="primary">
v-model="paymentMethod"
v-bind="paymentMethodAttrs"
val="redsys"
color="primary"
>
<p>Redsys</p> <p>Redsys</p>
</q-radio> </q-radio>
</div> </div>
@ -525,13 +373,7 @@ export default defineComponent({
</p> </p>
</q-checkbox> </q-checkbox>
<q-btn <q-btn flat class="btn" type="submit" form="checkout-form" :loading="isLoadingSubmit">
flat
class="btn"
type="submit"
form="checkout-form"
:loading="isLoadingSubmit"
>
PROCEDER AL PAGO PROCEDER AL PAGO
</q-btn> </q-btn>
</div> </div>
@ -585,13 +427,16 @@ export default defineComponent({
align-items: center; align-items: center;
border-radius: 50%; border-radius: 50%;
user-select: none; user-select: none;
.step-value { .step-value {
font-family: $font-questrial; font-family: $font-questrial;
color: $primary-dark; color: $primary-dark;
font-size: 1.25rem; font-size: 1.25rem;
} }
&.active { &.active {
background-color: $primary-dark; background-color: $primary-dark;
.step-value { .step-value {
color: $white; color: $white;
} }
@ -603,6 +448,7 @@ export default defineComponent({
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
font-family: $font-questrial; font-family: $font-questrial;
h4 { h4 {
font-size: 1rem; font-size: 1rem;
font-weight: 700; font-weight: 700;
@ -611,6 +457,7 @@ export default defineComponent({
margin-bottom: 4px; margin-bottom: 4px;
line-height: 1.3; line-height: 1.3;
} }
p { p {
font-size: 0.875rem; font-size: 0.875rem;
color: $text-default; color: $text-default;
@ -631,6 +478,7 @@ export default defineComponent({
width: 100%; width: 100%;
margin-bottom: 21px; margin-bottom: 21px;
border-radius: 5px; border-radius: 5px;
& h3 { & h3 {
color: $text-default; color: $text-default;
font-weight: 600; font-weight: 600;
@ -647,8 +495,10 @@ export default defineComponent({
& .checkout-form { & .checkout-form {
flex: 1 0 min(100%, 795px); flex: 1 0 min(100%, 795px);
} }
& .checkout-aside { & .checkout-aside {
flex: 1 0 min(100%, 329px); flex: 1 0 min(100%, 329px);
& .checkout-delivery-date, & .checkout-delivery-date,
& .checkout-summary, & .checkout-summary,
& .checkout-payment-methods { & .checkout-payment-methods {
@ -672,6 +522,7 @@ export default defineComponent({
visibility: hidden; visibility: hidden;
height: 0; height: 0;
overflow: hidden; overflow: hidden;
&.active { &.active {
height: min-content; height: min-content;
padding-block: 16px 18px; padding-block: 16px 18px;
@ -683,6 +534,7 @@ export default defineComponent({
& .checkout-summary { & .checkout-summary {
margin-bottom: 33px; margin-bottom: 33px;
& .checkout-aside-header, & .checkout-aside-header,
& .checkout-summary-body, & .checkout-summary-body,
& .checkout-summary-footer { & .checkout-summary-footer {
@ -691,6 +543,7 @@ export default defineComponent({
& .checkout-aside-header { & .checkout-aside-header {
padding-block: 16px 17px; padding-block: 16px 17px;
& .checkout-aside-title { & .checkout-aside-title {
font-family: $font-lora; font-family: $font-lora;
font-weight: 600; font-weight: 600;
@ -701,6 +554,7 @@ export default defineComponent({
& .checkout-summary-body { & .checkout-summary-body {
padding-bottom: 23px; padding-bottom: 23px;
& p { & p {
font-size: $font-12; font-size: $font-12;
line-height: 21px; line-height: 21px;
@ -713,12 +567,14 @@ export default defineComponent({
flex-direction: column; flex-direction: column;
gap: 4px; gap: 4px;
margin-bottom: 4px; margin-bottom: 4px;
& .checkout-summary-item p { & .checkout-summary-item p {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
} }
} }
} }
& .checkout-summary-footer { & .checkout-summary-footer {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
@ -737,19 +593,23 @@ export default defineComponent({
& .checkout-payment-methods { & .checkout-payment-methods {
padding: 9px 16px 20px 21px; padding: 9px 16px 20px 21px;
margin-bottom: 21px; margin-bottom: 21px;
& .checkout-aside-header { & .checkout-aside-header {
margin-bottom: 14px; margin-bottom: 14px;
} }
& .checkout-payment-body { & .checkout-payment-body {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 12px; gap: 12px;
& p { & p {
width: min(100%, 200px); width: min(100%, 200px);
display: inline-flex; display: inline-flex;
justify-content: space-between; justify-content: space-between;
gap: 31px; gap: 31px;
font-size: $font-12; font-size: $font-12;
& .card-flags { & .card-flags {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
@ -773,6 +633,7 @@ export default defineComponent({
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 23px; gap: 23px;
& .terms p { & .terms p {
margin-left: 10px; margin-left: 10px;
font-size: $font-12; font-size: $font-12;
@ -799,29 +660,36 @@ export default defineComponent({
width: min(100%, 499px); width: min(100%, 499px);
margin: 122px auto 0; margin: 122px auto 0;
text-align: center; text-align: center;
& .checkout-success-title { & .checkout-success-title {
margin-bottom: 26px; margin-bottom: 26px;
} }
& .checkout-success-body { & .checkout-success-body {
& .checkout-success-content { & .checkout-success-content {
background-color: $secondary-5; background-color: $secondary-5;
padding: 30px 46px 42px 38px; padding: 30px 46px 42px 38px;
border-radius: 5px 5px 0px 0px; border-radius: 5px 5px 0px 0px;
& .checkout-success-list { & .checkout-success-list {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 28px; gap: 28px;
& .checkout-success-item { & .checkout-success-item {
display: flex; display: flex;
flex: 1; flex: 1;
& .checkout-item-content { & .checkout-item-content {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
flex: 1; flex: 1;
min-height: 61px; min-height: 61px;
& .checkout-product-details { & .checkout-product-details {
display: flex; display: flex;
gap: 14px; gap: 14px;
& .checkout-product-img { & .checkout-product-img {
object-fit: cover; object-fit: cover;
width: 54px; width: 54px;
@ -875,8 +743,9 @@ export default defineComponent({
& .form-fields-container { & .form-fields-container {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
&.delivery {
} &.delivery {}
&.sender { &.sender {
margin-top: 12px; margin-top: 12px;
} }
@ -886,6 +755,7 @@ export default defineComponent({
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 12px 9px; gap: 12px 9px;
@media only screen and (max-width: $med-lg) { @media only screen and (max-width: $med-lg) {
gap: 15px; gap: 15px;
} }
@ -896,6 +766,7 @@ export default defineComponent({
&.telephone { &.telephone {
flex: 0 0 calc(50% - 5px); flex: 0 0 calc(50% - 5px);
@media only screen and (max-width: $med-lg) { @media only screen and (max-width: $med-lg) {
flex: 1 0 min(100%, 390px); flex: 1 0 min(100%, 390px);
} }
@ -905,10 +776,12 @@ export default defineComponent({
label { label {
padding-bottom: 10px; padding-bottom: 10px;
} }
& .q-field__control { & .q-field__control {
background-color: #fff; background-color: #fff;
height: 40px; height: 40px;
border: 1px solid $primary-light; border: 1px solid $primary-light;
& input { & input {
padding: 0px 0px 0px 20px; padding: 0px 0px 0px 20px;
font-family: $font-questrial; font-family: $font-questrial;
@ -923,20 +796,24 @@ export default defineComponent({
&.text-negative { &.text-negative {
border-color: $negative; border-color: $negative;
} }
&::after, &::after,
&::before { &::before {
display: none; display: none;
} }
} }
.q-field__marginal { .q-field__marginal {
height: 40px; height: 40px;
padding-right: 30px; padding-right: 30px;
} }
} }
.q-field--error .q-field__bottom { .q-field--error .q-field__bottom {
padding-top: 4px; padding-top: 4px;
font-size: 0.675rem; font-size: 0.675rem;
} }
&.field-select { &.field-select {
.q-field__control { .q-field__control {
min-height: initial; min-height: initial;
@ -944,23 +821,28 @@ export default defineComponent({
height: 40px; height: 40px;
padding: 0px 30px; padding: 0px 30px;
border: 1px solid $primary-light; border: 1px solid $primary-light;
.q-field__native span { .q-field__native span {
display: none; display: none;
} }
} }
.q-field__append { .q-field__append {
height: 40px; height: 40px;
} }
.q-field__label { .q-field__label {
font-family: $font-questrial; font-family: $font-questrial;
color: $text-default !important; color: $text-default !important;
} }
.q-field__control-container { .q-field__control-container {
padding-top: 0; padding-top: 0;
height: 36px; height: 36px;
} }
} }
} }
@media only screen and (max-width: $med-lg) { @media only screen and (max-width: $med-lg) {
&.sender { &.sender {
margin-top: 45px; margin-top: 45px;
@ -972,6 +854,7 @@ export default defineComponent({
padding: 10.5px 1px; padding: 10.5px 1px;
border-radius: 4px; border-radius: 4px;
transition: 200ms ease-in-out; transition: 200ms ease-in-out;
&:hover { &:hover {
border-color: $black; border-color: $black;
} }
@ -1007,4 +890,4 @@ export default defineComponent({
font-family: "Roboto" !important; font-family: "Roboto" !important;
} }
} }
</style> </style>

View File

@ -2,6 +2,7 @@
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import { defineComponent, onBeforeMount, ref } from "vue"; import { defineComponent, onBeforeMount, ref } from "vue";
import { apiBack } from "src/boot/axios";
import VerticalCarouselImgs from "src/components/quasar-components/carousel/VerticalCarouselImgs.vue"; import VerticalCarouselImgs from "src/components/quasar-components/carousel/VerticalCarouselImgs.vue";
import Swiper from "src/components/swiper/Swiper.vue"; import Swiper from "src/components/swiper/Swiper.vue";
import Card from "src/components/ui/Card.vue"; import Card from "src/components/ui/Card.vue";
@ -18,6 +19,7 @@ export default defineComponent({
Card, Card,
}, },
setup() { setup() {
const banners = ref()
const mobileStore = useMobileStore(); const mobileStore = useMobileStore();
const { isCarouselVisible, isOpenNav, screenWidth } = const { isCarouselVisible, isOpenNav, screenWidth } =
storeToRefs(mobileStore); storeToRefs(mobileStore);
@ -26,35 +28,24 @@ export default defineComponent({
const { getProducts } = cartStore; const { getProducts } = cartStore;
const { products, homeSection } = storeToRefs(cartStore); const { products, homeSection } = storeToRefs(cartStore);
async function getBanners() {
const { data: { data } } = await apiBack("/banners/")
return data
}
onBeforeMount(async () => { onBeforeMount(async () => {
await getProducts(); await getProducts();
}); banners.value = await getBanners();
const slidesContent = ref([]);
onBeforeMount(async () => {
const images = await new Promise((resolve) => {
setTimeout(() => {
resolve([
"assets/1.jpg",
"assets/2.jpg",
"assets/3.jpg",
"assets/4.jpg",
"assets/5.jpg",
]);
}, 1000);
});
slidesContent.value = images;
}); });
return { return {
isCarouselVisible, isCarouselVisible,
slidesContent,
screenWidth, screenWidth,
homeSection, homeSection,
isOpenNav, isOpenNav,
products, products,
banners
}; };
}, },
}); });
@ -63,7 +54,7 @@ export default defineComponent({
<template> <template>
<q-page> <q-page>
<q-no-ssr> <q-no-ssr>
<VerticalCarouselImgs :imgsArr="slidesContent" class="home-carousel" /> <VerticalCarouselImgs v-if="banners" :banners="banners" class="home-carousel" />
</q-no-ssr> </q-no-ssr>
<section class="products-section" ref="homeSection"> <section class="products-section" ref="homeSection">
@ -77,25 +68,15 @@ export default defineComponent({
<div class="products-body"> <div class="products-body">
<Container cardContainer> <Container cardContainer>
<template <template v-for="({ id, name, price, image, isNew }, i) in products?.data" :key="id">
v-for="({ id, name, price, image, isNew }, i) in products?.data" <Card v-if="i < 8" :id="id" :price="price" :title="name" :imgSrc="image" :isNew="isNew"
:key="id" imgClass="list-products" size="md-card" />
>
<Card
v-if="i < 8"
:id="id"
:price="price"
:title="name"
:imgSrc="image"
:isNew="isNew"
imgClass="list-products"
size="md-card"
/>
</template> </template>
</Container> </Container>
<RouterLink class="btn rounded outlined" to="/categoria/all"> <RouterLink class="btn rounded outlined" to="/categoria/all">
Ver todos los diseños <IconArrowCircleFilledRight /> Ver todos los diseños
<IconArrowCircleFilledRight />
</RouterLink> </RouterLink>
</div> </div>
</section> </section>
@ -112,20 +93,10 @@ export default defineComponent({
<div class="products-selection-body"> <div class="products-selection-body">
<q-no-ssr> <q-no-ssr>
<Swiper> <Swiper>
<template <template v-for="({ id, isNew, price, name, image }, i) in products.data" :key="id">
v-for="({ id, isNew, price, name, image }, i) in products.data"
:key="id"
>
<swiper-slide class="swiper-slide" v-if="i < 10"> <swiper-slide class="swiper-slide" v-if="i < 10">
<Card <Card :id="id" :price="price" :title="name" :imgSrc="image" :isNew="isNew" imgClass="carousel"
:id="id" size="lg-card" />
:price="price"
:title="name"
:imgSrc="image"
:isNew="isNew"
imgClass="carousel"
size="lg-card"
/>
</swiper-slide> </swiper-slide>
</template> </template>
</Swiper> </Swiper>
@ -134,7 +105,8 @@ export default defineComponent({
<footer class="products-selection-footer"> <footer class="products-selection-footer">
<RouterLink class="btn rounded outlined pd-icon" to="/"> <RouterLink class="btn rounded outlined pd-icon" to="/">
Ver todas las plantas <IconArrowCircleFilledRight /> Ver todas las plantas
<IconArrowCircleFilledRight />
</RouterLink> </RouterLink>
</footer> </footer>
</section> </section>
@ -177,11 +149,9 @@ export default defineComponent({
scroll-margin: 30px; scroll-margin: 30px;
& .products-section-header { & .products-section-header {
& .products-header-title { & .products-header-title {}
}
& .products-header-paragraph { & .products-header-paragraph {}
}
} }
& .products-body { & .products-body {
@ -193,8 +163,7 @@ export default defineComponent({
} }
@media only screen and (max-width: $med-xmd) { @media only screen and (max-width: $med-xmd) {
& .products-body { & .products-body {}
}
} }
} }