API
- Core
- Tasks
- Examples
The miManager is responsible for managing several MinnoJS tasks sequentially.
Tasks
The basic unit in miManager is the task. There are many types of tasks available, and you can also create custom tasks of your own. Tasks are defined within the sequence just like any other element, and you can use mixers, inheritance, and templates to control their flow.
For example, following is a manager sequence with two subsequent tasks - first a questionnaire, then a time-sensitive tasks.
API.addSequence([
{ type: 'quest', name: 'race-questionnaire', scriptUrl:'race.quest.html'},
{ type: 'time', name: 'race-iat', scriptUrl:'iat.html'}
]);
Task types
Minno time supports many types of tasks
(though by far the most extensive are quest
and time
).
Following is a list of tasks types, follow the link to learn how to use them.
Task | Description |
---|---|
Time | Almost any time-sensitive task you can imagine |
Questionnaire | A full fledged questionnaire |
Allow Leaving | Control the mechanism preventing users from leaving the task by mistake |
Inject Style | Add css styles on the fly |
Is Touch | Ask if the user wants to use the touch interface |
Messages | Display messages and plain HTML to the user |
Post | Post task data to the server |
Post CSV | When using the CSV logger, post data to the server |
Redirect | Redirect user to an external URL |
Set Value | Manipulate environmental variables |
Yes/No | Ask a single Yes/No question |
Task properties
All tasks have some common properties that can be used to customize their behaviour. Following is a list of such properties and a description of their behaviour.
Property | Description |
---|---|
name | Task name. |
type | Type of task (quest,message etc.). |
pre | A function to invoke before the task (may return a promise). |
load | A function to invoke as soon as the task is loaded (may return a promise). |
post | A function to invoke after the task (may return a promise). |
canvas | A canvas object (as defined under settings) to invoke at the beginning of the task and remove |
title | A string to be used as the page title (the name displayed on the tag). It is reset at the end of the task. |
preText | A template to be expanded before the task |
postText | A template to be expanded after the task |
current | An object that will be merged into the task current object. |
Custom tasks
The miManager allows the creation of custom tasks. The format is fairly simple though you probably need at least some experience with programing for it.
Plugging in
miManager manages the task sequence for you as well as loading the task script (if needed). There are several ways to plug a new task into miManager, the all involve passing the activator function to the manager in various ways.
- You can pass the activator function as a script.
- You can pass it as the play property of the script object ().
- You can set it into the
taskActivateProvider
usingtaskActivateProvider.set(taskName, activatorFunction)
during the configuration stage of the angular flow (This is worth the trouble mainly if you intend to use this task many times).
Activator function
The activator function is the function that is responsible for the activation of your task as well as for the communication with miManager.
It should:
- Run your task (just do whatever you like).
- Return a function that may be used to force the end of the task.
- Call the
done
function whenever it is done.
The activator function is invoked using angular dependency injection, so you can use any of the angular annotation methods to get dependencies.
The following dependencies are supported (as well as all standard angular services):
Service | Description |
---|---|
done | A function that lets the manager know that the task has finished. |
props | An object with all sorts of useful tools. |
$scope | The task scope. |
task | The miManager element that defined this task. |
script | The task script (as defined in task.script or loaded from task.scriptUrl). |
$element | The tasks DOM Node wrapped in jqLite or jQuery. |
global | The global object |
$injector | an angularjs injector (it can allow you to $compile or accesses $rootScope) |
Custom Task Example
The following displays a messages to the user and proceeds to the next task after 5 seconds:
// the define wrapper
define(function(){
// the script object being returned
return {
// custom script content
content: 'Hi there, I\'m your custom message',
// the activator function uses three dependencie
play: function activator(done, script, $element){
var timeoutId = setTimeout(done, 5000);
$element.html(script.content);
// will be called at the end of the task to clean things up
// (whether the end is forced or triggered by 'done')
return function clear(){
clearTimeout(timeoutId);
$element.empty();
};
}
};
});
In order to use it all you have to do is point the task to the correct url:
var taskElement = {scriptUrl:'path/to/script'};
Settings
Settings allow you to control the generic way that the player works. Change the settings using the addSettings
function. The first argument to the function is always the name of the setting, the second argument is the setting values. In case the setting is an object, subsequent objects will extend each other so that settings may be progressively added.
All the functions within settings are invoked using angular. This means that you have access to any service you like, as well as some specific assets. In order to access the services simply use arguments with the appropriate name. For instance, this is how you would access $rootScope
:
function onEnd($rootScope){
$rootScope.$emit('end!!');
}
canvas
canvas
takes an object that describes the style of the task environment. Each property of the object changes a different style element.
Property | Changes |
---|---|
background | The overall background color. |
canvasBackground | Default canvas background color. |
fontColor | Default font color. |
fontSize | Default font size. |
API.addSettings('canvas', {
fontSize: '2em'
});
In case you need to fine tune the styles even further you can add css rules into the raw HTML. Support for dynamically adding CSS is planned but not yet supported.
injectStyle
Injects a string of css into the page.
API.addSettings('injectStyle', '[pi-quest] label {font-size:1.2em; font-weight:normal;}');
onPreTask
onPreTask
is a function to be called before each task is called.
API.addSettings('onPreTask', function(currentTask){
doSomethingWith(currentTask);
});
Asset | Description |
---|---|
currentTask | The current task object |
prevTask | The previous task object (this may be used as a post task action as well...) |
onEnd
onEnd
is a function to be called as soon as the task sequence ends.
API.addSettings('onEnd', function(){
// Do something: for instance, redirect to 'my/url.html'
location.href = 'my/url.html';
});
Asset | Description |
---|---|
currentTask | The current (last) task object |
title
title
is a string to be used as the page title (the name displayed on the tag).
API.addSettings('title', 'My Manager Title');
preloadImages
Accepts an array of image urls to preload. The manager will not wait until all images are loaded, but it will make images displayed later in the manager sequence be displayed significantly faster.
API.addSettings('preloadImages', ['my/image/url/imageName.png', 'my/other/url/otherImage.jpg']);
skip
Whether to activate the skip and refresh option. If activated, clicking ctrl r
reloads the current task (this feature may not be supported on older browsers), clicking escape
and then the right or left arrows skips to the next or previous tasks.
API.addSettings('skip', true);
skin
Add a skin to your project. Skins change the way that your tasks look. Currently the only skins that we support are simple
and demo
.
API.addSettings('skin', 'demo');
rtl
Setting rtl to true
will change the layout of the player to right to left in order to ocomodate right to left languages such as arabic and hebrew.
API.addSettings('rtl', true);
logger
The logger allows control of logging activities.
Folowing are the properties available for the logger:
property | description |
---|---|
url | The url to send to. If it is not set, data will not be sent. |
type | The strategy to use for sending logs to the server. See options below. |
pulse | Allows you to post your data in pulses of "pulse" logs instead of all at the end of the task (Does not work for csv logger). |
API.addSettings('logger', {
url: '/manager/data',
type:'new',
pulse: 20
});
By deafault the logger posts according to the Project Implicit server rules (old).
You can change the logging style by setting the logger type
as follows:
type | description |
---|---|
old | Uses the post strategy implemented by the old PI server |
new | Uses the post strategy implemented by the new server |
csv | Posts all data as CSV at the end of the manager. If you are creating a manager that does not fully complete (for instance, when you have a message as your last page), use the postCSV task in addition to settings the log type to csv. |
debug | Logs all posts to the console. Do not do this in production! These logs aren't posted to the server at all! |
You can change the logging strategy or even create new strategies. Doing this is rather advanced and is documented here.
DEBUG
The DEBUG
settings allows you to control the debug messages produced by the player.
In the development environment (when window.DEBUG
is set to true
) you have access to a development console.
The console will hold messages describing the process of your studies.
At the top of the console window you will see a dropdown that allows you to select the level of logging you would like to see. For example, you may want to be alerted only of errors, or of every possible activity of the player. In addition you have a button that allows you to close and open the console.
Property | Description |
---|---|
hideConsole | (true or false) hide console activity |
API.addSettings('DEBUG', { hideConsole: true});
Inheritance
miManager uses the same inheritance system used by miQuest.
It has one type of set: the task set. In order to create task sets use API.addTasksSet(set, list)
.
Project Implicit Build
mTurk
The project implicit build has a feature for integration with mTurk.
All you have to do is add The following code to your project, replacing the <id#>
tags with the appropriate data of course.
The player will redirect the users back to mTurk immediately after the final task in the manager (as defined by the last
property).
Setting the isProduction
property allows you to switch between the development and production urls for mTurk.
API.addGlobal({
$mTurk: {
assignmentId:'<id#>',
hitId:'<id#>',
workerId:'<id#>',
isProduction: true
}
});
License: Apache 2. © Project Implicit. · Current version [version]