View Issue Details

This bug affects 3 person(s).
 28
IDProjectCategoryView StatusLast Update
15105Feature requestsOtherpublic2023-12-07 15:39
Reporterf_funke Assigned Tolime_release_bot  
PriorityurgentSeverityfeature 
Status newResolutionopen 
Summary15105: "no answer" is preselected
Description

No answer option is preselected but should not be preselected on load.

Steps To Reproduce

just check any question with presentation option "show 'no answer'" = on

TagsNo tags attached.
Attached Files
Bug heat28
Story point estimate0
Users affected %0

Users monitoring this issue

andyrue, BogdanVoicu

Activities

cdorin

cdorin

2019-09-18 15:29

reporter   ~53629

Isn't this a feature request? just checked now in 2.7x , and it is always preselected. Shall the behaviour be changed?

f_funke

f_funke

2019-09-19 09:00

developer   ~53648

No, from a methodological point of view this is a bug. Because "no answer" implies that a respondent chooses to say "I do not want to answer that question". However, there are many other possibilities why the person did not check any other response (e.g., did overread the question or none of the response options provided is a good answer).

Normally, I am not very strict and try to balance arguments for or against something. But pre-selecting any answer (even if it is "no answer") is really bad survey design. So either LimeSurvey is bad by design - which I doubt - or this is a definitely bug.

DenisChenu

DenisChenu

2019-09-19 09:54

developer   ~53651

@f_funke : Disable «Show no answer» didn't fix the issue ?

In radio list : the «No answer» option is same than an empty text box, or «Please choose …» in a dropdown.

In HTML : a dropdow NEED an empty answer (else the 1st is selected).

f_funke

f_funke

2019-09-19 10:12

developer   ~53652

15104 was a different issue ("no answer" was displayed, even if was set to no in the options).

In a dropdown, the first (and visible) option should always be "select here" (or something like that) and if you want to an additional "no answer". But also in dropdown the first option should never be "no answer" as this implies that no answer is a perfectly fine answer (which it is not because it should only be the very last choice). However, in a select list (technically a HTML dropdown with all response options visible) the "select here" is not necessary.

A more elaborate way of dealing with "no answer" response option would be in combination with madatory questions. On load there are only the substantial response options (e.g., A, B, C). When continuing without choosing an answer respondents are prompted ("Please select an answer.") and the additional response option "no answer" (or additional options like "don't know", "choose not to say", "depends on") is displayed (e.g., A, B, C, no answer). But I guess that relevance equations on the response level would be necessary for that?

DenisChenu

DenisChenu

2019-09-19 10:48

developer   ~53653

Last edited: 2019-09-19 10:50

Dropdown non mandatory : 1st seen : «Select answer … », move next, move previous : «No answer» selected

Else : in my opinion : If you need a clean solution : just set your radio list question as mandatory … : no default value, no «No answer» etc …

See https://ux.stackexchange.com/a/76182
See this guideline : https://docs.microsoft.com/fr-fr/windows/win32/uxguide/ctrl-radio-buttons
See the default value part : Have a «Default selectable» option is acceptable … And the exception can be easily managed with mandatory settings.

Else : we can have different look for No answer and answer (see screenshot)

DenisChenu

DenisChenu

2019-09-19 10:53

developer   ~53654

About : dodn't display the 1st time : i'm TOTALLY against this …

Choice : Yes/No/No answer (non mandatory question)
I click on Yes by «inadvertence» (my mouse is doing hers, I have an illness, I am navigating on the keyboard ...)
I NEED a way to check "No Answer" …

cdorin

cdorin

2019-09-19 11:14

reporter   ~53655

I talked to @c_schmitz. We will move it (for the moment) to feature requests. There are some other things that need to be dealt with first.

Mazi

Mazi

2019-11-25 15:49

updater   ~54773

I do not consider this a bug. It is the default Limesurvey behavior for > 10 years and we should NOT change that unless there are very good reasons for it.
I haven't heard users complaining about this so far but if we change this, there can be an outcry by the community for adjusting a core feature.

@holch, what's your opinion?

holch

holch

2019-11-25 17:23

reporter   ~54778

