lib/assets/javascripts/cmi/tabs.coffee in curo-material-interface-0.0.4 vs lib/assets/javascripts/cmi/tabs.coffee in curo-material-interface-0.0.5

- old
+ new

@@ -1,46 +1,77 @@ window.CMI or= {} class CMI.Tabs - @activate: (domElement) -> - domElement = $(domElement) unless domElement instanceof jQuery - return if domElement? == false || domElement.length <= 0 + @activate: (invoker) -> + invoker = $(invoker) unless invoker instanceof jQuery + return if invoker.length <= 0 - # load tabs - tabs = domElement.parents('.cmi-tabs') - @_ensureActiveIndicator(tabs) - indicator = tabs.find('.cmi-tabs-active-indicator') + # fetch - links panel + invokersPanel = invoker.parents('.cmi-tabs').first() + return if invokersPanel.length <= 0 - # new position - position = domElement.offsetParent().position() + # ensure indicator (bar below) + @_ensureActiveIndicator(invokersPanel) + + # fetch - tabs unique name + name = invokersPanel.data('cmi-tabs-name') + return if name? == false || name.length <= 0 + + # fetch - upcoming tab + upcomingTab = @_tabFromInvoker invoker, name + return if upcomingTab.length <= 0 + return if upcomingTab.hasClass 'cmi-tabs-active' + + # fetch - active tabs + activeTabs = $("[data-cmi-tabs-name=#{name}].cmi-tabs-tab.cmi-tabs-active") + + # before triggers + upcomingTab.trigger 'cmi.tabs.beforeShow' + activeTabs.trigger 'cmi.tabs.beforeHide' + + # set and animate active indicator + @_setAndAnimateActiveIndicator(invokersPanel, invoker) + + # show / hide + upcomingTab.addClass 'cmi-tabs-active' + activeTabs.removeClass 'cmi-tabs-active' + invokersPanel.find('li').removeClass 'cmi-tabs-active' + invoker.parents('li').first().addClass 'cmi-tabs-active' + + # after triggers + upcomingTab.trigger 'cmi.tabs.show' + activeTabs.trigger 'cmi.tabs.hide' + + + # --------------------------------------------- + # private + + # @nodoc + @_ensureActiveIndicator: (invokersPanel) -> + return if invokersPanel.find('.cmi-tabs-active-indicator').length > 0 + + invokersPanel.append('<li class="cmi-li cmi-tabs-active-indicator"></li>') + + # @nodoc + @_tabFromInvoker: (domElement, name) -> + id = domElement.attr('data-cmi-tab-id').replace('#', '') + $("[data-cmi-tabs-name=#{name}]##{id}").first() + + # @nodoc + @_setAndAnimateActiveIndicator: (invokersPanel, invoker) -> + indicator = invokersPanel.find('.cmi-tabs-active-indicator') + + # new position for active indicator + position = invoker.offsetParent().position() left = position.left - right = tabs.innerWidth() - left - domElement.outerWidth() + right = invokersPanel.innerWidth() - left - invoker.outerWidth() # moving direction indicator.removeClass('cmi-tabs-animate-right').removeClass('cmi-tabs-animate-left') if left < indicator.position().left indicator.addClass('cmi-tabs-animate-left') else indicator.addClass('cmi-tabs-animate-right') # animate indicator indicator.css({ left: "#{left}px", right: "#{right}px" }) - - # set link active - tabs.find('li').removeClass('cmi-tabs-active') - domElement.parents('li').addClass('cmi-tabs-active') - - # switch tab - tabsContainer = $(tabs.data('cmi-tabs-container')) - element = document.getElementById(domElement.attr('href').replace('#', '')) - if element? == true && element.className.indexOf('cmi-tabs-active') < 0 - tabsContainer.find('.cmi-tabs-tab').removeClass('cmi-tabs-active') - element.className += ' cmi-tabs-active' - - - # --------------------------------------------- - # private - - @_ensureActiveIndicator: (tabsElement) -> - return if tabsElement.find('.cmi-tabs-active-indicator').length > 0 - tabsElement.append('<li class="cmi-li cmi-tabs-active-indicator"></li>')