This commit is contained in:
roydfalk 2024-04-25 23:30:16 +02:00
parent e8432a3c48
commit f279253e77
26 changed files with 278 additions and 80 deletions

View file

@ -1,15 +1,15 @@
/**
* @author fenris
*/
type int = number;
declare type int = number;
/**
* @author fenris
*/
type float = number;
declare type float = number;
/**
* @author fenris
*/
type type_date = {
declare type type_date = {
year: int;
month: int;
day: int;
@ -17,7 +17,7 @@ type type_date = {
/**
* @author fenris
*/
type type_time = {
declare type type_time = {
hour: int;
minute: int;
second: int;
@ -25,7 +25,7 @@ type type_time = {
/**
* @author fenris
*/
type type_datetimeobject = {
declare type type_datetimeobject = {
date: type_date;
time: type_time;
};
@ -42,7 +42,7 @@ declare namespace lib_plankton.base {
/**
* @author fenris
*/
type type_pseudopointer<type_value> = {
declare type type_pseudopointer<type_value> = {
value: type_value;
};
/**
@ -1513,7 +1513,7 @@ declare namespace lib_plankton.storage.memory {
clear(): Promise<void>;
write(key: any, value: any): Promise<boolean>;
delete(key: any): Promise<void>;
read(key: any): Promise<Awaited<type_item>>;
read(key: any): Promise<type_item>;
search(term: any): Promise<{
key: string;
preview: string;
@ -1820,11 +1820,15 @@ declare namespace lib_plankton.zoo_input {
private read_only;
/**
*/
private dom_input;
dom_input: (null | HTMLInputElement);
/**
*/
private hooks_change;
/**
*/
constructor(options?: {
read_only?: boolean;
hooks_change?: Array<((value: boolean) => void)>;
});
/**
* [implementation]

View file

@ -4616,9 +4616,11 @@ var lib_plankton;
constructor(options = {}) {
options = Object.assign({
"read_only": false,
"hooks_change": [],
}, options);
this.read_only = options.read_only;
this.dom_input = null;
this.hooks_change = options.hooks_change;
}
/**
* [implementation]
@ -4634,6 +4636,12 @@ var lib_plankton;
// do nothing
}
}
this.dom_input.addEventListener("change", (event) => {
const value = event.target.checked;
this.hooks_change.forEach(procedure => {
procedure(value);
});
});
// this.dom_input.style.display = "initial"; // n3o!!!
parent.appendChild(this.dom_input);
return Promise.resolve(undefined);

View file

@ -26,7 +26,29 @@ namespace _espe.conf
export async function load(
) : Promise<void>
{
_data = lib_plankton.json.decode(await lib_plankton.file.read("conf.json"));
let data_raw;
try {
data_raw = lib_plankton.json.decode(await lib_plankton.file.read("conf.json"));
}
catch (error) {
data_raw = {};
console.warn("could not read configuration file");
}
_data = {
"backend": (
(node_backend => ({
"scheme": (node_backend["scheme"] ?? "http"),
"host": (node_backend["host"] ?? "localhost"),
"port": (node_backend["port"] ?? 7979),
"path_base": (node_backend["path_base"] ?? ""),
})) (data_raw["backend"] ?? {})
),
"settings": (
(node_settings => ({
"title": (node_settings["title"] ?? "Espe"),
})) (data_raw["settings"] ?? {})
),
};
}

View file

@ -1,5 +0,0 @@
lib_plankton.zoo_page.register(
"index",
(parameters, target_element) => {
}
);

View file

View file

View file

@ -0,0 +1,7 @@
<template id="login">
<section class="login">
<h2>Login</h2>
<div class="login-form">
</div>
</section>
</template>

View file

View file

View file

View file

@ -0,0 +1,8 @@
<template id="members">
<section class="members">
<h2>Mitglied</h2>
<div class="members-editor">
</div>
<hr/>
</section>
</template>

View file

@ -0,0 +1,8 @@
.members-result:not([href])
{
display: none;
}
.members:not([rel]) .members-extras {display: none;}
.members[rel="poor"] .members-extras {display: none;}
.members[rel="rich"] .members-extras {}

View file

@ -1,3 +1,5 @@
var foobar;
lib_plankton.zoo_page.register(
"register",
async (parameters, target_element) => {
@ -129,5 +131,84 @@ lib_plankton.zoo_page.register(
}
);
set_state("fill");
// ---
{
let dom_service_data_container : HTMLElement = document.createElement("div");
dom_service_data_container.classList.add("register-services_data");
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) => {dom_service_data_container.classList.toggle("show", value);}
]
}
),
"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);
foobar = input_service_use;
await input_service_use.write(true);
/*
const element_use_services : HTMLInputElement = (target_element.querySelector(".register-field-use_services") as HTMLInputElement);
function update_service_data_visibility(show : (null | boolean) = null) : void
{
console.info({show});
show = (show ?? element_use_services.checked);
console.info({show});
target_element.querySelector(".register-services_data").classList.toggle("show", show);
}
element_use_services.addEventListener("change", (event) => {update_service_data_visibility(event.target["checked"]);});
element_use_services.checked = true;
update_service_data_visibility(true);
*/
}
},
);

View file

@ -0,0 +1,35 @@
<template id="register">
<section class="register">
<h2>Registrieren</h2>
<div class="register-message">
</div>
<div class="register-form">
<!--
<form>
<div class="formfield register-field-use_services">
<label>Netz-Dienste nutzen</label>
<input name="use_services" type="checkbox"/>
</div>
<fieldset class="register-services_data">
<div class="register-field-display_name">
<label>Anzeigename</label>
<input name="display_name" type="text"/>
</div>
<div class="formfield" class="register-field-login_name">
<label>Anmeldename</label>
<input name="login_name" type="text"/>
</div>
<div class="formfield"class="register-field-password_value">
<label>Passwort</label>
<input name="password_value" type="password"/>
</div>
<div class="formfield"class="register-field-password_confirmation">
<label>Passwort wiederholen</label>
<input name="password_confirmation" type="password"/>
</div>
</fieldset>
</form>
-->
</div>
</section>
</template>

View file

@ -0,0 +1,16 @@
.register:not([rel]) .register-message {display: none;}
.register:not([rel]) .register-form {display: none;}
.register[rel="fill"] .register-message {}
.register[rel="fill"] .register-form {}
.register[rel="wait"] .register-message {}
.register[rel="wait"] .register-form {display: none;}
.register[rel="done"] .register-message {}
.register[rel="done"] .register-form {display: none;}
.register-services_data:not(.show)
{
display: none;
}

View file

@ -0,0 +1,7 @@
<template id="view">
<section class="view">
<h2>Mitglied</h2>
<div class="view-form">
</div>
</section>
</template>

View file

View file

@ -6,37 +6,7 @@
<link rel="stylesheet" type="text/css" href="style.css"/>
<script type="text/javascript" src="logic.js"></script>
<script type="text/javascript">document.addEventListener("DOMContentLoaded", () => {main();});</script>
<template id="login">
<section class="login">
<h2>Login</h2>
<div class="login-form">
</div>
</section>
</template>
<template id="view">
<section class="view">
<h2>Mitglied</h2>
<div class="view-form">
</div>
</section>
</template>
<template id="members">
<section class="members">
<h2>Mitglied</h2>
<div class="members-editor">
</div>
<hr/>
</section>
</template>
<template id="register">
<section class="register">
<h2>Registrieren</h2>
<div class="register-message">
</div>
<div class="register-form">
</div>
</section>
</template>
{{templates}}
</head>
<body>
<header>

View file

@ -190,24 +190,3 @@ nav > ul > li:hover::after
text-transform: uppercase;
margin: 8px;
}
.members-result:not([href])
{
display: none;
}
.register:not([rel]) .register-message {display: none;}
.register:not([rel]) .register-form {display: none;}
.register[rel="fill"] .register-message {}
.register[rel="fill"] .register-form {}
.register[rel="wait"] .register-message {}
.register[rel="wait"] .register-form {display: none;}
.register[rel="done"] .register-message {}
.register[rel="done"] .register-form {display: none;}
.members:not([rel]) .members-extras {display: none;}
.members[rel="poor"] .members-extras {display: none;}
.members[rel="rich"] .members-extras {}

45
tools/make-index Executable file
View file

@ -0,0 +1,45 @@
#!/usr/bin/env python3
import sys as _sys
def string_coin(
template,
arguments
):
result = template
for (key, value, ) in arguments.items():
result = result.replace("{{%s}}" % key, value)
return result
def file_read(path):
handle = open(path, "r")
content = handle.read()
handle.close()
return content
def file_write(path, content):
handle = open(path, "w")
handle.write(content)
handle.close()
def main(args):
## args
path_main = args.pop(0)
paths_templates = args
args = []
## exec
_sys.stdout.write(
string_coin(
file_read(path_main),
{
"templates": "\n".join(map(lambda path: file_read(path), paths_templates))
}
)
)
main(_sys.argv[1:])

View file

@ -15,24 +15,18 @@ cmd_cp := cp
## rules
.PHONY: default
default: ${dir_build}/index.html ${dir_build}/logic.js ${dir_build}/style.css
${dir_build}/index.html: ${dir_source}/structure/index.html.tpl
@ ${cmd_log} "structure …"
@ ${cmd_mkdir} $(dir $@)
@ ${cmd_cat} $^ > $@
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/backend.ts \
${dir_source}/logic/conf.ts \
${dir_source}/logic/pages/index.ts \
${dir_source}/logic/pages/login.ts \
${dir_source}/logic/pages/logout.ts \
${dir_source}/logic/pages/members.ts \
${dir_source}/logic/pages/create.ts \
${dir_source}/logic/pages/view.ts \
${dir_source}/logic/pages/register.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/view/logic.ts \
${dir_source}/pages/register/logic.ts \
${dir_source}/logic/main.ts
@ ${cmd_log} "logic | compile …"
@ ${cmd_mkdir} $(dir $@)
@ -44,7 +38,26 @@ ${dir_build}/logic.js: ${dir_lib}/plankton/plankton.js ${dir_temp}/logic-unlinke
@ ${cmd_cat} $^ > $@
@ ${cmd_chmod} +x $@
${dir_build}/style.css: ${dir_source}/style/style.css
${dir_build}/style.css: \
${dir_source}/style/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/view/style.css \
${dir_source}/pages/register/style.css
@ ${cmd_log} "style …"
@ ${cmd_mkdir} $(dir $@)
@ ${cmd_cat} $^ > $@
${dir_build}/index.html: \
${dir_source}/structure/index.html.tpl \
${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/view/structure.html \
${dir_source}/pages/register/structure.html
@ ${cmd_log} "structure …"
@ ${cmd_mkdir} $(dir $@)
@ tools/make-index $^ > $@