diff --git a/assets/grid.png b/assets/grid.png new file mode 100644 index 0000000..12cfe2d Binary files /dev/null and b/assets/grid.png differ diff --git a/assets/horizontal.png b/assets/horizontal.png new file mode 100644 index 0000000..f1f6d9f Binary files /dev/null and b/assets/horizontal.png differ diff --git a/assets/vertical.png b/assets/vertical.png new file mode 100644 index 0000000..ec76bfb Binary files /dev/null and b/assets/vertical.png differ diff --git a/editor/question-ctrl.js b/editor/question-ctrl.js index fa7986b..1ddc1fa 100644 --- a/editor/question-ctrl.js +++ b/editor/question-ctrl.js @@ -15,11 +15,21 @@ angular.module('org.ekstep.question', ['org.ekstep.metadataform']) previewPlugin: 'org.ekstep.questionset.preview', questionPlugin: 'org.ekstep.question', questionsetPlugin: 'org.ekstep.questionset', - questionbankPlugin: 'org.ekstep.questionbank' + questionbankPlugin: 'org.ekstep.questionbank', + formElementId: '#questionMetaDataTemplate', + metadataFormName: 'questionMetaDataTemplate' }; $scope.questionData = {'questionMaxScore': 1}; $scope.questionData.isShuffleOption = false; $scope.questionData.isPartialScore = true; + $scope.templateIcons = []; + _.each($scope.templatesType, function(template, key){ + var templateIconName = template.toLowerCase(); + $scope.templateIcons.push({ + "icon": ecEditor.resolvePluginResource(instance.manifest.id, instance.manifest.ver, 'assets/'+templateIconName+'.png'), + "name": template + }); + }); $scope.questionData.templateType = $scope.templatesType[0]; $scope.questionMetaData = {}; @@ -32,11 +42,16 @@ angular.module('org.ekstep.question', ['org.ekstep.metadataform']) }); if (!ecEditor._.isEmpty(questionData)) { $scope.showQuestionForm(questionData); + //Check dom is ready then only play preview + angular.element(document).ready(function () { + setTimeout(function(){ $scope.setPreviewData(); }, 0); + }); } else { $scope.showTemplates(); } - EventBus.listeners['editor:form:success'] = undefined; - ecEditor.addEventListener('editor:form:success', $scope.saveMetaData); + + EventBus.listeners['editor:form:success'] = undefined; + ecEditor.addEventListener('editor:form:success', $scope.saveMetaData); } $scope.showTemplates = function() { $scope.templatesScreen = true; @@ -123,7 +138,6 @@ angular.module('org.ekstep.question', ['org.ekstep.metadataform']) questions.push(qObj); data[$scope._constants.questionsetPlugin][$scope._constants.questionPlugin] = questions; confData = {"contentBody": {}, "parentElement": true, "element": "#iframeArea"}; - document.getElementById("iframeArea").contentDocument.location.reload(true); var pluginInstances = ecEditor.getPluginInstances(); var previewInstance = _.find(pluginInstances, function (pi) { return pi.manifest.id === $scope._constants.previewPlugin @@ -153,14 +167,16 @@ angular.module('org.ekstep.question', ['org.ekstep.metadataform']) } else { var metaFormScope = $('#question-meta-form #content-meta-form').scope(); metaFormScope.isSubmit = false; - $scope.questionData.questionTitle = metaFormScope.contentMeta.name; - $scope.questionData.qcMedium = metaFormScope.contentMeta.medium; - $scope.questionData.qcLevel = metaFormScope.contentMeta.qlevel; - $scope.questionData.questionDesc = metaFormScope.contentMeta.description; - $scope.questionData.questionMaxScore = metaFormScope.contentMeta.max_score; - $scope.questionData.qcGrade = metaFormScope.contentMeta.gradeLevel; - $scope.questionData.concepts = metaFormScope.contentMeta.concepts; - $scope.questionData.topic = metaFormScope.contentMeta.topic; + for (var key in metaFormScope.contentMeta) { + if (metaFormScope.contentMeta.hasOwnProperty(key)) { + if (key == 'name') { + $scope.questionData['title'] = metaFormScope.contentMeta['name']; + } else { + $scope.questionData[key] = metaFormScope.contentMeta[key]; + } + } + } + $scope.questionMetadataScreen = false; } } @@ -168,27 +184,27 @@ angular.module('org.ekstep.question', ['org.ekstep.metadataform']) $scope.questionMetadataScreen = true; //comment because in edit question the question and question title are not if ($scope.category == 'FTB') { - $scope.questionData.questionTitle = _.isUndefined($scope.questionData.questionTitle) ? $scope.questionCreationFormData.question.text.replace(/\[\[.*?\]\]/g, '____') : $scope.questionData.questionTitle; - } else { - $scope.questionData.questionTitle = _.isUndefined($scope.questionData.questionTitle) ? $scope.questionCreationFormData.question.text : $scope.questionData.questionTitle; - } - $scope.questionData.questionTitle = $scope.extractHTML($scope.questionData.questionTitle); - $scope.questionMetaData.name = $scope.questionData.questionTitle; - $scope.questionMetaData.medium = $scope.questionData.qcMedium; - $scope.questionMetaData.level = $scope.questionData.qcLevel; - $scope.questionMetaData.description = $scope.questionData.questionDesc; - $scope.questionMetaData.max_score = $scope.questionData.questionMaxScore; - $scope.questionMetaData.gradeLevel = $scope.questionData.qcGrade; - $scope.questionMetaData.concepts = $scope.questionData.concepts; - $scope.questionMetaData.topic = $scope.questionData.topic; - $scope.questionMetaData.subject = $scope.questionData.subject; - $scope.questionMetaData.board = $scope.questionData.board; - if ($scope.questionMetaData.concepts) { - $scope.questionMetaData.conceptData = "(" + $scope.questionData.concepts.length + ") concepts selected"; - } - if ($scope.questionMetaData.topic) { - $scope.questionMetaData.topicData = "(" + $scope.questionData.topic.length + ") topics selected"; - } + $scope.questionData.title = _.isUndefined($scope.questionData.title) ? $scope.questionCreationFormData.question.text.replace(/\[\[.*?\]\]/g, '____') : $scope.questionData.title; + } else { + $scope.questionData.title = _.isUndefined($scope.questionData.title) ? $scope.questionCreationFormData.question.text : $scope.questionData.title; + } + $scope.questionData.title = $scope.extractHTML($scope.questionData.title); + + + for (var key in $scope.questionData) { + if ($scope.questionData.hasOwnProperty(key)) { + if (key == 'title') { + $scope.questionMetaData['name'] = $scope.questionData['title']; + } + $scope.questionMetaData[key] = $scope.questionData[key]; + } + } + if ($scope.questionMetaData.concepts) { + $scope.questionMetaData.conceptData = "(" + $scope.questionData.concepts.length + ") concepts selected"; + } + if ($scope.questionMetaData.topic) { + $scope.questionMetaData.topicData = "(" + $scope.questionData.topic.length + ") topics selected"; + } ecEditor.dispatchEvent('org.ekstep.editcontentmeta:showpopup', { action: 'question-meta-save', subType: 'questions', @@ -199,109 +215,121 @@ angular.module('org.ekstep.question', ['org.ekstep.metadataform']) metadata: $scope.questionMetaData }); } - $scope.sendMetaData = function () { - var formElement = $("#questionMetaDataTemplate").find("#content-meta-form"); + $scope.sendMetaData = function (newQuestionCreate) { + $scope.isNewQuestion = newQuestionCreate; + var formElement = $($scope._constants.formElementId).find("#content-meta-form"); var frmScope = formElement.scope(); - ecEditor.dispatchEvent("metadata:form:onsuccess", {target: '#questionMetaDataTemplate', form: frmScope.metaForm}); + ecEditor.dispatchEvent("metadata:form:onsuccess", {target: $scope._constants.formElementId, form: frmScope.metaForm}); }; $scope.saveMetaData = function (event, object) { - if(object.isValid){ - var metaDataObject = object.formData.metaData; - for (var property in object.formData.metaData) { - if (metaDataObject[property]) { - $scope.questionMetaData[property] = metaDataObject[property]; + if(object.formData.target && object.formData.target.tempalteName && (object.formData.target.tempalteName.toLowerCase() == $scope._constants.metadataFormName.toLowerCase())){ + if(object.isValid){ + var metaDataObject = object.formData.metaData; + for (var property in object.formData.metaData) { + if (metaDataObject[property]) { + $scope.questionMetaData[property] = metaDataObject[property]; + } } - } - var questionFormData = {}; - var data = {}; // TODO: You have to get this from Q.Unit plugin(getData()) - data.plugin = $scope.selectedTemplatePluginData.plugin; - data.data = $scope.questionCreationFormData; - var outRelations = []; - _.each($scope.questionMetaData.concepts, function(concept){ - outRelations.push({ - "endNodeId": concept.identifier, - "relationType": "associatedTo" - }) - }); - var metadataObj = $scope.questionMetaData; - metadataObj.category = $scope.category; - // TODO: questionCount should be sent from unit template controllers. Currently it is hardcoded to 1. - data.config = { "metadata": metadataObj, "max_time": 0, "max_score": $scope.questionData.questionMaxScore, "partial_scoring": $scope.questionData.isPartialScore, "layout": $scope.questionData.templateType, "isShuffleOption" : $scope.questionData.isShuffleOption, "questionCount": 1}; - data.media = $scope.questionCreationFormData.media; - questionFormData.data = data; - var metadata = { - "code": "NA", - "name": $scope.questionMetaData.name, - "title": $scope.questionMetaData.name, - "medium": $scope.questionMetaData.medium, - "max_score": $scope.questionData.questionMaxScore, - "gradeLevel": $scope.questionMetaData.gradeLevel, - "subject": $scope.questionMetaData.subject, - "board": $scope.questionMetaData.board, - "qlevel": $scope.questionMetaData.level, - "question": $scope.questionCreationFormData.question.text, - "isShuffleOption" : $scope.questionData.isShuffleOption, - "body": JSON.stringify(questionFormData), - "itemType": "UNIT", - "version": 2, - "category": $scope.category, - "description": $scope.questionMetaData.description, - "createdBy": window.context.user.id, - "channel": ecEditor.getContext('channel'), - "type": $scope.category.toLowerCase(), // backward compatibility - "template": "NA", // backward compatibility - "template_id": "NA", // backward compatibility - "topic": $scope.questionMetaData.topic, - "framework": ecEditor.getContext('framework') - }; - var dynamicOptions = [{"answer": true, "value": {"type": "text", "asset": "1"}}]; - var mtfoptions = [{ - "value": { - "type": "mixed", - "text": "इक", - "image": "", - "count": "", - "audio": "", - "resvalue": "इक", - "resindex": 0 - }, - "index": 0 - }]; - switch ($scope.category) { - case 'MCQ': - metadata.options = dynamicOptions; - break; - case 'FTB': - metadata.answer = dynamicOptions; - break; - case 'MTF': - metadata.lhs_options = mtfoptions; - metadata.rhs_options = mtfoptions; - break; - default: - metadata.options = dynamicOptions; - break; - } - $scope.qFormData = { - "request": { - "assessment_item": { - "objectType": "AssessmentItem", - "metadata": metadata, - "outRelations": outRelations + var questionFormData = {}; + var data = {}; // TODO: You have to get this from Q.Unit plugin(getData()) + data.plugin = $scope.selectedTemplatePluginData.plugin; + data.data = $scope.questionCreationFormData; + var outRelations = []; + _.each($scope.questionMetaData.concepts, function(concept){ + outRelations.push({ + "endNodeId": concept.identifier, + "relationType": "associatedTo" + }) + }); + var metadataObj = $scope.questionMetaData; + metadataObj.category = $scope.category; + // TODO: questionCount should be sent from unit template controllers. Currently it is hardcoded to 1. + data.config = { "metadata": metadataObj, "max_time": 0, "max_score": $scope.questionData.questionMaxScore, "partial_scoring": $scope.questionData.isPartialScore, "layout": $scope.questionData.templateType, "isShuffleOption" : $scope.questionData.isShuffleOption, "questionCount": 1}; + data.media = $scope.questionCreationFormData.media; + questionFormData.data = data; + var metadata = { + "code": "NA", + "isShuffleOption" : $scope.questionData.isShuffleOption, + "body": JSON.stringify(questionFormData), + "itemType": "UNIT", + "version": 2, + "category": $scope.category, + "description": $scope.questionMetaData.description, + "createdBy": window.context.user.id, + "channel": ecEditor.getContext('channel'), + "type": $scope.category.toLowerCase(), // backward compatibility + "template": "NA", // backward compatibility + "template_id": "NA", // backward compatibility + "framework": ecEditor.getContext('framework') + }; + for (var key in $scope.questionMetaData) { + if ($scope.questionMetaData.hasOwnProperty(key)) { + if (key == 'title') { + metadata['name'] = $scope.questionMetaData['title']; + } + if(key == 'level'){ + metadata['qlevel'] = $scope.questionMetaData['level']; + }else{ + metadata[key] = $scope.questionMetaData[key]; + } + } } + var dynamicOptions = [{"answer": true, "value": {"type": "text", "asset": "1"}}]; + var mtfoptions = [{ + "value": { + "type": "mixed", + "text": "इक", + "image": "", + "count": "", + "audio": "", + "resvalue": "इक", + "resindex": 0 + }, + "index": 0 + }]; + switch ($scope.category) { + case 'MCQ': + metadata.options = dynamicOptions; + break; + case 'FTB': + metadata.answer = dynamicOptions; + break; + case 'MTF': + metadata.lhs_options = mtfoptions; + metadata.rhs_options = mtfoptions; + break; + default: + metadata.options = dynamicOptions; + break; } - }; - /*Save data and get response and dispatch event with response to questionbank plugin*/ - $scope.saveQuestion($scope.assessmentId, $scope.qFormData); - } + $scope.qFormData = { + "request": { + "assessment_item": { + "objectType": "AssessmentItem", + "metadata": metadata, + "outRelations": outRelations + } + } + }; + /*Save data and get response and dispatch event with response to questionbank plugin*/ + $scope.saveQuestion($scope.assessmentId, $scope.qFormData); + } + } }; $scope.saveQuestion = function (assessmentId, data) { ecEditor.getService('assessment').saveQuestionV3(assessmentId, data, function (err, resp) { if (!err) { var qMetadata = $scope.qFormData.request.assessment_item.metadata; - qMetadata.identifier = resp.data.result.node_id; - ecEditor.dispatchEvent($scope._constants.questionbankPlugin + ':saveQuestion', qMetadata); - $scope.closeThisDialog(); + qMetadata.identifier = resp.data.result.node_id; + if ($scope.isNewQuestion) { + $scope.templatesScreen = true; + $scope.questionMetadataScreen = false; + delete $scope.questionData.title; + $scope.$safeApply(); + } else { + ecEditor.dispatchEvent($scope._constants.questionbankPlugin + ':saveQuestion', qMetadata); + $scope.closeThisDialog(); + } } else { ecEditor.dispatchEvent("org.ekstep.toaster:error", { title: 'Failed to save question...', @@ -318,14 +346,14 @@ angular.module('org.ekstep.question', ['org.ekstep.metadataform']) $scope.assessmentId = questionData.identifier; $scope.questionData = questionData1; $scope.questionCreationFormData = questionData1.data.data; - $scope.questionData.qcMedium = questionData1.data.config.metadata.medium; + $scope.questionData.medium = questionData1.data.config.metadata.medium; $scope.questionData.questionTitle = questionData.title; - $scope.questionData.qcLevel = questionData.qlevel; + $scope.questionData.level = questionData.qlevel; $scope.questionData.subject = questionData1.data.config.metadata.subject; $scope.questionData.board = questionData1.data.config.metadata.board; $scope.questionData.templateType = questionData1.data.config.layout; $scope.questionData.isPartialScore = questionData1.data.config.partial_scoring; - $scope.questionData.qcGrade = questionData1.data.config.metadata.gradeLevel; + $scope.questionData.gradeLevel = questionData1.data.config.metadata.gradeLevel; $scope.questionData.isShuffleOption = questionData1.data.config.isShuffleOption; $scope.category = questionData.category; if (questionData1.data.config.metadata.concepts) { @@ -339,7 +367,7 @@ angular.module('org.ekstep.question', ['org.ekstep.metadataform']) $scope.selectedConceptsData = questionData1.data.config.metadata.concepts; $scope.selectedTopicsData = questionData.topic; $scope.questionData.questionDesc = questionData1.data.config.metadata.description; - $scope.questionData.questionMaxScore = questionData1.data.config.metadata.max_score; + $scope.questionData.max_score = questionData1.data.config.metadata.max_score; $scope.conceptsCheck = true; $scope.topicsCheck = true; var pluginID = questionData1.data.plugin.id; @@ -362,6 +390,10 @@ angular.module('org.ekstep.question', ['org.ekstep.metadataform']) pluginInstance.renderForm(questionData1.data); $scope.$safeApply(); }; + $scope.changeLayout = function(templateType){ + $scope.questionData.templateType = templateType; + $scope.showPreview(); + } $scope.extractHTML = function(htmlElement) { var divElement= document.createElement('div'); divElement.innerHTML= htmlElement; @@ -398,4 +430,4 @@ angular.module('org.ekstep.question', ['org.ekstep.metadataform']) $scope.init(); }]); -//# sourceURL=questionCtrl.js \ No newline at end of file +//# sourceURL=questionCtrl.js diff --git a/editor/question.html b/editor/question.html index 808c82e..c18e51f 100644 --- a/editor/question.html +++ b/editor/question.html @@ -72,7 +72,7 @@