diff --git a/source/base/model.ts b/source/base/model.ts new file mode 100644 index 0000000..26847c6 --- /dev/null +++ b/source/base/model.ts @@ -0,0 +1,8 @@ +namespace _dali.model +{ + + /** + */ + let events : Array<_dali.type.event_entry> = []; + +} diff --git a/source/base/types.ts b/source/base/types.ts index da79c50..e97b1d9 100644 --- a/source/base/types.ts +++ b/source/base/types.ts @@ -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; + }; /** diff --git a/source/widgets/weekview/logic.ts b/source/widgets/weekview/logic.ts index c6a4484..a6265a5 100644 --- a/source/widgets/weekview/logic.ts +++ b/source/widgets/weekview/logic.ts @@ -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 = 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 = 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"); } } diff --git a/tools/makefile b/tools/makefile index 89727f0..9788fe7 100644 --- a/tools/makefile +++ b/tools/makefile @@ -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 \