Explorar el Código

Got the initial work of creating and saving records

Markus Ochel hace 13 años
padre
commit
2927bcbea5

+ 1 - 1
admin/controllers/authors.coffee

@@ -16,7 +16,7 @@ class Authors extends Spine.Controller
 
   render: =>
     context = 
-      authors: Author.filter(@filterObj)
+      authors: Author.filter(@filterObj).sort(Author.nameSort)
     @el.html templates.render('authors.html', {}, context)
     @
 

+ 1 - 1
admin/controllers/blocks.coffee

@@ -16,7 +16,7 @@ class Blocks extends Spine.Controller
 
   render: =>
     context = 
-      blocks: Block.filter(@filterObj)
+      blocks: Block.filter(@filterObj).sort(Block.titleSort)
     @el.html templates.render('blocks.html', {}, context)
     @
 

+ 57 - 22
admin/controllers/collections.coffee

@@ -4,23 +4,27 @@ templates   = require('duality/templates')
 
 Collection  = require('models/collection')
 Sponsor     = require('models/sponsor')
+Site        = require('models/site')
 
 
 class CollectionForm extends Spine.Controller
   className: 'collection form panel'
 
   elements:
-    '.item-title': 'itemTitle'
-    '.error-message': 'errorMessage'
-    'form': 'form'
+    '.item-title':             'itemTitle'
+    '.error-message':          'errorMessage'
+    'form':                    'form'
+    'select[name=site]':       'formSite'
     'select[name=sponsor_id]': 'formSponsorId'
-    '.save-button': 'saveButton'
-    '.cancel-button': 'cancelButton'
+    '.save-button':            'saveButton'
+    '.cancel-button':          'cancelButton'
 
   events:
-    'submit form': 'preventSubmit'
-    'click .save-button': 'save'
-    'click .cancel-button': 'cancel'
+    'submit form':              'preventSubmit'
+    'click .save-button':       'save'
+    'click .cancel-button':     'cancel'
+    'click .delete-button':     'destroy'
+    'change select[name=site]': 'siteChange'
 
   constructor: ->
     super
@@ -31,47 +35,78 @@ class CollectionForm extends Spine.Controller
     if @editing
       @copying = params.id.split('-')[0] is 'copy'
       if @copying
-        @itemTitle.html 'Copy Collection'
+        @title = 'Copy Collection'
         @item = Collection.find(params.id.split('-')[1]).dup()
       else
         @item = Collection.find(params.id)
-        @itemTitle.html @item.name
+        @title = @item.name
     else
-      @itemTitle.html 'New Collection'
+      @title = 'New Collection'
       @item = {}
     
+    @item.sites = Site.all().sort(Site.nameSort)
     @item.sponsors = Sponsor.all().sort(Sponsor.nameSort)
     @html templates.render('collection-form.html', {}, @item)
+
+    @itemTitle.html @title
     
     # Set few initial form values
     if @editing
+      @formSite.val(@item.site)
       @formSponsorId.val(@item.sponsor_id)
+    else
+      @formSite.val(@stack.stack.filterBox.siteId)
+    @siteChange()
+
+  siteChange: ->
+    site = Site.find(@formSite.val())
+    @formSite.parents('.field').find('.site-selected').html "<div class=\"site-name\">#{site.name_html}</div>"
 
   save: (e) ->
     e.preventDefault()
     if @editing
-      @item.fromForm(@mainForm)
+      @item.fromForm(@form)
     else
-      @item = new Collection().fromForm(@mainForm)
+      @item = new Collection().fromForm(@form)
+
+    # Convert some boolean properties
+    @item.pinned = Boolean(@item.pinned)
+
+    # Take care of some dates if need be
+    try
+      if @item.updated_at
+        @item.updated_at = new Date(@item.updated_at).toJSON()
+      else
+        @item.updated_at = new Date().toJSON()
+    catch error
+      @showError "Date format is wrong. Use this format: 'Feb 20 2012 6:30 PM'"
     
     # Save the item and make sure it validates
     if @item.save()
       @back()
     else
       msg = @item.validate()
-      @errorMessage.html(msg).show()
-      @el.scrollTop(0, 0)
+      @showError msg
+
+  showError: (msg) ->
+    @errorMessage.html(msg).show()
+    @el.scrollTop(0, 0)
   
+  destroy: ->
+    if @item and confirm "Are you sure you want to delete this #{@item.constructor.name}?"
+      @item.destroy()
+      @back()
+
   cancel: (e) ->
     e.preventDefault
     if @dirtyForm
