[mod] page:events:Zugriffs-Level berücksichtigen

This commit is contained in:
Fenris Wolf 2024-09-30 13:28:42 +02:00
parent 8b33fa8e25
commit 9786a7cae7
13 changed files with 225 additions and 31 deletions

View file

@ -379,6 +379,7 @@ namespace _zeitbild.frontend_web.backend
{ {
calendar_id : _zeitbild.frontend_web.type.calendar_id; calendar_id : _zeitbild.frontend_web.type.calendar_id;
calendar_name : string; calendar_name : string;
access_level : _zeitbild.frontend_web.type.enum_access_level;
event_id : (null | _zeitbild.frontend_web.type.local_resource_event_id); event_id : (null | _zeitbild.frontend_web.type.local_resource_event_id);
event_object : _zeitbild.frontend_web.type.event_object; event_object : _zeitbild.frontend_web.type.event_object;
} }
@ -392,20 +393,36 @@ namespace _zeitbild.frontend_web.backend
options options
); );
return call( return (
lib_plankton.http.enum_method.get, call(
"/events", lib_plankton.http.enum_method.get,
Object.assign( "/events",
{ Object.assign(
"from": from_pit, {
"to": to_pit, "from": from_pit,
}, "to": to_pit,
( },
(options.calendar_ids === null) (
? (options.calendar_ids === null)
{} ?
: {}
{"calendar_ids": options.calendar_ids.join(",")} :
{"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,
})
)
) )
) )
); );

View file

