[mod] Aufräum-Aktionen und kleinere Anpassungen

This commit is contained in:
fenris 2025-10-29 11:40:27 +01:00
parent 58fc2ea97f
commit b0bd963145
17 changed files with 210 additions and 174 deletions

View file

@ -138,6 +138,25 @@ namespace _dali.helpers
} }
/**
*/
export async function element_from_template(
group : string,
name : string,
data : Record<string, string>
)
: Promise<HTMLElement>
{
const dom_dummy = document.createElement("div");
dom_dummy.innerHTML = await _dali.helpers.template_coin(
group,
name,
data
);
return (dom_dummy.children[0] as HTMLElement);
}
/** /**
* @todo outsource * @todo outsource
*/ */
@ -145,7 +164,8 @@ namespace _dali.helpers
members : Array< members : Array<
() => Promise<type_result> () => Promise<type_result>
> >
) : Promise< )
: Promise<
Array< Array<
type_result type_result
> >
@ -162,7 +182,8 @@ namespace _dali.helpers
/** /**
*/ */
export function input_access_level( export function input_access_level(
) : lib_plankton.zoo_input.interface_input<_dali.enum_access_level> )
: lib_plankton.zoo_input.interface_input<_dali.enum_access_level>
{ {
return ( return (
new lib_plankton.zoo_input.class_input_wrapped< new lib_plankton.zoo_input.class_input_wrapped<
@ -283,7 +304,8 @@ namespace _dali.helpers
/** /**
*/ */
export function datetime_input( export function datetime_input(
) : lib_plankton.zoo_input.interface_input<lib_plankton.pit.type_datetime> )
: lib_plankton.zoo_input.interface_input<lib_plankton.pit.type_datetime>
{ {
return ( return (
_dali.conf.get().misc.use_central_europe_specific_datetime_inputs _dali.conf.get().misc.use_central_europe_specific_datetime_inputs
@ -364,7 +386,7 @@ namespace _dali.helpers
} }
else else
{ {
_dali.overlay.get_content_element().innerHTML = "[...]"; _dali.overlay.get_content_element().innerHTML = ". . .";
_dali.overlay.toggle({"mode": true}); _dali.overlay.toggle({"mode": true});
} }
} }

View file

@ -1,9 +0,0 @@
.plankton_input_group_field[rel="resource"]
{
display: none;
}
.weekview-control-count
{
display: none !important;
}

View file

@ -20,72 +20,6 @@ header
margin-bottom: 16px; margin-bottom: 16px;
} }
#overlay
{
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: hsla(var(--hue), 0%, 0%, 0.75);
z-index: 2;
}
#overlay_content
{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
-ms-transform: translate(-50%,-50%);
padding: 32px;
background-color: hsl(0, 0%, 12.5%);
color: hsl(0, 0%, 100%);
}
#overlay:not(.overlay_active)
{
display: none;
}
nav > ul
{
list-style-type: none;
margin: 0;
padding: 0;
}
nav > ul > li
{
display: inline-block;
margin: 8px;
padding: 8px;
}
nav > ul > li:not(.active)
{
display: none;
}
nav a
{
padding: 8px;
text-decoration: none;
color: hsl(var(--hue), 0%, 87.5%);
}
nav a:hover
{
color: hsl(var(--hue), 0%, 100%);
border-bottom: 2px solid hsl(0, 0%, 100%);
transition: 1s ease color;
}
a a
{ {
text-decoration: none; text-decoration: none;
@ -101,7 +35,7 @@ a:hover
button button
{ {
padding: 4px 8px; padding: 8px 12px;
text-transform: uppercase; text-transform: uppercase;
cursor: pointer; cursor: pointer;

32
source/style/overlay.css Normal file
View file

@ -0,0 +1,32 @@
#overlay
{
position: fixed;
width: 100%;
height: 100%;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: hsla(var(--hue), 0%, 0%, 0.75);
z-index: 2;
}
#overlay_content
{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
-ms-transform: translate(-50%,-50%);
padding: 32px;
background-color: hsl(0, 0%, 12.5%);
color: hsl(0, 0%, 100%);
}
#overlay:not(.overlay_active)
{
display: none;
}

View file

@ -111,6 +111,13 @@ namespace _dali.widgets
target_element : HTMLElement target_element : HTMLElement
) : Promise<void> ) : Promise<void>
{ {
const dom_root = await _dali.helpers.element_from_template(
"widget-calendar_edit",
"main",
{
}
);
const form : lib_plankton.zoo_form.class_form< const form : lib_plankton.zoo_form.class_form<
_dali.type_calendar_object, _dali.type_calendar_object,
_dali.type_calendar_object _dali.type_calendar_object
@ -243,9 +250,11 @@ namespace _dali.widgets
) )
) )
); );
await form.setup(target_element); await form.setup(dom_root);
await form.input_lock(this.read_only); await form.input_lock(this.read_only);
await form.input_write(this.initial_value); await form.input_write(this.initial_value);
target_element.appendChild(dom_root);
} }
} }