-      sure = prompt "You may have some unsaved changes.\nAre you sure you want to cancel?"
-      @back() if sure
+      if confirm "You may have some unsaved changes.\nAre you sure you want to cancel?"
+        @back()
     else
       @back()
 
   back: ->
-    @navigate('/collections')
+    @navigate('/collections/list')
 
   preventSubmit: (e) ->
     e.preventDefault
@@ -92,7 +127,7 @@ class CollectionList extends Spine.Controller
 
   render: =>
     context = 
-      collections: Collection.filter(@filterObj)
+      collections: Collection.filter(@filterObj).sort(Collection.nameSort)
     @html templates.render('collections.html', {}, context)
 
   filter: (@filterObj) =>
@@ -109,9 +144,9 @@ class Collections extends Spine.Stack
   default: 'list'
 
   routes:
-    # '/collections':    'list'
-    '/collection':     'form'
-    '/collection/:id': 'form'
+    '/collections/list': 'list'
+    '/collection/new':   'form'
+    '/collection/:id':   'form'
 
 
 module.exports = Collections

+ 1 - 1
admin/controllers/contacts.coffee

@@ -16,7 +16,7 @@ class Contacts extends Spine.Controller
 
   render: =>
     context = 
-      contacts: Contact.filter(@filterObj)
+      contacts: Contact.filter(@filterObj).sort(Contact.nameSort)
     @el.html templates.render('contacts.html', {}, context)
     @
 

+ 1 - 1
admin/controllers/dashboard.coffee

@@ -14,7 +14,7 @@ class Dashboard extends Spine.Controller
 
   render: =>
     context = 
-      drafts: Essay.findAllByAttribute('published', true)
+      drafts: Essay.findAllByAttribute('published', false)
     @el.html templates.render('dashboard.html', {}, context)
     @
 

+ 1 - 1
admin/controllers/essays.coffee

@@ -16,7 +16,7 @@ class Essays extends Spine.Controller
 
   render: =>
     context = 
-      essays: Essay.filter(@filterObj)
+      essays: Essay.filter(@filterObj).sort(Essay.titleSort)
     @el.html templates.render('essays.html', {}, context)
     @
 

+ 7 - 2
admin/controllers/filter-box.coffee

@@ -26,7 +26,7 @@ class FilterBox extends Spine.Controller
     @selectedSite = $(@el).find('.selected-site')
     @siteSelector = $(@el).find('ul.site-selector')
     
-    @filterInput.on 'keyup', (e) =>
+    @filterInput.on 'keypress', (e) =>
       @filter()
     
     @selectedSite.on 'click', (e) =>
@@ -36,7 +36,12 @@ class FilterBox extends Spine.Controller
       $item = $(e.currentTarget)
       @selectedSite.find('> span').html($item.html())
       @siteId = $item.attr('data-id')
-      @siteSelector.hide()
+      @siteSelector
+        .hide()
+        .scrollTop(0, 0)
+        .children()
+        .removeClass('selected')
+      $item.addClass('selected')
       @filter()
 
   filter: =>

+ 106 - 3
admin/controllers/sites.coffee

@@ -5,8 +5,96 @@ templates   = require('duality/templates')
 Site        = require('models/site')
 
 
-class Sites extends Spine.Controller
-  className: 'sites panel'
+class SiteForm extends Spine.Controller
+  className: 'site form panel'
+
+  elements:
+    '.item-title':        'itemTitle'
+    '.error-message':     'errorMessage'
+    'form':               'form'
+    'select[name=_id]':   'formSiteId'
+    'select[name=theme]': 'formTheme'
+    '.save-button':       'saveButton'
+    '.cancel-button':     'cancelButton'
+
+  events:
+    'submit form':          'preventSubmit'
+    'click .save-button':   'save'
+    'click .cancel-button': 'cancel'
+    'click .delete-button': 'destroy'
+
+  constructor: ->
+    super
+    @active @render
+
+  render: (params) ->
+    @editing = params.id?
+    if @editing
+      @copying = params.id.split('-')[0] is 'copy'
+      if @copying
+        @title = 'Copy Site'
+        @item = Site.find(params.id.split('-')[1]).dup()
+      else
+        @item = Site.find(params.id)
+        @title = @item.name
+    else
+      @title = 'New Site'
+      @item = {}
+    
+    @item.themes = ['default','blue','green']
+    @html templates.render('site-form.html', {}, @item)
+
+    @itemTitle.html @title
+    
+    # Set few initial form values
+    if @editing
+      @formTheme.val(@item.theme)
+      @formSiteId.attr('readonly', 'readonly')
+
+  save: (e) ->
+    e.preventDefault()
+    if @editing
+      @item.fromForm(@form)
+    else
+      @item = new Site().fromForm(@form)
+    
+    # Save the item and make sure it validates
+    if @item.save()
+      @back()
+    else
+      msg = @item.validate()
+      @showError msg
+
+  showError: (msg) ->
+    @errorMessage.html(msg).show()
+    @el.scrollTop(0, 0)
+  
+  destroy: ->
+    if @item and confirm "Are you sure you want to delete this #{@item.constructor.name}?"
+      @item.destroy()
+      @back()
+  
+  cancel: (e) ->
+    e.preventDefault
+    if @dirtyForm
+      if confirm "You may have some unsaved changes.\nAre you sure you want to cancel?"
+        @back()
+    else
+      @back()
+
+  back: ->
+    @navigate('/sites/list')
+
+  preventSubmit: (e) ->
+    e.preventDefault
+    
+  deactivate: ->
+    super
+    @el.scrollTop(0, 0)
+
+
+class SiteList extends Spine.Controller
+  className: 'site list panel'
 
   constructor: ->
     super
