Skip to content

Commit

Permalink
Merge pull request #582 from Shnoulle/answershtml_EMevent_relevance
Browse files Browse the repository at this point in the history
Expression Manager relevance event
  • Loading branch information
Shnoulle committed Nov 7, 2016
2 parents 7022875 + 03ec7d0 commit 86b140f
Show file tree
Hide file tree
Showing 6 changed files with 227 additions and 123 deletions.
7 changes: 7 additions & 0 deletions application/core/packages/limesurvey/survey.css
Expand Up @@ -10,6 +10,13 @@
* Used in answers : bootsrap fix (specific single choice list)
*/

/**
* Expression manager relevance system
*/
.ls-hidden {display:none !important;}/* Need important : template can set display:block/table etc ... after */
.ls-unrelevant{}
.ls-disabled{opacity:0.4;}


/* Some tools
*/
Expand Down
108 changes: 108 additions & 0 deletions application/core/packages/limesurvey/survey.js
Expand Up @@ -8,6 +8,114 @@
* Always set an empty LSvar
*/
var LSvar = LSvar || { };

/**
* Action to do when relevance is set to on or off
*/
function triggerEmRelevance(){
triggerEmRelevanceQuestion();
triggerEmRelevanceGroup();
triggerEmRelevanceSubQuestion();
}

/* On question */
function triggerEmRelevanceQuestion(){
/* Action on this question */
$("[id^='question']").on('relevance:on',function(event,data) {
if(event.target != this) return; /* @todo : attach only to this. Use http://stackoverflow.com/a/6411507/2239406 solution for now. Don't want to stop propagation. */
$(this).removeClass("ls-unrelevant ls-hidden");
});
$("[id^='question']").on('relevance:off',function(event,data) {
if(event.target != this) return;
$(this).addClass("ls-unrelevant ls-hidden");
});
/* In all in one mode : need updating group too */
$(".allinone [id^='group-']:not(.ls-unrelevant) [id^='question']").on('relevance:on',function(event,data) {
if(event.target != this) return;
$(this).closest("[id^='group-']").removeClass("ls-hidden");
});
$(".allinone [id^='group-']:not(.ls-unrelevant) [id^='question']").on('relevance:off',function(event,data) {
if(event.target != this) return;
if($(this).closest("[id^='group-']").find("[id^='question']").length==$(this).closest("[id^='group-']").find("[id^='question'].ls-hidden").length){
$(this).closest("[id^='group-']").addClass("ls-hidden");
}
});
}
function triggerEmRelevanceGroup(){
$("[id^='group-']").on('relevance:on',function(event,data) {
if(event.target != this) return;
$(this).removeClass("ls-unrelevant ls-hidden");
});
$("[id^='group-']").on('relevance:off',function(event,data) {
if(event.target != this) return;
$(this).addClass("ls-unrelevant ls-hidden");
});
}
function triggerEmRelevanceSubQuestion(){
$("[id^='question']").on('relevance:on',"[id^='javatbd']",function(event,data) {
if(event.target != this) return; // not needed now, but after (2016-11-07)
data = $.extend({style:'hidden'}, data);
$(this).removeClass("ls-unrelevant ls-"+data.style);
if(data.style=='disabled'){
$(event.target).find('input').prop("disabled", false );
}
if(data.style=='hidden'){
updateLineClass($(this));
updateRepeatHeading($(this).closest(".ls-answers"));
}
});
$("[id^='question']").on('relevance:off',"[id^='javatbd']",function(event,data) {
if(event.target != this) return; // not needed now, but after (2016-11-07)
data = $.extend({style:'hidden'}, data);
$(this).addClass("ls-unrelevant ls-"+data.style);
if(data.style=='disabled'){
$(event.target).find('input').prop("disabled", true );
}
if(data.style=='hidden'){
updateLineClass($(this));
updateRepeatHeading($(this).closest(".ls-answers"));
}
});
}
/**
* Update lines class when relevance:(on|off) happen
*/
function updateLineClass(line){
if($(line).hasClass("ls-odd") || $(line).hasClass("ls-even")){
$(line).closest(".ls-answers").find(".ls-odd:visible,.ls-even:visible").each(function(index){ // not limited to table
$(this).removeClass('ls-odd ls-even').addClass(((index+1)%2 == 0) ? "ls-odd" : "ls-even");
});
}
}
/**
* Update repeat heading
*/
function updateRepeatHeading(answers){
/* Update only (at start) when all hidden line is done : @todo : do it only once */
$(function() {
if($(answers).data("repeatHeading") || $(answers).find("tbody").find(".ls-heading").length){
/* set the data the first time */
if(!$(answers).data("repeatHeading")){
var repeatHeading=$(answers).find("tbody:first tr").length;/* first body don't have heading */
$(answers).data("repeatHeading",repeatHeading)
$(answers).data("repeatHeader",$(answers).find("tbody .ls-heading").filter(":first")[0].outerHTML);
}else{
var repeatHeading=$(answers).data("repeatHeading");
}
/* can remove the heading and clone this one of thead */
var header = $(answers).data("repeatHeader");
$(answers).find("tbody .ls-heading").remove();
var lines=$(answers).find('tr:visible');
var max=$(answers).find('tr:visible').length-1;
$(lines).each(function(index){
if(index != 0 && index % repeatHeading == 0 && index < max)
{
$(header).insertAfter($(this));
}
});
}
});
}
/**
* Manage the index
*/
Expand Down
31 changes: 21 additions & 10 deletions application/helpers/SurveyRuntimeHelper.php
Expand Up @@ -893,7 +893,7 @@ function run($surveyid,$args)
$gnoshow = LimeExpressionManager::GroupIsIrrelevantOrHidden($_gseq);
if ($gnoshow && !$previewgrp)
{
echo " class='hidden'";
echo " class='ls-hidden'";/* Unsure for reason : hidden or unrelevant ?*/
}
echo ">\n";
echo templatereplace(file_get_contents($sTemplateViewPath."startgroup.pstpl"), array(), $redata);
Expand Down Expand Up @@ -986,6 +986,7 @@ function run($surveyid,$args)

