- Add/remove members to a group added

This commit is contained in:
Wiesner András 2024-09-25 22:45:06 +02:00
parent 4ea8aca8c2
commit 550d60f71f
7 changed files with 115 additions and 60 deletions

View File

@ -42,7 +42,8 @@ class Group extends AutoStoring
// Create Group from array
static function fromArray(GroupMgr &$groupMgr, array $a): Group
{
return new Group($groupMgr, $a["groupname"], $a["description"], $a["owner"], $a["_id"], $a["unique"], $a["editors"], $a["users"], $a["games"]);
$id = $a["_id"] ?? -1;
return new Group($groupMgr, $a["groupname"], $a["description"], $a["owner"], $id, $a["unique"], $a["editors"], $a["users"], $a["games"]);
}
// Convert Group to array
@ -170,6 +171,16 @@ class Group extends AutoStoring
$this->storeMods(); // store changes
}
// Add members
function addMembers(array $nicknames) : void {
$this->changeMembers($nicknames, []);
}
// Remove members
function removeMembers(array $nicknames) : void {
$this->changeMembers([], $nicknames);
}
// Include/exclude games.
function changeGames(array $gameids_add, array $gameids_remove): void
{
@ -266,7 +277,7 @@ class GroupMgr
"owner" => $owner,
"description" => $description,
"editors" => [],
"members" => [],
"users" => [],
"games" => []
];

View File

@ -221,4 +221,10 @@ class UserMgr
$qb = $this->db->createQueryBuilder();
return array_map(fn($c): string => $c["nickname"], $qb->select(["nickname"])->getQuery()->fetch());
}
// Sanitize nicknames. Clear non-existent nicknames from the array.
function sanitizeNicknames(array $nicknames): array {
$a = $this->db->findBy(["nickname", "IN", $nicknames]);
return array_map(fn($a) => $a["nickname"], $a);
}
}

View File

