invite -> invitation

This commit is contained in:
roydfalk 2025-08-22 17:07:39 +02:00
parent 9d1a0c856c
commit d5ff6ac576
18 changed files with 157 additions and 145 deletions

View file

@ -28,9 +28,9 @@
"domain.member.email_allow_sending.label": "Versenden von E-Mails erlauben",
"domain.member.name_login.label": "Anmeldename",
"domain.member.password_set.label": "Passwort gesetzt",
"domain.invite.key.label": "Schlüssel",
"domain.invite.expiry.label": "Ablaufzeitpunkt",
"domain.invite.url.label": "URL",
"domain.invitation.key.label": "Schlüssel",
"domain.invitation.expiry.label": "Ablaufzeitpunkt",
"domain.invitation.url.label": "URL",
"page.login.title": "Anmelden",
"page.login.name": "Name",
"page.login.password": "Passwort",
@ -88,14 +88,14 @@
"page.password_change_exec.flaw.password_lacks_special_character": "das Passwort muss ein Sonderzeichen beinhalten",
"page.password_change_exec.flaw.unhandled_error": "da ist etwas schief gelaufen :/",
"page.password_change_exec.status.success": "erledigt",
"page.invite_list.title": "Einladungen",
"page.invite_create.title": "Einladung anlegen",
"page.invite_create.form.field.send_immediatly.label": "Link sofort versenden",
"page.invite_create.form.action.submit": "anlegen",
"page.invite_view.title": "Einladung",
"page.invite_handle.title": "Einladung",
"page.invite_handle.message.invalid": "ungültig",
"page.invite_handle.message.successful": "erfolgreich",
"page.invite_handle.form.action.submit": "annehmen"
"page.invitation_list.title": "Einladungen",
"page.invitation_create.title": "Einladung anlegen",
"page.invitation_create.form.field.send_immediatly.label": "Link sofort versenden",
"page.invitation_create.form.action.submit": "anlegen",
"page.invitation_view.title": "Einladung",
"page.invitation_handle.title": "Einladung",
"page.invitation_handle.message.invalid": "ungültig",
"page.invitation_handle.message.successful": "erfolgreich",
"page.invitation_handle.form.action.submit": "annehmen"
}
}

View file

@ -28,9 +28,9 @@
"domain.member.email_allow_sending.label": "allow sending e-mails",
"domain.member.name_login.label": "login name",
"domain.member.password_set.label": "password set",
"domain.invite.key.label": "key",
"domain.invite.expiry.label": "expiration",
"domain.invite.url.url": "URL",
"domain.invitation.key.label": "key",
"domain.invitation.expiry.label": "expiration",
"domain.invitation.url.url": "URL",
"page.login.title": "login",
"page.login.name": "name",
"page.login.password": "password",
@ -88,14 +88,14 @@
"page.password_change_exec.flaw.password_lacks_special_character": "das Passwort muss ein Sonderzeichen beinhalten",
"page.password_change_exec.flaw.unhandled_error": "da ist etwas schief gelaufen :/",
"page.password_change_exec.status.success": "done",
"page.invite_list.title": "invites",
"page.invite_create.title": "create invite",
"page.invite_create.form.field.send_immediatly.label": "send link immediatly",
"page.invite_create.form.action.submit": "create",
"page.invite_view.title": "invitation",
"page.invite_handle.title": "invitation",
"page.invite_handle.message.invalid": "invalid",
"page.invite_handle.message.successful": "successful",
"page.invite_handle.form.action.submit": "accept"
"page.invitation_list.title": "invitations",
"page.invitation_create.title": "create invitation",
"page.invitation_create.form.field.send_immediatly.label": "send link immediatly",
"page.invitation_create.form.action.submit": "create",
"page.invitation_view.title": "invitation",
"page.invitation_handle.title": "invitation",
"page.invitation_handle.message.invalid": "invalid",
"page.invitation_handle.message.successful": "successful",
"page.invitation_handle.form.action.submit": "accept"
}
}

View file