I consider the whole feature of "no answer" nonsensical. Why force someone to have this "no answer" option anyway? If I want a "no answer" option I'll put it in the question (and with the answer code that I want and need for analysis (e.g. 98 or 99, which is fairly standard). But I understand Denis' point: If you click something in a question

But I also don't see why any answer needs to be pre-selected in this case anyway.

So I am probably the wrong person to ask.

But just because we have always done it doesn't mean we can't change it. But a change needs a good reason.

@f_funke: Limesurvey has a bunch of historically grown things that don't really make sense. You need to know that LS grew from a one man coding project to something a lot bigger. There was never really much of a strategy, it is always just developed one problem per problem. So many old "features" have never changed, if they make sense or not. And of course it is always dangerious to change something that has been there for ever, no matter how stupid it sounds. There will always be some that are used to it and will be against the change. This is just the nature of things. Humans are "Gewohnheitstiere"...

f_funke

f_funke

2019-11-29 09:33

developer   ~54886

I totally understand that there is something like a history and that some things should not be changed.

But a preselection of an answer (even if the answer is a nonsubstantial answer) is such a big no go that in my eyes this is a bug and this implementation ignores a very basic principle in surveys. Sorry for my harsh words, but this is what you learn in the first lesson in a survey methodology 101 class.: Never ever preselect an answer option.

@Mazi: That this behavior exists for 10+ years is no justification for a bad survey design. That users didn't complain is no valid argument either. I'd guess that most people just don't use that feature. And LimeSurvey's options and defaults should help users to make good survey - the current implementation goes in the opposite direction.

For goodness' (and backward compatibility's) sake, there could be three options for "no answer" in the future:
1) no answer not shown
2) no answer shown and not preselected (aka good implementation)
3) no answer shown and preselected (aka old and bad implementation)
But actually, I would just change the no answer option to being not preselected.

@holch: The no answer option could make sense if it was combined with a certain presentation style (e.g., separated from the sustantial answers, or a smaller or lighter font). And it could also be nice for the expression manager if you could formulate a condition based on no answers. But I think in the long run it would be good to add in the admin backend a checkbox for every answer option if this answer is a no answer (e.g., don't know, won't tell, doesn't apply). At least this is how other survey software handles the issue.

holch

holch

2019-11-29 14:21

reporter   ~54890

@f_funke: I am not saying it shouldn't be changed. I am just saying why these things are there sometimes and why they haven't been changed so far.

But from what I understand is, your problem is with the pre-selection only. The rest seems to be fine for you. And I agree. I avoid pre-selection where ever possible and I also don't see much of a good reason for pre-selections, maybe only in case that you already have information and you just want them to confirm if this is still valid or want to show what they have answered previously. But else, I would avoid it.

So I actually vote for "yes" here. Take the pre-selection out. It doesn't aggregate anything and is just causing problems eventually. If someone doesn't tick anything, that is already "no answer" anyway...

Mazi

Mazi

2019-11-29 15:28

updater   ~54891

Thanks for the clarification. These are very reasonable arguments and therefore I am also persuaded that changing this makes sense. But we should handle this with care. Maybe the following is possible:

  1. Adjust the available settings as outlined by f_funke.
  2. For existing surveys, when updating a system, keep the old "show and pre-select" option.
  3. For new surveys, set "show and no pre-selection" as default.

Maybe also introduce a global setting like we do for other features and then the user is able to adjust this on survey level.

f_funke, can you ask if this is doable for LS 4?

tbart

tbart

2023-10-11 18:24

reporter   ~77638

Just came here to chime in. I did patch quanda_helper myself years ago already to stop preselecting "no answer" (and I know of other people doing this, so this will probably not even change existing surveys for the worse :-) ), for the causes outlined above. In some other web forms I even implemented a removal button for the "accidentally clicked somewhere" case as 0 != NULL, this really often also makes a difference from a data-keeping PoV.
Could probably be considered here as well, but the core issue at hand should really be fixed.
As this doesn't seem to have hit LS6.x already, I have to see where I can patch this now. Does anyone probably already have a patch (that simply always stops preselecting) for the time being?
The one from 3.x only partially applies so there are things missing.

Attaching the old one for reference.