View file

@ -0,0 +1,4 @@
.widget-calendar_edit .plankton_input_group_field[rel="resource"]
{
display: none;
}

View file

@ -0,0 +1,2 @@
<div class="widget-calendar_edit">
</div>

View file

@ -154,6 +154,13 @@ namespace _dali.widgets
target_element : HTMLElement target_element : HTMLElement
) : Promise<void> ) : Promise<void>
{ {
const dom_root = await _dali.helpers.element_from_template(
"widget-event_edit",
"main",
{
}
);
const form : lib_plankton.zoo_form.class_form< const form : lib_plankton.zoo_form.class_form<
type_value, type_value,
type_representation type_representation
@ -316,9 +323,11 @@ namespace _dali.widgets
) )
) )
); );
await form.setup(target_element); await form.setup(dom_root);
await form.input_lock(this.read_only); await form.input_lock(this.read_only);
await form.input_write(this.initial_value); await form.input_write(this.initial_value);
target_element.appendChild(dom_root);
} }
} }

View file

@ -0,0 +1,2 @@
<div class="widget-event_edit">
</div>

View file

@ -37,12 +37,7 @@ namespace _dali.widgets
/** /**
*/ */
private entries : Array< private entries : Array<type_entry_data>;
{
data : type_entry_data;
element : (null | HTMLElement);
}
>;
/** /**
@ -63,7 +58,7 @@ namespace _dali.widgets
/** /**
*/ */
public constructor( public constructor(
entry_data_list : Array<type_entry_data>, entries : Array<type_entry_data>,
{ {
"initial_groups": initial_groups = [], "initial_groups": initial_groups = [],
"initial_label": initial_label = "", "initial_label": initial_label = "",
@ -78,14 +73,7 @@ namespace _dali.widgets
} }
) )
{ {
this.entries = entry_data_list.map( this.entries = entries;
entry_data => (
{
"data": entry_data,
"element": null,
}
)
);
this.initial_groups = initial_groups; this.initial_groups = initial_groups;
this.label = initial_label; this.label = initial_label;
this.container = null; this.container = null;
@ -100,17 +88,20 @@ namespace _dali.widgets
: void : void
{ {
this.entries.forEach( this.entries.forEach(
entry => { (entry, index) => {
const active : boolean = groups.some(group => entry.data.groups.includes(group)); const active : boolean = groups.some(group => entry.groups.includes(group));
entry.element.classList.toggle("widget-menu-entry-hidden", (! active)); const rel : string = index.toFixed(0);
const dom_entry = this.container.querySelector(".widget-menu-entry[rel=\"" + rel + "\"]");
dom_entry.classList.toggle("widget-menu-entry-hidden", (! active));
} }
); );
} }
/** /**
*/ */
public set_label( public set_label(
label ?: string label : (null | string)
) )
: void : void
{ {
@ -153,56 +144,69 @@ namespace _dali.widgets
) )
: Promise<void> : Promise<void>
{ {
// container // structure
{ this.container = await _dali.helpers.element_from_template(
const dom_container : HTMLElement = document.createElement("div"); "widget-menu",
dom_container.classList.add("widget-menu"); "main",
// button
{ {
const dom_button : HTMLElement = document.createElement("button"); "entries": (
dom_button.textContent = "[" + this.label + "]"; (
dom_button.classList.add("widget-menu-button"); await lib_plankton.call.promise_condense(
dom_button.addEventListener( this.entries.map(
(entry, index) => () => _dali.helpers.template_coin(
"widget-menu",
"entry",
{
"label": entry.label,
"rel": index.toFixed(0),
}
)
)
)
)
.join("")
),
}
);
// logic
{
// collapser
{
this.container.querySelector(".widget-menu-button").addEventListener(
"click", "click",
() => { () => {
this.toggle_collapsed(); this.toggle_collapsed();
} }
); );
dom_container.classList.toggle("widget-menu-collapsed", true);
dom_container.appendChild(dom_button);
} }
// platform // entries
{ {
const dom_platform : HTMLElement = document.createElement("div"); this.container.querySelectorAll(".widget-menu-entry").forEach(
dom_platform.classList.add("widget-menu-platform"); dom_entry => {
{ dom_entry.addEventListener(
const dom_list : HTMLElement = document.createElement("ul"); "click",
dom_list.classList.add("widget-menu-entries"); () => {
this.entries.forEach( const index : int = parseInt(dom_entry.getAttribute("rel"));
entry => { const entry : type_entry_data = this.entries[index];
const dom_entry : HTMLElement = document.createElement("li"); this.toggle_collapsed({"mode": true});
dom_entry.classList.add("widget-menu-entry"); entry.action();
dom_entry.textContent = entry.data.label; }
dom_entry.addEventListener( );
"click", }
() => { );
this.toggle_collapsed({"mode": true});
entry.data.action();
}
);
dom_list.appendChild(dom_entry);
entry.element = dom_entry;
}
);
dom_platform.appendChild(dom_list);
}
dom_container.appendChild(dom_platform);
} }
target_element.appendChild(dom_container);
this.container = dom_container;
} }
this.set_groups(this.initial_groups); // init
{
this.toggle_collapsed({"mode": true});
this.set_groups(this.initial_groups);
this.set_label(null);
}
// finish
target_element.appendChild(this.container);
} }
} }

