diff --git a/api/js/etemplate/Et2Date/Et2DateReadonly.ts b/api/js/etemplate/Et2Date/Et2DateReadonly.ts
new file mode 100644
index 0000000000..9b2732bd2f
--- /dev/null
+++ b/api/js/etemplate/Et2Date/Et2DateReadonly.ts
@@ -0,0 +1,93 @@
+/**
+ * EGroupware eTemplate2 - Readonly date WebComponent
+ *
+ * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
+ * @package api
+ * @link https://www.egroupware.org
+ * @author Nathan Gray
+ */
+
+
+import {html, LitElement} from "@lion/core";
+import {formatDate, parseDate} from "./Et2Date";
+import {et2_IDetachedDOM} from "../et2_core_interfaces";
+import {Et2Widget} from "../Et2Widget/Et2Widget";
+import {dateStyles} from "./DateStyles";
+
+/**
+ * This is a stripped-down read-only widget used in nextmatch
+ */
+export class Et2DateReadonly extends Et2Widget(LitElement) implements et2_IDetachedDOM
+{
+ protected value : any;
+ protected parser : Function;
+ protected formatter : Function;
+
+ static get styles()
+ {
+ return [
+ ...super.styles,
+ dateStyles
+ ];
+ }
+
+ static get properties()
+ {
+ return {
+ ...super.properties,
+ value: String,
+ }
+ }
+
+ constructor()
+ {
+ super();
+ this.parser = parseDate;
+ this.formatter = formatDate;
+ }
+
+ set_value(value)
+ {
+ this.value = value;
+ }
+
+ render()
+ {
+ let parsed : Date | Boolean = this.value ? this.parser(this.value) : false
+
+ return html`
+
+ `;
+ }
+
+ getDetachedAttributes(attrs)
+ {
+ attrs.push("id", "value", "class");
+ }
+
+ getDetachedNodes() : HTMLElement[]
+ {
+ return [this];
+ }
+
+ setDetachedAttributes(_nodes : HTMLElement[], _values : object, _data? : any) : void
+ {
+ // Do nothing, since we can't actually stop being a DOM node...
+ }
+
+ loadFromXML()
+ {
+ // nope
+ }
+
+ loadingFinished()
+ {
+ // already done, I'm a wc with no children
+ }
+}
+
+// @ts-ignore TypeScript is not recognizing that this widget is a LitElement
+customElements.define("et2-date_ro", Et2DateReadonly);
\ No newline at end of file
diff --git a/api/js/etemplate/Et2Date/Et2DateTimeReadonly.ts b/api/js/etemplate/Et2Date/Et2DateTimeReadonly.ts
index f1d0a46507..230b613ffc 100644
--- a/api/js/etemplate/Et2Date/Et2DateTimeReadonly.ts
+++ b/api/js/etemplate/Et2Date/Et2DateTimeReadonly.ts
@@ -1,72 +1,25 @@
-import {css, html, LitElement} from "@lion/core";
+/**
+ * EGroupware eTemplate2 - Readonly date+time WebComponent
+ *
+ * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
+ * @package api
+ * @link https://www.egroupware.org
+ * @author Nathan Gray
+ */
+
import {formatDateTime, parseDateTime} from "./Et2Date";
-import {et2_IDetachedDOM} from "../et2_core_interfaces";
-import {Et2Widget} from "../Et2Widget/Et2Widget";
-import {dateStyles} from "./DateStyles";
+import {Et2DateReadonly} from "./Et2DateReadonly";
/**
* This is a stripped-down read-only widget used in nextmatch
*/
-export class Et2DateTimeReadonly extends Et2Widget(LitElement) implements et2_IDetachedDOM
+export class Et2DateTimeReadonly extends Et2DateReadonly
{
- private value : any;
-
- static get styles()
+ constructor()
{
- return [
- ...super.styles,
- dateStyles
- ];
- }
-
- static get properties()
- {
- return {
- ...super.properties,
- value: String,
- }
- }
-
- set_value(value)
- {
- this.value = value;
- }
-
- render()
- {
- let parsed : Date | Boolean = this.value ? parseDateTime(this.value) : false
-
- return html`
-
- `;
- }
-
- getDetachedAttributes(attrs)
- {
- attrs.push("id", "value", "class");
- }
-
- getDetachedNodes() : HTMLElement[]
- {
- return [this];
- }
-
- setDetachedAttributes(_nodes : HTMLElement[], _values : object, _data? : any) : void
- {
- // Do nothing, since we can't actually stop being a DOM node...
- }
-
- loadFromXML()
- {
- // nope
- }
-
- loadingFinished()
- {
- // already done, I'm a wc with no children
+ super();
+ this.parser = parseDateTime;
+ this.formatter = formatDateTime;
}
}