no_answer_not_default.patch (2,559 bytes)   
--- application/helpers/qanda_helper.php    15:48:19.000000000 +0200
+++ application/helpers/qanda_helper.php	2018-09-25 18:05:36.587042790 +0200
@@ -801,9 +801,6 @@
     if ($ia[6] != "Y" && SHOW_NO_ANSWER == 1) {
 // Add "No Answer" option if question is not mandatory
         $checkedState = '';
-        if (!$_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$ia[1]]) {
-            $checkedState = ' CHECKED ';
-        }
         $aRows[] = array(
             'name'                   => $ia[1],
             'value'                  => "",
@@ -1578,11 +1575,7 @@
     if ($ia[6] != 'Y' && SHOW_NO_ANSWER == 1) {
         $iRowCount++;
 
-        if ((!isset($_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$ia[1]]) || $_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$ia[1]] == '') || ($_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$ia[1]] == ' ')) {
-            $check_ans = CHECKED; //Check the "no answer" radio button if there is no answer in session.
-        } else {
-            $check_ans = '';
-        }
+        $check_ans = '';
 
         if ($iRowCount == 1) {
             $sRows .= doRender('/survey/questions/answer/listradio/columns/column_header', array('iColumnWidth' => $iColumnWidth), true);
@@ -4156,7 +4149,7 @@
             $fn++;
 
             foreach ($labelcode as $ld) {
-                $CHECKED     = (isset($_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname]) && $_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname] == $ld) ? 'CHECKED' : '';
+                $CHECKED     = ($ld != "" && isset($_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname]) && $_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname] == $ld) ? 'CHECKED' : '';
                 $answer_tds .= doRender('/survey/questions/answer/arrays/array/no_dropdown/rows/cells/answer_td', array(
                     'myfname'=>$myfname,
                     'ld'=>$ld,
@@ -4170,7 +4163,7 @@
             // NB: $ia[6] = mandatory
             $no_answer_td = '';
             if ($ia[6] != 'Y' && SHOW_NO_ANSWER == 1) {
-                $CHECKED = (!isset($_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname]) || $_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname] == '') ? 'CHECKED' : '';
+                $CHECKED = '';
                 $no_answer_td .= doRender('/survey/questions/answer/arrays/array/no_dropdown/rows/cells/answer_td', array(
                     'myfname'                => $myfname,
                     'ld'                     => '',
no_answer_not_default.patch (2,559 bytes)   
tbart

tbart

2023-11-24 21:56

reporter   ~78712

This one works for current 6.3.x

no_answer_not_default-2.patch (12,600 bytes)   
#--- application/helpers/qanda_helper.php    15:48:19.000000000 +0200
#+++ application/helpers/qanda_helper.php	2018-09-25 18:05:36.587042790 +0200
## array
#@@ -3329,7 +3329,7 @@
#             $fn++;
# 
#             foreach ($labelcode as $ld) {
#-                $CHECKED     = (isset($_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname]) && $_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname] == $ld) ? 'CHECKED' : '';
#+                $CHECKED     = ($ld != "" && isset($_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname]) && $_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname] == $ld) ? 'CHECKED' : '';
#                 $answer_tds .= doRender('/survey/questions/answer/arrays/array/no_dropdown/rows/cells/answer_td', array(
#                     'myfname'=>$myfname,
#                     'ld'=>$ld,
##still array
#@@ -3343,7 +3343,7 @@
#             // NB: $ia[6] = mandatory
#             $no_answer_td = '';
#             if ($ia[6] != 'Y' && SHOW_NO_ANSWER == 1) {
#-                $CHECKED = (!isset($_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname]) || $_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname] == '') ? 'CHECKED' : '';
#+                $CHECKED = '';
#                 $no_answer_td .= doRender('/survey/questions/answer/arrays/array/no_dropdown/rows/cells/answer_td', array(
#                     'myfname'                => $myfname,
#                     'ld'                     => '',
--- application/core/QuestionTypes/ListRadio/RenderListRadio.php	2023-10-18 16:34:01.195789512 +0200
+++ application/core/QuestionTypes/ListRadio/RenderListRadio.php	2023-10-18 16:37:16.855782603 +0200
# List (radio) and image select list (radio)
@@ -175,12 +175,6 @@
 
     public function addNoAnswerRow()
     {
-        if (!isset($this->mSessionValue) || $this->mSessionValue == '' || $this->mSessionValue == ' ') {
-            $check_ans = CHECKED; //Check the "no answer" radio button if there is no answer in session.
-        } else {
-            $check_ans = '';
-        }
-
         return Yii::app()->twigRenderer->renderQuestion($this->getMainView() . '/rows/answer_row_noanswer', array(
             'name' => $this->sSGQA,
             'check_ans' => $check_ans,
# list with comment
--- application/core/QuestionTypes/ListWithComment/RenderListComment.php	2023-10-18 17:10:17.343712671 +0200
+++ application/core/QuestionTypes/ListWithComment/RenderListComment.php	2023-10-18 17:10:21.751712516 +0200
@@ -57,7 +57,6 @@
                 'name' => $this->sSGQA,
                 'id' => 'answer' . $this->sSGQA,
                 'value' => '',
-                'check_ans' => ($this->mSessionValue == '' || $this->mSessionValue == ' ') ? CHECKED : '',
                 'checkconditionFunction' => $this->checkconditionFunction . '(this.value, this.name, this.type)',
                 'labeltext' => gT('No answer'),
             );
# array = arrayflexiblerow
--- application/core/QuestionTypes/ArrayFlexibleRow/RenderArrayFlexibleRow.php	2023-10-18 17:38:24.807653087 +0200
+++ application/core/QuestionTypes/ArrayFlexibleRow/RenderArrayFlexibleRow.php	2023-10-18 17:42:10.247645126 +0200
@@ -299,7 +299,6 @@
                     'ld'                     => '',
                     'code' => $oAnswer->code,
                     'label'                  => gT('No answer'),
-                    'checked'                => (is_null($value) || $value === '') ? 'checked' : '',
                 );
             }
 
# array 5 point choice, array 10 point choice, array increase same decrease, array yes no uncertain, array by column, yesno, gender
--- application/helpers/qanda_helper.php.orig	2023-09-27 17:48:55.679676491 +0200
+++ application/helpers/qanda_helper.php	2023-10-18 18:17:35.139570096 +0200
@@ -2524,9 +2524,6 @@
     $noAnswer = false;
     if (($ia[6] != 'Y' && $ia[6] != 'S') && SHOW_NO_ANSWER == 1) {
         $noAnswer = true;
-        if (empty($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$ia[1]])) {
-            $naChecked = CHECKED;
-        }
     }
 
     $aQuestionAttributes = QuestionAttribute::model()->getQuestionAttributes($ia[0]);
@@ -2537,7 +2534,6 @@
         'basename' => $ia[1],
         'yChecked' => $yChecked,
         'nChecked' => $nChecked,
-        'naChecked' => $naChecked,
         'noAnswer' => $noAnswer,
         'value' => $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$ia[1]],
         'displayType' => $displayType,
@@ -2568,9 +2564,6 @@
     $displayType            = (int) $aQuestionAttributes['display_type'];
     if (($ia[6] != 'Y' && $ia[6] != 'S') && SHOW_NO_ANSWER == 1) {
         $noAnswer = true;
-        if ($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$ia[1]] == '') {
-            $naChecked = CHECKED;
-        }
     }
 
     $noAnswer = $noAnswer ?? false;
