Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions js/AdaptModelSet.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import ScoringSet from './ScoringSet';
import {
isAvailableInHierarchy
} from './utils';

export default class AdaptModelSet extends ScoringSet {

Expand Down Expand Up @@ -55,15 +58,22 @@ export default class AdaptModelSet extends ScoringSet {
/**
* @override
*/
get models() {
get rawModels() {
return [this.model];
}

/**
* @override
*/
get isAvailable() {
return isAvailableInHierarchy(this.model);
}

/**
* @override
*/
get isComplete() {
return this._model.get('_isComplete');
return this.model.get('_isComplete');
}

/**
Expand All @@ -85,4 +95,3 @@ export default class AdaptModelSet extends ScoringSet {
*/
onPassed() {}
}

66 changes: 38 additions & 28 deletions js/ScoringSet.js
Original file line number Diff line number Diff line change
Expand Up @@ -207,40 +207,32 @@ export default class ScoringSet extends Backbone.Controller {
}

/**
* Returns a unique array of models, filtered for `_isAvailable` and intersecting subsets hierarchies
* Always finish by calling `this.filterModels(models)`
* Returns all models regardless of `_isAvailable`
* @returns {[Backbone.Model]}
*/
get models() {
Logging.error(`models must be overriden for ${this.constructor.name}`);
}

/**
* Check to see if there are any child models
* @returns {boolean}
*/
get isPopulated() {
return Boolean(this.models?.length);
}

get isNotPopulated() {
return (this.isPopulated === false);
get rawModels() {
Logging.error(`rawModels must be overriden for ${this.constructor.name}`);
}

/**
* Returns all component models regardless of `_isAvailable`
* @returns {[ComponentModel]}
*/
get rawComponents() {
return this.model.findDescendantModels('component');
return this.rawModels.reduce((components, model) => {
const models = model.isTypeGroup('component')
? [model]
: model.findDescendantModels('component');
return components.concat(models);
}, []);
}

/**
* Returns all question models regardless of `_isAvailable`
* @returns {[QuestionModel]}
*/
get rawQuestions() {
return this.model.findDescendantModels('question');
return this.rawComponents.filter(model => model.isTypeGroup('question'));
}

/**
Expand All @@ -251,15 +243,21 @@ export default class ScoringSet extends Backbone.Controller {
return this.rawComponents.filter(model => !model.isTypeGroup('question'));
}

/**
* Returns a unique array of models, filtered for `_isAvailable` and intersecting subsets hierarchies
* Always finish by calling `this.filterModels(models)`
* @returns {[Backbone.Model]}
*/
get models() {
return this.filterModels(this.rawModels);
}

/**
* Returns all `_isAvailable` component models
* @returns {[ComponentModel]}
*/
get components() {
return this.models.reduce((components, model) => {
model.isTypeGroup('component') ? components.push(model) : components.push(...model.findDescendantModels('component'));
return components;
}, []).filter(isAvailableInHierarchy);
return this.rawComponents.filter(isAvailableInHierarchy);
}

/**
Expand All @@ -275,15 +273,15 @@ export default class ScoringSet extends Backbone.Controller {
* @returns {[QuestionModel]}
*/
get questions() {
return this.components.filter(model => model.isTypeGroup('question'));
return this.rawQuestions.filter(isAvailableInHierarchy);
}

/**
* Returns all `_isAvailable` presentation component models
* @returns {[QuestionModel]}
* @returns {[ComponentModel]}
*/
get presentationComponents() {
return this.components.filter(model => !model.isTypeGroup('question'));
return this.rawPresentationComponents.filter(isAvailableInHierarchy);
}

/**
Expand Down Expand Up @@ -357,23 +355,23 @@ export default class ScoringSet extends Backbone.Controller {
* @returns {boolean}
*/
get canReset() {
return false
return false;
}

/**
* Returns whether the set is optional
* @returns {boolean}
*/
get isOptional() {
return false
return false;
}

/**
* Returns whether the set is available
* @returns {boolean}
*/
get isAvailable() {
return true
return true;
}

/**
Expand All @@ -400,6 +398,18 @@ export default class ScoringSet extends Backbone.Controller {
return (this.isPassed === false);
}

/**
* Check to see if there are any child models
* @returns {boolean}
*/
get isPopulated() {
return Boolean(this.models?.length);
}

get isNotPopulated() {
return (this.isPopulated === false);
}

/**
* Define the objective for reporting purposes
* @protected
Expand Down
2 changes: 1 addition & 1 deletion js/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ export function getSubsetsByType(type, subsetParent = undefined) {
*/
export function getSubsetsByModelId(id, subsetParent = undefined) {
const models = [Data.findById(id)];
let sets = getRawSets(subsetParent).filter(set => hasIntersectingHierarchy(set.models, models));
let sets = getRawSets(subsetParent).filter(set => hasIntersectingHierarchy(set.rawModels, models));
if (subsetParent) {
// Create intersection sets between the found sets and the subsetParent
sets = sets.map(set => createIntersectionSubset([subsetParent, set]));
Expand Down
Loading