[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_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,7 +393,8 @@ namespace _zeitbild.frontend_web.backend
options
);
return call(
return (
call(
lib_plankton.http.enum_method.get,
"/events",
Object.assign(
@ -408,6 +410,21 @@ namespace _zeitbild.frontend_web.backend
{"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,
{
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<string>(
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";
}
}) (),
}
),
}

View file

@ -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",
{

View file

@ -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<void>(undefined);
}
);

View file

@ -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",
{

View file

@ -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<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(
(element) => {
element.addEventListener(
@ -38,6 +69,26 @@ namespace _zeitbild.frontend_web.pages
:
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: {
// 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",
@ -47,6 +98,9 @@ namespace _zeitbild.frontend_web.pages
}
}
);
break;
}
}
}
);
}

View file

@ -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"],

View file

@ -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(

View file

@ -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(
{

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 {
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;
}

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}}
</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}}">
{{day}}
</span>