@@ -2580,7 +2573,6 @@
         'basename'               => $ia[1],
         'fChecked'               => $fChecked,
         'mChecked'               => $mChecked,
-        'naChecked'              => $naChecked,
         'noAnswer'               => $noAnswer,
         'value'                  => $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$ia[1]],
     );
@@ -2773,14 +2773,12 @@
 
         // ==>tds
         if (($isNotYes && $isNotS) && $showNoAnswer) {
-            $CHECKED = (!isset($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname]) || $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname] == '') ? 'CHECKED' : '';
             $answer_tds .= doRender('/survey/questions/answer/arrays/5point/rows/cells/answer_td_input', array(
                 'i' => "",
                 'labelText' => gT('No answer'),
                 'myfname' => $myfname,
                 'basename' => $ia[1],
                 'code' => '',
-                'CHECKED' => $CHECKED,
                 'checkconditionFunction' => $checkconditionFunction,
                 'value' => '',
                 ), true);
@@ -2944,7 +2942,6 @@
         }
 
         if ($ia[6] != "Y" && SHOW_NO_ANSWER == 1) {
-            $CHECKED = (!isset($_SESSION['survey_' . $iSurveyId][$myfname]) || $_SESSION['survey_' . $iSurveyId][$myfname] == '') ? 'CHECKED' : '';
             $answer_tds .= doRender(
                 '/survey/questions/answer/arrays/10point/rows/cells/answer_td_input',
                 array(
@@ -2953,7 +2950,6 @@
                     'myfname' => $myfname,
                     'basename' => $ia[1],
                     'code' => '',
-                    'CHECKED' => $CHECKED,
                     'value' => '',
                 ),
                 true
@@ -3065,7 +3061,6 @@
             $Ychecked  = (isset($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname]) && $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname] == 'Y') ? 'CHECKED' : '';
             $Uchecked  = (isset($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname]) && $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname] == 'U') ? 'CHECKED' : '';
             $Nchecked  = (isset($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname]) && $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname] == 'N') ? 'CHECKED' : '';
