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();
},
};
});