diff src/DML/MainVisBundle/Resources/assets/marionette/modules/ContextModule/ContextModule.11-State.js @ 0:493bcb69166c

added public content
author Daniel Wolff
date Tue, 09 Feb 2016 20:54:02 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/DML/MainVisBundle/Resources/assets/marionette/modules/ContextModule/ContextModule.11-State.js	Tue Feb 09 20:54:02 2016 +0100
@@ -0,0 +1,126 @@
+"use strict";
+
+App.module("ContextModule", function(ContextModule, App, Backbone, Marionette, $, _, Logger) {
+
+    // Define private variables
+    var logger = null;
+
+    ContextModule.addInitializer(function(options){
+
+        logger = Logger.get("ContextModule.State");
+        logger.setLevel(Logger.WARN);
+
+        /**
+         * State stores the configuration of the entire vis interface, i.e.
+         * the contents of both entity config grids (collections & recordings)
+         *
+         * The state can be serialized and unserialized, and this allows for
+         * undo / redo mechanism to be implemented.
+         */
+        ContextModule.State = Backbone.Model.extend({
+            defaults: {
+                musicCollectionGrid: null,
+                musicRecordingGrid: null
+            },
+
+            /**
+             * @memberOf App.ContextModule.State
+             */
+            initialize: function() {
+                this._modificationPropagationEnabled = true;
+                this._attributesWereModified = false;
+
+                this.attributes.musicCollectionGrid = new ContextModule.ConfigGrid("collection");
+                this.attributes.musicRecordingGrid = new ContextModule.ConfigGrid("recording");
+
+                this.attributes.musicCollectionGrid.bind("change", this._registerModificationOfAttribute, this);
+                this.attributes.musicRecordingGrid.bind("change", this._registerModificationOfAttribute, this);
+            },
+
+            /**
+             * @memberOf App.ContextModule.State
+             */
+            getConfigGridByType: function(type) {
+                switch (type) {
+                    case "recordings":
+                        return this.attributes.musicRecordingGrid;
+                    case "collections":
+                        return this.attributes.musicCollectionGrid;
+                    default:
+                        return null;
+                }
+            },
+
+            /**
+             * @memberOf App.ContextModule.State
+             */
+            getConfigGridBeingShown: function() {
+                return this.attributes.musicRecordingsGridIsShown
+                    ? this.attributes.musicRecordingGrid
+                    : this.attributes.musicCollectionGrid;
+            },
+
+            /**
+             * @memberOf App.ContextModule.State
+             */
+            serialize: function() {
+                logger.debug("method called: State::serialize");
+
+                var result = {
+                        musicCollectionGrid: this.attributes.musicCollectionGrid.serialize(),
+                        musicRecordingGrid: this.attributes.musicRecordingGrid.serialize()
+                };
+
+                if (this.attributes.musicRecordingsGridIsShown) {
+                    result.musicRecordingsGridIsShown = true;
+                }
+
+                return result;
+            },
+
+            /**
+             * @memberOf App.ContextModule.State
+             */
+            unserialize: function(serializedAttributes) {
+                logger.debug("method called: State::unserialize");
+                this._modificationPropagationEnabled = false;
+                this._attributesWereModified = false;
+
+                var fixedSerializedAttributes = serializedAttributes;
+                if (!_.isSimpleObject(fixedSerializedAttributes)) {
+                    logger.warn("State::unserialize called for not an object: ", serializedAttributes);
+                    fixedSerializedAttributes = {};
+                }
+                this.attributes.musicCollectionGrid.unserialize(fixedSerializedAttributes.musicCollectionGrid);
+                this.attributes.musicRecordingGrid.unserialize(fixedSerializedAttributes.musicRecordingGrid);
+
+                if (this.attributes.musicRecordingsGridIsShown !== fixedSerializedAttributes.musicRecordingsGridIsShown) {
+                    this._attributesWereModified = true;
+                }
+                if (fixedSerializedAttributes.musicRecordingsGridIsShown) {
+                    this.attributes.musicRecordingsGridIsShown = true;
+                } else {
+                    delete this.attributes.musicRecordingsGridIsShown;
+                }
+
+                this._triggerModificationEventsIfNeeded();
+                this._modificationPropagationEnabled = true;
+            },
+
+            _registerModificationOfAttribute: function() {
+                this._attributesWereModified = true;
+                if (this._modificationPropagationEnabled) {
+                    this._triggerModificationEventsIfNeeded();
+                };
+            },
+
+            _triggerModificationEventsIfNeeded: function() {
+                if (this._attributesWereModified) {
+                    this.trigger("change");
+                }
+                this._attributesWereModified = false;
+            },
+        });
+
+    });
+}, Logger);