frontend-dali/source/pages/overview/logic.ts

406 lines
11 KiB
TypeScript
Raw Normal View History

2025-09-25 17:54:20 +02:00
namespace _dali.pages.overview
2024-09-26 16:47:01 +02:00
{
/**
*/
lib_plankton.zoo_page.register(
"overview",
2024-09-26 16:47:01 +02:00
async (parameters, target_element) => {
// params
const view_mode : _dali.type.enum_view_mode = view_mode_determine(parameters["mode"] ?? "auto");
/**
* @todo ordentlich machen (nicht nur week und list)
*/
const set_view_mode = (view_mode) => {
const compact : boolean = (view_mode !== _dali.type.enum_view_mode.week);
target_element.querySelector("#overview").classList.toggle("overview-compact", compact);
};
// exec
2025-09-25 17:54:20 +02:00
target_element.innerHTML = await _dali.helpers.template_coin(
"overview",
"default",
2024-09-26 16:47:01 +02:00
{
}
);
// mode switcher
{
2025-10-13 13:29:19 +02:00
const widget_mode_switcher : lib_plankton.zoo_widget.interface_widget = new _dali.widgets.mode_switcher.class_widget_mode_switcher(
[
{
"mode": _dali.type.enum_view_mode.week,
"label": lib_plankton.translate.get("page.overview.mode.week"),
},
{
"mode": _dali.type.enum_view_mode.list,
"label": lib_plankton.translate.get("page.overview.mode.list"),
},
],
{
"initial_selection": view_mode,
"action_change": (view_mode) => {
lib_plankton.zoo_page.set(
{
"name": "overview",
"parameters": {
"mode": _dali.view_mode_encode(view_mode),
}
}
);
set_view_mode(view_mode);
}
}
);
set_view_mode(view_mode);
await widget_mode_switcher.load(target_element.querySelector("#overview-mode"));
}
2025-09-25 17:54:20 +02:00
let widget_weekview : _dali.widgets.weekview.class_widget_weekview;
let widget_listview : _dali.widgets.listview.class_widget_listview;
/**
* @todo update sources
*/
const update = () => {
widget_weekview.update_entries();
};
2024-10-10 23:00:51 +02:00
// hint
{
if (! await _dali.backend.is_logged_in())
{
target_element.querySelector("#overview-hint").textContent = lib_plankton.translate.get("page.overview.login_hint");
2024-10-10 23:00:51 +02:00
}
else
{
2024-10-10 23:00:51 +02:00
// do nothing
}
}
// sources
{
const data : Array<
2024-09-30 20:20:14 +02:00
{
2025-09-25 17:54:20 +02:00
id : _dali.type.calendar_id;
name : string;
2025-10-13 13:22:53 +02:00
hue : float;
2025-09-25 17:54:20 +02:00
access_level : _dali.type.enum_access_level;
2024-09-30 20:20:14 +02:00
}
2025-09-25 17:54:20 +02:00
> = await _dali.backend.calendar_list(
);
2025-09-25 17:54:20 +02:00
const widget_sources = new _dali.widgets.sources.class_widget_sources(
data,
2024-09-30 20:20:14 +02:00
{
2024-10-21 23:18:08 +02:00
"action_open": (entry) => {
2025-10-14 00:16:22 +02:00
let read_only : boolean;
switch (entry.access_level)
{
case _dali.type.enum_access_level.none:
{
throw (new Error("this event should not be visible"));
break;
}
2025-09-25 17:54:20 +02:00
case _dali.type.enum_access_level.edit:
case _dali.type.enum_access_level.view:
{
2025-10-14 00:16:22 +02:00
read_only = true;
break;
}
case _dali.type.enum_access_level.admin:
{
2025-10-14 00:16:22 +02:00
read_only = false;
break;
}
2024-09-30 20:20:14 +02:00
}
2025-10-14 00:16:22 +02:00
(async () => {
const calendar_id : _dali.type.calendar_id = entry.id;
const calendar_object : _dali.type.calendar_object = await _dali.backend.calendar_get(
calendar_id
);
const widget = new _dali.widgets.calendar_edit.class_widget_calendar_edit(
{
"read_only": read_only,
"action_cancel": () => {
_dali.overlay.toggle({"mode": false});
},
"action_change": (data) => {
_dali.backend.calendar_change(
calendar_id,
data
)
.then(
() => {
update();
_dali.overlay.toggle({"mode": false});
}
);
},
"action_remove": (data) => {
_dali.backend.calendar_remove(
calendar_id
)
.then(
() => {
update();
_dali.overlay.toggle({"mode": false});
}
);
},
"initial_value": {
"name": calendar_object.name,
"hue": calendar_object.hue,
"access": calendar_object.access,
},
}
);
_dali.overlay.clear();
_dali.overlay.toggle({"mode": true});
await widget.load(_dali.overlay.get_content_element());
}) ();
},
2024-10-21 23:18:08 +02:00
"action_toggle_visibility": (entry) => {
widget_weekview.toggle_visibility(entry.id);
widget_listview.toggle_visibility(entry.id);
2024-10-21 23:18:08 +02:00
},
2024-09-30 20:20:14 +02:00
}
);
await widget_sources.load(target_element.querySelector("#overview-pane-left"));
}
// events
{
2025-09-25 17:54:20 +02:00
const get_entries = (from_pit, to_pit, calendar_ids) => _dali.backend.events(
from_pit,
to_pit,
2024-09-30 20:20:14 +02:00
{
"calendar_ids": calendar_ids,
}
);
const action_select_event = (calendar_id, access_level, event_id) => {
/*
if (! await _dali.backend.is_logged_in())
{
// do nothing
}
else
{
}
*/
2025-10-14 00:16:22 +02:00
let read_only : boolean;
switch (access_level)
{
case _dali.type.enum_access_level.none:
{
throw (new Error("this event should not be visible"));
break;
}
case _dali.type.enum_access_level.view:
{
2025-10-14 00:16:22 +02:00
read_only = true;
break;
}
2025-09-25 17:54:20 +02:00
case _dali.type.enum_access_level.edit:
case _dali.type.enum_access_level.admin:
{
2025-10-14 00:16:22 +02:00
read_only = false;
break;
}
}
2025-10-14 00:16:22 +02:00
(async () => {
const event_object : _dali.type.event_object = await _dali.backend.calendar_event_get(
calendar_id,
event_id
);
const widget = new _dali.widgets.event_edit.class_widget_event_edit(
{
"calendar_id": calendar_id,
"event_name": event_object.name,
"event_begin": event_object.begin,
"event_end": event_object.end,
"event_location": event_object.location,
"event_link": event_object.link,
"event_description": event_object.description,
},
{
"read_only": read_only,
"action_cancel": () => {
_dali.overlay.toggle({"mode": false});
},
"action_change": (data) => {
_dali.backend.calendar_event_change(
calendar_id,
event_id,
{
"name": data.event_name,
"begin": data.event_begin,
"end": data.event_end,
"location": data.event_location,
"link": data.event_link,
"description": data.event_description,
}
)
.then(
() => {
update();
_dali.overlay.toggle({"mode": false});
}
)
.catch(
(reason) => {
lib_plankton.log.warning(
"dali.overview.event_change.error",
{"details": String(reason)}
);
}
);
},
"action_remove": () => {
_dali.backend.calendar_event_remove(
calendar_id,
event_id
)
.then(
() => {
update();
_dali.overlay.toggle({"mode": false});
}
)
.catch(
(reason) => {
lib_plankton.log.warning(
"dali.overview.event_remove_error",
{"details": String(reason)}
);
}
);
},
}
);
_dali.overlay.clear();
_dali.overlay.toggle({"mode": true});
await widget.load(_dali.overlay.get_content_element());
}) ();
};
// listview
{
2024-10-21 23:18:08 +02:00
widget_listview = (
2025-09-25 17:54:20 +02:00
new _dali.widgets.listview.class_widget_listview(
get_entries,
{
"action_select_event": action_select_event,
"action_add": () => {
lib_plankton.zoo_page.set(
{
"name": "event_add",
"parameters": {
"calendar_id": null,
"year": null,
"month": null,
"day": null,
2024-09-30 20:20:14 +02:00
}
}
);
},
}
)
);
2024-10-21 23:18:08 +02:00
await widget_listview.load(target_element.querySelector("#overview-pane-right-listview"));
}
// weekview
{
2024-10-21 23:18:08 +02:00
widget_weekview = (
2025-09-25 17:54:20 +02:00
new _dali.widgets.weekview.class_widget_weekview(
get_entries,
{
"action_select_event": action_select_event,
"action_select_day": (date) => {
/*
if (! await _dali.backend.is_logged_in())
{
// do nothing
}
else
{
}
*/
2025-10-14 00:16:22 +02:00
(async () => {
const widget = new _dali.widgets.event_edit.class_widget_event_edit(
{
"calendar_id": null,
2025-10-14 00:16:22 +02:00
"event_name": "",
"event_begin": lib_plankton.call.convey(
date,
[
x => ({
"timezone_shift": 0,
"date": date,
"time": {"hour": 12, "minute": 0, "second": 0}
}),
lib_plankton.pit.from_datetime,
x => lib_plankton.pit.shift_hour(x, 0),
lib_plankton.pit.to_datetime,
]
),
"event_end": lib_plankton.call.convey(
date,
[
x => ({
"timezone_shift": 0,
"date": date,
"time": {"hour": 12, "minute": 0, "second": 0}
}),
lib_plankton.pit.from_datetime,
x => lib_plankton.pit.shift_hour(x, +1),
lib_plankton.pit.to_datetime,
]
),
"event_location": null,
"event_link": null,
"event_description": null,
},
{
"read_only": false,
"action_cancel": () => {
_dali.overlay.toggle({"mode": false});
},
"action_add": (data) => {
_dali.backend.calendar_event_add(
data.calendar_id,
{
"name": data.event_name,
"begin": data.event_begin,
"end": data.event_end,
"location": data.event_location,
"link": data.event_link,
"description": data.event_description,
}
)
.then(
() => {
update();
_dali.overlay.toggle({"mode": false});
}
)
.catch(
(reason) => {
// todo
}
);
},
2024-09-30 20:20:14 +02:00
}
2025-10-14 00:16:22 +02:00
);
_dali.overlay.clear();
_dali.overlay.toggle({"mode": true});
await widget.load(_dali.overlay.get_content_element());
}) ();
},
2024-09-30 20:20:14 +02:00
}
)
);
2024-10-21 23:18:08 +02:00
await widget_weekview.load(target_element.querySelector("#overview-pane-right-weekview"));
}
}
2024-09-26 16:47:01 +02:00
return Promise.resolve<void>(undefined);
},
);
}