- Posts: 2
- Thank you received: 0
Welcome to the LimeSurvey Community Forum
Ask the community, share ideas, and connect with other LimeSurvey users!
Array (numbers): randomized order of columns with last column as exclusive optio
- Sidvic
- Topic Author
- Offline
- New Member
Less
More
1 year 9 months ago #230478
by Sidvic
Array (numbers): randomized order of columns with last column as exclusive optio was created by Sidvic
Please help us help you and fill where relevant:
Your LimeSurvey version: 5.3.23+220705
Own server or LimeSurvey hosting: own server
Survey theme/template: fruity
==================
Hi,
First of all, I would like to thank you for the great work you do! The answers in the forum have been very helpful for me throughout the years.
There is just one thing that I am unable to find.
For one array (number) question (see attachment: test survey as lss), I combined two scripts that allow to:
1) randomize the columns
2) make the last column exclusive
The problem is that the last column is also included in the randomization...
Do you maybe have a script or any other solution that allows to:
1) randomize the columns
2) while keeping the last column always at the end
3) allowing in this way the answer option of the column to be the exclusive option (and not the one that happened to be at the end because of rotation)
By the way, in questions which allow multiple answers, when someone clicks on the exclusive option, all the other answers options look kind of "deactivated" and have a less intense color. Is it possible to create the same effect for an array (numbers) question, when the exclusive option is selected?
Thank you very much!
Best regards,
Vik
Your LimeSurvey version: 5.3.23+220705
Own server or LimeSurvey hosting: own server
Survey theme/template: fruity
==================
Hi,
First of all, I would like to thank you for the great work you do! The answers in the forum have been very helpful for me throughout the years.
There is just one thing that I am unable to find.
For one array (number) question (see attachment: test survey as lss), I combined two scripts that allow to:
1) randomize the columns
2) make the last column exclusive
The problem is that the last column is also included in the randomization...
Do you maybe have a script or any other solution that allows to:
1) randomize the columns
2) while keeping the last column always at the end
3) allowing in this way the answer option of the column to be the exclusive option (and not the one that happened to be at the end because of rotation)
By the way, in questions which allow multiple answers, when someone clicks on the exclusive option, all the other answers options look kind of "deactivated" and have a less intense color. Is it possible to create the same effect for an array (numbers) question, when the exclusive option is selected?
Thank you very much!
Best regards,
Vik
Please Log in to join the conversation.
- tpartner
- Offline
- LimeSurvey Community Team
Less
More
- Posts: 10116
- Thank you received: 3597
1 year 9 months ago #230493
by tpartner
Cheers,
Tony Partner
Solutions, code and workarounds presented in these forums are given without any warranty, implied or otherwise.
Replied by tpartner on topic Array (numbers): randomized order of columns with last column as exclusive optio
1) This script will randomize the columns in an array-numbers-checkboxes question while leaving the last column in place:
2) This script will render the last column in an array-numbers-checkboxes question as exclusive and will also disable the non-exclusive items when exclusive is checked:
Sample survey attached:
Code:
<script type="text/javascript" data-author="Tony Partner"> $(document).on('ready pjax:scriptcomplete',function(){ randomArrayNumCols2({QID}); }); // A function to randomize columns in an array-numbers question leaving the last column in place function randomArrayNumCols2(qID){ var thisQuestion = $('#question'+qID); // Index the array columns and identify the last column $('table.subquestion-list tr', thisQuestion).each(function(i) { $('> *', this).each(function(i) { $(this).attr('data-index', i); }); $('> *:last', this).addClass('last-item'); }); // Create an array of the columns var columns = []; $('table.subquestion-list tr[id^="javatbd"]:eq(0) td.answer-item', thisQuestion).each(function(i) { columns.push($(this).attr('data-index')); }); // Shuffle the columns array columns = $.shuffle(columns); // Reposition the row elements $('table.subquestion-list tr', thisQuestion).each(function(i) { var thisRow = $(this); $(columns).each(function(i, val) { thisRow.append($('[data-index="'+val+'"]', thisRow)); thisRow.append($('.col-no-answer', thisRow)); }); thisRow.append($('.last-item', thisRow)); }); } // A function to shuffle elements or contents of arrays (function($){ $.fn.shuffle = function() { return this.each(function(){ var items = $(this).children(); return (items.length) ? $(this).html($.shuffle(items)) : this; }); } $.shuffle = function(arr) { for( var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x ); return arr; } })(jQuery); </script>
2) This script will render the last column in an array-numbers-checkboxes question as exclusive and will also disable the non-exclusive items when exclusive is checked:
Code:
<script type="text/javascript" data-author="Tony Partner"> $(document).ready(function() { // Call the exclude function using question ID excludeOpt({QID}); }); // A function to make the last option in each array row exclusive function excludeOpt (qID) { var thisQuestion = $('#question'+qID) // Add some classes to the checkbox cells $('td.checkbox-item', thisQuestion).addClass('normal-item'); $('tr.subquestion-list', thisQuestion).each(function(i) { $('.normal-item:last', this).removeClass('normal-item').addClass('exclusive-item') }); // A listener on the checkboxes $('input[type="checkbox"]', thisQuestion).on('change', function (event) { handleExclusive($(this)); }); function handleExclusive(thisInput) { var thisCell = $(thisInput).closest('td'); var thisRow = $(thisCell).closest('tr'); $('input[type="checkbox"]', thisRow).prop('disabled', false); if(thisInput.is(':checked')) { // Uncheck the appropriate boxes in a row if ($(thisCell).hasClass('normal-item')) { $('.exclusive-item input[type="hidden"]', thisRow).val(''); $('.exclusive-item input[type="checkbox"]', thisRow).prop('checked', false); } else { $('.normal-item input[type="hidden"]', thisRow).val(''); $('.normal-item input[type="checkbox"]', thisRow).prop('checked', false).prop('disabled', true); } // Check conditions (relevance) $('td.checkbox-item', thisRow).each(function(i) { var thisValue = ''; if($('input[type="checkbox"]', this).is(':checked')) { thisValue = 1; } var thisSGQA = $('input[type="checkbox"]', this).attr('id').replace(/cbox_/, ''); $('input[type="hidden"]', this).attr('value', thisValue); fixnum_checkconditions(thisValue, thisSGQA, 'hidden'); }); } } } </script>
Sample survey attached:
Cheers,
Tony Partner
Solutions, code and workarounds presented in these forums are given without any warranty, implied or otherwise.
Please Log in to join the conversation.
- Sidvic
- Topic Author
- Offline
- New Member
Less
More
- Posts: 2
- Thank you received: 0
1 year 9 months ago #230497
by Sidvic
Replied by Sidvic on topic Array (numbers): randomized order of columns with last column as exclusive optio
Hallo tpartner,
thank you very much for your prompt and extremely useful reply. It works so smoothly and exactly as I imagined it.
Thanks again and have a wonderful day,
Vik
thank you very much for your prompt and extremely useful reply. It works so smoothly and exactly as I imagined it.
Thanks again and have a wonderful day,
Vik
Please Log in to join the conversation.