@ -154,6 +154,7 @@ namespace _zeitbild.frontend_web.view
_zeitbild.frontend_web.type.calendar_id, _zeitbild.frontend_web.type.calendar_id,
{ {
name : string; name : string;
access_level : _zeitbild.frontend_web.type.enum_access_level;
} }
>; >;
rows : Array< rows : Array<
@ -204,6 +205,7 @@ namespace _zeitbild.frontend_web.view
{ {
calendar_id : _zeitbild.frontend_web.type.calendar_id; calendar_id : _zeitbild.frontend_web.type.calendar_id;
calendar_name : string; calendar_name : string;
access_level : _zeitbild.frontend_web.type.enum_access_level;
event_id : (null | _zeitbild.frontend_web.type.local_resource_event_id); event_id : (null | _zeitbild.frontend_web.type.local_resource_event_id);
event_object : _zeitbild.frontend_web.type.event_object; event_object : _zeitbild.frontend_web.type.event_object;
} }
@ -219,6 +221,7 @@ namespace _zeitbild.frontend_web.view
_zeitbild.frontend_web.type.calendar_id, _zeitbild.frontend_web.type.calendar_id,
{ {
name : string; name : string;
access_level : _zeitbild.frontend_web.type.enum_access_level;
} }
>; >;
rows : Array< rows : Array<
@ -252,6 +255,7 @@ namespace _zeitbild.frontend_web.view
"key": entry.calendar_id, "key": entry.calendar_id,
"value": { "value": {
"name": entry.calendar_name, "name": entry.calendar_name,
"access_level": entry.access_level,
} }
} }
) )
@ -428,6 +432,7 @@ namespace _zeitbild.frontend_web.view
_zeitbild.frontend_web.type.calendar_id, _zeitbild.frontend_web.type.calendar_id,
{ {
name : string; name : string;
access_level : _zeitbild.frontend_web.type.enum_access_level;
} }
>; >;
rows : Array< rows : Array<
@ -458,6 +463,7 @@ namespace _zeitbild.frontend_web.view
_zeitbild.frontend_web.type.calendar_id, _zeitbild.frontend_web.type.calendar_id,
{ {
name : string; name : string;
access_level : _zeitbild.frontend_web.type.enum_access_level;
color : lib_plankton.color.type_color; color : lib_plankton.color.type_color;
} }
> = lib_plankton.map.hashmap.implementation_map( > = lib_plankton.map.hashmap.implementation_map(
@ -473,6 +479,7 @@ namespace _zeitbild.frontend_web.view
"key": pair.key, "key": pair.key,
"value": { "value": {
"name": pair.value.name, "name": pair.value.name,
"access_level": pair.value.access_level,
"color": lib_plankton.color.give_generic( "color": lib_plankton.color.give_generic(
(pair.key - 1), (pair.key - 1),
{ {
@ -498,6 +505,7 @@ namespace _zeitbild.frontend_web.view
"tableview-sources-entry", "tableview-sources-entry",
{ {
"name": data.name, "name": data.name,
// "access_level": data.access_level,
"color": lib_plankton.color.output_hex(data.color), "color": lib_plankton.color.output_hex(data.color),
"rel": calendar_id.toFixed(0), "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": ( "entries": (
await _zeitbild.frontend_web.helpers.promise_row<string>( await _zeitbild.frontend_web.helpers.promise_row<string>(
cell.entries cell.entries
@ -573,7 +595,7 @@ namespace _zeitbild.frontend_web.view
), ),
"name": entry.event_object.name, "name": entry.event_object.name,
"rel": lib_plankton.string.coin( "rel": lib_plankton.string.coin(
"{{calendar_id}}/{{event_id}}", "{{calendar_id}}/{{event_id}}/{{access_level}}",
{ {
"calendar_id": entry.calendar_id.toFixed(0), "calendar_id": entry.calendar_id.toFixed(0),
"event_id": ( "event_id": (
@ -583,6 +605,29 @@ namespace _zeitbild.frontend_web.view
: :
entry.event_id.toFixed(0) 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";
}
}) (),
} }
), ),
} }

View file

@ -6,6 +6,7 @@ namespace _zeitbild.frontend_web.pages
lib_plankton.zoo_page.register( lib_plankton.zoo_page.register(
"calendar_add", "calendar_add",
async (parameters, target_element) => { async (parameters, target_element) => {
target_element.innerHTML = "";
target_element.innerHTML = await _zeitbild.frontend_web.helpers.template_coin( target_element.innerHTML = await _zeitbild.frontend_web.helpers.template_coin(
"calendar_add", "calendar_add",
{ {

View file

@ -6,7 +6,52 @@ namespace _zeitbild.frontend_web.pages
lib_plankton.zoo_page.register( lib_plankton.zoo_page.register(
"event_add", "event_add",
async (parameters, target_element) => { 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( target_element.innerHTML = await _zeitbild.frontend_web.helpers.template_coin(
"event_add", "event_add",
{ {
@ -158,14 +203,23 @@ namespace _zeitbild.frontend_web.pages
}, },
] ]
); );
/* await form.setup(document.querySelector("#event_add_form"));
await form.write( 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<void>(undefined); return Promise.resolve<void>(undefined);
} }
); );

View file

@ -8,6 +8,7 @@ namespace _zeitbild.frontend_web.pages
async (parameters, target_element) => { async (parameters, target_element) => {
const calendar_id : int = parseInt(parameters["calendar_id"]); const calendar_id : int = parseInt(parameters["calendar_id"]);
const event_id : int = parseInt(parameters["event_id"]); const event_id : int = parseInt(parameters["event_id"]);
target_element.innerHTML = "";
target_element.innerHTML = await _zeitbild.frontend_web.helpers.template_coin( target_element.innerHTML = await _zeitbild.frontend_web.helpers.template_coin(
"event_edit", "event_edit",
{ {

View file

@ -6,6 +6,7 @@ namespace _zeitbild.frontend_web.pages
lib_plankton.zoo_page.register( lib_plankton.zoo_page.register(
"events", "events",
async (parameters, target_element) => { async (parameters, target_element) => {
target_element.innerHTML = "";
const content : string = await _zeitbild.frontend_web.view.calendar_view_table_html( const content : string = await _zeitbild.frontend_web.view.calendar_view_table_html(
{ {
"calendar_ids": null, "calendar_ids": null,
@ -23,6 +24,36 @@ namespace _zeitbild.frontend_web.pages
} }
); );
target_element.innerHTML = content; 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<string> = 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( target_element.querySelectorAll(".calendar-event_entry").forEach(
(element) => { (element) => {
element.addEventListener( element.addEventListener(
@ -38,15 +69,38 @@ namespace _zeitbild.frontend_web.pages
: :
parseInt(parts[1]) parseInt(parts[1])
); );
lib_plankton.zoo_page.set( const access_level : _zeitbild.frontend_web.type.enum_access_level = (() => {
{ switch (parts[2]) {
"name": "event_edit", case "none": return _zeitbild.frontend_web.type.enum_access_level.none;
"parameters": { case "view": return _zeitbild.frontend_web.type.enum_access_level.view;
"calendar_id": calendar_id, case "edit": return _zeitbild.frontend_web.type.enum_access_level.edit;
"event_id": event_id, 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;
}
}
} }
); );
} }

View file

@ -6,6 +6,7 @@ namespace _zeitbild.frontend_web.pages
lib_plankton.zoo_page.register( lib_plankton.zoo_page.register(
"login", "login",
async (parameters, target_element) => { async (parameters, target_element) => {
target_element.innerHTML = "";
const preparation : {kind : string; data : any;} = await _zeitbild.frontend_web.backend.session_prepare( 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"], "oidc_redirect_uri_template": _zeitbild.frontend_web.conf.get()["misc"]["oidc_redirect_uri_template"],

View file

@ -6,6 +6,7 @@ namespace _zeitbild.frontend_web.pages
lib_plankton.zoo_page.register( lib_plankton.zoo_page.register(
"logout", "logout",
async (parameters, target_element) => { async (parameters, target_element) => {
target_element.innerHTML = "";
await _zeitbild.frontend_web.backend.session_end( await _zeitbild.frontend_web.backend.session_end(
); );
lib_plankton.zoo_page.set( lib_plankton.zoo_page.set(

View file

@ -6,6 +6,7 @@ namespace _zeitbild.frontend_web.pages
lib_plankton.zoo_page.register( lib_plankton.zoo_page.register(
"oidc_finish", "oidc_finish",
async (parameters, target_element) => { async (parameters, target_element) => {
target_element.innerHTML = "";
await _zeitbild.frontend_web.backend.set_session_key(parameters["session_key"]); await _zeitbild.frontend_web.backend.set_session_key(parameters["session_key"]);
lib_plankton.zoo_page.set( lib_plankton.zoo_page.set(
{ {

4
source/style/hacks.css Normal file
View file

@ -0,0 +1,4 @@
.plankton_input_group_field[rel="resource_kind"]
{
display: none;
}

View file

@ -90,6 +90,8 @@ a:hover {
.calendar-cell-regular { .calendar-cell-regular {
width: 13.5%; width: 13.5%;
height: 120px; height: 120px;
cursor: copy;
} }
.calendar-cell-today { .calendar-cell-today {
@ -113,6 +115,19 @@ a:hover {
font-size: 0.75em; font-size: 0.75em;
color: #FFF; color: #FFF;
font-weight: bold; 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; cursor: pointer;
} }

View file

@ -1,3 +1,3 @@
<li class="calendar-event_entry" style="background-color: {{color}};" title="{{title}}" rel="{{rel}}"> <li class="calendar-event_entry{{additional_classes}}" style="background-color: {{color}};" title="{{title}}" rel="{{rel}}">
{{name}} {{name}}
</li> </li>

View file

@ -1,4 +1,4 @@
<td class="calendar-cell calendar-cell-regular{{extra_classes}}"> <td class="calendar-cell calendar-cell-regular{{extra_classes}}" rel="{{rel}}">
<span class="calendar-day" title="{{title}}"> <span class="calendar-day" title="{{title}}">
{{day}} {{day}}
</span> </span>