Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
211 changes: 94 additions & 117 deletions frontend/demo/component/accordion/accordion-summary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,17 @@ import '@vaadin/combo-box';
import '@vaadin/email-field';
import '@vaadin/form-layout';
import '@vaadin/horizontal-layout';
import '@vaadin/icon';
import '@vaadin/icons';
import '@vaadin/text-field';
import '@vaadin/vertical-layout';
import { html, LitElement } from 'lit';
import { html, LitElement, nothing } from 'lit';
import { customElement, state } from 'lit/decorators.js';
import type { AccordionOpenedChangedEvent } from '@vaadin/accordion';
import type { FormLayoutResponsiveStep } from '@vaadin/form-layout';
import { Binder, field } from '@vaadin/hilla-lit-form';
import { getCountries } from 'Frontend/demo/domain/DataService';
import CardModel from 'Frontend/generated/com/vaadin/demo/domain/CardModel';
import type Country from 'Frontend/generated/com/vaadin/demo/domain/Country';
import PersonModel from 'Frontend/generated/com/vaadin/demo/domain/PersonModel';
import { applyTheme } from 'Frontend/demo/theme';
import type Country from 'Frontend/generated/com/vaadin/demo/domain/Country';

const responsiveSteps: FormLayoutResponsiveStep[] = [
{ minWidth: 0, columns: 1 },
Expand All @@ -28,12 +27,17 @@ export class Example extends LitElement {
@state()
private countries: Country[] = [];

private readonly personBinder = new Binder(this, PersonModel);
@state()
private openedPanelIndex: number | null = 0;

private readonly cardBinder = new Binder(this, CardModel);
@state()
private customerComplete: boolean = false;

@state()
private openedPanelIndex: number | null = 0;
private billingComplete: boolean = false;

@state()
private paymentComplete: boolean = false;

protected override async firstUpdated() {
this.countries = await getCountries();
Expand All @@ -56,136 +60,109 @@ export class Example extends LitElement {
>
<vaadin-accordion-panel>
<vaadin-accordion-heading slot="summary">
<vaadin-horizontal-layout style="width: 100%; align-items: center">
<vaadin-horizontal-layout theme="spacing">
Customer details
<vaadin-vertical-layout
.hidden="${this.openedPanelIndex === 0}"
style="font-size: 0.875rem; margin-left: auto"
>
<span>
${this.personBinder.value.firstName} ${this.personBinder.value.lastName}
</span>
<span>${this.personBinder.value.email}</span>
<span>${this.personBinder.value.address?.phone}</span>
</vaadin-vertical-layout>
${this.customerComplete
? html`
<vaadin-icon
icon="vaadin:check"
style="color: var(--lumo-success-text-color); --vaadin-icon-size: 1rem"
></vaadin-icon>
`
: nothing}
</vaadin-horizontal-layout>
</vaadin-accordion-heading>
<!-- end::snippet[] -->

<vaadin-form-layout .responsiveSteps="${responsiveSteps}">
<vaadin-text-field
label="First name"
${field(this.personBinder.model.firstName)}
></vaadin-text-field>
<vaadin-text-field
label="Last name"
${field(this.personBinder.model.lastName)}
></vaadin-text-field>
<vaadin-email-field
label="Email address"
${field(this.personBinder.model.email)}
colspan="2"
></vaadin-email-field>
<vaadin-text-field
label="Phone number"
${field(this.personBinder.model.address.phone)}
colspan="2"
></vaadin-text-field>
</vaadin-form-layout>
<vaadin-button
theme="primary"
@click="${() => {
this.openedPanelIndex = 1;
}}"
>
Continue
</vaadin-button>
<vaadin-vertical-layout theme="spacing">
<vaadin-form-layout .responsiveSteps="${responsiveSteps}">
<vaadin-text-field label="First name"></vaadin-text-field>
<vaadin-text-field label="Last name"></vaadin-text-field>
<vaadin-email-field label="Email address" colspan="2"></vaadin-email-field>
<vaadin-text-field label="Phone number" colspan="2"></vaadin-text-field>
</vaadin-form-layout>
<vaadin-button
theme="primary"
@click="${() => {
this.openedPanelIndex = 1;
this.customerComplete = true;
}}"
>
Continue
</vaadin-button>
</vaadin-vertical-layout>
</vaadin-accordion-panel>

