///////////////////////////////////////////////////////////////////////////
// Copyright © 2014 - 2018 Esri. All Rights Reserved.
//
// Licensed under the Apache License Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
///////////////////////////////////////////////////////////////////////////
define([
'dojo/_base/declare',
'dijit/_WidgetBase',
'dijit/_TemplatedMixin',
'dojo/_base/lang',
'dojo/_base/array',
'dojo/_base/html',
'dojo/on',
'dojo/query',
'dojo/Evented'
],
function(declare, _WidgetBase, _TemplatedMixin, lang, array, html, on, query, Evented) {
return declare([_WidgetBase, _TemplatedMixin, Evented], {
'baseClass': 'jimu-dijit-dropdownmenu',
declaredClass: 'jimu.dijit.DropdownMenu',
templateString: '
',
itemHeight: 24,
iconSize: 16,
offsetY: 5,
shelter: null,
paddingOffsetY: 8,
dropdownMenuItemClass: 'dropdown-menu-item',
//options:
items: null,//[{value,label}]
highlightValue: "",
highlightSelectedItemAfterClick: true,
menuLeadingIcon: true,
maxDisplayItems: 10,
//events:
//click-item
postCreate: function(){
this.inherited(arguments);
if(!this.items){
this.items = [];
}
this.shelter = html.toDom('');
this.itemsContainer = html.toDom('');
if(this.maxDisplayItems <= 0){
this.maxDisplayItems = 20;
}
this.itemsContainer.style.maxHeight = this.itemHeight * this.maxDisplayItems + this.paddingOffsetY * 2 + "px";
array.forEach(this.items, lang.hitch(this, function(item){
var str = '';
var itemDom = html.toDom(str);
itemDom.itemInfo = item;
itemDom.title = item.label;
html.place(itemDom, this.itemsContainer);
}));
this.own(on(this.domNode, 'click', lang.hitch(this, this._onIconClick)));
this.own(on(this.shelter, 'click', lang.hitch(this, this._onShelterClick)));
this.own(on(this.itemsContainer, 'click', lang.hitch(this, this._onItemsContainerClick)));
if(this.highlightValue){
this.setHighlightValue(this.highlightValue);
}
},
_onIconClick: function(evt){
evt.stopPropagation();
if(this.isShowing()){
this.hideMenu();
}else{
var position = html.position(evt.target || evt.srcElement);
this.showMenu(position);
}
},
_onShelterClick: function(){
this.hideMenu();
},
_onItemsContainerClick: function(evt){
evt.stopPropagation();
var target = evt.target || evt.srcElement;
if(html.hasClass(target, this.dropdownMenuItemClass)){
var value = target.itemInfo.value;
if(this.highlightSelectedItemAfterClick){
this.setHighlightValue(value);
}
this.emit("click-item", value);
}
this.hideMenu();
},
clearHighlightValue: function(){
query("." + this.dropdownMenuItemClass, this.itemsContainer).removeClass("selected");
},
setHighlightValue: function(value){
this.clearHighlightValue();
query("." + this.dropdownMenuItemClass, this.itemsContainer).some(
lang.hitch(this, function(itemDom){
var itemInfo = itemDom.itemInfo;
if(itemInfo.value === value){
html.addClass(itemDom, "selected");
return true;
}
return false;
}));
},
getHighlightValue: function(){
var itemDom = query("." + this.dropdownMenuItemClass + ".selected", this.itemsContainer)[0];
if(itemDom){
return itemDom.itemInfo.value;
}
return null;
},
isShowing: function(){
return html.hasClass(this.domNode, "showing");
},
showMenu: function(position){
this.itemsContainer.style.top = position.y + this.iconSize + this.offsetY + "px";
var isNormalPosition = this.menuLeadingIcon === window.isRTL;
if(isNormalPosition){
this.itemsContainer.style.left = position.x + "px";
this.itemsContainer.style.right = "auto";
}else{
this.itemsContainer.style.right = window.innerWidth - (position.x + this.iconSize) + "px";
this.itemsContainer.style.left = "auto";
}
html.place(this.shelter, document.body);
html.place(this.itemsContainer, document.body);
html.addClass(this.domNode, "showing");
},
hideMenu: function(){
if(this.itemsContainer.parentNode){
this.itemsContainer.parentNode.removeChild(this.itemsContainer);
}
if(this.shelter.parentNode){
this.shelter.parentNode.removeChild(this.shelter);
}
html.removeClass(this.domNode, "showing");
},
destroy: function(){
this.hideMenu();
html.destroy(this.itemsContainer);
html.destroy(this.shelter);
this.inherited(arguments);
}
});
});