/** * jspsych-free-sort * plugin for drag-and-drop sorting of a collection of images * Josh de Leeuw * * documentation: docs.jspsych.org */ jsPsych.plugins['free-sort'] = (function() { var plugin = {}; jsPsych.pluginAPI.registerPreload('free-sort', 'stimuli', 'image'); plugin.info = { name: 'free-sort', description: '', parameters: { stimuli: { type: jsPsych.plugins.parameterType.STRING, pretty_name: 'Stimuli', default: undefined, array: true, description: 'items to be displayed.' }, stim_height: { type: jsPsych.plugins.parameterType.INT, pretty_name: 'Stimulus height', default: 100, description: 'Height of items in pixels.' }, stim_width: { type: jsPsych.plugins.parameterType.INT, pretty_name: 'Stimulus width', default: 100, description: 'Width of items in pixels' }, scale_factor: { type: jsPsych.plugins.parameterType.FLOAT, pretty_name: 'Stimulus scaling factor', default: 1.5, description: 'How much larger to make the stimulus while moving (1 = no scaling)' }, sort_area_height: { type: jsPsych.plugins.parameterType.INT, pretty_name: 'Sort area height', default: 700, description: 'The height in pixels of the container that subjects can move the stimuli in.' }, sort_area_width: { type: jsPsych.plugins.parameterType.INT, pretty_name: 'Sort area width', default: 700, description: 'The width in pixels of the container that subjects can move the stimuli in.' }, sort_area_shape: { type: jsPsych.plugins.parameterType.STRING, pretty_name: 'Sort area shape', options: ['square','ellipse'], default: 'ellipse', description: 'The shape of the sorting area' }, prompt: { type: jsPsych.plugins.parameterType.STRING, pretty_name: 'Prompt', default: '', description: 'It can be used to provide a reminder about the action the subject is supposed to take.' }, prompt_location: { type: jsPsych.plugins.parameterType.SELECT, pretty_name: 'Prompt location', options: ['above','below'], default: 'above', description: 'Indicates whether to show prompt "above" or "below" the sorting area.' }, button_label: { type: jsPsych.plugins.parameterType.STRING, pretty_name: 'Button label', default: 'Continue', description: 'The text that appears on the button to continue to the next trial.' }, change_border_background_color: { type: jsPsych.plugins.parameterType.BOOL, pretty_name: 'Change border background color', default: true, description: 'If true, the sort area border color will change while items are being moved in and out of '+ 'the sort area, and the background color will change once all items have been moved into the '+ 'sort area. If false, the border will remain black and the background will remain white throughout the trial.' }, border_color_in: { type: jsPsych.plugins.parameterType.STRING, pretty_name: 'Border color - in', default: '#a1d99b', description: 'If change_border_background_color is true, the sort area border will change to this color '+ 'when an item is being moved into the sort area, and the background will change to this color '+ 'when all of the items have been moved into the sort area.' }, border_color_out: { type: jsPsych.plugins.parameterType.STRING, pretty_name: 'Border color - out', default: '#fc9272', description: 'If change_border_background_color is true, this will be the color of the sort area border '+ 'when there are one or more items that still need to be moved into the sort area.' }, border_width: { type: jsPsych.plugins.parameterType.INT, pretty_name: 'Border width', default: null, description: 'The width in pixels of the border around the sort area. If null, the border width '+ 'defaults to 3% of the sort area height.' }, counter_text_unfinished: { type: jsPsych.plugins.parameterType.STRING, pretty_name: 'Counter text unfinished', default: 'You still need to place %n% item%s% inside the sort area.', description: 'Text to display when there are one or more items that still need to be placed in the sort area. '+ 'If "%n%" is included in the string, it will be replaced with the number of items that still need to be moved inside. '+ 'If "%s%" is included in the string, a "s" will be included when the number of items remaining is greater than one.' }, counter_text_finished: { type: jsPsych.plugins.parameterType.STRING, pretty_name: 'Counter text finished', default: 'All items placed. Feel free to reposition items if necessary.', description: 'Text that will take the place of the counter_text_unfinished text when all items have been moved inside the sort area.' }, stim_starts_inside: { type: jsPsych.plugins.parameterType.BOOL, pretty_name: 'Stim starts inside', default: false, description: 'If false, the images will be positioned to the left and right of the sort area when the trial loads. '+ 'If true, the images will be positioned at random locations inside the sort area when the trial loads.' } } } plugin.trial = function(display_element, trial) { var start_time = performance.now(); if (trial.change_border_background_color == false) { trial.border_color_out = "#000000"; } if (trial.border_width == null) { trial.border_width = trial.sort_area_height*.03; } let html = '
'+get_counter_text(trial.stimuli.length)+'