From 9786a7cae7d210cb04c2907f9c38a99c0fb39100 Mon Sep 17 00:00:00 2001 From: Fenris Wolf Date: Mon, 30 Sep 2024 13:28:42 +0200 Subject: [PATCH] =?UTF-8?q?[mod]=20page:events:Zugriffs-Level=20ber=C3=BCc?= =?UTF-8?q?ksichtigen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/logic/backend.ts | 45 ++++++++---- source/logic/view.ts | 47 ++++++++++++- source/pages/calendar_add/logic.ts | 1 + source/pages/event_add/logic.ts | 66 +++++++++++++++-- source/pages/event_edit/logic.ts | 1 + source/pages/events/logic.ts | 70 ++++++++++++++++--- source/pages/login/logic.ts | 1 + source/pages/logout/logic.ts | 1 + source/pages/oidc_finish/logic.ts | 1 + source/style/hacks.css | 4 ++ source/style/main.css | 15 ++++ .../templates/tableview-cell-entry.html.tpl | 2 +- source/templates/tableview-cell.html.tpl | 2 +- 13 files changed, 225 insertions(+), 31 deletions(-) create mode 100644 source/style/hacks.css diff --git a/source/logic/backend.ts b/source/logic/backend.ts index 32b2b7e..4e89d19 100644 --- a/source/logic/backend.ts +++ b/source/logic/backend.ts @@ -379,6 +379,7 @@ namespace _zeitbild.frontend_web.backend { calendar_id : _zeitbild.frontend_web.type.calendar_id; calendar_name : string; + access_level : _zeitbild.frontend_web.type.enum_access_level; event_id : (null | _zeitbild.frontend_web.type.local_resource_event_id); event_object : _zeitbild.frontend_web.type.event_object; } @@ -392,20 +393,36 @@ namespace _zeitbild.frontend_web.backend options ); - return call( - lib_plankton.http.enum_method.get, - "/events", - Object.assign( - { - "from": from_pit, - "to": to_pit, - }, - ( - (options.calendar_ids === null) - ? - {} - : - {"calendar_ids": options.calendar_ids.join(",")} + return ( + call( + lib_plankton.http.enum_method.get, + "/events", + Object.assign( + { + "from": from_pit, + "to": to_pit, + }, + ( + (options.calendar_ids === null) + ? + {} + : + {"calendar_ids": options.calendar_ids.join(",")} + ) + ) + ) + .then( + (data) => Promise.resolve( + data + .map( + (entry) => ({ + "calendar_id": entry.calendar_id, + "calendar_name": entry.calendar_name, + "access_level": access_level_decode(entry.access_level), + "event_id": entry.event_id, + "event_object": entry.event_object, + }) + ) ) ) ); diff --git a/source/logic/view.ts b/source/logic/view.ts index 22301bd..eadd1e3 100644 --- a/source/logic/view.ts +++ b/source/logic/view.ts @@ -154,6 +154,7 @@ namespace _zeitbild.frontend_web.view _zeitbild.frontend_web.type.calendar_id, { name : string; + access_level : _zeitbild.frontend_web.type.enum_access_level; } >; rows : Array< @@ -204,6 +205,7 @@ namespace _zeitbild.frontend_web.view { calendar_id : _zeitbild.frontend_web.type.calendar_id; calendar_name : string; + access_level : _zeitbild.frontend_web.type.enum_access_level; event_id : (null | _zeitbild.frontend_web.type.local_resource_event_id); event_object : _zeitbild.frontend_web.type.event_object; } @@ -219,6 +221,7 @@ namespace _zeitbild.frontend_web.view _zeitbild.frontend_web.type.calendar_id, { name : string; + access_level : _zeitbild.frontend_web.type.enum_access_level; } >; rows : Array< @@ -252,6 +255,7 @@ namespace _zeitbild.frontend_web.view "key": entry.calendar_id, "value": { "name": entry.calendar_name, + "access_level": entry.access_level, } } ) @@ -428,6 +432,7 @@ namespace _zeitbild.frontend_web.view _zeitbild.frontend_web.type.calendar_id, { name : string; + access_level : _zeitbild.frontend_web.type.enum_access_level; } >; rows : Array< @@ -458,6 +463,7 @@ namespace _zeitbild.frontend_web.view _zeitbild.frontend_web.type.calendar_id, { name : string; + access_level : _zeitbild.frontend_web.type.enum_access_level; color : lib_plankton.color.type_color; } > = lib_plankton.map.hashmap.implementation_map( @@ -473,6 +479,7 @@ namespace _zeitbild.frontend_web.view "key": pair.key, "value": { "name": pair.value.name, + "access_level": pair.value.access_level, "color": lib_plankton.color.give_generic( (pair.key - 1), { @@ -498,6 +505,7 @@ namespace _zeitbild.frontend_web.view "tableview-sources-entry", { "name": data.name, + // "access_level": data.access_level, "color": lib_plankton.color.output_hex(data.color), "rel": calendar_id.toFixed(0), } @@ -553,6 +561,20 @@ namespace _zeitbild.frontend_web.view ), ] ), + "rel": lib_plankton.call.convey( + cell.pit, + [ + lib_plankton.pit.to_datetime, + (x : lib_plankton.pit.type_datetime) => lib_plankton.string.coin( + "{{year}}-{{month}}-{{day}}", + { + "year": x.date.year.toFixed(0).padStart(4, "0"), + "month": x.date.month.toFixed(0).padStart(2, "0"), + "day": x.date.day.toFixed(0).padStart(2, "0"), + } + ) + ] + ), "entries": ( await _zeitbild.frontend_web.helpers.promise_row( cell.entries @@ -573,7 +595,7 @@ namespace _zeitbild.frontend_web.view ), "name": entry.event_object.name, "rel": lib_plankton.string.coin( - "{{calendar_id}}/{{event_id}}", + "{{calendar_id}}/{{event_id}}/{{access_level}}", { "calendar_id": entry.calendar_id.toFixed(0), "event_id": ( @@ -583,6 +605,29 @@ namespace _zeitbild.frontend_web.view : entry.event_id.toFixed(0) ), + "access_level": (() => { + const access_level : _zeitbild.frontend_web.type.enum_access_level = sources.get(entry.calendar_id).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"; + } + }) (), + } + ), + "additional_classes": lib_plankton.string.coin( + " access_level-{{access_level}}", + { + "access_level": (() => { + const access_level : _zeitbild.frontend_web.type.enum_access_level = sources.get(entry.calendar_id).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"; + } + }) (), } ), } diff --git a/source/pages/calendar_add/logic.ts b/source/pages/calendar_add/logic.ts index 7cbd980..9d0b3cc 100644 --- a/source/pages/calendar_add/logic.ts +++ b/source/pages/calendar_add/logic.ts @@ -6,6 +6,7 @@ namespace _zeitbild.frontend_web.pages lib_plankton.zoo_page.register( "calendar_add", async (parameters, target_element) => { + target_element.innerHTML = ""; target_element.innerHTML = await _zeitbild.frontend_web.helpers.template_coin( "calendar_add", { diff --git a/source/pages/event_add/logic.ts b/source/pages/event_add/logic.ts index d857f0c..4c91ca7 100644 --- a/source/pages/event_add/logic.ts +++ b/source/pages/event_add/logic.ts @@ -6,7 +6,52 @@ namespace _zeitbild.frontend_web.pages lib_plankton.zoo_page.register( "event_add", async (parameters, target_element) => { - const calendar_id : int = parseInt(parameters["calendar_id"]); + const calendar_id : (null | int) = ( + ("calendar_id" in parameters) + ? + parseInt(parameters["calendar_id"]) + : + null + ); + const year : (null | int) = ( + ("year" in parameters) + ? + parseInt(parameters["year"]) + : + null + ); + const month : (null | int) = ( + ("month" in parameters) + ? + parseInt(parameters["month"]) + : + null + ); + const day : (null | int) = ( + ("day" in parameters) + ? + parseInt(parameters["day"]) + : + null + ); + const date : lib_plankton.pit.type_date = ( + ( + (year !== null) + && + (month !== null) + && + (day !== null) + ) + ? + { + "year": year, + "month": month, + "day": day, + } + : + lib_plankton.pit.to_datetime(lib_plankton.pit.now()).date + ); + target_element.innerHTML = ""; target_element.innerHTML = await _zeitbild.frontend_web.helpers.template_coin( "event_add", { @@ -158,14 +203,23 @@ namespace _zeitbild.frontend_web.pages }, ] ); - /* - await form.write( + await form.setup(document.querySelector("#event_add_form")); + await form.input_write( { - "calendar_id": parameters["calendar_id"], + "calendar_id": (calendar_id ?? 0), + "event_object": { + "name": "", + "begin": { + "timezone_shift": 0, + "date": date, + "time": null + }, + "end": null, + "location": null, + "description": null, + } } ); - */ - await form.setup(document.querySelector("#event_add_form")); return Promise.resolve(undefined); } ); diff --git a/source/pages/event_edit/logic.ts b/source/pages/event_edit/logic.ts index 46ed671..b52ad08 100644 --- a/source/pages/event_edit/logic.ts +++ b/source/pages/event_edit/logic.ts @@ -8,6 +8,7 @@ namespace _zeitbild.frontend_web.pages async (parameters, target_element) => { const calendar_id : int = parseInt(parameters["calendar_id"]); const event_id : int = parseInt(parameters["event_id"]); + target_element.innerHTML = ""; target_element.innerHTML = await _zeitbild.frontend_web.helpers.template_coin( "event_edit", { diff --git a/source/pages/events/logic.ts b/source/pages/events/logic.ts index 18daa5d..4429938 100644 --- a/source/pages/events/logic.ts +++ b/source/pages/events/logic.ts @@ -6,6 +6,7 @@ namespace _zeitbild.frontend_web.pages lib_plankton.zoo_page.register( "events", async (parameters, target_element) => { + target_element.innerHTML = ""; const content : string = await _zeitbild.frontend_web.view.calendar_view_table_html( { "calendar_ids": null, @@ -23,6 +24,36 @@ namespace _zeitbild.frontend_web.pages } ); target_element.innerHTML = content; + 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]); + lib_plankton.zoo_page.set( + { + "name": "event_add", + "parameters": { + "calendar_id": null, + "year": year, + "month": month, + "day": day, + } + } + ); + } + } + ); + } + ); target_element.querySelectorAll(".calendar-event_entry").forEach( (element) => { element.addEventListener( @@ -38,15 +69,38 @@ namespace _zeitbild.frontend_web.pages : parseInt(parts[1]) ); - lib_plankton.zoo_page.set( - { - "name": "event_edit", - "parameters": { - "calendar_id": calendar_id, - "event_id": event_id, - } + 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: { + // do nothing + // TODO: edit_view? + 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": { + "calendar_id": calendar_id, + "event_id": event_id, + } + } + ); + break; + } + } } ); } diff --git a/source/pages/login/logic.ts b/source/pages/login/logic.ts index 9d0c6ab..f75e278 100644 --- a/source/pages/login/logic.ts +++ b/source/pages/login/logic.ts @@ -6,6 +6,7 @@ namespace _zeitbild.frontend_web.pages lib_plankton.zoo_page.register( "login", async (parameters, target_element) => { + target_element.innerHTML = ""; const preparation : {kind : string; data : any;} = await _zeitbild.frontend_web.backend.session_prepare( { "oidc_redirect_uri_template": _zeitbild.frontend_web.conf.get()["misc"]["oidc_redirect_uri_template"], diff --git a/source/pages/logout/logic.ts b/source/pages/logout/logic.ts index bddb58f..11e25af 100644 --- a/source/pages/logout/logic.ts +++ b/source/pages/logout/logic.ts @@ -6,6 +6,7 @@ namespace _zeitbild.frontend_web.pages lib_plankton.zoo_page.register( "logout", async (parameters, target_element) => { + target_element.innerHTML = ""; await _zeitbild.frontend_web.backend.session_end( ); lib_plankton.zoo_page.set( diff --git a/source/pages/oidc_finish/logic.ts b/source/pages/oidc_finish/logic.ts index 30615ca..84ee74d 100644 --- a/source/pages/oidc_finish/logic.ts +++ b/source/pages/oidc_finish/logic.ts @@ -6,6 +6,7 @@ namespace _zeitbild.frontend_web.pages lib_plankton.zoo_page.register( "oidc_finish", async (parameters, target_element) => { + target_element.innerHTML = ""; await _zeitbild.frontend_web.backend.set_session_key(parameters["session_key"]); lib_plankton.zoo_page.set( { diff --git a/source/style/hacks.css b/source/style/hacks.css new file mode 100644 index 0000000..de17306 --- /dev/null +++ b/source/style/hacks.css @@ -0,0 +1,4 @@ +.plankton_input_group_field[rel="resource_kind"] +{ + display: none; +} diff --git a/source/style/main.css b/source/style/main.css index 63287bb..8f197b9 100644 --- a/source/style/main.css +++ b/source/style/main.css @@ -90,6 +90,8 @@ a:hover { .calendar-cell-regular { width: 13.5%; height: 120px; + + cursor: copy; } .calendar-cell-today { @@ -113,6 +115,19 @@ a:hover { font-size: 0.75em; color: #FFF; font-weight: bold; +} + +.calendar-event_entry.access_level-none +, +.calendar-event_entry.access_level-view +{ + cursor: default; +} + +.calendar-event_entry.access_level-edit +, +.calendar-event_entry.access_level-admin +{ cursor: pointer; } diff --git a/source/templates/tableview-cell-entry.html.tpl b/source/templates/tableview-cell-entry.html.tpl index 49658fe..d4ca0b3 100644 --- a/source/templates/tableview-cell-entry.html.tpl +++ b/source/templates/tableview-cell-entry.html.tpl @@ -1,3 +1,3 @@ -
  • +
  • {{name}}
  • diff --git a/source/templates/tableview-cell.html.tpl b/source/templates/tableview-cell.html.tpl index fa4a53f..17cdd14 100644 --- a/source/templates/tableview-cell.html.tpl +++ b/source/templates/tableview-cell.html.tpl @@ -1,4 +1,4 @@ - + {{day}}