function show_edit_assignment($id) { global $tool_content, $m, $langEdit, $langBack, $course_code, $langCancel, $urlAppend, $works_url, $course_id, $head_content, $language, $langStudents, $langMove, $langWorkFile, $themeimg, $langDelWarnUserAssignment, $langLessOptions, $langMoreOptions, $langAutoJudgeInputNotSupported, $langAutoJudgeSum, $langAutoJudgeNewScenario, $langAutoJudgeEnable, $langAutoJudgeInput, $langAutoJudgeExpectedOutput, $langAutoJudgeOperator, $langAutoJudgeWeight, $langAutoJudgeProgrammingLanguage, $langAutoJudgeAssertions; load_js('bootstrap-datetimepicker'); $head_content .= "<script type='text/javascript'>\n \$(function() {\n \$('#enddatepicker').datetimepicker({\n format: 'dd-mm-yyyy hh:ii',\n pickerPosition: 'bottom-left', language: '" . $language . "',\n autoclose: true\n });\n \$('#hidden-opt-btn').on('click', function(e) {\n e.preventDefault();\n \$('#hidden-opt').collapse('toggle');\n });\n \$('#hidden-opt').on('shown.bs.collapse', function () {\n \$('#hidden-opt-btn i').removeClass('fa-caret-down').addClass('fa-caret-up');\n var caret = '<i class=\"fa fa-caret-up\"></i>';\n \$('#hidden-opt-btn').html('{$langLessOptions} '+caret);\n })\n \$('#hidden-opt').on('hidden.bs.collapse', function () {\n var caret = '<i class=\"fa fa-caret-down\"></i>';\n \$('#hidden-opt-btn').html('{$langMoreOptions} '+caret);\n })\n });\n </script>"; $row = Database::get()->querySingle("SELECT * FROM assignment WHERE id = ?d", $id); if ($row->assign_to_specific) { //preparing options in select boxes for assigning to speficic users/groups $assignee_options = ''; $unassigned_options = ''; if ($row->group_submissions) { $assignees = Database::get()->queryArray("SELECT `group`.id AS id, `group`.name\n FROM assignment_to_specific, `group`\n WHERE `group`.id = assignment_to_specific.group_id AND assignment_to_specific.assignment_id = ?d", $id); $all_groups = Database::get()->queryArray("SELECT name,id FROM `group` WHERE course_id = ?d", $course_id); foreach ($assignees as $assignee_row) { $assignee_options .= "<option value='" . $assignee_row->id . "'>" . $assignee_row->name . "</option>"; } $unassigned = array_udiff($all_groups, $assignees, function ($obj_a, $obj_b) { return $obj_a->id - $obj_b->id; }); foreach ($unassigned as $unassigned_row) { $unassigned_options .= "<option value='{$unassigned_row->id}'>{$unassigned_row->name}</option>"; } } else { $assignees = Database::get()->queryArray("SELECT user.id AS id, surname, givenname\n FROM assignment_to_specific, user\n WHERE user.id = assignment_to_specific.user_id AND assignment_to_specific.assignment_id = ?d", $id); $all_users = Database::get()->queryArray("SELECT user.id AS id, user.givenname, user.surname\n FROM user, course_user\n WHERE user.id = course_user.user_id\n AND course_user.course_id = ?d AND course_user.status = 5\n AND user.id", $course_id); foreach ($assignees as $assignee_row) { $assignee_options .= "<option value='{$assignee_row->id}'>{$assignee_row->surname} {$assignee_row->givenname}</option>"; } $unassigned = array_udiff($all_users, $assignees, function ($obj_a, $obj_b) { return $obj_a->id - $obj_b->id; }); foreach ($unassigned as $unassigned_row) { $unassigned_options .= "<option value='{$unassigned_row->id}'>{$unassigned_row->surname} {$unassigned_row->givenname}</option>"; } } } if ((int) $row->deadline) { $deadline = date('d-m-Y H:i', strtotime($row->deadline)); } else { $deadline = ''; } $comments = trim($row->comments); $tool_content .= action_bar(array(array('title' => $langBack, 'level' => 'primary-label', 'url' => "{$_SERVER['PHP_SELF']}?course={$course_code}", 'icon' => 'fa-reply'))); //Get possible validation errors $title_error = Session::getError('title'); $max_grade_error = Session::getError('max_grade'); $tool_content .= "\n <div class='form-wrapper'>\n <form class='form-horizontal' role='form' enctype='multipart/form-data' action='{$_SERVER['SCRIPT_NAME']}?course={$course_code}' method='post' onsubmit='return check_weights();'>\n <input type='hidden' name='id' value='{$id}' />\n <input type='hidden' name='choice' value='do_edit' />\n <fieldset>\n <div class='form-group " . ($title_error ? "has-error" : "") . "'>\n <label for='title' class='col-sm-2 control-label'>{$m['title']}:</label>\n <div class='col-sm-10'>\n <input name='title' type='text' class='form-control' id='title' value='" . q($row->title) . "' placeholder='{$m['title']}'>\n <span class='help-block'>{$title_error}</span>\n </div>\n </div>\n <div class='form-group'>\n <label for='desc' class='col-sm-2 control-label'>{$m['description']}:</label>\n <div class='col-sm-10'>\n " . rich_text_editor('desc', 4, 20, $row->description) . "\n </div>\n </div>"; if (!empty($comments)) { $tool_content .= "<div class='form-group'>\n <label for='desc' class='col-sm-2 control-label'>{$m['comments']}:</label>\n <div class='col-sm-10'>\n " . rich_text_editor('comments', 5, 65, $comments) . "\n </div>\n </div>"; } $tool_content .= "\n <div class='col-sm-10 col-sm-offset-2 margin-top-fat margin-bottom-fat'>\n <a id='hidden-opt-btn' class='btn btn-success btn-xs' href='#' style='text-decoration:none;'>{$langMoreOptions} <i class='fa fa-caret-down'></i></a>\n </div>\n <div class='collapse " . (Session::hasErrors() ? "in" : "") . "' id='hidden-opt'>\n <div class='form-group'>\n <label for='userfile' class='col-sm-2 control-label'>{$langWorkFile}:</label>\n <div class='col-sm-10'>\n " . ($row->file_name ? "<a href='{$_SERVER['SCRIPT_NAME']}?course={$course_code}&get={$row->id}&file_type=1'>" . q($row->file_name) . "</a>" . "<a href='{$_SERVER['SCRIPT_NAME']}?course={$course_code}&id={$id}&choice=do_delete_file' onClick='return confirmation(\"{$m['WorkDeleteAssignmentFileConfirm']}\");'>\n <img src='{$themeimg}/delete.png' title='{$m['WorkDeleteAssignmentFile']}' /></a>" : "<input type='file' id='userfile' name='userfile' />") . "\n </div>\n </div>\n <div class='form-group " . ($max_grade_error ? "has-error" : "") . "'>\n <label for='max_grade' class='col-sm-2 control-label'>{$m['max_grade']}:</label>\n <div class='col-sm-10'>\n <input name='max_grade' type='text' class='form-control' id='max_grade' value='{$row->max_grade}' placeholder='{$m['max_grade']}'>\n <span class='help-block'>{$max_grade_error}</span>\n </div>\n </div>\n <div class='form-group'>\n <label class='col-sm-2 control-label'>{$m['deadline']}:</label>\n <div class='col-sm-10'>\n <div class='radio'>\n <label>\n <input type='radio' name='is_deadline' value='0' " . (!empty($deadline) ? "" : "checked") . " onclick='\$(\"#enddatepicker, #late_sub_row\").addClass(\"hide\");\$(\"#deadline\").val(\"\");'>\n {$m['no_deadline']}\n </label>\n </div>\n <div class='radio'>\n <label>\n <input type='radio' name='is_deadline' value='1' " . (!empty($deadline) ? "checked" : "") . " onclick='\$(\"#enddatepicker, #late_sub_row\").removeClass(\"hide\")'>\n {$m['with_deadline']}\n </label>\n </div>\n </div>\n </div>\n <div class='input-append date form-group " . (!empty($deadline) ? "" : "hide") . "' id='enddatepicker' data-date='{$deadline}' data-date-format='dd-mm-yyyy'>\n <div class='col-xs-8 col-xs-offset-2'>\n <input class='form-control' name='WorkEnd' id='deadline' type='text' value='{$deadline}'>\n </div>\n <div class='col-xs-2'>\n <span class='add-on'><i class='fa fa-times'></i></span>\n <span class='add-on'><i class='fa fa-calendar'></i></span>\n </div>\n <div class='col-xs-10 col-xs-offset-2'>{$m['deadline_notif']}</div>\n </div>\n <div class='form-group " . (!empty($deadline) ? "" : "hide") . "' id='late_sub_row'>\n <div class='col-xs-10 col-xs-offset-2'>\n <div class='checkbox'>\n <label>\n <input type='checkbox' name='late_submission' value='1' " . ($row->late_submission ? 'checked' : '') . ">\n {$m['late_submission_enable']}\n </label>\n </div>\n </div>\n </div>\n <div class='form-group'>\n <label class='col-sm-2 control-label'>{$m['group_or_user']}:</label>\n <div class='col-sm-10'>\n <div class='radio'>\n <label>\n <input type='radio' id='user_button' name='group_submissions' value='0' " . ($row->group_submissions == 1 ? '' : 'checked') . ">\n {$m['user_work']}\n </label>\n </div>\n <div class='radio'>\n <label>\n <input type='radio' id='group_button' name='group_submissions' value='1' " . ($row->group_submissions == 1 ? 'checked' : '') . ">\n {$m['group_work']}\n </label>\n </div>\n </div>\n </div>\n <div class='form-group'>\n <label class='col-sm-2 control-label'>{$m['WorkAssignTo']}:</label>\n <div class='col-sm-10'>\n <div class='radio'>\n <label>\n <input type='radio' id='assign_button_all' name='assign_to_specific' value='0' " . ($row->assign_to_specific == 1 ? '' : 'checked') . ">\n <span id='assign_button_all_text'>{$m['WorkToAllUsers']}</span>\n </label>\n </div>\n <div class='radio'>\n <label>\n <input type='radio' id='assign_button_some' name='assign_to_specific' value='1' " . ($row->assign_to_specific == 1 ? 'checked' : '') . ">\n <span id='assign_button_some_text'>{$m['WorkToUser']}</span>\n </label>\n </div>\n </div>\n </div>\n <table id='assignees_tbl' class='table " . ($row->assign_to_specific == 1 ? '' : 'hide') . "'>\n <tr class='title1'>\n <td id='assignees'>{$langStudents}</td>\n <td class='text-center'>{$langMove}</td>\n <td>{$m['WorkAssignTo']}</td>\n </tr>\n <tr>\n <td>\n <select id='assign_box' size='15' multiple>\n " . (isset($unassigned_options) ? $unassigned_options : '') . "\n </select>\n </td>\n <td class='text-center'>\n <input type='button' onClick=\"move('assign_box','assignee_box')\" value=' >> ' /><br /><input type='button' onClick=\"move('assignee_box','assign_box')\" value=' << ' />\n </td>\n <td width='40%'>\n <select id='assignee_box' name='ingroup[]' size='15' multiple>\n " . (isset($assignee_options) ? $assignee_options : '') . "\n </select>\n </td>\n </tr>\n </table>"; $auto_judge = $row->auto_judge; $lang = $row->lang; $tool_content .= "\n <div class='form-group'>\n <label class='col-sm-2 control-label'>{$langAutoJudgeEnable}:</label>\n <div class='col-sm-10'>\n <div class='radio'><input type='checkbox' id='auto_judge' name='auto_judge' value='1' " . ($auto_judge == true ? "checked='1'" : '') . " /></div>\n <table>\n <thead>\n <tr>\n <th>{$langAutoJudgeInput}</th>\n <th>{$langAutoJudgeOperator}</th>\n <th>{$langAutoJudgeExpectedOutput}</th>\n <th>{$langAutoJudgeWeight}</th>\n <th>" . $m['delete'] . "</th>\n </tr>\n </thead>\n <tbody>"; $auto_judge_scenarios = $auto_judge == true ? unserialize($row->auto_judge_scenarios) : null; $connector = q(get_config('autojudge_connector')); $connector = new $connector(); $rows = 0; $display = 'visible'; if ($auto_judge_scenarios != null) { $scenariosCount = count($auto_judge_scenarios); foreach ($auto_judge_scenarios as $aajudge) { $tool_content .= "<tr>\n <td><input type='text' value='" . htmlspecialchars($aajudge['input'], ENT_QUOTES) . "' name='auto_judge_scenarios[{$rows}][input]' " . ($connector->supportsInput() ? '' : 'readonly="readonly" placeholder="' . $langAutoJudgeInputNotSupported . '"') . " /></td>"; $tool_content .= "<td>\n <select name='auto_judge_scenarios[{$rows}][assertion]' class='auto_judge_assertion'>\n <option value='eq'"; if ($aajudge['assertion'] === 'eq') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['eq'] . "</option>\n <option value='same'"; if ($aajudge['assertion'] === 'same') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['same'] . "</option>\n <option value='notEq'"; if ($aajudge['assertion'] === 'notEq') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['notEq'] . "</option>\n <option value='notSame'"; if ($aajudge['assertion'] === 'notSame') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['notSame'] . "</option>\n <option value='integer'"; if ($aajudge['assertion'] === 'integer') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['integer'] . "</option>\n <option value='float'"; if ($aajudge['assertion'] === 'float') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['float'] . "</option>\n <option value='digit'"; if ($aajudge['assertion'] === 'digit') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['digit'] . "</option>\n <option value='boolean'"; if ($aajudge['assertion'] === 'boolean') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['boolean'] . "</option>\n <option value='notEmpty'"; if ($aajudge['assertion'] === 'notEmpty') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['notEmpty'] . "</option>\n <option value='notNull'"; if ($aajudge['assertion'] === 'notNull') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['notNull'] . "</option>\n <option value='string'"; if ($aajudge['assertion'] === 'string') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['string'] . "</option>\n <option value='startsWith'"; if ($aajudge['assertion'] === 'startsWith') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['startsWith'] . "</option>\n <option value='endsWith'"; if ($aajudge['assertion'] === 'endsWith') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['endsWith'] . "</option>\n <option value='contains'"; if ($aajudge['assertion'] === 'contains') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['contains'] . "</option>\n <option value='numeric'"; if ($aajudge['assertion'] === 'numeric') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['numeric'] . "</option>\n <option value='isArray'"; if ($aajudge['assertion'] === 'isArray') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['isArray'] . "</option>\n <option value='true'"; if ($aajudge['assertion'] === 'true') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['true'] . "</option>\n <option value='false'"; if ($aajudge['assertion'] === 'false') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['false'] . "</option>\n <option value='isJsonString'"; if ($aajudge['assertion'] === 'isJsonString') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['isJsonString'] . "</option>\n <option value='isObject'"; if ($aajudge['assertion'] === 'isObject') { $tool_content .= " selected='selected'"; } $tool_content .= ">" . $langAutoJudgeAssertions['isObject'] . "</option>\n </select>\n </td>"; if (isset($aajudge['output'])) { $tool_content .= "<td><input type='text' value='" . htmlspecialchars($aajudge['output'], ENT_QUOTES) . "' name='auto_judge_scenarios[{$rows}][output]' class='auto_judge_output' /></td>"; } else { $tool_content .= "<td><input type='text' value='' name='auto_judge_scenarios[{$rows}][output]' disabled='disabled' class='auto_judge_output' /></td>"; } $tool_content .= "<td><input type='text' value='{$aajudge['weight']}' name='auto_judge_scenarios[{$rows}][weight]' class='auto_judge_weight'/></td>\n <td><a href='#' class='autojudge_remove_scenario' style='display: " . ($rows <= 0 ? 'none' : 'visible') . ";'>X</a></td>\n </tr>"; $rows++; } } else { $tool_content .= "<tr>\n <td><input type='text' name='auto_judge_scenarios[{$rows}][input]' /></td>\n <td>\n <select name='auto_judge_scenarios[{$rows}][assertion]' class='auto_judge_assertion'>\n <option value='eq' selected='selected'>" . $langAutoJudgeAssertions['eq'] . "</option>\n <option value='same'>" . $langAutoJudgeAssertions['same'] . "</option>\n <option value='notEq'>" . $langAutoJudgeAssertions['notEq'] . "</option>\n <option value='notSame'>" . $langAutoJudgeAssertions['notSame'] . "</option>\n <option value='integer'>" . $langAutoJudgeAssertions['integer'] . "</option>\n <option value='float'>" . $langAutoJudgeAssertions['float'] . "</option>\n <option value='digit'>" . $langAutoJudgeAssertions['digit'] . "</option>\n <option value='boolean'>" . $langAutoJudgeAssertions['boolean'] . "</option>\n <option value='notEmpty'>" . $langAutoJudgeAssertions['notEmpty'] . "</option>\n <option value='notNull'>" . $langAutoJudgeAssertions['notNull'] . "</option>\n <option value='string'>" . $langAutoJudgeAssertions['string'] . "</option>\n <option value='startsWith'>" . $langAutoJudgeAssertions['startsWith'] . "</option>\n <option value='endsWith'>" . $langAutoJudgeAssertions['endsWith'] . "</option>\n <option value='contains'>" . $langAutoJudgeAssertions['contains'] . "</option>\n <option value='numeric'>" . $langAutoJudgeAssertions['numeric'] . "</option>\n <option value='isArray'>" . $langAutoJudgeAssertions['isArray'] . "</option>\n <option value='true'>" . $langAutoJudgeAssertions['true'] . "</option>\n <option value='false'>" . $langAutoJudgeAssertions['false'] . "</option>\n <option value='isJsonString'>" . $langAutoJudgeAssertions['isJsonString'] . "</option>\n <option value='isObject'>" . $langAutoJudgeAssertions['isObject'] . "</option>\n </select>\n </td>\n <td><input type='text' name='auto_judge_scenarios[{$rows}][output]' class='auto_judge_output' /></td>\n <td><input type='text' name='auto_judge_scenarios[{$rows}][weight]' class='auto_judge_weight'/></td>\n <td><a href='#' class='autojudge_remove_scenario' style='display: none;'>X</a></td>\n </tr>\n "; } $tool_content .= "<tr>\n <td> </td>\n <td> </td>\n <td> </td>\n <td style='text-align:center;'> {$langAutoJudgeSum}: <span id='weights-sum'>0</span></td>\n <td> <input type='submit' value='{$langAutoJudgeNewScenario}' id='autojudge_new_scenario' /></td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <div class='form-group'>\n <label class='col-sm-2 control-label'>{$langAutoJudgeProgrammingLanguage}:</label>\n <div class='col-sm-10'>\n <select id='lang' name='lang'>"; foreach ($connector->getSupportedLanguages() as $llang => $ext) { $tool_content .= "<option value='{$llang}' " . ($llang === $lang ? "selected='selected'" : "") . ">{$llang}</option>\n"; } $tool_content .= "</select>\n </div>\n </div>\n </div>\n <div class='col-sm-offset-2 col-sm-10'>\n <input type='submit' class='btn btn-primary' name='do_edit' value='{$langEdit}' onclick=\"selectAll('assignee_box',true)\" />\n <a href='{$_SERVER['SCRIPT_NAME']}?course={$course_code}' class='btn btn-default'>{$langCancel}</a>\n </div>\n </fieldset>\n </form></div>"; }
function show_edit_assignment($id) { global $tool_content, $m, $langBack, $course_code, $langCancel, $urlAppend, $langSave, $works_url, $course_id, $head_content, $language, $langAssignmentStartHelpBlock, $langAssignmentEndHelpBlock, $langStudents, $langMove, $langWorkFile, $themeimg, $langStartDate, $langLessOptions, $langMoreOptions, $langWorkOnlineText, $langWorkSubType, $langGradeScalesSelect, $langGradeType, $langGradeNumbers, $langGradeScales, $langLessOptions, $langMoreOptions, $langAutoJudgeInputNotSupported, $langAutoJudgeSum, $langAutoJudgeNewScenario, $langAutoJudgeEnable, $langAutoJudgeInput, $langAutoJudgeExpectedOutput, $langAutoJudgeOperator, $langAutoJudgeWeight, $langAutoJudgeProgrammingLanguage, $langAutoJudgeAssertions; load_js('bootstrap-datetimepicker'); load_js('select2'); $head_content .= "<script type='text/javascript'> $(function() { $('#scales').select2(); $('input[name=grading_type]').on('change', function(e){ var choice = $(this).val(); if (choice == 0) { $('#max_grade') .prop('disabled', false) .closest('div.form-group') .removeClass('hidden'); $('#scales') .prop('disabled', true) .closest('div.form-group') .addClass('hidden'); } else { $('#max_grade') .prop('disabled', true) .closest('div.form-group') .addClass('hidden'); $('#scales') .prop('disabled', false) .closest('div.form-group') .removeClass('hidden'); } }); $('#WorkEnd, #WorkStart').datetimepicker({ format: 'dd-mm-yyyy hh:ii', pickerPosition: 'bottom-left', language: '".$language."', autoclose: true }); $('#enableWorkEnd, #enableWorkStart').change(function() { var dateType = $(this).prop('id').replace('enable', ''); if($(this).prop('checked')) { $('input#'+dateType).prop('disabled', false); if (dateType == 'WorkEnd') $('#late_submission').prop('disabled', false); $('#late_sub_row').removeClass('hide'); } else { $('input#'+dateType).prop('disabled', true); if (dateType == 'WorkEnd') $('#late_submission').prop('disabled', true); $('#late_sub_row').addClass('hide'); } }); $('#hidden-opt-btn').on('click', function(e) { e.preventDefault(); $('#hidden-opt').collapse('toggle'); }); $('#hidden-opt').on('shown.bs.collapse', function () { $('#hidden-opt-btn i').removeClass('fa-caret-down').addClass('fa-caret-up'); var caret = '<i class=\"fa fa-caret-up\"></i>'; $('#hidden-opt-btn').html('$langLessOptions '+caret); }) $('#hidden-opt').on('hidden.bs.collapse', function () { var caret = '<i class=\"fa fa-caret-down\"></i>'; $('#hidden-opt-btn').html('$langMoreOptions '+caret); }) }); </script>"; $row = Database::get()->querySingle("SELECT * FROM assignment WHERE id = ?d", $id); $scales = Database::get()->queryArray('SELECT * FROM grading_scale WHERE course_id = ?d', $course_id); $scale_options = "<option value>-- $langGradeScalesSelect --</option>"; foreach ($scales as $scale) { $scale_options .= "<option value='$scale->id'".($row->grading_scale_id == $scale->id ? " selected" : "").">$scale->title</option>"; } if ($row->assign_to_specific) { //preparing options in select boxes for assigning to speficic users/groups $assignee_options=''; $unassigned_options=''; if ($row->group_submissions) { $assignees = Database::get()->queryArray("SELECT `group`.id AS id, `group`.name FROM assignment_to_specific, `group` WHERE `group`.id = assignment_to_specific.group_id AND assignment_to_specific.assignment_id = ?d", $id); $all_groups = Database::get()->queryArray("SELECT name,id FROM `group` WHERE course_id = ?d", $course_id); foreach ($assignees as $assignee_row) { $assignee_options .= "<option value='".$assignee_row->id."'>".$assignee_row->name."</option>"; } $unassigned = array_udiff($all_groups, $assignees, function ($obj_a, $obj_b) { return $obj_a->id - $obj_b->id; } ); foreach ($unassigned as $unassigned_row) { $unassigned_options .= "<option value='$unassigned_row->id'>$unassigned_row->name</option>"; } } else { $assignees = Database::get()->queryArray("SELECT user.id AS id, surname, givenname FROM assignment_to_specific, user WHERE user.id = assignment_to_specific.user_id AND assignment_to_specific.assignment_id = ?d", $id); $all_users = Database::get()->queryArray("SELECT user.id AS id, user.givenname, user.surname FROM user, course_user WHERE user.id = course_user.user_id AND course_user.course_id = ?d AND course_user.status = 5 AND user.id", $course_id); foreach ($assignees as $assignee_row) { $assignee_options .= "<option value='$assignee_row->id'>$assignee_row->surname $assignee_row->givenname</option>"; } $unassigned = array_udiff($all_users, $assignees, function ($obj_a, $obj_b) { return $obj_a->id - $obj_b->id; } ); foreach ($unassigned as $unassigned_row) { $unassigned_options .= "<option value='$unassigned_row->id'>$unassigned_row->surname $unassigned_row->givenname</option>"; } } } $WorkStart = $row->submission_date ? DateTime::createFromFormat('Y-m-d H:i:s', $row->submission_date)->format('d-m-Y H:i') : NULL; $WorkEnd = $row->deadline ? DateTime::createFromFormat('Y-m-d H:i:s', $row->deadline)->format('d-m-Y H:i') : NULL; $max_grade = Session::has('max_grade') ? Session::get('max_grade') : ($row->max_grade ? $row->max_grade : 10); $grading_type = Session::has('grading_type') ? Session::get('grading_type') : ($row->grading_scale_id ? 1 : 0); $enableWorkStart = Session::has('enableWorkStart') ? Session::get('enableWorkStart') : null; $enableWorkEnd = Session::has('enableWorkEnd') ? Session::get('enableWorkEnd') : ($WorkEnd ? 1 : 0); $comments = trim($row->comments); $tool_content .= action_bar(array( array('title' => $langBack, 'level' => 'primary-label', 'url' => "$_SERVER[PHP_SELF]?course=$course_code", 'icon' => 'fa-reply'))); //Get possible validation errors $title_error = Session::getError('title'); $max_grade_error = Session::getError('max_grade'); $scale_error = Session::getError('scale'); $tool_content .= " <div class='form-wrapper'> <form class='form-horizontal' role='form' enctype='multipart/form-data' action='$_SERVER[SCRIPT_NAME]?course=$course_code' method='post'> <input type='hidden' name='id' value='$id' /> <input type='hidden' name='choice' value='do_edit' /> <fieldset> <div class='form-group ".($title_error ? "has-error" : "")."'> <label for='title' class='col-sm-2 control-label'>$m[title]:</label> <div class='col-sm-10'> <input name='title' type='text' class='form-control' id='title' value='".q($row->title)."' placeholder='$m[title]'> <span class='help-block'>$title_error</span> </div> </div> <div class='form-group'> <label for='desc' class='col-sm-2 control-label'>$m[description]:</label> <div class='col-sm-10'> " . rich_text_editor('desc', 4, 20, $row->description) . " </div> </div>"; if (!empty($comments)) { $tool_content .= "<div class='form-group'> <label for='desc' class='col-sm-2 control-label'>$m[comments]:</label> <div class='col-sm-10'> " . rich_text_editor('comments', 5, 65, $comments) . " </div> </div>"; } $tool_content .= " <div class='form-group'> <div class='col-sm-10 col-sm-offset-2 margin-top-fat margin-bottom-fat'> <a id='hidden-opt-btn' class='btn btn-success btn-xs' href='#' style='text-decoration:none;'>$langMoreOptions <i class='fa fa-caret-down'></i></a> </div> </div> <div class='collapse ".(Session::hasErrors() ? "in" : "")."' id='hidden-opt'> <div class='form-group'> <label for='userfile' class='col-sm-2 control-label'>$langWorkFile:</label> <div class='col-sm-10'> ".(($row->file_name)? "<a href='$_SERVER[SCRIPT_NAME]?course=$course_code&get=$row->id&file_type=1'>".q($row->file_name)."</a>" . "<a href='$_SERVER[SCRIPT_NAME]?course=$course_code&id=$id&choice=do_delete_file' onClick='return confirmation(\"$m[WorkDeleteAssignmentFileConfirm]\");'> <img src='$themeimg/delete.png' title='$m[WorkDeleteAssignmentFile]' /></a>" : "<input type='file' id='userfile' name='userfile' />")." </div> </div> <div class='form-group'> <label class='col-sm-2 control-label'>$langGradeType:</label> <div class='col-sm-10'> <div class='radio'> <label> <input type='radio' name='grading_type' value='0'". ($grading_type ? "" : " checked") ."> $langGradeNumbers </label> </div> <div class='radio'> <label> <input type='radio' name='grading_type' value='1'". ($grading_type ? " checked" : "") ."> $langGradeScales </label> </div> </div> </div> <div class='form-group".($scale_error ? " has-error" : "").(!$grading_type ? " hidden" : "")."'> <label for='title' class='col-sm-2 control-label'>$langGradeScales:</label> <div class='col-sm-10'> <select name='scale' class='form-control' id='scales'".(!$grading_type ? " disabled" : "")."> $scale_options </select> <span class='help-block'>$scale_error</span> </div> </div> <div class='form-group".($max_grade_error ? " has-error" : "").($grading_type ? " hidden" : "")."'> <label for='title' class='col-sm-2 control-label'>$m[max_grade]:</label> <div class='col-sm-10'> <input name='max_grade' type='text' class='form-control' id='max_grade' placeholder='$m[max_grade]' value='$max_grade'> <span class='help-block'>$max_grade_error</span> </div> </div> <div class='form-group'> <label class='col-sm-2 control-label'>$langWorkSubType:</label> <div class='col-sm-10'> <div class='radio'> <label> <input type='radio' name='submission_type' value='0'". ($row->submission_type ? "" : "checked") ."> $langWorkFile </label> </div> <div class='radio'> <label> <input type='radio' name='submission_type' value='1' ". ($row->submission_type ? "checked" : "") ."> $langWorkOnlineText </label> </div> </div> </div> <div class='input-append date form-group".(Session::getError('WorkStart') ? " has-error" : "")."' id='enddatepicker' data-date='$WorkStart' data-date-format='dd-mm-yyyy'> <label for='WorkStart' class='col-sm-2 control-label'>$langStartDate:</label> <div class='col-sm-10'> <div class='input-group'> <span class='input-group-addon'> <input style='cursor:pointer;' type='checkbox' id='enableWorkStart' name='enableWorkStart' value='1'".($enableWorkStart ? ' checked' : '')."> </span> <input class='form-control' name='WorkStart' id='WorkStart' type='text' value='$WorkStart'".($enableWorkStart ? '' : ' disabled')."> </div> <span class='help-block'>".(Session::hasError('WorkStart') ? Session::getError('WorkStart') : " <i class='fa fa-share fa-rotate-270'></i> $langAssignmentStartHelpBlock")."</span> </div> </div> <div class='input-append date form-group".(Session::getError('WorkEnd') ? " has-error" : "")."' id='enddatepicker' data-date='$WorkEnd' data-date-format='dd-mm-yyyy'> <label for='WorkEnd' class='col-sm-2 control-label'>$m[deadline]:</label> <div class='col-sm-10'> <div class='input-group'> <span class='input-group-addon'> <input style='cursor:pointer;' type='checkbox' id='enableWorkEnd' name='enableWorkEnd' value='1'".($enableWorkEnd ? ' checked' : '')."> </span> <input class='form-control' name='WorkEnd' id='WorkEnd' type='text' value='$WorkEnd'".($enableWorkEnd ? '' : ' disabled')."> </div> <span class='help-block'>".(Session::hasError('WorkEnd') ? Session::getError('WorkEnd') : " <i class='fa fa-share fa-rotate-270'></i> $langAssignmentEndHelpBlock")."</span> </div> </div> <div class='form-group ". ($WorkEnd ? "" : "hide") ."' id='late_sub_row'> <div class='col-xs-10 col-xs-offset-2'> <div class='checkbox'> <label> <input type='checkbox' id='late_submission' name='late_submission' value='1' ".(($row->late_submission)? 'checked' : '')."> $m[late_submission_enable] </label> </div> </div> </div> <div class='form-group'> <label class='col-sm-2 control-label'>$m[group_or_user]:</label> <div class='col-sm-10'> <div class='radio'> <label> <input type='radio' id='user_button' name='group_submissions' value='0' ".(($row->group_submissions==1) ? '' : 'checked')."> $m[user_work] </label> </div> <div class='radio'> <label> <input type='radio' id='group_button' name='group_submissions' value='1' ".(($row->group_submissions==1) ? 'checked' : '')."> $m[group_work] </label> </div> </div> </div> <div class='form-group'> <label class='col-sm-2 control-label'>$m[WorkAssignTo]:</label> <div class='col-sm-10'> <div class='radio'> <label> <input type='radio' id='assign_button_all' name='assign_to_specific' value='0' ".(($row->assign_to_specific==1) ? '' : 'checked')."> <span id='assign_button_all_text'>$m[WorkToAllUsers]</span> </label> </div> <div class='radio'> <label> <input type='radio' id='assign_button_some' name='assign_to_specific' value='1' ".(($row->assign_to_specific==1) ? 'checked' : '')."> <span id='assign_button_some_text'>$m[WorkToUser]</span> </label> </div> </div> </div> <div class='form-group'> <div class='col-sm-10 col-sm-offset-2'> <div class='table-responsive'> <table id='assignees_tbl' class='table-default ".(($row->assign_to_specific==1) ? '' : 'hide')."'> <tr class='title1'> <td id='assignees'>$langStudents</td> <td class='text-center'>$langMove</td> <td>$m[WorkAssignTo]</td> </tr> <tr> <td> <select class='form-control' id='assign_box' size='10' multiple> ".((isset($unassigned_options)) ? $unassigned_options : '')." </select> </td> <td class='text-center'> <input type='button' onClick=\"move('assign_box','assignee_box')\" value=' >> ' /><br /><input type='button' onClick=\"move('assignee_box','assign_box')\" value=' << ' /> </td> <td> <select class='form-control' id='assignee_box' name='ingroup[]' size='10' multiple> ".((isset($assignee_options)) ? $assignee_options : '')." </select> </td> </tr> </table> </div> </div> </div>"; if(AutojudgeApp::getAutojudge()->isEnabled()) { $auto_judge = $row->auto_judge; $lang = $row->lang; $tool_content .= " <div class='form-group'> <label class='col-sm-2 control-label'>$langAutoJudgeEnable:</label> <div class='col-sm-10'> <div class='radio'><input type='checkbox' id='auto_judge' name='auto_judge' value='1' ".($auto_judge == true ? "checked='1'" : '')." /></div> <table> <thead> <tr> <th>$langAutoJudgeInput</th> <th>$langAutoJudgeOperator</th> <th>$langAutoJudgeExpectedOutput</th> <th>$langAutoJudgeWeight</th> <th>".$m['delete']."</th> </tr> </thead> <tbody>"; $auto_judge_scenarios = $auto_judge == true ? unserialize($row->auto_judge_scenarios) : null; $connector = AutojudgeApp::getAutojudge(); $rows = 0; $display = 'visible'; if ($auto_judge_scenarios != null) { $scenariosCount = count($auto_judge_scenarios); foreach ($auto_judge_scenarios as $aajudge) { $tool_content .= "<tr> <td><input type='text' value='".htmlspecialchars($aajudge['input'], ENT_QUOTES)."' name='auto_judge_scenarios[$rows][input]' ".($connector->supportsInput() ? '' : 'readonly="readonly" placeholder="'.$langAutoJudgeInputNotSupported.'"')." /></td>"; $tool_content .= "<td> <select name='auto_judge_scenarios[$rows][assertion]' class='auto_judge_assertion'> <option value='eq'"; if ($aajudge['assertion'] === 'eq') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['eq']."</option> <option value='same'"; if ($aajudge['assertion'] === 'same') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['same']."</option> <option value='notEq'"; if ($aajudge['assertion'] === 'notEq') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['notEq']."</option> <option value='notSame'"; if ($aajudge['assertion'] === 'notSame') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['notSame']."</option> <option value='integer'"; if ($aajudge['assertion'] === 'integer') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['integer']."</option> <option value='float'"; if ($aajudge['assertion'] === 'float') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['float']."</option> <option value='digit'"; if ($aajudge['assertion'] === 'digit') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['digit']."</option> <option value='boolean'"; if ($aajudge['assertion'] === 'boolean') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['boolean']."</option> <option value='notEmpty'"; if ($aajudge['assertion'] === 'notEmpty') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['notEmpty']."</option> <option value='notNull'"; if ($aajudge['assertion'] === 'notNull') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['notNull']."</option> <option value='string'"; if ($aajudge['assertion'] === 'string') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['string']."</option> <option value='startsWith'"; if ($aajudge['assertion'] === 'startsWith') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['startsWith']."</option> <option value='endsWith'"; if ($aajudge['assertion'] === 'endsWith') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['endsWith']."</option> <option value='contains'"; if ($aajudge['assertion'] === 'contains') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['contains']."</option> <option value='numeric'"; if ($aajudge['assertion'] === 'numeric') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['numeric']."</option> <option value='isArray'"; if ($aajudge['assertion'] === 'isArray') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['isArray']."</option> <option value='true'"; if ($aajudge['assertion'] === 'true') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['true']."</option> <option value='false'"; if ($aajudge['assertion'] === 'false') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['false']."</option> <option value='isJsonString'"; if ($aajudge['assertion'] === 'isJsonString') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['isJsonString']."</option> <option value='isObject'"; if ($aajudge['assertion'] === 'isObject') {$tool_content .= " selected='selected'";} $tool_content .=">".$langAutoJudgeAssertions['isObject']."</option> </select> </td>"; if (isset($aajudge['output'])) { $tool_content .= "<td><input type='text' value='".htmlspecialchars($aajudge['output'], ENT_QUOTES)."' name='auto_judge_scenarios[$rows][output]' class='auto_judge_output' /></td>"; } else { $tool_content .= "<td><input type='text' value='' name='auto_judge_scenarios[$rows][output]' disabled='disabled' class='auto_judge_output' /></td>"; } $tool_content .= "<td><input type='text' value='$aajudge[weight]' name='auto_judge_scenarios[$rows][weight]' class='auto_judge_weight'/></td> <td><a href='#' class='autojudge_remove_scenario' style='display: ".($rows <= 0 ? 'none': 'visible').";'>X</a></td> </tr>"; $rows++; } } else { $tool_content .= "<tr> <td><input type='text' name='auto_judge_scenarios[$rows][input]' /></td> <td> <select name='auto_judge_scenarios[$rows][assertion]' class='auto_judge_assertion'> <option value='eq' selected='selected'>".$langAutoJudgeAssertions['eq']."</option> <option value='same'>".$langAutoJudgeAssertions['same']."</option> <option value='notEq'>".$langAutoJudgeAssertions['notEq']."</option> <option value='notSame'>".$langAutoJudgeAssertions['notSame']."</option> <option value='integer'>".$langAutoJudgeAssertions['integer']."</option> <option value='float'>".$langAutoJudgeAssertions['float']."</option> <option value='digit'>".$langAutoJudgeAssertions['digit']."</option> <option value='boolean'>".$langAutoJudgeAssertions['boolean']."</option> <option value='notEmpty'>".$langAutoJudgeAssertions['notEmpty']."</option> <option value='notNull'>".$langAutoJudgeAssertions['notNull']."</option> <option value='string'>".$langAutoJudgeAssertions['string']."</option> <option value='startsWith'>".$langAutoJudgeAssertions['startsWith']."</option> <option value='endsWith'>".$langAutoJudgeAssertions['endsWith']."</option> <option value='contains'>".$langAutoJudgeAssertions['contains']."</option> <option value='numeric'>".$langAutoJudgeAssertions['numeric']."</option> <option value='isArray'>".$langAutoJudgeAssertions['isArray']."</option> <option value='true'>".$langAutoJudgeAssertions['true']."</option> <option value='false'>".$langAutoJudgeAssertions['false']."</option> <option value='isJsonString'>".$langAutoJudgeAssertions['isJsonString']."</option> <option value='isObject'>".$langAutoJudgeAssertions['isObject']."</option> </select> </td> <td><input type='text' name='auto_judge_scenarios[$rows][output]' class='auto_judge_output' /></td> <td><input type='text' name='auto_judge_scenarios[$rows][weight]' class='auto_judge_weight'/></td> <td><a href='#' class='autojudge_remove_scenario' style='display: none;'>X</a></td> </tr> "; } $tool_content .= "<tr> <td> </td> <td> </td> <td> </td> <td style='text-align:center;'> $langAutoJudgeSum: <span id='weights-sum'>0</span></td> <td> <input type='submit' value='$langAutoJudgeNewScenario' id='autojudge_new_scenario' /></td> </tr> </tbody> </table> </div> </div> <div class='form-group'> <label class='col-sm-2 control-label'>$langAutoJudgeProgrammingLanguage:</label> <div class='col-sm-10'> <select id='lang' name='lang'>"; foreach($connector->getSupportedLanguages() as $llang => $ext) { $tool_content .= "<option value='$llang' ".($llang === $lang ? "selected='selected'" : "").">$llang</option>\n"; } $tool_content .= "</select> </div> </div>"; } $tool_content .= Tag::tagInput($id)." </div> <div class='form-group'> <div class='col-sm-offset-2 col-sm-10'>". form_buttons(array( array( 'class' => 'btn-primary', 'name' => 'do_edit', 'value' => $langSave, 'javascript' => "selectAll('assignee_box',true)" ), array( 'href' => "$_SERVER[SCRIPT_NAME]?course=$course_code", ) )) ."</div> </div> </fieldset> </form></div>"; }