View file

@ -29,7 +29,9 @@
padding: 8px; padding: 8px;
/*
min-width: 200px; min-width: 200px;
*/
} }
.widget-menu-platform:not(.widget-menu-platform-collapsed) .widget-menu-platform:not(.widget-menu-platform-collapsed)
@ -53,31 +55,20 @@
text-transform: capitalize; text-transform: capitalize;
background-color: hsl(var(--hue), 0%, 25%); background-color: hsl(var(--hue), 0%, 25%);
color: hsl(var(--hue), 0%, 100%); color: hsl(var(--hue), 0%, 100%);
}
.widget-menu-entry:not(:hover) > span
{
border-bottom: 2px solid hsl(0, 0%, 25%); border-bottom: 2px solid hsl(0, 0%, 25%);
} }
.widget-menu-entry:hover .widget-menu-entry:hover > span
{ {
color: hsl(var(--hue), 0%, 100%);
border-bottom: 2px solid hsl(0, 0%, 100%); border-bottom: 2px solid hsl(0, 0%, 100%);
transition: 1s ease color; transition: 1s ease color;
} }
/*
.widget-menu-entry
{
margin: 8px;
text-transform: capitalize;
}
.widget-menu-entry:not(:hover)
{
background-color: hsl(var(--hue), 0%, 25%);
color: hsl(var(--hue), 0%, 100%);
}
*/
.widget-menu-entry.widget-menu-entry-hidden .widget-menu-entry.widget-menu-entry-hidden
{ {
display: none; display: none;

View file

@ -0,0 +1,3 @@
<li class="widget-menu-entry" rel="{{rel}}">
<span>{{label}}</span>
</li>

View file

@ -0,0 +1,8 @@
<div class="widget-menu">
<button class="widget-menu-button"></button>
<div class="widget-menu-platform">
<ul class="widget-menu-entries">
{{entries}}
</ul>
</div>
</div>

View file

@ -78,7 +78,8 @@ namespace _dali.widgets
*/ */
public async load( public async load(
target_element : Element target_element : Element
) : Promise<void> )
: Promise<void>
{ {
target_element.innerHTML = await _dali.helpers.template_coin( target_element.innerHTML = await _dali.helpers.template_coin(
"widget-mode_switcher", "widget-mode_switcher",

View file

@ -91,8 +91,7 @@ namespace _dali.widgets
) )
: Promise<void> : Promise<void>
{ {
const dom_dummy = document.createElement("div"); const dom_root = await _dali.helpers.element_from_template(
dom_dummy.innerHTML = await _dali.helpers.template_coin(
"widget-special_number_input", "widget-special_number_input",
"main", "main",
{ {
@ -100,20 +99,21 @@ namespace _dali.widgets
} }
); );
const dom_input : HTMLInputElement = (dom_dummy.querySelector(".widget-special_number_input-input") as HTMLInputElement); const dom_input : HTMLInputElement = (dom_root.querySelector(".widget-special_number_input-input") as HTMLInputElement);
// listeners // listeners
{ {
dom_input.addEventListener( dom_input.addEventListener(
"change", "change",
() => { () => {
this.value = parseInt(dom_input.value); const value : int = parseInt(dom_input.value);
if ( if (
((this.minimum === null) || (this.value >= this.minimum)) ((this.minimum === null) || (value >= this.minimum))
&& &&
((this.maximum === null) || (this.value <= this.maximum)) ((this.maximum === null) || (value <= this.maximum))
) )
{ {
this.value = value;
this.action_change(this.value); this.action_change(this.value);
} }
else else
@ -122,7 +122,7 @@ namespace _dali.widgets
} }
} }
); );
dom_dummy.querySelector(".widget-special_number_input-prev").addEventListener( dom_root.querySelector(".widget-special_number_input-prev").addEventListener(
"click", "click",
() => { () => {
if ((this.minimum === null) || (this.value > this.minimum)) if ((this.minimum === null) || (this.value > this.minimum))
@ -137,7 +137,7 @@ namespace _dali.widgets
} }
} }
); );
dom_dummy.querySelector(".widget-special_number_input-next").addEventListener( dom_root.querySelector(".widget-special_number_input-next").addEventListener(
"click", "click",
() => { () => {
if ((this.maximum === null) || (this.value < this.maximum)) if ((this.maximum === null) || (this.value < this.maximum))
@ -154,9 +154,12 @@ namespace _dali.widgets
); );
} }
dom_input.value = this.value.toFixed(0); // content
{
dom_input.value = this.value.toFixed(0);
}
target_element.appendChild(dom_dummy.querySelector(".widget-special_number_input")); target_element.appendChild(dom_root);
} }
} }

