From a0c0e9eb22044912ae32169d8652365c86907765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Fra=C3=9F?= Date: Thu, 3 Jul 2025 08:53:22 +0000 Subject: [PATCH] [task-193] [int] --- misc/model.ts | 183 ++++++++++++++++++++++++++ source/data/localization/deu.loc.json | 4 +- source/data/localization/eng.loc.json | 4 +- source/logic/backend.ts | 29 ++-- source/pages/invite_create/logic.ts | 6 +- source/pages/invite_handle/logic.ts | 136 +++++++++++++------ source/pages/member_view/logic.ts | 2 +- tools/build | 27 ++++ 8 files changed, 336 insertions(+), 55 deletions(-) create mode 100644 misc/model.ts diff --git a/misc/model.ts b/misc/model.ts new file mode 100644 index 0000000..3c719d3 --- /dev/null +++ b/misc/model.ts @@ -0,0 +1,183 @@ +type type_group = { + name : boolean; +}; + + +type type_property = { + name : string; + type : ( + "boolean" + | + "int" + | + "string" + ); +}; + + +type type_member = { + name : string; + groups : Array; + email_address : (null | string); + password_image : (null | string); + active : boolean; +}; + + +type type_model = { + groups : Array<{id : int; data : type_group;}>; + properties : Array<{id : int; data : type_property;}>; + members : Array<{id : int; data : type_member;}>; +}; + + +const model_linke_sx : type_model = { + "groups": [ + { + "id": 1, + "data": { + "name": "lv-sachsen" + } + }, + { + "id": 2, + "data": { + "name": "kv-zwickau" + } + }, + { + "id": 3, + "data": { + "name": "ov-glauchau" + } + }, + { + "id": 4, + "data": { + "name": "lag-netzpolitik_und_gaming" + } + }, + { + "id": 5, + "data": { + "name": "kv-leipzig" + } + }, + { + "id": 6, + "data": { + "name": "kv-dresden" + } + }, + ], + "properties": [ + { + "id": 1, + "data": { + "name": "real_name", + "type": "string" + } + }, + { + "id": 2, + "data": { + "name": "allow_email_sending", + "type": "boolean" + } + }, + ], + "members": [ + { + "id": 1, + "data": { + "name": "m1973476", + "groups": [1, 2, 3, 4], + "email_address": "christian.frass@dielinke-glauchau.de", + "password_image": "____", + "active": true, + "properties": [ + { + "id": 1, + "value": "Christian Fraß" + }, + { + "id": 2, + "value": true + }, + ] + } + }, + { + "id": 2, + "data": { + "name": "m2487647", + "groups": [1, 2, 4, 6], + "email_address": "paul.furkert@dielinke-dresden.de", + "password_image": "____", + "active": true, + "properties": [ + { + "id": 1, + "value": "Paul Furkert" + }, + { + "id": 2, + "value": true + }, + ] + } + }, + ], +}; + + +const model_ramsch_sx : type_model = { + "groups": [ + { + "id": 1, + "data": { + "name": "kulturknall" + } + }, + { + "id": 2, + "data": { + "name": "lixer" + } + }, + { + "id": 3, + "data": { + "name": "dill" + } + }, + ], + "properties": [ + ], + "members": [ + { + "id": 1, + "data": { + "name": "fenris", + "groups": [1, 2, 3], + "email_address": "roydfalk@folksprak.org", + "password_image": "____", + "active": true, + "properties": [ + ] + } + }, + { + "id": 2, + "data": { + "name": "magda", + "groups": [2], + "email_address": "magda@zschocher.com", + "password_image": "____", + "active": true, + "properties": [ + ] + } + }, + ] +}; diff --git a/source/data/localization/deu.loc.json b/source/data/localization/deu.loc.json index 2ea4083..cc35975 100644 --- a/source/data/localization/deu.loc.json +++ b/source/data/localization/deu.loc.json @@ -46,7 +46,7 @@ "page.member_register.form.field.email_address.option.both": "pseudonymisiert und namentlich", "page.member_register.form.field.email_redirect.label": "eingehende E-Mails an private Adresse leiten", "page.member_register.form.field.email_redirect.help": "", - "page.member_register.form.field.password_value.label": "Passwort für Netz-Dienste", + "page.member_register.form.field.password_value.label": "Passwort", "page.member_register.form.field.password_value.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.", "page.member_register.form.field.password_confirmation.label": "Passwort wiederholen", "page.member_register.form.field.password_confirmation.help": "", @@ -87,7 +87,7 @@ "page.invite_view.title": "Einladung", "page.invite_handle.title": "Einladung", "page.invite_handle.message.invalid": "ungültig", - "page.invite_handle.message.successfull": "erfolgreich", + "page.invite_handle.message.successful": "erfolgreich", "page.invite_handle.form.action.submit": "annehmen" } } diff --git a/source/data/localization/eng.loc.json b/source/data/localization/eng.loc.json index 33217f8..cc7075f 100644 --- a/source/data/localization/eng.loc.json +++ b/source/data/localization/eng.loc.json @@ -46,7 +46,7 @@ "page.member_register.form.field.email_address.option.both": "both, veiled and namely", "page.member_register.form.field.email_redirect.label": "redirect incoming e-mails to private address", "page.member_register.form.field.email_redirect.help": "", - "page.member_register.form.field.password_value.label": "password for online services", + "page.member_register.form.field.password_value.label": "password", "page.member_register.form.field.password_value.help": "the password for logging in to the online services\n\nYou should remember, denote or save properly, what you enter here.\n\nIn case you forget or lose the password some day, you can reset it.", "page.member_register.form.field.password_confirmation.label": "confirm password", "page.member_register.form.field.password_confirmation.help": "", @@ -87,7 +87,7 @@ "page.invite_view.title": "invitation", "page.invite_handle.title": "invitation", "page.invite_handle.message.invalid": "invalid", - "page.invite_handle.message.successfull": "successful", + "page.invite_handle.message.successful": "successful", "page.invite_handle.form.action.submit": "accept" } } diff --git a/source/logic/backend.ts b/source/logic/backend.ts index 3e0417c..93faffa 100644 --- a/source/logic/backend.ts +++ b/source/logic/backend.ts @@ -613,12 +613,20 @@ namespace _espe.backend export async function invite_accept( key : string, data : { - membership_number_value : string; - name_value : string; - email_address_value : (null | string); - groups_value : Array; + membership_number : string; + groups : Array; + name : string; + email_address : (null | string); + password : string; } - ) : Promise + ) : Promise< + Array< + { + incident : string; + details : Record; + } + > + > { return abstract_call( "POST", @@ -626,10 +634,13 @@ namespace _espe.backend { "data": { "key": key, - "membership_number_value": data.membership_number_value, - "name_value": data.name_value, - "email_address_value": data.email_address_value, - "groups_value": data.groups_value, + "data": { + "membership_number": data.membership_number, + "groups": data.groups, + "name": data.name, + "email_address": data.email_address, + "password": data.password, + }, } } ); diff --git a/source/pages/invite_create/logic.ts b/source/pages/invite_create/logic.ts index c551656..4669350 100644 --- a/source/pages/invite_create/logic.ts +++ b/source/pages/invite_create/logic.ts @@ -33,7 +33,7 @@ lib_plankton.zoo_page.register( membership_number_changeable : boolean; membership_number_value : (null | string); name_changeable : boolean; - name_value : string; + name_value : (null | string); email_address_changeable : boolean; email_address_value : (null | string); groups_changeable : boolean; @@ -94,7 +94,7 @@ lib_plankton.zoo_page.register( "membership_number_changeable": representation.membership_number.changeable, "membership_number_value": null_when_empty(representation.membership_number.value), "name_changeable": representation.name.changeable, - "name_value": representation.name.value, + "name_value": null_when_empty(representation.name.value), "email_address_changeable": representation.email_address.changeable, "email_address_value": null_when_empty(representation.email_address.value), "groups_changeable": representation.groups.changeable, @@ -223,7 +223,7 @@ lib_plankton.zoo_page.register( ) ); lib_plankton.zoo_page.set( - true + false ? { "name": "invite_view", diff --git a/source/pages/invite_handle/logic.ts b/source/pages/invite_handle/logic.ts index 88379ae..93ac310 100644 --- a/source/pages/invite_handle/logic.ts +++ b/source/pages/invite_handle/logic.ts @@ -37,6 +37,7 @@ lib_plankton.zoo_page.register( // parameters const key : string = parameters["key"]; + update_nav({"mode": null}); target_element.appendChild(template_request("invite_handle")); set_state( "load", @@ -53,7 +54,7 @@ lib_plankton.zoo_page.register( membership_number_changeable : boolean; membership_number_value : (null | string); name_changeable : boolean; - name_value : string; + name_value : (null | string); email_address_changeable : boolean; email_address_value : (null | string); groups_changeable : boolean; @@ -82,34 +83,42 @@ lib_plankton.zoo_page.register( { const form = new lib_plankton.zoo_form.class_form< { - membership_number_value : (null | string); - name_value : string; - email_address_value : (null | string); - groups_value : Array; + membership_number : (null | string); + name : string; + email_address : (null | string); + groups : Array; + password_value : string; + password_confirmation : string; }, { - membership_number_value : string; - name_value : string; - email_address_value : string; - groups_value : Array; + membership_number : string; + name : string; + email_address : string; + groups : Array; + password_value : string; + password_confirmation : string; } >( value => ({ - "membership_number_value": (value.membership_number_value ?? ""), - "name_value": value.name_value, - "email_address_value": (value.email_address_value ?? ""), - "groups_value": value.groups_value, + "membership_number": (value.membership_number ?? ""), + "name": value.name, + "email_address": (value.email_address ?? ""), + "groups": value.groups, + "password_value": value.password_value, + "password_confirmation": value.password_confirmation, }), representation => ({ - "membership_number_value": representation.membership_number_value, - "name_value": representation.name_value, - "email_address_value": representation.email_address_value, - "groups_value": representation.groups_value, + "membership_number": representation.membership_number, + "name": representation.name, + "email_address": representation.email_address, + "groups": representation.groups, + "password_value": representation.password_value, + "password_confirmation": representation.password_confirmation, }), new lib_plankton.zoo_input.class_input_group( [ { - "name": "membership_number_value", + "name": "membership_number", "input": new lib_plankton.zoo_input.class_input_text( { "read_only": (! data.membership_number_changeable), @@ -118,7 +127,7 @@ lib_plankton.zoo_page.register( "label": lib_plankton.translate.get("domain.member.membership_number.label"), }, { - "name": "groups_value", + "name": "groups", "input": new lib_plankton.zoo_input.class_input_list( () => new lib_plankton.zoo_input.class_input_text( { @@ -132,7 +141,7 @@ lib_plankton.zoo_page.register( "label": lib_plankton.translate.get("domain.member.groups.label"), }, { - "name": "name_value", + "name": "name", "input": new lib_plankton.zoo_input.class_input_text( { "read_only": (! data.name_changeable), @@ -141,7 +150,7 @@ lib_plankton.zoo_page.register( "label": lib_plankton.translate.get("domain.member.name_real_value.label"), }, { - "name": "email_address_value", + "name": "email_address", "input": new lib_plankton.zoo_input.class_input_text( { "read_only": (! data.email_address_changeable), @@ -149,6 +158,19 @@ lib_plankton.zoo_page.register( ), "label": lib_plankton.translate.get("domain.member.email_address_private.label"), }, + { + "name": "password_value", + "input": new lib_plankton.zoo_input.class_input_password( + ), + "label": lib_plankton.translate.get("page.member_register.form.field.password_value.label"), + "help": lib_plankton.translate.get("page.member_register.form.field.password_value.help"), + }, + { + "name": "password_confirmation", + "input": new lib_plankton.zoo_input.class_input_password( + ), + "label": lib_plankton.translate.get("page.member_register.form.field.password_confirmation.label"), + }, ] ), [ @@ -156,26 +178,62 @@ lib_plankton.zoo_page.register( "label": lib_plankton.translate.get("page.invite_handle.form.action.submit"), "procedure": async (get_value, get_representation) => { const value = await get_value(); + let flaws : Array<{incident : string; details : Record;}>; set_state( "wait", [ ] ); - await _espe.backend.invite_accept( - key, + if (value.password_value !== value.password_confirmation) + { + flaws = [ + {"incident": "password_mismatch", "details": {}}, + ]; + } + else + { + try { - "membership_number_value": value.membership_number_value, - "name_value": value.name_value, - "email_address_value": value.email_address_value, - "groups_value": value.groups_value, + flaws = await _espe.backend.invite_accept( + key, + { + "membership_number": value.membership_number, + "groups": value.groups, + "name": value.name, + "email_address": value.email_address, + "password": value.password_value, + } + ); } - ); - set_state( - "done", - [ - lib_plankton.translate.get("page.invite_handle.message.successful"), - ] - ); + catch (error) + { + flaws = [ + {"incident": "unhandled_error", "details": {}}, + ]; + } + } + if (flaws.length > 0) + { + set_state( + "fill", + flaws.map( + flaw => lib_plankton.string.coin( + lib_plankton.translate.get("page.member_register.flaw." + flaw.incident), + flaw.details + ) + ) + ); + } + else + { + set_state( + "done", + [ + // lib_plankton.translate.get("page.member_register.success") + lib_plankton.translate.get("page.invite_handle.message.successful"), + ] + ); + } }, } ] @@ -183,10 +241,12 @@ lib_plankton.zoo_page.register( await form.setup(target_element.querySelector(".invite_handle-form") as HTMLElement); form.input_write( { - "membership_number_value": data.membership_number_value, - "name_value": data.name_value, - "email_address_value": data.email_address_value, - "groups_value": data.groups_value, + "membership_number": data.membership_number_value, + "name": data.name_value, + "email_address": data.email_address_value, + "groups": data.groups_value, + "password_value": "", + "password_confirmation": "", } ); set_state( diff --git a/source/pages/member_view/logic.ts b/source/pages/member_view/logic.ts index 1c35534..241a387 100644 --- a/source/pages/member_view/logic.ts +++ b/source/pages/member_view/logic.ts @@ -158,7 +158,7 @@ lib_plankton.zoo_page.register( id, lib_plankton.zoo_page.encode( { - "name": "register", + "name": "member_register", "parameters": { "id": id, "verification": "{{verification}}", diff --git a/tools/build b/tools/build index 73a51eb..c4215e2 100755 --- a/tools/build +++ b/tools/build @@ -1,7 +1,21 @@ #!/usr/bin/env python3 +# Espe | Ein schlichtes Werkzeug zur Mitglieder-Verwaltung | Frontend +# Copyright (C) 2024 Christian Fraß +# +# This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public +# License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with this program. If not, see +# . + import sys as _sys import os as _os +import shutil as _shutil import argparse as _argparse @@ -16,6 +30,14 @@ def main(): metavar = "", help = "output directory", ) + argument_parser.add_argument( + "-c", + "--conf-path", + type = str, + default = "", + metavar = "", + help = "path to conf file to be put", + ) args = argument_parser.parse_args() ## exec @@ -28,6 +50,11 @@ def main(): " ".join(targets), ) ) + if (args.conf_path != ""): + _shutil.copyfile( + args.conf_path, + _os.path.join(args.output_directory, "conf.json") + ) _sys.stdout.write("%s\n" % args.output_directory)