Skip to content

Commit

Permalink
Dev JSing answer administration to be able to handle several answer s…
Browse files Browse the repository at this point in the history
…cales on the same page

git-svn-id: file:///Users/Shitiz/Downloads/lssvn/source/limesurvey_dev_cs@8267 b72ed6b6-b9f8-46b5-92b4-906544132732
  • Loading branch information
c-schmitz committed Jan 18, 2010
1 parent bb94532 commit 03b7c34
Show file tree
Hide file tree
Showing 6 changed files with 343 additions and 421 deletions.
271 changes: 55 additions & 216 deletions admin/database.php

Large diffs are not rendered by default.

66 changes: 35 additions & 31 deletions admin/html.php
Expand Up @@ -1221,12 +1221,15 @@
$qtype = $connect->GetOne($qquery);
$scalecount=$qtypes[$qtype]['answerscales'];
//Check if there is at least one answer
$qquery = "SELECT count(*) as num_ans FROM ".db_table_name('answers')." WHERE qid=$qid AND scale_id=1 AND language='".$baselang."'";
$qresult = $connect->GetOne($qquery); //Checked
if ($qresult==0)
for ($i = 1; $i < $scalecount+1; $i++)
{
$query="INSERT into ".db_table_name('answers')." (qid,code,answer,language,sortorder) VALUES ($qid,'A1','myfirstanwer','$baselang',0)";
$connect->execute($query);
$qquery = "SELECT count(*) as num_ans FROM ".db_table_name('answers')." WHERE qid=$qid AND scale_id=$i AND language='".$baselang."'";
$qresult = $connect->GetOne($qquery); //Checked
if ($qresult==0)
{
$query="INSERT into ".db_table_name('answers')." (qid,code,answer,language,sortorder,scale_id) VALUES ($qid,'A1',".db_quoteall($clang->gT("Some example answer")).",'$baselang',0,$i)";
$connect->execute($query);
}
}


Expand Down Expand Up @@ -1286,7 +1289,7 @@
. "<input type='hidden' name='qid' value='$qid' />\n"
. "<input type='hidden' name='action' value='updateansweroptions' />\n"
. "<input type='hidden' name='sortorder' value='' />\n";
$vasummary .= "<div class='tab-pane' id='tab-pane-assessments-$surveyid'>";
$vasummary .= "<div class='tab-pane' id='tab-pane-answers-$surveyid'>";
$first=true;
$sortorderids='';
$codeids='';
Expand All @@ -1296,24 +1299,31 @@
// the following line decides if the assessment input fields are visible or not
$assessmentvisible=($surveyinfo['assessments']=='Y' && $qtypes[$qtype]['assessable']==1);

// Insert some Javascript variables
$surveysummary .= "\n<script type='text/javascript'>
var languagecount=".count($anslangs).";\n
var scalecount=".$scalecount.";
var assessmentvisible=".($assessmentvisible?'true':'false').";
var langs='".implode(';',$anslangs)."';</script>\n";

