Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions modules/Planner/planner_add.php
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,10 @@

$form->addHiddenValue('address', $session->get('address'));

// Posted even when Advanced Options are hidden (those inputs are disabled and omitted from POST).
$form->addHiddenValue('viewableStudents', $settingGateway->getSettingByScope('Planner', 'sharingDefaultStudents'));
$form->addHiddenValue('viewableParents', $settingGateway->getSettingByScope('Planner', 'sharingDefaultParents'));

//BASIC INFORMATION
$form->addRow()->addHeading('Basic Information', __('Basic Information'));

Expand Down Expand Up @@ -404,6 +408,9 @@
$row->addCheckbox('notify')->description(__('Notify all class participants'));
$row->addSubmit();

// Module hooks that add fields to the add-lesson form (also used for Import columns)
\Gibbon\Domain\Planner\LessonPlanAddFormBuilder::applyLessonPlannerAddHooks($container, $form);

// CUSTOM FIELDS
$container->get(CustomFieldHandler::class)->addCustomFieldsToForm($form, 'Lesson Plan', [], '');

Expand Down
6 changes: 4 additions & 2 deletions modules/Planner/planner_addProcess.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
use Gibbon\Data\Validator;
use Gibbon\Forms\CustomFieldHandler;
use Gibbon\Forms\Builder\Storage\FormSessionStorage;
use Gibbon\Domain\System\SettingGateway;

require_once __DIR__ . '/../../gibbon.php';

Expand Down Expand Up @@ -178,8 +179,9 @@

$gibbonSpaceID = $_POST['gibbonSpaceID'] ?? null;
$gibbonTTDayRowClassID = $_POST['gibbonTTDayRowClassID'] ?? null;
$viewableParents = $_POST['viewableParents'] ?? 'Y';
$viewableStudents = $_POST['viewableStudents'] ?? 'Y';
$settingGateway = $container->get(SettingGateway::class);
$viewableParents = $_POST['viewableParents'] ?? $settingGateway->getSettingByScope('Planner', 'sharingDefaultParents') ?: 'N';
$viewableStudents = $_POST['viewableStudents'] ?? $settingGateway->getSettingByScope('Planner', 'sharingDefaultStudents') ?: 'Y';
$gibbonPersonIDCreator = $session->get('gibbonPersonID');
$gibbonPersonIDLastEdit = $session->get('gibbonPersonID');

Expand Down
38 changes: 25 additions & 13 deletions modules/Planner/planner_edit.php
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,11 @@
$form->addMeta()->addDefaultContent('editProcess');

$form->addHiddenValue('address', $session->get('address'));

// Posted even when Advanced Options are hidden (those inputs are disabled and omitted from POST).
$form->addHiddenValue('viewableStudents', $values['viewableStudents'] ?? 'Y');
$form->addHiddenValue('viewableParents', $values['viewableParents'] ?? 'N');
$form->addHiddenValue('videoLink', $fields['videoLink'] ?? '');

if (!empty($gibbonMarkbookColumnID)) {
$form->addHeaderAction('markbook', __('Linked Markbook'))
Expand Down Expand Up @@ -372,13 +377,20 @@
$row->addYesNo('markbook')->required()->checked('N');
}

// ADVANCED OPTIONS
$form->addRow()->addHeading('Advanced Options', __('Advanced Options'));

$form->toggleVisibilityByClass('advanced')->onCheckbox('advanced')->when('Y');
$row = $form->addRow();
$row->addCheckbox('advanced')->setValue('Y')->checked(true)->description(__('Show Advanced Options'));

// OUTCOMES
$form->addRow()->addHeading('Outcomes', __('Outcomes'));
$form->addRow()->addContent(__('Link this lesson to outcomes (defined in the Manage Outcomes section of the Planner), and track which outcomes are being met in which lessons.'));
$form->addRow()->addClass('advanced')->addHeading('Outcomes', __('Outcomes'));
$form->addRow()->addClass('advanced')->addContent(__('Link this lesson to outcomes (defined in the Manage Outcomes section of the Planner), and track which outcomes are being met in which lessons.'));

$allowOutcomeEditing = $settingGateway->getSettingByScope('Planner', 'allowOutcomeEditing');

$row = $form->addRow();
$row = $form->addRow()->addClass('advanced');
$customBlocks = $row->addPlannerOutcomeBlocks('outcome', $session, $gibbonYearGroupIDList, $gibbonDepartmentID, $allowOutcomeEditing);

$dataBlocks = array('gibbonPlannerEntryID' => $gibbonPlannerEntryID);
Expand All @@ -397,13 +409,13 @@


