diff --git a/Controller.js b/Controller.js index 728994d..78f598f 100644 --- a/Controller.js +++ b/Controller.js @@ -1,34 +1,103 @@ -(function (skillet, undefined) { - //Private Property - var isHot = true; +/** + * Navigation controller. + * + * @author OMS Development Team + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 * @since 1.0.0 + */ +(function (jsOMS) +{ + "use strict"; - //Public Property - skillet.ingredient = 'Bacon Strips'; + /** @namespace jsOMS.Modules.Navigation.Models */ + jsOMS.Autoloader.defineNamespace('jsOMS.Modules.Navigation'); - //Public Method - skillet.fry = function () { - var oliveOil; - - addItem('tn Butter nt'); - addItem(oliveOil); - console.log('Frying ' + skillet.ingredient); + jsOMS.Modules.Navigation = function () + { + this.navigation = {}; + this.rawNavData = JSON.parse(localStorage.getItem(jsOMS.Modules.Navigation.MODULE_NAME)); + this.rawNavData = this.rawNavData !== null ? this.rawNavData : {}; }; - //Private Method - function addItem(item) { - if (item !== undefined) { - console.log('Adding ' + item); + jsOMS.Modules.Navigation.MODULE_NAME = '1000500001'; + + jsOMS.Modules.Navigation.prototype.bind = function (id) + { + let e = typeof id === 'undefined' ? document.getElementsByClassName('nav') : [document.getElementById(id)], + length = e.length; + + for (let i = 0; i < length; i++) { + this.bindElement(e[i]); } - } + }; -}(window.skillet = window.skillet || {})); + jsOMS.Modules.Navigation.prototype.bindElement = function (e) + { + if (typeof e === 'undefined') { + // todo: do logging here -//Public Properties -console.log(skillet.ingredient); //Bacon Strips + return; + } -//Public Methods -skillet.fry(); //Adding Butter & Fraying Bacon Strips + let extend = e.querySelectorAll('li label'), + self = this; -//Adding a Public Property -skillet.quantity = "12"; -console.log(skillet.quantity); //12 \ No newline at end of file + this.navigation[e.id] = new jsOMS.Modules.Navigation.Models.Navigation(this.rawNavData[e.id]); + + // Bind minimize/maximize + jsOMS.addEventListenerToAll(extend, 'click', function () + { + let box = document.getElementById(this.getAttribute('for')); + + if (!box.checked) { + self.navigation[e.id].setOpen(box.id); + } else { + self.navigation[e.id].setClose(box.id); + } + + localStorage.setItem(jsOMS.Modules.Navigation.MODULE_NAME, JSON.stringify(self.navigation)); + }); + + // On load + let open = this.navigation[e.id].getOpen(); + + for (let key in open) { + if (open.hasOwnProperty(key)) { + document.getElementById(key).checked = open[key]; + } + } + + // Bind show/hide + e.nextElementSibling.addEventListener('change', function () + { + self.navigation[e.id].setVisible(this.checked); + localStorage.setItem(jsOMS.Modules.Navigation.MODULE_NAME, JSON.stringify(self.navigation)); + }); + + // On load + if (!this.navigation[e.id].isVisible()) { + e.nextElementSibling.checked = false; + } + + // Bind scroll + e.addEventListener('scroll', function () + { + self.navigation[e.id].setScrollPosition(this.scrollLeft, this.scrollTop); + localStorage.setItem(jsOMS.Modules.Navigation.MODULE_NAME, JSON.stringify(self.navigation)); + }); + + // On load + e.scrollTop = this.navigation[e.id].getScrollPosition().y; + e.scrollLeft = this.navigation[e.id].getScrollPosition().x; + }; +}(window.jsOMS = window.jsOMS || {})); + +jsOMS.ready(function () +{ + "use strict"; + + let navigation = new jsOMS.Modules.Navigation(); + navigation.bind('nav-side'); +}); \ No newline at end of file diff --git a/Models/Navigation.js b/Models/Navigation.js index e69de29..cd45fa0 100644 --- a/Models/Navigation.js +++ b/Models/Navigation.js @@ -0,0 +1,101 @@ +/** + * Navigation class. + * + * @author OMS Development Team + * @author Dennis Eichhorn + * @copyright 2013 Dennis Eichhorn + * @license OMS License 1.0 + * @version 1.0.0 * @since 1.0.0 + */ +(function (jsOMS) +{ + "use strict"; + + /** @namespace jsOMS.Modules.Navigation.Models */ + jsOMS.Autoloader.defineNamespace('jsOMS.Modules.Navigation.Models'); + + jsOMS.Modules.Navigation.Models.Navigation = function (data) + { + if (typeof data === 'undefined') { + this.scrollPosition = {x: 0, y: 0}; + this.activeLinks = {}; + this.visible = true; + this.openCategories = {}; + } else { + this.scrollPosition = typeof data.scrollPosition === 'undefined' ? {x: 0, y: 0} : data.scrollPosition; + this.activeLinks = typeof data.activeLinks === 'undefined' ? {} : data.activeLinks; + this.visible = typeof data.visible === 'undefined' ? true : data.visible; + this.openCategories = typeof data.openCategories === 'undefined' ? {} : data.openCategories; + } + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.setScrollPosition = function (x, y) + { + this.scrollPosition.x = x; + this.scrollPosition.y = y; + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.getScrollPosition = function () + { + return this.scrollPosition; + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.setOpen = function (id) + { + this.openCategories[id] = true; + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.setClose = function (id) + { + delete this.openCategories[id]; + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.getOpen = function () + { + return this.openCategories; + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.active = function (id) + { + this.allInactive(); + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.allInactive = function () + { + + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.inactive = function (id) + { + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.setVisible = function (visible) + { + this.visible = visible; + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.isVisible = function () + { + return this.visible; + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.serialize = function () + { + return JSON.stringify({ + visible: this.visible, + activeLinks: this.activeLinks, + scrollPosition: this.scrollPosition, + openCategories: this.openCategories + }); + }; + + jsOMS.Modules.Navigation.Models.Navigation.prototype.unserialize = function (data) + { + let temp = JSON.parse(data); + + this.visible = temp.visible; + this.activeLinks = temp.activeLinks; + this.openCategories = temp.openCategories; + this.scrollPosition = temp.scrollPosition; + }; +}(window.jsOMS = window.jsOMS || {})); diff --git a/Theme/backend/side.tpl.php b/Theme/backend/side.tpl.php index 62cde67..7a372cc 100644 --- a/Theme/backend/side.tpl.php +++ b/Theme/backend/side.tpl.php @@ -17,7 +17,7 @@ * @var \Modules\Navigation\Views\NavigationView $this */ if (isset($this->nav[\Modules\Navigation\Models\NavigationType::SIDE])) : ?> -