foreach ($anslangs as $anslang)
{
$position=0;
$vasummary .= "<div class='tab-page'>"
$vasummary .= "<div class='tab-page' id='tabpage_$anslang'>"
."<h2 class='tab'>".getLanguageNameFromCode($anslang, false);
if ($anslang==GetBaseLanguageFromSurveyID($surveyid)) {$vasummary .= '('.$clang->gT("Base Language").')';}

$vasummary .= "</h2>";

for ($scale_id = 1; $scale_id < $scalecount+1; $scale_id++)
{
$position=0;
if ($scalecount>1)
{
$vasummary.="<div class='header'>".sprintf($clang->gT("Answer scale %s"),$scale_id)."</div>";
}


$vasummary .= "<table class='answertable' align='center' >\n"
$vasummary .= "<table class='answertable' id='answers_{$anslang}_$scale_id' align='center' >\n"
."<thead>"
."<tr>\n"
."<th align='right'>&nbsp;</th>\n"
Expand All @@ -1339,36 +1349,28 @@
."<tbody align='center'>";
$alternate=true;

$query = "SELECT * FROM ".db_table_name('answers')." WHERE qid='{$qid}' AND language='{$anslang}' ORDER BY sortorder, code";
$query = "SELECT * FROM ".db_table_name('answers')." WHERE qid='{$qid}' AND language='{$anslang}' and scale_id=$scale_id ORDER BY sortorder, code";
$result = db_execute_assoc($query) or safe_die($connect->ErrorMsg()); //Checked
$anscount = $result->RecordCount();
while ($row=$result->FetchRow())
{
$row['code'] = htmlspecialchars($row['code']);
$row['answer']=htmlspecialchars($row['answer']);

$sortorderids=$sortorderids.' '.$row['language'].'_'.$row['sortorder'].'_'.$scale_id;
if ($first) {$codeids=$codeids.' '.$row['sortorder'];}

$vasummary .= "<tr";

$vasummary .= "<tr id='row_$position' ";
if ($alternate==true)
{
$vasummary.=' class="highlight" ';
$alternate=false;
}
else
{
$alternate=true;
}
$alternate=!$alternate;

$vasummary .=" ><td align='right'>\n";

if ($first)
{
$vasummary .= "<img src='$imagefiles/handle.png' /></td><td><input type='text' id='code_{$row['sortorder']}_{$scale_id}' name='code_{$row['sortorder']}_{$scale_id}' value=\"{$row['code']}\" maxlength='5' size='5'"
." onkeypress=\" if(event.keyCode==13) {if (event && event.preventDefault) event.preventDefault(); document.getElementById('saveallbtn_$anslang').click(); return false;} return goodchars(event,'1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWZYZ_')\""
$vasummary .= "<img src='$imagefiles/handle.png' /></td><td><input type='text' class='code' id='code_{$position}_{$scale_id}' name='code_{$position}_{$scale_id}' value=\"{$row['code']}\" maxlength='5' size='5'"
." onkeypress=\"return goodchars(event,'1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWZYZ_')\""
." />";
$vasummary .= "<input type='hidden' id='previouscode_{$row['sortorder']}_{$scale_id}' name='previouscode_{$row['sortorder']}_{$scale_id}' value=\"{$row['code']}\" />";
}
else
{
Expand All @@ -1381,14 +1383,14 @@

if ($assessmentvisible && $first)
{
$vasummary .= "><input type='text' id='assessment_{$row['sortorder']}_{$scale_id}' name='assessment_{$row['sortorder']}_{$scale_id}' value=\"{$row['assessment_value']}\" maxlength='5' size='5'"
." onkeypress=\" if(event.keyCode==13) {if (event && event.preventDefault) event.preventDefault(); document.getElementById('saveallbtn_$anslang').click(); return false;} return goodchars(event,'-1234567890')\""
$vasummary .= "><input type='text' class='assessment' id='assessment_{$position}_{$scale_id}' name='assessment_{$position}_{$scale_id}' value=\"{$row['assessment_value']}\" maxlength='5' size='5'"
." onkeypress=\"return goodchars(event,'-1234567890')\""
." />";
}
elseif ( $first)
{
$vasummary .= " style='display:none;'><input type='hidden' id='assessment_{$row['sortorder']}_{$scale_id}' name='assessment_{$row['sortorder']}_{$scale_id}' value=\"{$row['assessment_value']}\" maxlength='5' size='5'"
." onkeypress=\" if(event.keyCode==13) {if (event && event.preventDefault) event.preventDefault(); document.getElementById('saveallbtn_$anslang').click(); return false;} return goodchars(event,'-1234567890')\""
$vasummary .= " style='display:none;'><input type='hidden' id='assessment_{$position}_{$scale_id}' name='assessment_{$position}_{$scale_id}' value=\"{$row['assessment_value']}\" maxlength='5' size='5'"
." onkeypress=\"return goodchars(event,'-1234567890')\""
." />";
}
elseif ($assessmentvisible)
Expand All @@ -1401,7 +1403,7 @@
}

$vasummary .= "</td><td>\n"
."<input type='text' name='answer_{$row['language']}_{$row['sortorder']}_{$scale_id}' maxlength='1000' size='80' value=\"{$row['answer']}\" onkeypress=\" if(event.keyCode==13) {if (event && event.preventDefault) event.preventDefault(); document.getElementById('saveallbtn_$anslang').click(); return false;}\" />\n"
."<input type='text' class='answer' id='answer_{$row['language']}_{$row['sortorder']}_{$scale_id}' ' name='answer_{$row['language']}_{$row['sortorder']}_{$scale_id}' size='80' value=\"{$row['answer']}\" />\n"
. getEditor("editanswer","answer_".$row['language']."_{$row['sortorder']}_{$scale_id}", "[".$clang->gT("Answer:", "js")."](".$row['language'].")",$surveyid,$gid,$qid,'editanswer');

// Deactivate delete button for active surveys
Expand All @@ -1411,8 +1413,12 @@
$vasummary .= "</td></tr>\n";
$position++;
}
++$anscount;
$vasummary .='</table><br />';
if ($first)
{
$vasummary .= "<input type='hidden' id='answercount_{$scale_id}' name='answercount_{$scale_id}' value='$anscount' />\n";
}

}
if ($anscount > 0)
{
Expand All @@ -1424,8 +1430,6 @@

$first=false;
$vasummary .= "</tbody></table>\n";
$vasummary .= "<input type='hidden' name='sortorderids' value='$sortorderids' />\n";
$vasummary .= "<input type='hidden' name='codeids' value='$codeids' />\n";
$vasummary .= "</div>";
}
$vasummary .= "</div></form></td></tr></table>";
Expand Down
2 changes: 1 addition & 1 deletion admin/htmleditor-functions.php
Expand Up @@ -215,7 +215,7 @@ function getPopupEditor($fieldtype,$fieldname,$fieldtext, $surveyID=null,$gID=nu
$fieldtype == 'editlabel' ||
$fieldtype == 'addlabel')
{
$imgopts = "width='14' height='14'";
$imgopts = "width='16' height='16'";
}

$htmlcode .= ""
Expand Down
163 changes: 121 additions & 42 deletions admin/scripts/answers.js
@@ -1,8 +1,9 @@
// $Id: templates.js 7699 2009-09-30 22:28:50Z c_schmitz $

$(document).ready(function(){
$('.answertable tbody').sortable({containment:'parent',
distance:3});
$('.answertable tbody').sortable({ containment:'parent',
update:updaterowproperties,
distance:3});
$('.btnaddanswer').click(addinput);
$('.btndelanswer').click(deleteinput);
});
Expand All @@ -12,64 +13,142 @@ function deleteinput()
{

// 1.) Check if there is at least one answe


thisinputid=removechars(this.id);
thisquestionid=removechars($(this).parent().parent().attr('id'));
ulparent=$(this).parents('ul');
countanswers=$(ulparent[0]).children().length;
countanswers=$(this).parent().parent().parent().children().length;
if (countanswers>1)
{
// 2.) mark for deletion.
if ($('#formquestionarea').data("deletedinputs")==undefined){ //add this ID to the "deletedinputs" variable
$('#formquestionarea').data("deletedinputs",thisinputid);
}
else {
$('#formquestionarea').data("deletedinputs",$('#formquestionarea').data("deletedinputs")+" "+thisinputid);
}
//3. Remove the answer li
$("#editanswer_"+thisinputid).hide('fast',function(){
$("#editanswer_"+thisinputid).remove();
});

//4. Call the callback function in the question specific JS
questiontype=$('#questioncontainer'+thisquestionid).data('questiontype');
window[questiontype+"_deleteinput"] (thisquestionid,thisinputid);

// 2.) Remove the table row
position=$(this).closest('tr').attr('id').substr(4);
info=$(this).closest('table').attr('id').split("_");
language=info[1];
scale_id=info[2];
languages=langs.split(';');
var x;
for (x in languages)
{
tablerow=$('#tabpage_'+languages[x]).find('#answers_'+languages[x]+'_'+scale_id+' #row_'+position);
if (x==0) {
tablerow.fadeTo(400, 0, function(){
$(this).remove();
updaterowproperties();
});
}
else {
tablerow.remove();
}
}
}
else
{
$.blockUI({message:"<p><br/>You cannot delete the last answer.</p>"});
setTimeout(jQuery.unblockUI,1000);
}
updaterowproperties();
}


function addinput()
{
//todo: extract question id from parent element so inputelement creation is faster in cake
this.src=imgpath+'ajax-loader-small.gif';
thisinputid=removechars(this.id);
var addinput_questionid=removechars($(this).parent().parent().attr('id'));
position=$(this).closest('tr').attr('id').substr(4);
info=$(this).closest('table').attr('id').split("_");
language=info[1];
scale_id=info[2];
newposition=Number(position)+1;
languages=langs.split(';');
var x;
for (x in languages)
{
tablerow=$('#tabpage_'+languages[x]).find('#answers_'+languages[x]+'_'+scale_id+' #row_'+position);
if (x==0) {
inserthtml='<tr id="row_'+newposition+'" style="display:none;"><td><img src="../images/handle.png" /></td><td><input class="code" type="text" maxlength="5" size="5" value="'+getNextCode($('#tabpage_'+languages[x]).find('#row_'+position+' .code').val())+'" /></td><td><input type="text" size="80" class="answer" value="New answer option"></input><img src="../images/edithtmlpopup.png" class="btnaddanswer" /></td><td><img src="../images/addanswer.png" class="btnaddanswer" /><img src="../images/deleteanswer.png" class="btndelanswer" /></td></tr>'
}
else
{
inserthtml='<tr id="row_'+newposition+'" style="display:none;"><td>&nbsp;</td><td>&nbsp;</td><td><input type="text" size="80" class="answer" value="New answer option"></input><img src="../images/edithtmlpopup.png" class="btnaddanswer" /></td><td><img src="../images/addanswer.png" class="btnaddanswer" /><img src="../images/deleteanswer.png" class="btndelanswer" /></td></tr>'
}
tablerow.after(inserthtml);
tablerow.next().find('.btnaddanswer').click(addinput);
tablerow.next().find('.btndelanswer').click(deleteinput);
tablerow.next().fadeIn(800);
tablerow.next().find('.code').blur(updatecodes);
}

if(languagecount>1)
{

}

jQuery.getJSON( basepath+"builder/addinput/"+thisinputid,
function(data){
answerid=data.lastid;
afterid=data.afterid;
$('#editanswer_'+afterid).after('<li id="editanswer_'+answerid+'" class="edititem"><input id="editanswerinput_'+answerid+'" value="New choice"></input><img id="btnaddanswer'+answerid+'" src="'+imgpath+'addanswer.png"><img id="btndelanswer'+answerid+'" src="'+imgpath+'deleteanswer.png"></li>');
$('#editanswer_'+afterid).next().show('normal');
$('#btnaddanswer'+answerid).click(addinput);
$('#btndelanswer'+answerid).click(deleteinput);
$('#btnaddanswer'+afterid).attr('src',imgpath+'addanswer.png');
//4. Call the callback function in the question specific JS
questiontype=$('#questioncontainer'+addinput_questionid).data('questiontype');
window[questiontype+"_addinput"] (addinput_questionid,answerid,'New choice');
$('#editanswerinput_'+answerid).change(changeinput);
}
);
$('.answertable tbody').sortable('refresh');
updaterowproperties();
}

// This function adjust the alternating table rows and IDs and names
function updaterowproperties()
{
$('.answertable tbody').each(function(){
info=$(this).closest('table').attr('id').split("_");
language=info[1];
scale_id=info[2];
var highlight=true;
var rownumber=0;
$(this).children('tr').each(function(){

$(this).removeClass();
if (highlight){
$(this).addClass('highlight');
}
$(this).addClass('row_'+rownumber);
$(this).find('.code').attr('id','code_'+rownumber+'_'+scale_id);
$(this).find('.code').attr('name','code_'+rownumber+'_'+scale_id);
$(this).find('.answer').attr('id','answer_'+language+'_'+rownumber+'_'+scale_id);
$(this).find('.answer').attr('name','answer_'+language+'_'+rownumber+'_'+scale_id);
$(this).find('.assessment').attr('id','assessment_'+language+'_'+rownumber+'_'+scale_id);
$(this).find('.assessment').attr('name','assessment_'+language+'_'+rownumber+'_'+scale_id);
highlight=!highlight;
rownumber++;
})
$('#answercount_'+scale_id).val(rownumber);
})
}

// This is a helper function to extract the question ID from a DOM ID element
function removechars(strtoconvert){
return strtoconvert.replace(/[a-zA-Z_]/g,"");
}

function updatecodes()
{

}

function getNextCode(sourcecode)
{
i=1;
found=true;
foundnumber=-1;
while (i<=sourcecode.length && found)
{
found=is_numeric(sourcecode.substr(-i));
if (found)
{
foundnumber=sourcecode.substr(-i);
i++;
}
}
if (foundnumber==-1)
{
return(sourcecode);
}
else
{
foundnumber++;
foundnumber=foundnumber+'';
result=sourcecode.substr(0,sourcecode.length-foundnumber.length)+foundnumber;
return(result);
}

}

function is_numeric (mixed_var) {
return (typeof(mixed_var) === 'number' || typeof(mixed_var) === 'string') && mixed_var !== '' && !isNaN(mixed_var);
}

0 comments on commit 03b7c34

Please sign in to comment.