diff --git a/misc/conf-example.json b/misc/conf-example.json index cf5b37e..330b798 100644 --- a/misc/conf-example.json +++ b/misc/conf-example.json @@ -7,7 +7,7 @@ "path": "" }, "misc": { - "oidc_redirect_uri_template": "http://localhost:8888/#oidc_finish,session_key={{session_key}}", + "oidc_redirect_uri_template": "http://localhost:8888/?action=oidc_finish&session_key={{session_key}}", "use_central_europe_specific_datetime_inputs": true } } diff --git a/source/base.ts b/source/base.ts index e4de274..dab47b3 100644 --- a/source/base.ts +++ b/source/base.ts @@ -106,8 +106,19 @@ namespace _dali { await _dali.backend.set_session_key(session_key); const status = await _dali.backend.status(); - await _dali.notify_login(status.name); - return Promise.resolve(undefined); + if (! status.logged_in) + { + lib_plankton.log.error( + "dali.oidc_login_failed" + ); + await _dali.notify_logout(); + return Promise.reject(new Error("oidc login failed")); + } + else + { + await _dali.notify_login(status.name); + return Promise.resolve(undefined); + } } diff --git a/source/data/localization/deu.loc.json b/source/data/localization/deu.loc.json index abaf730..af4a35a 100644 --- a/source/data/localization/deu.loc.json +++ b/source/data/localization/deu.loc.json @@ -27,6 +27,7 @@ "common.monthname.november": "Nov", "common.monthname.december": "Dez", "common.open": "öffnen", + "common.close": "schließen", "common.edit": "bearbeiten", "common.show": "zeigen", "common.hide": "ausblenden", @@ -78,27 +79,20 @@ "widget.login.internal.password": "Kennwort", "widget.login.internal.do": "Anmelden", "widget.login.oidc.via": "via {{title}}", - "page.caldav.title": "CalDAV", - "page.caldav.unavailable": "CalDAV nicht verfügbar", - "page.caldav.conf.title": "Zugangsdaten", - "page.caldav.conf.address": "Adresse (URL)", - "page.caldav.conf.username": "Nutzername", - "page.caldav.conf.password": "Kennwort", - "page.caldav.conf.setup_hints": "Einrichtungs-Hinweise", - "page.caldav.conf.token_unset": "es muss zunächst ein Token gesetzt werden", - "page.caldav.set_token.title": "Token setzen", - "page.caldav.set_token.action.set": "setzen", - "page.caldav.set_token.action.overwrite": "überschreiben", - "page.calendar_add.title": "Kalendar anlegen", - "page.calendar_add.actions.do": "anlegen", - "page.calendar_edit.title.regular": "Kalendar bearbeiten", - "page.calendar_edit.title.read_only": "Kalendar-Details", - "page.event_add.title": "Termin anlegen", - "page.event_edit.title.regular": "Termin bearbeiten", - "page.event_edit.title.read_only": "Termin-Details", - "page.overview.title": "Übersicht", - "page.overview.login_hint": "anmelden um nicht-öffentliche Termine zu sehen", - "page.overview.mode.week": "Wochen-Ansicht", - "page.overview.mode.list": "Listen-Ansicht" + "widget.caldav.title": "CalDAV", + "widget.caldav.unavailable": "CalDAV nicht verfügbar", + "widget.caldav.conf.title": "Zugangsdaten", + "widget.caldav.conf.address": "Adresse (URL)", + "widget.caldav.conf.username": "Nutzername", + "widget.caldav.conf.password": "Kennwort", + "widget.caldav.conf.setup_hints": "Einrichtungs-Hinweise", + "widget.caldav.conf.token_unset": "es muss zunächst ein Token gesetzt werden", + "widget.caldav.set_token.title": "Token setzen", + "widget.caldav.set_token.action.set": "setzen", + "widget.caldav.set_token.action.overwrite": "überschreiben", + "widget.overview.title": "Übersicht", + "widget.overview.login_hint": "anmelden um nicht-öffentliche Termine zu sehen", + "widget.overview.mode.week": "Wochen-Ansicht", + "widget.overview.mode.list": "Listen-Ansicht" } } diff --git a/source/data/localization/eng.loc.json b/source/data/localization/eng.loc.json index 1436b7d..c63e674 100644 --- a/source/data/localization/eng.loc.json +++ b/source/data/localization/eng.loc.json @@ -27,6 +27,7 @@ "common.monthname.november": "nov", "common.monthname.december": "dec", "common.open": "open", + "common.close": "close", "common.edit": "edit", "common.show": "show", "common.hide": "hide", @@ -78,27 +79,20 @@ "widget.login.internal.password": "password", "widget.login.internal.do": "login", "widget.login.oidc.via": "via {{title}}", - "page.caldav.title": "CalDAV", - "page.caldav.unavailable": "CalDAV not available", - "page.caldav.conf.title": "credentials", - "page.caldav.conf.address": "address (URL)", - "page.caldav.conf.username": "username", - "page.caldav.conf.password": "password", - "page.caldav.conf.setup_hints": "setup hints", - "page.caldav.conf.token_unset": "a token has to be set", - "page.caldav.set_token.title": "set token", - "page.caldav.set_token.action.set": "set", - "page.caldav.set_token.action.overwrite": "overwrite", - "page.calendar_add.title": "Add calendar", - "page.calendar_add.actions.do": "anlegen", - "page.event_add.title": "Add event", - "page.calendar_edit.title.regular": "Edit calendar", - "page.calendar_edit.title.read_only": "Calendar details", - "page.event_edit.title.regular": "Edit event", - "page.event_edit.title.read_only": "Event details", - "page.overview.title": "Overview", - "page.overview.login_hint": "log in to view non-public events", - "page.overview.mode.week": "week view", - "page.overview.mode.list": "list view" + "widget.caldav.title": "CalDAV", + "widget.caldav.unavailable": "CalDAV not available", + "widget.caldav.conf.title": "credentials", + "widget.caldav.conf.address": "address (URL)", + "widget.caldav.conf.username": "username", + "widget.caldav.conf.password": "password", + "widget.caldav.conf.setup_hints": "setup hints", + "widget.caldav.conf.token_unset": "a token has to be set", + "widget.caldav.set_token.title": "set token", + "widget.caldav.set_token.action.set": "set", + "widget.caldav.set_token.action.overwrite": "overwrite", + "widget.overview.title": "Overview", + "widget.overview.login_hint": "log in to view non-public events", + "widget.overview.mode.week": "week view", + "widget.overview.mode.list": "list view" } } diff --git a/source/helpers.ts b/source/helpers.ts index b1c5995..e955bae 100644 --- a/source/helpers.ts +++ b/source/helpers.ts @@ -350,4 +350,23 @@ namespace _dali.helpers return lib_plankton.translate.get(keys[month-1]); } + + /** + */ + export function loading( + mode : boolean + ) + : void + { + if (! mode) + { + _dali.overlay.toggle({"mode": false}); + } + else + { + _dali.overlay.get_content_element().innerHTML = "[...]"; + _dali.overlay.toggle({"mode": true}); + } + } + } diff --git a/source/main.ts b/source/main.ts index 97cb9d8..af55d02 100644 --- a/source/main.ts +++ b/source/main.ts @@ -23,24 +23,6 @@ along with »dali«. If not, see . namespace _dali { - /** - */ - function nav_groups( - logged_in : boolean - ) - : Array - { - return ( - logged_in - ? - ["logged_in"] - : - ["logged_out"] - ); - } - - - /** */ export async function main( @@ -52,7 +34,7 @@ namespace _dali "conf.json" ); - // init + // init:logger lib_plankton.log.set_main_logger( [ { @@ -68,6 +50,11 @@ namespace _dali }, ] ); + // init:overlay + { + await _dali.overlay.initialize(); + _dali.helpers.loading(true); + } // init:localization { const order : Array = ["deu", "eng"]; @@ -76,10 +63,11 @@ namespace _dali "verbosity": 1, "packages": await Promise.all( order.map( - async (code) => JSON.parse( - await lib_plankton.file.read( - "data/localization/" + code + ".loc.json" - ) + code => ( + Promise.resolve(code) + .then(code => Promise.resolve(lib_plankton.string.coin("data/localization/{{code}}.loc.json", {"code": code}))) + .then(lib_plankton.file.read) + .then(content => Promise.resolve(JSON.parse(content))) ) ) ), @@ -88,11 +76,14 @@ namespace _dali } ); } + // init:backend await _dali.backend.initialize( _dali.conf.get()["backend"] ); + // init:model await _dali.model.initialize( ); + // init:page lib_plankton.zoo_page.init( document.querySelector("main"), { @@ -100,69 +91,55 @@ namespace _dali "name": "overview", "parameters": {} }, - /* - "nav_entries": [ - ], - */ - "nav_initial_groups": [], } ); - // menu widget + // init:menu { - const widget_menu : _dali.widgets.menu.class_widget_menu = new _dali.widgets.menu.class_widget_menu( + const widget_menu : _dali.widgets.class_widget_menu = new _dali.widgets.class_widget_menu( [ { "label": lib_plankton.translate.get("common.login"), "groups": ["logged_out"], - "action": () => { - const widget_login = new _dali.widgets.login.class_widget_login( + "action": async () => { + _dali.helpers.loading(true); + const widget : lib_plankton.zoo_widget.interface_widget = new _dali.widgets.class_widget_login( { "action_cancel": () => { _dali.overlay.clear(); _dali.overlay.toggle({"mode": false}); }, "action_success": async () => { + _dali.helpers.loading(true); const status = await _dali.backend.status(); _dali.notify_login(status.name); - _dali.overlay.clear(); - _dali.overlay.toggle({"mode": false}); + // _dali.overlay.clear(); + _dali.helpers.loading(false); }, } ); - _dali.overlay.clear(); + await widget.load(_dali.overlay.get_content_element()); + // _dali.helpers.loading(false); _dali.overlay.toggle({"mode": true}); - widget_login.load(_dali.overlay.get_content_element()); }, }, { - "label": lib_plankton.translate.get("page.overview.title"), - "groups": ["logged_out", "logged_in"], - "action": () => { - lib_plankton.zoo_page.set( - { - "name": "overview", - "parameters": {} - } - ); - }, - }, - { - "label": lib_plankton.translate.get("page.caldav.title"), + "label": lib_plankton.translate.get("widget.caldav.title"), "groups": ["logged_in"], - "action": () => { - lib_plankton.zoo_page.set( - { - "name": "caldav", - "parameters": {} - } - ); + "action": async () => { + _dali.helpers.loading(true); + const widget : lib_plankton.zoo_widget.interface_widget = new _dali.widgets.class_widget_caldav(); + await widget.load(_dali.overlay.get_content_element()); + // _dali.helpers.loading(false); + _dali.overlay.toggle({"mode": true}); }, }, { "label": lib_plankton.translate.get("common.logout"), "groups": ["logged_in"], - "action": () => { - _dali.logout(); + "action": async () => { + _dali.helpers.loading(true); + await _dali.logout(); + _dali.helpers.loading(false); }, }, ] @@ -181,9 +158,36 @@ namespace _dali } ); } - await _dali.overlay.initialize(); - // check if logged_in + // process actions + { + let url_search_params : URLSearchParams = new URLSearchParams(window.location.search); + const action : (null | string) = url_search_params.get("action"); + switch (action) + { + case "oidc_finish": + { + try + { + await _dali.oidc_finish(url_search_params.get("session_key")); + } + catch (error_) + { + // do nothing + } + document.location = "/"; + break; + } + default: + case null: + { + // do nothing + break; + } + } + } + + // process status { const status = await _dali.backend.status(); lib_plankton.log.info( @@ -200,7 +204,15 @@ namespace _dali } } - lib_plankton.zoo_page.start(); + // load overview + { + const widget : lib_plankton.zoo_widget.interface_widget = ( + new _dali.widgets.class_widget_overview( + ) + ); + await widget.load(document.querySelector("main")); + } + _dali.helpers.loading(false); return Promise.resolve(undefined); } diff --git a/source/overlay.ts b/source/overlay.ts index 8db482b..890a42d 100644 --- a/source/overlay.ts +++ b/source/overlay.ts @@ -24,7 +24,8 @@ namespace _dali.overlay /** */ function get_container_element( - ) : HTMLElement + ) + : HTMLElement { return document.querySelector("#overlay"); } @@ -33,7 +34,8 @@ namespace _dali.overlay /** */ export function get_content_element( - ) : HTMLElement + ) + : HTMLElement { return document.querySelector("#overlay_content"); } @@ -42,7 +44,8 @@ namespace _dali.overlay /** */ export function clear( - ) : void + ) + : void { get_content_element().innerHTML = ""; } @@ -61,7 +64,8 @@ namespace _dali.overlay = { } - ) : void + ) + : void { get_container_element().classList.toggle("overlay_active", mode ?? undefined); } @@ -70,7 +74,8 @@ namespace _dali.overlay /** */ export function initialize( - ) : Promise + ) + : Promise { clear(); const container_element : HTMLElement = get_container_element(); diff --git a/source/pages/caldav/templates/conf-token_set.html.tpl b/source/pages/caldav/templates/conf-token_set.html.tpl deleted file mode 100644 index 0a8b003..0000000 --- a/source/pages/caldav/templates/conf-token_set.html.tpl +++ /dev/null @@ -1,18 +0,0 @@ -
- - {{address_value}} -
-
- - {{username_value}} -
-
- - {{password_value}} -
-
- -
    -{{setup_hint_entries}} -
-
diff --git a/source/pages/caldav/templates/conf-token_unset.html.tpl b/source/pages/caldav/templates/conf-token_unset.html.tpl deleted file mode 100644 index 1d78bf3..0000000 --- a/source/pages/caldav/templates/conf-token_unset.html.tpl +++ /dev/null @@ -1,4 +0,0 @@ -
- ({{text}}) -
- diff --git a/source/pages/caldav/templates/main.html.tpl b/source/pages/caldav/templates/main.html.tpl deleted file mode 100644 index da98a2b..0000000 --- a/source/pages/caldav/templates/main.html.tpl +++ /dev/null @@ -1,6 +0,0 @@ -
-

{{label}}

-
-{{content}} -
-
diff --git a/source/pages/caldav/templates/unavailable.html.tpl b/source/pages/caldav/templates/unavailable.html.tpl deleted file mode 100644 index d6d75fb..0000000 --- a/source/pages/caldav/templates/unavailable.html.tpl +++ /dev/null @@ -1,3 +0,0 @@ -
- {{text}} -
diff --git a/source/pages/oidc_finish/logic.ts b/source/pages/oidc_finish/logic.ts deleted file mode 100644 index 925f93e..0000000 --- a/source/pages/oidc_finish/logic.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* -This file is part of »dali«. - -Copyright 2025 'kcf' - -»dali« is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -»dali« is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Lesser General Public License for more details. - -You should have received a copy of the GNU Lesser General Public License -along with »dali«. If not, see . - */ - - -namespace _dali.pages -{ - - /** - */ - lib_plankton.zoo_page.register( - "oidc_finish", - async (parameters, target_element) => { - target_element.innerHTML = ""; - await _dali.oidc_finish(parameters["session_key"]); - lib_plankton.zoo_page.set( - { - "name": "overview", - "parameters": {} - } - ); - return Promise.resolve(undefined); - } - ); - -} diff --git a/source/pages/overview/templates/main.html.tpl b/source/pages/overview/templates/main.html.tpl deleted file mode 100644 index 57a0928..0000000 --- a/source/pages/overview/templates/main.html.tpl +++ /dev/null @@ -1,8 +0,0 @@ -
-
-
-
-
-
-
-
diff --git a/source/pages/caldav/logic.ts b/source/widgets/caldav/logic.ts similarity index 58% rename from source/pages/caldav/logic.ts rename to source/widgets/caldav/logic.ts index 028108b..d382238 100644 --- a/source/pages/caldav/logic.ts +++ b/source/widgets/caldav/logic.ts @@ -18,65 +18,80 @@ along with »dali«. If not, see . */ -namespace _dali.pages +namespace _dali.widgets { /** */ - lib_plankton.zoo_page.register( - "caldav", - async (parameters, target_element) => { + export class class_widget_caldav + { + + /** + */ + public constructor( + ) + { + } + + + /** + */ + public async load( + target_element : HTMLElement + ) + : Promise + { target_element.innerHTML = ""; const conf = await _dali.backend.user_dav_conf(); target_element.innerHTML = await _dali.helpers.template_coin( - "caldav", + "widget-caldav", "main", { - "label": lib_plankton.translate.get("page.caldav.title"), + "title": lib_plankton.translate.get("widget.caldav.title"), "content": ( (conf === null) ? await _dali.helpers.template_coin( - "caldav", + "widget-caldav", "unavailable", { - "text": lib_plankton.translate.get("page.caldav.unavailable"), + "text": lib_plankton.translate.get("widget.caldav.unavailable"), } ) : await _dali.helpers.template_coin( - "caldav", + "widget-caldav", "available", { - "conf_title": lib_plankton.translate.get("page.caldav.conf.title"), + "conf_title": lib_plankton.translate.get("widget.caldav.conf.title"), "conf_content": ( (conf.password === null) ? await _dali.helpers.template_coin( - "caldav", + "widget-caldav", "conf-token_unset", { - "text": lib_plankton.translate.get("page.caldav.conf.token_unset") + "text": lib_plankton.translate.get("widget.caldav.conf.token_unset") } ) : await _dali.helpers.template_coin( - "caldav", + "widget-caldav", "conf-token_set", { - "address_label": lib_plankton.translate.get("page.caldav.conf.address"), + "address_label": lib_plankton.translate.get("widget.caldav.conf.address"), "address_value": conf.address, - "username_label": lib_plankton.translate.get("page.caldav.conf.username"), + "username_label": lib_plankton.translate.get("widget.caldav.conf.username"), "username_value": conf.username, - "password_label": lib_plankton.translate.get("page.caldav.conf.password"), + "password_label": lib_plankton.translate.get("widget.caldav.conf.password"), "password_value": conf.password, - "setup_hints_label": lib_plankton.translate.get("page.caldav.conf.setup_hints"), + "setup_hints_label": lib_plankton.translate.get("widget.caldav.conf.setup_hints"), "setup_hint_entries": ( await lib_plankton.call.promise_condense( conf.setup_hints .map( entry => () => _dali.helpers.template_coin( - "caldav", + "widget-caldav", "conf-setup_hint_entry", { "text": entry.label, @@ -101,31 +116,45 @@ namespace _dali.pages } ) ), - "set_token_title": lib_plankton.translate.get("page.caldav.set_token.title"), + "set_token_title": lib_plankton.translate.get("widget.caldav.set_token.title"), "set_token_action": ( (conf.password === null) ? - lib_plankton.translate.get("page.caldav.set_token.action.set") + lib_plankton.translate.get("widget.caldav.set_token.action.set") : - lib_plankton.translate.get("page.caldav.set_token.action.overwrite") + lib_plankton.translate.get("widget.caldav.set_token.action.overwrite") ), } ) - ) + ), + "close": lib_plankton.translate.get("common.close"), } ); - - /** - * logic: set token - */ + // logic { - if (conf !== null) + // set token { - document.querySelector("#caldav-set_token > button").addEventListener( + if (conf === null) + { + // do nothing + } + else + { + target_element.querySelector(".widget-caldav-set_token > button").addEventListener( + "click", + async () => { + await _dali.backend.user_dav_token(); + await this.load(target_element); + } + ); + } + } + // close + { + target_element.querySelector(".widget-caldav-close").addEventListener( "click", - async () => { - await _dali.backend.user_dav_token(); - lib_plankton.zoo_page.reload(); + () => { + _dali.overlay.toggle({"mode": false}); } ); } @@ -133,7 +162,8 @@ namespace _dali.pages return Promise.resolve(undefined); } - ); - + + } + } diff --git a/source/pages/caldav/style.css b/source/widgets/caldav/style.css similarity index 55% rename from source/pages/caldav/style.css rename to source/widgets/caldav/style.css index 47e293b..e053072 100644 --- a/source/pages/caldav/style.css +++ b/source/widgets/caldav/style.css @@ -1,9 +1,9 @@ -.caldav-conf-section +.widget-caldav-conf-section { margin-bottom: 16px; } -.caldav-conf-section-label +.widget-caldav-conf-section-label { margin-left: 16px; display: block; @@ -11,12 +11,12 @@ text-transform: capitalize; } -.caldav-conf-section-value +.widget-caldav-conf-section-value { margin-left: 32px; } -.caldav-conf-section-value-regular +.widget-caldav-conf-section-value-regular { font-family: monospace; } diff --git a/source/pages/caldav/templates/available.html.tpl b/source/widgets/caldav/templates/available.html.tpl similarity index 64% rename from source/pages/caldav/templates/available.html.tpl rename to source/widgets/caldav/templates/available.html.tpl index c8bb50b..56b3cde 100644 --- a/source/pages/caldav/templates/available.html.tpl +++ b/source/widgets/caldav/templates/available.html.tpl @@ -1,8 +1,8 @@ -
+

{{conf_title}}

{{conf_content}}
-
+

{{set_token_title}}

diff --git a/source/pages/caldav/templates/conf-setup_hint_entry.html.tpl b/source/widgets/caldav/templates/conf-setup_hint_entry.html.tpl similarity index 56% rename from source/pages/caldav/templates/conf-setup_hint_entry.html.tpl rename to source/widgets/caldav/templates/conf-setup_hint_entry.html.tpl index d4338e6..737f0e8 100644 --- a/source/pages/caldav/templates/conf-setup_hint_entry.html.tpl +++ b/source/widgets/caldav/templates/conf-setup_hint_entry.html.tpl @@ -1,3 +1,3 @@ -
  • +
  • {{text}}{{remark}}
  • diff --git a/source/widgets/caldav/templates/conf-token_set.html.tpl b/source/widgets/caldav/templates/conf-token_set.html.tpl new file mode 100644 index 0000000..5b5441a --- /dev/null +++ b/source/widgets/caldav/templates/conf-token_set.html.tpl @@ -0,0 +1,18 @@ +
    + + {{address_value}} +
    +
    + + {{username_value}} +
    +
    + + {{password_value}} +
    +
    + +
      +{{setup_hint_entries}} +
    +
    diff --git a/source/widgets/caldav/templates/conf-token_unset.html.tpl b/source/widgets/caldav/templates/conf-token_unset.html.tpl new file mode 100644 index 0000000..beb63a5 --- /dev/null +++ b/source/widgets/caldav/templates/conf-token_unset.html.tpl @@ -0,0 +1,4 @@ +
    + ({{text}}) +
    + diff --git a/source/widgets/caldav/templates/main.html.tpl b/source/widgets/caldav/templates/main.html.tpl new file mode 100644 index 0000000..c4dfd7d --- /dev/null +++ b/source/widgets/caldav/templates/main.html.tpl @@ -0,0 +1,8 @@ +
    +

    {{title}}

    +
    +{{content}} +
    +
    + +
    diff --git a/source/widgets/caldav/templates/unavailable.html.tpl b/source/widgets/caldav/templates/unavailable.html.tpl new file mode 100644 index 0000000..28f7bf8 --- /dev/null +++ b/source/widgets/caldav/templates/unavailable.html.tpl @@ -0,0 +1,3 @@ +
    + {{text}} +
    diff --git a/source/widgets/calendar_edit/logic.ts b/source/widgets/calendar_edit/logic.ts index 4c30a1d..a3464ba 100644 --- a/source/widgets/calendar_edit/logic.ts +++ b/source/widgets/calendar_edit/logic.ts @@ -18,7 +18,7 @@ along with »dali«. If not, see . */ -namespace _dali.widgets.calendar_edit +namespace _dali.widgets { /** diff --git a/source/widgets/event_edit/logic.ts b/source/widgets/event_edit/logic.ts index d2f76cc..4eecdb7 100644 --- a/source/widgets/event_edit/logic.ts +++ b/source/widgets/event_edit/logic.ts @@ -18,7 +18,7 @@ along with »dali«. If not, see . */ -namespace _dali.widgets.event_edit +namespace _dali.widgets { /** diff --git a/source/widgets/listview/logic.ts b/source/widgets/listview/logic.ts index 98d3340..53fbba0 100644 --- a/source/widgets/listview/logic.ts +++ b/source/widgets/listview/logic.ts @@ -18,7 +18,7 @@ along with »dali«. If not, see . */ -namespace _dali.widgets.listview +namespace _dali.widgets { /** diff --git a/source/widgets/login/logic.ts b/source/widgets/login/logic.ts index 4838588..ba90d34 100644 --- a/source/widgets/login/logic.ts +++ b/source/widgets/login/logic.ts @@ -18,7 +18,7 @@ along with »dali«. If not, see . */ -namespace _dali.widgets.login +namespace _dali.widgets { /** @@ -73,7 +73,7 @@ namespace _dali.widgets.login * [implementation] */ public async load( - target_element : Element + target_element : HTMLElement ) : Promise { @@ -86,125 +86,36 @@ namespace _dali.widgets.login { case "internal": { - target_element.innerHTML = await _dali.helpers.template_coin( - "widget-login", - "default", - { - } - ); - const form : lib_plankton.zoo_form.class_form< - {name : string; password : string;}, - {name : string; password : string;} - > = new lib_plankton.zoo_form.class_form< - {name : string; password : string;}, - {name : string; password : string;} - >( - x => x, - x => x, - new lib_plankton.zoo_input.class_input_group< - {name : string; password : string;} - >( - [ - { - "name": "name", - "input": new lib_plankton.zoo_input.class_input_text(), - "label": lib_plankton.translate.get("widget.login.internal.name"), - }, - { - "name": "password", - "input": new lib_plankton.zoo_input.class_input_password(), - "label": lib_plankton.translate.get("widget.login.internal.password"), - }, - ] - ), - ( - [] - .concat( - [ - { - "label": lib_plankton.translate.get("widget.login.internal.do"), - "procedure": async (get_value, get_representation) => { - const value : any = await get_value(); - try - { - await _dali.backend.session_begin( - value.name, - value.password - ); - if (this.action_success !== null) this.action_success(); - } - catch (error) - { - // todo - } - } - } - ] - ) - .concat( - (this.action_cancel === null) - ? - [] - : - [ - { - "label": lib_plankton.translate.get("common.cancel"), - "procedure": () => { - this.action_cancel(); - } - } - ] - ) + const sub_widget : lib_plankton.zoo_widget.interface_widget = ( + new class_widget_login_internal( + preparation.data, + { + "initial_name": this.initial_name, + "action_cancel": this.action_cancel, + "action_success": this.action_success, + } ) ); - await form.setup(document.querySelector(".widget-login")); - await form.input_write( - { - "name": this.initial_name, - "password": "", - } - ); + await sub_widget.load(target_element); break; } case "oidc": { - // link - { - let element_a : HTMLElement = document.createElement("a");; - element_a.textContent = lib_plankton.string.coin( - lib_plankton.translate.get("widget.login.oidc.via"), + const sub_widget : lib_plankton.zoo_widget.interface_widget = ( + new class_widget_login_oidc( + preparation.data, { - "title": preparation.data.label, + "action_cancel": this.action_cancel, + "action_success": this.action_success, } - ); - element_a.setAttribute("href", preparation.data.url); - target_element.appendChild(element_a); - } - { - let dom_br : HTMLElement = document.createElement("br"); - target_element.appendChild(dom_br); - } - { - let dom_br : HTMLElement = document.createElement("br"); - target_element.appendChild(dom_br); - } - // cancel - { - let dom_cancel : HTMLElement = document.createElement("button"); - dom_cancel.textContent = lib_plankton.translate.get("common.cancel"); - dom_cancel.addEventListener( - "click", - () => { - this.action_cancel(); - } - ); - target_element.appendChild(dom_cancel); - } + ) + ); + await sub_widget.load(target_element); break; } default: { - // todo + throw (new Error("unhandled login kind: " + preparation.kind)); break; } } diff --git a/source/widgets/login/templates/default.html.tpl b/source/widgets/login/templates/default.html.tpl deleted file mode 100644 index 9ac6980..0000000 --- a/source/widgets/login/templates/default.html.tpl +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/source/widgets/login_internal/logic.ts b/source/widgets/login_internal/logic.ts new file mode 100644 index 0000000..5e85b46 --- /dev/null +++ b/source/widgets/login_internal/logic.ts @@ -0,0 +1,164 @@ +/* +This file is part of »dali«. + +Copyright 2025 'kcf' + +»dali« is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +»dali« is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with »dali«. If not, see . + */ + + +namespace _dali.widgets +{ + + /** + */ + export class class_widget_login_internal + implements lib_plankton.zoo_widget.interface_widget + { + + /** + */ + private preparation_data : any; + + + /** + */ + private initial_name : (null | string); + + + /** + * [hook] + */ + private action_cancel : (null | (() => void)); + + + /** + * [hook] + */ + private action_success : (null | (() => void)); + + + /** + */ + public constructor( + preparation_data : any, + { + "initial_name": initial_name = null, + "action_cancel": action_cancel = null, + "action_success": action_success = null, + } + : + { + initial_name ?: (null | string); + action_cancel ?: (null | (() => void)); + action_success ?: (null | (() => void)); + } + = + { + } + ) + { + this.preparation_data = preparation_data; + this.initial_name = initial_name; + this.action_cancel = action_cancel; + this.action_success = action_success; + } + + + /** + * [implementation] + */ + public async load( + target_element : HTMLElement + ) + : Promise + { + const form : lib_plankton.zoo_form.class_form< + {name : string; password : string;}, + {name : string; password : string;} + > = new lib_plankton.zoo_form.class_form< + {name : string; password : string;}, + {name : string; password : string;} + >( + x => x, + x => x, + new lib_plankton.zoo_input.class_input_group< + {name : string; password : string;} + >( + [ + { + "name": "name", + "input": new lib_plankton.zoo_input.class_input_text(), + "label": lib_plankton.translate.get("widget.login.internal.name"), + }, + { + "name": "password", + "input": new lib_plankton.zoo_input.class_input_password(), + "label": lib_plankton.translate.get("widget.login.internal.password"), + }, + ] + ), + ( + [] + .concat( + [ + { + "label": lib_plankton.translate.get("widget.login.internal.do"), + "procedure": async (get_value, get_representation) => { + const value : any = await get_value(); + try + { + await _dali.backend.session_begin( + value.name, + value.password + ); + if (this.action_success !== null) this.action_success(); + } + catch (error) + { + // todo + } + } + } + ] + ) + .concat( + (this.action_cancel === null) + ? + [] + : + [ + { + "label": lib_plankton.translate.get("common.cancel"), + "procedure": () => { + this.action_cancel(); + } + } + ] + ) + ) + ); + target_element.innerHTML = ""; + await form.setup(target_element); + await form.input_write( + { + "name": this.initial_name, + "password": "", + } + ); + } + + } + +} diff --git a/source/widgets/login_oidc/logic.ts b/source/widgets/login_oidc/logic.ts new file mode 100644 index 0000000..b5a4500 --- /dev/null +++ b/source/widgets/login_oidc/logic.ts @@ -0,0 +1,110 @@ +/* +This file is part of »dali«. + +Copyright 2025 'kcf' + +»dali« is free software: you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +»dali« is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with »dali«. If not, see . + */ + + +namespace _dali.widgets +{ + + /** + */ + export class class_widget_login_oidc + implements lib_plankton.zoo_widget.interface_widget + { + + /** + */ + private preparation_data : any; + + + /** + * [hook] + */ + private action_cancel : (null | (() => void)); + + + /** + * [hook] + */ + private action_success : (null | (() => void)); + + + /** + */ + public constructor( + preparation_data : any, + { + "action_cancel": action_cancel = null, + "action_success": action_success = null, + } + : + { + action_cancel ?: (null | (() => void)); + action_success ?: (null | (() => void)); + } + = + { + } + ) + { + this.preparation_data = preparation_data; + this.action_cancel = action_cancel; + this.action_success = action_success; + } + + + /** + * [implementation] + */ + public async load( + target_element : HTMLElement + ) + : Promise + { + // structure + { + target_element.innerHTML = await _dali.helpers.template_coin( + "widget-login_oidc", + "main", + { + "label": lib_plankton.string.coin( + lib_plankton.translate.get("widget.login.oidc.via"), + { + "title": this.preparation_data.label, + } + ), + "href": this.preparation_data.url, + "cancel": lib_plankton.translate.get("common.cancel"), + } + ); + } + + // controls + { + target_element.querySelector(".widget-login_oidc-cancel").addEventListener( + "click", + () => { + this.action_cancel(); + } + ); + } + } + + } + +} diff --git a/source/widgets/login_oidc/style.css b/source/widgets/login_oidc/style.css new file mode 100644 index 0000000..ab5f060 --- /dev/null +++ b/source/widgets/login_oidc/style.css @@ -0,0 +1,5 @@ +.widget-login_oidc-cancel +{ + display: block; + margin-top: 32px; +} diff --git a/source/widgets/login_oidc/templates/main.html.tpl b/source/widgets/login_oidc/templates/main.html.tpl new file mode 100644 index 0000000..57cdffb --- /dev/null +++ b/source/widgets/login_oidc/templates/main.html.tpl @@ -0,0 +1,4 @@ + diff --git a/source/widgets/menu/logic.ts b/source/widgets/menu/logic.ts index fd9d540..617a2f0 100644 --- a/source/widgets/menu/logic.ts +++ b/source/widgets/menu/logic.ts @@ -18,7 +18,7 @@ along with »dali«. If not, see . */ -namespace _dali.widgets.menu +namespace _dali.widgets { /** diff --git a/source/widgets/mode_switcher/logic.ts b/source/widgets/mode_switcher/logic.ts index 691782b..6a40a29 100644 --- a/source/widgets/mode_switcher/logic.ts +++ b/source/widgets/mode_switcher/logic.ts @@ -18,7 +18,7 @@ along with »dali«. If not, see . */ -namespace _dali.widgets.mode_switcher +namespace _dali.widgets { /** diff --git a/source/widgets/multiview/logic.ts b/source/widgets/multiview/logic.ts index 87929aa..414c8d6 100644 --- a/source/widgets/multiview/logic.ts +++ b/source/widgets/multiview/logic.ts @@ -18,7 +18,7 @@ along with »dali«. If not, see . */ -namespace _dali.widgets.multiview +namespace _dali.widgets { /** @@ -96,17 +96,17 @@ namespace _dali.widgets.multiview /** */ - private widget_mode_switcher : _dali.widgets.mode_switcher.class_widget_mode_switcher; + private widget_mode_switcher : _dali.widgets.class_widget_mode_switcher; /** */ - private widget_weekview : _dali.widgets.weekview.class_widget_weekview; + private widget_weekview : _dali.widgets.class_widget_weekview; /** */ - private widget_listview : _dali.widgets.listview.class_widget_listview; + private widget_listview : _dali.widgets.class_widget_listview; /** @@ -205,15 +205,21 @@ namespace _dali.widgets.multiview // mode switcher { this.widget_mode_switcher = ( - new _dali.widgets.mode_switcher.class_widget_mode_switcher( + new _dali.widgets.class_widget_mode_switcher( [ { "mode": _dali.enum_view_mode.week, - "label": lib_plankton.translate.get("page.overview.mode.week"), + /** + * @todo as dependency + */ + "label": lib_plankton.translate.get("widget.overview.mode.week"), }, { "mode": _dali.enum_view_mode.list, - "label": lib_plankton.translate.get("page.overview.mode.list"), + /** + * @todo as dependency + */ + "label": lib_plankton.translate.get("widget.overview.mode.list"), }, ], { @@ -232,7 +238,7 @@ namespace _dali.widgets.multiview // weekview { this.widget_weekview = ( - new _dali.widgets.weekview.class_widget_weekview( + new _dali.widgets.class_widget_weekview( this.get_entries, { "action_select_event": (event_key) => this.action_edit_event(event_key), @@ -249,7 +255,7 @@ namespace _dali.widgets.multiview // listview { this.widget_listview = ( - new _dali.widgets.listview.class_widget_listview( + new _dali.widgets.class_widget_listview( this.get_entries, { "action_select": (event_key) => this.action_edit_event(event_key), diff --git a/source/pages/overview/logic.ts b/source/widgets/overview/logic.ts similarity index 63% rename from source/pages/overview/logic.ts rename to source/widgets/overview/logic.ts index 873374c..5a25153 100644 --- a/source/pages/overview/logic.ts +++ b/source/widgets/overview/logic.ts @@ -18,120 +18,98 @@ along with »dali«. If not, see . */ -namespace _dali.pages.overview +namespace _dali.widgets { /** */ - lib_plankton.zoo_page.register( - "overview", - async (parameters, target_element) => { - // params - const view_mode : _dali.enum_view_mode = _dali.helpers.view_mode_determine(parameters["mode"] ?? "auto"); - const view_kind : _dali.enum_view_kind = _dali.helpers.view_kind_determine(parameters["kind"] ?? "auto"); - - // exec - /** - */ - async function get_available_calendars( - ) - : Promise< - Array< - _dali.type_calendar_object_reduced_with_id - > - > - { - return ( - (await _dali.model.calendar_list()) - /* - .filter( - (entry) => ( - (entry.access_level === _dali.enum_access_level.edit) - || - (entry.access_level === _dali.enum_access_level.admin) - ) - ) - */ - ); + type type_action_create_calendar = ( + ( + ) + => + Promise + ); + + + /** + */ + type type_action_edit_calendar = ( + ( + type_calendar_object_reduced_with_id + ) + => + Promise + ); + + + /** + */ + type type_action_create_event = ( + ( + stuff ?: { + date ?: lib_plankton.pit.type_date; } - - /** - * @todo add return type - */ - async function get_entries( - from_pit : lib_plankton.pit.type_pit, - to_pit : lib_plankton.pit.type_pit, - calendar_ids : Array<_dali.type_calendar_id> - ) - : Promise> - { - /** - * @todo do NOT wait? - */ - await _dali.model.sync_events( - { - "from": from_pit, - "to": to_pit, - }, - { - "calendar_ids": calendar_ids, - } - ); - /** - * @todo filter - */ - return _dali.model.event_list(); - } - - /** - * @todo update listview - */ - async function update_sources_and_entries( - { - "priviliged": priviliged = null, - } - : - { - priviliged ?: (null | boolean); - } - = - { - } - ) - : Promise - { - await widget_sources.update({"priviliged": priviliged}); - await widget_multiview.update_entries(); - } - - /** - * @todo use priviliged? - * @todo update listview - */ - async function update_entries( - { - "priviliged": priviliged = null, - } - : - { - priviliged ?: (null | boolean); - } - = - { - } - ) - : Promise - { - await widget_multiview.update_entries(); - } - - /** - */ - async function action_create_calendar( - ) - : Promise - { - const widget = new _dali.widgets.calendar_edit.class_widget_calendar_edit( + ) + => + Promise + ); + + + /** + */ + type type_action_edit_event = ( + ( + event_key : _dali.type_event_key + ) + => + Promise + ); + + + /** + */ + export class class_widget_overview + implements lib_plankton.zoo_widget.interface_widget + { + + /** + */ + private widget_sources : _dali.widgets.class_widget_sources; + + + /** + */ + private widget_multiview : _dali.widgets.class_widget_multiview; + + + /** + */ + private action_create_calendar : type_action_create_calendar; + + + /** + */ + private action_edit_calendar : type_action_edit_calendar; + + + /** + */ + private action_create_event : type_action_create_event; + + + /** + */ + private action_edit_event : type_action_edit_event; + + + /** + */ + public constructor( + ) + { + this.action_create_calendar = async ( + ) => { + const widget = new _dali.widgets.class_widget_calendar_edit( await _dali.model.group_list(), await _dali.model.user_list(), { @@ -179,7 +157,7 @@ namespace _dali.pages.overview ) .then( () => { - update_sources_and_entries(); + this.update_sources_and_entries(); _dali.overlay.toggle({"mode": false}); } ) @@ -197,15 +175,10 @@ namespace _dali.pages.overview _dali.overlay.clear(); _dali.overlay.toggle({"mode": true}); await widget.load(_dali.overlay.get_content_element()); - } - - /** - */ - async function action_edit_calendar( - calendar_object_reduced_with_id : type_calendar_object_reduced_with_id - ) - : Promise - { + }; + this.action_edit_calendar = async ( + calendar_object_reduced_with_id + ) => { const read_only : boolean = (() => { switch (calendar_object_reduced_with_id.access_level) { @@ -242,7 +215,7 @@ namespace _dali.pages.overview const calendar_object : _dali.type_calendar_object = await _dali.model.calendar_get( calendar_id ); - const widget = new _dali.widgets.calendar_edit.class_widget_calendar_edit( + const widget = new _dali.widgets.class_widget_calendar_edit( await _dali.model.group_list(), await _dali.model.user_list(), calendar_object, @@ -258,7 +231,7 @@ namespace _dali.pages.overview ) .then( () => { - update_sources_and_entries(); + this.update_sources_and_entries(); _dali.overlay.toggle({"mode": false}); } ); @@ -269,7 +242,7 @@ namespace _dali.pages.overview ) .then( () => { - update_sources_and_entries(); + this.update_sources_and_entries(); _dali.overlay.toggle({"mode": false}); } ); @@ -281,11 +254,10 @@ namespace _dali.pages.overview await widget.load(_dali.overlay.get_content_element()); } } - /** * @todo unterschiedliches Verhalten bei Anmeldung? */ - async function action_create_event( + this.action_create_event = async ( { "date": date = lib_plankton.pit.to_datetime(lib_plankton.pit.now()).date, } @@ -296,17 +268,15 @@ namespace _dali.pages.overview = { } - ) - : Promise - { + ) => { if (! _dali.is_logged_in()) { // do nothing } else { - const widget = new _dali.widgets.event_edit.class_widget_event_edit( - (await get_available_calendars()), + const widget = new _dali.widgets.class_widget_event_edit( + (await this.get_available_calendars()), { "calendar_id": null, "event_name": "", @@ -359,7 +329,7 @@ namespace _dali.pages.overview ) .then( () => { - update_entries(); + this.update_entries(); _dali.overlay.toggle({"mode": false}); } ) @@ -376,15 +346,11 @@ namespace _dali.pages.overview await widget.load(_dali.overlay.get_content_element()); } } - /** */ - async function action_edit_event - ( - event_key : _dali.type_event_key - ) - : Promise - { + this.action_edit_event = async ( + event_key + ) => { const event_object_extended : _dali.type_event_object_extended = await _dali.model.event_get(event_key); const read_only : boolean = (() => { switch (event_object_extended.access_level) @@ -407,8 +373,8 @@ namespace _dali.pages.overview } } }) (); - const widget = new _dali.widgets.event_edit.class_widget_event_edit( - (await get_available_calendars()), + const widget = new _dali.widgets.class_widget_event_edit( + (await this.get_available_calendars()), { "calendar_id": event_object_extended.calendar_id, "event_name": event_object_extended.event_object.name, @@ -437,7 +403,7 @@ namespace _dali.pages.overview ) .then( () => { - update_entries(); + this.update_entries(); _dali.overlay.toggle({"mode": false}); } ) @@ -456,7 +422,7 @@ namespace _dali.pages.overview ) .then( () => { - update_entries(); + this.update_entries(); _dali.overlay.toggle({"mode": false}); } ) @@ -471,98 +437,212 @@ namespace _dali.pages.overview }, } ); - _dali.overlay.clear(); _dali.overlay.toggle({"mode": true}); await widget.load(_dali.overlay.get_content_element()); } + } + + + /** + */ + private async get_available_calendars( + ) + : Promise< + Array< + _dali.type_calendar_object_reduced_with_id + > + > + { + return ( + (await _dali.model.calendar_list()) + /* + .filter( + (entry) => ( + (entry.access_level === _dali.enum_access_level.edit) + || + (entry.access_level === _dali.enum_access_level.admin) + ) + ) + */ + ); + } + + + /** + */ + private async get_entries( + from_pit : lib_plankton.pit.type_pit, + to_pit : lib_plankton.pit.type_pit, + calendar_ids : Array<_dali.type_calendar_id> + ) + : Promise> + { + /** + * @todo do NOT wait? + */ + await _dali.model.sync_events( + { + "from": from_pit, + "to": to_pit, + }, + { + "calendar_ids": calendar_ids, + } + ); + /** + * @todo filter + */ + return _dali.model.event_list(); + } + + + /** + */ + private async update_sources_and_entries( + { + "priviliged": priviliged = null, + } + : + { + priviliged ?: (null | boolean); + } + = + { + } + ) + : Promise + { + await this.widget_sources.update({"priviliged": priviliged}); + await this.widget_multiview.update_entries(); + } + + + /** + * @todo use priviliged? + */ + private async update_entries( + { + "priviliged": priviliged = null, + } + : + { + priviliged ?: (null | boolean); + } + = + { + } + ) + : Promise + { + await this.widget_multiview.update_entries(); + } + + + + /** + * [implementation] + */ + public async load( + target_element : HTMLElement + ) + : Promise + { + const view_mode : _dali.enum_view_mode = _dali.helpers.view_mode_determine("auto"); + const view_kind : _dali.enum_view_kind = _dali.helpers.view_kind_determine("auto"); - const widget_sources : _dali.widgets.sources.class_widget_sources = ( - new _dali.widgets.sources.class_widget_sources( + this.widget_sources = ( + new _dali.widgets.class_widget_sources( _dali.model.calendar_list, { "initial_priviliged": _dali.is_logged_in(), - "action_add": action_create_calendar, - "action_select": (entry) => action_edit_calendar(entry), + "action_add": this.action_create_calendar, + "action_select": this.action_edit_calendar, "action_toggle": (entry, mode) => { - widget_multiview.toggle_calendar_visibilty(entry.id, {"mode": mode}); + this.widget_multiview.toggle_calendar_visibilty(entry.id, {"mode": mode}); }, } ) ); - const widget_multiview : _dali.widgets.multiview.class_widget_multiview = ( - new _dali.widgets.multiview.class_widget_multiview( - get_entries, + this.widget_multiview = ( + new _dali.widgets.class_widget_multiview( + this.get_entries, { "initial_view_mode": view_mode, "weekview_initial_vertical": (view_kind === _dali.enum_view_kind.touch), - "action_create_event": action_create_event, - "action_edit_event": action_edit_event, + "action_create_event": this.action_create_event, + "action_edit_event": this.action_edit_event, } ) ); target_element.innerHTML = await _dali.helpers.template_coin( - "overview", + "widget-overview", "main", { } ); - - switch (view_kind) + + // head { - case _dali.enum_view_kind.regular: + // hint { - const widget_slider = new lib_plankton.zoo_widget.class_slider( - [ - new lib_plankton.zoo_widget.class_bunch( - [ - widget_sources, - widget_multiview, - ] - ), - ], - { - "threshold": 100, - "initial_index": 1, - } - ); - await widget_slider.load(target_element.querySelector("#overview-body")); - break; - } - case _dali.enum_view_kind.touch: - { - const widget_slider = new lib_plankton.zoo_widget.class_slider( - [ - widget_sources, - widget_multiview, - ], - { - "threshold": 100, - "initial_index": 2, - } - ); - await widget_slider.load(target_element.querySelector("#overview-body")); - break; + const dom_hint = target_element.querySelector(".widget-overview-hint"); + dom_hint.textContent = lib_plankton.translate.get("widget.overview.login_hint"); + dom_hint.classList.toggle("widget-overview-hint-hidden", _dali.is_logged_in()); } } - - // hint + // body { - const dom_hint = target_element.querySelector("#overview-hint"); - dom_hint.textContent = lib_plankton.translate.get("page.overview.login_hint"); - dom_hint.classList.toggle("overview-hint-hidden", _dali.is_logged_in()); + let widget_slider : lib_plankton.zoo_widget.interface_widget; + switch (view_kind) + { + case _dali.enum_view_kind.regular: + { + widget_slider = new lib_plankton.zoo_widget.class_slider( + [ + new lib_plankton.zoo_widget.class_bunch( + [ + this.widget_sources, + this.widget_multiview, + ] + ), + ], + { + "threshold": 100, + "initial_index": 1, + } + ); + break; + } + case _dali.enum_view_kind.touch: + { + widget_slider = new lib_plankton.zoo_widget.class_slider( + [ + this.widget_sources, + this.widget_multiview, + ], + { + "threshold": 100, + "initial_index": 2, + } + ); + break; + } + } + await widget_slider.load(target_element.querySelector(".widget-overview-body")); } _dali.model.listen_reset( async (priviliged) => { - update_sources_and_entries({"priviliged": priviliged}); - target_element.querySelector("#overview-hint").classList.toggle("overview-hint-hidden", priviliged); + this.update_sources_and_entries({"priviliged": priviliged}); + target_element.querySelector(".widget-overview-hint").classList.toggle("widget-overview-hint-hidden", priviliged); } ); return Promise.resolve(undefined); - }, - ); - + } + + } + } diff --git a/source/pages/overview/style.css b/source/widgets/overview/style.css similarity index 56% rename from source/pages/overview/style.css rename to source/widgets/overview/style.css index 1d7c2dc..813ec16 100644 --- a/source/pages/overview/style.css +++ b/source/widgets/overview/style.css @@ -1,57 +1,57 @@ -#overview-head +.widget-overview-head { padding-bottom: 12px; margin-bottom: 12px; border-bottom: 1px solid; } -#overview-hint +.widget-overview-hint { text-align: center; font-weight: bold; } -#overview-hint.overview-hint-hidden +.widget-overview-hint.widget-overview-hint-hidden { display: none; } -#overview-body +.widget-overview-body { display: flex; flex-direction: row; flex-wrap: nowrap; } -#overview-pane-left +.widget-overview-pane-left { flex-basis: 12.5%; flex-grow: 0; flex-shrink: 1; } -#overview-pane-right +.widget-overview-pane-right { flex-basis: 87.5%; flex-grow: 1; flex-shrink: 1; } -#overview-body .widget-slider-slide .widget-bunch +.widget-overview-body .widget-slider-slide .widget-bunch { display: flex; flex-direction: row; flex-wrap: nowrap; } -#overview-body .widget-slider-slide .widget-bunch-element:nth-child(1) +.widget-overview-body .widget-slider-slide .widget-bunch-element:nth-child(1) { flex-grow: 0; flex-shrink: 1; flex-basis: 12.5%; } -#overview-body .widget-slider-slide .widget-bunch-element:nth-child(2) +.widget-overview-body .widget-slider-slide .widget-bunch-element:nth-child(2) { flex-grow: 1; flex-shrink: 1; diff --git a/source/widgets/overview/templates/main.html.tpl b/source/widgets/overview/templates/main.html.tpl new file mode 100644 index 0000000..d4d3054 --- /dev/null +++ b/source/widgets/overview/templates/main.html.tpl @@ -0,0 +1,8 @@ +
    +
    +
    +
    +
    +
    +
    +
    diff --git a/source/widgets/sources/logic.ts b/source/widgets/sources/logic.ts index 04bbc3b..355927a 100644 --- a/source/widgets/sources/logic.ts +++ b/source/widgets/sources/logic.ts @@ -18,7 +18,7 @@ along with »dali«. If not, see . */ -namespace _dali.widgets.sources +namespace _dali.widgets { /** diff --git a/source/widgets/weekview/logic.ts b/source/widgets/weekview/logic.ts index 2d26075..ac939de 100644 --- a/source/widgets/weekview/logic.ts +++ b/source/widgets/weekview/logic.ts @@ -18,7 +18,7 @@ along with »dali«. If not, see . */ -namespace _dali.widgets.weekview +namespace _dali.widgets { /** diff --git a/tools/makefile b/tools/makefile index 885210b..c2b20c8 100644 --- a/tools/makefile +++ b/tools/makefile @@ -30,21 +30,14 @@ ${dir_build}/index.html: \ .PHONY: templates templates: \ - templates-widgets-login \ templates-widgets-special_number_input \ + templates-widgets-login_oidc \ templates-widgets-sources \ + templates-widgets-caldav \ templates-widgets-listview \ templates-widgets-weekview \ - templates-widgets-mode_switcher \ - templates-pages-caldav \ - templates-pages-overview - -.PHONY: templates-widgets-login -templates-widgets-login: \ - $(wildcard ${dir_source}/widgets/login/templates/*) - @ ${cmd_log} "templates:widget:login …" - @ ${cmd_mkdir} ${dir_build}/templates/widget-login - @ ${cmd_cp} -r -u -v ${dir_source}/widgets/login/templates/* ${dir_build}/templates/widget-login/ + templates-widgets-overview \ + templates-widgets-mode_switcher .PHONY: templates-widgets-special_number_input templates-widgets-special_number_input: \ @@ -53,6 +46,13 @@ templates-widgets-special_number_input: \ @ ${cmd_mkdir} ${dir_build}/templates/widget-special_number_input @ ${cmd_cp} -r -u -v ${dir_source}/widgets/special_number_input/templates/* ${dir_build}/templates/widget-special_number_input/ +.PHONY: templates-widgets-login_oidc +templates-widgets-login_oidc: \ + $(wildcard ${dir_source}/widgets/login_oidc/templates/*) + @ ${cmd_log} "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/ + .PHONY: templates-widgets-sources templates-widgets-sources: \ $(wildcard ${dir_source}/widgets/sources/templates/*) @@ -60,6 +60,13 @@ templates-widgets-sources: \ @ ${cmd_mkdir} ${dir_build}/templates/widget-sources @ ${cmd_cp} -r -u -v ${dir_source}/widgets/sources/templates/* ${dir_build}/templates/widget-sources/ +.PHONY: templates-widgets-caldav +templates-widgets-caldav: \ + $(wildcard ${dir_source}/widgets/caldav/templates/*) + @ ${cmd_log} "templates:widget:caldav …" + @ ${cmd_mkdir} ${dir_build}/templates/widget-caldav + @ ${cmd_cp} -r -u -v ${dir_source}/widgets/caldav/templates/* ${dir_build}/templates/widget-caldav/ + .PHONY: templates-widgets-listview templates-widgets-listview: \ $(wildcard ${dir_source}/widgets/listview/templates/*) @@ -74,6 +81,13 @@ templates-widgets-weekview: \ @ ${cmd_mkdir} ${dir_build}/templates/widget-weekview @ ${cmd_cp} -r -u -v ${dir_source}/widgets/weekview/templates/* ${dir_build}/templates/widget-weekview/ +.PHONY: templates-widgets-overview +templates-widgets-overview: \ + $(wildcard ${dir_source}/widgets/overview/templates/*) + @ ${cmd_log} "templates:widget:overview …" + @ ${cmd_mkdir} ${dir_build}/templates/widget-overview + @ ${cmd_cp} -r -u -v ${dir_source}/widgets/overview/templates/* ${dir_build}/templates/widget-overview/ + .PHONY: templates-widgets-mode_switcher templates-widgets-mode_switcher: \ $(wildcard ${dir_source}/widgets/mode_switcher/templates/*) @@ -81,27 +95,12 @@ templates-widgets-mode_switcher: \ @ ${cmd_mkdir} ${dir_build}/templates/widget-mode_switcher @ ${cmd_cp} -r -u -v ${dir_source}/widgets/mode_switcher/templates/* ${dir_build}/templates/widget-mode_switcher/ -.PHONY: templates-pages-caldav -templates-pages-caldav: \ - $(wildcard ${dir_source}/pages/caldav/templates/*) - @ ${cmd_log} "templates:page:caldav …" - @ ${cmd_mkdir} ${dir_build}/templates/caldav - @ ${cmd_cp} -r -u -v ${dir_source}/pages/caldav/templates/* ${dir_build}/templates/caldav/ - -.PHONY: templates-pages-overview -templates-pages-overview: \ - $(wildcard ${dir_source}/pages/overview/templates/*) - @ ${cmd_log} "templates:page:overview …" - @ ${cmd_mkdir} ${dir_build}/templates/overview - @ ${cmd_cp} -r -u -v ${dir_source}/pages/overview/templates/* ${dir_build}/templates/overview/ - .PHONY: style style: ${dir_build}/style.css ${dir_build}/style.css: \ $(wildcard ${dir_source}/style/*.css) \ - $(wildcard ${dir_source}/widgets/*/style.css) \ - $(wildcard ${dir_source}/pages/*/style.css) + $(wildcard ${dir_source}/widgets/*/style.css) @ ${cmd_log} "style …" @ ${cmd_mkdir} ${dir_build} @ ${cmd_cat} $^ > $@ @@ -116,10 +115,9 @@ ${dir_temp}/logic-unlinked.js: \ ${dir_source}/base.ts \ ${dir_source}/types.ts \ ${dir_source}/model.ts \ - ${dir_source}/helpers.ts \ ${dir_source}/overlay.ts \ + ${dir_source}/helpers.ts \ $(wildcard ${dir_source}/widgets/*/logic.ts) \ - $(wildcard ${dir_source}/pages/*/logic.ts) \ ${dir_source}/main.ts @ ${cmd_log} "logic | compile …" @ ${cmd_mkdir} $(dir $@)