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