Last Option In Array (Numbers) (Checkboxes) Row Excludes All Others

More
4 months 4 weeks ago #167886 by krosser
krosser replied the topic: Last Option In Array (Numbers) (Checkboxes) Row Excludes All Others
Actually, I've made a test survey instead of that single question in LSQ.
:)

I'm using the latest LS 3.14 hosted on LS servers, not installed locally.
Attachments:

Please Log in or Create an account to join the conversation.

More
4 months 3 weeks ago - 4 months 3 weeks ago #168089 by tpartner
tpartner replied the topic: Last Option In Array (Numbers) (Checkboxes) Row Excludes All Others
To render specific array columns as exclusive in 3.x...

1) Place this in your theme custom.js file:

// A jQuery plugin to render column(s) in checkbox arrays exclusive
(function( $ ){
 
	$.fn.cbExclusiveColumns = function(options) {  
 
		var opts = $.extend( {
			//columns: [3,4] // Column(s) to be exclusive (comma-separated) 
		}, options);
 
		return this.each(function() { 
 
			var thisQuestion = $(this)
 
			// Add some classes to the checkbox cells
			$('td.answer-item', thisQuestion).addClass('normal-item');
			$('tr.subquestion-list', thisQuestion).each(function(i) {
				var thisRow = $(this);
				$.each(opts.columns, function(i, val) {
					$('td.answer-item:eq('+(val-1)+')', thisRow).removeClass('normal-item').addClass('exclusive-item');
				});
			});
 
			// A listener on the checkboxes
			$('input[type="checkbox"]', thisQuestion).on('change', function (event) {
				handleExclusive($(this).closest('td'));
			});
 
			function handleExclusive(thisCell) {
 
				var thisRow = $(thisCell).closest('tr');
 
				// Uncheck the appropriate boxes in a row
				if ($(thisCell).hasClass('normal-item')) {
					$('.exclusive-item input[type="checkbox"]', thisRow).prop('checked', false);
					$('.exclusive-item input[type="text"]', thisRow).val('');
				}
				else {
					$('.answer-item', thisRow).not(thisCell).find('input[type="checkbox"]').prop('checked', false);
					$('.answer-item', thisRow).not(thisCell).find('input[type="text"]').val('');
				}
 
				// Check conditions (relevance)
				$('td.answer-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');
				});
			}
		});
 
	};
})( jQuery );


2) Place something like this in the source of the question (in this case, columns 3 and 4 will be exclusive):

<script type="text/javascript" charset="utf-8">
	$(document).on('ready pjax:scriptcomplete',function(){
		$('#question{QID}').cbExclusiveColumns({
			columns: [3,4] // Column(s) to be exclusive (comma-separated)
		});
	});
</script>

Cheers,
Tony Partner
Solutions, code and workarounds presented in these forums are given without any warranty, implied or otherwise.
Last Edit: 4 months 3 weeks ago by tpartner.
The following user(s) said Thank You: krosser

Please Log in or Create an account to join the conversation.

More
4 months 3 weeks ago #168101 by krosser
krosser replied the topic: Last Option In Array (Numbers) (Checkboxes) Row Excludes All Others
Have just tested it and it works nicely! Many thanks for your help, Tony!!

I'm using the latest LS 3.14 hosted on LS servers, not installed locally.

Please Log in or Create an account to join the conversation.

Start now!

Just create your account and start using Limesurvey today.

Register now
Join our Newsletter!