controller = Luca.register "Luca.components.Controller" controller.extends "Luca.containers.CardView" controller.publicInterface default: (callback)-> @navigate_to(@defaultPage || @defaultCard, callback) activePage: ()-> @activeSection() # switch the active card of this controller # optionally passing an onActivation callback # will fire this callback in the context of # the currently active card navigate_to: (section, callback)-> section ||= @defaultCard # activate is a method on Luca.containers.CardView which # selects a component and makes it visible, hiding any # other component which may be monopolizing the view at that time. # after activation it triggers a after:card:switch event # and if it is the first time that view is being activated, # it triggers a first:activation event which gets relayed to all # child components in that view @activate section, false, (activator, previous,current)=> @state.set(active_section: current.name ) if _.isFunction( callback ) callback.apply(current) # return the section we are navigating to @find(section) controller.classMethods controllerPath: ()-> component = @ list = [component.name] atBase = false while component and not atBase component = component.getParent?() atBase = true if component?.role is "main_controller" list.push( component.name ) if component? and not atBase list.reverse() controller.defines additionalClassNames: 'luca-ui-controller' activeAttribute: "active-section" stateful: true initialize: (@options)-> # let's phase out the 'card' terminology # and 'section' while we're at it. page is the word. @defaultCard ||= @defaultPage ||= @components[0]?.name || 0 @defaultPage ||= @defaultCard @defaultState ||= active_section: @defaultPage Luca.containers.CardView::initialize.apply @, arguments throw "Controllers must specify a defaultCard property and/or the first component must have a name" unless @defaultCard? @_().each (component)-> component.controllerPath = Luca.components.Controller.controllerPath each: (fn)-> _( @components ).each (component)=> fn.call(@,component) activeSection: ()-> @get("active_section") pageControllers: (deep=false)-> @controllers.apply(@, arguments) controllers:(deep=false)-> @select (component)-> type = (component.type || component.ctype) type is "controller" or type is "page_controller" availablePages: ()-> @availableSections.apply(@, arguments) availableSections: ()-> base = {} base[ @name ] = @sectionNames() _( @controllers() ).reduce (memo,controller)=> memo[ controller.name ] = controller.sectionNames() memo , base pageNames: ()-> @sectionNames() sectionNames: (deep=false)-> @pluck('name')