diff --git a/source/logic/backend.ts b/source/logic/backend.ts index 4e89d19..7491fc3 100644 --- a/source/logic/backend.ts +++ b/source/logic/backend.ts @@ -229,6 +229,26 @@ namespace _zeitbild.frontend_web.backend } + /** + */ + export async function user_list( + ) : Promise< + Array< + { + id : int; + name : string; + } + > + > + { + return call( + lib_plankton.http.enum_method.get, + "/users", + null + ); + } + + /** */ export async function calendar_list( @@ -250,6 +270,63 @@ namespace _zeitbild.frontend_web.backend } + /** + */ + export async function calendar_get( + calendar_id : _zeitbild.frontend_web.type.calendar_id + ) : Promise< + _zeitbild.frontend_web.type.calendar_object + > + { + return ( + call( + lib_plankton.http.enum_method.get, + lib_plankton.string.coin( + "/calendar/{{calendar_id}}", + { + "calendar_id": calendar_id.toFixed(0), + } + ), + null + ) + .then( + (raw) => Promise.resolve( + { + "name": raw.name, + "access": { + "default_level": access_level_decode(raw.access.default_level), + "attributed": lib_plankton.map.hashmap.implementation_map( + lib_plankton.map.hashmap.make( + x => x.toFixed(0), + { + "pairs": ( + raw.access.attributed + .map( + (entry) => ({ + "key": entry.user_id, + "value": access_level_decode(entry.level), + }) + ) + ), + } + ) + ), + }, + // "resource_id": raw.resource_id + // TODO + "resource": { + "kind": "local", + "data": { + "events": [] + } + } + } + ) + ) + ); + } + + /** */ export async function calendar_add( @@ -260,7 +337,11 @@ namespace _zeitbild.frontend_web.backend { return call( lib_plankton.http.enum_method.post, - "/calendar", + lib_plankton.string.coin( + "/calendar", + { + } + ), { "name": calendar_object.name, "access": { @@ -281,6 +362,64 @@ namespace _zeitbild.frontend_web.backend } + /** + */ + export async function calendar_change( + calendar_id : _zeitbild.frontend_web.type.calendar_id, + calendar_object : _zeitbild.frontend_web.type.calendar_object + ) : Promise< + void + > + { + return call( + lib_plankton.http.enum_method.put, + lib_plankton.string.coin( + "/calendar/{{calendar_id}}", + { + "calendar_id": calendar_id.toFixed(0), + } + ), + { + "name": calendar_object.name, + "access": { + "default_level": access_level_encode(calendar_object.access.default_level), + "attributed": ( + lib_plankton.map.dump(calendar_object.access.attributed) + .map( + (pair) => ({ + "user_id": pair.key, + "level": access_level_encode(pair.value), + }) + ) + ) + }, + "resource": calendar_object.resource, + } + ); + } + + + /** + */ + export async function calendar_remove( + calendar_id : _zeitbild.frontend_web.type.calendar_id + ) : Promise< + void + > + { + return call( + lib_plankton.http.enum_method.delete, + lib_plankton.string.coin( + "/calendar/{{calendar_id}}", + { + "calendar_id": calendar_id.toFixed(0), + } + ), + null + ); + } + + /** */ export async function calendar_event_get( diff --git a/source/logic/helpers.ts b/source/logic/helpers.ts index 36856b8..740a0cf 100644 --- a/source/logic/helpers.ts +++ b/source/logic/helpers.ts @@ -66,4 +66,87 @@ namespace _zeitbild.frontend_web.helpers return Promise.resolve>(results); } + + /** + */ + export function input_access_level( + ) : lib_plankton.zoo_input.interface_input<_zeitbild.frontend_web.type.enum_access_level> + { + return ( + new lib_plankton.zoo_input.class_input_wrapped< + /*("none" | "view" | "edit" | "admin")*/string, + _zeitbild.frontend_web.type.enum_access_level + >( + new lib_plankton.zoo_input.class_input_selection( + [ + { + "value": "none", + "label": lib_plankton.translate.get("access_level.none"), + }, + { + "value": "view", + "label": lib_plankton.translate.get("access_level.view") + }, + { + "value": "edit", + "label": lib_plankton.translate.get("access_level.edit") + }, + { + "value": "admin", + "label": lib_plankton.translate.get("access_level.admin") + }, + ] + ), + (raw) => { + switch (raw) { + case "none": return _zeitbild.frontend_web.type.enum_access_level.none; + case "view": return _zeitbild.frontend_web.type.enum_access_level.view; + case "edit": return _zeitbild.frontend_web.type.enum_access_level.edit; + case "admin": return _zeitbild.frontend_web.type.enum_access_level.admin; + } + }, + (access_level) => { + switch (access_level) { + case _zeitbild.frontend_web.type.enum_access_level.none: return "none"; + case _zeitbild.frontend_web.type.enum_access_level.view: return "view"; + case _zeitbild.frontend_web.type.enum_access_level.edit: return "edit"; + case _zeitbild.frontend_web.type.enum_access_level.admin: return "admin"; + } + }, + ) + ); + } + + + /** + */ + export async function input_attributed_access( + ) : Promise> + { + const users : Array<{id : _zeitbild.frontend_web.type.user_id; name : string;}> = await _zeitbild.frontend_web.backend.user_list( + ); + return Promise.resolve( + new lib_plankton.zoo_input.class_input_hashmap<_zeitbild.frontend_web.type.user_id, _zeitbild.frontend_web.type.enum_access_level>( + // hash_key + (user_id) => user_id.toFixed(0), + // key_input_factory + () => new lib_plankton.zoo_input.class_input_wrapped( + new lib_plankton.zoo_input.class_input_selection( + users + .map( + (user) => ({ + "value": user.id.toFixed(0), + "label": user.name, + }) + ) + ), + x => parseInt(x), + x => x.toFixed(0) + ), + // value_input_factory + () => input_access_level() + ) + ); + } + } diff --git a/source/logic/main.ts b/source/logic/main.ts index ce861e0..262592a 100644 --- a/source/logic/main.ts +++ b/source/logic/main.ts @@ -54,10 +54,12 @@ namespace _zeitbild.frontend_web {"name": "calendar_add", "parameters": {}}, {"label": lib_plankton.translate.get("page.calendar_add.title")} ); + /* lib_plankton.zoo_page.add_nav_entry( {"name": "event_add", "parameters": {}}, {"label": lib_plankton.translate.get("page.event_add.title")} ); + */ lib_plankton.zoo_page.add_nav_entry( {"name": "logout", "parameters": {}}, {"label": lib_plankton.translate.get("page.logout.title")} diff --git a/source/pages/calendar_add/logic.ts b/source/pages/calendar_add/logic.ts index 9d0b3cc..6b912eb 100644 --- a/source/pages/calendar_add/logic.ts +++ b/source/pages/calendar_add/logic.ts @@ -17,46 +17,37 @@ namespace _zeitbild.frontend_web.pages _zeitbild.frontend_web.type.calendar_object, { name : string; - access_default_level : string; + access : { + default_level : _zeitbild.frontend_web.type.enum_access_level; + attributed : lib_plankton.map.type_map< + _zeitbild.frontend_web.type.user_id, + _zeitbild.frontend_web.type.enum_access_level + >; + }; resource_kind : string; } > = new lib_plankton.zoo_form.class_form< _zeitbild.frontend_web.type.calendar_object, { name : string; - access_default_level : string; + access : { + default_level : _zeitbild.frontend_web.type.enum_access_level; + attributed : lib_plankton.map.type_map< + _zeitbild.frontend_web.type.user_id, + _zeitbild.frontend_web.type.enum_access_level + >; + }; resource_kind : string; } >( (calendar_object) => ({ "name": calendar_object.name, - "access_default_level": (() => { - switch (calendar_object.access.default_level) { - case _zeitbild.frontend_web.type.enum_access_level.none: return "none"; - case _zeitbild.frontend_web.type.enum_access_level.view: return "view"; - case _zeitbild.frontend_web.type.enum_access_level.edit: return "edit"; - case _zeitbild.frontend_web.type.enum_access_level.admin: return "admin"; - } - }) (), + "access": calendar_object.access, "resource_kind": calendar_object.resource.kind, }), (raw) => ({ "name": raw.name, - "access": { - "default_level": (() => { - switch (raw.access_default_level) { - case "none": return _zeitbild.frontend_web.type.enum_access_level.none; - case "view": return _zeitbild.frontend_web.type.enum_access_level.view; - case "edit": return _zeitbild.frontend_web.type.enum_access_level.edit; - case "admin": return _zeitbild.frontend_web.type.enum_access_level.admin; - } - }) (), - "attributed": lib_plankton.map.hashmap.implementation_map( - lib_plankton.map.hashmap.make( - x => x.toFixed(0) - ) - ), - }, + "access": raw.access, "resource": (() => { switch (raw.resource_kind) { case "local": { @@ -93,34 +84,22 @@ namespace _zeitbild.frontend_web.pages "label": lib_plankton.translate.get("calendar.name") }, { - "name": "access_default_level", - "input": new lib_plankton.zoo_input.class_input_selection( + "name": "access", + "input": new lib_plankton.zoo_input.class_input_group( [ { - "value": "none", - "label": lib_plankton.translate.get("access_level.none"), + "name": "default_level", + "input": _zeitbild.frontend_web.helpers.input_access_level(), + "label": lib_plankton.translate.get("calendar.access.default_level"), }, { - "value": "view", - "label": lib_plankton.translate.get("access_level.view") - }, - { - "value": "edit", - "label": lib_plankton.translate.get("access_level.edit") - }, - { - "value": "admin", - "label": lib_plankton.translate.get("access_level.admin") + "name": "attributed", + "input": await _zeitbild.frontend_web.helpers.input_attributed_access(), + "label": lib_plankton.translate.get("calendar.access.attributed"), }, ] ), - "label": lib_plankton.string.coin( - "{{default_level}}", - { - "head": lib_plankton.translate.get("calendar.access.access"), - "default_level": lib_plankton.translate.get("calendar.access.default_level"), - } - ) + "label": lib_plankton.translate.get("calendar.access.access"), }, { "name": "resource_kind", diff --git a/source/pages/calendar_edit/logic.ts b/source/pages/calendar_edit/logic.ts new file mode 100644 index 0000000..ee46bd8 --- /dev/null +++ b/source/pages/calendar_edit/logic.ts @@ -0,0 +1,163 @@ +namespace _zeitbild.frontend_web.pages +{ + + /** + */ + lib_plankton.zoo_page.register( + "calendar_edit", + async (parameters, target_element) => { + const read_only : boolean = ((parameters["read_only"] ?? "yes") === "yes"); + const calendar_id : int = parseInt(parameters["calendar_id"]); + target_element.innerHTML = ""; + target_element.innerHTML = await _zeitbild.frontend_web.helpers.template_coin( + "calendar_edit", + { + "label": lib_plankton.translate.get("page.calendar_edit.title.regular") + } + ); + const form : lib_plankton.zoo_form.class_form< + _zeitbild.frontend_web.type.calendar_object, + { + name : string; + access : { + default_level : _zeitbild.frontend_web.type.enum_access_level; + attributed : lib_plankton.map.type_map< + _zeitbild.frontend_web.type.user_id, + _zeitbild.frontend_web.type.enum_access_level + >; + }; + } + > = new lib_plankton.zoo_form.class_form< + _zeitbild.frontend_web.type.calendar_object, + { + name : string; + access : { + default_level : _zeitbild.frontend_web.type.enum_access_level; + attributed : lib_plankton.map.type_map< + _zeitbild.frontend_web.type.user_id, + _zeitbild.frontend_web.type.enum_access_level + >; + }; + } + >( + (calendar_object) => ({ + "name": calendar_object.name, + "access": calendar_object.access, + }), + (raw) => ({ + "name": raw.name, + "access": raw.access, + "resource": { + "kind": "local", + "data": { + "events": [], + } + }, + }), + new lib_plankton.zoo_input.class_input_group( + [ + { + "name": "name", + "input": new lib_plankton.zoo_input.class_input_text(), + "label": lib_plankton.translate.get("calendar.name") + }, + { + "name": "access", + "input": new lib_plankton.zoo_input.class_input_group( + [ + { + "name": "default_level", + "input": _zeitbild.frontend_web.helpers.input_access_level(), + "label": lib_plankton.translate.get("calendar.access.default_level"), + }, + { + "name": "attributed", + "input": await _zeitbild.frontend_web.helpers.input_attributed_access(), + "label": lib_plankton.translate.get("calendar.access.attributed"), + }, + ] + ), + "label": lib_plankton.translate.get("calendar.access.access"), + }, + ] + ), + ( + read_only + ? + [ + ] + : + [ + { + "label": lib_plankton.translate.get("page.calendar_edit.actions.change"), + "target": "submit", + "procedure": async (get_value, get_representation) => { + const value : any = await get_value(); + try { + await _zeitbild.frontend_web.backend.calendar_change( + calendar_id, + value + ); + lib_plankton.zoo_page.set( + { + "name": "events", + "parameters": {} + } + ); + } + catch (error) { + // do nothing + /* + lib_plankton.zoo_page.set( + { + "name": "event_add", + "parameters": { + } + } + ); + */ + } + } + }, + { + "label": lib_plankton.translate.get("page.calendar_edit.actions.remove"), + "target": "submit", + "procedure": async (get_value, get_representation) => { + try { + await _zeitbild.frontend_web.backend.calendar_remove( + calendar_id + ); + lib_plankton.zoo_page.set( + { + "name": "events", + "parameters": {} + } + ); + } + catch (error) { + // do nothing + /* + lib_plankton.zoo_page.set( + { + "name": "event_add", + "parameters": { + } + } + ); + */ + } + } + }, + ] + ) + ); + await form.setup(document.querySelector("#calendar_edit_form")); + const calendar_object : _zeitbild.frontend_web.type.calendar_object = await _zeitbild.frontend_web.backend.calendar_get( + calendar_id + ); + await form.input_write(calendar_object); + return Promise.resolve(undefined); + } + ); + +} diff --git a/source/pages/calendar_edit/structure.html.tpl b/source/pages/calendar_edit/structure.html.tpl new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/source/pages/calendar_edit/structure.html.tpl @@ -0,0 +1 @@ + diff --git a/source/pages/events/logic.ts b/source/pages/events/logic.ts index 6f7eb6a..c3399ee 100644 --- a/source/pages/events/logic.ts +++ b/source/pages/events/logic.ts @@ -31,96 +31,124 @@ namespace _zeitbild.frontend_web.pages "timezone_shift": /*conf.timezone_shift*/0, } ); - target_element.querySelectorAll(".calendar-cell-regular").forEach( - (element) => { - element.addEventListener( - "click", - (event) => { - if (! (element === event.target)) { - // do nothing - } - else { - const rel : string = element.getAttribute("rel"); - const parts : Array = rel.split("-"); - const year : int = parseInt(parts[0]); - const month : int = parseInt(parts[1]); - const day : int = parseInt(parts[2]); + // sources + { + target_element.querySelectorAll(".tableview-sources-entry").forEach( + (element) => { + element.addEventListener( + "click", + (event) => { + const calendar_id : _zeitbild.frontend_web.type.calendar_id = parseInt(element.getAttribute("rel")); lib_plankton.zoo_page.set( { - "name": "event_add", + "name": "calendar_edit", "parameters": { - "calendar_id": null, - "year": year, - "month": month, - "day": day, + "read_only": false, // TODO + "calendar_id": calendar_id, } } ); } - } - ); - } - ); - target_element.querySelectorAll(".calendar-event_entry").forEach( - (element) => { - element.addEventListener( - "click", - () => { - const rel : string = element.getAttribute("rel"); - const parts : Array = rel.split("/"); - const calendar_id : _zeitbild.frontend_web.type.calendar_id = parseInt(parts[0]); - const event_id : (null | _zeitbild.frontend_web.type.local_resource_event_id) = ( - (parts[1] === "-") - ? - null - : - parseInt(parts[1]) - ); - const access_level : _zeitbild.frontend_web.type.enum_access_level = (() => { - switch (parts[2]) { - case "none": return _zeitbild.frontend_web.type.enum_access_level.none; - case "view": return _zeitbild.frontend_web.type.enum_access_level.view; - case "edit": return _zeitbild.frontend_web.type.enum_access_level.edit; - case "admin": return _zeitbild.frontend_web.type.enum_access_level.admin; + ); + } + ); + } + // cells + { + target_element.querySelectorAll(".calendar-cell-regular").forEach( + (element) => { + element.addEventListener( + "click", + (event) => { + if (! (element === event.target)) { + // do nothing } - }) (); - switch (access_level) { - case _zeitbild.frontend_web.type.enum_access_level.none: { - throw (new Error("this event should not be visible")); - break; - } - case _zeitbild.frontend_web.type.enum_access_level.view: { + else { + const rel : string = element.getAttribute("rel"); + const parts : Array = rel.split("-"); + const year : int = parseInt(parts[0]); + const month : int = parseInt(parts[1]); + const day : int = parseInt(parts[2]); lib_plankton.zoo_page.set( { - "name": "event_edit", + "name": "event_add", "parameters": { - "read_only": "yes", - "calendar_id": calendar_id, - "event_id": event_id, + "calendar_id": null, + "year": year, + "month": month, + "day": day, } } ); - break; - } - case _zeitbild.frontend_web.type.enum_access_level.edit: - case _zeitbild.frontend_web.type.enum_access_level.admin: { - lib_plankton.zoo_page.set( - { - "name": "event_edit", - "parameters": { - "read_only": "no", - "calendar_id": calendar_id, - "event_id": event_id, - } - } - ); - break; } } - } - ); - } - ); + ); + } + ); + } + // events + { + target_element.querySelectorAll(".calendar-event_entry").forEach( + (element) => { + element.addEventListener( + "click", + () => { + const rel : string = element.getAttribute("rel"); + const parts : Array = rel.split("/"); + const calendar_id : _zeitbild.frontend_web.type.calendar_id = parseInt(parts[0]); + const event_id : (null | _zeitbild.frontend_web.type.local_resource_event_id) = ( + (parts[1] === "-") + ? + null + : + parseInt(parts[1]) + ); + const access_level : _zeitbild.frontend_web.type.enum_access_level = (() => { + switch (parts[2]) { + case "none": return _zeitbild.frontend_web.type.enum_access_level.none; + case "view": return _zeitbild.frontend_web.type.enum_access_level.view; + case "edit": return _zeitbild.frontend_web.type.enum_access_level.edit; + case "admin": return _zeitbild.frontend_web.type.enum_access_level.admin; + } + }) (); + switch (access_level) { + case _zeitbild.frontend_web.type.enum_access_level.none: { + throw (new Error("this event should not be visible")); + break; + } + case _zeitbild.frontend_web.type.enum_access_level.view: { + lib_plankton.zoo_page.set( + { + "name": "event_edit", + "parameters": { + "read_only": "yes", + "calendar_id": calendar_id, + "event_id": event_id, + } + } + ); + break; + } + case _zeitbild.frontend_web.type.enum_access_level.edit: + case _zeitbild.frontend_web.type.enum_access_level.admin: { + lib_plankton.zoo_page.set( + { + "name": "event_edit", + "parameters": { + "read_only": "no", + "calendar_id": calendar_id, + "event_id": event_id, + } + } + ); + break; + } + } + } + ); + } + ); + } } }; diff --git a/source/templates/calendar_edit.html.tpl b/source/templates/calendar_edit.html.tpl new file mode 100644 index 0000000..62d2f1a --- /dev/null +++ b/source/templates/calendar_edit.html.tpl @@ -0,0 +1,5 @@ +
+

{{label}}

+
+
+
diff --git a/source/templates/events.html.tpl b/source/templates/events.html.tpl index 7ef6a8d..30f8968 100644 --- a/source/templates/events.html.tpl +++ b/source/templates/events.html.tpl @@ -10,7 +10,7 @@