Files
XZBT-NGN/test-fixtures/reference-exhibits/museum-gallery/exhibit.js
T

72 lines
2.0 KiB
JavaScript

/*
* Museum Gallery — domain model.
*
* Deliberately tiny (Step 6.2 brief: "prove the architecture, not to be
* visually elaborate"). No DOM, no contract awareness, no transport — a
* plain state object with absolute, idempotent setters, exactly the same
* shape as Aquarium's and Haunted House's exhibit models.
*/
(function () {
'use strict';
var ARTIFACTS = ['the-orrery', 'star-map', 'meteorite'];
var ARTIFACT_LABELS = {
'the-orrery': 'The Orrery',
'star-map': 'Star Map',
meteorite: 'Meteorite Fragment'
};
function Gallery() {
this.artifact = ARTIFACTS[0];
this.lightingLevel = 0.6;
this.rotationSpeed = 0.4;
this.labelsEnabled = true;
this.spotlightFlashCount = 0;
}
Gallery.prototype.setArtifact = function (value) {
if (ARTIFACTS.indexOf(value) === -1 || this.artifact === value) return { changed: false };
this.artifact = value;
return { changed: true };
};
Gallery.prototype.setLightingLevel = function (value) {
if (this.lightingLevel === value) return { changed: false };
this.lightingLevel = value;
return { changed: true };
};
Gallery.prototype.setRotationSpeed = function (value) {
if (this.rotationSpeed === value) return { changed: false };
this.rotationSpeed = value;
return { changed: true };
};
Gallery.prototype.setLabelsEnabled = function (value) {
if (this.labelsEnabled === value) return { changed: false };
this.labelsEnabled = value;
return { changed: true };
};
Gallery.prototype.read = function (id) {
switch (id) {
case 'artifact.selected': return this.artifact;
case 'lighting.level': return this.lightingLevel;
case 'rotation.speed': return this.rotationSpeed;
case 'labels.enabled': return this.labelsEnabled;
default: return null;
}
};
Gallery.prototype.flashSpotlight = function () {
this.spotlightFlashCount += 1;
return { ok: true };
};
window.MuseumGalleryExhibit = {
Gallery: Gallery,
ARTIFACTS: ARTIFACTS,
ARTIFACT_LABELS: ARTIFACT_LABELS
};
})();