- Game to group assignments management added
- Printing of group and game IDs added - some bugfixes
This commit is contained in:
		
							parent
							
								
									f3ae982c9c
								
							
						
					
					
						commit
						139c3aa38d
					
				@ -430,5 +430,34 @@ class GameMgr
 | 
				
			|||||||
        return $games;
 | 
					        return $games;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Sanitize games and return game IDs.
 | 
				
			||||||
 | 
					    function sanitizeGames(array $games) : array {
 | 
				
			||||||
 | 
					        $sanitized = [];
 | 
				
			||||||
 | 
					        foreach ($games as $game) {
 | 
				
			||||||
 | 
					            // explode game identifier
 | 
				
			||||||
 | 
					            [$name, $id] = explode("#", $game);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // fetch game
 | 
				
			||||||
 | 
					            if ($id !== null) {
 | 
				
			||||||
 | 
					                $records = $this->db->findBy([["name", "=", $name], "AND", ["_id", "=", (int)$id]]);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                $records = $this->db->findBy(["name", "=", $name]);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // put game ID into sanitized list only if identifier is not ambiguous
 | 
				
			||||||
 | 
					            if (count($records) === 1) {
 | 
				
			||||||
 | 
					                $sanitized[] = $records[0]["_id"];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $sanitized;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Resolve group IDs to full group identifiers.
 | 
				
			||||||
 | 
					    function resolveGames(array &$gameIds): void {
 | 
				
			||||||
 | 
					        $a = $this->db->findBy([["_id", "IN", $gameIds]]); // no caching here...
 | 
				
			||||||
 | 
					        $gameIds = array_map(fn($r) => $r["name"] . "#" . $r["_id"] ,$a);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // -------
 | 
					    // -------
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -192,7 +192,7 @@ class Group extends AutoStoring
 | 
				
			|||||||
            alter_array_contents($this->games, $gameid, null);
 | 
					            alter_array_contents($this->games, $gameid, null);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        foreach ($gameids_remove as $gameid) { // remove games
 | 
					        foreach ($gameids_remove as $gameid) { // remove games
 | 
				
			||||||
            alter_array_contents($this->members, null, $gameid);
 | 
					            alter_array_contents($this->games, null, $gameid);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        $this->storeMods(); // store changes
 | 
					        $this->storeMods(); // store changes
 | 
				
			||||||
 | 
				
			|||||||
@ -67,13 +67,23 @@ if (!get_autologin_state() || ($user_data["privilege"] !== PRIVILEGE_QUIZMASTER)
 | 
				
			|||||||
            <tr>
 | 
					            <tr>
 | 
				
			||||||
                <td>
 | 
					                <td>
 | 
				
			||||||
                    <label for="group_members">Tagok:</label><br>
 | 
					                    <label for="group_members">Tagok:</label><br>
 | 
				
			||||||
                    <input type="button" value="+" onclick="open_member_change_window('add')">
 | 
					                    <input type="button" value="+" onclick="open_element_change_window('add', 'member')">
 | 
				
			||||||
                    <input type="button" value="-" onclick="open_member_change_window('remove')">
 | 
					                    <input type="button" value="-" onclick="open_element_change_window('remove', 'member')">
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
                <td>
 | 
					                <td>
 | 
				
			||||||
                    <textarea id="group_members" readonly></textarea>
 | 
					                    <textarea id="group_members" readonly></textarea>
 | 
				
			||||||
                </td>
 | 
					                </td>
 | 
				
			||||||
            </tr>
 | 
					            </tr>
 | 
				
			||||||
 | 
					            <tr>
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                    <label for="group_games">Játékok:</label><br>
 | 
				
			||||||
 | 
					                    <input type="button" value="+" onclick="open_element_change_window('add', 'game')">
 | 
				
			||||||
 | 
					                    <input type="button" value="-" onclick="open_element_change_window('remove', 'game')">
 | 
				
			||||||
 | 
					                </td>
 | 
				
			||||||
 | 
					                <td>
 | 
				
			||||||
 | 
					                    <textarea id="group_games" readonly></textarea>
 | 
				
			||||||
 | 
					                </td>
 | 
				
			||||||
 | 
					            </tr>
 | 
				
			||||||
        </table>
 | 
					        </table>
 | 
				
			||||||
        <section style="display: block; text-align: right">
 | 
					        <section style="display: block; text-align: right">
 | 
				
			||||||
            <input type="button" value="" id="group_editor_submit_btn">
 | 
					            <input type="button" value="" id="group_editor_submit_btn">
 | 
				
			||||||
@ -82,13 +92,13 @@ if (!get_autologin_state() || ($user_data["privilege"] !== PRIVILEGE_QUIZMASTER)
 | 
				
			|||||||
    </section>
 | 
					    </section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<section class="window" shown="false" id="member_manager_window">
 | 
					<section class="window" shown="false" id="element_manager_window">
 | 
				
			||||||
    <section class="window-inner">
 | 
					    <section class="window-inner">
 | 
				
			||||||
        <section id="member_manager_window_title">
 | 
					        <section id="element_manager_window_title">
 | 
				
			||||||
        </section>
 | 
					        </section>
 | 
				
			||||||
        <textarea id="add_remove_member_area"></textarea><br>
 | 
					        <textarea id="add_remove_element_area"></textarea><br>
 | 
				
			||||||
        <input type="button" value="OK" onclick="change_group_members()">
 | 
					        <input type="button" value="OK" onclick="change_group_elements()">
 | 
				
			||||||
        <input type="button" value="Mégse" onclick="hide('member_manager_window')">
 | 
					        <input type="button" value="Mégse" onclick="hide('element_manager_window')">
 | 
				
			||||||
    </section>
 | 
					    </section>
 | 
				
			||||||
</section>
 | 
					</section>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -721,10 +721,14 @@ function delete_groups(ReqHandler &$rh, array $params): string
 | 
				
			|||||||
function get_all_groups(ReqHandler &$rh, array $params): array
 | 
					function get_all_groups(ReqHandler &$rh, array $params): array
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    global $groupMgr;
 | 
					    global $groupMgr;
 | 
				
			||||||
 | 
					    global $gameMgr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    $groups = $groupMgr->getAllGroups();
 | 
					    $groups = $groupMgr->getAllGroups();
 | 
				
			||||||
    $a = [];
 | 
					    $a = [];
 | 
				
			||||||
    foreach ($groups as $g) {
 | 
					    foreach ($groups as $g) {
 | 
				
			||||||
        $a[] = $g->toArray();
 | 
					        $r = $g->toArray();
 | 
				
			||||||
 | 
					        $gameMgr->resolveGames($r["games"]);
 | 
				
			||||||
 | 
					        $a[] = $r;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return $a;
 | 
					    return $a;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -825,7 +829,7 @@ function change_group_members(ReqHandler &$rh, array $params): string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    $group = $groupMgr->getGroup($params["groupid"]);
 | 
					    $group = $groupMgr->getGroup($params["groupid"]);
 | 
				
			||||||
    if ($group !== null) {
 | 
					    if ($group !== null) {
 | 
				
			||||||
        if ($group->isUserContributor($user->getNickname())) {
 | 
					        if ($group->isUserContributor($user->getNickname()) || $user->hasQuizmasterPrivilege()) {
 | 
				
			||||||
            $add = explode_list(trim($params["add"]));
 | 
					            $add = explode_list(trim($params["add"]));
 | 
				
			||||||
            $add = $userMgr->sanitizeNicknames($add);
 | 
					            $add = $userMgr->sanitizeNicknames($add);
 | 
				
			||||||
            $remove = explode_list(trim($params["remove"]));
 | 
					            $remove = explode_list(trim($params["remove"]));
 | 
				
			||||||
@ -838,6 +842,27 @@ function change_group_members(ReqHandler &$rh, array $params): string
 | 
				
			|||||||
    return "FAIL";
 | 
					    return "FAIL";
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function change_group_games(ReqHandler &$rh, array $params): string
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    global $groupMgr;
 | 
				
			||||||
 | 
					    global $user;
 | 
				
			||||||
 | 
					    global $gameMgr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $group = $groupMgr->getGroup($params["groupid"]);
 | 
				
			||||||
 | 
					    if ($group !== null) {
 | 
				
			||||||
 | 
					        if ($group->isUserContributor($user->getNickname()) || $user->hasQuizmasterPrivilege()) {
 | 
				
			||||||
 | 
					            $add = explode_list(trim($params["add"]));
 | 
				
			||||||
 | 
					            $add = $gameMgr->sanitizeGames($add);
 | 
				
			||||||
 | 
					            $remove = explode_list(trim($params["remove"]));
 | 
				
			||||||
 | 
					            $remove = $gameMgr->sanitizeGames($remove);
 | 
				
			||||||
 | 
					            $group->changeGames($add, $remove);
 | 
				
			||||||
 | 
					            return "OK";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return "FAIL";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function import_users_from_csv(ReqHandler &$rh, array $params): string
 | 
					function import_users_from_csv(ReqHandler &$rh, array $params): string
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (!isset($_FILES["users_table"])) {
 | 
					    if (!isset($_FILES["users_table"])) {
 | 
				
			||||||
@ -852,6 +877,7 @@ $rh->add("delete_groups", ["ids"], PRIVILEGE_QUIZMASTER, "delete_groups", RESP_P
 | 
				
			|||||||
$rh->add("get_all_groups", [], PRIVILEGE_QUIZMASTER, "get_all_groups", RESP_JSON, "Get all player groups.");
 | 
					$rh->add("get_all_groups", [], PRIVILEGE_QUIZMASTER, "get_all_groups", RESP_JSON, "Get all player groups.");
 | 
				
			||||||
$rh->add("search_groups", ["needle"], PRIVILEGE_QUIZMASTER, "search_groups", RESP_JSON, "Serach and fetch player groups.");
 | 
					$rh->add("search_groups", ["needle"], PRIVILEGE_QUIZMASTER, "search_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("change_group_members", ["groupid", "add", "remove"], PRIVILEGE_QUIZMASTER, "change_group_members", RESP_PLAIN, "Change group members.");
 | 
				
			||||||
 | 
					$rh->add("change_group_games", ["groupid", "add", "remove"], PRIVILEGE_QUIZMASTER, "change_group_games", RESP_PLAIN, "Change group games.");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
$rh->add(["create_user", "update_user"], ["nickname", "password", "realname", "privilege"], PRIVILEGE_QUIZMASTER, "create_update_user", RESP_PLAIN, "Create or update user.");
 | 
					$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.");
 | 
					$rh->add("delete_users", ["users"], PRIVILEGE_QUIZMASTER, "delete_users", RESP_PLAIN, "Delete users.");
 | 
				
			||||||
 | 
				
			|||||||
@ -26,7 +26,7 @@ function list_all_games() {
 | 
				
			|||||||
            let tdChkBox = document.createElement("td");
 | 
					            let tdChkBox = document.createElement("td");
 | 
				
			||||||
            tdChkBox.appendChild(chkbox);
 | 
					            tdChkBox.appendChild(chkbox);
 | 
				
			||||||
            tdChkBox.classList.add("checkbox");
 | 
					            tdChkBox.classList.add("checkbox");
 | 
				
			||||||
            let tdGameName = create_table_cell(g["name"]);
 | 
					            let tdGameName = create_table_cell(g["name"] + "<span style='color:gray'>#" + g["_id"] + "</span>");
 | 
				
			||||||
            let tdGameDescription = create_table_cell(g["description"]);
 | 
					            let tdGameDescription = create_table_cell(g["description"]);
 | 
				
			||||||
            let tdOwner = create_table_cell(g["owner"]);
 | 
					            let tdOwner = create_table_cell(g["owner"]);
 | 
				
			||||||
            row.append(tdChkBox, tdGameName, tdGameDescription, tdOwner);
 | 
					            row.append(tdChkBox, tdGameName, tdGameDescription, tdOwner);
 | 
				
			||||||
 | 
				
			|||||||
@ -44,6 +44,7 @@ function create_edit_group(group = null) {
 | 
				
			|||||||
    let group_ownerF = document.getElementById("group_owner");
 | 
					    let group_ownerF = document.getElementById("group_owner");
 | 
				
			||||||
    let group_editorsF = document.getElementById("group_editors");
 | 
					    let group_editorsF = document.getElementById("group_editors");
 | 
				
			||||||
    let group_membersF = document.getElementById("group_members");
 | 
					    let group_membersF = document.getElementById("group_members");
 | 
				
			||||||
 | 
					    let group_gamesF = document.getElementById("group_games");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!update) { // create a new group
 | 
					    if (!update) { // create a new group
 | 
				
			||||||
        groupnameF.value = "";
 | 
					        groupnameF.value = "";
 | 
				
			||||||
@ -53,6 +54,7 @@ function create_edit_group(group = null) {
 | 
				
			|||||||
        group_ownerF.readOnly = true;
 | 
					        group_ownerF.readOnly = true;
 | 
				
			||||||
        group_editorsF.value = "";
 | 
					        group_editorsF.value = "";
 | 
				
			||||||
        group_membersF.value = "";
 | 
					        group_membersF.value = "";
 | 
				
			||||||
 | 
					        group_gamesF.value = "";
 | 
				
			||||||
        hide("group_editor_additional_fields");
 | 
					        hide("group_editor_additional_fields");
 | 
				
			||||||
    } else { // update and existing one
 | 
					    } else { // update and existing one
 | 
				
			||||||
        groupnameF.value = group["groupname"];
 | 
					        groupnameF.value = group["groupname"];
 | 
				
			||||||
@ -62,6 +64,7 @@ function create_edit_group(group = null) {
 | 
				
			|||||||
        group_ownerF.readOnly = false;
 | 
					        group_ownerF.readOnly = false;
 | 
				
			||||||
        group_editorsF.value = group["editors"].join(", ");
 | 
					        group_editorsF.value = group["editors"].join(", ");
 | 
				
			||||||
        group_membersF.value = group["users"].join(", ");
 | 
					        group_membersF.value = group["users"].join(", ");
 | 
				
			||||||
 | 
					        group_gamesF.value = group["games"].join(", ");
 | 
				
			||||||
        show("group_editor_additional_fields");
 | 
					        show("group_editor_additional_fields");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -123,47 +126,48 @@ function delete_groups() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
function print_group_name(group_data) {
 | 
					function print_group_name(group_data) {
 | 
				
			||||||
    let record = group_data["groupname"];
 | 
					    let record = group_data["groupname"];
 | 
				
			||||||
    if (!group_data["unique"]) {
 | 
					    let seqNumStyle = (group_data["unique"]) ? "style='color:lightgray'" : "";
 | 
				
			||||||
        record += "#" + group_data["_id"];
 | 
					    record += `<span ${seqNumStyle}>#` + group_data["_id"] + `</span>`;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return record;
 | 
					    return record;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let MEMBER_ACTION = "";
 | 
					let ACTION = "";
 | 
				
			||||||
 | 
					let TYPE = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function open_member_change_window(action) {
 | 
					function open_element_change_window(action, type) {
 | 
				
			||||||
    MEMBER_ACTION = action;
 | 
					    ACTION = action;
 | 
				
			||||||
    let winCap = document.getElementById("member_manager_window_title");
 | 
					    TYPE = type;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let winCap = document.getElementById("element_manager_window_title");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let typeStr = (type === "member") ? "Tagok" : "Játékok";
 | 
				
			||||||
 | 
					    let opStr = (action === "add") ? "hozzáadása" : "eltávolítása";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // print window title
 | 
					    // print window title
 | 
				
			||||||
    if (action === "add") {
 | 
					    winCap.innerText = typeStr + " " + opStr;
 | 
				
			||||||
        winCap.innerText = "Tagok hozzáadása";
 | 
					 | 
				
			||||||
    } else if (action === "remove") {
 | 
					 | 
				
			||||||
        winCap.innerText = "Tagok eltávolítása";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    show("member_manager_window");
 | 
					    show("element_manager_window");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function change_group_members() {
 | 
					function change_group_elements() {
 | 
				
			||||||
    let userListTA = document.getElementById("add_remove_member_area");
 | 
					    let elementListTA = document.getElementById("add_remove_element_area");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let req = {
 | 
					    let req = {
 | 
				
			||||||
        action: "change_group_members",
 | 
					        action: `change_group_${TYPE}s`,
 | 
				
			||||||
        groupid: EDITED_GROUP["_id"],
 | 
					        groupid: EDITED_GROUP["_id"],
 | 
				
			||||||
        add: [],
 | 
					        add: [],
 | 
				
			||||||
        remove: []
 | 
					        remove: []
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (MEMBER_ACTION === "add") {
 | 
					    if (ACTION === "add") {
 | 
				
			||||||
        req["add"] = userListTA.value;
 | 
					        req["add"] = elementListTA.value;
 | 
				
			||||||
    } else if (MEMBER_ACTION === "remove") {
 | 
					    } else if (ACTION === "remove") {
 | 
				
			||||||
        req["remove"] = userListTA.value;
 | 
					        req["remove"] = elementListTA.value;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    request(req).then(resp => {
 | 
					    request(req).then(resp => {
 | 
				
			||||||
        userListTA.value = "";
 | 
					        elementListTA.value = "";
 | 
				
			||||||
        hide("member_manager_window");
 | 
					        hide("element_manager_window");
 | 
				
			||||||
        hide("group_editor_window");
 | 
					        hide("group_editor_window");
 | 
				
			||||||
        list_all_groups();
 | 
					        list_all_groups();
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
				
			|||||||
@ -134,7 +134,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
% An environment to create a quiz containing questions. The parameter is either the title of the quiz, or the name of the course
 | 
					% An environment to create a quiz containing questions. The parameter is either the title of the quiz, or the name of the course
 | 
				
			||||||
\newenvironment{quiz}[2]{
 | 
					\newenvironment{quiz}[2]{
 | 
				
			||||||
% Create highlighted group title
 | 
					    % Create highlighted group title
 | 
				
			||||||
    \begin{mdframed}[backgroundcolor=colsbg]
 | 
					    \begin{mdframed}[backgroundcolor=colsbg]
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        \color{colsfg}
 | 
					        \color{colsfg}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user