/*______________ | ______ | U I Z E J A V A S C R I P T F R A M E W O R K | / / | --------------------------------------------------- | / O / | MODULE : Uize.Widget.Options.Tabbed Class | / / / | | / / / /| | ONLINE : http://uize.com | /____/ /__/_| | COPYRIGHT : (c)2006-2016 UIZE | /___ | LICENSE : Available under MIT License or GNU General Public License |_______________| http://uize.com/license.html */ /* Module Meta Data type: Class importance: 5 codeCompleteness: 100 docCompleteness: 2 */ /*? Introduction The =Uize.Widget.Options.Tabbed= class implements a tabs widget, using a button-based option set where each option button has an associated tab body. *DEVELOPERS:* `Chris van Rensburg` */ Uize.module ({ name:'Uize.Widget.Options.Tabbed', required:'Uize.Dom.Classes', builder:function (_superclass) { 'use strict'; var /*** Variables for Scruncher Optimization ***/ _Uize_Dom_Classes = Uize.Dom.Classes ; /*** Private Instance Methods ***/ function _resolveToValueNo (m,_valueOrValueNo) { return Uize.isNumber (_valueOrValueNo) ? _valueOrValueNo : m.getValueNoFromValue (_valueOrValueNo); } function _getTabBodyNode (m,_valueOrValueNo) { return m.getNode ('option' + _resolveToValueNo (m,_valueOrValueNo) + 'TabBody'); } function _tabCanBeSelected (m,_value) { return m.tabExists (_value) && m.getOptionButton (_value).get ('enabled'); } function _updateTabBodyClass (m, _valueNo, _currentValueNo) { if (_valueNo > -1) { var _isValue = _valueNo == _currentValueNo, _bodyClassActive = m._bodyClassActive, _bodyClassInactive = m._bodyClassInactive, _tabBody = _getTabBodyNode(m,_valueNo) ; _Uize_Dom_Classes.addClass(_tabBody, _isValue ? _bodyClassActive : _bodyClassInactive); _Uize_Dom_Classes.removeClass(_tabBody, _isValue ? _bodyClassInactive : _bodyClassActive); } } function _updateUiTabContent (m) { if (m.isWired) { var _currentValueNo = m.get ('valueNo'); if (_tabCanBeSelected (m,_currentValueNo)) { m.updateUiTabState (m._lastShownTabBodyNo,_currentValueNo); m._lastShownTabBodyNo = _currentValueNo; } else if (m._mustHaveSelectedTab){ for ( var _valueNo = -1, _values = m.get ('values'), _valuesLength = _values.length; ++_valueNo < _valuesLength; ) { if (_tabCanBeSelected (m,_valueNo)) { m.set ({value:_values [_valueNo]}); break; } } } } } return _superclass.subclass ({ omegastructor:function () { var m = this; m.wire ('Changed.value',function () {_updateUiTabContent (m)}); }, instanceMethods:{ enableTab:function (_value,_mustEnable) { this.getOptionButton (_value).set ({enabled:_mustEnable ? 'inherit' : false}); _updateUiTabContent (this); }, getOptionButton:function (_valueOrValueNo) { return this.children ['option' + _resolveToValueNo (this,_valueOrValueNo)]; }, getTabBodyNode:function (_valueOrValueNo) {return _getTabBodyNode (this,_valueOrValueNo)}, tabExists:function (_valueOrValueNo) { var _optionButton = this.getOptionButton (_valueOrValueNo); return ( _optionButton && (_optionButton.getNode () || _getTabBodyNode (this,_valueOrValueNo)) ? true : false ); }, updateUiTabState:function (_lastShownTabBodyNo,_currentValueNo) { _updateTabBodyClass (this,_lastShownTabBodyNo, _currentValueNo); _updateTabBodyClass (this,_currentValueNo, _currentValueNo); }, wireUi:function () { var m = this; if (!m.isWired) { _superclass.doMy (m,'wireUi'); var _valueNo = m._lastShownTabBodyNo = m.get ('valueNo'); Uize.forEach ( m.get ('values'), function (_value,_tabNo) {_updateTabBodyClass (m, _tabNo, _valueNo)} ); } } }, stateProperties:{ _bodyClassActive:'bodyClassActive', _bodyClassInactive:'bodyClassInactive', _mustHaveSelectedTab:{ name:'mustHaveSelectedTab', value:true } } }); } });