From ecdb4b7eeb42dc859cfd6aa31634b423b72c50bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Mon, 15 Nov 2021 00:47:13 +0100 Subject: Rework some drawing and how calendar is accessed. --- static/components/vevent-edit.ts | 49 +++++++++++----------------------------- static/components/vevent.ts | 7 +++--- static/script.ts | 7 ++++-- static/server_connect.ts | 2 +- static/vevent.ts | 6 ++++- 5 files changed, 28 insertions(+), 43 deletions(-) diff --git a/static/components/vevent-edit.ts b/static/components/vevent-edit.ts index 602e1872..b9c76dd3 100644 --- a/static/components/vevent-edit.ts +++ b/static/components/vevent-edit.ts @@ -12,12 +12,12 @@ import { create_event } from '../server_connect' */ class ComponentEdit extends ComponentVEvent { - firstTime: boolean - constructor() { super(); - this.firstTime = true; + let frag = this.template.content.cloneNode(true) as DocumentFragment + let body = frag.firstElementChild! + this.replaceChildren(body); } connectedCallback() { @@ -38,19 +38,15 @@ class ComponentEdit extends ComponentVEvent { for (let el of this.getElementsByClassName('calendar-selection')) { for (let opt of el.getElementsByTagName('option')) { opt.selected = false; - if (opt.value == event_calendar_mapping.get(this.uid)) { - data.setCalendar(opt.value); - opt.selected = true; - /* No break since we want to set the remainders 'selected' to false */ - } + } + if (data.calendar) { + (el as HTMLSelectElement).value = data.calendar; } el.addEventListener('change', (e) => { let v = (e.target as HTMLSelectElement).selectedOptions[0].value - // e.selectedOptions[0].innerText - let obj = vcal_objects.get(this.uid)! - obj.setCalendar(v); + obj.calendar = v; }); } @@ -85,20 +81,10 @@ class ComponentEdit extends ComponentVEvent { } redraw(data: VEvent) { - // update ourselves from template - - if (!this.template) { - throw "Something"; - } - - let body; - if (this.firstTime) { - body = (this.template.content.cloneNode(true) as DocumentFragment).firstElementChild!; - } else { - body = this; - } + /* We only update our fields, instead of reinstansiating + ourselves from the template, in hope that it's faster */ - for (let el of body.getElementsByClassName("interactive")) { + for (let el of this.getElementsByClassName("interactive")) { if (!(el instanceof HTMLElement)) continue; let p = el.dataset.property!; let d: any; @@ -119,19 +105,10 @@ class ComponentEdit extends ComponentVEvent { } } - for (let el of body.getElementsByTagName('calendar-selection')) { - for (let opt of el.getElementsByTagName('option')) { - opt.selected = false; - if (opt.value == data._calendar) { - opt.selected = true; - } + if (data.calendar) { + for (let el of this.getElementsByClassName('calendar-selection')) { + (el as HTMLSelectElement).value = data.calendar; } } - - if (this.firstTime) { - this.replaceChildren(body); - this.firstTime = false; - } } - } diff --git a/static/components/vevent.ts b/static/components/vevent.ts index de232794..d957c7c8 100644 --- a/static/components/vevent.ts +++ b/static/components/vevent.ts @@ -26,6 +26,7 @@ class ComponentVEvent extends HTMLElement { } this.uid = real_uid; + this.dataset.uid = uid; vcal_objects.get(this.uid)?.register(this); @@ -36,9 +37,9 @@ class ComponentVEvent extends HTMLElement { } connectedCallback() { - let uid, v; - if ((uid = this.dataset.uid)) { - v = vcal_objects.get(uid) + let uid = this.dataset.uid + if (uid) { + let v = vcal_objects.get(uid) if (v) this.redraw(v); } } diff --git a/static/script.ts b/static/script.ts index 655d1e36..2a339e77 100644 --- a/static/script.ts +++ b/static/script.ts @@ -31,9 +31,12 @@ window.addEventListener('load', function() { let div2 = document.getElementById('calendar-event-mapping')!; for (let calendar of div2.children) { + let calendar_name = calendar.getAttribute('key')!; for (let child of calendar.children) { - event_calendar_mapping.set( - child.innerHTML, calendar.getAttribute('key')!); + let uid = child.innerHTML; + event_calendar_mapping.set(uid, calendar_name); + let obj = vcal_objects.get(uid); + if (obj) obj.calendar = calendar_name } } diff --git a/static/server_connect.ts b/static/server_connect.ts index 594e46de..e02258ce 100644 --- a/static/server_connect.ts +++ b/static/server_connect.ts @@ -51,7 +51,7 @@ async function remove_event(element: Element): void { async function create_event(event: VEvent) { // let xml = event.getElementsByTagName("icalendar")[0].outerHTML - let calendar = event._calendar; + let calendar = event.calendar; if (!calendar) { console.error("Can't create event without calendar") return; diff --git a/static/vevent.ts b/static/vevent.ts index ddabb507..4f47f8e3 100644 --- a/static/vevent.ts +++ b/static/vevent.ts @@ -129,13 +129,17 @@ class VEvent { } } - setCalendar(calendar: string) { + set calendar(calendar: string | null) { this._calendar = calendar; for (let el of this.registered) { el.redraw(this); } } + get calendar(): string | null { + return this._calendar; + } + register(htmlNode: Redrawable) { this.registered.push(htmlNode); } -- cgit v1.2.3