|
@@ -1,6 +1,6 @@
|
|
|
/**
|
|
/**
|
|
|
* This file is part of Radicale Server - Calendar Server
|
|
* This file is part of Radicale Server - Calendar Server
|
|
|
- * Copyright © 2017-2018 Unrud <unrud@outlook.com>
|
|
|
|
|
|
|
+ * Copyright © 2017-2024 Unrud <unrud@outlook.com>
|
|
|
*
|
|
*
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
* it under the terms of the GNU General Public License as published by
|
|
@@ -28,7 +28,7 @@ const SERVER = location.origin;
|
|
|
* @const
|
|
* @const
|
|
|
* @type {string}
|
|
* @type {string}
|
|
|
*/
|
|
*/
|
|
|
-const ROOT_PATH = (new URL("..", location.href)).pathname;
|
|
|
|
|
|
|
+const ROOT_PATH = location.pathname.replace(new RegExp("/+[^/]+/*(/index\\.html?)?$"), "") + '/';
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* Regex to match and normalize color
|
|
* Regex to match and normalize color
|
|
@@ -63,6 +63,7 @@ const CollectionType = {
|
|
|
CALENDAR: "CALENDAR",
|
|
CALENDAR: "CALENDAR",
|
|
|
JOURNAL: "JOURNAL",
|
|
JOURNAL: "JOURNAL",
|
|
|
TASKS: "TASKS",
|
|
TASKS: "TASKS",
|
|
|
|
|
+ WEBCAL: "WEBCAL",
|
|
|
is_subset: function(a, b) {
|
|
is_subset: function(a, b) {
|
|
|
let components = a.split("_");
|
|
let components = a.split("_");
|
|
|
for (let i = 0; i < components.length; i++) {
|
|
for (let i = 0; i < components.length; i++) {
|
|
@@ -89,6 +90,9 @@ const CollectionType = {
|
|
|
if (a.search(this.TASKS) !== -1 || b.search(this.TASKS) !== -1) {
|
|
if (a.search(this.TASKS) !== -1 || b.search(this.TASKS) !== -1) {
|
|
|
union.push(this.TASKS);
|
|
union.push(this.TASKS);
|
|
|
}
|
|
}
|
|
|
|
|
+ if (a.search(this.WEBCAL) !== -1 || b.search(this.WEBCAL) !== -1) {
|
|
|
|
|
+ union.push(this.WEBCAL);
|
|
|
|
|
+ }
|
|
|
return union.join("_");
|
|
return union.join("_");
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
@@ -102,12 +106,13 @@ const CollectionType = {
|
|
|
* @param {string} description
|
|
* @param {string} description
|
|
|
* @param {string} color
|
|
* @param {string} color
|
|
|
*/
|
|
*/
|
|
|
-function Collection(href, type, displayname, description, color) {
|
|
|
|
|
|
|
+function Collection(href, type, displayname, description, color, source) {
|
|
|
this.href = href;
|
|
this.href = href;
|
|
|
this.type = type;
|
|
this.type = type;
|
|
|
this.displayname = displayname;
|
|
this.displayname = displayname;
|
|
|
this.color = color;
|
|
this.color = color;
|
|
|
this.description = description;
|
|
this.description = description;
|
|
|
|
|
+ this.source = source;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -183,6 +188,7 @@ function get_collections(user, password, collection, callback) {
|
|
|
let addressbookcolor_element = response.querySelector(response_query + " > *|propstat > *|prop > *|addressbook-color");
|
|
let addressbookcolor_element = response.querySelector(response_query + " > *|propstat > *|prop > *|addressbook-color");
|
|
|
let calendardesc_element = response.querySelector(response_query + " > *|propstat > *|prop > *|calendar-description");
|
|
let calendardesc_element = response.querySelector(response_query + " > *|propstat > *|prop > *|calendar-description");
|
|
|
let addressbookdesc_element = response.querySelector(response_query + " > *|propstat > *|prop > *|addressbook-description");
|
|
let addressbookdesc_element = response.querySelector(response_query + " > *|propstat > *|prop > *|addressbook-description");
|
|
|
|
|
+ let webcalsource_element = response.querySelector(response_query + " > *|propstat > *|prop > *|source");
|
|
|
let components_query = response_query + " > *|propstat > *|prop > *|supported-calendar-component-set";
|
|
let components_query = response_query + " > *|propstat > *|prop > *|supported-calendar-component-set";
|
|
|
let components_element = response.querySelector(components_query);
|
|
let components_element = response.querySelector(components_query);
|
|
|
let href = href_element ? href_element.textContent : "";
|
|
let href = href_element ? href_element.textContent : "";
|
|
@@ -190,11 +196,17 @@ function get_collections(user, password, collection, callback) {
|
|
|
let type = "";
|
|
let type = "";
|
|
|
let color = "";
|
|
let color = "";
|
|
|
let description = "";
|
|
let description = "";
|
|
|
|
|
+ let source = "";
|
|
|
if (resourcetype_element) {
|
|
if (resourcetype_element) {
|
|
|
if (resourcetype_element.querySelector(resourcetype_query + " > *|addressbook")) {
|
|
if (resourcetype_element.querySelector(resourcetype_query + " > *|addressbook")) {
|
|
|
type = CollectionType.ADDRESSBOOK;
|
|
type = CollectionType.ADDRESSBOOK;
|
|
|
color = addressbookcolor_element ? addressbookcolor_element.textContent : "";
|
|
color = addressbookcolor_element ? addressbookcolor_element.textContent : "";
|
|
|
description = addressbookdesc_element ? addressbookdesc_element.textContent : "";
|
|
description = addressbookdesc_element ? addressbookdesc_element.textContent : "";
|
|
|
|
|
+ } else if (resourcetype_element.querySelector(resourcetype_query + " > *|subscribed")) {
|
|
|
|
|
+ type = CollectionType.WEBCAL;
|
|
|
|
|
+ source = webcalsource_element ? webcalsource_element.textContent : "";
|
|
|
|
|
+ color = calendarcolor_element ? calendarcolor_element.textContent : "";
|
|
|
|
|
+ description = calendardesc_element ? calendardesc_element.textContent : "";
|
|
|
} else if (resourcetype_element.querySelector(resourcetype_query + " > *|calendar")) {
|
|
} else if (resourcetype_element.querySelector(resourcetype_query + " > *|calendar")) {
|
|
|
if (components_element) {
|
|
if (components_element) {
|
|
|
if (components_element.querySelector(components_query + " > *|comp[name=VEVENT]")) {
|
|
if (components_element.querySelector(components_query + " > *|comp[name=VEVENT]")) {
|
|
@@ -221,7 +233,7 @@ function get_collections(user, password, collection, callback) {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if (href.substr(-1) === "/" && href !== collection.href && type) {
|
|
if (href.substr(-1) === "/" && href !== collection.href && type) {
|
|
|
- collections.push(new Collection(href, type, displayname, description, sane_color));
|
|
|
|
|
|
|
+ collections.push(new Collection(href, type, displayname, description, sane_color, source));
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
collections.sort(function(a, b) {
|
|
collections.sort(function(a, b) {
|
|
@@ -235,11 +247,15 @@ function get_collections(user, password, collection, callback) {
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
request.send('<?xml version="1.0" encoding="utf-8" ?>' +
|
|
request.send('<?xml version="1.0" encoding="utf-8" ?>' +
|
|
|
- '<propfind xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav" ' +
|
|
|
|
|
|
|
+ '<propfind ' +
|
|
|
|
|
+ 'xmlns="DAV:" ' +
|
|
|
|
|
+ 'xmlns:C="urn:ietf:params:xml:ns:caldav" ' +
|
|
|
'xmlns:CR="urn:ietf:params:xml:ns:carddav" ' +
|
|
'xmlns:CR="urn:ietf:params:xml:ns:carddav" ' +
|
|
|
|
|
+ 'xmlns:CS="http://calendarserver.org/ns/" ' +
|
|
|
'xmlns:I="http://apple.com/ns/ical/" ' +
|
|
'xmlns:I="http://apple.com/ns/ical/" ' +
|
|
|
'xmlns:INF="http://inf-it.com/ns/ab/" ' +
|
|
'xmlns:INF="http://inf-it.com/ns/ab/" ' +
|
|
|
- 'xmlns:RADICALE="http://radicale.org/ns/">' +
|
|
|
|
|
|
|
+ 'xmlns:RADICALE="http://radicale.org/ns/"' +
|
|
|
|
|
+ '>' +
|
|
|
'<prop>' +
|
|
'<prop>' +
|
|
|
'<resourcetype />' +
|
|
'<resourcetype />' +
|
|
|
'<RADICALE:displayname />' +
|
|
'<RADICALE:displayname />' +
|
|
@@ -248,6 +264,7 @@ function get_collections(user, password, collection, callback) {
|
|
|
'<C:calendar-description />' +
|
|
'<C:calendar-description />' +
|
|
|
'<C:supported-calendar-component-set />' +
|
|
'<C:supported-calendar-component-set />' +
|
|
|
'<CR:addressbook-description />' +
|
|
'<CR:addressbook-description />' +
|
|
|
|
|
+ '<CS:source />' +
|
|
|
'</prop>' +
|
|
'</prop>' +
|
|
|
'</propfind>');
|
|
'</propfind>');
|
|
|
return request;
|
|
return request;
|
|
@@ -329,12 +346,18 @@ function create_edit_collection(user, password, collection, create, callback) {
|
|
|
let addressbook_color = "";
|
|
let addressbook_color = "";
|
|
|
let calendar_description = "";
|
|
let calendar_description = "";
|
|
|
let addressbook_description = "";
|
|
let addressbook_description = "";
|
|
|
|
|
+ let calendar_source = "";
|
|
|
let resourcetype;
|
|
let resourcetype;
|
|
|
let components = "";
|
|
let components = "";
|
|
|
if (collection.type === CollectionType.ADDRESSBOOK) {
|
|
if (collection.type === CollectionType.ADDRESSBOOK) {
|
|
|
addressbook_color = escape_xml(collection.color + (collection.color ? "ff" : ""));
|
|
addressbook_color = escape_xml(collection.color + (collection.color ? "ff" : ""));
|
|
|
addressbook_description = escape_xml(collection.description);
|
|
addressbook_description = escape_xml(collection.description);
|
|
|
resourcetype = '<CR:addressbook />';
|
|
resourcetype = '<CR:addressbook />';
|
|
|
|
|
+ } else if (collection.type === CollectionType.WEBCAL) {
|
|
|
|
|
+ calendar_color = escape_xml(collection.color + (collection.color ? "ff" : ""));
|
|
|
|
|
+ calendar_description = escape_xml(collection.description);
|
|
|
|
|
+ resourcetype = '<CS:subscribed />';
|
|
|
|
|
+ calendar_source = collection.source;
|
|
|
} else {
|
|
} else {
|
|
|
calendar_color = escape_xml(collection.color + (collection.color ? "ff" : ""));
|
|
calendar_color = escape_xml(collection.color + (collection.color ? "ff" : ""));
|
|
|
calendar_description = escape_xml(collection.description);
|
|
calendar_description = escape_xml(collection.description);
|
|
@@ -351,7 +374,7 @@ function create_edit_collection(user, password, collection, create, callback) {
|
|
|
}
|
|
}
|
|
|
let xml_request = create ? "mkcol" : "propertyupdate";
|
|
let xml_request = create ? "mkcol" : "propertyupdate";
|
|
|
request.send('<?xml version="1.0" encoding="UTF-8" ?>' +
|
|
request.send('<?xml version="1.0" encoding="UTF-8" ?>' +
|
|
|
- '<' + xml_request + ' xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:CR="urn:ietf:params:xml:ns:carddav" xmlns:I="http://apple.com/ns/ical/" xmlns:INF="http://inf-it.com/ns/ab/">' +
|
|
|
|
|
|
|
+ '<' + xml_request + ' xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav" xmlns:CR="urn:ietf:params:xml:ns:carddav" xmlns:CS="http://calendarserver.org/ns/" xmlns:I="http://apple.com/ns/ical/" xmlns:INF="http://inf-it.com/ns/ab/">' +
|
|
|
'<set>' +
|
|
'<set>' +
|
|
|
'<prop>' +
|
|
'<prop>' +
|
|
|
(create ? '<resourcetype><collection />' + resourcetype + '</resourcetype>' : '') +
|
|
(create ? '<resourcetype><collection />' + resourcetype + '</resourcetype>' : '') +
|
|
@@ -361,6 +384,7 @@ function create_edit_collection(user, password, collection, create, callback) {
|
|
|
(addressbook_color ? '<INF:addressbook-color>' + addressbook_color + '</INF:addressbook-color>' : '') +
|
|
(addressbook_color ? '<INF:addressbook-color>' + addressbook_color + '</INF:addressbook-color>' : '') +
|
|
|
(addressbook_description ? '<CR:addressbook-description>' + addressbook_description + '</CR:addressbook-description>' : '') +
|
|
(addressbook_description ? '<CR:addressbook-description>' + addressbook_description + '</CR:addressbook-description>' : '') +
|
|
|
(calendar_description ? '<C:calendar-description>' + calendar_description + '</C:calendar-description>' : '') +
|
|
(calendar_description ? '<C:calendar-description>' + calendar_description + '</C:calendar-description>' : '') +
|
|
|
|
|
+ (calendar_source ? '<CS:source>' + calendar_source + '</CS:source>' : '') +
|
|
|
'</prop>' +
|
|
'</prop>' +
|
|
|
'</set>' +
|
|
'</set>' +
|
|
|
(!create ? ('<remove>' +
|
|
(!create ? ('<remove>' +
|
|
@@ -495,7 +519,12 @@ function LoginScene() {
|
|
|
function fill_form() {
|
|
function fill_form() {
|
|
|
user_form.value = user;
|
|
user_form.value = user;
|
|
|
password_form.value = "";
|
|
password_form.value = "";
|
|
|
- error_form.textContent = error ? "Error: " + error : "";
|
|
|
|
|
|
|
+ if(error){
|
|
|
|
|
+ error_form.textContent = "Error: " + error;
|
|
|
|
|
+ error_form.classList.remove("hidden");
|
|
|
|
|
+ }else{
|
|
|
|
|
+ error_form.classList.add("hidden");
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function onlogin() {
|
|
function onlogin() {
|
|
@@ -507,7 +536,7 @@ function LoginScene() {
|
|
|
// setup logout
|
|
// setup logout
|
|
|
logout_view.classList.remove("hidden");
|
|
logout_view.classList.remove("hidden");
|
|
|
logout_btn.onclick = onlogout;
|
|
logout_btn.onclick = onlogout;
|
|
|
- logout_user_form.textContent = user;
|
|
|
|
|
|
|
+ logout_user_form.textContent = user + "'s Collections";
|
|
|
// Fetch principal
|
|
// Fetch principal
|
|
|
let loading_scene = new LoadingScene();
|
|
let loading_scene = new LoadingScene();
|
|
|
push_scene(loading_scene, false);
|
|
push_scene(loading_scene, false);
|
|
@@ -683,12 +712,11 @@ function CollectionsScene(user, password, collection, onerror) {
|
|
|
let color_form = node.querySelector("[data-name=color]");
|
|
let color_form = node.querySelector("[data-name=color]");
|
|
|
let delete_btn = node.querySelector("[data-name=delete]");
|
|
let delete_btn = node.querySelector("[data-name=delete]");
|
|
|
let edit_btn = node.querySelector("[data-name=edit]");
|
|
let edit_btn = node.querySelector("[data-name=edit]");
|
|
|
|
|
+ let download_btn = node.querySelector("[data-name=download]");
|
|
|
if (collection.color) {
|
|
if (collection.color) {
|
|
|
- color_form.style.color = collection.color;
|
|
|
|
|
- } else {
|
|
|
|
|
- color_form.classList.add("hidden");
|
|
|
|
|
|
|
+ color_form.style.background = collection.color;
|
|
|
}
|
|
}
|
|
|
- let possible_types = [CollectionType.ADDRESSBOOK];
|
|
|
|
|
|
|
+ let possible_types = [CollectionType.ADDRESSBOOK, CollectionType.WEBCAL];
|
|
|
[CollectionType.CALENDAR, ""].forEach(function(e) {
|
|
[CollectionType.CALENDAR, ""].forEach(function(e) {
|
|
|
[CollectionType.union(e, CollectionType.JOURNAL), e].forEach(function(e) {
|
|
[CollectionType.union(e, CollectionType.JOURNAL), e].forEach(function(e) {
|
|
|
[CollectionType.union(e, CollectionType.TASKS), e].forEach(function(e) {
|
|
[CollectionType.union(e, CollectionType.TASKS), e].forEach(function(e) {
|
|
@@ -704,10 +732,16 @@ function CollectionsScene(user, password, collection, onerror) {
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
title_form.textContent = collection.displayname || collection.href;
|
|
title_form.textContent = collection.displayname || collection.href;
|
|
|
|
|
+ if(title_form.textContent.length > 30){
|
|
|
|
|
+ title_form.classList.add("smalltext");
|
|
|
|
|
+ }
|
|
|
description_form.textContent = collection.description;
|
|
description_form.textContent = collection.description;
|
|
|
|
|
+ if(description_form.textContent.length > 150){
|
|
|
|
|
+ description_form.classList.add("smalltext");
|
|
|
|
|
+ }
|
|
|
let href = SERVER + collection.href;
|
|
let href = SERVER + collection.href;
|
|
|
- url_form.href = href;
|
|
|
|
|
- url_form.textContent = href;
|
|
|
|
|
|
|
+ url_form.value = href;
|
|
|
|
|
+ download_btn.href = href;
|
|
|
delete_btn.onclick = function() {return ondelete(collection);};
|
|
delete_btn.onclick = function() {return ondelete(collection);};
|
|
|
edit_btn.onclick = function() {return onedit(collection);};
|
|
edit_btn.onclick = function() {return onedit(collection);};
|
|
|
node.classList.remove("hidden");
|
|
node.classList.remove("hidden");
|
|
@@ -945,9 +979,15 @@ function DeleteCollectionScene(user, password, collection) {
|
|
|
scene_index = scene_stack.length - 1;
|
|
scene_index = scene_stack.length - 1;
|
|
|
html_scene.classList.remove("hidden");
|
|
html_scene.classList.remove("hidden");
|
|
|
title_form.textContent = collection.displayname || collection.href;
|
|
title_form.textContent = collection.displayname || collection.href;
|
|
|
- error_form.textContent = error ? "Error: " + error : "";
|
|
|
|
|
delete_btn.onclick = ondelete;
|
|
delete_btn.onclick = ondelete;
|
|
|
cancel_btn.onclick = oncancel;
|
|
cancel_btn.onclick = oncancel;
|
|
|
|
|
+ if(error){
|
|
|
|
|
+ error_form.textContent = "Error: " + error;
|
|
|
|
|
+ error_form.classList.remove("hidden");
|
|
|
|
|
+ }else{
|
|
|
|
|
+ error_form.classList.add("hidden");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
};
|
|
};
|
|
|
this.hide = function() {
|
|
this.hide = function() {
|
|
|
html_scene.classList.add("hidden");
|
|
html_scene.classList.add("hidden");
|
|
@@ -989,12 +1029,19 @@ function CreateEditCollectionScene(user, password, collection) {
|
|
|
let title_form = edit ? html_scene.querySelector("[data-name=title]") : null;
|
|
let title_form = edit ? html_scene.querySelector("[data-name=title]") : null;
|
|
|
let error_form = html_scene.querySelector("[data-name=error]");
|
|
let error_form = html_scene.querySelector("[data-name=error]");
|
|
|
let displayname_form = html_scene.querySelector("[data-name=displayname]");
|
|
let displayname_form = html_scene.querySelector("[data-name=displayname]");
|
|
|
|
|
+ let displayname_label = html_scene.querySelector("label[for=displayname]");
|
|
|
let description_form = html_scene.querySelector("[data-name=description]");
|
|
let description_form = html_scene.querySelector("[data-name=description]");
|
|
|
|
|
+ let description_label = html_scene.querySelector("label[for=description]");
|
|
|
|
|
+ let source_form = html_scene.querySelector("[data-name=source]");
|
|
|
|
|
+ let source_label = html_scene.querySelector("label[for=source]");
|
|
|
let type_form = html_scene.querySelector("[data-name=type]");
|
|
let type_form = html_scene.querySelector("[data-name=type]");
|
|
|
|
|
+ let type_label = html_scene.querySelector("label[for=type]");
|
|
|
let color_form = html_scene.querySelector("[data-name=color]");
|
|
let color_form = html_scene.querySelector("[data-name=color]");
|
|
|
|
|
+ let color_label = html_scene.querySelector("label[for=color]");
|
|
|
let submit_btn = html_scene.querySelector("[data-name=submit]");
|
|
let submit_btn = html_scene.querySelector("[data-name=submit]");
|
|
|
let cancel_btn = html_scene.querySelector("[data-name=cancel]");
|
|
let cancel_btn = html_scene.querySelector("[data-name=cancel]");
|
|
|
|
|
|
|
|
|
|
+
|
|
|
/** @type {?number} */ let scene_index = null;
|
|
/** @type {?number} */ let scene_index = null;
|
|
|
/** @type {?XMLHttpRequest} */ let create_edit_req = null;
|
|
/** @type {?XMLHttpRequest} */ let create_edit_req = null;
|
|
|
let error = "";
|
|
let error = "";
|
|
@@ -1003,6 +1050,7 @@ function CreateEditCollectionScene(user, password, collection) {
|
|
|
let href = edit ? collection.href : collection.href + random_uuid() + "/";
|
|
let href = edit ? collection.href : collection.href + random_uuid() + "/";
|
|
|
let displayname = edit ? collection.displayname : "";
|
|
let displayname = edit ? collection.displayname : "";
|
|
|
let description = edit ? collection.description : "";
|
|
let description = edit ? collection.description : "";
|
|
|
|
|
+ let source = edit ? collection.source : "";
|
|
|
let type = edit ? collection.type : CollectionType.CALENDAR_JOURNAL_TASKS;
|
|
let type = edit ? collection.type : CollectionType.CALENDAR_JOURNAL_TASKS;
|
|
|
let color = edit && collection.color ? collection.color : "#" + random_hex(6);
|
|
let color = edit && collection.color ? collection.color : "#" + random_hex(6);
|
|
|
|
|
|
|
@@ -1022,6 +1070,7 @@ function CreateEditCollectionScene(user, password, collection) {
|
|
|
function read_form() {
|
|
function read_form() {
|
|
|
displayname = displayname_form.value;
|
|
displayname = displayname_form.value;
|
|
|
description = description_form.value;
|
|
description = description_form.value;
|
|
|
|
|
+ source = source_form.value;
|
|
|
type = type_form.value;
|
|
type = type_form.value;
|
|
|
color = color_form.value;
|
|
color = color_form.value;
|
|
|
}
|
|
}
|
|
@@ -1029,9 +1078,17 @@ function CreateEditCollectionScene(user, password, collection) {
|
|
|
function fill_form() {
|
|
function fill_form() {
|
|
|
displayname_form.value = displayname;
|
|
displayname_form.value = displayname;
|
|
|
description_form.value = description;
|
|
description_form.value = description;
|
|
|
|
|
+ source_form.value = source;
|
|
|
type_form.value = type;
|
|
type_form.value = type;
|
|
|
color_form.value = color;
|
|
color_form.value = color;
|
|
|
- error_form.textContent = error ? "Error: " + error : "";
|
|
|
|
|
|
|
+ if(error){
|
|
|
|
|
+ error_form.textContent = "Error: " + error;
|
|
|
|
|
+ error_form.classList.remove("hidden");
|
|
|
|
|
+ }
|
|
|
|
|
+ error_form.classList.add("hidden");
|
|
|
|
|
+
|
|
|
|
|
+ onTypeChange();
|
|
|
|
|
+ type_form.addEventListener("change", onTypeChange);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function onsubmit() {
|
|
function onsubmit() {
|
|
@@ -1049,7 +1106,7 @@ function CreateEditCollectionScene(user, password, collection) {
|
|
|
}
|
|
}
|
|
|
let loading_scene = new LoadingScene();
|
|
let loading_scene = new LoadingScene();
|
|
|
push_scene(loading_scene);
|
|
push_scene(loading_scene);
|
|
|
- let collection = new Collection(href, type, displayname, description, sane_color);
|
|
|
|
|
|
|
+ let collection = new Collection(href, type, displayname, description, sane_color, source);
|
|
|
let callback = function(error1) {
|
|
let callback = function(error1) {
|
|
|
if (scene_index === null) {
|
|
if (scene_index === null) {
|
|
|
return;
|
|
return;
|
|
@@ -1082,6 +1139,16 @@ function CreateEditCollectionScene(user, password, collection) {
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ function onTypeChange(e){
|
|
|
|
|
+ if(type_form.value == CollectionType.WEBCAL){
|
|
|
|
|
+ source_label.classList.remove("hidden");
|
|
|
|
|
+ source_form.classList.remove("hidden");
|
|
|
|
|
+ }else{
|
|
|
|
|
+ source_label.classList.add("hidden");
|
|
|
|
|
+ source_form.classList.add("hidden");
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
this.show = function() {
|
|
this.show = function() {
|
|
|
this.release();
|
|
this.release();
|
|
|
scene_index = scene_stack.length - 1;
|
|
scene_index = scene_stack.length - 1;
|