-
Notifications
You must be signed in to change notification settings - Fork 0
/
expBlock.js
117 lines (98 loc) · 3.65 KB
/
expBlock.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// � by Caspar Goeke and Holger Finger
/**
* This class stores an experimental block, that could include different tasks.
*
* @param {ExpData} expData - The global ExpData, where all instances can be retrieved by id.
* @constructor
*/
var ExpBlock = function (expData) {
this.expData = expData;
this.id = ko.observable(guid());
this.name = ko.observable("block_1");
this.type = "ExpBlock";
// the following array is extended with sortById to fix a bug with ko-sortable when adding new sub items in a newly created item:
this.subTasks = ko.observableArray([]).extend({ sortById: { do_not_warn_when_double_entries: true } });
this.editName = ko.observable(false);
this.taskRandomization = ko.observable('fixed'); // fixed, or 'permute' per subject
this.isSeparator = ko.observable(false);
};
ExpBlock.prototype.rename = function (idx, flag, data, event) {
event.stopImmediatePropagation();
if (flag == "true") {
this.editName(true);
}
else if (flag == "false") {
this.editName(false);
}
};
ExpBlock.prototype.addTask = function (task) {
this.subTasks.push(task)
};
ExpBlock.prototype.removeTask = function (task) {
var idx = this.subTasks().indexOf(task);
while (idx > -1) {
this.subTasks.splice(idx, 1);
idx = this.subTasks().indexOf(task); // checking if there are more tasks
}
};
/**
* This function initializes all internal state variables to point to other instances in the same experiment. Usually
* this is called after ALL experiment instances were deserialized using fromJS(). In this function use
* 'entitiesArr.byId[id]' to retrieve an instance from the global list given some unique id.
*
* @param {ko.observableArray} entitiesArr - this is the knockout array that holds all instances.
*/
ExpBlock.prototype.setPointers = function (entitiesArr) {
// convert ids to actual pointers:
this.subTasks(jQuery.map(this.subTasks(), function (id) {
var subTask = entitiesArr.byId[id];
return subTask;
}));
};
/**
* Recursively adds all child objects that have a unique id to the global list of entities.
*
* @param {ko.observableArray} entitiesArr - this is the knockout array that holds all instances.
*/
ExpBlock.prototype.reAddEntities = function (entitiesArr) {
// add the direct child nodes:
jQuery.each(this.subTasks(), function (index, subTask) {
// check if they are not already in the list:
if (!entitiesArr.byId.hasOwnProperty(subTask.id()))
entitiesArr.push(subTask);
// recursively make sure that all deep tree nodes are in the entities list:
if (subTask.reAddEntities)
subTask.reAddEntities(entitiesArr);
});
};
/**
* load from a json object to deserialize the states.
* @param {object} data - the json description of the states.
* @returns {ExpBlock}
*/
ExpBlock.prototype.fromJS = function (data) {
this.id(data.id);
this.name(data.name);
this.subTasks(data.subTasks);
if (data.hasOwnProperty('taskRandomization')) {
this.taskRandomization(data.taskRandomization);
}
if (data.hasOwnProperty('isSeparator')) {
this.isSeparator(data.isSeparator);
}
return this;
};
/**
* serialize the state of this instance into a json object, which can later be restored using the method fromJS.
* @returns {object}
*/
ExpBlock.prototype.toJS = function () {
return {
id: this.id(),
name: this.name(),
type: this.type,
subTasks: jQuery.map(this.subTasks(), function (subTask) { return subTask.id(); }),
taskRandomization: this.taskRandomization(),
isSeparator: this.isSeparator(),
};
};