@@ -16,7 +104,7 @@ class Sites extends Spine.Controller
 
   render: =>
     context = 
-      sites: Site.filter(@filterObj)
+      sites: Site.filter(@filterObj).sort(Site.nameSort)
     @el.html templates.render('sites.html', {}, context)
     @
 
@@ -24,4 +112,19 @@ class Sites extends Spine.Controller
     @render()
 
 
+class Sites extends Spine.Stack
+  className: 'sites panel'
+
+  controllers:
+    list: SiteList
+    form: SiteForm
+
+  default: 'list'
+
+  routes:
+    '/sites/list': 'list'
+    '/site/new':   'form'
+    '/site/:id':   'form'
+
+
 module.exports = Sites

+ 1 - 1
admin/controllers/sponsors.coffee

@@ -16,7 +16,7 @@ class Sponsors extends Spine.Controller
 
   render: =>
     context = 
-      sponsors: Sponsor.filter(@filterObj)
+      sponsors: Sponsor.filter(@filterObj).sort(Sponsor.nameSort)
     @el.html templates.render('sponsors.html', {}, context)
     @
 

+ 3 - 0
admin/models/essay.coffee

@@ -11,6 +11,9 @@ class Essay extends BaseModel
   @titleSort: (a, b) ->
     if (a.title or a.published_at) > (b.title or b.published_at) then 1 else -1
 
+  @dateSort: (a, b) ->
+    if (a.published_at or a.title) > (b.published_at or b.title) then 1 else -1
+
   @queryOn: ['title','slug']
     
   validate: ->

+ 2 - 2
admin/models/site.coffee

@@ -4,11 +4,11 @@ require('lib/spine-couch-ajax')
 BaseModel = require('models/base')
 
 class Site extends BaseModel
-  @configure "Site", "name", "name_html", "tagline", "footer_html", "link", "theme", "css", "google_analytics_code"
+  @configure "Site", "_id", "name", "name_html", "tagline", "footer_html", "link", "theme", "css", "google_analytics_code"
   
   @extend Spine.Model.CouchAjax
   
-  @queryOn: ['name','tagline','id']
+  @queryOn: ['name','tagline','_id']
     
   validate: ->
     return 'Name is required' unless @name

+ 1 - 0
admin/server/setup.coffee

@@ -3,4 +3,5 @@ module.exports =
   views: require("./views") 
   lists: require("./lists")
   rewrites: require("./rewrites")
+  updates: require("./updates")
   validate_doc_update: require('./validate').validate_doc_update

+ 2 - 2
admin/server/updates.coffee

@@ -1,4 +1,4 @@
-_   = require('underscore')._
+{_}   = require('underscore')
 
 exports.spine_adapter_model = (doc, req) ->
   if req.method is 'POST'    
@@ -9,7 +9,7 @@ exports.spine_adapter_model = (doc, req) ->
     destroy(doc, req)
 
 create = (doc, req) ->
-  doc = JSON.parse req.body
+  doc = JSON.parse(req.body)
   doc.type = req.query.type
   doc._id = req.uuid unless doc._id
   resp =

+ 40 - 27
admin/static/css/theme.styl

@@ -108,6 +108,7 @@ input, textarea, select
   font-family: 'Lato', 'Helvetica Neue', Helvetica, Arial, sans-serif
   font-size: 1em
   font-weight: 300
