Compare commits

..

4 commits

Author SHA1 Message Date
fenris ccb408b1b0 Merge pull request 'Gruppen-Steuerung' (#3) from task-416 into main
Reviewed-on: #3
2025-10-23 19:16:40 +02:00
fenris 745fdaafa4 [task-416] 2025-10-23 13:19:39 +02:00
fenris 3ca0822cff Merge branch 'main' into task-416 2025-10-23 11:39:20 +02:00
fenris f49ff8c519 [task-416] 2025-10-23 11:35:57 +02:00
10 changed files with 308 additions and 97 deletions

View file

@ -882,6 +882,9 @@ declare namespace lib_plankton.call {
/** /**
*/ */
export function sleep(seconds: float): Promise<void>; export function sleep(seconds: float): Promise<void>;
/**
*/
export function null_prop<type_value_from, type_value_to>(value_from: (null | type_value_from), function_: ((value: type_value_from) => type_value_to)): (null | type_value_to);
export {}; export {};
} }
declare namespace lib_plankton.file { declare namespace lib_plankton.file {

View file

@ -2043,6 +2043,16 @@ var lib_plankton;
})); }));
} }
call.sleep = sleep; call.sleep = sleep;
/**
*/
function null_prop(value_from, function_) {
return ((value_from === null)
?
null
:
function_(value_from));
}
call.null_prop = null_prop;
})(call = lib_plankton.call || (lib_plankton.call = {})); })(call = lib_plankton.call || (lib_plankton.call = {}));
})(lib_plankton || (lib_plankton = {})); })(lib_plankton || (lib_plankton = {}));
/* /*
@ -3792,10 +3802,10 @@ var lib_plankton;
options = Object.assign({ options = Object.assign({
"compare_value": instance_compare "compare_value": instance_compare
}, options); }, options);
if (is_empty(list)) { /*if (is_empty<type_element>(list)) {
throw (new Error("the max-arg of an empty list is not defined")); throw (new Error("the max-arg of an empty list is not defined"));
} }
else { else */ {
return (list return (list
.reduce(function (result, element, index) { .reduce(function (result, element, index) {
var value = target_function(element); var value = target_function(element);

View file

@ -47,7 +47,8 @@
"calendar.access.access": "Zugriff", "calendar.access.access": "Zugriff",
"calendar.access.public": "öffentlich", "calendar.access.public": "öffentlich",
"calendar.access.default_level": "Standard", "calendar.access.default_level": "Standard",
"calendar.access.attributed": "Zuweisungen", "calendar.access.attributed_group": "Gruppen-Zuweisungen",
"calendar.access.attributed_user": "Nutzer-Zuweisungen",
"widget.listview.add": "Termin anlegen", "widget.listview.add": "Termin anlegen",
"widget.weekview.controls.year": "Jahr", "widget.weekview.controls.year": "Jahr",
"widget.weekview.controls.week": "Woche", "widget.weekview.controls.week": "Woche",

View file

@ -47,7 +47,8 @@
"calendar.access.access": "access", "calendar.access.access": "access",
"calendar.access.public": "public", "calendar.access.public": "public",
"calendar.access.default_level": "default", "calendar.access.default_level": "default",
"calendar.access.attributed": "attributed", "calendar.access.attributed_group": "group attributed",
"calendar.access.attributed_user": "user attributed",
"widget.listview.add": "add event", "widget.listview.add": "add event",
"widget.weekview.controls.year": "year", "widget.weekview.controls.year": "year",
"widget.weekview.controls.week": "week", "widget.weekview.controls.week": "week",

View file

@ -151,7 +151,42 @@ namespace _dali.helpers
/** /**
*/ */
export function input_attributed_access( export function input_attributed_access_group(
groups : Array<{id : _dali.type_group_id; object : _dali.type_group_object;}>
)
: lib_plankton.zoo_input.class_input_hashmap<
_dali.type_group_id,
_dali.enum_access_level
>
{
return (
new lib_plankton.zoo_input.class_input_hashmap<_dali.type_group_id, _dali.enum_access_level>(
// hash_key
(group_id) => group_id.toFixed(0),
// key_input_factory
() => new lib_plankton.zoo_input.class_input_wrapped<string, int>(
new lib_plankton.zoo_input.class_input_selection(
groups
.map(
(group) => ({
"value": group.id.toFixed(0),
"label": group.object.label,
})
)
),
x => parseInt(x),
x => x.toFixed(0)
),
// value_input_factory
() => input_access_level()
)
);
}
/**
*/
export function input_attributed_access_user(
users : Array<{id : _dali.type_user_id; name : string;}> users : Array<{id : _dali.type_user_id; name : string;}>
) )
: lib_plankton.zoo_input.class_input_hashmap< : lib_plankton.zoo_input.class_input_hashmap<

View file

@ -4,6 +4,12 @@ namespace _dali.model
/** /**
*/ */
type type_state = { type type_state = {
groups : Array<
{
id : _dali.type_group_id;
object : _dali.type_group_object;
}
>;
users : Array< users : Array<
{ {
id : _dali.type_user_id; id : _dali.type_user_id;
@ -110,6 +116,23 @@ namespace _dali.model
} }
/**
*/
export async function group_list(
)
: Promise<
Array<
{
id : _dali.type_group_id;
object : _dali.type_group_object;
}
>
>
{
return Promise.resolve(_state.groups);
}
/** /**
*/ */
export async function user_list( export async function user_list(
@ -196,12 +219,30 @@ namespace _dali.model
"access": { "access": {
"public": data.access.public, "public": data.access.public,
"default_level": _dali.access_level_decode(data.access.default_level), "default_level": _dali.access_level_decode(data.access.default_level),
"attributed": lib_plankton.map.hashmap.implementation_map( "attributed_group": lib_plankton.map.hashmap.implementation_map(
lib_plankton.map.hashmap.make( lib_plankton.map.hashmap.make(
x => x.toFixed(0), x => x.toFixed(0),
{ {
"pairs": ( "pairs": (
data.access.attributed data.access.attributed_group
.map(
(entry) => (
{
"key": entry.group_id,
"value": _dali.access_level_decode(entry.level),
}
)
)
),
}
)
),
"attributed_user": lib_plankton.map.hashmap.implementation_map(
lib_plankton.map.hashmap.make(
x => x.toFixed(0),
{
"pairs": (
data.access.attributed_user
.map( .map(
(entry) => ( (entry) => (
{ {
@ -244,8 +285,19 @@ namespace _dali.model
"access": { "access": {
"public": calendar_object.access.public, "public": calendar_object.access.public,
"default_level": _dali.access_level_encode(calendar_object.access.default_level), "default_level": _dali.access_level_encode(calendar_object.access.default_level),
"attributed": ( "attributed_group": (
lib_plankton.map.dump(calendar_object.access.attributed) lib_plankton.map.dump(calendar_object.access.attributed_group)
.map(
(pair) => (
{
"group_id": pair.key,
"level": _dali.access_level_encode(pair.value),
}
)
)
),
"attributed_user": (
lib_plankton.map.dump(calendar_object.access.attributed_user)
.map( .map(
(pair) => ( (pair) => (
{ {
@ -254,7 +306,7 @@ namespace _dali.model
} }
) )
) )
) ),
}, },
/** /**
* @todo * @todo
@ -298,15 +350,24 @@ namespace _dali.model
"access": { "access": {
"public": calendar_object.access.public, "public": calendar_object.access.public,
"default_level": _dali.access_level_encode(calendar_object.access.default_level), "default_level": _dali.access_level_encode(calendar_object.access.default_level),
"attributed": ( "attributed_group": (
lib_plankton.map.dump(calendar_object.access.attributed) lib_plankton.map.dump(calendar_object.access.attributed_group)
.map(
(pair) => ({
"group_id": pair.key,
"level": _dali.access_level_encode(pair.value),
})
)
),
"attributed_user": (
lib_plankton.map.dump(calendar_object.access.attributed_user)
.map( .map(
(pair) => ({ (pair) => ({
"user_id": pair.key, "user_id": pair.key,
"level": _dali.access_level_encode(pair.value), "level": _dali.access_level_encode(pair.value),
}) })
) )
) ),
}, },
} }
); );
@ -554,13 +615,8 @@ namespace _dali.model
: Promise<void> : Promise<void>
{ {
_state = { _state = {
"users": ( "groups": [],
_dali.is_logged_in() "users": [],
?
(await _dali.backend.user_list())
:
[]
),
"calendars": lib_plankton.map.hashmap.implementation_map( "calendars": lib_plankton.map.hashmap.implementation_map(
lib_plankton.map.hashmap.make( lib_plankton.map.hashmap.make(
calendar_id => calendar_id.toFixed(0) calendar_id => calendar_id.toFixed(0)
@ -577,6 +633,20 @@ namespace _dali.model
_dali.listen_login( _dali.listen_login(
async () => { async () => {
_state.groups = (
(await _dali.backend.group_list())
.map(
entry => (
{
"id": entry.id,
"object": {
"name": entry.name,
"label": entry.label,
}
}
)
)
);
_state.users = await _dali.backend.user_list(); _state.users = await _dali.backend.user_list();
await sync_calendars(); await sync_calendars();
lib_plankton.map.clear(_state.events); lib_plankton.map.clear(_state.events);
@ -586,6 +656,7 @@ namespace _dali.model
); );
_dali.listen_logout( _dali.listen_logout(
async () => { async () => {
_state.groups = [];
_state.users = []; _state.users = [];
await sync_calendars(); await sync_calendars();
lib_plankton.map.clear(_state.events); lib_plankton.map.clear(_state.events);

View file

@ -136,6 +136,7 @@ namespace _dali.pages.overview
: Promise<void> : Promise<void>
{ {
const widget = new _dali.widgets.calendar_edit.class_widget_calendar_edit( const widget = new _dali.widgets.calendar_edit.class_widget_calendar_edit(
await _dali.model.group_list(),
await _dali.model.user_list(), await _dali.model.user_list(),
{ {
"name": "", "name": "",
@ -143,7 +144,18 @@ namespace _dali.pages.overview
"access": { "access": {
"public": false, "public": false,
"default_level": _dali.enum_access_level.view, "default_level": _dali.enum_access_level.view,
"attributed": lib_plankton.map.hashmap.implementation_map< "attributed_group": lib_plankton.map.hashmap.implementation_map<
_dali.type_group_id,
_dali.enum_access_level
>(
lib_plankton.map.hashmap.make<
_dali.type_group_id,
_dali.enum_access_level
>(
group_id => group_id.toFixed(0),
)
),
"attributed_user": lib_plankton.map.hashmap.implementation_map<
_dali.type_user_id, _dali.type_user_id,
_dali.enum_access_level _dali.enum_access_level
>( >(
@ -235,6 +247,7 @@ namespace _dali.pages.overview
calendar_id calendar_id
); );
const widget = new _dali.widgets.calendar_edit.class_widget_calendar_edit( const widget = new _dali.widgets.calendar_edit.class_widget_calendar_edit(
await _dali.model.group_list(),
await _dali.model.user_list(), await _dali.model.user_list(),
calendar_object, calendar_object,
{ {
@ -290,75 +303,82 @@ namespace _dali.pages.overview
) )
: Promise<void> : Promise<void>
{ {
const widget = new _dali.widgets.event_edit.class_widget_event_edit( if (! _dali.is_logged_in())
(await get_available_calendars()), {
{ // do nothing
"calendar_id": null, }
"event_name": "", else
"event_begin": lib_plankton.call.convey( {
date, const widget = new _dali.widgets.event_edit.class_widget_event_edit(
[ (await get_available_calendars()),
x => ({ {
"timezone_shift": 0, "calendar_id": null,
"date": date, "event_name": "",
"time": {"hour": 12, "minute": 0, "second": 0} "event_begin": lib_plankton.call.convey(
}), date,
lib_plankton.pit.from_datetime, [
x => lib_plankton.pit.shift_hour(x, 0), x => ({
lib_plankton.pit.to_datetime, "timezone_shift": 0,
] "date": date,
), "time": {"hour": 12, "minute": 0, "second": 0}
"event_end": lib_plankton.call.convey( }),
date, lib_plankton.pit.from_datetime,
[ x => lib_plankton.pit.shift_hour(x, 0),
x => ({ lib_plankton.pit.to_datetime,
"timezone_shift": 0, ]
"date": date, ),
"time": {"hour": 12, "minute": 0, "second": 0} "event_end": lib_plankton.call.convey(
}), date,
lib_plankton.pit.from_datetime, [
x => lib_plankton.pit.shift_hour(x, +1), x => ({
lib_plankton.pit.to_datetime, "timezone_shift": 0,
] "date": date,
), "time": {"hour": 12, "minute": 0, "second": 0}
"event_location": null, }),
"event_link": null, lib_plankton.pit.from_datetime,
"event_description": null, x => lib_plankton.pit.shift_hour(x, +1),
}, lib_plankton.pit.to_datetime,
{ ]
"read_only": false, ),
"action_cancel": () => { "event_location": null,
_dali.overlay.toggle({"mode": false}); "event_link": null,
"event_description": null,
}, },
"action_add": (data) => { {
_dali.model.event_add( "read_only": false,
data.calendar_id, "action_cancel": () => {
{ _dali.overlay.toggle({"mode": false});
"name": data.event_name, },
"begin": data.event_begin, "action_add": (data) => {
"end": data.event_end, _dali.model.event_add(
"location": data.event_location, data.calendar_id,
"link": data.event_link, {
"description": data.event_description, "name": data.event_name,
} "begin": data.event_begin,
) "end": data.event_end,
.then( "location": data.event_location,
() => { "link": data.event_link,
update_entries(); "description": data.event_description,
_dali.overlay.toggle({"mode": false}); }
} )
) .then(
.catch( () => {
(reason) => { update_entries();
// todo _dali.overlay.toggle({"mode": false});
} }
); )
}, .catch(
} (reason) => {
); // todo
_dali.overlay.clear(); }
_dali.overlay.toggle({"mode": true}); );
await widget.load(_dali.overlay.get_content_element()); },
}
);
_dali.overlay.clear();
_dali.overlay.toggle({"mode": true});
await widget.load(_dali.overlay.get_content_element());
}
} }
/** /**

View file

@ -411,6 +411,28 @@ namespace _dali.backend
} }
/**
*/
export function group_list(
)
: Promise<
Array<
{
id : int;
name : string;
label : string;
}
>
>
{
return call(
lib_plankton.http.enum_method.get,
"/groups",
null
);
}
/** /**
*/ */
export function user_list( export function user_list(
@ -512,12 +534,18 @@ namespace _dali.backend
access : { access : {
public : boolean; public : boolean;
default_level : string; default_level : string;
attributed : Array< attributed_group : Array<
{
group_id : int;
level : string;
}
>;
attributed_user : Array<
{ {
user_id : int; user_id : int;
level : string; level : string;
} }
> >;
}; };
resource_id : int; resource_id : int;
} }
@ -544,7 +572,13 @@ namespace _dali.backend
access : { access : {
public : boolean; public : boolean;
default_level : string; default_level : string;
attributed : Array< attributed_group : Array<
{
group_id : int;
level : string;
}
>;
attributed_user : Array<
{ {
user_id : int; user_id : int;
level : string; level : string;
@ -595,7 +629,13 @@ namespace _dali.backend
access : { access : {
public : boolean; public : boolean;
default_level : string; default_level : string;
attributed : Array< attributed_group : Array<
{
group_id : int;
level : string;
}
>;
attributed_user : Array<
{ {
user_id : int; user_id : int;
level : string; level : string;

View file

@ -14,6 +14,19 @@ namespace _dali
} }
/**
*/
export type type_group_id = int;
/**
*/
export type type_group_object = {
name : string;
label : string;
};
/** /**
*/ */
export type type_user_id = int; export type type_user_id = int;
@ -23,6 +36,7 @@ namespace _dali
*/ */
export type type_user_object = { export type type_user_object = {
name : string; name : string;
label : string;
email_address : ( email_address : (
null null
| |
@ -137,7 +151,11 @@ namespace _dali
access : { access : {
public : boolean; public : boolean;
default_level : enum_access_level; default_level : enum_access_level;
attributed : lib_plankton.map.type_map< attributed_group : lib_plankton.map.type_map<
type_group_id,
enum_access_level
>;
attributed_user : lib_plankton.map.type_map<
type_user_id, type_user_id,
enum_access_level enum_access_level
>; >;

View file

@ -7,6 +7,11 @@ namespace _dali.widgets.calendar_edit
implements lib_plankton.zoo_widget.interface_widget implements lib_plankton.zoo_widget.interface_widget
{ {
/**
*/
private groups : Array<{id : _dali.type_group_id; object : _dali.type_group_object;}>;
/** /**
*/ */
private users : Array<{id : _dali.type_user_id; name : string;}>; private users : Array<{id : _dali.type_user_id; name : string;}>;
@ -45,6 +50,7 @@ namespace _dali.widgets.calendar_edit
/** /**
*/ */
public constructor( public constructor(
groups : Array<{id : _dali.type_group_id; object : _dali.type_group_object;}>,
users : Array<{id : _dali.type_user_id; name : string;}>, users : Array<{id : _dali.type_user_id; name : string;}>,
initial_value : _dali.type_calendar_object, initial_value : _dali.type_calendar_object,
{ {
@ -67,6 +73,7 @@ namespace _dali.widgets.calendar_edit
} }
) )
{ {
this.groups = groups;
this.users = users; this.users = users;
this.initial_value = initial_value; this.initial_value = initial_value;
this.read_only = read_only; this.read_only = read_only;
@ -121,9 +128,14 @@ namespace _dali.widgets.calendar_edit
"label": lib_plankton.translate.get("calendar.access.default_level"), "label": lib_plankton.translate.get("calendar.access.default_level"),
}, },
{ {
"name": "attributed", "name": "attributed_group",
"input": _dali.helpers.input_attributed_access(this.users), "input": _dali.helpers.input_attributed_access_group(this.groups),
"label": lib_plankton.translate.get("calendar.access.attributed"), "label": lib_plankton.translate.get("calendar.access.attributed_group"),
},
{
"name": "attributed_user",
"input": _dali.helpers.input_attributed_access_user(this.users),
"label": lib_plankton.translate.get("calendar.access.attributed_user"),
}, },
] ]
), ),