Sample Assmt Coll

Simple test for detecting changes in assessment answerkeys

by jwstott

HTML

<script src="http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-2.1.0.js"></script>
<form action='/someServerSideHandler'>
    <p>Exam:  
        <span data-bind='text: metadata.examName'></span>
        <span data-bind='text: assessments().length'></span> questions</p>
    <p><select data-bind="options: assessments, optionsText: 'name' , value: selectedAssessment"  ></select></p>
    <table data-bind='visible: assessments().length > 0'>
        <thead>
            <tr>
                <th>Name</th>
                <th>AnswerKey</th>
            </tr>
        </thead>
        <tbody data-bind='foreach: assessments'>
            <tr>
                <td><input  data-bind='value: name, uniqueName: true' /></td>
                <td><input  data-bind='value: answerKey, uniqueName: true' /></td>
            </tr>
        </tbody>
    </table>
 
    
    <button data-bind='click: goPrevious, enable: canGoPrevious()' >Prev</button>
    <button data-bind='click: goNext, enable: canGoNext()' >Next</button>
    <button data-bind='click: goFirstOpen, enable: hasOpen()' >NextOpen</button>
</form>

JavaScript

var ces = ces || {};
ces.AssessmentModel = function(question, key) {
    var name = ko.observable(question),
        answerKey = ko.observable(key);
    return {
        name: name,
        answerKey: answerKey
    };
};

ces.ExamModel = function(questions) {
    var metadata = {
        sessionName: "",
        examName: ""
    },
        assessments = ko.observableArray(questions),
        selectedAssessment = ko.observable(assessments()[0]),
        openAssessments = ko.computed(function() {
            return ko.utils.arrayFilter(assessments(), function(item) {
                if (!item.answerKey()) {
                    return item;
                }
            });
        }),
        goFirstOpen = function() {
            if (hasOpen()) {
                selectedAssessment(openAssessments()[0]);
            }
        },
        hasOpen = ko.computed(function() {
            return openAssessments().length > 0;
        }),
        currentIndex = ko.computed(function() {
            return assessments().indexOf(selectedAssessment());
        }),

        canGoNext = ko.computed(function() {
            return currentIndex() < assessments().length - 1;
        }),
        goNext = function() {
            if (canGoNext()) {
                selectedAssessment(assessments()[currentIndex() + 1]);
            }
        },
        canGoPrevious = ko.computed(function() {
            return currentIndex() > 0;
        }),
        goPrevious = function() {
            if (canGoPrevious()) {
                selectedAssessment(assessments()[currentIndex() - 1]);
            }
        };
    return {
        metadata: metadata,
        assessments: assessments,
        openAssessments: openAssessments,
        selectedAssessment: selectedAssessment,
        hasOpen: hasOpen,
        goPrevious: goPrevious,
        canGoPrevious: canGoPrevious,
        goNext: goNext,
        canGoNext: canGoNext,
        currentIndex: currentIndex,
        goFirstOpen: goFirstOpen
   ...