+  word-spacing: 0.2em
   padding: 5px
   margin: 0
   border: 1px solid #f3f3f3
@@ -128,7 +129,18 @@ button, .button
   background: $primaryColor
   border: 0
   border-radius(0)
+  cursor: pointer
 
+  &:hover
+    background: darken($primaryColor, 5%)
+    
+  &.plain
+    color: $primaryColor
+    background: #fff
+    border: 1px solid #f3f3f3
+
+    &:hover
+      background: #f3f3f3
 
 ::-webkit-input-placeholder
   color: #f3f3f3
@@ -141,9 +153,8 @@ button, .button
   right: 0
 
 .site-name
-  margin: 0 0 0.8em -0.05em
   font-size: 1.65em
-  line-height: 0.8em
+  line-height: 1em
   font-weight: 300
   color: $lightGrey
   letter-spacing: -0.07em
@@ -163,6 +174,7 @@ span.label
   top: 20px
   right: 30px
   width: 30%
+  background: #fff
   z-index: 10
 
   .filter-input
@@ -186,7 +198,7 @@ span.label
 
     .icon
       float: right
-      margin: 1px 0 0 0
+      margin: 5px 5px 0 0
       arrow('top', 10px, $lightGrey)
 
     &:hover
@@ -205,12 +217,15 @@ span.label
     -webkit-user-select: none
 
     li
-      padding: 10px 20px
+      padding: 10px 10px
       cursor: pointer
 
       &:hover
         background: #f3f3f3
 
+      &.selected
+        opacity: 0.5
+
 
 .main.navbar
   position: absolute
@@ -290,19 +305,11 @@ span.label
     .item-title
       color: $primaryColor
 
-    .save-button
+    .buttons
       float: right
-      margin: 5px 0 0 0
 
-    .cancel-button
-      float: right
-      display: block
-      border: 0
-      margin: 5px 0 0 0
-      padding: 10px 30px
-
-      &:hover
-        background: $lightGrey
+      button, .button
+        margin: 5px 0 5px 10px
 
     > ul.list
       list-style-type: none
@@ -317,6 +324,11 @@ span.label
         border-bottom: 1px dotted #f3f3f3
         padding: 0.5em 0
         clearfix()
+
+        .note
+          font-size: 0.75em
+          line-height: 1em
+          color: $lightGrey
         
         .meta
           font-size: 0.75em
@@ -360,9 +372,21 @@ span.label
           color: $lightGrey
 
         input[name='name'],
+        input[name='name_html'],
         input[name='title']
           font-size: 1.5em
 
+        .field-left
+          float: left
+          width: 48%
+
+        .field-right
+          float: right
+          width: 48%
+
+        .site-selected
+          font-size: 2em
+
         &.inline
 
           label
@@ -389,21 +413,10 @@ span.label
         padding: 5px 10px
         background: orange
 
-.stack > .panel > .panel
+.stack > .panel > .form.panel
   z-index: 20
 
-
 .stack .panel:not(.active)
   display: none
 
 
-.contacts.panel
-  
-  > ul.list
-
-    > li
-
-      .note
-        font-size: 0.75em
-        line-height: 1em
-        color: $lightGrey

+ 6 - 2
admin/templates/authors.html