//Access
$form->addRow()->addHeading('Access', __('Access'));
$form->addRow()->addClass('advanced')->addHeading('Access', __('Access'));

$row = $form->addRow();
$row = $form->addRow()->addClass('advanced');
$row->addLabel('viewableStudents', __('Viewable by Students'));
$row->addYesNo('viewableStudents')->required();

$row = $form->addRow();
$row = $form->addRow()->addClass('advanced');
$row->addLabel('viewableParents', __('Viewable by Parents'));
$row->addYesNo('viewableParents')->required();

Expand All @@ -412,19 +424,19 @@
$row->addURL('videoLink')->setValue($fields['videoLink'] ?? '');

//Guests
$form->addRow()->addHeading('Guests', __('Current Guests'));
$form->addRow()->addClass('advanced')->addHeading('Guests', __('Current Guests'));

$data = array('gibbonPlannerEntryID' => $gibbonPlannerEntryID);
$sql = "SELECT title, preferredName, surname, category, gibbonPlannerEntryGuest.* FROM gibbonPlannerEntryGuest JOIN gibbonPerson ON (gibbonPlannerEntryGuest.gibbonPersonID=gibbonPerson.gibbonPersonID) JOIN gibbonRole ON (gibbonPerson.gibbonRoleIDPrimary=gibbonRole.gibbonRoleID) WHERE gibbonPlannerEntryID=:gibbonPlannerEntryID ORDER BY surname, preferredName";

$results = $pdo->executeQuery($data, $sql);

if ($results->rowCount() == 0) {
$form->addRow()->addAlert(__('There are no records to display.'), 'error');
$form->addRow()->addClass('advanced')->addAlert(__('There are no records to display.'), 'error');
} else {
$form->addRow()->addContent('<b>'.__('Warning').'</b>: '.__('If you delete a guest, any unsaved changes to this planner entry will be lost!'))->wrap('<i>', '</i>');
$form->addRow()->addClass('advanced')->addContent('<b>'.__('Warning').'</b>: '.__('If you delete a guest, any unsaved changes to this planner entry will be lost!'))->wrap('<i>', '</i>');

$table = $form->addRow()->addTable()->addClass('colorOddEven');
$table = $form->addRow()->addClass('advanced')->addTable()->addClass('colorOddEven');

$header = $table->addHeaderRow();
$header->addContent(__('Name'));
Expand All @@ -439,9 +451,9 @@
}
}

$form->addRow()->addHeading('New Guests', __('New Guests'));
$form->addRow()->addClass('advanced')->addHeading('New Guests', __('New Guests'));

$row = $form->addRow();
$row = $form->addRow()->addClass('advanced');
$row->addLabel('guests', __('Guest List'));
$row->addSelectUsers('guests', $session->get('gibbonSchoolYearID'))->selectMultiple();

Expand All @@ -453,7 +465,7 @@
'Guest Parent' => __('Guest Parent'),
'Other Guest' => __('Other Guest'),
);
$row = $form->addRow();
$row = $form->addRow()->addClass('advanced');
$row->addLabel('role', __('Role'));
$row->addSelect('role')->fromArray($roles);

