2024-02-13 06:24:01 +00:00
|
|
|
<template>
|
|
|
|
<DocSectionText v-bind="$attrs">
|
|
|
|
<p>Each StepperPanel content can easily be customized with the default slot instead of using the built-in modes. Additionally, header, content, and separator sections of the StepperPanel are customizable via templating.</p>
|
|
|
|
</DocSectionText>
|
|
|
|
<div class="card flex flex-column justify-content-center">
|
|
|
|
<Stepper
|
|
|
|
v-model:activeStep="active"
|
|
|
|
:pt="{
|
|
|
|
stepperpanel: {
|
|
|
|
separator: ({ context }) => ({
|
|
|
|
style: { background: context.highlighted ? '#b9deb9' : '#ece9fc' }
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}"
|
|
|
|
>
|
|
|
|
<StepperPanel>
|
|
|
|
<template #header="slotProps">
|
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar :icon="slotProps.active ? 'pi pi-user' : 'pi pi-check'" :style="{ backgroundColor: slotProps.active ? '#ece9fc' : '#b9deb9' }" size="large" shape="circle" />
|
|
|
|
<span class="text-lg ml-2">Account</span>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<div class="flex flex-column justify-content-center gap-2 mx-auto" style="max-width: 20rem">
|
|
|
|
<h3 class="text-center mt-3">Personal Details</h3>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<IconField>
|
|
|
|
<InputIcon>
|
|
|
|
<i class="pi pi-user" />
|
|
|
|
</InputIcon>
|
|
|
|
<InputText id="input" v-model="name" type="text" placeholder="Name" />
|
|
|
|
</IconField>
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<IconField>
|
|
|
|
<InputIcon>
|
|
|
|
<i class="pi pi-envelope" />
|
|
|
|
</InputIcon>
|
|
|
|
<InputText id="email" v-model="email" type="email" placeholder="Email" />
|
|
|
|
</IconField>
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<InputText v-model="password" type="text" placeholder="Password" />
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<InputText v-model="cpassword" type="text" placeholder="Confirm Password" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</StepperPanel>
|
|
|
|
<StepperPanel>
|
|
|
|
<template #header="slotProps">
|
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar
|
|
|
|
:icon="slotProps.highlighted || completed ? 'pi pi-check' : 'pi pi-shopping-cart'"
|
|
|
|
:style="{ backgroundColor: slotProps.active ? '#ece9fc' : slotProps.highlighted || completed ? '#b9deb9' : null }"
|
|
|
|
size="large"
|
|
|
|
shape="circle"
|
|
|
|
/>
|
|
|
|
<span class="text-lg ml-2">Cart</span>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<DataView :value="products">
|
|
|
|
<template #header>
|
|
|
|
<h3 class="text-center">Cart Details</h3>
|
|
|
|
</template>
|
|
|
|
<template #list="slotProps">
|
|
|
|
<div class="grid grid-nogutter">
|
|
|
|
<div v-for="(item, index) in slotProps.items" :key="index" class="col-12">
|
|
|
|
<div class="flex flex-column sm:flex-row sm:align-items-center p-4 gap-3" :class="{ 'border-top-1 surface-border': index !== 0 }">
|
|
|
|
<div class="md:w-10rem relative">
|
|
|
|
<img class="block xl:block mx-auto border-round w-full" :src="`https://primefaces.org/cdn/primevue/images/product/${item.image}`" :alt="item.name" />
|
|
|
|
</div>
|
|
|
|
<div class="flex flex-column md:flex-row justify-content-between md:align-items-center flex-1 gap-4">
|
|
|
|
<div class="flex flex-row md:flex-column justify-content-between align-items-start gap-2">
|
|
|
|
<div>
|
|
|
|
<span class="font-medium text-secondary text-sm">{{ item.category }}</span>
|
|
|
|
<div class="text-lg font-medium text-900 mt-2">{{ item.name }}</div>
|
|
|
|
</div>
|
|
|
|
<div class="surface-100 p-1" style="border-radius: 30px">
|
|
|
|
<div class="surface-0 flex align-items-center gap-2 justify-content-center py-1 px-2" style="border-radius: 30px; box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.04), 0px 1px 2px 0px rgba(0, 0, 0, 0.06)">
|
|
|
|
<span class="text-900 font-medium text-sm">{{ item.rating }}</span>
|
|
|
|
<i class="pi pi-star-fill text-yellow-500"></i>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="flex flex-column md:align-items-end gap-5">
|
|
|
|
<span class="text-xl font-semibold text-900">${{ item.price }}</span>
|
|
|
|
<div class="flex flex-row-reverse md:flex-row gap-2">
|
|
|
|
<InputNumber v-model="quantity[index]" showButtons buttonLayout="horizontal" inputClass="w-3rem text-center" :min="0">
|
|
|
|
<template #incrementbuttonicon>
|
|
|
|
<span class="pi pi-plus" />
|
|
|
|
</template>
|
|
|
|
<template #decrementbuttonicon>
|
|
|
|
<span class="pi pi-minus" />
|
|
|
|
</template>
|
|
|
|
</InputNumber>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</DataView>
|
|
|
|
</StepperPanel>
|
|
|
|
<StepperPanel>
|
|
|
|
<template #header="slotProps">
|
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar
|
|
|
|
:icon="slotProps.highlighted || completed ? 'pi pi-check' : 'pi pi-money-bill'"
|
|
|
|
:style="{ backgroundColor: slotProps.active ? '#ece9fc' : slotProps.highlighted || completed ? '#b9deb9' : null }"
|
|
|
|
size="large"
|
|
|
|
shape="circle"
|
|
|
|
/>
|
|
|
|
<span class="text-lg ml-2">Billing</span>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<h3 class="text-center mt-3">Payment</h3>
|
|
|
|
<div class="grid formgrid p-fluid">
|
|
|
|
<div class="col-12 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">Card Number</label>
|
|
|
|
<InputMask v-model="cc" mask="9999-9999-9999-9999" placeholder="9999-9999-9999-9999" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 lg:col-6 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">Expiry Date</label>
|
|
|
|
<InputMask v-model="exp" mask="99/99" placeholder="99/99" slotChar="MM/YY" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 lg:col-6 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">CVC</label>
|
|
|
|
<InputMask v-model="cvc" mask="999" placeholder="999" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 field mb-0">
|
|
|
|
<label for="holderName" class="text-900 font-medium mb-3 ml-1">Cardholder Name</label>
|
|
|
|
<InputText id="holderName" type="text" class="w-full mb-3" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</StepperPanel>
|
|
|
|
<template #end>
|
|
|
|
<div v-if="!completed" class="flex justify-content-end gap-2">
|
|
|
|
<Button v-if="active !== 0" label="Back" severity="secondary" @click="active -= 1" />
|
|
|
|
<Button v-if="active !== 2" label="Continue" @click="active += 1" />
|
|
|
|
<Button
|
|
|
|
v-if="active === 2"
|
|
|
|
label="Complete"
|
|
|
|
@click="
|
|
|
|
() => {
|
|
|
|
active = null;
|
|
|
|
completed = true;
|
|
|
|
}
|
|
|
|
"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div v-else class="flex flex-column justify-content-center mx-auto">
|
|
|
|
<Message severity="success">The order was submitted successfully.</Message>
|
|
|
|
<Button
|
|
|
|
label="New Order"
|
|
|
|
class="w-10rem mx-auto"
|
|
|
|
@click="
|
|
|
|
() => {
|
|
|
|
active = 0;
|
|
|
|
completed = false;
|
|
|
|
}
|
|
|
|
"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</Stepper>
|
|
|
|
</div>
|
2024-02-13 07:08:22 +00:00
|
|
|
<DocSectionCode :code="code" />
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import { ProductService } from '@/service/ProductService';
|
|
|
|
|
|
|
|
export default {
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
active: 0,
|
|
|
|
completed: false,
|
|
|
|
products: null,
|
|
|
|
name: null,
|
|
|
|
email: null,
|
|
|
|
password: null,
|
|
|
|
cpassword: null,
|
|
|
|
quantity: [1, 2],
|
|
|
|
cc: null,
|
|
|
|
cvc: null,
|
|
|
|
exp: null,
|
|
|
|
code: {
|
|
|
|
basic: `
|
|
|
|
<Stepper
|
|
|
|
v-model:activeStep="active"
|
|
|
|
:pt="{
|
|
|
|
stepperpanel: {
|
|
|
|
separator: ({ context }) => ({
|
|
|
|
style: { background: context.highlighted ? '#b9deb9' : '#ece9fc' }
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}"
|
|
|
|
>
|
|
|
|
<StepperPanel>
|
|
|
|
<template #header="slotProps">
|
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar :icon="slotProps.active ? 'pi pi-user' : 'pi pi-check'" :style="{ backgroundColor: slotProps.active ? '#ece9fc' : '#b9deb9' }" size="large" shape="circle" />
|
|
|
|
<span class="text-lg ml-2">Account</span>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<div class="flex flex-column justify-content-center gap-2 mx-auto" style="max-width: 20rem">
|
|
|
|
<h3 class="text-center mt-3">Personal Details</h3>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<IconField>
|
|
|
|
<InputIcon>
|
|
|
|
<i class="pi pi-user" />
|
|
|
|
</InputIcon>
|
|
|
|
<InputText id="input" v-model="name" type="text" placeholder="Name" />
|
|
|
|
</IconField>
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<IconField>
|
|
|
|
<InputIcon>
|
|
|
|
<i class="pi pi-envelope" />
|
|
|
|
</InputIcon>
|
|
|
|
<InputText id="email" v-model="email" type="email" placeholder="Email" />
|
|
|
|
</IconField>
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<InputText v-model="password" type="text" placeholder="Password" />
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<InputText v-model="cpassword" type="text" placeholder="Confirm Password" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</StepperPanel>
|
|
|
|
<StepperPanel>
|
|
|
|
<template #header="slotProps">
|
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar
|
|
|
|
:icon="slotProps.highlighted || completed ? 'pi pi-check' : 'pi pi-shopping-cart'"
|
|
|
|
:style="{ backgroundColor: slotProps.active ? '#ece9fc' : slotProps.highlighted || completed ? '#b9deb9' : null }"
|
|
|
|
size="large"
|
|
|
|
shape="circle"
|
|
|
|
/>
|
|
|
|
<span class="text-lg ml-2">Cart</span>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<DataView :value="products">
|
|
|
|
<template #header>
|
|
|
|
<h3 class="text-center">Cart Details</h3>
|
|
|
|
</template>
|
|
|
|
<template #list="slotProps">
|
|
|
|
<div class="grid grid-nogutter">
|
|
|
|
<div v-for="(item, index) in slotProps.items" :key="index" class="col-12">
|
|
|
|
<div class="flex flex-column sm:flex-row sm:align-items-center p-4 gap-3" :class="{ 'border-top-1 surface-border': index !== 0 }">
|
|
|
|
<div class="md:w-10rem relative">
|
|
|
|
<img class="block xl:block mx-auto border-round w-full" :src="\`https://primefaces.org/cdn/primevue/images/product/\${item.image}\`" :alt="item.name" />
|
|
|
|
</div>
|
|
|
|
<div class="flex flex-column md:flex-row justify-content-between md:align-items-center flex-1 gap-4">
|
|
|
|
<div class="flex flex-row md:flex-column justify-content-between align-items-start gap-2">
|
|
|
|
<div>
|
|
|
|
<span class="font-medium text-secondary text-sm">{{ item.category }}</span>
|
|
|
|
<div class="text-lg font-medium text-900 mt-2">{{ item.name }}</div>
|
|
|
|
</div>
|
|
|
|
<div class="surface-100 p-1" style="border-radius: 30px">
|
|
|
|
<div class="surface-0 flex align-items-center gap-2 justify-content-center py-1 px-2" style="border-radius: 30px; box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.04), 0px 1px 2px 0px rgba(0, 0, 0, 0.06)">
|
|
|
|
<span class="text-900 font-medium text-sm">{{ item.rating }}</span>
|
|
|
|
<i class="pi pi-star-fill text-yellow-500"></i>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="flex flex-column md:align-items-end gap-5">
|
|
|
|
<span class="text-xl font-semibold text-900">\${{ item.price }}</span>
|
|
|
|
<div class="flex flex-row-reverse md:flex-row gap-2">
|
|
|
|
<InputNumber v-model="quantity[index]" showButtons buttonLayout="horizontal" inputClass="w-3rem text-center" :min="0">
|
|
|
|
<template #incrementbuttonicon>
|
|
|
|
<span class="pi pi-plus" />
|
|
|
|
</template>
|
|
|
|
<template #decrementbuttonicon>
|
|
|
|
<span class="pi pi-minus" />
|
|
|
|
</template>
|
|
|
|
</InputNumber>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</DataView>
|
|
|
|
</StepperPanel>
|
|
|
|
<StepperPanel>
|
|
|
|
<template #header="slotProps">
|
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar
|
|
|
|
:icon="slotProps.highlighted || completed ? 'pi pi-check' : 'pi pi-money-bill'"
|
|
|
|
:style="{ backgroundColor: slotProps.active ? '#ece9fc' : slotProps.highlighted || completed ? '#b9deb9' : null }"
|
|
|
|
size="large"
|
|
|
|
shape="circle"
|
|
|
|
/>
|
|
|
|
<span class="text-lg ml-2">Billing</span>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<h3 class="text-center mt-3">Payment</h3>
|
|
|
|
<div class="grid formgrid p-fluid">
|
|
|
|
<div class="col-12 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">Card Number</label>
|
|
|
|
<InputMask v-model="cc" mask="9999-9999-9999-9999" placeholder="9999-9999-9999-9999" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 lg:col-6 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">Expiry Date</label>
|
|
|
|
<InputMask v-model="exp" mask="99/99" placeholder="99/99" slotChar="MM/YY" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 lg:col-6 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">CVC</label>
|
|
|
|
<InputMask v-model="cvc" mask="999" placeholder="999" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 field mb-0">
|
|
|
|
<label for="holderName" class="text-900 font-medium mb-3 ml-1">Cardholder Name</label>
|
|
|
|
<InputText id="holderName" type="text" class="w-full mb-3" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</StepperPanel>
|
|
|
|
<template #end>
|
|
|
|
<div v-if="!completed" class="flex justify-content-end gap-2">
|
|
|
|
<Button v-if="active !== 0" label="Back" severity="secondary" @click="active -= 1" />
|
|
|
|
<Button v-if="active !== 2" label="Continue" @click="active += 1" />
|
|
|
|
<Button
|
|
|
|
v-if="active === 2"
|
|
|
|
label="Complete"
|
|
|
|
@click="
|
|
|
|
() => {
|
|
|
|
active = null;
|
|
|
|
completed = true;
|
|
|
|
}
|
|
|
|
"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div v-else class="flex flex-column justify-content-center mx-auto">
|
|
|
|
<Message severity="success">The order was submitted successfully.</Message>
|
|
|
|
<Button
|
|
|
|
label="New Order"
|
|
|
|
class="w-10rem mx-auto"
|
|
|
|
@click="
|
|
|
|
() => {
|
|
|
|
active = 0;
|
|
|
|
completed = false;
|
|
|
|
}
|
|
|
|
"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</Stepper>
|
|
|
|
`,
|
|
|
|
options: `
|
|
|
|
<template>
|
|
|
|
<div class="card flex flex-column justify-content-center">
|
|
|
|
<Stepper
|
|
|
|
v-model:activeStep="active"
|
|
|
|
:pt="{
|
|
|
|
stepperpanel: {
|
|
|
|
separator: ({ context }) => ({
|
|
|
|
style: { background: context.highlighted ? '#b9deb9' : '#ece9fc' }
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}"
|
|
|
|
>
|
|
|
|
<StepperPanel>
|
2024-02-13 06:24:01 +00:00
|
|
|
<template #header="slotProps">
|
2024-02-13 07:08:22 +00:00
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar :icon="slotProps.active ? 'pi pi-user' : 'pi pi-check'" :style="{ backgroundColor: slotProps.active ? '#ece9fc' : '#b9deb9' }" size="large" shape="circle" />
|
|
|
|
<span class="text-lg ml-2">Account</span>
|
2024-02-13 06:24:01 +00:00
|
|
|
</div>
|
|
|
|
</template>
|
2024-02-13 07:08:22 +00:00
|
|
|
<div class="flex flex-column justify-content-center gap-2 mx-auto" style="max-width: 20rem">
|
|
|
|
<h3 class="text-center mt-3">Personal Details</h3>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<IconField>
|
|
|
|
<InputIcon>
|
|
|
|
<i class="pi pi-user" />
|
|
|
|
</InputIcon>
|
|
|
|
<InputText id="input" v-model="name" type="text" placeholder="Name" />
|
|
|
|
</IconField>
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<IconField>
|
|
|
|
<InputIcon>
|
|
|
|
<i class="pi pi-envelope" />
|
|
|
|
</InputIcon>
|
|
|
|
<InputText id="email" v-model="email" type="email" placeholder="Email" />
|
|
|
|
</IconField>
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<InputText v-model="password" type="text" placeholder="Password" />
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<InputText v-model="cpassword" type="text" placeholder="Confirm Password" />
|
2024-02-13 06:24:01 +00:00
|
|
|
</div>
|
|
|
|
</div>
|
2024-02-13 07:08:22 +00:00
|
|
|
</StepperPanel>
|
|
|
|
<StepperPanel>
|
2024-02-13 06:24:01 +00:00
|
|
|
<template #header="slotProps">
|
2024-02-13 07:08:22 +00:00
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar
|
|
|
|
:icon="slotProps.highlighted || completed ? 'pi pi-check' : 'pi pi-shopping-cart'"
|
|
|
|
:style="{ backgroundColor: slotProps.active ? '#ece9fc' : slotProps.highlighted || completed ? '#b9deb9' : null }"
|
|
|
|
size="large"
|
|
|
|
shape="circle"
|
|
|
|
/>
|
|
|
|
<span class="text-lg ml-2">Cart</span>
|
2024-02-13 06:24:01 +00:00
|
|
|
</div>
|
|
|
|
</template>
|
2024-02-13 07:08:22 +00:00
|
|
|
<DataView :value="products">
|
|
|
|
<template #header>
|
|
|
|
<h3 class="text-center">Cart Details</h3>
|
|
|
|
</template>
|
|
|
|
<template #list="slotProps">
|
|
|
|
<div class="grid grid-nogutter">
|
|
|
|
<div v-for="(item, index) in slotProps.items" :key="index" class="col-12">
|
|
|
|
<div class="flex flex-column sm:flex-row sm:align-items-center p-4 gap-3" :class="{ 'border-top-1 surface-border': index !== 0 }">
|
|
|
|
<div class="md:w-10rem relative">
|
|
|
|
<img class="block xl:block mx-auto border-round w-full" :src="\`https://primefaces.org/cdn/primevue/images/product/\${item.image}\`" :alt="item.name" />
|
|
|
|
</div>
|
|
|
|
<div class="flex flex-column md:flex-row justify-content-between md:align-items-center flex-1 gap-4">
|
|
|
|
<div class="flex flex-row md:flex-column justify-content-between align-items-start gap-2">
|
|
|
|
<div>
|
|
|
|
<span class="font-medium text-secondary text-sm">{{ item.category }}</span>
|
|
|
|
<div class="text-lg font-medium text-900 mt-2">{{ item.name }}</div>
|
|
|
|
</div>
|
|
|
|
<div class="surface-100 p-1" style="border-radius: 30px">
|
|
|
|
<div class="surface-0 flex align-items-center gap-2 justify-content-center py-1 px-2" style="border-radius: 30px; box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.04), 0px 1px 2px 0px rgba(0, 0, 0, 0.06)">
|
|
|
|
<span class="text-900 font-medium text-sm">{{ item.rating }}</span>
|
|
|
|
<i class="pi pi-star-fill text-yellow-500"></i>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="flex flex-column md:align-items-end gap-5">
|
|
|
|
<span class="text-xl font-semibold text-900">\${{ item.price }}</span>
|
|
|
|
<div class="flex flex-row-reverse md:flex-row gap-2">
|
|
|
|
<InputNumber v-model="quantity[index]" showButtons buttonLayout="horizontal" inputClass="w-3rem text-center" :min="0">
|
|
|
|
<template #incrementbuttonicon>
|
|
|
|
<span class="pi pi-plus" />
|
|
|
|
</template>
|
|
|
|
<template #decrementbuttonicon>
|
|
|
|
<span class="pi pi-minus" />
|
|
|
|
</template>
|
|
|
|
</InputNumber>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2024-02-13 06:24:01 +00:00
|
|
|
</div>
|
2024-02-13 07:08:22 +00:00
|
|
|
</template>
|
|
|
|
</DataView>
|
|
|
|
</StepperPanel>
|
|
|
|
<StepperPanel>
|
|
|
|
<template #header="slotProps">
|
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar
|
|
|
|
:icon="slotProps.highlighted || completed ? 'pi pi-check' : 'pi pi-money-bill'"
|
|
|
|
:style="{ backgroundColor: slotProps.active ? '#ece9fc' : slotProps.highlighted || completed ? '#b9deb9' : null }"
|
|
|
|
size="large"
|
|
|
|
shape="circle"
|
|
|
|
/>
|
|
|
|
<span class="text-lg ml-2">Billing</span>
|
2024-02-13 06:24:01 +00:00
|
|
|
</div>
|
|
|
|
</template>
|
2024-02-13 07:08:22 +00:00
|
|
|
<h3 class="text-center mt-3">Payment</h3>
|
|
|
|
<div class="grid formgrid p-fluid">
|
|
|
|
<div class="col-12 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">Card Number</label>
|
|
|
|
<InputMask v-model="cc" mask="9999-9999-9999-9999" placeholder="9999-9999-9999-9999" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 lg:col-6 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">Expiry Date</label>
|
|
|
|
<InputMask v-model="exp" mask="99/99" placeholder="99/99" slotChar="MM/YY" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 lg:col-6 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">CVC</label>
|
|
|
|
<InputMask v-model="cvc" mask="999" placeholder="999" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 field mb-0">
|
|
|
|
<label for="holderName" class="text-900 font-medium mb-3 ml-1">Cardholder Name</label>
|
|
|
|
<InputText id="holderName" type="text" class="w-full mb-3" />
|
|
|
|
</div>
|
|
|
|
</div>
|
2024-02-13 06:24:01 +00:00
|
|
|
</StepperPanel>
|
2024-02-13 07:08:22 +00:00
|
|
|
<template #end>
|
|
|
|
<div v-if="!completed" class="flex justify-content-end gap-2">
|
|
|
|
<Button v-if="active !== 0" label="Back" severity="secondary" @click="active -= 1" />
|
|
|
|
<Button v-if="active !== 2" label="Continue" @click="active += 1" />
|
2024-02-13 06:24:01 +00:00
|
|
|
<Button
|
2024-02-13 07:08:22 +00:00
|
|
|
v-if="active === 2"
|
|
|
|
label="Complete"
|
2024-02-13 06:24:01 +00:00
|
|
|
@click="
|
2024-02-13 07:08:22 +00:00
|
|
|
() => {
|
|
|
|
active = null;
|
|
|
|
completed = true;
|
|
|
|
}
|
|
|
|
"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div v-else class="flex flex-column justify-content-center mx-auto">
|
|
|
|
<Message severity="success">The order was submitted successfully.</Message>
|
|
|
|
<Button
|
|
|
|
label="New Order"
|
|
|
|
class="w-10rem mx-auto"
|
|
|
|
@click="
|
|
|
|
() => {
|
|
|
|
active = 0;
|
|
|
|
completed = false;
|
|
|
|
}
|
2024-02-13 06:24:01 +00:00
|
|
|
"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</Stepper>
|
2024-02-13 07:08:22 +00:00
|
|
|
</div>
|
2024-02-13 06:24:01 +00:00
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
import { ProductService } from '@/service/ProductService';
|
|
|
|
|
|
|
|
export default {
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
active: 0,
|
|
|
|
completed: false,
|
|
|
|
products: null,
|
|
|
|
name: null,
|
|
|
|
email: null,
|
|
|
|
password: null,
|
|
|
|
cpassword: null,
|
|
|
|
quantity: [1, 2],
|
|
|
|
cc: null,
|
|
|
|
cvc: null,
|
2024-02-13 07:08:22 +00:00
|
|
|
exp: null
|
|
|
|
}
|
|
|
|
},
|
|
|
|
mounted() {
|
|
|
|
ProductService.getProductsSmall().then((data) => (this.products = data.slice(0, 2)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
<\/script>
|
|
|
|
`,
|
|
|
|
composition: `
|
|
|
|
<template>
|
|
|
|
<div class="card flex flex-column justify-content-center">
|
|
|
|
<Stepper
|
|
|
|
v-model:activeStep="active"
|
|
|
|
:pt="{
|
|
|
|
stepperpanel: {
|
|
|
|
separator: ({ context }) => ({
|
|
|
|
style: { background: context.highlighted ? '#b9deb9' : '#ece9fc' }
|
|
|
|
})
|
2024-02-13 06:24:01 +00:00
|
|
|
}
|
2024-02-13 07:08:22 +00:00
|
|
|
}"
|
|
|
|
>
|
|
|
|
<StepperPanel>
|
|
|
|
<template #header="slotProps">
|
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar :icon="slotProps.active ? 'pi pi-user' : 'pi pi-check'" :style="{ backgroundColor: slotProps.active ? '#ece9fc' : '#b9deb9' }" size="large" shape="circle" />
|
|
|
|
<span class="text-lg ml-2">Account</span>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<div class="flex flex-column justify-content-center gap-2 mx-auto" style="max-width: 20rem">
|
|
|
|
<h3 class="text-center mt-3">Personal Details</h3>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<IconField>
|
|
|
|
<InputIcon>
|
|
|
|
<i class="pi pi-user" />
|
|
|
|
</InputIcon>
|
|
|
|
<InputText id="input" v-model="name" type="text" placeholder="Name" />
|
|
|
|
</IconField>
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<IconField>
|
|
|
|
<InputIcon>
|
|
|
|
<i class="pi pi-envelope" />
|
|
|
|
</InputIcon>
|
|
|
|
<InputText id="email" v-model="email" type="email" placeholder="Email" />
|
|
|
|
</IconField>
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<InputText v-model="password" type="text" placeholder="Password" />
|
|
|
|
</div>
|
|
|
|
<div class="field p-fluid">
|
|
|
|
<InputText v-model="cpassword" type="text" placeholder="Confirm Password" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</StepperPanel>
|
|
|
|
<StepperPanel>
|
|
|
|
<template #header="slotProps">
|
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar
|
|
|
|
:icon="slotProps.highlighted || completed ? 'pi pi-check' : 'pi pi-shopping-cart'"
|
|
|
|
:style="{ backgroundColor: slotProps.active ? '#ece9fc' : slotProps.highlighted || completed ? '#b9deb9' : null }"
|
|
|
|
size="large"
|
|
|
|
shape="circle"
|
|
|
|
/>
|
|
|
|
<span class="text-lg ml-2">Cart</span>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<DataView :value="products">
|
|
|
|
<template #header>
|
|
|
|
<h3 class="text-center">Cart Details</h3>
|
|
|
|
</template>
|
|
|
|
<template #list="slotProps">
|
|
|
|
<div class="grid grid-nogutter">
|
|
|
|
<div v-for="(item, index) in slotProps.items" :key="index" class="col-12">
|
|
|
|
<div class="flex flex-column sm:flex-row sm:align-items-center p-4 gap-3" :class="{ 'border-top-1 surface-border': index !== 0 }">
|
|
|
|
<div class="md:w-10rem relative">
|
|
|
|
<img class="block xl:block mx-auto border-round w-full" :src="\`https://primefaces.org/cdn/primevue/images/product/\${item.image}\`" :alt="item.name" />
|
|
|
|
</div>
|
|
|
|
<div class="flex flex-column md:flex-row justify-content-between md:align-items-center flex-1 gap-4">
|
|
|
|
<div class="flex flex-row md:flex-column justify-content-between align-items-start gap-2">
|
|
|
|
<div>
|
|
|
|
<span class="font-medium text-secondary text-sm">{{ item.category }}</span>
|
|
|
|
<div class="text-lg font-medium text-900 mt-2">{{ item.name }}</div>
|
|
|
|
</div>
|
|
|
|
<div class="surface-100 p-1" style="border-radius: 30px">
|
|
|
|
<div class="surface-0 flex align-items-center gap-2 justify-content-center py-1 px-2" style="border-radius: 30px; box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.04), 0px 1px 2px 0px rgba(0, 0, 0, 0.06)">
|
|
|
|
<span class="text-900 font-medium text-sm">{{ item.rating }}</span>
|
|
|
|
<i class="pi pi-star-fill text-yellow-500"></i>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="flex flex-column md:align-items-end gap-5">
|
|
|
|
<span class="text-xl font-semibold text-900">\${{ item.price }}</span>
|
|
|
|
<div class="flex flex-row-reverse md:flex-row gap-2">
|
|
|
|
<InputNumber v-model="quantity[index]" showButtons buttonLayout="horizontal" inputClass="w-3rem text-center" :min="0">
|
|
|
|
<template #incrementbuttonicon>
|
|
|
|
<span class="pi pi-plus" />
|
|
|
|
</template>
|
|
|
|
<template #decrementbuttonicon>
|
|
|
|
<span class="pi pi-minus" />
|
|
|
|
</template>
|
|
|
|
</InputNumber>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</DataView>
|
|
|
|
</StepperPanel>
|
|
|
|
<StepperPanel>
|
|
|
|
<template #header="slotProps">
|
|
|
|
<div :class="slotProps.class" @click="() => slotProps.clickCallback(event)">
|
|
|
|
<Avatar
|
|
|
|
:icon="slotProps.highlighted || completed ? 'pi pi-check' : 'pi pi-money-bill'"
|
|
|
|
:style="{ backgroundColor: slotProps.active ? '#ece9fc' : slotProps.highlighted || completed ? '#b9deb9' : null }"
|
|
|
|
size="large"
|
|
|
|
shape="circle"
|
|
|
|
/>
|
|
|
|
<span class="text-lg ml-2">Billing</span>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
<h3 class="text-center mt-3">Payment</h3>
|
|
|
|
<div class="grid formgrid p-fluid">
|
|
|
|
<div class="col-12 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">Card Number</label>
|
|
|
|
<InputMask v-model="cc" mask="9999-9999-9999-9999" placeholder="9999-9999-9999-9999" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 lg:col-6 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">Expiry Date</label>
|
|
|
|
<InputMask v-model="exp" mask="99/99" placeholder="99/99" slotChar="MM/YY" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 lg:col-6 field mb-4">
|
|
|
|
<label class="text-900 font-medium mb-3 ml-1">CVC</label>
|
|
|
|
<InputMask v-model="cvc" mask="999" placeholder="999" />
|
|
|
|
</div>
|
|
|
|
<div class="col-12 field mb-0">
|
|
|
|
<label for="holderName" class="text-900 font-medium mb-3 ml-1">Cardholder Name</label>
|
|
|
|
<InputText id="holderName" type="text" class="w-full mb-3" />
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</StepperPanel>
|
|
|
|
<template #end>
|
|
|
|
<div v-if="!completed" class="flex justify-content-end gap-2">
|
|
|
|
<Button v-if="active !== 0" label="Back" severity="secondary" @click="active -= 1" />
|
|
|
|
<Button v-if="active !== 2" label="Continue" @click="active += 1" />
|
|
|
|
<Button
|
|
|
|
v-if="active === 2"
|
|
|
|
label="Complete"
|
|
|
|
@click="
|
|
|
|
() => {
|
|
|
|
active = null;
|
|
|
|
completed = true;
|
|
|
|
}
|
|
|
|
"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div v-else class="flex flex-column justify-content-center mx-auto">
|
|
|
|
<Message severity="success">The order was submitted successfully.</Message>
|
|
|
|
<Button
|
|
|
|
label="New Order"
|
|
|
|
class="w-10rem mx-auto"
|
|
|
|
@click="
|
|
|
|
() => {
|
|
|
|
active = 0;
|
|
|
|
completed = false;
|
|
|
|
}
|
|
|
|
"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
</Stepper>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
|
|
import { ref, onMounted } from 'vue';
|
|
|
|
import { ProductService } from '@/service/ProductService';
|
|
|
|
|
|
|
|
onMounted(() => {
|
|
|
|
ProductService.getProductsSmall().then((data) => (products.value = data.slice(0, 9)));
|
|
|
|
});
|
|
|
|
|
|
|
|
const active = ref(0);
|
|
|
|
const completed = ref(false);
|
|
|
|
const products = ref();
|
|
|
|
const name = ref();
|
|
|
|
const email = ref();
|
|
|
|
const password = ref();
|
|
|
|
const cpassword = ref();
|
|
|
|
const quantity = ref([1, 2]);
|
|
|
|
const cc = ref();
|
|
|
|
const cvc = ref();
|
|
|
|
const exp = ref();
|
|
|
|
|
|
|
|
<\/script>
|
|
|
|
`
|
|
|
|
}
|
2024-02-13 06:24:01 +00:00
|
|
|
};
|
|
|
|
},
|
|
|
|
mounted() {
|
|
|
|
ProductService.getProductsSmall().then((data) => (this.products = data.slice(0, 2)));
|
|
|
|
}
|
|
|
|
};
|
|
|
|
</script>
|