Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

define(["jquery","core/custom_interaction_events","core/log","core/pubsub","core/aria","core_user/repository"],function($,CustomEvents,Log,PubSub,Aria,UserRepository){
    "use strict";
    var SELECTORS={
        TOGGLE_REGION:'[data-region="drawer-toggle"]',
        TOGGLE_ACTION:'[data-action="toggle-drawer"]',
        TOGGLE_TARGET:"aria-controls",
        TOGGLE_SIDE:"left",
        BODY:"body",
        SECTION:'.list-group-item[href*="#section-"]',
        DRAWER:"#nav-drawer",
    };
    var small=$(document).width()<768;
    var Drawer=function(){
        if(!$(SELECTORS.TOGGLE_REGION).length){
            Log.debug("Page is missing a drawer region");
        }
        if(!$(SELECTORS.TOGGLE_ACTION).length){
            Log.debug("Page is missing a drawer toggle link");
        }
        $(SELECTORS.TOGGLE_REGION).each(function(index,ele){
            var trigger=$(ele).find(SELECTORS.TOGGLE_ACTION);
            var drawerid=trigger.attr("aria-controls");
            var drawer=$(document.getElementById(drawerid));
            var hidden=trigger.attr("aria-expanded")=="false";
            var side=trigger.attr("data-side");
            var body=$(SELECTORS.BODY);
            var preference=trigger.attr("data-preference");
            if(small){
                UserRepository.setUserPreference(preference,false);
            }
            drawer.on("mousewheel DOMMouseScroll",this.preventPageScroll);
            if(!hidden){
                body.addClass("drawer-open-"+side);
                trigger.attr("aria-expanded","true");
            }else{
                trigger.attr("aria-expanded","false");
            }
        }.bind(this));
        this.registerEventListeners();
        if(small){
            this.closeAll();
        }
    };
    Drawer.prototype.closeAll=function(){
        $(SELECTORS.TOGGLE_REGION).each(function(index,ele){
            var trigger=$(ele).find(SELECTORS.TOGGLE_ACTION);
            var side=trigger.attr("data-side");
            var body=$(SELECTORS.BODY);
            var drawerid=trigger.attr("aria-controls");
            var drawer=$(document.getElementById(drawerid));
            var preference=trigger.attr("data-preference");
            trigger.attr("aria-expanded","false");
            body.removeClass("drawer-open-"+side);
            Aria.hide(drawer.get());
            drawer.addClass("closed");
            if(!small){
                UserRepository.setUserPreference(preference,false);
            }
        });
    };
    Drawer.prototype.toggleDrawer=function(e){
        var trigger=$(e.target).closest("[data-action=toggle-drawer]");
        var drawerid=trigger.attr("aria-controls");
        var drawer=$(document.getElementById(drawerid));
        var body=$(SELECTORS.BODY);
        var side=trigger.attr("data-side");
        var preference=trigger.attr("data-preference");
        if(small){
            UserRepository.setUserPreference(preference,false);
        }
        body.addClass("drawer-ease");
        var open=trigger.attr("aria-expanded")=="true";
        if(!open){
            trigger.attr("aria-expanded","true");
            Aria.unhide(drawer.get());
            drawer.focus();
            body.addClass("drawer-open-"+side);
            drawer.removeClass("closed");
            if(!small){
                UserRepository.setUserPreference(preference,true);
            }
        }else{
            body.removeClass("drawer-open-"+side);
            trigger.attr("aria-expanded","false");
            drawer.addClass("closed").delay(500).queue(function(){
                if($(this).hasClass("closed")){
                    Aria.hide(this);
                }
                $(this).dequeue();
            });
            if(!small){
                UserRepository.setUserPreference(preference,false);
            }
        }
        PubSub.publish("nav-drawer-toggle-start",open);
    };
    Drawer.prototype.preventPageScroll=function(e){
        var delta=e.wheelDelta||(e.originalEvent&&e.originalEvent.wheelDelta)||-e.originalEvent.detail,
            bottomOverflow=this.scrollTop+$(this).outerHeight()-this.scrollHeight>=0,
            topOverflow=this.scrollTop<=0;
        if((delta<0&&bottomOverflow)||(delta>0&&topOverflow)){
            e.preventDefault();
        }
    };
    Drawer.prototype.registerEventListeners=function(){
        $(SELECTORS.TOGGLE_ACTION).each(function(index,element){
            CustomEvents.define($(element),[CustomEvents.events.activate]);
            $(element).on(CustomEvents.events.activate,function(e,data){
                this.toggleDrawer(data.originalEvent);
                data.originalEvent.preventDefault();
            }.bind(this));
        }.bind(this));
        $(SELECTORS.SECTION).click(function(){
            if(small){
                this.closeAll();
            }
        }.bind(this));
        $(SELECTORS.DRAWER).on("webkitTransitionEnd msTransitionEnd transitionend",function(e){
            var drawer=$(e.target).closest(SELECTORS.DRAWER);
            var open=!!drawer.attr("aria-hidden");
            PubSub.publish("nav-drawer-toggle-end",open);
        });
    };
    return{
        init:function(){
            return new Drawer();
        },
    };
});