Expand Down
15 changes: 7 additions & 8 deletions modules/Planner/planner_editProcess.php
Original file line number Diff line number Diff line change
Expand Up @@ -70,10 +70,10 @@
try {
if ($highestAction == 'Lesson Planner_viewEditAllClasses') {
$data = array('gibbonPlannerEntryID' => $gibbonPlannerEntryID);
$sql = 'SELECT gibbonPlannerEntryID, gibbonUnitID, gibbonCourse.nameShort AS course, gibbonCourseClass.nameShort AS class, gibbonPlannerEntry.name, summary, gibbonPlannerEntry.fields FROM gibbonPlannerEntry JOIN gibbonCourseClass ON (gibbonPlannerEntry.gibbonCourseClassID=gibbonCourseClass.gibbonCourseClassID) JOIN gibbonCourse ON (gibbonCourse.gibbonCourseID=gibbonCourseClass.gibbonCourseID) WHERE gibbonPlannerEntryID=:gibbonPlannerEntryID';
$sql = 'SELECT gibbonPlannerEntryID, gibbonUnitID, gibbonCourse.nameShort AS course, gibbonCourseClass.nameShort AS class, gibbonPlannerEntry.name, summary, gibbonPlannerEntry.viewableParents, gibbonPlannerEntry.viewableStudents, gibbonPlannerEntry.fields FROM gibbonPlannerEntry JOIN gibbonCourseClass ON (gibbonPlannerEntry.gibbonCourseClassID=gibbonCourseClass.gibbonCourseClassID) JOIN gibbonCourse ON (gibbonCourse.gibbonCourseID=gibbonCourseClass.gibbonCourseID) WHERE gibbonPlannerEntryID=:gibbonPlannerEntryID';
} else {
$data = array('gibbonPlannerEntryID' => $gibbonPlannerEntryID, 'gibbonPersonID' => $session->get('gibbonPersonID'));
$sql = "SELECT gibbonPlannerEntryID, gibbonUnitID, gibbonCourse.nameShort AS course, gibbonCourseClass.nameShort AS class, gibbonPlannerEntry.name, summary, role, gibbonPlannerEntry.fields FROM gibbonPlannerEntry JOIN gibbonCourseClass ON (gibbonPlannerEntry.gibbonCourseClassID=gibbonCourseClass.gibbonCourseClassID) JOIN gibbonCourseClassPerson ON (gibbonCourseClass.gibbonCourseClassID=gibbonCourseClassPerson.gibbonCourseClassID) JOIN gibbonCourse ON (gibbonCourse.gibbonCourseID=gibbonCourseClass.gibbonCourseID) WHERE gibbonCourseClassPerson.gibbonPersonID=:gibbonPersonID AND role='Teacher' AND gibbonPlannerEntryID=:gibbonPlannerEntryID";
$sql = "SELECT gibbonPlannerEntryID, gibbonUnitID, gibbonCourse.nameShort AS course, gibbonCourseClass.nameShort AS class, gibbonPlannerEntry.name, summary, role, gibbonPlannerEntry.viewableParents, gibbonPlannerEntry.viewableStudents, gibbonPlannerEntry.fields FROM gibbonPlannerEntry JOIN gibbonCourseClass ON (gibbonPlannerEntry.gibbonCourseClassID=gibbonCourseClass.gibbonCourseClassID) JOIN gibbonCourseClassPerson ON (gibbonCourseClass.gibbonCourseClassID=gibbonCourseClassPerson.gibbonCourseClassID) JOIN gibbonCourse ON (gibbonCourse.gibbonCourseID=gibbonCourseClass.gibbonCourseID) WHERE gibbonCourseClassPerson.gibbonPersonID=:gibbonPersonID AND role='Teacher' AND gibbonPlannerEntryID=:gibbonPlannerEntryID";
}
$result = $connection2->prepare($sql);
$result->execute($data);
Expand Down Expand Up @@ -200,19 +200,18 @@

$gibbonSpaceID = $_POST['gibbonSpaceID'] ?? null;
$gibbonTTDayRowClassID = $_POST['gibbonTTDayRowClassID'] ?? null;
$viewableParents = $_POST['viewableParents'] ?? '';
$viewableStudents = $_POST['viewableStudents'] ?? '';
$viewableParents = $_POST['viewableParents'] ?? ($row['viewableParents'] ?? '');
$viewableStudents = $_POST['viewableStudents'] ?? ($row['viewableStudents'] ?? '');
$gibbonPersonIDCreator = $session->get('gibbonPersonID');
$gibbonPersonIDLastEdit = $session->get('gibbonPersonID');

// CUSTOM FIELDS
$customRequireFail = false;
$fields = $container->get(CustomFieldHandler::class)->getFieldDataFromPOST('Lesson Plan', [], $customRequireFail);

if (isset($_POST['videoLink'])) {
$fields = !empty($fields) ? json_decode($fields, true) : [];
$fields = json_encode(['videoLink'=> $_POST['videoLink'] ?? ''] + $fields);
}
$existingFields = !empty($row['fields']) ? json_decode($row['fields'], true) : [];
$fields = !empty($fields) ? json_decode($fields, true) : [];
$fields = json_encode(['videoLink' => $_POST['videoLink'] ?? ($existingFields['videoLink'] ?? '')] + $fields);

if ($viewBy == '' or $gibbonCourseClassID == '' or $date == '' or $timeStart == '' or $timeEnd == '' or $name == '' or $homework == '' or $viewableParents == '' or $viewableStudents == '' or ($homework == 'Y' and ($homeworkDetails == '' or $homeworkDueDate == ''))) {
$URL .= "&return=error3$params";
Expand Down
156 changes: 156 additions & 0 deletions resources/imports/plannerLessons.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
details:
type: plannerLessons
name: Lessons
table: gibbonPlannerEntry
dynamicForm: plannerLessonAdd
modes: { update: true, insert: true, export: true }
access:
module: Planner
action: Lesson Planner_viewEditAllClasses
primaryKey:
gibbonPlannerEntryID
uniqueKeys:
- [ gibbonCourseClassID, date, timeStart, name ]
table:
gibbonSchoolYearID:
name: "School Year"
desc: "School year name, as set in School Admin. Must already exist."
args: { filter: schoolyear, required: true, readonly: true, custom: true }
relationship: { table: gibbonSchoolYear, key: gibbonSchoolYearID, field: name }
gibbonCourseID:
name: "Course"
desc: "Short Name"
args: { filter: string, required: true, readonly: true, custom: true }
relationship: { table: gibbonCourse, key: gibbonCourseID, field: [ nameShort, gibbonSchoolYearID ] }
gibbonCourseClassID:
name: "Class"
desc: "Short Name"
args: { filter: string, required: true }
relationship: { table: gibbonCourseClass, key: gibbonCourseClassID, field: [ nameShort, gibbonCourseID ] }
gibbonUnitID:
name: "Unit"
desc: "Name"
args: { filter: string, custom: true }
relationship: { table: gibbonUnit, key: gibbonUnitID, field: [ name, gibbonCourseID ] }
name:
name: "Lesson Name"
desc: ""
args: { filter: string, required: true }
summary:
name: "Summary"
desc: ""
args: { filter: string }
date:
name: "Date"
desc: ""
args: { filter: date, required: true }
timeStart:
name: "Start Time"
desc: "Format: hh:mm (24hr)"
args: { filter: time, required: true, custom: true }
timeEnd:
name: "End Time"
desc: "Format: hh:mm (24hr)"
args: { filter: time, required: true, custom: true }
gibbonSpaceID:
name: "Location"
desc: ""
args: { filter: string, custom: true }
relationship: { table: gibbonSpace, key: gibbonSpaceID, field: name }
description:
name: "Lesson Details"
desc: ""
args: { filter: html }
teachersNotes:
name: "Teacher's Notes"
desc: ""
args: { filter: html }
homework:
name: "Add Homework?"
desc: ""
args: { filter: yesno, required: true, custom: true }
homeworkDueDateTime:
name: "Due Date"
desc: "Date is required, time is optional."
args: { filter: timestamp, custom: true }
homeworkTimeCap:
name: "Time Cap?"
desc: "The maximum time, in minutes, for students to work on this."
args: { filter: numeric, custom: true }
homeworkDetails:
name: "Homework Details"
desc: ""
args: { filter: html }
homeworkSubmission:
name: "Online Submission?"
desc: ""
args: { filter: yesno, custom: true }
homeworkSubmissionDateOpen:
name: "Submission Open Date"
desc: ""
args: { filter: date, custom: true }
homeworkSubmissionDrafts:
name: "Drafts"
desc: "Blank for none, or 1, 2, or 3."
args: { filter: string, custom: true }
homeworkSubmissionType:
name: "Submission Type"
desc: "Link, File, or Link/File"
args: { filter: string, custom: true }
homeworkSubmissionRequired:
name: "Submission Required"
desc: "Optional or Required"
args: { filter: string, custom: true }
homeworkCrowdAssess:
name: "Crowd Assessment?"
desc: ""
args: { filter: yesno, custom: true }
homeworkCrowdAssessClassmatesRead:
name: "Classmates"
desc: ""
args: { filter: yesno, custom: true }
homeworkCrowdAssessOtherStudentsRead:
name: "Other Students"
desc: ""
args: { filter: yesno, custom: true }
homeworkCrowdAssessOtherTeachersRead:
name: "Other Teachers"
desc: ""
args: { filter: yesno, custom: true }
homeworkCrowdAssessSubmitterParentsRead:
name: "Submitter's Parents"
desc: ""
args: { filter: yesno, custom: true }
homeworkCrowdAssessClassmatesParentsRead:
name: "Classmates's Parents"
desc: ""
args: { filter: yesno, custom: true }
homeworkCrowdAssessOtherParentsRead:
name: "Other Parents"
desc: ""
args: { filter: yesno, custom: true }
viewableStudents:
name: "Viewable by Students"
desc: ""
args: { filter: yesno, required: true, custom: true }
viewableParents:
name: "Viewable by Parents"
desc: ""
args: { filter: yesno, required: true, custom: true }
videoLink:
name: "Online Lesson"
desc: "Displays a video link for online lessons"
args: { filter: url, custom: true, readonly: true, serialize: fields, customField: videoLink }
gibbonPersonIDCreator:
name: "Created By"
desc: "Username or Email (if unique)"
args: { filter: string, required: true, custom: true }
relationship: { table: gibbonPerson, key: gibbonPersonID, field: username|email }
gibbonPersonIDLastEdit:
name: "Last Edited By"
desc: "Copied from Created By"
args: { filter: string, hidden: true, linked: gibbonPersonIDCreator, custom: true }
fields:
name: "Custom Fields"
desc: ""
args: { filter: customfield, serialize: fields, custom: true, hidden: true }
Loading
Loading