Jump To …

issues.coffee

class IssueController extends Backbone.Router
  routes: {
    "issues" : "issues",
    "issue/:id" : "issue"
  },

  issues: ->
    App.Controllers.Issues.renderIssues()

  issue: (id) ->
    if App.Collections.Issues.models.length == 0

Fetch collection if user lands directly on #issue/:id without first visiting #issues

      App.Collections.Issues.fetch(
        success: ->
          App.Controllers.Issues.renderIssues()
          App.Controllers.Issues.renderPanel(id)
      )
    else

Otherwise just render the individual issue

      App.Controllers.Issues.renderPanel(id)

  renderIssues: ->
    issues = new App.Views.IssuesView({collection: App.Collections.Issues})
    $('#issues').html(issues.render().el)

  renderPanel: (id) ->
    view = new App.Views.IssuePanelView({model: App.Collections.Issues.get(id)})
    $('article').html(view.render().el)
    view.after_render()

App.Controllers.Issues = new IssueController


class Issue extends Backbone.Model
  
App.Models.Issue = Issue


class Issues extends Backbone.Collection
  model: App.Models.Issue,
  url: "https://api.github.com/repos/twitter/bootstrap/issues"

App.Collections.Issues = new Issues


class IssueView extends Backbone.View
  initialize: ->
    _.bindAll(this, 'render')
    @model.bind('change', @render)

Load iCanHaz.js template from script tag in index.html

    @template = ich.issue

  render: ->

Pass model attribute to iCanHaz template

    content = @template(@model.toJSON())
    $(@el).html(content)
    return this

App.Views.IssueView = IssueView


class IssuePanelView extends Backbone.View
  initialize: ->
    _.bindAll(this, 'render')
    @model.bind('change', @render)
    @template = ich.issuePanel

  render: ->
    attrs = @model.toJSON()
    content = @template(attrs)
    $(@el).html(content)
    return this

  after_render: ->
    attrs = @model.toJSON()
    markdown = new Markdown.Converter()
    $('#body_html').html(markdown.makeHtml(attrs.body))
    issue_id = '#issue_' + attrs.id
    $('#issues .active').removeClass('active')
    $(issue_id).addClass('active') # set active state to sidebar button

App.Views.IssuePanelView = IssuePanelView


class IssuesView extends Backbone.View
  initialize: ->
    _.bindAll(this, 'render')
    @template = ich.issues
    if App.Collections.Issues.models.length == 0
      @collection.fetch()
    @collection.bind('reset', @render)
    @collection.bind('add', @render)

  render: ->
    collection = @collection
    issues_html = ""
    collection.each((issue) ->
      view = new IssueView({ model: issue })
      issues_html += view.render().el.innerHTML
    )
    $(@el).html(issues_html)
    if $('#active_issue')

Set active state to sidebar button if one if set in #active_issue div

      issue_id = '#issue_' + $('#active_issue').val()
      $('#issues .active').removeClass('active')
      $(issue_id).addClass('active')
    return this

App.Views.IssuesView = IssuesView