diff --git a/source/logic/backend.ts b/source/logic/backend.ts index e6741a2..1c76b31 100644 --- a/source/logic/backend.ts +++ b/source/logic/backend.ts @@ -211,12 +211,24 @@ namespace _espe.backend /** */ export async function member_list( - ) : Promise> + search_term : (null | string) + ) : Promise< + Array< + { + id : int; + preview : { + membership_number : string; + name_real_value : string; + name_real_index : int; + }; + } + > + > { return ( abstract_call( "GET", - "/member" + ("/member/list" + ((search_term === null) ? "" : ("?search_term=" + search_term))) ) ); } @@ -226,11 +238,49 @@ namespace _espe.backend */ export async function member_get( id : int - ) : Promise + ) : Promise< + { + membership_number : string; + name_real_value : string; + name_real_index : int; + email_address_private : (null | string); + registered : boolean; + enabled : boolean; + email_use_veiled_address : boolean; + email_use_nominal_address : boolean; + email_redirect_to_private_address : boolean; + email_allow_sending : boolean; + password_set : boolean; + } + > { return abstract_call( "GET", - "/member/" + id.toFixed(0) + ("/member/read/" + id.toFixed(0)) + ); + } + + + /** + */ + export async function member_project( + data : { + membership_number : string; + name_real_value : string; + email_address_private : (null | string); + } + ) : Promise + { + return abstract_call( + "POST", + "/member/project", + { + "data": { + "membership_number": data.membership_number, + "name_real_value": data.name_real_value, + "email_address_private": data.email_address_private, + } + } ); } @@ -238,98 +288,25 @@ namespace _espe.backend /** */ export async function member_get2( - id : int + id : int, + key : string ) : Promise< { - name_real : string; + name_real_value : string; + name_real_index : int; name_login : string; - email_address_numerical_value : string; - email_address_namely_value : string; + email_address_veiled : string; + email_address_nominal : string; } > { return abstract_call( "GET", - "/member/get/" + id.toFixed(0) - ); - } - - - /** - */ - export async function member_add( - data : Record - ) : Promise - { - return abstract_call( - "POST", - "/member", - { - "data": { - "membership_number": data["membership_number"], - "enabled": data["enabled"], - "name_real_value": data["name_real_value"], - "name_real_extension": data["name_real_extension"], - "name_display": data["name_display"], - "name_login": data["name_login"], - "password_image": null, - "email_address_private_value": data["email_address_private_value"], - "email_address_numberbased_use": data["email_address_numberbased_use"], - "email_address_namebased_use": data["email_address_namebased_use"], - "email_redirect_to_private": data["email_redirect_to_private"], - "salutation": data["salutation"], - } - } - ); - } - - - /** - */ - export async function member_modify( - id : int, - data : Record - ) : Promise - { - return abstract_call( - "PATCH", - "/member/" + id.toFixed(0), - { - "data": { - "membership_number": data["membership_number"], - "enabled": data["enabled"], - "name_real_value": data["name_real_value"], - "name_real_extension": data["name_real_extension"], - "name_display": data["name_display"], - "name_login": data["name_login"], - "password_image": null, - "email_address_private_value": data["email_address_private_value"], - "email_address_numberbased_use": data["email_address_numberbased_use"], - "email_address_namebased_use": data["email_address_namebased_use"], - "email_redirect_to_private": data["email_redirect_to_private"], - "salutation": data["salutation"], - } - } - ); - } - - - /** - */ - export async function member_urge_for_registration( - id : int, - url : string - ) : Promise - { - return ( - abstract_call( - "POST", - "/member/urge_for_registration", + lib_plankton.string.coin( + "/member/info/{{id}}?key={{key}}", { - "data": { - "id": id, - "url": url, - }, + "id": id.toFixed(0), + "key": key, } ) ); @@ -342,19 +319,23 @@ namespace _espe.backend id : int, verification : string, data : { - name_login : string; - name_display : string; - salutation : string; - email_mode : ("none" | "number" | "number_and_name"); - email_redirect : boolean; - password : string; + email_use_veiled_address : boolean; + email_use_nominal_address : boolean; + email_redirect_to_private_address : boolean; + password : (null | string); } ) : Promise { return ( abstract_call( "POST", - "/member/register/" + id.toFixed(0) + "?verification=" + verification, + lib_plankton.string.coin( + "/member/register/{{id}}?key={{key}}", + { + "id": id.toFixed(0), + "key": verification, + } + ), { "data": data, } @@ -362,4 +343,46 @@ namespace _espe.backend ); } + + /** + */ + export async function member_modify( + id : int, + data : { + email_address_private : (null | string); + registered : boolean; + enabled : boolean; + } + ) : Promise + { + return abstract_call( + "PATCH", + ("/member/modify/" + id.toFixed(0)), + { + "data": data + } + ); + } + + + /** + */ + export async function member_summon( + id : int, + url : string + ) : Promise + { + return ( + abstract_call( + "POST", + ("/member/summon/" + id.toFixed(0)), + { + "data": { + "url_template": url, + }, + } + ) + ); + } + } diff --git a/source/logic/helpers.ts b/source/logic/helpers.ts new file mode 100644 index 0000000..4141a92 --- /dev/null +++ b/source/logic/helpers.ts @@ -0,0 +1,12 @@ + +/** + * @todo outsource + */ +function template_request( + id : string +) : DocumentFragment +{ + let dom_template = document.querySelector("template#" + id); + // return template["content"].cloneNode(true); + return (document.importNode(dom_template["content"], true) as DocumentFragment) +} diff --git a/source/logic/main.ts b/source/logic/main.ts index f1b3397..95e107f 100644 --- a/source/logic/main.ts +++ b/source/logic/main.ts @@ -1,16 +1,4 @@ -/** - */ -function template_request( - id : string -) : DocumentFragment -{ - let dom_template = document.querySelector("template#" + id); - // return template["content"].cloneNode(true); - return (document.importNode(dom_template["content"], true) as DocumentFragment) -} - - /** */ async function update_nav( @@ -62,13 +50,13 @@ function setup_nav( "classes": ["logged_in"], }, { - "location": {"name": "create", "parameters": {}}, - "label": "Mitglied anlegen", + "location": {"name": "list", "parameters": {}}, + "label": "Liste", "classes": ["logged_in"], }, { - "location": {"name": "members", "parameters": {}}, - "label": "Mitglieder-Übersicht", + "location": {"name": "create", "parameters": {}}, + "label": "Anlegen", "classes": ["logged_in"], }, ]; diff --git a/source/pages/create/logic.ts b/source/pages/create/logic.ts index 38f1b81..18e3e39 100644 --- a/source/pages/create/logic.ts +++ b/source/pages/create/logic.ts @@ -5,23 +5,23 @@ lib_plankton.zoo_page.register( { membership_number : string; name_real_value : string; - email_address_private_value : (null | string); + email_address_private : (null | string); }, { membership_number : string; name_real_value : string; - email_address_private_value : string; + email_address_private : string; } >( value => ({ "membership_number": value.membership_number, "name_real_value": value.name_real_value, - "email_address_private_value": (value.email_address_private_value ?? ""), + "email_address_private": (value.email_address_private ?? ""), }), representation => ({ "membership_number": representation.membership_number, "name_real_value": representation.name_real_value, - "email_address_private_value": representation.email_address_private_value, + "email_address_private": representation.email_address_private, }), new lib_plankton.zoo_input.class_input_group( [ @@ -36,7 +36,7 @@ lib_plankton.zoo_page.register( "label": "Echter Name", }, { - "name": "email_address_private_value", + "name": "email_address_private", "input": new lib_plankton.zoo_input.class_input_text(), "label": "Private E-Mail-Adresse", }, @@ -47,21 +47,7 @@ lib_plankton.zoo_page.register( "label": "Senden", "procedure": async (get_value, get_representation) => { const value = await get_value(); - const id : int = await _espe.backend.member_add( - { - "membership_number": value.membership_number, - "name_real_value": value.name_real_value, - "email_address_private_value": value.email_address_private_value, - "name_real_extension": null, - "name_display": null, - "name_login": null, - "salutation": null, - "password_image": null, - "email_address_numberbased_use": false, - "email_address_namebased_use": false, - "email_redirect_to_private": false, - } - ); + const id : int = await _espe.backend.member_project(value); lib_plankton.zoo_page.set({"name": "view", "parameters": {"id": id}}); }, } diff --git a/source/pages/index/logic.ts b/source/pages/index/logic.ts new file mode 100644 index 0000000..2a1777d --- /dev/null +++ b/source/pages/index/logic.ts @@ -0,0 +1,6 @@ +lib_plankton.zoo_page.register( + "index", + async (parameters, target_element) => { + // do nothing + } +); diff --git a/source/pages/index/structure.html b/source/pages/index/structure.html new file mode 100644 index 0000000..e69de29 diff --git a/source/pages/index/style.css b/source/pages/index/style.css new file mode 100644 index 0000000..e69de29 diff --git a/source/pages/list/logic.ts b/source/pages/list/logic.ts new file mode 100644 index 0000000..29e02ca --- /dev/null +++ b/source/pages/list/logic.ts @@ -0,0 +1,68 @@ +lib_plankton.zoo_page.register( + "list", + (parameters, target_element) => { + type type_item = { + id : int; + preview : { + membership_number : string; + name_real_value : string; + name_real_index : int; + }; + }; + const term : (null | string) = (parameters["term"] ?? null); + const search : lib_plankton.zoo_search.type_search = lib_plankton.zoo_search.make( + (term) => _espe.backend.member_list(term), + { + "encode_item": (item) => lib_plankton.string.coin( + "{{membership_number}} | {{name}}{{addition}}", + { + "membership_number": item.preview.membership_number, + "name": item.preview.name_real_value, + "addition": ( + ( + (item.preview.name_real_index === null) + || + (item.preview.name_real_index <= 1) + ) + ? "" + : (" (" + item.preview.name_real_index.toFixed(0) + ")") + ), + } + ), + "hooks_begin": [ + (term) => { + lib_plankton.zoo_page.set( + { + "name": "list", + "parameters": { + "term": term, + } + } + ); + } + ], + "hooks_select": [ + (item) => { + lib_plankton.zoo_page.set( + { + "name": "view", + "parameters": { + "id": item.id.toFixed(0), + } + } + ); + } + ] + } + ); + lib_plankton.zoo_search.render( + search, + target_element, + { + "state": { + "term": term, + } + } + ); + } +); diff --git a/source/pages/list/structure.html b/source/pages/list/structure.html new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/source/pages/list/structure.html @@ -0,0 +1 @@ + diff --git a/source/pages/list/style.css b/source/pages/list/style.css new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/source/pages/list/style.css @@ -0,0 +1 @@ + diff --git a/source/pages/register/logic.ts b/source/pages/register/logic.ts index e8c730f..75a204d 100644 --- a/source/pages/register/logic.ts +++ b/source/pages/register/logic.ts @@ -1,12 +1,14 @@ lib_plankton.zoo_page.register( "register", async (parameters, target_element) => { - const set_state = function (state) { + function set_state( + state : ("load" | "fill" | "wait" | "done"), + message : (null | string) = null + ) : void + { target_element.querySelector(".register").setAttribute("rel", state); - }; - const set_message = function (message) { - target_element.querySelector(".register-message").textContent = message; - }; + target_element.querySelector(".register-message").textContent = (message ?? ""); + } const id : int = parseInt(parameters["id"]); const verification : string = parameters["verification"]; @@ -15,277 +17,127 @@ lib_plankton.zoo_page.register( update_nav({"mode": null}); const member_data : { - name_real : string; + name_real_value : string; + name_real_index : int; name_login : string; - email_address_numerical_value : string; - email_address_namely_value : string; - } = await _espe.backend.member_get2(id); + email_address_veiled : string; + email_address_nominal : string; + } = await _espe.backend.member_get2(id, verification); - if (false) + target_element.appendChild(template_request("register")); + + set_state("load"); + + // info { - const form = new lib_plankton.zoo_form.class_form( - x => x, - x => x, - new lib_plankton.zoo_input.class_input_group( + } + // form + { + let input : lib_plankton.zoo_input.interface_input< + { + email_address : ("none" | "only_veiled" | "both"); + email_redirect : boolean; + password_value : string; + password_confirmation : string; + } + >; + // input + { + input = new lib_plankton.zoo_input.class_input_group( [ { - "name": "id", - "input": new lib_plankton.zoo_input.class_input_hidden(), - }, - { - "name": "verification", - "input": new lib_plankton.zoo_input.class_input_hidden(), - }, - { - "name": "email_mode", + "name": "email_address", "input": new lib_plankton.zoo_input.class_input_enumeration( [ {"value": "none", "label": "keine"}, - {"value": "number", "label": "nur numerische" + " " + ("(" + member_data.email_address_numerical_value + ")")}, - {"value": "number_and_name", "label": "numerische und namentliche" + " " + ("(" + member_data.email_address_namely_value + ")")}, + {"value": "only_veiled", "label": "nur pseudonymisiert"}, + {"value": "both", "label": "pseudonymisiert und namentlich"}, ] ), "label": "Partei-E-Mail-Adresse einrichten", - "help": "Die nummernbasierte Partei-E-Mail-Adresse hat folgenden schematischen Aufbau: \"mitglied-@dielinke-sachsen.de\", z.B. \"mitglied-11223344@dielinke-sachsen.de\".\n\nDie namensbasierte Partei-E-Mail-Adresse hat folgenden schematischen Aufbau: \"@dielinke-sachsen.de\". Beispiel: \"Karl Liebknecht\" würde die Adresse \"karl.liebknecht@dielinke-sachsen.de\" bekommen.\n\nDie Partei-E-Mail-Adressen können zum Empfangen von E-Mails verwendet werden. Falls es nötig werden sollte, dass du auch E-Mails mit über die Partei-Adresse verschicken kannst, wende dich bitte an den/die Mitgliederbeauftragte:n!" + "help": ( + [ + "Für Partei-Angelegenheiten möchten wir dir anbieten gesonderte E-Mail-Adressen zu verwenden.", + lib_plankton.string.coin( + "Deine namentliche E-Mail-Adresse würde lauten »{{email_address_nominal}}« und die pseudonymisierte »{{email_address_veiled}}«.", + { + "email_address_veiled": member_data.email_address_veiled, + "email_address_nominal": member_data.email_address_nominal, + } + ), + "Die Partei-E-Mail-Adressen können zum Empfangen von E-Mails verwendet werden. Falls es nötig werden sollte, dass du auch E-Mails mit über die Partei-Adresse verschicken kannst, wende dich bitte an den/die Mitgliederbeauftragte:n!", + ] + .join("\n\n") + ) }, { "name": "email_redirect", - "input": new lib_plankton.zoo_input.class_input_checkbox(), - "label": "eingehende E-Mails zu privater Adresse umleiten", - "help": "Um die bei der Partei-Adresse eingegangenen E-Mails zu lesen, gibt es zwei Wege: Entweder du hinterlegst das zugehörige Konto im E-Mail-Client-Programm deiner Wahl und kümmerst dich selbst darum die E-Mails regelmäßig abzurufen oder die E-Mails werden an deine private Adresse weitergeleitet, sodass sie bei deinen gewöhnlichen E-Mails mit auftauchen.\n\nWenn du dir unsicher bist, empfehlen wir dir die Umleitung anzuschalten.", - }, - { - "name": "name_display", - "input": new lib_plankton.zoo_input.class_input_text({"read_only": true}), - "label": "Anzeigename", - "help": "So wirst du bei Online-Diensten anderen angezeigt.", - }, - { - "name": "salutation", - "input": new lib_plankton.zoo_input.class_input_text(), - "label": "Anrede/Pronomen (z.B. 'er/ihn')", - }, - { - "name": "name_login", - "input": new lib_plankton.zoo_input.class_input_text( - { - "pattern": "^[0-9a-zA-Z_]+$", - "read_only": true, - } + "input": new lib_plankton.zoo_input.class_input_checkbox( ), - "label": "Anmeldename", - "help": "Dieser Wert ist der Nutzername für die Anmeldung bei den Online-Diensten. Hierfür solltest du etwas kurzes und prägnantes wählen. Diesen Namen bekommt für gewöhnlich niemand zu sehen. Bitte beachte, dass der Name noch verfügbar sein muss!", + "label": "eingehende E-Mails an private Adresse leiten", }, { - "name": "password", - "input": new lib_plankton.zoo_input.class_input_password(), - "label": "Passwort", - "help": "Das Passwort für die Anmeldung bei den Online-Diensten", + "name": "password_value", + "input": new lib_plankton.zoo_input.class_input_password( + ), + "label": "Passwort für Netz-Dienste", + "help": "Das Passwort für die Anmeldung bei den Netz-Diensten.\n\nDu solltest dir merken oder geeignet abspeichern, was du hier einträgst.\n\nSolltest du dieses Passwort mal vergessen oder verlieren, hast du die Möglichkeit ein neues zu setzen.", }, { "name": "password_confirmation", - "input": new lib_plankton.zoo_input.class_input_password(), + "input": new lib_plankton.zoo_input.class_input_password( + ), "label": "Passwort wiederholen", }, ] - ), - [ + ); + await input.setup(target_element.querySelector(".register-form-input") as HTMLElement); + await input.write( { - "label": "Senden", - "procedure": async (get_value, get_representation) => { - set_message("wird verarbeitet …"); + "email_address": "both", + "email_redirect": true, + "password_value": "", + "password_confirmation": "", + } + ); + } + // actions + { + target_element.querySelector(".register-form-action-send").addEventListener( + "click", + async (event) => { + const value : { + email_address : ("none" | "only_veiled" | "both"); + email_redirect : boolean; + password_value : string; + password_confirmation : string; + } = await input.read(); + if (value.password_value !== value.password_confirmation) { + alert("Die Passwörter stimmen nicht überein"); + set_state("fill"); + } + else { set_state("wait"); - - const value : any = await get_value(); - - if (value.password !== value.password_confirmation) { - set_message("Die Passwörter stimmen nicht überein."); - set_state("fill"); + try { + await _espe.backend.member_register( + id, + verification, + { + "email_use_veiled_address": (value.email_address !== "none"), + "email_use_nominal_address": (value.email_address === "both"), + "email_redirect_to_private_address": value.email_redirect, + "password": value.password_value, + } + ); } - else { - try { - await _espe.backend.member_register( - id, - verification, - value - ); - set_message("Danke!"); - set_state("done"); - } - catch (error) { - set_message("Da ist etwas schief gelaufen :/"); - set_state("fill"); - } + catch (error) { + set_state("fill", "Da ist etwas schief gelaufen :/"); } - }, - }, - ] - ); - - target_element.appendChild(template_request("register")); - - await form.setup(target_element.querySelector(".register-form") as HTMLElement); - await form.input_write( - { - "id": id, - "verification": verification, - "name_login": member_data.name_login, - "name_display": member_data.name_real, - "salutation": "", - "email_mode": "number_and_name", - "email_redirect": true, - "password": "", - "password_confirmation": "", - } - ); - set_state("fill"); - } - - { - let dom_email_setting_container : HTMLElement = document.createElement("fieldset"); - dom_email_setting_container.classList.add("register-email_setting"); - { - let dom_legend : HTMLElement = document.createElement("legend"); - dom_legend.textContent = "E-Mail-Einstellungen"; - dom_email_setting_container.appendChild(dom_legend); - } - - async function update_email_setting() { - const value : boolean = (await input_email_use.read())["use"]; - dom_email_setting_container.classList.toggle("show", value); - } - - const input_email_use = new lib_plankton.zoo_input.class_input_group( - [ - { - "name": "use", - "input": new lib_plankton.zoo_input.class_input_checkbox( - { - "hooks_change": [ - (value) => {update_email_setting();} - ] - } - ), - "label": "Partei-E-Mail-Adresse einrichten", + set_state("done", "Danke!"); + } } - ] - ); - const input_email_setting = new lib_plankton.zoo_input.class_input_group( - [ - { - "name": "numerical", - "input": new lib_plankton.zoo_input.class_input_checkbox( - ), - "label": ("numerisch" + " : " + ("" + member_data.email_address_numerical_value + "")), - }, - { - "name": "namely", - "input": new lib_plankton.zoo_input.class_input_checkbox( - ), - "label": ("namentlich" + " : " + ("" + member_data.email_address_namely_value + "")), - }, - ] - ); - await input_email_use.setup(target_element as HTMLElement); - target_element.appendChild(dom_email_setting_container); - await input_email_setting.setup(dom_email_setting_container); - await input_email_setting.write( - { - "numerical": true, - "namely": true, - } - ); - - await input_email_use.write({"use": true}); - update_email_setting(); - } - { - let dom_service_data_container : HTMLElement = document.createElement("fieldset"); - { - let dom_legend : HTMLElement = document.createElement("legend"); - dom_legend.textContent = "Angaben für Netzdienste"; - dom_service_data_container.appendChild(dom_legend); + ); } - dom_service_data_container.classList.add("register-services_data"); - - async function update_service_data() { - const value : boolean = (await input_service_use.read())["use"]; - dom_service_data_container.classList.toggle("show", value); - /* - if (value) { - dom_service_data_container.removeAttribute("disabled"); - } - else { - dom_service_data_container.setAttribute("disabled", "disabled"); - } - */ - } - - const input_service_use = new lib_plankton.zoo_input.class_input_group( - [ - { - "name": "use", - "input": new lib_plankton.zoo_input.class_input_checkbox( - { - "hooks_change": [ - (value) => {update_service_data();} - ] - } - ), - "label": "Netz-Dienste nutzen", - } - ] - ); - const input_service_data = new lib_plankton.zoo_input.class_input_group( - [ - { - "name": "name_display", - "input": new lib_plankton.zoo_input.class_input_text( - { - } - ), - "label": "Anzeigename", - "help": "So wirst du bei Online-Diensten anderen angezeigt.", - }, - { - "name": "name_login", - "input": new lib_plankton.zoo_input.class_input_text( - { - "pattern": "^[0-9a-zA-Z_]+$", - } - ), - "label": "Anmeldename", - "help": "Dieser Wert ist der Nutzername für die Anmeldung bei den Online-Diensten. Hierfür solltest du etwas kurzes und prägnantes wählen. Diesen Namen bekommt für gewöhnlich niemand zu sehen. Bitte beachte, dass der Name noch verfügbar sein muss!", - }, - { - "name": "password", - "input": new lib_plankton.zoo_input.class_input_password( - ), - "label": "Passwort", - "help": "Das Passwort für die Anmeldung bei den Online-Diensten", - }, - { - "name": "password_confirmation", - "input": new lib_plankton.zoo_input.class_input_password( - ), - "label": "Passwort wiederholen", - }, - ] - ); - await input_service_use.setup(target_element as HTMLElement); - target_element.appendChild(dom_service_data_container); - await input_service_data.setup(dom_service_data_container); - await input_service_data.write( - { - "name_display": member_data.name_real, - "name_login": member_data.name_login, - "password": "", - "password_confirmation": "", - } - ); - - await input_service_use.write({"use": true}); - update_service_data(); } }, ); diff --git a/source/pages/register/structure.html b/source/pages/register/structure.html index f080744..c9d07f9 100644 --- a/source/pages/register/structure.html +++ b/source/pages/register/structure.html @@ -1,36 +1,16 @@ diff --git a/source/pages/register/style.css b/source/pages/register/style.css index 8c534d7..1c2273b 100644 --- a/source/pages/register/style.css +++ b/source/pages/register/style.css @@ -9,43 +9,3 @@ .register[rel="done"] .register-message {} .register[rel="done"] .register-form {display: none;} - -.register-email_setting -{ - overflow: hidden; -} - -.register-email_setting.show -{ - max-height: 100vh; - - transition: max-height 1.0s ease; -} - -.register-email_setting:not(.show) -{ - max-height: 0; - - transition: max-height 0.25s ease; -} - -.register-services_data -{ - overflow: hidden; -} - -.register-services_data.show -{ - max-height: 100vh; - - transition: max-height 1.0s ease; -} - -.register-services_data:not(.show) -{ - max-height: 0; - - transition: max-height 0.25s ease; -} -/* - */ diff --git a/source/pages/view/logic.ts b/source/pages/view/logic.ts index 59389ea..d815ad8 100644 --- a/source/pages/view/logic.ts +++ b/source/pages/view/logic.ts @@ -3,7 +3,32 @@ lib_plankton.zoo_page.register( async (parameters, target_element) => { const id : int = parseInt(parameters["id"]); - const form = new lib_plankton.zoo_form.class_form( + const form = new lib_plankton.zoo_form.class_form< + { + membership_number : string; + name_real_value : string; + name_real_index : int; + email_address_private : (null | string); + registered : boolean; + enabled : boolean; + email_use_veiled_address : boolean; + email_use_nominal_address : boolean; + email_redirect_to_private_address : boolean; + email_allow_sending : boolean; + }, + { + membership_number : string; + name_real_value : string; + name_real_index : int; + email_address_private : (null | string); + registered : boolean; + enabled : boolean; + email_use_veiled_address : boolean; + email_use_nominal_address : boolean; + email_redirect_to_private_address : boolean; + email_allow_sending : boolean; + } + >( value => value, representation => representation, new lib_plankton.zoo_input.class_input_group( @@ -15,39 +40,57 @@ lib_plankton.zoo_page.register( }, { "name": "name_real_value", - "input": new lib_plankton.zoo_input.class_input_text(), + "input": new lib_plankton.zoo_input.class_input_text({"read_only": true}), "label": "Echter Name", }, { - "name": "email_address_private_value", + "name": "name_real_index", + "input": new lib_plankton.zoo_input.class_input_number({"read_only": true}), + "label": "Namens-Index", + }, + { + "name": "email_address_private", "input": new lib_plankton.zoo_input.class_input_text(), "label": "Private E-Mail-Adresse", }, { - "name": "email_address_numberbased_use", + "name": "registered", "input": new lib_plankton.zoo_input.class_input_checkbox({"read_only": true}), - "label": "Nummernbasierte E-Mail-Adresse verwenden", + "label": "registriert", }, { - "name": "email_address_namebased_use", - "input": new lib_plankton.zoo_input.class_input_checkbox({"read_only": true}), - "label": "Namensbasierte E-Mail-Adresse verwenden", + "name": "enabled", + "input": new lib_plankton.zoo_input.class_input_checkbox(), + "label": "für Netz-Dienste freigeschalten", }, { - "name": "email_redirect", + "name": "email_use_veiled_address", + "input": new lib_plankton.zoo_input.class_input_checkbox({"read_only": true}), + "label": "Pseudonymisierte E-Mail-Adresse verwenden", + }, + { + "name": "email_use_nominal_address", + "input": new lib_plankton.zoo_input.class_input_checkbox({"read_only": true}), + "label": "Namentliche E-Mail-Adresse verwenden", + }, + { + "name": "email_redirect_to_private_address", "input": new lib_plankton.zoo_input.class_input_checkbox({"read_only": true}), "label": "eingehende E-Mails zu privater Adresse umleiten", }, + { + "name": "email_allow_sending", + "input": new lib_plankton.zoo_input.class_input_checkbox(), + "label": "Versenden von E-Mails erlaubt", + }, + /* { "name": "name_display", "input": new lib_plankton.zoo_input.class_input_text({"read_only": true}), "label": "Anzeigename", }, - { - "name": "salutation", - "input": new lib_plankton.zoo_input.class_input_text({"read_only": true}), - "label": "Anrede/Pronomen", - }, + */ + /* { "name": "name_login", "input": new lib_plankton.zoo_input.class_input_text( @@ -58,9 +101,24 @@ lib_plankton.zoo_page.register( ), "label": "Anmeldename", }, + */ ] ), [ + { + "label": "Änderungen speichern", + "procedure": async (get_value, get_representation) => { + const value = await get_value(); + await _espe.backend.member_modify( + id, + { + "email_address_private": value.email_address_private, + "enabled": value.enabled, + "registered": value.registered, + } + ); + }, + }, { "label": "Zur Registrierung auffordern", "procedure": async (get_value, get_representation) => { @@ -78,7 +136,7 @@ lib_plankton.zoo_page.register( ) ); - await _espe.backend.member_urge_for_registration(id, url); + await _espe.backend.member_summon(id, url); /* lib_plankton.zoo_page.set( @@ -100,11 +158,25 @@ lib_plankton.zoo_page.register( [ form.setup(dom_fragment.querySelector(".view-form") as HTMLElement), _espe.backend.member_get(id), + // _espe.backend.member_info(id), ] ) .then( - ([_, member]) => { - form.input_write(member); + ([_, member_object]) => { + form.input_write( + { + "membership_number": member_object.membership_number, + "name_real_value": member_object.name_real_value, + "name_real_index": member_object.name_real_index, + "email_address_private": member_object.email_address_private, + "registered": member_object.registered, + "enabled": member_object.enabled, + "email_use_veiled_address": member_object.email_use_veiled_address, + "email_use_nominal_address": member_object.email_use_nominal_address, + "email_redirect_to_private_address": member_object.email_redirect_to_private_address, + "email_allow_sending": member_object.email_allow_sending, + } + ); } ) ); diff --git a/source/pages/view/style.css b/source/pages/view/style.css index 888b8d3..bcfe4b1 100644 --- a/source/pages/view/style.css +++ b/source/pages/view/style.css @@ -12,5 +12,12 @@ .view-form > .plankton_form > .plankton_form_actions { + flex: 1; } + +.plankton_form_actions > * +{ + display: block; + margin: 8px; +} diff --git a/tools/makefile b/tools/makefile index a79caff..2ffc923 100644 --- a/tools/makefile +++ b/tools/makefile @@ -19,12 +19,14 @@ default: ${dir_build}/logic.js ${dir_build}/style.css ${dir_build}/index.html ${dir_temp}/logic-unlinked.js: \ ${dir_lib}/plankton/plankton.d.ts \ + ${dir_source}/logic/helpers.ts \ ${dir_source}/logic/backend.ts \ ${dir_source}/logic/conf.ts \ + ${dir_source}/pages/index/logic.ts \ ${dir_source}/pages/login/logic.ts \ ${dir_source}/pages/logout/logic.ts \ - ${dir_source}/pages/members/logic.ts \ ${dir_source}/pages/create/logic.ts \ + ${dir_source}/pages/list/logic.ts \ ${dir_source}/pages/view/logic.ts \ ${dir_source}/pages/register/logic.ts \ ${dir_source}/logic/main.ts @@ -40,10 +42,12 @@ ${dir_build}/logic.js: ${dir_lib}/plankton/plankton.js ${dir_temp}/logic-unlinke ${dir_build}/style.css: \ ${dir_source}/style/style.css \ + ${dir_source}/pages/index/style.css \ ${dir_source}/pages/login/style.css \ ${dir_source}/pages/logout/style.css \ ${dir_source}/pages/members/style.css \ ${dir_source}/pages/create/style.css \ + ${dir_source}/pages/list/style.css \ ${dir_source}/pages/view/style.css \ ${dir_source}/pages/register/style.css @ ${cmd_log} "style …" @@ -52,10 +56,12 @@ ${dir_build}/style.css: \ ${dir_build}/index.html: \ ${dir_source}/structure/index.html.tpl \ + ${dir_source}/pages/index/structure.html \ ${dir_source}/pages/login/structure.html \ ${dir_source}/pages/logout/structure.html \ ${dir_source}/pages/members/structure.html \ ${dir_source}/pages/create/structure.html \ + ${dir_source}/pages/list/structure.html \ ${dir_source}/pages/view/structure.html \ ${dir_source}/pages/register/structure.html @ ${cmd_log} "structure …"