-            $NAchecked = (!isset($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname]) || $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname] == '') ? 'CHECKED' : '';
 
             $sRows .= doRender('/survey/questions/answer/arrays/yesnouncertain/rows/answer_row', array(
                 'basename'               => $ia[1],
@@ -3075,7 +3070,6 @@
                 'Ychecked'               => $Ychecked,
                 'Uchecked'               => $Uchecked,
                 'Nchecked'               => $Nchecked,
-                'NAchecked'              => $NAchecked,
                 'value'                  => $value,
                 'checkconditionFunction' => $checkconditionFunction,
                 'error'                  => $error,
@@ -3168,7 +3162,6 @@
         $Ichecked       = (isset($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname]) && $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname] == 'I') ? 'CHECKED' : '';
         $Schecked       = (isset($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname]) && $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname] == 'S') ? 'CHECKED' : '';
         $Dchecked       = (isset($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname]) && $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname] == 'D') ? 'CHECKED' : '';
-        $NAchecked      = (!isset($_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname]) || $_SESSION['survey_' . Yii::app()->getConfig('surveyID')][$myfname] == '') ? 'CHECKED' : '';
         $no_answer      = (($ia[6] != 'Y' && $ia[6] != 'S') && SHOW_NO_ANSWER == 1) ? true : false;
 
         $sRows .= doRender('/survey/questions/answer/arrays/increasesamedecrease/rows/answer_row', array(
@@ -3179,7 +3172,6 @@
             'Ichecked' => $Ichecked,
             'Schecked' => $Schecked,
             'Dchecked' => $Dchecked,
-            'NAchecked' => $NAchecked,
             'value' => $value,
             'checkconditionFunction' => $checkconditionFunction,
             'error' => $error,
@@ -4411,11 +4403,6 @@
                         $_SESSION['survey_' . App()->getConfig('surveyID')][$myfname] === $ansrow['code']
                     ) {
                         $aData['checked'][$ansrow['code']][$ld] = CHECKED;
-                    } elseif (
-                        !isset($_SESSION['survey_' . App()->getConfig('surveyID')][$myfname]) &&
-                        $ansrow['code'] == ''
-                    ) {
-                        $aData['checked'][$ansrow['code']][$ld] = CHECKED;
                     // Humm.. (by lemeur), not sure this section can be reached
                         // because I think $_SESSION['survey_'.Yii::app()->getConfig('surveyID')][$myfname] is always set (by save.php ??) !
                         // should remove the !isset part I think !!
# array dual scale
--- application/core/QuestionTypes/ArrayMultiscale/RenderArrayMultiscale.php	2023-10-18 18:35:23.024290497 +0200
+++ application/core/QuestionTypes/ArrayMultiscale/RenderArrayMultiscale.php	2023-10-18 18:36:22.587268833 +0200
@@ -319,31 +319,6 @@
             }
 
             $aData['answertextright'] = $answertextright;
-            if ($aData['shownoanswer']) {
-                if (count($aData['labelans1']) > 0) {
-                    $fname1value = $this->getFromSurveySession($myfname1);
-                    // If value is empty, notset should be checked.
-                    // string "0" should be considered as valid answer,
-                    // so notset should not be checked in that case.
-                    if ($fname1value !== '0' && empty($fname1value)) {
-                        #$answer .= CHECKED;
-                        $aData['aSubQuestions'][$i]['myfname1_notset'] = CHECKED;
-                    } else {
-                        $aData['aSubQuestions'][$i]['myfname1_notset'] = "";
-                    }
-                } else {
-                    $fname0value = $this->getFromSurveySession($myfname0);
-                    // If value is empty, notset should be checked.
-                    // string "0" should be considered as valid answer,
-                    // so notset should not be checked in that case.                   
-                    if ($fname0value !== '0' && empty($fname0value)) {
-                        //$answer .= CHECKED;
-                        $aData['aSubQuestions'][$i]['myfname0_notset'] = CHECKED;
-                    } else {
-                        $aData['aSubQuestions'][$i]['myfname0_notset'] = '';
-                    }
-                }
-            }
             $fn++;
         }
     }