@@ -1,11 +1,15 @@
-<h1>Authors <span class="count">{{authors.length}}</span></h1>
+<h1>
+  Authors
+  <a class="new" href="#/author/new">+</a>
+  <span class="count">{{authors.length}}</span>
+</h1>
 <ul class="authors list">
   {{#each authors}}
   <li>
     <div class="actions">
       <div><strong>Bio</strong> on {{site}}</div>
     </div>
-    <a href="#/{{type}}/{{_id}}/edit">{{name}}</a>
+    <a href="#/author/{{id}}">{{name}}</a>
   </li>
   {{/each}}
 </ul>

+ 6 - 2
admin/templates/blocks.html

@@ -1,11 +1,15 @@
-<h1>Blocks <span class="count">{{blocks.length}}</span></h1>
+<h1>
+  Blocks
+  <a class="new" href="#/block/new">+</a>
+  <span class="count">{{blocks.length}}</span>
+</h1>
 <ul class="blocks list">
   {{#each blocks}}
   <li>
     <div class="actions">
       <div>{{code}}</div>
     </div>
-    <a href="#/{{type}}/{{_id}}/edit">{{name}}</a>
+    <a href="#/block/{{id}}">{{name}}</a>
     <div class="meta">
       <div>{{site}}</div>
     </div>

+ 22 - 5
admin/templates/collection-form.html

@@ -1,11 +1,24 @@
-<a class="cancel-button" href="#">Cancel</a>
-<button class="save-button">Save</button>
+<div class="buttons">
+  <button class="save-button">Save</button>
+  <button class="cancel-button plain">Cancel</button>
+</div>
 <h1>Collection</h1>
 <h3 class="item-title">{{name}}</h3>
 
 <form class="collection">
   <div class="error-message"></div>
 
+  <div class="field">
+    <div class="field-left">
+      <label>Site</label>
+      <select name="site">
+        {{#each sites}}
+        <option value="{{id}}">{{name}} &mdash; {{id}}</option>
+        {{/each}}
+      </select>
+    </div>
+    <div class="field-right site-selected"></div>
+  </div>
   <div class="field">
     <label>Name</label>
     <input type="text" name="name" value="{{name}}" required>
@@ -27,12 +40,16 @@
     <select name="sponsor_id">
       <option value=""></option>
       {{#each sponsors}}
-      <option value="{{_id}}">{{name}}</option>
+      <option value="{{id}}">{{name}}</option>
       {{/each}}
     </select>
   </div>
   <div class="field">
     <label>Updated At</label>
-    <input type="text" name="updated_at" value="{{updated_at}}" readonly>
+    <input type="text" name="updated_at" value="{{updated_at}}" placeholder="ex. Feb 20 2012 6:30 PM or leave blank">
   </div>
-</form>
+</form>
+
+{{#if id}}
+<button class="delete-button plain">Delete {{type}}</button>
+{{/if}}

+ 7 - 3
admin/templates/collections.html

@@ -1,10 +1,14 @@
-<h1>Collections <span class="count">{{collections.length}}</span></h1>
+<h1>
+  Collections
+  <a class="new" href="#/collection/new">+</a>
+  <span class="count">{{collections.length}}</span>
+</h1>
 <ul class="collections list">
   {{#each collections}}
   <li>
-    <a href="#/{{type}}/{{_id}}">{{name}}</a>
+    <a href="#/collection/{{id}}">{{name}}</a>
     <div class="meta">
-      <div><a href="http://{{site}}/{{type}}/{{slug}}" target="_blank">view on {{site}}</a></div>
+      <div><a href="http://{{site}}/collection/{{slug}}" target="_blank">view on {{site}}</a></div>
     </div>
   </li>
   {{/each}}

+ 6 - 2
admin/templates/contacts.html

@@ -1,11 +1,15 @@
-<h1>Contacts <span class="count">{{contacts.length}}</span></h1>
+<h1>
+  Contacts
+  <a class="new" href="#/contact/new">+</a>
+  <span class="count">{{contacts.length}}</span>
+</h1>
 <ul class="contacts list">
   {{#each contacts}}
   <li>
     <div class="actions">
       <div><a href="mailto:{{email}}">{{email}}</a></div>
     </div>
-    <a href="#/{{type}}/{{_id}}/edit">{{name}}</a>
+    <a href="#/contact/{{id}}">{{name}}</a>
     <div class="note">{{{note}}}</div>
   </li>
   {{/each}}

+ 2 - 2
admin/templates/dashboard.html

@@ -2,9 +2,9 @@
 <ul class="drafts list">
   {{#each drafts}}
   <li>
-    <a href="#/{{type}}/{{_id}}/edit">{{title}}</a>
+    <a href="#/essay/{{id}}">{{title}}</a>
     <div class="meta">
-      <div><a href="http://{{site}}/{{type}}/{{slug}}" target="_blank">view on {{site}}</a></div>
+      <div><a href="http://{{site}}/essay/{{slug}}" target="_blank">view on {{site}}</a></div>
     </div>
   </li>
   {{/each}}

+ 7 - 3
admin/templates/essays.html

@@ -1,13 +1,17 @@
-<h1>Essays <span class="count">{{essays.length}}</span></h1>
+<h1>
+  Essays
+  <a class="new" href="#/essay/new">+</a>
+  <span class="count">{{essays.length}}</span>
+</h1>
 <ul class="essays list">
   {{#each essays}}
   <li>
     <div class="actions">
       {{#unless published}}<div><strong>In Draft</strong></div>{{/unless}}
     </div>
-    <a href="#/{{type}}/{{_id}}/edit">{{title}}</a>
+    <a href="#/essay/{{id}}">{{title}}</a>
     <div class="meta">
-      <div><a href="http://{{site}}/{{type}}/{{slug}}" target="_blank">view on {{site}}</a></div>
+      <div><a href="http://{{site}}/essay/{{slug}}" target="_blank">view on {{site}}</a></div>
     </div>
   </li>
   {{/each}}

+ 3 - 3
admin/templates/filter-box.html

@@ -1,11 +1,11 @@
 <input class="filter-input" type="text" value="" placeholder="filter">
 <div class="selected-site">
   <i class="icon"></i>
-  <span>All sites</span>
+  <span class="site-name">All sites</span>
 </div>
 <ul class="site-selector">
-  <li data-id="">All sites</li>
+  <li class="site-name" data-id="">All sites</li>
   {{#each sites}}
-  <li data-id="{{_id}}">{{{name_html}}}</li>
+  <li class="site-name" data-id="{{_id}}">{{{name_html}}}</li>
   {{/each}}
 </ul>

+ 59 - 0
admin/templates/site-form.html

@@ -0,0 +1,59 @@
+<div class="buttons">
+  <button class="save-button">Save</button>
+  <button class="cancel-button plain">Cancel</button>
+</div>
+<h1>Site</h1>
+<h3 class="item-title">{{name}}</h3>
+
+<form class="collection">
+  <div class="error-message"></div>
+
+  <div class="field">
+    <label>ID</label>
+    <input type="text" name="_id" value="{{_id}}" required placeholder="www.example.com">
+  </div>
+  <div class="field">
+    <div class="field-left">
+      <label>Name</label>
+      <input type="text" name="name" value="{{name}}" required>
+    </div>
+    <div class="field-right">
+      <label>Name HTML</label>
+      <input type="text" name="name_html" value="{{name_html}}" required>
+    </div>
+  </div>
+  <div class="field">
+    <label>Tagline</label>
+    <input type="text" name="tagline" value="{{tagline}}">
+  </div>
+  <div class="field">
+    <div class="field-left">
+      <label>Theme</label>
+      <select name="theme">
+        {{#each themes}}
+        <option value="{{.}}">{{.}}</option>
+        {{/each}}
+      </select>
+    </div>
+    <div class="field-right">
+      <label>Link</label>
+      <input type="text" name="link" value="{{link}}" required placeholder="http://www.example.com">
+    </div>
+  </div>
+  <div class="field">
+    <label>Footer HTML</label>
+    <textarea name="footer_html">{{footer_html}}</textarea>
+  </div>
+  <div class="field">
+    <label>CSS</label>
+    <textarea name="css">{{css}}</textarea>
+  </div>
+  <div class="field">
+    <label>Google Analytics Code</label>
+    <input type="text" name="google_analytics_code" value="{{google_analytics_code}}">
+  </div>
+</form>
+
+{{#if id}}
+<button class="delete-button plain">Delete {{type}}</button>
+{{/if}}

+ 7 - 3
admin/templates/sites.html

@@ -1,11 +1,15 @@
-<h1>Sites <span class="count">{{sites.length}}</span></h1>
+<h1>
+  Sites
+  <a class="new" href="#/site/new">+</a>
+  <span class="count">{{sites.length}}</span>
+</h1>
 <ul class="sites list">
   {{#each sites}}
   <li>
     <div class="actions">
-      <div><a href="{{link}}" target="_blank">{{_id}}</span></div>
+      <div><a href="{{link}}" target="_blank">{{id}}</span></div>
     </div>
-    <a class="site-name" href="#/{{type}}/{{_id}}/edit">{{{name_html}}}</a>
+    <a class="site-name" href="#/site/{{id}}">{{{name_html}}}</a>
     <div class="meta">
       {{#if tagline}}<div>{{{tagline}}}</div>{{/if}}
     </div>

+ 6 - 2
admin/templates/sponsors.html

@@ -1,11 +1,15 @@
-<h1>Sponsors <span class="count">{{sponsors.length}}</span></h1>
+<h1>
+  Sponsors
+  <a class="new" href="#/sponsor/new">+</a>
+  <span class="count">{{sponsors.length}}</span>
+</h1>
 <ul class="sponsors list">
   {{#each sponsors}}
   <li>
     <div class="actions">
       <div>{{site}}</div>
     </div>
-    <a href="#/{{type}}/{{_id}}/edit">{{name}}</a>
+    <a href="#/sponsor/{{id}}">{{name}}</a>
     <div class="meta">
       <div><a href="{{link}}">{{link}}</a></div>
       <div><strong>{{format}}</strong> format</div>