aboutsummaryrefslogtreecommitdiff
path: root/static/server_connect.ts
diff options
context:
space:
mode:
authorHugo Hörnquist <hugo@lysator.liu.se>2021-10-04 17:40:59 +0200
committerHugo Hörnquist <hugo@lysator.liu.se>2021-10-04 17:43:45 +0200
commitc6c65f9e8273a5bc1b2ac1155d66003d2b98591c (patch)
treeda25ccd8af897dbc2671008e06f22d08d1208035 /static/server_connect.ts
parentwork (diff)
downloadcalp-c6c65f9e8273a5bc1b2ac1155d66003d2b98591c.tar.gz
calp-c6c65f9e8273a5bc1b2ac1155d66003d2b98591c.tar.xz
{.js => .ts} on relavant files.
Diffstat (limited to 'static/server_connect.ts')
-rw-r--r--static/server_connect.ts108
1 files changed, 108 insertions, 0 deletions
diff --git a/static/server_connect.ts b/static/server_connect.ts
new file mode 100644
index 00000000..ef5de5a9
--- /dev/null
+++ b/static/server_connect.ts
@@ -0,0 +1,108 @@
+
+async function remove_event (element) {
+ let uid = element.querySelector("icalendar uid text").textContent;
+
+ let data = new URLSearchParams();
+ data.append('uid', uid);
+
+ let response = await fetch ( '/remove', {
+ method: 'POST',
+ body: data
+ });
+
+ console.log(response);
+ toggle_popup("popup" + element.id);
+
+ if (response.status < 200 || response.status >= 300) {
+ let body = await response.text();
+ alert(`HTTP error ${response.status}\n${body}`)
+ } else {
+ element.remove();
+ }
+}
+
+function event_to_jcal (event) {
+ /* encapsulate event in a shim calendar, to ensure that
+ we always send correct stuff */
+ return ['vcalendar',
+ [
+ /*
+ 'prodid' and 'version' are technically both required (RFC 5545,
+ 3.6 Calendar Components).
+ */
+ ],
+ [
+ /* vtimezone goes here */
+ event.properties.to_jcal()
+ ]
+ ];
+}
+
+async function create_event (event) {
+
+ // let xml = event.getElementsByTagName("icalendar")[0].outerHTML
+ let calendar = event.properties.calendar.value;
+
+ console.log('calendar=', calendar/*, xml*/);
+
+ let data = new URLSearchParams();
+ data.append("cal", calendar);
+ // data.append("data", xml);
+
+ console.log(event);
+
+ let jcal = event_to_jcal(event);
+
+
+
+ let doc = jcal_to_xcal(jcal);
+ console.log(doc);
+ let str = doc.documentElement.outerHTML;
+ console.log(str);
+ data.append("data", str);
+
+ // console.log(event.properties);
+
+ // return;
+
+ let response = await fetch ( '/insert', {
+ method: 'POST',
+ body: data
+ });
+
+ console.log(response);
+ if (response.status < 200 || response.status >= 300) {
+ let body = await response.text();
+ alert(`HTTP error ${response.status}\n${body}`)
+ return;
+ }
+
+ let body = await response.text();
+
+ /* server is assumed to return an XML document on the form
+ <properties>
+ **xcal property** ...
+ </properties>
+ parse that, and update our own vevent with the data.
+ */
+
+ let parser = new DOMParser();
+ let return_properties = parser
+ .parseFromString(body, 'text/xml')
+ .children[0];
+
+ let child;
+ while ((child = return_properties.firstChild)) {
+ let target = event.querySelector(
+ "vevent properties " + child.tagName);
+ if (target) {
+ target.replaceWith(child);
+ } else {
+ event.querySelector("vevent properties")
+ .appendChild(child);
+ }
+ }
+
+ event.classList.remove("generated");
+ toggle_popup("popup" + event.id);
+}