From 550133eca507132e7cb90c6dc2c3bb43c7ad9b00 Mon Sep 17 00:00:00 2001 From: Aaron Schmitz Date: Mon, 13 Aug 2012 15:24:14 -0500 Subject: [PATCH] Port the Excel export and survey logic file generation in EM to use the question objects. Add AJS tags to a bunch of code throughout the codebase that still needs porting Fix some issues in the question creation area of the backend. Numerous other bugfixes. --- .../controllers/admin/conditionsaction.php | 2 +- application/controllers/admin/database.php | 35 +++--- application/controllers/admin/dataentry.php | 2 +- application/controllers/admin/question.php | 17 ++- application/core/Survey_Common_Action.php | 2 +- application/helpers/common_helper.php | 6 +- .../helpers/expressions/em_manager_helper.php | 119 +++++------------- application/modules/CheckQuestion.php | 5 + application/modules/CommentCheckQuestion.php | 12 ++ application/modules/CommentListQuestion.php | 5 + application/modules/DisplayQuestion.php | 5 + .../modules/DualRadioArrayQuestion.php | 10 ++ application/modules/FileQuestion.php | 5 + application/modules/ListQuestion.php | 5 + .../modules/MultinumericalQuestion.php | 5 + application/modules/MultitextQuestion.php | 5 + application/modules/NumberArrayQuestion.php | 16 +++ application/modules/NumericalQuestion.php | 5 + application/modules/QuestionModule.php | 20 +++ application/modules/ShortTextQuestion.php | 5 + application/modules/TenRadioArrayQuestion.php | 5 + application/modules/TextArrayQuestion.php | 16 +++ application/modules/TextQuestion.php | 5 + .../survey/Question/editQuestion_view.php | 5 +- .../Question/questionJavascript_view.php | 112 ++++++----------- scripts/admin/admin_core.js | 17 ++- scripts/expressions/em_javascript.js | 11 +- scripts/jquery/lime-conditions-tabs.js | 2 +- 28 files changed, 247 insertions(+), 212 deletions(-) diff --git a/application/controllers/admin/conditionsaction.php b/application/controllers/admin/conditionsaction.php index 34d6232ce39..fe36d2aec8b 100644 --- a/application/controllers/admin/conditionsaction.php +++ b/application/controllers/admin/conditionsaction.php @@ -1112,7 +1112,7 @@ function index($subaction, $iSurveyID=null, $gid=null, $qid=null) { $javascriptpre .= "QFieldnames[$jn]='$cqn[3]';\n" ."Qcqids[$jn]='$cqn[1]';\n" - ."Qtypes[$jn]='$cqn[2]';\n"; + ."Qtypes[$jn]='$cqn[2]';\n"; //AJS $jn++; } } diff --git a/application/controllers/admin/database.php b/application/controllers/admin/database.php index 80dd1767eaa..17e92873d1f 100644 --- a/application/controllers/admin/database.php +++ b/application/controllers/admin/database.php @@ -548,17 +548,17 @@ function index($sa = null) LimeExpressionManager::RevertUpgradeConditionsToRelevance($surveyid); $cqr=Questions::model()->findByAttributes(array('qid'=>$qid)); - $oldtype=$cqr['type']; + $oldtid=$cqr['tid']; $oldgid=$cqr['gid']; // Remove invalid question attributes on saving - $q = objectizeQuestion(Yii::app()->request->getPost('type')); //AJS + $q = tidToQuestion(Yii::app()->request->getPost('type')); $qattributes=linkedAttributes($q); $criteria = new CDbCriteria; $criteria->compare('qid',$qid); - $validAttributes=$qattributes; - foreach ($validAttributes as $validAttribute) + + foreach ($qattributes as $validAttribute) { $criteria->compare('attribute', '<>'.$validAttribute['name']); } @@ -566,11 +566,8 @@ function index($sa = null) $aLanguages=array_merge(array(Survey::model()->findByPk($surveyid)->language),Survey::model()->findByPk($surveyid)->additionalLanguages); - //now save all valid attributes - $validAttributes=$qattributes[Yii::app()->request->getPost('type')]; - - foreach ($validAttributes as $validAttribute) + foreach ($qattributes as $validAttribute) { if ($validAttribute['i18n']) { @@ -633,34 +630,32 @@ function index($sa = null) } // These are the questions types that have no answers and therefore we delete the answer in that case - $q = objectizeQuestion(Yii::app()->request->getPost('type')); //AJS $qproperties=$q->questionProperties(); $iAnswerScales = $qproperties['answerscales']; $iSubquestionScales = $qproperties['subquestions']; + $options = $q->availableOptions(); // These are the questions types that have the other option therefore we set everything else to 'No Other' - if ((Yii::app()->request->getPost('type')!= "L") && (Yii::app()->request->getPost('type')!= "!") && (Yii::app()->request->getPost('type')!= "P") && (Yii::app()->request->getPost('type')!="M")) + if (!$options['other']) { $_POST['other']='N'; } // These are the questions types that have no validation - so zap it accordingly - if (Yii::app()->request->getPost('type')== "!" || Yii::app()->request->getPost('type')== "L" || Yii::app()->request->getPost('type')== "M" || Yii::app()->request->getPost('type')== "P" || - Yii::app()->request->getPost('type')== "F" || Yii::app()->request->getPost('type')== "H" || - Yii::app()->request->getPost('type')== "X" || Yii::app()->request->getPost('type')== "") + if (!$options['valid']) { $_POST['preg']=''; } // These are the questions types that have no mandatory property - so zap it accordingly - if (Yii::app()->request->getPost('type')== "X" || Yii::app()->request->getPost('type')== "|") + if (!$options['mandatory']) { $_POST['mandatory']='N'; } - if ($oldtype != Yii::app()->request->getPost('type')) + if ($oldtid != Yii::app()->request->getPost('type')) { // TMSW Conditions->Relevance: Do similar check via EM, but do allow such a change since will be easier to modify relevance //Make sure there are no conditions based on this question, since we are changing the type @@ -712,9 +707,10 @@ function index($sa = null) if (isset($qlang) && $qlang != "") { // ToDo: Sanitize the POST variables ! - + $type = Question_types::model()->findByPk(Yii::app()->request->getPost('type')); //AJS $udata = array( - 'type' => Yii::app()->request->getPost('type'), + 'tid' => Yii::app()->request->getPost('type'), + 'type' => $type['legacy'], 'title' => Yii::app()->request->getPost('title'), 'question' => Yii::app()->request->getPost('question_'.$qlang), 'preg' => Yii::app()->request->getPost('preg'), @@ -771,9 +767,10 @@ function index($sa = null) // then change the cfieldname accordingly fixMovedQuestionConditions($qid, $oldgid, $gid); } - if ($oldtype != Yii::app()->request->getPost('type')) + if ($oldtid != Yii::app()->request->getPost('type')) { - Questions::model()->updateAll(array('type'=>Yii::app()->request->getPost('type')), 'parent_qid=:qid', array(':qid'=>$qid)); + $type = Question_types::model()->findByPk(Yii::app()->request->getPost('type')); //AJS + Questions::model()->updateAll(array('tid'=>Yii::app()->request->getPost('type'), 'type'=>$type['legacy']), 'parent_qid=:qid', array(':qid'=>$qid)); } Answers::model()->deleteAllByAttributes(array('qid' => $qid), 'scale_id >= :scale_id', array(':scale_id' => $iAnswerScales)); diff --git a/application/controllers/admin/dataentry.php b/application/controllers/admin/dataentry.php index 42b072fd62a..591bea18a25 100644 --- a/application/controllers/admin/dataentry.php +++ b/application/controllers/admin/dataentry.php @@ -1305,7 +1305,7 @@ public function view($surveyid, $lang=NULL) $cdata['hh'] = $hh; //$aDataentryoutput .= "\t".$blang->gT("Help about this question")."\n"; } - switch($deqrow['type']) + switch($deqrow['type']) //AJS { case "Q": //MULTIPLE SHORT TEXT case "K": diff --git a/application/controllers/admin/question.php b/application/controllers/admin/question.php index 7acd45bbb0d..edb29e9f2fd 100644 --- a/application/controllers/admin/question.php +++ b/application/controllers/admin/question.php @@ -694,7 +694,7 @@ public function index($sa, $surveyid, $gid, $qid=null) 'question_order' => $esrow['question_order'], 'other' => $esrow['other'], 'mandatory' => $esrow['mandatory'], - 'type' => $esrow['type'], + 'type' => $esrow['type'], //AJS 'title' => $esrow['title'], 'preg' => $esrow['preg'], 'question' => $esrow['question'], @@ -714,7 +714,7 @@ public function index($sa, $surveyid, $gid, $qid=null) 'qid' => $qid, 'sid' => $surveyid, 'gid' => $gid, - 'type' => $basesettings['type'], + 'type' => $basesettings['type'], //AJS 'title' => $basesettings['title'], 'question' => $basesettings['question'], 'preg' => $basesettings['preg'], @@ -742,14 +742,19 @@ public function index($sa, $surveyid, $gid, $qid=null) $types = Question_types::model()->with('question_type_groups')->findAll(array('order' => 'question_type_groups.order, t.order')); $qDescToCode = 'qDescToCode = {'; + $qScreenshots = 'qScreenshots = {'; + $selections = array(); foreach ($types as $type) { $q = createQuestion($type['class']); $props = $q->questionProperties(); + $screenshots = $q->screenshotCount(); $qDescToCode .= " '{$props['description']}' : '{$type['class']}', \n"; $typegroups[$type->question_type_groups['name']][] = $type; + $qScreenshots .= " '{$type['class']}' : '{$screenshots}', \n"; + $selections[$type['class']] = $q->availableOptions(); } - $aData['qTypeOutput'] = "$qDescToCode 'null':'null' };"; + $aData['qTypeOutput'] = "$qDescToCode 'null':'null' };$qScreenshots 'null':'null' };"; $aData['qTypeGroups'] = $typegroups; if (!$adding) @@ -766,7 +771,7 @@ public function index($sa, $surveyid, $gid, $qid=null) $eqrow['title'] = ''; $eqrow['question'] = ''; $eqrow['help'] = ''; - $eqrow['tid'] = 25; //AJS - WHY IS THIS HARDCODED? + $eqrow['class'] = 'LongText'; //AJS - WHY IS THIS HARDCODED? $eqrow['lid'] = 0; $eqrow['lid1'] = 0; $eqrow['gid'] = $gid; @@ -821,7 +826,7 @@ public function index($sa, $surveyid, $gid, $qid=null) } $aViewUrls['editQuestion_view'][] = $aData; - $aViewUrls['questionJavascript_view'][] = array('type' => $eqrow['type']); + $aViewUrls['questionJavascript_view'][] = array('class' => $eqrow['class'], 'selections' => $selections); } else include('accessDenied.php'); @@ -912,7 +917,7 @@ public function delete($surveyid, $gid, $qid) */ public function ajaxquestionattributes() { - $q = objectizeQuestion($_POST['question_type'], array('surveyid' => (int) $_POST['sid'], 'id' => (int) $_POST['qid'])); //AJS + $q = createQuestion($_POST['class'], array('surveyid' => (int) $_POST['sid'], 'id' => (int) $_POST['qid'])); $aLanguages = array_merge(array(Survey::model()->findByPk($q->surveyid)->language), Survey::model()->findByPk($q->surveyid)->additionalLanguages); $thissurvey = getSurveyInfo($q->surveyid); diff --git a/application/core/Survey_Common_Action.php b/application/core/Survey_Common_Action.php index 9ecc83c09dc..f32f78b1ab8 100644 --- a/application/core/Survey_Common_Action.php +++ b/application/core/Survey_Common_Action.php @@ -351,7 +351,7 @@ function _questionbar($iSurveyID, $gid, $qid, $action = null) foreach ($qrresult as $qrrow) { - $q = createQuestion($qrrow->question_types['class'], array('surveyid'=>$iSurveyId, 'id'=>$qid)); + $q = createQuestion($qrrow->question_types['class'], array('surveyid'=>$iSurveyID, 'id'=>$qid)); $qrrow = $qrrow->attributes; if (hasSurveyPermission($iSurveyID, 'surveycontent', 'read')) { diff --git a/application/helpers/common_helper.php b/application/helpers/common_helper.php index 16e963d9e64..73389f98f8b 100644 --- a/application/helpers/common_helper.php +++ b/application/helpers/common_helper.php @@ -4224,9 +4224,9 @@ function reverseTranslateFieldNames($iOldSID,$iNewSID,$aGIDReplacements,$aQIDRep if ($q->id!=null) { $aFieldMappings[$sFieldname]=$iOldSID.'X'.$aGIDReplacements[$q->gid].'X'.$aQIDReplacements[$q->id].$q->aid; - if ($pos=strrpos($sFieldname, 'X'.$q->id.'#')) + if (isset($q->scale)) { - $aFieldMappings[$sFieldname].= substr($sFieldname,$pos+strlen($q->id)+1); //AJS + $aFieldMappings[$sFieldname].= '#' . $q->scale; } // now also add a shortened field mapping which is needed for certain kind of condition mappings $aFieldMappings[$q->surveyid.'X'.$q->gid.'X'.$q->id]=$iOldSID.'X'.$aGIDReplacements[$q->gid].'X'.$aQIDReplacements[$q->id]; @@ -4949,7 +4949,7 @@ function getFullResponseTable($iSurveyID, $iResponseID, $sLanguageCode, $bHonorC if ($oldqid !== $q->id) { $oldqid = $q->id; - if (isset($fname['subquestion']) || isset($fname['subquestion1']) || isset($fname['subquestion2'])) //AJS + if (isset($q->sq) || isset($q->sq1) || isset($q->sq2)) { $aResultTable['qid_'.$q->surveyid.'X'.$q->gid.'X'.$q->id]=array($q->text,'',''); } diff --git a/application/helpers/expressions/em_manager_helper.php b/application/helpers/expressions/em_manager_helper.php index b931b38cb68..8f4bdff89b1 100644 --- a/application/helpers/expressions/em_manager_helper.php +++ b/application/helpers/expressions/em_manager_helper.php @@ -2599,13 +2599,9 @@ private function setVariableAndTokenMappingsForExpressionManager($surveyid,$forc . "','rowdivid':'" . (is_null($rowdivid) ? '' : $rowdivid) . "','onlynum':'" . ($onlynum ? '1' : '') . "','gseq':" . $q->groupcount - .$ansList; - - if ($type == 'M' || $type == 'P') - { - $this->varNameAttr[$jsVarName] .= ",'question':'" . htmlspecialchars(preg_replace('/[[:space:]]/',' ',$question),ENT_QUOTES) . "'"; - } - $this->varNameAttr[$jsVarName] .= "}"; + . ",'question':'" . htmlspecialchars(preg_replace('/[[:space:]]/',' ',$question),ENT_QUOTES) . "'" + . $ansList + . "}"; } $this->q2subqInfo = $q2subqInfo; @@ -2649,7 +2645,6 @@ private function setVariableAndTokenMappingsForExpressionManager($surveyid,$forc $blankVal = array( 'code'=>'', - 'type'=>'', 'jsName_on'=>'', 'jsName'=>'', 'readWrite'=>'N', @@ -2677,7 +2672,6 @@ private function setVariableAndTokenMappingsForExpressionManager($surveyid,$forc 'qcode'=>'this', 'qseq'=>'', 'gseq'=>'', - 'type'=>'', 'sgqa'=>'', 'rowdivid'=>'', 'ansList'=>'', @@ -2980,7 +2974,6 @@ private function _ProcessSubQRelevance($eqn,$questionNum=NULL,$rowdivid=NULL, $t 'relevancejs' => $relevanceJS, 'relevanceVars' => $relevanceVars, 'rowdivid' => $rowdivid, - 'type'=>$type, 'q' => $q, 'sgqa'=>$sgqa, 'hasErrors'=>$hasErrors, @@ -4727,7 +4720,7 @@ function _ValidateQuestion($questionSeq) // Store the result of the Equation in the SESSION $_SESSION[$LEM->sessid][$sgqa] = $result; $_update = array( - 'q'=> new EquationQuestion, + 'q'=>new EquationQuestion, 'value'=>$result, ); $updatedValues[$sgqa] = $_update; @@ -5740,19 +5733,19 @@ static function setTempVars($vars) static function UnitTestProcessStringContainingExpressions() { $vars = array( - 'name' => array('sgqa'=>'name', 'code'=>'Peter', 'jsName'=>'java61764X1X1', 'readWrite'=>'N', 'type'=>'X', 'question'=>'What is your first/given name?', 'qseq'=>10, 'gseq'=>1), - 'surname' => array('sgqa'=>'surname', 'code'=>'Smith', 'jsName'=>'java61764X1X1', 'readWrite'=>'Y', 'type'=>'X', 'question'=>'What is your last/surname?', 'qseq'=>20, 'gseq'=>1), - 'age' => array('sgqa'=>'age', 'code'=>45, 'jsName'=>'java61764X1X2', 'readWrite'=>'Y', 'type'=>'X', 'question'=>'How old are you?', 'qseq'=>30, 'gseq'=>2), - 'numKids' => array('sgqa'=>'numKids', 'code'=>2, 'jsName'=>'java61764X1X3', 'readWrite'=>'Y', 'type'=>'X', 'question'=>'How many kids do you have?', 'relevance'=>'1', 'qid'=>'40','qseq'=>40, 'gseq'=>2), - 'numPets' => array('sgqa'=>'numPets', 'code'=>1, 'jsName'=>'java61764X1X4', 'readWrite'=>'Y', 'type'=>'X','question'=>'How many pets do you have?', 'qseq'=>50, 'gseq'=>2), - 'gender' => array('sgqa'=>'gender', 'code'=>'M', 'jsName'=>'java61764X1X5', 'readWrite'=>'Y', 'type'=>'X', 'shown'=>'Male','question'=>'What is your gender (male/female)?', 'qseq'=>110, 'gseq'=>2), - 'notSetYet' => array('sgqa'=>'notSetYet', 'code'=>'?', 'jsName'=>'java61764X3X6', 'readWrite'=>'Y', 'type'=>'X', 'shown'=>'Unknown','question'=>'Who will win the next election?', 'qseq'=>200, 'gseq'=>3), + 'name' => array('sgqa'=>'name', 'code'=>'Peter', 'jsName'=>'java61764X1X1', 'readWrite'=>'N', 'q'=>new EquationQuestion, 'question'=>'What is your first/given name?', 'qseq'=>10, 'gseq'=>1), + 'surname' => array('sgqa'=>'surname', 'code'=>'Smith', 'jsName'=>'java61764X1X1', 'readWrite'=>'Y', 'q'=>new EquationQuestion, 'question'=>'What is your last/surname?', 'qseq'=>20, 'gseq'=>1), + 'age' => array('sgqa'=>'age', 'code'=>45, 'jsName'=>'java61764X1X2', 'readWrite'=>'Y', 'q'=>new EquationQuestion, 'question'=>'How old are you?', 'qseq'=>30, 'gseq'=>2), + 'numKids' => array('sgqa'=>'numKids', 'code'=>2, 'jsName'=>'java61764X1X3', 'readWrite'=>'Y', 'q'=>new EquationQuestion, 'question'=>'How many kids do you have?', 'relevance'=>'1', 'qid'=>'40','qseq'=>40, 'gseq'=>2), + 'numPets' => array('sgqa'=>'numPets', 'code'=>1, 'jsName'=>'java61764X1X4', 'readWrite'=>'Y', 'q'=>new EquationQuestion,'question'=>'How many pets do you have?', 'qseq'=>50, 'gseq'=>2), + 'gender' => array('sgqa'=>'gender', 'code'=>'M', 'jsName'=>'java61764X1X5', 'readWrite'=>'Y', 'q'=>new EquationQuestion, 'shown'=>'Male','question'=>'What is your gender (male/female)?', 'qseq'=>110, 'gseq'=>2), + 'notSetYet' => array('sgqa'=>'notSetYet', 'code'=>'?', 'jsName'=>'java61764X3X6', 'readWrite'=>'Y', 'q'=>new EquationQuestion, 'shown'=>'Unknown','question'=>'Who will win the next election?', 'qseq'=>200, 'gseq'=>3), // Constants - '61764X1X1' => array('sgqa'=>'61764X1X1', 'code'=> '', 'jsName'=>'', 'readWrite'=>'N', 'type'=>'X', 'qseq'=>70, 'gseq'=>2), - '61764X1X2' => array('sgqa'=>'61764X1X2', 'code'=> 45, 'jsName'=>'', 'readWrite'=>'N', 'type'=>'X', 'qseq'=>80, 'gseq'=>2), - '61764X1X3' => array('sgqa'=>'61764X1X3', 'code'=> 2, 'jsName'=>'', 'readWrite'=>'N', 'type'=>'X', 'qseq'=>15, 'gseq'=>1), - '61764X1X4' => array('sgqa'=>'61764X1X4', 'code'=> 1, 'jsName'=>'', 'readWrite'=>'N', 'type'=>'X', 'qseq'=>100, 'gseq'=>2), - 'TOKEN:ATTRIBUTE_1' => array('code'=> 'worker', 'jsName'=>'', 'readWrite'=>'N', 'type'=>'X'), + '61764X1X1' => array('sgqa'=>'61764X1X1', 'code'=> '', 'jsName'=>'', 'readWrite'=>'N', 'q'=>new EquationQuestion, 'qseq'=>70, 'gseq'=>2), + '61764X1X2' => array('sgqa'=>'61764X1X2', 'code'=> 45, 'jsName'=>'', 'readWrite'=>'N', 'q'=>new EquationQuestion, 'qseq'=>80, 'gseq'=>2), + '61764X1X3' => array('sgqa'=>'61764X1X3', 'code'=> 2, 'jsName'=>'', 'readWrite'=>'N', 'q'=>new EquationQuestion, 'qseq'=>15, 'gseq'=>1), + '61764X1X4' => array('sgqa'=>'61764X1X4', 'code'=> 1, 'jsName'=>'', 'readWrite'=>'N', 'q'=>new EquationQuestion, 'qseq'=>100, 'gseq'=>2), + 'TOKEN:ATTRIBUTE_1' => array('code'=> 'worker', 'jsName'=>'', 'readWrite'=>'N', 'q'=>new EquationQuestion), ); $tests = <<knownVars[$sgqa]['qcode'] == $rootVarName) { continue; // so don't show the main question as a sub-question too } - $rowdivid=$sgqa; - $varName=$LEM->knownVars[$sgqa]['qcode']; - switch ($qStatus['info']['type']) + + $rowdivid=$q->getExportRowDivID(); + $varName=$q->getExportVarName(); + if (isset($sawThis[$q->id . '~' . $rowdivid]) || is_null($rowdivid)) { - case '1': - if (preg_match('/#1$/',$sgqa)) { - $rowdivid = NULL; // so that doesn't show same message for second scale - } - else { - $rowdivid = substr($sgqa,0,-2); // strip suffix - $varName = substr($LEM->knownVars[$sgqa]['qcode'],0,-2); - } - break; - case 'P': - if (preg_match('/comment$/',$sgqa)) { - $rowdivid = NULL; - } - break; - case ':': - case ';': - $_rowdivid = $LEM->knownVars[$sgqa]['rowdivid']; - if (isset($sawThis[$qid . '~' . $_rowdivid])) { - $rowdivid = NULL; // so don't show again - } - else { - $sawThis[$qid . '~' . $_rowdivid] = true; - $rowdivid = $_rowdivid; - $sgqa_len = strlen($sid . 'X'. $gid . 'X' . $qid); - $varName = $rootVarName . '_' . substr($_rowdivid,$sgqa_len); - } - } - if (is_null($rowdivid)) { continue; } + $sawThis[$qid . '~' . $rowdivid] = true; + ++$i; $subQeqn = ' '; if (isset($LEM->subQrelInfo[$qid][$rowdivid])) @@ -7079,7 +7046,7 @@ static public function ShowSurveyLogicFile($sid, $gid=NULL, $qid=NULL,$LEMdebugL $subQeqn = ''; $rowdivid = $sgqas[0] . $ansInfo[1]; - if ($qStatus['info']['type'] == 'R') + if ($q->includeRanks()) { $rowdivid = $LEM->sid . 'X' . $gid . 'X' . $qid . $ansInfo[1]; } @@ -7374,6 +7341,7 @@ static public function &ExcelSurveyExport($sid) $gseq = $qStatus['info']['gseq']; $gid = $qStatus['info']['gid']; $qid = $qStatus['info']['qid']; + $q = $qStatus['info']['q']; ////// // SHOW GROUP-LEVEL INFO @@ -7463,7 +7431,7 @@ static public function &ExcelSurveyExport($sid) $row['class'] = 'Q'; $qclass = substr(get_class($q),0,-8); - $row['type/scale'] = $class; + $row['type/scale'] = $qclass; $row['name'] = $rootVarName; $row['relevance'] = $relevanceEqn; $row['text'] = $qtext; @@ -7486,42 +7454,13 @@ static public function &ExcelSurveyExport($sid) if ($LEM->knownVars[$sgqa]['qcode'] == $rootVarName) { continue; // so don't show the main question as a sub-question too } - $rowdivid=$sgqa; - $varName=$LEM->knownVars[$sgqa]['qcode']; - - switch ($qStatus['info']['type']) + $rowdivid=$q->getExportRowDivID(); + $varName=$q->getExportVarName(); + if (isset($sawThis[$q->id . '~' . $rowdivid]) || is_null($rowdivid)) { - case '1': - if (preg_match('/#1$/',$sgqa)) { - $rowdivid = NULL; // so that doesn't show same message for second scale - } - else { - $rowdivid = substr($sgqa,0,-2); // strip suffix - $varName = substr($LEM->knownVars[$sgqa]['qcode'],0,-2); - } - break; - case 'P': - if (preg_match('/comment$/',$sgqa)) { - $rowdivid = NULL; - } - break; - case ':': - case ';': - $_rowdivid = $LEM->knownVars[$sgqa]['rowdivid']; - if (isset($sawThis[$qid . '~' . $_rowdivid])) { - $rowdivid = NULL; // so don't show again - } - else { - $sawThis[$qid . '~' . $_rowdivid] = true; - $rowdivid = $_rowdivid; - $sgqa_len = strlen($sid . 'X'. $gid . 'X' . $qid); - $varName = $rootVarName . '_' . substr($_rowdivid,$sgqa_len); - } - break; - } - if (is_null($rowdivid)) { continue; } + $sawThis[$qid . '~' . $rowdivid] = true; $sgqaInfo = $LEM->knownVars[$sgqa]; $subqText = $sgqaInfo['subqtext']; diff --git a/application/modules/CheckQuestion.php b/application/modules/CheckQuestion.php index 1f46995abe6..1dcfd1eb594 100644 --- a/application/modules/CheckQuestion.php +++ b/application/modules/CheckQuestion.php @@ -645,6 +645,11 @@ public function anyUnanswered($relevantSQs, $unansweredSQs) return count($relevantSQs) > 0 && (count($relevantSQs) == count($unansweredSQs)); } + public function availableOptions() + { + return array('other' => true, 'valid' => false, 'mandatory' => true); + } + public function availableAttributes($attr = false) { $attrs=array("array_filter","array_filter_exclude","array_filter_style","assessment_value","display_columns","em_validation_q","em_validation_q_tip","exclude_all_others","exclude_all_others_auto","statistics_showgraph","hide_tip","hidden","max_answers","min_answers","other_numbers_only","other_replace_text","page_break","public_statistics","random_order","parent_order","scale_export","random_group"); diff --git a/application/modules/CommentCheckQuestion.php b/application/modules/CommentCheckQuestion.php index 53b189ef4d4..db6d366af53 100644 --- a/application/modules/CommentCheckQuestion.php +++ b/application/modules/CommentCheckQuestion.php @@ -271,6 +271,18 @@ public function getRowDivID() } } + public function getExportRowDivID() + { + if (preg_match('/comment$/',$this->fieldname)) + { + return NULL; + } + else + { + return $this->fieldname; + } + } + public function getAnswerCountSQ($sgqaNaming, $sq, $min = true) { if (!preg_match('/comment$/',$sq['varName'])) { diff --git a/application/modules/CommentListQuestion.php b/application/modules/CommentListQuestion.php index be88733fb40..92c8f367894 100644 --- a/application/modules/CommentListQuestion.php +++ b/application/modules/CommentListQuestion.php @@ -334,6 +334,11 @@ public function mandatoryViolation($relevantSQs, $unansweredSQs, $subsqs, $sgqas return false; } + public function availableOptions() + { + return array('other' => false, 'valid' => false, 'mandatory' => true); + } + public function availableAttributes($attr = false) { $attrs=array("alphasort","statistics_showgraph","statistics_graphtype","hide_tip","hidden","page_break","public_statistics","random_order","parent_order","use_dropdown","scale_export","random_group"); diff --git a/application/modules/DisplayQuestion.php b/application/modules/DisplayQuestion.php index fff90aec060..20e12f6fa0b 100644 --- a/application/modules/DisplayQuestion.php +++ b/application/modules/DisplayQuestion.php @@ -31,6 +31,11 @@ public function mandatoryViolation($relevantSQs, $unansweredSQs, $subsqs, $sgqas return false; } + public function availableOptions() + { + return array('other' => false, 'valid' => false, 'mandatory' => false); + } + public function availableAttributes($attr = false) { $attrs=array("statistics_showgraph","statistics_graphtype","hide_tip","hidden","page_break","time_limit","time_limit_action","time_limit_disable_next","time_limit_disable_prev","time_limit_countdown_message","time_limit_timer_style","time_limit_message_delay","time_limit_message","time_limit_message_style","time_limit_warning","time_limit_warning_display_time","time_limit_warning_message","time_limit_warning_style","time_limit_warning_2","time_limit_warning_2_display_time","time_limit_warning_2_message","time_limit_warning_2_style","random_group"); diff --git a/application/modules/DualRadioArrayQuestion.php b/application/modules/DualRadioArrayQuestion.php index 7feacd4d361..c1a52496c2d 100644 --- a/application/modules/DualRadioArrayQuestion.php +++ b/application/modules/DualRadioArrayQuestion.php @@ -695,6 +695,11 @@ public function getVarName() return $this->title . '_' . $this->aid . '_' . $this->scale; } + public function getExportVarName() + { + return $this->title . '_' . $this->aid; + } + public function getQuestion() { return $this->sq . '[' . $this->scalename . ']'; @@ -705,6 +710,11 @@ public function getRowDivID() return substr($this->fieldname,0,-2); } + public function getExportRowDivID() + { + return substr($this->fieldname, 0, -2); + } + public function getAnswerCountSQ($sgqaNaming, $sq, $min = true) { if (substr($sq['varName'],-1,1) == '0') diff --git a/application/modules/FileQuestion.php b/application/modules/FileQuestion.php index 3afa63bed17..5ab57712916 100644 --- a/application/modules/FileQuestion.php +++ b/application/modules/FileQuestion.php @@ -363,6 +363,11 @@ public function generateSQInfo($ansArray) )); } + public function availableOptions() + { + return array('other' => false, 'valid' => false, 'mandatory' => false); + } + public function availableAttributes($attr = false) { $attrs=array("statistics_showgraph","statistics_graphtype","hide_tip","hidden","page_break","show_title","show_comment","max_filesize","max_num_of_files","min_num_of_files","allowed_filetypes","random_group"); diff --git a/application/modules/ListQuestion.php b/application/modules/ListQuestion.php index 8a51429e083..6cc5912689b 100644 --- a/application/modules/ListQuestion.php +++ b/application/modules/ListQuestion.php @@ -657,6 +657,11 @@ public function getAdditionalValParts() return $valParts; } + public function availableOptions() + { + return array('other' => true, 'valid' => false, 'mandatory' => true); + } + public function availableAttributes($attr = false) { $attrs=array("alphasort","array_filter","array_filter_exclude","array_filter_style","display_columns","statistics_showgraph","statistics_graphtype","hide_tip","hidden","other_comment_mandatory","other_numbers_only","other_replace_text","page_break","public_statistics","random_order","parent_order","scale_export","random_group","time_limit","time_limit_action","time_limit_disable_next","time_limit_disable_prev","time_limit_countdown_message","time_limit_timer_style","time_limit_message_delay","time_limit_message","time_limit_message_style","time_limit_warning","time_limit_warning_display_time","time_limit_warning_message","time_limit_warning_style","time_limit_warning_2","time_limit_warning_2_display_time","time_limit_warning_2_message","time_limit_warning_2_style"); diff --git a/application/modules/MultinumericalQuestion.php b/application/modules/MultinumericalQuestion.php index 7f8e4fa7fec..72530e1d2a7 100644 --- a/application/modules/MultinumericalQuestion.php +++ b/application/modules/MultinumericalQuestion.php @@ -502,6 +502,11 @@ public function includeRelevanceStatus() return true; } + public function availableOptions() + { + return array('other' => false, 'valid' => true, 'mandatory' => true); + } + public function availableAttributes($attr = false) { $attrs=array("array_filter","array_filter_exclude","array_filter_style","equals_num_value","em_validation_q","em_validation_q_tip","em_validation_sq","em_validation_sq_tip","exclude_all_others","statistics_showgraph","statistics_graphtype","hide_tip","hidden","max_answers","max_num_value","max_num_value_n","maximum_chars","min_answers","min_num_value","min_num_value_n","page_break","prefix","public_statistics","random_order","parent_order","slider_layout","slider_min","slider_max","slider_accuracy","slider_default","slider_middlestart","slider_showminmax","slider_separator","suffix","text_input_width","random_group","value_range_allows_missing"); diff --git a/application/modules/MultitextQuestion.php b/application/modules/MultitextQuestion.php index 6e236003bbb..1be32a17b6e 100644 --- a/application/modules/MultitextQuestion.php +++ b/application/modules/MultitextQuestion.php @@ -312,6 +312,11 @@ public function includeRelevanceStatus() return true; } + public function availableOptions() + { + return array('other' => false, 'valid' => true, 'mandatory' => true); + } + public function availableAttributes($attr = false) { $attrs=array("array_filter","array_filter_exclude","array_filter_style","display_rows","em_validation_q","em_validation_q_tip","em_validation_sq","em_validation_sq_tip","exclude_all_others","statistics_showgraph","statistics_graphtype","hide_tip","hidden","max_answers","maximum_chars","min_answers","numbers_only","page_break","prefix","random_order","parent_order","suffix","text_input_width","random_group"); diff --git a/application/modules/NumberArrayQuestion.php b/application/modules/NumberArrayQuestion.php index d8327ba622b..cb3200b593a 100644 --- a/application/modules/NumberArrayQuestion.php +++ b/application/modules/NumberArrayQuestion.php @@ -539,6 +539,12 @@ public function getSqsuffix() return '_' . substr($this->aid,0,strpos($this->aid,'_')); } + public function getExportVarName() + { + $sgqa_len = strlen($this->surveyid . 'X'. $this->gid . 'X' . $this->id); + return $this->title . '_' . substr($this->getRowDivID(),$sgqa_len); + } + public function getQuestion() { return $this->sq1 . '[' . $this->sq2 . ']'; @@ -549,6 +555,11 @@ public function getRowDivID() return substr($this->fieldname,0,strpos($this->fieldname,'_')); } + public function getExportRowDivID() + { + return $this->getRowDivID(); + } + public function getArrayFilterNames($sgq, $subqs, $qans, $sqsuffix, $equal = true) { $fsqs = array(); @@ -671,6 +682,11 @@ public function mandatoryViolation($relevantSQs, $unansweredSQs, $subsqs, $sgqas return false; } + public function availableOptions() + { + return array('other' => false, 'valid' => true, 'mandatory' => true); + } + public function availableAttributes($attr = false) { $attrs=array("answer_width","repeat_headings","array_filter","array_filter_exclude","array_filter_style","em_validation_q","em_validation_q_tip","em_validation_sq","em_validation_sq_tip","statistics_showgraph","statistics_graphtype","hide_tip","hidden","max_answers","maximum_chars","min_answers","multiflexible_max","multiflexible_min","multiflexible_step","multiflexible_checkbox","reverse","input_boxes","page_break","public_statistics","random_order","parent_order","scale_export","random_group"); diff --git a/application/modules/NumericalQuestion.php b/application/modules/NumericalQuestion.php index e686177ed65..a562e2e7959 100644 --- a/application/modules/NumericalQuestion.php +++ b/application/modules/NumericalQuestion.php @@ -183,6 +183,11 @@ public function getAdditionalValParts() return $valParts; } + public function availableOptions() + { + return array('other' => false, 'valid' => true, 'mandatory' => true); + } + public function availableAttributes($attr = false) { $attrs=array("em_validation_q","em_validation_q_tip","em_validation_sq","em_validation_sq_tip","statistics_showgraph","statistics_graphtype","hide_tip","hidden","max_num_value_n","maximum_chars","min_num_value_n","num_value_int_only","page_break","prefix","public_statistics","suffix","text_input_width","random_group"); diff --git a/application/modules/QuestionModule.php b/application/modules/QuestionModule.php index 0b12a0190e7..1693425684e 100644 --- a/application/modules/QuestionModule.php +++ b/application/modules/QuestionModule.php @@ -318,6 +318,11 @@ public function getVarName() return $this->title . ($this->aid != '' ? '_' . $this->aid : ''); } + public function getExportVarName() + { + return $this->getVarName(); + } + public function getQuestion() { return $this->text; @@ -328,6 +333,11 @@ public function getRowDivID() return null; } + public function getExportRowDivID() + { + return $this->fieldname; + } + public function generateQuestionInfo() { if (!is_null($this->getRowDivID()) || (isset($this->preg) && trim($this->preg) != '')) @@ -470,6 +480,16 @@ public function mandatoryViolation($relevantSQs, $unansweredSQs, $subsqs, $sgqas return $this->anyUnanswered($relevantSQs, $unansweredSQs); } + public function screenshotCount() + { + return 1; + } + + public function availableOptions() + { + return array('other' => false, 'valid' => false, 'mandatory' => true); + } + abstract public function availableAttributes($attr = false); abstract public function questionProperties($prop = false); } diff --git a/application/modules/ShortTextQuestion.php b/application/modules/ShortTextQuestion.php index a13215612d3..3fdd0534d5b 100644 --- a/application/modules/ShortTextQuestion.php +++ b/application/modules/ShortTextQuestion.php @@ -221,6 +221,11 @@ public function onlyNumeric() return array_key_exists('numbers_only', $attributes) && $attributes['numbers_only'] == 1; } + public function screenshotCount() + { + return 2; + } + public function availableAttributes($attr = false) { $attrs=array("display_rows","em_validation_q","em_validation_q_tip","em_validation_sq","em_validation_sq_tip","location_city","location_state","location_postal","location_country","statistics_showmap","statistics_showgraph","statistics_graphtype","location_mapservice","location_mapwidth","location_mapheight","location_nodefaultfromip","location_defaultcoordinates","location_mapzoom","hide_tip","hidden","maximum_chars","numbers_only","page_break","prefix","suffix","text_input_width","time_limit","time_limit_action","time_limit_disable_next","time_limit_disable_prev","time_limit_countdown_message","time_limit_timer_style","time_limit_message_delay","time_limit_message","time_limit_message_style","time_limit_warning","time_limit_warning_display_time","time_limit_warning_message","time_limit_warning_style","time_limit_warning_2","time_limit_warning_2_display_time","time_limit_warning_2_message","time_limit_warning_2_style","random_group"); diff --git a/application/modules/TenRadioArrayQuestion.php b/application/modules/TenRadioArrayQuestion.php index 58f1d533dd2..58a84f83df1 100644 --- a/application/modules/TenRadioArrayQuestion.php +++ b/application/modules/TenRadioArrayQuestion.php @@ -184,6 +184,11 @@ public function availableAttributes($attr = false) return $attr?in_array($attr,$attrs):$attrs; } + public function availableOptions() + { + return array('other' => false, 'valid' => false, 'mandatory' => true); + } + public function questionProperties($prop = false) { $clang=Yii::app()->lang; diff --git a/application/modules/TextArrayQuestion.php b/application/modules/TextArrayQuestion.php index b49c49db64f..cf215cc00ea 100644 --- a/application/modules/TextArrayQuestion.php +++ b/application/modules/TextArrayQuestion.php @@ -483,6 +483,12 @@ public function getSqsuffix() return '_' . substr($this->aid,0,strpos($this->aid,'_')); } + public function getExportVarName() + { + $sgqa_len = strlen($this->surveyid . 'X'. $this->gid . 'X' . $this->id); + return $this->title . '_' . substr($this->getRowDivID(),$sgqa_len); + } + public function getQuestion() { return $this->sq1 . '[' . $this->sq2 . ']'; @@ -493,6 +499,11 @@ public function getRowDivID() return substr($this->fieldname,0,strpos($this->fieldname,'_')); } + public function getExportRowDivID() + { + return $this->getRowDivID(); + } + public function getPregSQ($sgqaNaming, $sq) { $sgqa = substr($sq['jsVarName'],4); @@ -529,6 +540,11 @@ public function includeRelevanceStatus() return true; } + public function availableOptions() + { + return array('other' => false, 'valid' => true, 'mandatory' => true); + } + public function availableAttributes($attr = false) { $attrs=array("answer_width","repeat_headings","array_filter","array_filter_exclude","array_filter_style","em_validation_q","em_validation_q_tip","em_validation_sq","em_validation_sq_tip","statistics_showgraph","statistics_graphtype","hide_tip","hidden","max_answers","maximum_chars","min_answers","numbers_only","show_totals","show_grand_total","page_break","random_order","parent_order","text_input_width","random_group"); diff --git a/application/modules/TextQuestion.php b/application/modules/TextQuestion.php index 84ff36130dd..49187408418 100644 --- a/application/modules/TextQuestion.php +++ b/application/modules/TextQuestion.php @@ -77,5 +77,10 @@ public function getAdditionalValParts() $valParts[] = " }\n"; return $valParts; } + + public function availableOptions() + { + return array('other' => false, 'valid' => true, 'mandatory' => true); + } } ?> \ No newline at end of file diff --git a/application/views/admin/survey/Question/editQuestion_view.php b/application/views/admin/survey/Question/editQuestion_view.php index d2f7f87d7dc..1542e9a21ff 100644 --- a/application/views/admin/survey/Question/editQuestion_view.php +++ b/application/views/admin/survey/Question/editQuestion_view.php @@ -138,8 +138,9 @@ questionProperties('description')} - ".$clang->gT("Cannot be changed (survey is active)"); ?> - ' /> + $description = createQuestion($eqrow['class'])->questionProperties('description'); + echo "{$description} - ".$clang->gT("Cannot be changed (survey is active)"); ?> + ' /> diff --git a/application/views/admin/survey/Question/questionJavascript_view.php b/application/views/admin/survey/Question/questionJavascript_view.php index de3d9db813b..803b8a938ef 100644 --- a/application/views/admin/survey/Question/questionJavascript_view.php +++ b/application/views/admin/survey/Question/questionJavascript_view.php @@ -1,78 +1,44 @@ \ No newline at end of file diff --git a/scripts/admin/admin_core.js b/scripts/admin/admin_core.js index 168a9bc8a30..0b9238abfda 100644 --- a/scripts/admin/admin_core.js +++ b/scripts/admin/admin_core.js @@ -217,7 +217,7 @@ $(document).ready(function(){ }); } $("#question_type.none").change(function(event){ - var selected_value = $("#question_type").val(); + var selected_value = qDescToCode[''+$("#question_type option:selected").text()]; OtherSelection(selected_value); }); @@ -264,14 +264,13 @@ var aToolTipData = { }; var qDescToCode; -var qCodeToInfo; +var qScreenshots; -function getToolTip(type){ - var code = qDescToCode[''+type]; - var multiple = 0; - if (code=='ShortText') multiple = 2; //AJS +function getToolTip(desc){ + var code = qDescToCode[''+desc]; + var multiple = qScreenshots[''+code]; - if (multiple > 0){ + if (multiple > 1){ returnval = ''; for(i=1;i<=multiple;i++){ returnval = returnval + "

"; @@ -288,9 +287,9 @@ function updatequestionattributes() $('.loader').show(); $('#advancedquestionsettings').html(''); var selected_value = qDescToCode[''+$("#question_type_child .selected").text()]; - if (selected_value==undefined) selected_value = $("#question_type").val(); + if (selected_value==undefined) selected_value = qDescToCode[''+$("#question_type option:selected").text()]; $('#advancedquestionsettings').load(attr_url,{qid:$('#qid').val(), - question_type:selected_value, + class:selected_value, sid:$('#sid').val() }, function(){ // Loads the tooltips for the toolbars diff --git a/scripts/expressions/em_javascript.js b/scripts/expressions/em_javascript.js index 08d6177b2cd..7a056c9e2f8 100644 --- a/scripts/expressions/em_javascript.js +++ b/scripts/expressions/em_javascript.js @@ -323,8 +323,8 @@ function LEMval(alias) suffix = 'shown'; varName = varName.substr(10); } - else if (str.match(/\.(code|gid|grelevance|gseq|jsName|mandatory|NAOK|qid|qseq|question|readWrite|relevanceStatus|relevance|rowdivid|sgqa|shown|type|valueNAOK|value)$/)) { - varName = str.replace(/\.(code|gid|grelevance|gseq|jsName|mandatory|NAOK|qid|qseq|question|readWrite|relevanceStatus|relevance|rowdivid|sgqa|shown|type|valueNAOK|value)$/,'') + else if (str.match(/\.(code|gid|grelevance|gseq|jsName|mandatory|NAOK|qid|qseq|question|readWrite|relevanceStatus|relevance|rowdivid|sgqa|shown|valueNAOK|value)$/)) { + varName = str.replace(/\.(code|gid|grelevance|gseq|jsName|mandatory|NAOK|qid|qseq|question|readWrite|relevanceStatus|relevance|rowdivid|sgqa|shown|valueNAOK|value)$/,'') suffix = str.replace(/^(.+)\./,''); } @@ -364,7 +364,7 @@ function LEMval(alias) } case 'shown': { value = htmlspecialchars_decode(document.getElementById(whichJsName).value); - switch(attr.type) + switch(attr.type) //AJS { case 'G': //GENDER drop-down list case 'Y': //YES/NO radio-buttons @@ -461,8 +461,6 @@ function LEMval(alias) return htmlspecialchars_decode(attr.relevance); case 'sgqa': return attr.sgqa; - case 'type': - return attr.type; case 'gseq': return attr.gseq; case 'qseq': @@ -482,7 +480,8 @@ function LEMval(alias) if (suffix == 'value' || suffix == 'valueNAOK') { // if in assessment mode, this returns the assessment value // in non-assessment mode, this is identical to .code - switch (attr.type) { + switch (attr.type) //AJS + { case '!': //List - dropdown case 'L': //LIST drop-down/radio-button list case 'O': //LIST WITH COMMENT drop-down/radio-button list + textarea diff --git a/scripts/jquery/lime-conditions-tabs.js b/scripts/jquery/lime-conditions-tabs.js index 783928cab12..d88a0128f6e 100644 --- a/scripts/jquery/lime-conditions-tabs.js +++ b/scripts/jquery/lime-conditions-tabs.js @@ -13,7 +13,7 @@ function populateCanswersSelect(evt) { for (var i=0;i