--- application/core/QuestionTypes/5PointChoice/RenderFivePointChoice.php	2023-11-08 18:13:14.243657989 +0100
+++ application/core/QuestionTypes/5PointChoice/RenderFivePointChoice.php	2023-11-08 18:19:53.291643899 +0100
@@ -49,7 +49,6 @@
                 'id'                     => $this->sSGQA,
                 'labelText'              => gT('No answer'),
                 'itemExtraClass'         => 'noanswer-item',
-                'checkedState'           => (!$this->mSessionValue ? ' CHECKED ' : ''),
                 'checkconditionFunction' => $this->checkconditionFunction,
             );
         }
no_answer_not_default-2.patch (12,600 bytes)   
DenisChenu

DenisChenu

2023-11-27 08:39

developer   ~78715

Again :

It is perfectly acceptable for the radio group to have no default selection

https://ux.stackexchange.com/questions/76181/radio-buttons-with-none-selected/76182#76182

Else : if need any patch need a question attribute ! “Select no answer by default” to On by default

tbart

tbart

2023-11-28 12:32

reporter   ~78766

Yeah. Removing the default state like in my patch and providing an extra option “Select no answer by default” as Denis mentioned would even solve the argument of backwards compatibility brought up above. It could be preselected if anyone really wants this. This would set the behavior to the one currently implemented but would allow people to use the scientifically accepted way of not defaulting to "no answer". They simply can't at the moment without massive patching.

You don't get paper questionnaires with pre-marked answer options and a rubber/eraser for you to erase them again, do you?

DenisChenu

DenisChenu

2023-11-28 15:26

developer   ~78767

would allow people to use the scientifically accepted way of not defaulting to "no answer"

Of you want a scientific behavior : use mandatory question with a No answer

You don't get paper questionnaires with pre-marked answer options and a rubber/eraser for you to erase them again, do you?

Never compare paper and web : this has nothing to do.

f_funke

f_funke

2023-11-29 10:20

developer   ~78798

Hi guys,
Thanks for bringing up that topic again". I still consider the pre-selection as really bad - the reasons have been mentioned in detail above. Each time I do consultation I have to tell clients that they should not use the no answer feature because it is so poorly implemented.

Making distinctions between different types of non-response (e.g., implicit vs. explicit nonresponse) is something LimeSurvey currently is not really good at - just take a look at other survey tools.

I cannot stress how wrong the current implementation is as it fosters non-response, leads to a systematic bias in data, and prevents identifying lurkers.

DenisChenu

DenisChenu

2023-11-29 10:26

developer   ~78799

Last edited: 2023-11-29 10:27

Else : if need any patch need a question attribute ! “Select no answer by default” to On by default

Except what about the value to save for no answer …

Currently : we save "" for no answer and NULL for hidden by condition.

