diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/core/property-editors/uis/date-picker/property-editor-ui-date-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/core/property-editors/uis/date-picker/property-editor-ui-date-picker.element.ts index 5a5fda058f..5a92837787 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/core/property-editors/uis/date-picker/property-editor-ui-date-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/core/property-editors/uis/date-picker/property-editor-ui-date-picker.element.ts @@ -45,6 +45,15 @@ export class UmbPropertyEditorUIDatePickerElement extends UmbLitElement implemen @state() private _inputType: InputType = 'datetime-local'; + @state() + private _min?: string; + + @state() + private _max?: string; + + @state() + private _step?: number; + private _offsetTime?: boolean; @property({ type: Array, attribute: false }) @@ -66,19 +75,31 @@ export class UmbPropertyEditorUIDatePickerElement extends UmbLitElement implemen this._inputType = 'time'; } - // TODO: Warren - Need to deal with offSetTime prevalue/config - // Currently the date picker in uui-iinput does not change based on this config + //TODO: this._offsetTime = config.find((x) => x.alias === 'offsetTime')?.value; + const min = config.find((x) => x.alias === 'min'); + if (min) this._min = min.value; + + const max = config.find((x) => x.alias === 'max'); + if (max) this._max = max.value; + + const step = config.find((x) => x.alias === 'step'); + if (step) this._step = step.value; + this.requestUpdate('_inputType', oldVal); } render() { - return html` `; + .datetime=${this._valueString} + .min=${this._min} + .max=${this._max} + .step=${this._step} + .offsetTime=${this._offsetTime} + label="Pick a date or time">`; } static styles = [UUITextStyles]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/core/property-editors/uis/date-picker/property-editor-ui-date-picker.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/core/property-editors/uis/date-picker/property-editor-ui-date-picker.stories.ts index 4d7638d61c..8176580289 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/core/property-editors/uis/date-picker/property-editor-ui-date-picker.stories.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/core/property-editors/uis/date-picker/property-editor-ui-date-picker.stories.ts @@ -38,6 +38,24 @@ WithFormat.args = { ], }; +export const Timeframe = Template.bind({}); +Timeframe.args = { + config: [ + { + alias: 'format', + value: 'dd/MM/yyyy HH:mm:ss', + }, + { + alias: 'min', + value: '2021-01-20 00:00', + }, + { + alias: 'max', + value: '2021-01-30 00:00', + }, + ], +}; + export const TimeOnly = Template.bind({}); TimeOnly.args = { config: [ diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/date-input/date-input.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/date-input/date-input.element.ts new file mode 100644 index 0000000000..0cac49b3e3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/date-input/date-input.element.ts @@ -0,0 +1,84 @@ +import { css, html } from 'lit'; +import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; +import { customElement, property } from 'lit/decorators.js'; +import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; +import { ifDefined } from 'lit/directives/if-defined.js'; +import { UUIInputEvent } from '@umbraco-ui/uui'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; + +@customElement('umb-date-input') +export class UmbDateInputElement extends FormControlMixin(UmbLitElement) { + static styles = [ + UUITextStyles, + css` + :host { + display: flex; + } + `, + ]; + + protected getFormElement() { + return undefined; + } + + @property({ type: String }) + type = 'date'; + + @property({ type: String }) + datetime = ''; + + @property({ type: String }) + min?: string; + + @property({ type: String }) + max?: string; + + @property({ type: Number }) + step?: number; + + @property({ type: Boolean }) + offsetTime = false; //TODO + + constructor() { + super(); + } + + connectedCallback(): void { + super.connectedCallback(); + this.value = this.datetime; + } + + #onDatetimeChange(e: UUIInputEvent) { + e.stopPropagation(); + + const pickedTime = e.target.value as string; + this.datetime = pickedTime; + + // Set property editor value to UTC + const date = new Date(pickedTime); + const isoDate = date.toISOString(); + this.value = `${isoDate.substring(0, 10)} ${isoDate.substring(11, 19)}`; + + this.dispatchEvent(new CustomEvent('change')); + } + + render() { + return html``; + } +} + +export default UmbDateInputElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-date-input': UmbDateInputElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/date-input/date-input.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/date-input/date-input.stories.ts new file mode 100644 index 0000000000..bfd1fa1abe --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/date-input/date-input.stories.ts @@ -0,0 +1,23 @@ +import { Meta, StoryObj } from '@storybook/web-components'; +import './date-input.element'; +import type { UmbDateInputElement } from './date-input.element'; + +const meta: Meta = { + title: 'Components/Inputs/Date', + component: 'umb-date-input', +}; + +export default meta; +type Story = StoryObj; + +export const Overview: Story = { + args: {}, +}; + +export const WithOpacity: Story = { + args: {}, +}; + +export const WithSwatches: Story = { + args: {}, +}; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-date-picker/input-date-picker.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/date-input/date-input.test.ts similarity index 52% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-date-picker/input-date-picker.test.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/shared/components/date-input/date-input.test.ts index 60a3629b78..53bbdda49e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-date-picker/input-date-picker.test.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/date-input/date-input.test.ts @@ -1,15 +1,15 @@ import { expect, fixture, html } from '@open-wc/testing'; -import { UmbInputDatePickerElement } from './input-date-picker.element'; +import { UmbDateInputElement } from './date-input.element'; import { defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; -describe('UmbInputDatePickerElement', () => { - let element: UmbInputDatePickerElement; +describe('UmbDateInputElement', () => { + let element: UmbDateInputElement; beforeEach(async () => { - element = await fixture(html` `); + element = await fixture(html` `); }); it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbInputDatePickerElement); + expect(element).to.be.instanceOf(UmbDateInputElement); }); it('passes the a11y audit', async () => { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-date-picker/input-date-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-date-picker/input-date-picker.element.ts deleted file mode 100644 index 6fe7f4b181..0000000000 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-date-picker/input-date-picker.element.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { css, html, nothing } from 'lit'; -import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; -import { customElement, property, state } from 'lit/decorators.js'; -import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; -import { UUIInputEvent, UUISelectEvent } from '@umbraco-ui/uui'; -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; - -@customElement('umb-input-date-picker') -export class UmbInputDatePickerElement extends FormControlMixin(UmbLitElement) { - static styles = [ - UUITextStyles, - css` - :host { - display: flex; - } - `, - ]; - - protected getFormElement() { - return undefined; - } - - @property({ type: String }) - type = 'date'; - - @property({ type: String }) - datetime = ''; - - @property({ type: Boolean }) - enableTimezones = false; - - @state() - private _currentTimezone?: string; - - constructor() { - super(); - } - - options: Array