diff --git a/app/client/views/patients/patient_visit.coffee b/app/client/views/patients/patient_visit.coffee index a55f03d..36c15ba 100644 --- a/app/client/views/patients/patient_visit.coffee +++ b/app/client/views/patients/patient_visit.coffee @@ -1,86 +1,89 @@ AutoForm.hooks uploadPhysioRecordForm: onSubmit: (insertDoc, updateDoc, currentDoc) -> PhysioRecords.update insertDoc.physioRecordId, $set: 'metadata.visitId': currentDoc._id 'metadata.sensor': insertDoc.sensor 'metadata.deviceName': insertDoc.deviceName @done() false Template.patientVisit.created = -> id = @data.visitId @subscribe "physioRecordsForVisit", id @subscribe "questionnaires" Template.patientVisit.helpers #this templateData visit: -> Visits.findOne @visitId #this visit isRunning: -> @startedAt? and !@endedAt? #this visit canStart: -> patient = Template.parentData().patient !@endedAt? and !patient.runningVisitId? #this visit questionnaires: -> qIds = @questionnaireIds or [] Questionnaires.find _id: {$in: qIds} #this visit showEmpaticaRecorder: -> @recordPhysicalData and Meteor.isCordova #this visit empaticaSessionId: -> @_id #this visit physioRecords: -> PhysioRecords.find 'metadata.visitId': @_id #this visit uploadFormSchema: -> schema = sensor: type: String label: "Sensor" deviceName: type: String label: "Device name" optional: true physioRecordId: type: String label: " " autoform: afFieldInput: type: 'fileUpload' collection: 'PhysioRecords' label: 'Choose file' new SimpleSchema(schema) Template.patientVisit.events "click .startVisit": (evt) -> - Meteor.call "startVisit", @_id, (error, id) -> + Meteor.call "startVisit", @_id, (error) -> throwError error if error? return "click .stopVisit": (evt) -> - Meteor.call "stopVisit", @_id, (error, id) -> + Meteor.call "stopVisit", @_id, (error) -> throwError error if error? return Template.answerQuestionnaireRow.events #this: {questionnaire, visit, patient} "click .answerQuestionnaire": (evt, tmpl) -> - #Session.set("answeringQuestionnaireId", @_id) - Modal.show('questionnaireWizzard', @) + Session.set("answeringQuestionnaireId", @_id) + if !@patient.runningVisitId? or @patient.runningVisitId isnt @visit._id + alert("This visit must be running to answer it's questionnaires.") + else + Modal.show('questionnaireWizzard', @) false diff --git a/app/client/views/questionnaires/questionnaire_wizzard.coffee b/app/client/views/questionnaires/questionnaire_wizzard.coffee index f0753cd..7c25fd8 100644 --- a/app/client/views/questionnaires/questionnaire_wizzard.coffee +++ b/app/client/views/questionnaires/questionnaire_wizzard.coffee @@ -1,89 +1,90 @@ questionIndex = new ReactiveVar(0) AutoForm.hooks questionForm: onSubmit: (insertDoc, updateDoc, currentDoc) -> insertDoc.patientId = currentDoc.patientId insertDoc.visitId = currentDoc.visitId insertDoc.questionId = currentDoc.questionId insertDoc.questionnaireId = currentDoc.questionnaireId insertDoc._id = currentDoc._id if currentDoc._id? unless currentDoc.answer? and currentDoc.answer is insertDoc.answer - Meteor.call "upsertAnswer", insertDoc + Meteor.call "upsertAnswer", insertDoc, (error) -> + throwError error if error? questionIndex.set questionIndex.get()+1 @done() false Template.questionnaireWizzard.created = -> template = @ @subscribe("questionsForQuestionnaire", @data.questionnaire._id) @subscribe("answersForVisitAndQuestionnaire", @data.visit._id, @data.questionnaire._id) questionIndex.set 1 Template.questionnaireWizzard.helpers questionFormSchema: -> q = Questions.findOne( questionnaireId: @questionnaire._id index: questionIndex.get() ) return null unless q? TemplateVar.set("questionId", q._id) schema = _id: type: String optional: true patientId: type: String optional: true visitId: type: String optional: true questionnaireId: type: String optional: true questionId: type: String optional: true answer: q.getSchemaDict() new SimpleSchema(schema) doc: -> a = Answers.findOne patientId: @patient._id visitId: @visit._id questionnaireId: @questionnaire._id questionId: TemplateVar.get("questionId") a or patientId: @patient._id visitId: @visit._id questionnaireId: @questionnaire._id questionId: TemplateVar.get("questionId") allQuestions: -> answers = {} Answers.find visitId: @visit._id questionnaireId: @questionnaire._id .forEach (answer) -> answers[answer.questionId] = answer activeIndex = questionIndex.get() Questions.find questionnaireId: @questionnaire._id .map (question) -> if answers[question._id]? question.css = "answered" if question.index is activeIndex question.css += " active" question Template.questionnaireWizzard.events "click #back": (evt, tmpl) -> index = questionIndex.get() index = index-1 if index > 0 questionIndex.set index "click .jumpToQuestion": (evt) -> questionIndex.set @index diff --git a/app/lib/collections/answers.coffee b/app/lib/collections/answers.coffee index 61a0c50..2f64879 100644 --- a/app/lib/collections/answers.coffee +++ b/app/lib/collections/answers.coffee @@ -1,58 +1,60 @@ class @Answer constructor: (doc) -> _.extend this, doc @Answers = new Meteor.Collection("answers", transform: (doc) -> new Answer(doc) ) Answers.before.insert BeforeInsertTimestampHook Answers.before.update BeforeUpdateTimestampHook Answers.allow insert: (userId, doc) -> false update: (userId, doc, fieldNames, modifier) -> false remove: (userId, doc) -> false Meteor.methods "upsertAnswer": (answer) -> check(answer.visitId, String) visit = Visits.findOne _id: answer.visitId throw new Meteor.Error(403, "visit can't be found.") unless visit? + throw new Meteor.Error(403, "visit must be started first") unless visit.startedAt? + throw new Meteor.Error(403, "visit must be running, this visit ended already") unless !visit.endedAt? check(answer.patientId, String) patient = Patients.findOne _id: answer.patientId throw new Meteor.Error(403, "patient can't be found.") unless patient? throw new Meteor.Error(403, "patientId doesn't match visit.patientId") unless visit.patientId is patient._id throw new Meteor.Error(433, "you are not allowed to upsert answers") unless Roles.userIsInRole(@userId, ['admin']) or (Roles.userIsInRole(@userId, 'therapist') and patient.therapistId is @userId) check(answer.questionnaireId, String) questionnaire = Questionnaires.findOne _id: answer.questionnaireId throw new Meteor.Error(403, "questionnaire can't be found.") unless questionnaire? #TODO check if questionnaire is scheduled at visit check(answer.questionId, String) question = Questions.findOne _id: answer.questionId throw new Meteor.Error(403, "question can't be found.") unless question? throw new Meteor.Error(403, "question doesn't belong to questionnaire") unless question.questionnaireId is questionnaire._id if answer._id? a = Answers.findOne _.pick answer, 'questionnaireId', 'patientId', 'visitId', 'questionId', '_id' throw new Meteor.Error(403, "answer to update can't be found.") unless answer? Answers.update answer._id, $set: answer: answer.answer answer._id else answer = _.pick answer, 'questionnaireId', 'patientId', 'visitId', 'questionId', 'answer' _id = Answers.insert answer _id