Pages durch Widgets ablösen #2
8
source/base/model.ts
Normal file
8
source/base/model.ts
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
namespace _dali.model
|
||||
{
|
||||
|
||||
/**
|
||||
*/
|
||||
let events : Array<_dali.type.event_entry> = [];
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 \
|
||||
|
|
|
|||
Loading…
Reference in a new issue