diff --git a/application/modules/courses/controllers/EditController.php b/application/modules/courses/controllers/EditController.php index 640a4525b4898c432f3107142a7689b55ddef603..8deb25282bb3065f89b8d48cc6f3b39eb8a9374a 100644 --- a/application/modules/courses/controllers/EditController.php +++ b/application/modules/courses/controllers/EditController.php @@ -36,12 +36,7 @@ class Courses_EditController extends App_Controller_Action $errors = array(); if (!in_array($request->getType(), array('RemoveCourse', 'AddACEToCourse', 'RemoveACEFromCourse'))) { - if ($this->_courseCodeIsAvailable($course, $in->subject, $in->courseNumber, $in->courseLetter)) { - $course->setCourseCode($in->subject, $in->courseNumber, $in->courseLetter); - } else { - $errors['courseCode'] = 'The course code ' . $in->subject . ' ' . $in->courseNumber . $in->courseLetter - . ' is not available.'; - } + $course->setCourseCode($in->subject, $in->courseNumber, $in->courseLetter); $course->setTitle($in->title); if (Unl_Util::isArray($in->crosslistings)) { foreach ($in->crosslistings as $id => $crosslisting) { @@ -57,11 +52,6 @@ class Courses_EditController extends App_Controller_Action if ($crosslisting->delete == 'yes') { $course->removeCrosslisting($id); } else { - if (!$this->_courseCodeIsAvailable($course, $crosslisting->subject, $crosslisting->courseNumber, $crosslisting->courseLetter)) { - $errors['crosslistings'][] = 'The course code ' . $crosslisting->subject . ' ' . $crosslisting->courseNumber . $crosslisting->courseLetter - . ' is not available.'; - continue; - } if ($crosslisting->action == 'edit') { $course->editCrosslisting($id, $crosslisting->type, $crosslisting->subject, $crosslisting->courseNumber, $crosslisting->courseLetter); } else { @@ -339,4 +329,29 @@ class Courses_EditController extends App_Controller_Action return true; } + + protected function isCourseCodeAvailableAction() + { + $in = $this->_getAllParams(); + + $session = new Zend_Session_Namespace('Edit Request'); + $course = $session->course; + + $available = $this->_courseCodeIsAvailable($course, $in['subject'], $in['courseNumber'], $in['courseLetter']); + + $dom = new DOMDocument(); + $root = $dom->createElement('response'); + $dom->appendChild($root); + if ($available) { + $responseNode = $dom->createElement('true'); + } else { + $responseNode = $dom->createElement('false'); + } + $root->appendChild($responseNode); + + header('Content-type: text/xml'); + echo $dom->saveXML(); + + exit; + } } diff --git a/application/modules/courses/views/scripts/edit/index.phtml b/application/modules/courses/views/scripts/edit/index.phtml index 3bdf675d93165b9d9871af2b5b06200f215cac2e..9444f4f702c43e850b8a1043b14b2e432855a551 100644 --- a/application/modules/courses/views/scripts/edit/index.phtml +++ b/application/modules/courses/views/scripts/edit/index.phtml @@ -16,17 +16,13 @@ <div class="main_section"> <h2>Course ID</h2> - <?php if ($this->errors['courseCode']) { ?> - <div class="error"> - <?php echo $this->errors['courseCode']; ?> - </div> - <?php } ?> <fieldset class="three_column" id="courseId"> <div class="column"> <label for="subject" class="required">Subject:</label> <input type="text" id="subject" name="subject" + class="courseCodeInput" value="<?php echo htmlentities($this->course->getSubject(), ENT_COMPAT, 'UTF-8'); ?>" /> </div> @@ -36,6 +32,7 @@ <input type="text" id="courseNumber" name="courseNumber" + class="courseCodeInput" value="<?php echo htmlentities($this->course->getCourseNumber(), ENT_COMPAT, 'UTF-8'); ?>" /> </div> @@ -44,6 +41,7 @@ <input type="text" id="courseLetter" name="courseLetter" + class="courseCodeInput" value="<?php echo htmlentities($this->course->getCourseLetter(), ENT_COMPAT, 'UTF-8'); ?>" /> </div> @@ -62,14 +60,6 @@ <fieldset class="three_column"> <h3>Crosslistings</h3> - <?php if ($this->errors['crosslistings']) { ?> - <div class="error"> - <?php foreach ($this->errors['crosslistings'] as $error) { ?> - <?php echo $error; ?><br /> - <?php } ?> - </div> - <?php } ?> - <table> <?php $hasTieIn = false; foreach($this->course->getCrosslistings() as $key => $crosslist) { @@ -83,16 +73,19 @@ <?php if($crosslist['type'] == 'grad tie-in') { ?>readonly=""<?php } ?>/> <input type="text" name="crosslistings[<?php echo $key; ?>][subject]" + class="courseCodeInput" value="<?php echo $crosslist['subject']; ?>" <?php if($crosslist['type'] == 'grad tie-in') { ?>readonly=""<?php } ?>/> </td> <th> Course Number: </th> <td> <input type="text" name="crosslistings[<?php echo $key; ?>][courseNumber]" + class="courseCodeInput" value="<?php echo $crosslist['courseNumber']; ?>" <?php if($crosslist['type'] == 'grad tie-in') { ?>readonly=""<?php } ?> /> </td> <th> Course Letter: </th> <td> <input type="text" name="crosslistings[<?php echo $key; ?>][courseLetter]" + class="courseCodeInput" value="<?php echo $crosslist['courseLetter']; ?>" <?php if($crosslist['type'] == 'grad tie-in') { ?>readonly=""<?php } ?> /> </td> <td class="hidden"> @@ -110,11 +103,11 @@ <?php } } ?> <tr class="hidden_new_record"> <th> Subject: </th> - <td> <input disabled="disabled" type="text" name="crosslistings[__key__][subject]" /> </td> + <td> <input disabled="disabled" type="text" class="courseCodeInput" name="crosslistings[__key__][subject]" /> </td> <th> Course Number: </th> - <td> <input disabled="disabled" type="text" name="crosslistings[__key__][courseNumber]" /> </td> + <td> <input disabled="disabled" type="text" class="courseCodeInput" name="crosslistings[__key__][courseNumber]" /> </td> <th> Course Letter: </th> - <td> <input disabled="disabled" type="text" name="crosslistings[__key__][courseLetter]" /> </td> + <td> <input disabled="disabled" type="text" class="courseCodeInput" name="crosslistings[__key__][courseLetter]" /> </td> <td class="hidden"> <input disabled="disabled" type="hidden" name="crosslistings[__key__][type]" value="crosslisting" /> </td> <td> <a href="#" class="remove_record_button">Remove</a> </td> </tr> diff --git a/document_root/javascript/courses/edit.js b/document_root/javascript/courses/edit.js index 64c3b5836bf88a691f08cd7e372d4492d3889f57..70dd5ca89bacad8ed176f9117eff24872d404413 100644 --- a/document_root/javascript/courses/edit.js +++ b/document_root/javascript/courses/edit.js @@ -53,6 +53,11 @@ function onEditWrapperLoad() } } } + + var courseCodeInputs = getElementsByClass('courseCodeInput'); + for (var i = 0; i != courseCodeInputs.length; i++) { + courseCodeInputs[i].onchange = handleCourseCodeInputChange; + } } @@ -113,6 +118,12 @@ function handleAddRecord() newNode.className = 'grad_tie_in_row'; } + + var courseCodeInputs = getElementsByClass('courseCodeInput'); + for (var i = 0; i != courseCodeInputs.length; i++) { + courseCodeInputs[i].onchange = handleCourseCodeInputChange; + } + return false; } @@ -251,3 +262,47 @@ function enforceMaximumSelectionCount(inputNodes, toggledInput, maxSelected, hid } } } + +function handleCourseCodeInputChange() +{ + var courseCodeNodes = this.parentNode.parentNode.getElementsByTagName('input'); + var ajax = new courseCodeAvailableAjaxResponder(); + ajax.subjectNode = courseCodeNodes[0]; + ajax.courseNumberNode = courseCodeNodes[1]; + ajax.courseLetterNode = courseCodeNodes[2]; + ajax.sendRequest(ajax.getUrl()); +} + +var courseCodeAvailableAjaxResponder = AjaxClient.extend( +{ + subjectNode: null, + courseNumberNode: null, + courseLetterNode: null, + + processResponse: function() { + if(this.requestObject.responseXML.childNodes[0].childNodes[0].nodeName == 'true') { + return; + } + + var message = 'The course code ' + + this.subjectNode.value + ' ' + this.courseNumberNode.value + this.courseLetterNode.value + + ' belongs to an active course. Clik OK if you are you sure you want to continue.'; + + if (confirm(message)) { + return; + } + + this.subjectNode.value = ''; + this.courseNumberNode.value = ''; + this.courseLetterNode.value = ''; + }, + + getUrl: function() { + return baseUrl + + '/courses/edit/is-course-code-available' + + '/subject/' + this.subjectNode.value + + '/courseNumber/' + this.courseNumberNode.value + + '/courseLetter/' + this.courseLetterNode.value; + } +}); +