2 YUI 3.13.0 (build 508226d)
3 Copyright 2013 Yahoo! Inc. All rights reserved.
4 Licensed under the BSD License.
5 http://yuilibrary.com/license/
8 YUI.add('widget-autohide', function (Y, NAME) {
11 * A widget-level extension that provides ability to hide widget when
12 * certain events occur.
14 * @module widget-autohide
15 * @author eferraiuolo, tilomitra
20 var WIDGET_AUTOHIDE = 'widgetAutohide',
21 AUTOHIDE = 'autohide',
22 CLICK_OUTSIDE = 'clickoutside',
23 FOCUS_OUTSIDE = 'focusoutside',
24 DOCUMENT = 'document',
29 RENDERED = "rendered",
30 BOUNDING_BOX = "boundingBox",
34 getCN = Y.ClassNameManager.getClassName;
37 * The WidgetAutohide class provides the hideOn attribute which can
38 * be used to hide the widget when certain events occur.
40 * @class WidgetAutohide
41 * @param {Object} config User configuration object
43 function WidgetAutohide(config) {
44 Y.after(this._bindUIAutohide, this, BIND_UI);
45 Y.after(this._syncUIAutohide, this, SYNC_UI);
48 if (this.get(RENDERED)) {
49 this._bindUIAutohide();
50 this._syncUIAutohide();
56 * Static property used to define the default attribute
57 * configuration introduced by WidgetAutohide.
63 WidgetAutohide.ATTRS = {
70 * @description An array of objects corresponding to the nodes, events, and keycodes to hide the widget on.
71 * The implementer can supply an array of objects, with each object having the following properties:
72 * <p>eventName: (string, required): The eventName to listen to.</p>
73 * <p>node: (Y.Node, optional): The Y.Node that will fire the event (defaults to the boundingBox of the widget)</p>
74 * <p>keyCode: (string, optional): If listening for key events, specify the keyCode</p>
75 * <p>By default, this attribute consists of one object which will cause the widget to hide if the
76 * escape key is pressed.</p>
79 validator: Y.Lang.isArray,
80 valueFn : function() {
83 node: Y.one(DOCUMENT),
92 WidgetAutohide.prototype = {
93 // *** Instance Members *** //
95 _uiHandlesAutohide : null,
97 // *** Lifecycle Methods *** //
99 destructor : function () {
101 this._detachUIHandlesAutohide();
105 * Binds event listeners to the widget.
107 * This method in invoked after bindUI is invoked for the Widget class
108 * using YUI's aop infrastructure.
110 * @method _bindUIAutohide
113 _bindUIAutohide : function () {
115 this.after(VISIBLE+CHANGE, this._afterHostVisibleChangeAutohide);
116 this.after("hideOnChange", this._afterHideOnChange);
120 * Syncs up the widget based on its current state. In particular, removes event listeners if
121 * widget is not visible, and attaches them otherwise.
123 * This method in invoked after syncUI is invoked for the Widget class
124 * using YUI's aop infrastructure.
126 * @method _syncUIAutohide
129 _syncUIAutohide : function () {
131 this._uiSetHostVisibleAutohide(this.get(VISIBLE));
134 // *** Private Methods *** //
137 * Removes event listeners if widget is not visible, and attaches them otherwise.
139 * @method _uiSetHostVisibleAutohide
142 _uiSetHostVisibleAutohide : function (visible) {
145 //this._attachUIHandlesAutohide();
146 Y.later(1, this, '_attachUIHandlesAutohide');
148 this._detachUIHandlesAutohide();
153 * Iterates through all objects in the hideOn attribute and creates event listeners.
155 * @method _attachUIHandlesAutohide
158 _attachUIHandlesAutohide : function () {
160 if (this._uiHandlesAutohide) { return; }
162 var bb = this.get(BOUNDING_BOX),
163 hide = Y.bind(this.hide,this),
166 hideOn = this.get('hideOn'),
168 o = {node: undefined, ev: undefined, keyCode: undefined};
170 //push all events on which the widget should be hidden
171 for (; i < hideOn.length; i++) {
173 o.node = hideOn[i].node;
174 o.ev = hideOn[i].eventName;
175 o.keyCode = hideOn[i].keyCode;
177 //no keycode or node defined
178 if (!o.node && !o.keyCode && o.ev) {
179 uiHandles.push(bb.on(o.ev, hide));
182 //node defined, no keycode (not a keypress)
183 else if (o.node && !o.keyCode && o.ev) {
184 uiHandles.push(o.node.on(o.ev, hide));
187 //node defined, keycode defined, event defined (its a key press)
188 else if (o.node && o.keyCode && o.ev) {
189 uiHandles.push(o.node.on(o.ev, hide, o.keyCode));
197 this._uiHandlesAutohide = uiHandles;
201 * Detaches all event listeners created by this extension
203 * @method _detachUIHandlesAutohide
206 _detachUIHandlesAutohide : function () {
208 Y.each(this._uiHandlesAutohide, function(h){
211 this._uiHandlesAutohide = null;
215 * Default function called when the visibility of the widget changes. Determines
216 * whether to attach or detach event listeners based on the visibility of the widget.
218 * @method _afterHostVisibleChangeAutohide
221 _afterHostVisibleChangeAutohide : function (e) {
223 this._uiSetHostVisibleAutohide(e.newVal);
227 * Default function called when hideOn Attribute is changed. Remove existing listeners and create new listeners.
229 * @method _afterHideOnChange
231 _afterHideOnChange : function(e) {
232 this._detachUIHandlesAutohide();
234 if (this.get(VISIBLE)) {
235 this._attachUIHandlesAutohide();
240 Y.WidgetAutohide = WidgetAutohide;
243 }, '3.13.0', {"requires": ["base-build", "event-key", "event-outside", "widget"]});