@ -70,8 +70,8 @@ function setup_nav(
"classes": ["logged_in"],
},
{
"location": {"name": "invite_list", "parameters": {}},
"label": lib_plankton.translate.get("page.invite_list.title"),
"location": {"name": "invitation_list", "parameters": {}},
"label": lib_plankton.translate.get("page.invitation_list.title"),
"classes": ["logged_in"],
},
{

View file

@ -14,11 +14,11 @@ You should have received a copy of the GNU General Public License along with thi
*/
lib_plankton.zoo_page.register(
"invite_create",
"invitation_create",
async (parameters, target_element) => {
target_element.appendChild(_espe.helpers.template_request("invite_create"));
target_element.appendChild(_espe.helpers.template_request("invitation_create"));
target_element.querySelector(".invite_create-title").textContent = lib_plankton.translate.get("page.invite_create.title");
target_element.querySelector(".invitation_create-title").textContent = lib_plankton.translate.get("page.invitation_create.title");
const indent = str => (/*"... " + */str);
@ -59,7 +59,7 @@ lib_plankton.zoo_page.register(
}
/**
* @todo unify with form of "invite_view"
* @todo unify with form of "invitation_view"
*/
const form = new lib_plankton.zoo_form.class_form<
{
@ -249,26 +249,26 @@ lib_plankton.zoo_page.register(
}
)
),
"label": lib_plankton.translate.get("domain.invite.expiry.label"),
"label": lib_plankton.translate.get("domain.invitation.expiry.label"),
},
{
"name": "send_immediatly",
"input": new lib_plankton.zoo_input.class_input_checkbox(),
"label": indent(lib_plankton.translate.get("page.invite_create.form.field.send_immediatly.label")),
"label": indent(lib_plankton.translate.get("page.invitation_create.form.field.send_immediatly.label")),
},
]
),
[
{
"label": lib_plankton.translate.get("page.invite_create.form.action.submit"),
"label": lib_plankton.translate.get("page.invitation_create.form.action.submit"),
"procedure": async (get_value, get_representation) => {
const value = await get_value();
const result : {id : int; key : string;} = await _espe.backend.invite_create(
const result : {id : int; key : string;} = await _espe.backend.invitation_create(
value.data,
value.send_immediatly,
lib_plankton.zoo_page.encode(
{
"name": "invite_handle",
"name": "invitation_handle",
"parameters": {
"key": "{{key}}",
}
@ -279,12 +279,12 @@ lib_plankton.zoo_page.register(
false
?
{
"name": "invite_view",
"name": "invitation_view",
"parameters": {"id": result.id.toFixed(0)}
}
:
{
"name": "invite_list",
"name": "invitation_list",
"parameters": {}
}
);
@ -292,7 +292,7 @@ lib_plankton.zoo_page.register(
}
]
);
await form.setup(target_element.querySelector(".invite_create-form") as HTMLElement);
await form.setup(target_element.querySelector(".invitation_create-form") as HTMLElement);
form.input_write(
{
"data": {

View file

@ -13,7 +13,7 @@ You should have received a copy of the GNU General Public License along with thi
<https://www.gnu.org/licenses/>.
-->
<template id="invite_create">
<h2 class="invite_create-title"></h2>
<div class="invite_create-form"></div>
<template id="invitation_create">
<h2 class="invitation_create-title"></h2>
<div class="invitation_create-form"></div>
</template>

View file

@ -13,17 +13,17 @@ You should have received a copy of the GNU General Public License along with thi
<https://www.gnu.org/licenses/>.
*/
.invite_create-title
.invitation_create-title
{
text-transform: capitalize;
}
.plankton_input_group_field .plankton_input_group
.invitation_create-form .plankton_input_group_field .plankton_input_group
{
padding-left: 32px;
}
.plankton_input_group_field .plankton_input_group > *
.invitation_create-form .plankton_input_group_field .plankton_input_group > *
{
display: inline-block;
margin-right: 16px;

View file

@ -14,15 +14,15 @@ You should have received a copy of the GNU General Public License along with thi
*/
lib_plankton.zoo_page.register(
"invite_handle",
"invitation_handle",
async (parameters, target_element) => {
function set_state(
state : ("load" | "fill" | "wait" | "done"),
messages : Array<string> = []
) : void
{
target_element.querySelector(".invite_handle").setAttribute("rel", state);
target_element.querySelector(".invite_handle-message").textContent = "";
target_element.querySelector(".invitation_handle").setAttribute("rel", state);
target_element.querySelector(".invitation_handle-message").textContent = "";
let dom_list = document.createElement("ul");
messages.forEach(
message => {
@ -31,21 +31,21 @@ lib_plankton.zoo_page.register(
dom_list.appendChild(dom_message);
}
);
target_element.querySelector(".invite_handle-message").appendChild(dom_list);
target_element.querySelector(".invitation_handle-message").appendChild(dom_list);
}
// parameters
const key : string = parameters["key"];
update_nav({"mode": null});
target_element.appendChild(_espe.helpers.template_request("invite_handle"));
target_element.appendChild(_espe.helpers.template_request("invitation_handle"));
set_state(
"load",
[
]
);
target_element.querySelector(".invite_handle-title").textContent = lib_plankton.translate.get("page.invite_handle.title");
target_element.querySelector(".invitation_handle-title").textContent = lib_plankton.translate.get("page.invitation_handle.title");
let data : (
null
@ -63,7 +63,7 @@ lib_plankton.zoo_page.register(
);
try
{
data = await _espe.backend.invite_examine(key);
data = await _espe.backend.invitation_examine(key);
}
catch (error)
{
@ -75,7 +75,7 @@ lib_plankton.zoo_page.register(
set_state(
"done",
[
lib_plankton.translate.get("page.invite_handle.message.invalid"),
lib_plankton.translate.get("page.invitation_handle.message.invalid"),
]
);
}
@ -233,7 +233,7 @@ lib_plankton.zoo_page.register(
),
[
{
"label": lib_plankton.translate.get("page.invite_handle.form.action.submit"),
"label": lib_plankton.translate.get("page.invitation_handle.form.action.submit"),
"procedure": async (get_value, get_representation) => {
const value = await get_value();
let flaws : Array<{incident : string; details : Record<string, any>;}>;
@ -252,7 +252,7 @@ lib_plankton.zoo_page.register(
{
try
{
flaws = await _espe.backend.invite_accept(
flaws = await _espe.backend.invitation_accept(
key,
{
"label": value.label,
@ -288,7 +288,7 @@ lib_plankton.zoo_page.register(
"done",
[
// lib_plankton.translate.get("page.member_register.success")
lib_plankton.translate.get("page.invite_handle.message.successful"),
lib_plankton.translate.get("page.invitation_handle.message.successful"),
]
);
}
@ -296,7 +296,7 @@ lib_plankton.zoo_page.register(
}
]
);
await form.setup(target_element.querySelector(".invite_handle-form") as HTMLElement);
await form.setup(target_element.querySelector(".invitation_handle-form") as HTMLElement);
form.input_write(
{
"name": data.name_value,

View file

@ -13,13 +13,13 @@ You should have received a copy of the GNU General Public License along with thi
<https://www.gnu.org/licenses/>.
-->
<template id="invite_handle">
<section class="invite_handle">
<h2 class="invite_handle-title"></h2>
<div class="invite_handle-info">
<template id="invitation_handle">
<section class="invitation_handle">
<h2 class="invitation_handle-title"></h2>
<div class="invitation_handle-info">
</div>
<div class="invite_handle-message">
<div class="invitation_handle-message">
</div>
<div class="invite_handle-form"></div>
<div class="invitation_handle-form"></div>
</section>
</template>

View file

@ -14,14 +14,14 @@ You should have received a copy of the GNU General Public License along with thi
*/
.invite_view:not([rel]) .invite_view-message {display: none;}
.invite_view:not([rel]) .invite_view-form {display: none;}
.invitation_handle:not([rel]) .invitation_handle-message {display: none;}
.invitation_handle:not([rel]) .invitation_handle-form {display: none;}
.invite_view[rel="fill"] .invite_view-message {}
.invite_view[rel="fill"] .invite_view-form {}
.invitation_handle[rel="fill"] .invitation_handle-message {}
.invitation_handle[rel="fill"] .invitation_handle-form {}
.invite_view[rel="wait"] .invite_view-message {}
.invite_view[rel="wait"] .invite_view-form {display: none;}
.invitation_handle[rel="wait"] .invitation_handle-message {}
.invitation_handle[rel="wait"] .invitation_handle-form {display: none;}
.invite_view[rel="done"] .invite_view-message {}
.invite_view[rel="done"] .invite_view-form {display: none;}
.invitation_handle[rel="done"] .invitation_handle-message {}
.invitation_handle[rel="done"] .invitation_handle-form {display: none;}

View file

@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with thi
*/
lib_plankton.zoo_page.register(
"invite_list",
"invitation_list",
async (parameters, target_element) => {
// types
type type_item = {
@ -31,28 +31,28 @@ lib_plankton.zoo_page.register(
const term : (null | string) = (parameters["term"] ?? "");
// exec
target_element.appendChild(_espe.helpers.template_request("invite_list"));
target_element.appendChild(_espe.helpers.template_request("invitation_list"));
target_element.querySelector(".invite_list-title").textContent = lib_plankton.translate.get("page.invite_list.title");
target_element.querySelector(".invitation_list-title").textContent = lib_plankton.translate.get("page.invitation_list.title");
// exec : create link
{
const element : HTMLElement = target_element.querySelector(".invite_list-create");
const element : HTMLElement = target_element.querySelector(".invitation_list-create");
element.setAttribute(
"href",
lib_plankton.zoo_page.encode(
{
"name": "invite_create",
"name": "invitation_create",
"parameters": {
}
}
)
);
element.textContent = lib_plankton.translate.get("page.invite_create.title");
element.textContent = lib_plankton.translate.get("page.invitation_create.title");
}
const search : lib_plankton.zoo_search.type_search<type_item> = lib_plankton.zoo_search.make<type_item>(
(term) => _espe.backend.invite_list(),
(term) => _espe.backend.invitation_list(),
{
"encode_item": (item) => lib_plankton.string.coin(
"{{label}}",
@ -64,7 +64,7 @@ lib_plankton.zoo_page.register(
(term) => {
lib_plankton.zoo_page.set(
{
"name": "invite_list",
"name": "invitation_list",
"parameters": {
"term": term,
}
@ -76,7 +76,7 @@ lib_plankton.zoo_page.register(
(item) => {
lib_plankton.zoo_page.set(
{
"name": "invite_view",
"name": "invitation_view",
"parameters": {
"id": item.id.toFixed(0),
}
@ -88,7 +88,7 @@ lib_plankton.zoo_page.register(
);
lib_plankton.zoo_search.render(
search,
target_element.querySelector(".invite_list-search"),
target_element.querySelector(".invitation_list-search"),
{
"state": {
"term": "",
@ -97,8 +97,8 @@ lib_plankton.zoo_page.register(
);
/*
const data = await _espe.backend.invite_list();
(target_element.querySelector(".invite_list-data") as HTMLElement).textContent = JSON.stringify(
const data = await _espe.backend.invitation_list();
(target_element.querySelector(".invitation_list-data") as HTMLElement).textContent = JSON.stringify(
data,
undefined,
" "

View file

@ -13,10 +13,10 @@ You should have received a copy of the GNU General Public License along with thi
<https://www.gnu.org/licenses/>.
-->
<template id="invite_list">
<h2 class="invite_list-title"></h2>
<div class="invite_list-links">
<a class="invite_list-create"></a>
<template id="invitation_list">
<h2 class="invitation_list-title"></h2>
<div class="invitation_list-links">
<a class="invitation_list-create"></a>
</div>
<div class="invite_list-search"></div>
<div class="invitation_list-search"></div>
</template>

View file

@ -13,7 +13,7 @@ You should have received a copy of the GNU General Public License along with thi
<https://www.gnu.org/licenses/>.
*/
.invite_list-links
.invitation_list-links
{
margin-bottom: 16px;
}

View file

@ -14,13 +14,13 @@ You should have received a copy of the GNU General Public License along with thi
*/
lib_plankton.zoo_page.register(
"invite_view",
"invitation_view",
async (parameters, target_element) => {
// functions
const get_url = (item) => {
const url : URL = new URL(window.location.toString());
url.hash = lib_plankton.string.coin(
"#invite_handle,key={{key}}",
"#invitation_handle,key={{key}}",
{
"key": item.key,
}
@ -31,9 +31,9 @@ lib_plankton.zoo_page.register(
// parameters
const id : int = parseInt(parameters["id"]);
target_element.appendChild(_espe.helpers.template_request("invite_view"));
target_element.appendChild(_espe.helpers.template_request("invitation_view"));
target_element.querySelector(".invite_view-title").textContent = lib_plankton.translate.get("page.invite_view.title");
target_element.querySelector(".invitation_view-title").textContent = lib_plankton.translate.get("page.invitation_view.title");
const indent = str => (/*"... " + */str);
@ -74,7 +74,7 @@ lib_plankton.zoo_page.register(
}
/**
* @todo unify with form of "invite_create"
* @todo unify with form of "invitation_create"
*/
const form = new lib_plankton.zoo_form.class_form<
{
@ -162,12 +162,12 @@ lib_plankton.zoo_page.register(
{
"name": "url",
"input": new lib_plankton.zoo_input.class_input_text({"read_only": true}),
"label": lib_plankton.translate.get("domain.invite.url.label"),
"label": lib_plankton.translate.get("domain.invitation.url.label"),
},
{
"name": "key",
"input": new lib_plankton.zoo_input.class_input_text({"read_only": true}),
"label": lib_plankton.translate.get("domain.invite.key.label"),
"label": lib_plankton.translate.get("domain.invitation.key.label"),
},
{
"name": "name",
@ -275,14 +275,14 @@ lib_plankton.zoo_page.register(
}
)
),
"label": lib_plankton.translate.get("domain.invite.expiry.label"),
"label": lib_plankton.translate.get("domain.invitation.expiry.label"),
},
]
),
[
]
);
await form.setup(target_element.querySelector(".invite_view-form") as HTMLElement);
await form.setup(target_element.querySelector(".invitation_view-form") as HTMLElement);
const data : {
key: string;
@ -295,7 +295,7 @@ lib_plankton.zoo_page.register(
email_address_value : (null | string);
groups_changeable : boolean;
groups_value : Array<int>;
} = await _espe.backend.invite_read(id);
} = await _espe.backend.invitation_read(id);
form.input_write(data);
}

View file

@ -13,7 +13,7 @@ You should have received a copy of the GNU General Public License along with thi
<https://www.gnu.org/licenses/>.
-->
<template id="invite_view">
<h2 class="invite_view-title"></h2>
<div class="invite_view-form"></div>
<template id="invitation_view">
<h2 class="invitation_view-title"></h2>
<div class="invitation_view-form"></div>
</template>

View file

@ -0,0 +1,39 @@
/*
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
<https://www.gnu.org/licenses/>.
*/
.invitation_view-form .plankton_input_group_field .plankton_input_group
{
padding-left: 32px;
}
.invitation_view-form .plankton_input_group_field .plankton_input_group > *
{
display: inline-block;
margin-right: 16px;
vertical-align: top;
}
.invitation_view:not([rel]) .invitation_view-message {display: none;}
.invitation_view:not([rel]) .invitation_view-form {display: none;}
.invitation_view[rel="fill"] .invitation_view-message {}
.invitation_view[rel="fill"] .invitation_view-form {}
.invitation_view[rel="wait"] .invitation_view-message {}
.invitation_view[rel="wait"] .invitation_view-form {display: none;}
.invitation_view[rel="done"] .invitation_view-message {}
.invitation_view[rel="done"] .invitation_view-form {display: none;}

View file

@ -1,27 +0,0 @@
/*
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
<https://www.gnu.org/licenses/>.
*/
.invite_handle:not([rel]) .invite_handle-message {display: none;}
.invite_handle:not([rel]) .invite_handle-form {display: none;}
.invite_handle[rel="fill"] .invite_handle-message {}
.invite_handle[rel="fill"] .invite_handle-form {}
.invite_handle[rel="wait"] .invite_handle-message {}
.invite_handle[rel="wait"] .invite_handle-form {display: none;}
.invite_handle[rel="done"] .invite_handle-message {}
.invite_handle[rel="done"] .invite_handle-form {display: none;}

View file

@ -446,7 +446,7 @@ namespace _espe.backend
/**
*/
export async function invite_list(
export async function invitation_list(
) : Promise<
Array<
{
@ -474,7 +474,7 @@ namespace _espe.backend
/**
*/
export async function invite_read(
export async function invitation_read(
id : int
) : Promise<
{
@ -505,7 +505,7 @@ namespace _espe.backend
/**
*/
export async function invite_create(
export async function invitation_create(
data : {
name_changeable : boolean;
name_value : string;
@ -542,7 +542,7 @@ namespace _espe.backend
/**
*/
export async function invite_examine(
export async function invitation_examine(
key : string
) : Promise<
{
@ -571,7 +571,7 @@ namespace _espe.backend
/**
*/
export async function invite_accept(
export async function invitation_accept(
key : string,
data : {
name : string;

View file

@ -49,10 +49,10 @@ ${dir_temp}/logic-unlinked.js: \
${dir_source}/pages/member_view/logic.ts \
${dir_source}/pages/password_change_init/logic.ts \
${dir_source}/pages/password_change_exec/logic.ts \
${dir_source}/pages/invite_list/logic.ts \
${dir_source}/pages/invite_view/logic.ts \
${dir_source}/pages/invite_create/logic.ts \
${dir_source}/pages/invite_handle/logic.ts \
${dir_source}/pages/invitation_list/logic.ts \
${dir_source}/pages/invitation_view/logic.ts \
${dir_source}/pages/invitation_create/logic.ts \
${dir_source}/pages/invitation_handle/logic.ts \
${dir_source}/logic/main.ts
@ ${cmd_log} "logic | compile …"
@ ${cmd_mkdir} $(dir $@)
@ -75,10 +75,10 @@ ${dir_build}/style.css: \
${dir_source}/pages/member_view/style.css \
${dir_source}/pages/password_change_init/style.css \
${dir_source}/pages/password_change_exec/style.css \
${dir_source}/pages/invite_list/style.css \
${dir_source}/pages/invite_view/style.css \
${dir_source}/pages/invite_create/style.css \
${dir_source}/pages/invite_handle/style.css
${dir_source}/pages/invitation_list/style.css \
${dir_source}/pages/invitation_view/style.css \
${dir_source}/pages/invitation_create/style.css \
${dir_source}/pages/invitation_handle/style.css
@ ${cmd_log} "style …"
@ ${cmd_mkdir} $(dir $@)
@ ${cmd_cat} $^ > $@
@ -95,10 +95,10 @@ ${dir_build}/index.html: \
${dir_source}/pages/member_view/structure.html \
${dir_source}/pages/password_change_init/structure.html \
${dir_source}/pages/password_change_exec/structure.html \
${dir_source}/pages/invite_list/structure.html \
${dir_source}/pages/invite_view/structure.html \
${dir_source}/pages/invite_create/structure.html \
${dir_source}/pages/invite_handle/structure.html
${dir_source}/pages/invitation_list/structure.html \
${dir_source}/pages/invitation_view/structure.html \
${dir_source}/pages/invitation_create/structure.html \
${dir_source}/pages/invitation_handle/structure.html
@ ${cmd_log} "structure …"
@ ${cmd_mkdir} $(dir $@)
@ tools/make-index $^ > $@