@ -1,7 +1,11 @@
<?php
function explode_list(string $str) : array {
if (trim($str) !== "") {
return explode(",", str_replace(" ", "", $str));
} else {
return [];
}
}
function alter_array_contents(array &$a, $add, $remove) {

View File

@ -63,8 +63,14 @@ if (!get_autologin_state() || ($user_data["privilege"] !== PRIVILEGE_QUIZMASTER)
<td><input type="text" id="group_editors"></td>
</tr>
<tr>
<td><label for="group_members">Tagok:</label></td>
<td><textarea id="group_members" readonly></textarea></td>
<td>
<label for="group_members">Tagok:</label><br>
<input type="button" value="+" onclick="open_member_change_window('add')">
<input type="button" value="-" onclick="open_member_change_window('remove')">
</td>
<td>
<textarea id="group_members" readonly></textarea>
</td>
</tr>
</table>
<section style="display: block; text-align: right">
@ -74,6 +80,16 @@ if (!get_autologin_state() || ($user_data["privilege"] !== PRIVILEGE_QUIZMASTER)
</section>
</section>
<section class="window" shown="false" id="member_manager_window">
<section class="window-inner">
<section id="member_manager_window_title">
</section>
<textarea id="add_remove_member_area"></textarea><br>
<input type="button" value="OK" onclick="change_group_members()">
<input type="button" value="Mégse" onclick="hide('member_manager_window')">
</section>
</section>
<script>
list_all_groups();
</script>

View File

@ -322,10 +322,8 @@ $requester_nickname = $is_quizmaster ? "*" : $nickname; // "*" means every game
function create_update_game(ReqHandler &$rh, array $params): array
{
global $userMgr;
global $user;
global $nickname;
global $is_quizmaster;
global $gameMgr;
$update = $params[ReqHandler::ACTION_KEY] === "update_game";
@ -340,20 +338,8 @@ function create_update_game(ReqHandler &$rh, array $params): array
$description = $data["description"];
$contributors = explode_list($data["contributors"] ?? "");
$owner = $update ? trim($data["owner"] ?? $nickname) : $nickname;
$groups = explode_list($data["groups"] ?? "");
$properties = $data["properties"] ?? [];
// convert group compounds to group IDs
$groupids = get_groupids_by_compounds($groups); // convert group compounds to _ids
// remove group ID's this user cannot edit
// $groupids_with_editor_access = [];
// foreach ($groupids as $groupid) {
// if (is_user_editor_to_group($groupid, $nickname) || $is_quizmaster) {
// $groupids_with_editor_access[] = $groupid;
// }
// }
// result
$result = [];
@ -364,21 +350,6 @@ function create_update_game(ReqHandler &$rh, array $params): array
$game = $gameMgr->getGame($gameid); // fetch game
if (($game !== null) && $game->isUserContributorOrOwner($nickname) || $user->hasQuizmasterPrivilege()) {
// group management TODO: átkerül a csoportkezelőbe
// $old_groupids = $game_data["groups"]; // retain old groupids
// $new_groupids = $groupids; // get new groupids
// $groupids_add = array_diff($new_groupids, $old_groupids); // groups this user needs to be added to
// $groupids_remove = array_diff($old_groupids, $new_groupids); // groups this user need to be removed from
// foreach ($groupids_add as $groupid) { // execute insertion and removal
// change_group_game_assignments($groupid, $gameid, null);
// }
// foreach ($groupids_remove as $groupid) {
// change_group_game_assignments($groupid, null, $gameid);
// }
// re-fetch game data
// $game_data = get_game($gameid);
// disable autostoring
$game->disableAutoStoring();
@ -644,31 +615,13 @@ function create_update_user(ReqHandler &$rh, array $params): string
$realname = trim($params["realname"]);
$privilege = trim($params["privilege"]);
// $groupids = get_groupids_by_compounds($groups); // convert group compounds to _ids FIXME!!!
$success = false;
if (($target_nickname !== "")) {
if ((!$update) && ($password !== "")) { // CREATE
$success = $userMgr->addUser($target_nickname, $password, $realname, $privilege); // FIXME!!!
$success = $userMgr->addUser($target_nickname, $password, $realname, $privilege);
} else if ($update) { // UPDATE
$tuser = $userMgr->getUser($target_nickname); // load user data
if ($tuser !== null) {
// group management FIXME!!!
// $old_groupids = $tuser->getGroups(); // retain old groupids
// $new_groupids = $groupids; // get new groupids
// $groupids_add = array_diff($new_groupids, $old_groupids); // groups this user needs to be added to
// $groupids_remove = array_diff($old_groupids, $new_groupids); // groups this user need to be removed from
// foreach ($groupids_add as $groupid) { // execute insertion and removal
// change_group_user_assignments($groupid, $target_nickname, null);
// }
// foreach ($groupids_remove as $groupid) {
// change_group_user_assignments($groupid, null, $target_nickname);
// }
// re-fetch user
//$tuser = get_user($target_nickname); // load user data
// further field update
$tuser->disableAutoStoring();
$tuser->setRealname($realname);
@ -727,6 +680,26 @@ function get_game_groups(ReqHandler &$rh, array $params): array {
return $groups;
}
function change_group_members(ReqHandler &$rh, array $params): string {
global $groupMgr;
global $user;
global $userMgr;
$group = $groupMgr->getGroup($params["groupid"]);
if ($group !== null) {
if ($group->isUserContributor($user->getNickname())) {
$add = explode_list(trim($params["add"]));
$add = $userMgr->sanitizeNicknames($add);
$remove = explode_list(trim($params["remove"]));
$remove = $userMgr->sanitizeNicknames($remove);
$group->changeMembers($add, $remove);
return "OK";
}
}
return "FAIL";
}
function import_users_from_csv(ReqHandler &$rh, array $params): string
{
if (!isset($_FILES["users_table"])) {
@ -740,6 +713,7 @@ $rh->add("update_group", ["groupname", "description", "owner", "editors", "id"],
$rh->add("delete_groups", ["ids"], PRIVILEGE_QUIZMASTER, "delete_groups", RESP_PLAIN, "Delete group.");
$rh->add("get_all_groups", [], PRIVILEGE_QUIZMASTER, "get_all_player_groups", RESP_JSON, "Get all player groups.");
$rh->add("search_groups", ["needle"], PRIVILEGE_QUIZMASTER, "search_player_groups", RESP_JSON, "Serach and fetch player groups.");
$rh->add("change_group_members", ["groupid", "add", "remove"], PRIVILEGE_QUIZMASTER,"change_group_members", RESP_PLAIN, "Change group members.");
$rh->add(["create_user", "update_user"], ["nickname", "password", "realname", "privilege"], PRIVILEGE_QUIZMASTER, "create_update_user", RESP_PLAIN, "Create or update user.");
$rh->add("delete_users", ["users"], PRIVILEGE_QUIZMASTER, "delete_users", RESP_PLAIN, "Delete users.");

View File

@ -31,9 +31,13 @@ function list_all_groups() {
});
}
let EDITED_GROUP = null;
function create_edit_group(group = null) {
let update = group !== null;
EDITED_GROUP = group;
let groupnameF = document.getElementById("groupname");
let group_descriptionF = document.getElementById("group_description");
let submit_btn = document.getElementById("group_editor_submit_btn");
@ -123,3 +127,41 @@ function print_group_name(group_data) {
}
return record;
}
let MEMBER_ACTION = "";
function open_member_change_window(action) {
MEMBER_ACTION = action;
let winCap = document.getElementById("member_manager_window_title");
// print window title
if (action === "add") {
winCap.innerText = "Tagok hozzáadása";
} else if (action === "remove") {
winCap.innerText = "Tagok eltávolítása";
}
show("member_manager_window");
}
function change_group_members() {
let userListTA = document.getElementById("add_remove_member_area");
let req = {
action: "change_group_members",
groupid: EDITED_GROUP["_id"],
add: [],
remove: []
};
if (MEMBER_ACTION === "add") {
req["add"] = userListTA.value;
} else if (MEMBER_ACTION === "remove") {
req["remove"] = userListTA.value;
}
request(req).then(resp => {
userListTA.value = "";
hide("member_manager_window");
});
}

View File

@ -204,6 +204,7 @@ function toggle_test_selection() {
}
function delete_tests() {
if (confirm("Biztosan törölni kívánja a kijelölt eredményeket?")) {
let req = {
action: "delete_tests",
ids: get_selected_ids().join(",")
@ -212,3 +213,4 @@ function delete_tests() {
fetch_results(); // refresh results
});
}
}