From 6c92725d5034aec382737204408da830579087a1 Mon Sep 17 00:00:00 2001 From: Fenris Wolf Date: Mon, 21 Oct 2024 19:19:11 +0200 Subject: [PATCH] [upd] plankton --- lib/plankton/plankton.d.ts | 191 +++++++----- lib/plankton/plankton.js | 610 ++++++++++++++++++++++++------------- source/style/common.css | 4 - 3 files changed, 507 insertions(+), 298 deletions(-) delete mode 100644 source/style/common.css diff --git a/lib/plankton/plankton.d.ts b/lib/plankton/plankton.d.ts index efe6f51..131483a 100644 --- a/lib/plankton/plankton.d.ts +++ b/lib/plankton/plankton.d.ts @@ -2995,6 +2995,10 @@ declare namespace lib_plankton.pit { type type_pit = int; } declare namespace lib_plankton.pit { + /** + * @todo complete + */ + function timezone_name_to_timezone_shift(timezone_name: string): int; /** */ function date_object_get_week_of_year(date: Date): int; @@ -3008,7 +3012,7 @@ declare namespace lib_plankton.pit { */ function to_date_object(pit: type_pit): Date; /** - * @todo timezone + * @todo test */ function to_datetime(pit: type_pit, options?: { timezone_shift?: int; @@ -3048,6 +3052,18 @@ declare namespace lib_plankton.pit { function to_ywd(pit: type_pit, options?: { timezone_shift?: int; }): type_ywd; + /** + * computes the point in time for switching to central european summer time + * + * @todo write tests + */ + function cest_switch_on(year: int): type_pit; + /** + * computes the point in time for switching away from central european summer time + * + * @todo write tests + */ + function cest_switch_off(year: int): type_pit; } declare namespace lib_plankton.www_form { /** @@ -3566,6 +3582,55 @@ declare namespace lib_plankton.zoo_input { write(value: string): Promise; } } +declare namespace lib_plankton.zoo_input { + /** + */ + type type_translations = { + add?: string; + remove?: string; + }; + /** + * @author fenris + */ + export class class_input_list implements interface_input> { + /** + */ + private element_input_factory; + /** + */ + private elements_container_dom; + /** + */ + private elements; + /** + */ + private translations; + /** + */ + constructor(element_input_factory: (() => interface_input), options?: { + translations?: type_translations; + }); + /** + */ + private clear; + /** + */ + private add; + /** + * [implementation] + */ + setup(parent: HTMLElement): Promise; + /** + * [implementation] + */ + read(): Promise>; + /** + * [implementation] + */ + write(value: Array): Promise; + } + export {}; +} declare namespace lib_plankton.zoo_input { /** * @author fenris @@ -3644,31 +3709,6 @@ declare namespace lib_plankton.zoo_input { write(value: (null | lib_plankton.pit.type_time)): Promise; } } -declare namespace lib_plankton.zoo_input { - /** - */ - class class_input_datetime implements interface_input { - /** - */ - private core; - /** - */ - constructor(options?: { - label_timezone_shift?: string; - label_date?: string; - label_time?: string; - }); - /** - */ - setup(parent: HTMLElement): Promise; - /** - */ - read(): Promise; - /** - */ - write(value: lib_plankton.pit.type_datetime): Promise; - } -} declare namespace lib_plankton.zoo_input { /** * @author fenris @@ -3699,55 +3739,6 @@ declare namespace lib_plankton.zoo_input { write(value: type_record): Promise; } } -declare namespace lib_plankton.zoo_input { - /** - */ - type type_translations = { - add?: string; - remove?: string; - }; - /** - * @author fenris - */ - export class class_input_list implements interface_input> { - /** - */ - private element_input_factory; - /** - */ - private elements_container_dom; - /** - */ - private elements; - /** - */ - private translations; - /** - */ - constructor(element_input_factory: (() => interface_input), options?: { - translations?: type_translations; - }); - /** - */ - private clear; - /** - */ - private add; - /** - * [implementation] - */ - setup(parent: HTMLElement): Promise; - /** - * [implementation] - */ - read(): Promise>; - /** - * [implementation] - */ - write(value: Array): Promise; - } - export {}; -} declare namespace lib_plankton.zoo_input { /** */ @@ -3775,6 +3766,56 @@ declare namespace lib_plankton.zoo_input { write(map: lib_plankton.map.type_map): Promise; } } +declare namespace lib_plankton.zoo_input { + /** + */ + class class_input_datetime implements interface_input { + /** + */ + private core; + /** + */ + constructor(options?: { + label_timezone_shift?: string; + label_date?: string; + label_time?: string; + }); + /** + */ + setup(parent: HTMLElement): Promise; + /** + */ + read(): Promise; + /** + */ + write(value: lib_plankton.pit.type_datetime): Promise; + } +} +declare namespace lib_plankton.zoo_input { + /** + * for central europe with daylight saving time feature + */ + class class_input_datetime_central_europe implements interface_input { + /** + */ + private core; + /** + */ + constructor(options?: { + label_date?: string; + label_time?: string; + }); + /** + */ + setup(parent: HTMLElement): Promise; + /** + */ + read(): Promise; + /** + */ + write(value: lib_plankton.pit.type_datetime): Promise; + } +} declare namespace lib_plankton.zoo_form { /** */ diff --git a/lib/plankton/plankton.js b/lib/plankton/plankton.js index 8c05bd1..4f669c0 100644 --- a/lib/plankton/plankton.js +++ b/lib/plankton/plankton.js @@ -8357,6 +8357,23 @@ var lib_plankton; (function (lib_plankton) { var pit; (function (pit_1) { + /** + * @todo complete + */ + function timezone_name_to_timezone_shift(timezone_name) { + const map = { + "UTC": 0, + "CET": +1, + "CEST": +2, + }; + if (!(timezone_name in map)) { + throw (new Error("unhandled timezone: " + timezone_name)); + } + else { + return map[timezone_name]; + } + } + pit_1.timezone_name_to_timezone_shift = timezone_name_to_timezone_shift; /** */ function date_object_get_week_of_year(date) { @@ -8402,7 +8419,7 @@ var lib_plankton; return Math.round(date_object.getTime() / 1000); } /** - * @todo timezone + * @todo test */ function to_datetime(pit, options = {}) { options = Object.assign({ @@ -8660,6 +8677,58 @@ var lib_plankton; ]); } pit_1.to_ywd = to_ywd; + /** + * computes the point in time for switching to central european summer time + * + * @todo write tests + */ + function cest_switch_on(year) { + return lib_plankton.call.convey(year, [ + (x) => ({ + "timezone_shift": 0, + "date": { + "year": x, + "month": 4, + "day": 1, + }, + "time": { + "hour": 2, + "minute": 0, + "second": 0 + }, + }), + from_datetime, + trunc_week, + x => shift_day(x, -1), + ]); + } + pit_1.cest_switch_on = cest_switch_on; + /** + * computes the point in time for switching away from central european summer time + * + * @todo write tests + */ + function cest_switch_off(year) { + return lib_plankton.call.convey(year, [ + (x) => ({ + "timezone_shift": 0, + "date": { + "year": x, + "month": 11, + "day": 1, + }, + "time": { + "hour": 1, + "minute": 0, + "second": 0 + }, + }), + from_datetime, + trunc_week, + x => shift_day(x, -1), + ]); + } + pit_1.cest_switch_off = cest_switch_off; })(pit = lib_plankton.pit || (lib_plankton.pit = {})); })(lib_plankton || (lib_plankton = {})); /* @@ -10153,6 +10222,153 @@ 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 »bacterio-plankton:zoo-input«. If not, see . + */ +var lib_plankton; +(function (lib_plankton) { + var zoo_input; + (function (zoo_input) { + /** + * @author fenris + */ + class class_input_list { + /** + */ + constructor(element_input_factory, options = {}) { + options = Object.assign({ + "translations": { + "add": "add", + "remove": "remove", + }, + }, options); + this.element_input_factory = element_input_factory; + this.elements = []; + this.elements_container_dom = null; + this.translations = options.translations; + } + /** + */ + clear() { + this.elements_container_dom.innerHTML = ""; + this.elements = []; + return Promise.resolve(undefined); + } + /** + */ + async add() { + // model + let element_dom = document.createElement("div"); + const input = this.element_input_factory(); + this.elements.push({ "dom": element_dom, "input": input }); + // view & control + { + element_dom.classList.add("plankton_input_list_element"); + // remover + { + let remover_dom = document.createElement("button"); + remover_dom.classList.add("plankton_input_list_button"); + remover_dom.classList.add("plankton_input_list_element_remover"); + remover_dom.setAttribute("title", this.translations.remove); + remover_dom.textContent = "x"; + remover_dom.addEventListener("click", (event) => { + event.preventDefault(); + const index = this.elements.findIndex(element => (element.input === input)); + const element = this.elements[index]; + this.elements_container_dom.removeChild(element.dom); + this.elements.splice(index, 1); + }); + element_dom.appendChild(remover_dom); + } + // input + { + let input_dom = document.createElement("div"); + input_dom.classList.add("plankton_input_list_element_input"); + await input.setup(input_dom); + element_dom.appendChild(input_dom); + } + this.elements_container_dom.appendChild(element_dom); + } + return Promise.resolve(input); + } + /** + * [implementation] + */ + setup(parent) { + let container_dom = document.createElement("div"); + container_dom.classList.add("plankton_input_list"); + // elements + { + this.elements_container_dom = document.createElement("div"); + this.elements_container_dom.classList.add("plankton_input_list_elements"); + container_dom.appendChild(this.elements_container_dom); + } + // foot + { + let footer_dom = document.createElement("div"); + footer_dom.classList.add("plankton_input_list_foot"); + // adder + { + let adder_dom = document.createElement("button"); + adder_dom.classList.add("plankton_input_list_button"); + adder_dom.classList.add("plankton_input_list_adder"); + adder_dom.setAttribute("title", this.translations.add); + adder_dom.textContent = "+"; + adder_dom.addEventListener("click", (event) => { + event.preventDefault(); + this.add(); + }); + footer_dom.appendChild(adder_dom); + } + container_dom.appendChild(footer_dom); + } + parent.appendChild(container_dom); + return Promise.resolve(undefined); + } + /** + * [implementation] + */ + read() { + return (Promise.all(this.elements + .map((element, index) => (element.input.read() + .then((element_value) => Promise.resolve({ + "index": index, + "value": element_value, + }))))) + .then((elements) => Promise.resolve(elements + .sort((x, y) => ((x.index <= y.index) ? 0 : 1)) + .map(element => element.value)))); + } + /** + * [implementation] + */ + write(value) { + return (this.clear() + .then(() => Promise.all(value + .map((element_value) => (this.add() + .then(element_input => element_input.write(element_value)))))) + .then(() => Promise.resolve(undefined))); + } + } + zoo_input.class_input_list = class_input_list; + })(zoo_input = lib_plankton.zoo_input || (lib_plankton.zoo_input = {})); +})(lib_plankton || (lib_plankton = {})); +/* +This file is part of »bacterio-plankton:zoo-input«. + +Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' + + +»bacterio-plankton:zoo-input« 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. + +»bacterio-plankton:zoo-input« 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 »bacterio-plankton:zoo-input«. If not, see . */ @@ -10360,77 +10576,6 @@ 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 »bacterio-plankton:zoo-input«. If not, see . - */ -var lib_plankton; -(function (lib_plankton) { - var zoo_input; - (function (zoo_input) { - /** - */ - class class_input_datetime { - /** - */ - constructor(options = {}) { - options = Object.assign({ - "label_timezone_shift": "", - "label_date": "", - "label_time": "", - }, options); - this.core = new zoo_input.class_input_group([ - { - "name": "timezone_shift", - "input": new zoo_input.class_input_number(), - "label": options.label_timezone_shift, - }, - { - "name": "date", - "input": new zoo_input.class_input_date(), - "label": options.label_date, - }, - { - "name": "time", - "input": new zoo_input.class_input_soft(new zoo_input.class_input_time()), - "label": options.label_time, - }, - ]); - } - /** - */ - async setup(parent) { - return this.core.setup(parent); - } - /** - */ - async read() { - return this.core.read(); - } - /** - */ - async write(value) { - return this.core.write(value); - } - } - zoo_input.class_input_datetime = class_input_datetime; - })(zoo_input = lib_plankton.zoo_input || (lib_plankton.zoo_input = {})); -})(lib_plankton || (lib_plankton = {})); -/* -This file is part of »bacterio-plankton:zoo-input«. - -Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' - - -»bacterio-plankton:zoo-input« 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. - -»bacterio-plankton:zoo-input« 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 »bacterio-plankton:zoo-input«. If not, see . */ @@ -10538,153 +10683,6 @@ 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 »bacterio-plankton:zoo-input«. If not, see . - */ -var lib_plankton; -(function (lib_plankton) { - var zoo_input; - (function (zoo_input) { - /** - * @author fenris - */ - class class_input_list { - /** - */ - constructor(element_input_factory, options = {}) { - options = Object.assign({ - "translations": { - "add": "add", - "remove": "remove", - }, - }, options); - this.element_input_factory = element_input_factory; - this.elements = []; - this.elements_container_dom = null; - this.translations = options.translations; - } - /** - */ - clear() { - this.elements_container_dom.innerHTML = ""; - this.elements = []; - return Promise.resolve(undefined); - } - /** - */ - async add() { - // model - let element_dom = document.createElement("div"); - const input = this.element_input_factory(); - this.elements.push({ "dom": element_dom, "input": input }); - // view & control - { - element_dom.classList.add("plankton_input_list_element"); - // remover - { - let remover_dom = document.createElement("button"); - remover_dom.classList.add("plankton_input_list_button"); - remover_dom.classList.add("plankton_input_list_element_remover"); - remover_dom.setAttribute("title", this.translations.remove); - remover_dom.textContent = "x"; - remover_dom.addEventListener("click", (event) => { - event.preventDefault(); - const index = this.elements.findIndex(element => (element.input === input)); - const element = this.elements[index]; - this.elements_container_dom.removeChild(element.dom); - this.elements.splice(index, 1); - }); - element_dom.appendChild(remover_dom); - } - // input - { - let input_dom = document.createElement("div"); - input_dom.classList.add("plankton_input_list_element_input"); - await input.setup(input_dom); - element_dom.appendChild(input_dom); - } - this.elements_container_dom.appendChild(element_dom); - } - return Promise.resolve(input); - } - /** - * [implementation] - */ - setup(parent) { - let container_dom = document.createElement("div"); - container_dom.classList.add("plankton_input_list"); - // elements - { - this.elements_container_dom = document.createElement("div"); - this.elements_container_dom.classList.add("plankton_input_list_elements"); - container_dom.appendChild(this.elements_container_dom); - } - // foot - { - let footer_dom = document.createElement("div"); - footer_dom.classList.add("plankton_input_list_foot"); - // adder - { - let adder_dom = document.createElement("button"); - adder_dom.classList.add("plankton_input_list_button"); - adder_dom.classList.add("plankton_input_list_adder"); - adder_dom.setAttribute("title", this.translations.add); - adder_dom.textContent = "+"; - adder_dom.addEventListener("click", (event) => { - event.preventDefault(); - this.add(); - }); - footer_dom.appendChild(adder_dom); - } - container_dom.appendChild(footer_dom); - } - parent.appendChild(container_dom); - return Promise.resolve(undefined); - } - /** - * [implementation] - */ - read() { - return (Promise.all(this.elements - .map((element, index) => (element.input.read() - .then((element_value) => Promise.resolve({ - "index": index, - "value": element_value, - }))))) - .then((elements) => Promise.resolve(elements - .sort((x, y) => ((x.index <= y.index) ? 0 : 1)) - .map(element => element.value)))); - } - /** - * [implementation] - */ - write(value) { - return (this.clear() - .then(() => Promise.all(value - .map((element_value) => (this.add() - .then(element_input => element_input.write(element_value)))))) - .then(() => Promise.resolve(undefined))); - } - } - zoo_input.class_input_list = class_input_list; - })(zoo_input = lib_plankton.zoo_input || (lib_plankton.zoo_input = {})); -})(lib_plankton || (lib_plankton = {})); -/* -This file is part of »bacterio-plankton:zoo-input«. - -Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' - - -»bacterio-plankton:zoo-input« 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. - -»bacterio-plankton:zoo-input« 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 »bacterio-plankton:zoo-input«. If not, see . */ @@ -10739,6 +10737,180 @@ var lib_plankton; })(zoo_input = lib_plankton.zoo_input || (lib_plankton.zoo_input = {})); })(lib_plankton || (lib_plankton = {})); /* +This file is part of »bacterio-plankton:zoo-input«. + +Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' + + +»bacterio-plankton:zoo-input« 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. + +»bacterio-plankton:zoo-input« 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 »bacterio-plankton:zoo-input«. If not, see . + */ +var lib_plankton; +(function (lib_plankton) { + var zoo_input; + (function (zoo_input) { + /** + */ + class class_input_datetime { + /** + */ + constructor(options = {}) { + options = Object.assign({ + "label_date": "", + "label_time": "", + "label_timezone_shift": "", + }, options); + this.core = new zoo_input.class_input_group([ + { + "name": "date", + "input": new zoo_input.class_input_date(), + "label": options.label_date, + }, + { + "name": "time", + "input": new zoo_input.class_input_soft(new zoo_input.class_input_time()), + "label": options.label_time, + }, + { + "name": "timezone_shift", + "input": new zoo_input.class_input_number(), + "label": options.label_timezone_shift, + }, + ]); + } + /** + */ + setup(parent) { + return this.core.setup(parent); + } + /** + */ + read() { + return this.core.read(); + } + /** + */ + write(value) { + return this.core.write(value); + } + } + zoo_input.class_input_datetime = class_input_datetime; + })(zoo_input = lib_plankton.zoo_input || (lib_plankton.zoo_input = {})); +})(lib_plankton || (lib_plankton = {})); +/* +This file is part of »bacterio-plankton:zoo-input«. + +Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' + + +»bacterio-plankton:zoo-input« 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. + +»bacterio-plankton:zoo-input« 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 »bacterio-plankton:zoo-input«. If not, see . + */ +var lib_plankton; +(function (lib_plankton) { + var zoo_input; + (function (zoo_input) { + /** + * for central europe with daylight saving time feature + */ + class class_input_datetime_central_europe { + /** + */ + constructor(options = {}) { + options = Object.assign({ + "label_date": "", + "label_time": "", + }, options); + this.core = new zoo_input.class_input_group([ + { + "name": "date", + "input": new zoo_input.class_input_date(), + "label": options.label_date, + }, + { + "name": "time", + "input": new zoo_input.class_input_soft(new zoo_input.class_input_time()), + "label": options.label_time, + }, + ]); + } + /** + */ + setup(parent) { + return this.core.setup(parent); + } + /** + */ + async read() { + const datetime_easy = await this.core.read(); + const datetime_cet = { + "timezone_shift": 1, + "date": datetime_easy.date, + "time": datetime_easy.time, + }; + const datetime_cest = { + "timezone_shift": 2, + "date": datetime_easy.date, + "time": datetime_easy.time, + }; + const datetime = (lib_plankton.pit.is_between(lib_plankton.pit.from_datetime(datetime_cet), lib_plankton.pit.cest_switch_on(datetime_easy.date.year), lib_plankton.pit.cest_switch_off(datetime_easy.date.year)) + ? + datetime_cest + : + datetime_cet); + if (datetime_easy.time === null) { + datetime.time = null; + } + else { + // do nothing + } + return Promise.resolve(datetime); + } + /** + */ + async write(value) { + const pit = lib_plankton.pit.from_datetime(value); + const datetime_utc = lib_plankton.pit.to_datetime(pit, { + "timezone_shift": 0, + }); + const datetime_relative = lib_plankton.pit.to_datetime(pit, { + "timezone_shift": (lib_plankton.pit.is_between(lib_plankton.pit.from_datetime(datetime_utc), lib_plankton.pit.cest_switch_on(datetime_utc.date.year), lib_plankton.pit.cest_switch_off(datetime_utc.date.year)) + ? + 2 + : + 1) + }); + const datetime_easy = { + "date": datetime_relative.date, + "time": ((value.time === null) ? null : datetime_relative.time), + }; + return this.core.write(datetime_easy); + } + } + zoo_input.class_input_datetime_central_europe = class_input_datetime_central_europe; + })(zoo_input = lib_plankton.zoo_input || (lib_plankton.zoo_input = {})); +})(lib_plankton || (lib_plankton = {})); +/* This file is part of »bacterio-plankton:zoo-form«. Copyright 2016-2024 'Christian Fraß, Christian Neubauer, Martin Springwald GbR' diff --git a/source/style/common.css b/source/style/common.css deleted file mode 100644 index cde5f65..0000000 --- a/source/style/common.css +++ /dev/null @@ -1,4 +0,0 @@ -.tableview-sources-entry:not(.tableview-sources-entry-active) -{ - filter: saturate(0); -}