View file

@ -384,8 +384,7 @@ namespace _dali.widgets
} }
else else
{ {
let dom_dummy : HTMLElement = document.createElement("div"); const dom_entry = await _dali.helpers.element_from_template(
dom_dummy.innerHTML = await _dali.helpers.template_coin(
"widget-weekview", "widget-weekview",
"tableview-cell-entry", "tableview-cell-entry",
{ {
@ -400,7 +399,6 @@ namespace _dali.widgets
), ),
} }
); );
const dom_entry : HTMLElement = dom_dummy.querySelector(".weekview-event_entry");
// listener // listener
dom_entry.addEventListener( dom_entry.addEventListener(
@ -938,15 +936,14 @@ namespace _dali.widgets
*/ */
// control:vertical // control:vertical
{ {
const dom_dummy : HTMLElement = document.createElement("div"); const dom_control = await _dali.helpers.element_from_template(
dom_dummy.innerHTML = await _dali.helpers.template_coin(
"widget-weekview", "widget-weekview",
"control-vertical", "control-vertical",
{ {
"label": lib_plankton.translate.get("widget.weekview.controls.vertical"), "label": lib_plankton.translate.get("widget.weekview.controls.vertical"),
} }
); );
const dom_input : HTMLInputElement = (dom_dummy.querySelector("input") as HTMLInputElement); const dom_input : HTMLInputElement = (dom_control.querySelector("input") as HTMLInputElement);
dom_input.addEventListener( dom_input.addEventListener(
"change", "change",
async () => { async () => {
@ -958,7 +955,7 @@ namespace _dali.widgets
} }
); );
dom_input.checked = this.vertical; dom_input.checked = this.vertical;
target_element.querySelector(".weekview-controls").appendChild(dom_dummy.querySelector(".weekview-control-vertical")); target_element.querySelector(".weekview-controls").appendChild(dom_control);
} }
this.container = target_element.querySelector(".weekview"); this.container = target_element.querySelector(".weekview");

View file

@ -32,7 +32,10 @@ ${dir_build}/index.html: \
templates: \ templates: \
templates-widgets-special_number_input \ templates-widgets-special_number_input \
templates-widgets-login_oidc \ templates-widgets-login_oidc \
templates-widgets-menu \
templates-widgets-sources \ templates-widgets-sources \
templates-widgets-calendar_edit \
templates-widgets-event_edit \
templates-widgets-caldav \ templates-widgets-caldav \
templates-widgets-listview \ templates-widgets-listview \
templates-widgets-weekview \ templates-widgets-weekview \
@ -53,6 +56,13 @@ templates-widgets-login_oidc: \
@ ${cmd_mkdir} ${dir_build}/templates/widget-login_oidc @ ${cmd_mkdir} ${dir_build}/templates/widget-login_oidc
@ ${cmd_cp} -r -u -v ${dir_source}/widgets/login_oidc/templates/* ${dir_build}/templates/widget-login_oidc/ @ ${cmd_cp} -r -u -v ${dir_source}/widgets/login_oidc/templates/* ${dir_build}/templates/widget-login_oidc/
.PHONY: templates-widgets-menu
templates-widgets-menu: \
$(wildcard ${dir_source}/widgets/menu/templates/*)
@ ${cmd_log} "templates:widget:menu …"
@ ${cmd_mkdir} ${dir_build}/templates/widget-menu
@ ${cmd_cp} -r -u -v ${dir_source}/widgets/menu/templates/* ${dir_build}/templates/widget-menu/
.PHONY: templates-widgets-sources .PHONY: templates-widgets-sources
templates-widgets-sources: \ templates-widgets-sources: \
$(wildcard ${dir_source}/widgets/sources/templates/*) $(wildcard ${dir_source}/widgets/sources/templates/*)
@ -60,6 +70,20 @@ templates-widgets-sources: \
@ ${cmd_mkdir} ${dir_build}/templates/widget-sources @ ${cmd_mkdir} ${dir_build}/templates/widget-sources
@ ${cmd_cp} -r -u -v ${dir_source}/widgets/sources/templates/* ${dir_build}/templates/widget-sources/ @ ${cmd_cp} -r -u -v ${dir_source}/widgets/sources/templates/* ${dir_build}/templates/widget-sources/
.PHONY: templates-widgets-calendar_edit
templates-widgets-calendar_edit: \
$(wildcard ${dir_source}/widgets/calendar_edit/templates/*)
@ ${cmd_log} "templates:widget:calendar_edit …"
@ ${cmd_mkdir} ${dir_build}/templates/widget-calendar_edit
@ ${cmd_cp} -r -u -v ${dir_source}/widgets/calendar_edit/templates/* ${dir_build}/templates/widget-calendar_edit/
.PHONY: templates-widgets-event_edit
templates-widgets-event_edit: \
$(wildcard ${dir_source}/widgets/event_edit/templates/*)
@ ${cmd_log} "templates:widget:event_edit …"
@ ${cmd_mkdir} ${dir_build}/templates/widget-event_edit
@ ${cmd_cp} -r -u -v ${dir_source}/widgets/event_edit/templates/* ${dir_build}/templates/widget-event_edit/
.PHONY: templates-widgets-caldav .PHONY: templates-widgets-caldav
templates-widgets-caldav: \ templates-widgets-caldav: \
$(wildcard ${dir_source}/widgets/caldav/templates/*) $(wildcard ${dir_source}/widgets/caldav/templates/*)