[task-408] [int]

This commit is contained in:
fenris 2025-10-14 15:56:29 +02:00
parent c97fd37040
commit 057b682bdc
4 changed files with 284 additions and 16 deletions

8
source/base/model.ts Normal file
View file

@ -0,0 +1,8 @@
namespace _dali.model
{
/**
*/
let events : Array<_dali.type.event_entry> = [];
}

View file

@ -31,6 +31,22 @@ namespace _dali.type
};
/**
* @todo deprecate?
*/
export type local_resource_event_id = int;
/**
* info: das ist nicht deckungsgleich mit der Event-ID aus dem Backend; hiermit werden sowohl lokale als auch
* extern eingebundene Events kodiert
*
* @example "local:1234"
* @example "ics:2345"
*/
export type event_id = string;
/**
*/
export type event_object = {
@ -61,7 +77,10 @@ namespace _dali.type
/**
*/
export type local_resource_event_id = int;
export type event_entry = {
id : event_id;
object : event_object;
};
/**

View file

@ -41,6 +41,14 @@ namespace _dali.widgets.weekview
private container : (null | Element);
/**
*/
private event_map : lib_plankton.map.type_map<
_dali.type.event_id,
HTMLElement
>;
/**
*/
private action_select_event : (
@ -98,6 +106,14 @@ namespace _dali.widgets.weekview
);
this.get_entries = get_entries;
this.container = null;
this.event_map = lib_plankton.map.hashmap.implementation_map(
lib_plankton.map.hashmap.make<
_dali.type.event_id,
HTMLElement
>(
event_id => event_id
)
);
this.action_select_day = options.action_select_day;
this.action_select_event = options.action_select_event;
}
@ -198,6 +214,215 @@ namespace _dali.widgets.weekview
}
/**
*/
private create_dom_entry(
sources : lib_plankton.map.type_map<
_dali.type.calendar_id,
{
name : string;
access_level : _dali.type.enum_access_level;
/**
* @todo replace with hue?
*/
color : lib_plankton.color.type_color;
}
>,
// event_entry : _dali.type.event_entry
entry : type_entry
) : HTMLElement
{
return _dali.helpers.template_coin(
"widget-weekview",
"tableview-cell-entry",
{
"color": lib_plankton.color.output_hex(
sources.get(
entry.calendar_id
).color
),
"title": class_widget_weekview.event_generate_tooltip(
sources.get(
entry.calendar_id
).name,
entry.event_object
),
"name": entry.event_object.name,
"rel": lib_plankton.string.coin(
"{{calendar_id}}/{{event_id}}/{{access_level}}",
{
"calendar_id": entry.calendar_id.toFixed(0),
"event_id": (
(entry.event_id === null)
?
"-"
:
entry.event_id.toFixed(0)
),
"access_level": (() => {
const access_level : _dali.type.enum_access_level = sources.get(entry.calendar_id).access_level;
switch (access_level)
{
case _dali.type.enum_access_level.none: return "none";
case _dali.type.enum_access_level.view: return "view";
case _dali.type.enum_access_level.edit: return "edit";
case _dali.type.enum_access_level.admin: return "admin";
}
}) (),
}
),
"additional_classes": lib_plankton.string.coin(
" access_level-{{access_level}}",
{
"access_level": (() => {
const access_level : _dali.type.enum_access_level = sources.get(entry.calendar_id).access_level;
switch (access_level)
{
case _dali.type.enum_access_level.none: return "none";
case _dali.type.enum_access_level.view: return "view";
case _dali.type.enum_access_level.edit: return "edit";
case _dali.type.enum_access_level.admin: return "admin";
}
}) (),
}
),
}
);
}
/**
*/
private add_entry(
event_entry : _dali.type.event_entry
) : void
{
const dom_entry : HTMLElement = this.create_dom_entry(event_entry);
/**
* @todo insert dom_entry into DOM
*/
this.event_map.set(
event_entry.id,
dom_entry
);
}
/**
*/
private update_entry(
event_id : _dali.type.event_id,
event_entry : _dali.type.event_entry
) : void
{
const dom_entry_old : HTMLElement = lib_plankton.map.get(
this.event_map,
event_id
);
/**
* @todo remove dom_entry_old from DOM
*/
const dom_entry_new : HTMLElement = this.create_dom_entry(event_entry);
/**
* @todo insert dom_entry_new into DOM
*/
this.event_map.set(
event_id,
dom_entry_new
);
}
/**
*/
private remove_entry(
event_id : _dali.type.event_id
) : void
{
const dom_entry : HTMLElement = lib_plankton.map.get(
this.event_map,
event_id
);
/**
* @todo remove dom_entry from DOM
*/
this.event_map.delete(
event_id
);
}
/**
*/
private sync_events(
events : Array<_dali.type.event_entry>
) : void
{
const track : Record<
string,
{
external : (null | _dali.type.event_entry);
internal : (null | _dali.type.event_id);
}
> = {};
events.forEach(
event => {
const key : string = event.id;
if (! (key in track)) track[key] = {"external": null, "internal": null};
track[key].external = event;
}
);
lib_plankton.map.dump(this.event_map).forEach(
pair => {
const key : string = pair.key;
if (! (key in track)) track[key] = {"external": null, "internal": null};
track[key].internal = pair.key;
}
);
Object.entries(track).forEach(
([key, value]) => {
if (
! (value.external !== null)
&&
! (value.internal !== null)
)
{
throw (new Error("impossible!"));
}
else if (
(value.external !== null)
&&
! (value.internal !== null)
)
{
this.add_entry(value.external);
}
else if (
(value.external !== null)
&&
(value.internal !== null)
)
{
this.update_entry(value.internal, value.external);
}
else if (
! (value.external !== null)
&&
(value.internal !== null)
)
{
this.remove_entry(value.external.id);
}
else
{
throw (new Error("impossible!"));
}
}
);
}
/**
* @todo kein "while"
*/
@ -341,7 +566,8 @@ namespace _dali.widgets.weekview
}
> = [];
let day : int = 0;
while (true) {
while (true)
{
const pit_current : lib_plankton.pit.type_pit = lib_plankton.pit.shift_day(
from_pit,
day
@ -351,7 +577,8 @@ namespace _dali.widgets.weekview
pit_current,
to_pit
)
) {
)
{
day += 1;
row.push(
{
@ -360,7 +587,8 @@ namespace _dali.widgets.weekview
"today": false, // TODO
}
);
if (day % 7 === 0) {
if (day % 7 === 0)
{
result.rows.push(
{
"week": (
@ -375,11 +603,13 @@ namespace _dali.widgets.weekview
);
row = [];
}
else {
else
{
// do nothing
}
}
else {
else
{
break;
}
}
@ -731,10 +961,12 @@ namespace _dali.widgets.weekview
const context : Element = this.container;
// controls
{
if (! options.update_controls) {
if (! options.update_controls)
{
// do nothing
}
else {
else
{
(context.querySelector(".weekview-control-year > input") as HTMLInputElement).value = year.toFixed(0);
(context.querySelector(".weekview-control-week > input") as HTMLInputElement).value = week.toFixed(0);
(context.querySelector(".weekview-control-count > input") as HTMLInputElement).value = count.toFixed(0);
@ -760,19 +992,23 @@ namespace _dali.widgets.weekview
);
// cells
{
if (! await _dali.backend.is_logged_in()) {
if (! await _dali.backend.is_logged_in())
{
// do nothing
}
else {
else
{
context.querySelectorAll(".weekview-cell-regular").forEach(
(element) => {
element.addEventListener(
"click",
(event) => {
if (! (element === event.target)) {
if (! (element === event.target))
{
// do nothing
}
else {
else
{
const rel : string = element.getAttribute("rel");
const parts : Array<string> = rel.split("-");
const date : lib_plankton.pit.type_date = {
@ -790,10 +1026,12 @@ namespace _dali.widgets.weekview
}
// events
{
if (! await _dali.backend.is_logged_in()) {
if (! await _dali.backend.is_logged_in())
{
// do nothing
}
else {
else
{
context.querySelectorAll(".weekview-event_entry").forEach(
(element) => {
element.addEventListener(
@ -864,10 +1102,12 @@ namespace _dali.widgets.weekview
const rel : string = element.getAttribute("rel");
const parts : Array<string> = rel.split("/");
const calendar_id_ : _dali.type.calendar_id = parseInt(parts[0]);
if (! (calendar_id === calendar_id_)) {
if (! (calendar_id === calendar_id_))
{
// do nothing
}
else {
else
{
element.classList.toggle("weekview-cell-hidden");
}
}

View file

@ -136,6 +136,7 @@ ${dir_temp}/logic-unlinked.js: \
${dir_source}/base/helpers.ts \
${dir_source}/base/types.ts \
${dir_source}/base/functions.ts \
${dir_source}/base/model.ts \
${dir_source}/resources/conf.ts \
${dir_source}/resources/backend.ts \
${dir_source}/widgets/sources/logic.ts \