LimeExpressionManager::FinishProcessingGroup($LEMskipReprocessing);
echo LimeExpressionManager::GetRelevanceAndTailoringJavaScript();
Yii::app()->clientScript->registerScript('triggerEmRelevance',"triggerEmRelevance();",CClientScript::POS_END);
LimeExpressionManager::FinishProcessingPage();

/**
Expand Down Expand Up @@ -1172,16 +1173,28 @@ public static function getQuestionReplacement($aQuestionQanda)

}
// Core value :the classes
$aReplacement['QUESTION_CLASS'] = Question::getQuestionClass($sType);

$aQuestionClass=array(
Question::getQuestionClass($sType),
);
/* Add the relevance class */
if (!$lemQuestionInfo['relevant'])
{
$aQuestionClass[]='ls-unrelevant';
$aQuestionClass[]='ls-hidden';
}
if ($lemQuestionInfo['hidden'])
{
$aQuestionClass[]='ls-hidden';
}
//get additional question classes from question attribute
$aQuestionAttributes = getQuestionAttributeValues($aQuestionQanda[4]);

//add additional classes
if(isset($aQuestionAttributes['cssclass']))
{
$aReplacement['QUESTION_CLASS'] .= " ".$aQuestionAttributes['cssclass'];
$aQuestionClass[]=htmlentities($aQuestionAttributes['cssclass']);
}
$aReplacement['QUESTION_CLASS'] =implode(" ",$aQuestionClass);

$aMandatoryClass = array();
if ($lemQuestionInfo['info']['mandatory'] == 'Y')// $aQuestionQanda[0]['mandatory']=="*"
Expand All @@ -1203,10 +1216,6 @@ public static function getQuestionReplacement($aQuestionQanda)
$aReplacement['QUESTION_MANDATORY']=$aQuestionQanda[0]['mandatory'];
// For QUESTION_ESSENTIALS
$aHtmlOptions=array();
if ((!$lemQuestionInfo['relevant']) || ($lemQuestionInfo['hidden']))// && $lemQuestionInfo['info']['type'] == '*'))
{
$aHtmlOptions['style'] = 'display: none;';
}

// Launch the event
$event = new PluginEvent('beforeQuestionRender');
Expand Down Expand Up @@ -1248,8 +1257,10 @@ public static function getQuestionReplacement($aQuestionQanda)
$aReplacement['QUESTION_VALID_MESSAGE'] = $event->get('valid_message');
$aReplacement['QUESTION_FILE_VALID_MESSAGE'] = $event->get('file_valid_message');
$aReplacement['QUESTION_MANDATORY'] = $event->get('mandatory',$aReplacement['QUESTION_MANDATORY']);
// Always add id for QUESTION_ESSENTIALS
$aHtmlOptions['id']="question{$iQid}";
//Another data for QUESTION_ESSENTIALS
$aHtmlOptions= (array) $event->get('aHtmlOptions');
unset($aHtmlOptions['class']);// Disallowing update/set class
$aHtmlOptions['id']="question{$iQid}";// Always add id for QUESTION_ESSENTIALS
$aReplacement['QUESTION_ESSENTIALS']=CHtml::renderAttributes($aHtmlOptions);

return $aReplacement;
Expand Down

0 comments on commit 86b140f

Please sign in to comment.