With this settings to OFF (no answer not selected) : we save NULL ?
We can save -no- (like -oth-) since - is disable for answer code. But only for single choice then 'and only if “Select no answer by default” is OFF
There are no difference for TEXT question or multiple choice question (and more for numerical or date questions where it's always NULL for noanswer or hidden)

I can take it (as a new feature) if needed and if someone give advice here.

DenisChenu

DenisChenu

2023-11-29 11:28

developer   ~78801

Oh ! Better solution

Survey settings (the can be global/group etc)
No answer

  • Hide (currently Show no answer to No)
  • Show selected (currently Show no answer to Yes)
  • Show un-selected (New option)

Questions settings for single choice (radio)
No answer

  • Use survey option (default)
  • Hide
  • Show
  • Show un-selected

If Show un-selected: not updated save as "" selected 'No answer" save as "-no-"
If Hide or Show : save as "" (no breaking API update : it's a Y update in X.Y.Z)

Then : can use Show un-selected in all survey in an instance very quick

tbart

tbart

2023-12-07 15:34

reporter   ~78913

Sounds reasonable.
I'd however even consider making this a global option, not (only) per survey (but maybe additionally to individual per survey settings).
I imagine there are many people who want this as a default for all surveys.

DenisChenu

DenisChenu

2023-12-07 15:39

developer   ~78915

@f_funke : you get the idea of the new feature ?
I'm happy to take oit, but not before January personally.

Issue History

Date Modified Username Field Change
2019-08-04 14:35 f_funke New Issue
2019-08-05 15:21 cdorin Assigned To => p_teichmann
2019-08-05 15:21 cdorin Status new => assigned
2019-09-09 10:07 c_schmitz Priority none => urgent
2019-09-09 10:16 c_schmitz Assigned To p_teichmann => lime_release_bot
2019-09-09 10:17 c_schmitz Status assigned => new
2019-09-09 10:42 c_schmitz Tag Attached: sprint
2019-09-18 15:29 cdorin Note Added: 53629
2019-09-19 09:00 f_funke Note Added: 53648
2019-09-19 09:54 DenisChenu Note Added: 53651
2019-09-19 10:12 f_funke Note Added: 53652
2019-09-19 10:48 DenisChenu File Added: Capture d’écran du 2019-09-19 10-46-12.png
2019-09-19 10:48 DenisChenu File Added: Capture d’écran du 2019-09-19 10-46-20.png
2019-09-19 10:48 DenisChenu Note Added: 53653
2019-09-19 10:50 DenisChenu Note Edited: 53653
2019-09-19 10:53 DenisChenu Note Added: 53654
2019-09-19 11:11 cdorin Project Bug reports => Feature requests
2019-09-19 11:11 cdorin Tag Detached: sprint
2019-09-19 11:11 cdorin Priority urgent => normal
2019-09-19 11:11 cdorin Severity @60@ => feature
2019-09-19 11:14 cdorin Note Added: 53655
2019-11-25 15:49 Mazi Note Added: 54773
2019-11-25 17:23 holch Note Added: 54778
2019-11-29 09:33 f_funke Note Added: 54886
2019-11-29 14:21 holch Note Added: 54890
2019-11-29 15:28 Mazi Note Added: 54891
2022-03-09 20:45 andyrue Issue Monitored: andyrue
2022-03-09 20:45 andyrue Bug heat 10 => 12
2022-03-09 20:46 guest Bug heat 12 => 18
2023-08-23 12:10 BogdanVoicu Issue Monitored: BogdanVoicu
2023-08-23 12:10 BogdanVoicu Bug heat 18 => 20
2023-08-23 12:12 guest Bug heat 20 => 26
2023-10-11 18:24 tbart Note Added: 77638
2023-10-11 18:24 tbart File Added: no_answer_not_default.patch
2023-10-11 18:24 tbart Bug heat 26 => 28
2023-11-24 21:56 tbart Note Added: 78712
2023-11-24 21:56 tbart File Added: no_answer_not_default-2.patch
2023-11-27 08:39 DenisChenu Note Added: 78715
2023-11-28 12:32 tbart Note Added: 78766
2023-11-28 15:26 DenisChenu Note Added: 78767
2023-11-29 10:20 f_funke Note Added: 78798
2023-11-29 10:21 f_funke Priority normal => urgent
2023-11-29 10:21 f_funke Story point estimate => 0
2023-11-29 10:21 f_funke Users affected % => 0
2023-11-29 10:26 DenisChenu Note Added: 78799
2023-11-29 10:27 DenisChenu Note Edited: 78799
2023-11-29 11:28 DenisChenu Note Added: 78801
2023-12-07 15:34 tbart Note Added: 78913
2023-12-07 15:39 DenisChenu Note Added: 78915