[mod] page:events:Zugriffs-Level berücksichtigen
This commit is contained in:
parent
8b33fa8e25
commit
9786a7cae7
13 changed files with 225 additions and 31 deletions
|
@ -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,
|
||||||
|
})
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
@ -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";
|
||||||
|
}
|
||||||
|
}) (),
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
|
@ -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",
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"],
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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
4
source/style/hacks.css
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
.plankton_input_group_field[rel="resource_kind"]
|
||||||
|
{
|
||||||
|
display: none;
|
||||||
|
}
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Add table
Reference in a new issue