Skip to content

Commit

Permalink
refactor: optimize dialog elements
Browse files Browse the repository at this point in the history
  • Loading branch information
motss committed Jan 25, 2022
1 parent 105da7c commit 911aadc
Show file tree
Hide file tree
Showing 8 changed files with 166 additions and 243 deletions.
14 changes: 7 additions & 7 deletions src/__tests__/date-picker-dialog/app-date-picker-dialog.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import { DateTimeFormat } from '../../constants';
import type { AppDatePicker } from '../../date-picker/app-date-picker';
import { appDatePickerName } from '../../date-picker/constants';
import type { AppDatePickerDialog } from '../../date-picker-dialog/app-date-picker-dialog';
import type { AppDatePickerDialogDialog } from '../../date-picker-dialog/app-date-picker-dialog-dialog';
import { appDatePickerDialogDialogName, appDatePickerDialogName } from '../../date-picker-dialog/constants';
import type { AppDatePickerDialogBase } from '../../date-picker-dialog/app-date-picker-dialog-base';
import { appDatePickerDialogBaseName, appDatePickerDialogName } from '../../date-picker-dialog/constants';
import type { DialogClosedEventDetail, DialogClosingEventDetailAction } from '../../date-picker-dialog/typings';
import { toDateString } from '../../helpers/to-date-string';
import { toResolvedDate } from '../../helpers/to-resolved-date';
Expand All @@ -23,7 +23,7 @@ describe(appDatePickerDialogName, () => {
const elementSelectors = {
calendarDay: (label: string) => `td.calendar-day[aria-label="${label}"]`,
datePicker: appDatePickerName,
datePickerDialogDialog: appDatePickerDialogDialogName,
datePickerDialogBase: appDatePickerDialogBaseName,
dialogActionCancel: `mwc-button[dialogaction="cancel"]`,
dialogActionReset: `mwc-button[data-dialog-action="reset"]`,
dialogActionSet: `mwc-button[dialogaction="set"]`,
Expand Down Expand Up @@ -54,7 +54,7 @@ describe(appDatePickerDialogName, () => {
});

const datePickerDialogDialog =
el.query<AppDatePickerDialogDialog>(elementSelectors.datePickerDialogDialog);
el.query<AppDatePickerDialogBase>(elementSelectors.datePickerDialogBase);
const datePicker = el.query<AppDatePicker>(elementSelectors.datePicker);

await datePicker?.updateComplete;
Expand Down Expand Up @@ -87,7 +87,7 @@ describe(appDatePickerDialogName, () => {
>(el, 'opened');

const datePickerDialogDialog =
el.query<AppDatePickerDialogDialog>(elementSelectors.datePickerDialogDialog);
el.query<AppDatePickerDialogBase>(elementSelectors.datePickerDialogBase);
let datePicker = datePickerDialogDialog?.query<AppDatePicker>(elementSelectors.datePicker);

expect(datePickerDialogDialog).exist;
Expand Down Expand Up @@ -157,7 +157,7 @@ describe(appDatePickerDialogName, () => {
>(el, 'opened');

let datePickerDialogDialog =
el.query<AppDatePickerDialogDialog>(elementSelectors.datePickerDialogDialog);
el.query<AppDatePickerDialogBase>(elementSelectors.datePickerDialogBase);
let datePicker =
datePickerDialogDialog?.query<AppDatePicker>(elementSelectors.datePicker);
let monthCalendar =
Expand All @@ -171,7 +171,7 @@ describe(appDatePickerDialogName, () => {
await el.updateComplete;

datePickerDialogDialog =
el.query<AppDatePickerDialogDialog>(elementSelectors.datePickerDialogDialog);
el.query<AppDatePickerDialogBase>(elementSelectors.datePickerDialogBase);
datePicker =
datePickerDialogDialog?.querySelector<AppDatePicker>(elementSelectors.datePicker);
monthCalendar =
Expand Down

This file was deleted.

13 changes: 0 additions & 13 deletions src/date-picker-dialog/app-date-picker-dialog-dialog.ts

This file was deleted.

1 change: 0 additions & 1 deletion src/date-picker-dialog/constants.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
export const appDatePickerDialogBaseName = 'app-date-picker-dialog-base' as const;
export const appDatePickerDialogDialogName = 'app-date-picker-dialog-dialog' as const;
export const appDatePickerDialogName = 'app-date-picker-dialog' as const;
156 changes: 4 additions & 152 deletions src/date-picker-dialog/date-picker-dialog-base.ts
Original file line number Diff line number Diff line change
@@ -1,159 +1,11 @@
import '@material/mwc-button';
import '@material/mwc-dialog';
import './app-date-picker-dialog-dialog.js';
import { Dialog } from '@material/mwc-dialog';

import type { TemplateResult } from 'lit';
import { html, nothing } from 'lit';
import { property, state } from 'lit/decorators.js';

import { toDateString } from '../helpers/to-date-string.js';
import { toResolvedDate } from '../helpers/to-resolved-date.js';
import { DatePickerMinMaxMixin } from '../mixins/date-picker-min-max-mixin.js';
import { DatePickerMixin } from '../mixins/date-picker-mixin.js';
import { RootElement } from '../root-element/root-element.js';
import { baseStyling } from '../stylings.js';
import type { CustomEventDetail } from '../typings.js';
import { ElementMixin } from '../mixins/element-mixin.js';
import { datePickerDialogBaseStyling } from './stylings.js';
import type { DatePickerDialogProperties, DialogClosedEventDetail, DialogClosingEventDetail } from './typings.js';

export class DatePickerDialogBase extends DatePickerMixin(DatePickerMinMaxMixin(RootElement)) implements DatePickerDialogProperties {
public get valueAsDate(): Date {
return this.#valueAsDate;
}

public get valueAsNumber(): number {
return +this.#valueAsDate;
}

@property({ type: String }) public confirmLabel = 'set';
@property({ type: String }) public dismissLabel = 'cancel';
@property({ type: String }) public resetLabel = 'reset';
@property({ type: Boolean }) public open = false;
@state() private _rendered = false;

#isResetAction = false;
#selectedDate: Date;
#valueAsDate: Date;

export class DatePickerDialogBase extends ElementMixin(Dialog) {
public static override styles = [
baseStyling,
...Dialog.styles,
datePickerDialogBaseStyling,
];

public constructor() {
super();

this.#selectedDate = this.#valueAsDate = toResolvedDate();
}

override willUpdate(changedProperties: Map<string | number | symbol, unknown>): void {
super.willUpdate(changedProperties);

if (!this._rendered && this.open) {
this._rendered = true;
}
}

protected override render(): TemplateResult {
return html`
<app-date-picker-dialog-dialog
?open=${this.open}
@closed=${this.#onClosed}
@closing=${this.#onClosing}
@date-updated=${this.$onDatePickerDateUpdated}
@first-updated=${this.$onDatePickerFirstUpdated}
@opened=${this.#onOpened}
@opening=${this.#onOpening}
>
${this._rendered ? html`
${this.$renderSlot()}
<div class=secondary-actions slot=secondaryAction>
<mwc-button
@click=${this.#onResetClick}
data-dialog-action=reset
>${this.resetLabel}</mwc-button>
<mwc-button
dialogAction=cancel
>${this.dismissLabel}</mwc-button>
</div>
<mwc-button
dialogAction=set
slot=primaryAction
>${this.confirmLabel}</mwc-button>
` : nothing}
</app-date-picker-dialog-dialog>
`;
}

public hide(): void {
this.open = false;
}

public show(): void {
this.open = true;
}

protected $onDatePickerDateUpdated({
detail: {
valueAsDate,
},
}: CustomEvent<CustomEventDetail['date-updated']['detail']>) {
this.#selectedDate = new Date(valueAsDate);

/**
* Reset `value` when it is a reset action or `value` is nullish
*/
if (this.#isResetAction || !this.value) {
this.#isResetAction = false;
this.#valueAsDate = new Date(valueAsDate);

this.value = toDateString(valueAsDate);
}
}

protected $onDatePickerFirstUpdated({
detail: {
valueAsDate,
},
}: CustomEvent<CustomEventDetail['first-updated']['detail']>) {
this.#selectedDate = this.#valueAsDate = valueAsDate;
}

protected $renderSlot(): TemplateResult {
return html`<slot></slot>`;
}

#onClosed = (ev: CustomEvent<DialogClosedEventDetail>) => {
this.hide();
this.fire({ detail: ev.detail, type: 'closed' });
};

#onClosing = ({
detail,
}: CustomEvent<DialogClosingEventDetail>): void => {
if (detail.action === 'set') {
const selectedDate = this.#selectedDate;

this.#valueAsDate = new Date(selectedDate);

this.value = toDateString(selectedDate);
}

this.fire({ detail, type: 'closing' });
};

#onOpened = ({ detail }: CustomEvent): void => {
this.fire({ detail, type: 'opened' });
};

#onOpening = ({ detail }: CustomEvent): void => {
this.fire({ detail, type: 'opening' });
};

#onResetClick() {
this.#isResetAction = true;
this.value = undefined;
}
}
11 changes: 0 additions & 11 deletions src/date-picker-dialog/date-picker-dialog-dialog.ts

This file was deleted.

Loading

0 comments on commit 911aadc

Please sign in to comment.