<vaadin-accordion-panel>
<vaadin-accordion-heading slot="summary">
<vaadin-horizontal-layout style="width: 100%; align-items: center">
<vaadin-horizontal-layout theme="spacing">
Billing address
<vaadin-vertical-layout
.hidden="${this.openedPanelIndex === 1}"
style="font-size: 0.875rem; margin-left: auto"
>
<span>${this.personBinder.value.address?.street}</span>
<span>
${this.personBinder.value.address?.zip} ${this.personBinder.value.address?.city}
</span>

<span> ${this.personBinder.value.address?.country} </span>
</vaadin-vertical-layout>
${this.billingComplete
? html`
<vaadin-icon
icon="vaadin:check"
style="color: var(--lumo-success-text-color); --vaadin-icon-size: 1rem"
></vaadin-icon>
`
: nothing}
</vaadin-horizontal-layout>
</vaadin-accordion-heading>

<vaadin-form-layout .responsiveSteps="${responsiveSteps}">
<vaadin-text-field
label="Address"
${field(this.personBinder.model.address.street)}
colspan="2"
></vaadin-text-field>
<vaadin-text-field
label="ZIP code"
${field(this.personBinder.model.address.zip)}
></vaadin-text-field>
<vaadin-text-field
label="City"
${field(this.personBinder.model.address.city)}
></vaadin-text-field>
<vaadin-combo-box
label="Country"
${field(this.personBinder.model.address.country)}
item-label-path="name"
item-value-path="name"
.items="${this.countries}"
></vaadin-combo-box>
</vaadin-form-layout>
<vaadin-button
theme="primary"
@click="${() => {
this.openedPanelIndex = 2;
}}"
>
Continue
</vaadin-button>
<vaadin-vertical-layout theme="spacing">
<vaadin-form-layout .responsiveSteps="${responsiveSteps}">
<vaadin-text-field label="Address" colspan="2"></vaadin-text-field>
<vaadin-text-field label="ZIP code"></vaadin-text-field>
<vaadin-text-field label="City"></vaadin-text-field>
<vaadin-combo-box
label="Country"
item-label-path="name"
item-value-path="name"
.items="${this.countries}"
></vaadin-combo-box>
</vaadin-form-layout>
<vaadin-button
theme="primary"
@click="${() => {
this.openedPanelIndex = 2;
this.billingComplete = true;
}}"
>
Continue
</vaadin-button>
</vaadin-vertical-layout>
</vaadin-accordion-panel>

<vaadin-accordion-panel>
<vaadin-accordion-heading slot="summary">
<vaadin-horizontal-layout style="width: 100%; align-items: center">
<vaadin-horizontal-layout theme="spacing">
Payment
<vaadin-vertical-layout
.hidden="${this.openedPanelIndex === 2}"
style="font-size: 0.875rem; margin-left: auto"
>
<span>${this.cardBinder.value.accountNumber}</span>
<span>${this.cardBinder.value.expiryDate}</span>
</vaadin-vertical-layout>
${this.paymentComplete
? html`
<vaadin-icon
icon="vaadin:check"
style="color: var(--lumo-success-text-color); --vaadin-icon-size: 1rem"
></vaadin-icon>
`
: nothing}
</vaadin-horizontal-layout>
</vaadin-accordion-heading>

<vaadin-form-layout .responsiveSteps="${responsiveSteps}">
<vaadin-text-field
label="Card number"
${field(this.cardBinder.model.accountNumber)}
colspan="2"
></vaadin-text-field>
<vaadin-text-field
label="Expiry date"
${field(this.cardBinder.model.expiryDate)}
></vaadin-text-field>
<vaadin-text-field label="CVV" ${field(this.cardBinder.model.cvv)}></vaadin-text-field>
</vaadin-form-layout>
<vaadin-button
theme="primary"
@click="${() => {
this.openedPanelIndex = -1;
}}"
>
Finish
</vaadin-button>
<vaadin-vertical-layout theme="spacing">
<vaadin-form-layout .responsiveSteps="${responsiveSteps}">
<vaadin-text-field label="Card number" colspan="2"></vaadin-text-field>
<vaadin-text-field label="Expiry date"></vaadin-text-field>
<vaadin-text-field label="CVV"></vaadin-text-field>
</vaadin-form-layout>
<vaadin-button
theme="primary"
@click="${() => {
this.openedPanelIndex = -1;
this.paymentComplete = true;
}}"
>
Finish
</vaadin-button>
</vaadin-vertical-layout>
<!-- tag::snippet[] -->
</vaadin-accordion-panel>
</vaadin-accordion>
Expand Down
Loading