- automatic typecast to bool added
- searching by group's unique name added
This commit is contained in:
		
							parent
							
								
									5b2cc0b8f4
								
							
						
					
					
						commit
						0c44163bdf
					
				@ -20,6 +20,8 @@ class ExpressionBuilder
 | 
			
		||||
            } else { // is it a float?
 | 
			
		||||
                return (double)$rval;
 | 
			
		||||
            }
 | 
			
		||||
        } else if (in_array(strtolower($rval), ["true", "false"]) ) { // it's a boolean
 | 
			
		||||
            return $rval === "true";
 | 
			
		||||
        } else if (str_starts_with($rval, '"') && str_ends_with($rval, '"')){ // it's a string
 | 
			
		||||
            return substr($rval, 1, strlen($rval) - 2); // strip leading and trailing quotes
 | 
			
		||||
        } else { // it must be a column name
 | 
			
		||||
 | 
			
		||||
@ -403,4 +403,17 @@ class GroupMgr
 | 
			
		||||
        $a = $qb->where(["games", "CONTAINS", (int)$gameid])->select(["_id"])->getQuery()->fetch();
 | 
			
		||||
        return array_map(fn($r) => $r["_id"], $a);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Get group by group compound (name#id).
 | 
			
		||||
    function getGroupByUniqueName(string $uniqueName): Group|null {
 | 
			
		||||
        $a = $this->db->findOneBy([ function($g) use ($uniqueName) : bool {
 | 
			
		||||
            $group = Group::fromArray($this, $g);
 | 
			
		||||
            return $group->getUniqueName() === $uniqueName;
 | 
			
		||||
        }]);
 | 
			
		||||
        if ($a !== null) {
 | 
			
		||||
            return Group::fromArray($this, $a);
 | 
			
		||||
        } else {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -400,7 +400,7 @@ class TestMgr
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Get test results by game ID.
 | 
			
		||||
    function getResultsByGameId(string $gameid, string $filter, string $orderby, bool $exclude_challenge_data): array
 | 
			
		||||
    function getResultsByGameId(string $gameid, string $filter, string $orderby, bool $exclude_challenge_data, array ...$furtherFilters): array
 | 
			
		||||
    {
 | 
			
		||||
        $qb = $this->db->createQueryBuilder();
 | 
			
		||||
        $qb = $qb->where(["gameid", "=", (int)$gameid]);
 | 
			
		||||
@ -417,9 +417,19 @@ class TestMgr
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $criteria = ExpressionBuilder::buildQuery($filter);
 | 
			
		||||
 | 
			
		||||
            $qb->where($criteria);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // add further filters
 | 
			
		||||
        if (count($furtherFilters) > 0) {
 | 
			
		||||
            foreach ($furtherFilters as $ff) {
 | 
			
		||||
                if ($ff !== []) {
 | 
			
		||||
                    $qb->where($ff);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // ordering
 | 
			
		||||
        if (trim($orderby) !== "") {
 | 
			
		||||
            $ordering = ExpressionBuilder::buildOrdering($orderby);
 | 
			
		||||
 | 
			
		||||
@ -481,12 +481,35 @@ function get_results_by_gameid(ReqHandler &$rh, array $params): array
 | 
			
		||||
    $gameid = trim($params["gameid"]);
 | 
			
		||||
    $filter = trim($params["filter"] ?? "");
 | 
			
		||||
    $ordering = trim($params["orderby"] ?? "");
 | 
			
		||||
    $groups = explode_list(trim($params["groups"] ?? ""));
 | 
			
		||||
 | 
			
		||||
    $game = $gameMgr->getGame($gameid);
 | 
			
		||||
 | 
			
		||||
    $result = [];
 | 
			
		||||
    if (($game !== null) && ($game->isUserContributorOrOwner($user->getNickname()) || $user->hasQuizmasterPrivilege())) {
 | 
			
		||||
        $game_results = $testMgr->getResultsByGameId($gameid, $filter, $ordering, true);
 | 
			
		||||
        $group_filter = [];
 | 
			
		||||
        if ($groups !== []) {
 | 
			
		||||
            global $groupMgr;
 | 
			
		||||
            $n = 0;
 | 
			
		||||
            foreach ($groups as $groupname) {
 | 
			
		||||
                if ($n > 0) { // place OR between each group criterion
 | 
			
		||||
                    $group_filter[] = "OR";
 | 
			
		||||
                }
 | 
			
		||||
                $group = $groupMgr->getGroupByUniqueName($groupname);
 | 
			
		||||
                if ($group !== null) {
 | 
			
		||||
                    $nicknames = $group->getMembers();
 | 
			
		||||
                    $group_filter[] = ["nickname", "IN", $nicknames];
 | 
			
		||||
                }
 | 
			
		||||
                $n++;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // prepend filter criteria with AND
 | 
			
		||||
//            if (count($group_filter) > 0) {
 | 
			
		||||
//                $group_filter = ["AND", $group_filter];
 | 
			
		||||
//            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $game_results = $testMgr->getResultsByGameId($gameid, $filter, $ordering, true, $group_filter);
 | 
			
		||||
        $result = $game_results;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ function fetch_results() {
 | 
			
		||||
 | 
			
		||||
    let filterF = document.getElementById("filter");
 | 
			
		||||
    let orderbyF = document.getElementById("orderby");
 | 
			
		||||
    let groupsF = document.getElementById("groups");
 | 
			
		||||
 | 
			
		||||
    let filter = autoconvert_datetime(filterF.value.trim());
 | 
			
		||||
 | 
			
		||||
@ -44,7 +45,8 @@ function fetch_results() {
 | 
			
		||||
        action: "get_results_by_gameid",
 | 
			
		||||
        gameid: GAMEID,
 | 
			
		||||
        filter: filter.trim(),
 | 
			
		||||
        orderby: orderbyF.value.trim()
 | 
			
		||||
        orderby: orderbyF.value.trim(),
 | 
			
		||||
        groups: groupsF.value.trim()
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    request(req).then(resp => {
 | 
			
		||||
 | 
			
		||||
@ -48,7 +48,8 @@ if (!$gameMgr->getGame($game_id)->isUserContributorOrOwner($user_data["nickname"
 | 
			
		||||
 | 
			
		||||
<section style="margin-bottom: 0.3em">
 | 
			
		||||
    <input type="text" placeholder="Szűrőfeltétel" id="filter" style="font-family: 'Monaco', monospace; width: 50em;">
 | 
			
		||||
    <input type="text" placeholder="Rendezés" id="orderby" style="font-family: 'Monaco', monospace; width: 50em;">
 | 
			
		||||
    <input type="text" placeholder="Csoportok" id="groups" style="font-family: 'Monaco', monospace; width: 30em;">
 | 
			
		||||
    <input type="text" placeholder="Rendezés" id="orderby" style="font-family: 'Monaco', monospace; width: 30em;">
 | 
			
		||||
    <input type="button" value="Szűrés" onclick="fetch_results()">
 | 
			
		||||
    <input type="button" value="Jelentés előállítása" onclick="generate_report()">
 | 
			
		||||
    <input type="button" value="Kijelöltek törlése" onclick="delete_tests()">
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user