瀏覽代碼

Reduce the initial admin data load size and reload an item once before needed

Markus Ochel 12 年之前
父節點
當前提交
5a73f242b4

+ 7 - 0
admin/controllers/authors.coffee

@@ -14,6 +14,7 @@ class AuthorForm extends Spine.Controller
     '.error-message':          'errorMessage'
     'form':                    'form'
     'select[name=site]':       'formSite'
+    'textarea[name=bio]':      'formBio'
     '.links-list':             'linksList'
     '.save-button':            'saveButton'
     '.cancel-button':          'cancelButton'
@@ -45,6 +46,12 @@ class AuthorForm extends Spine.Controller
       else
         @item = Author.find(params.id)
         @title = @item.name
+        
+      # Fetch missing data if need be
+      if not @item.bio?
+        @item.ajax().reload {},
+          success: =>
+            @formBio.val(@item.bio)
     else
       @title = 'New Author'
       @item = {}

+ 14 - 7
admin/controllers/blocks.coffee

@@ -17,6 +17,7 @@ class BlockForm extends Spine.Controller
     'form':                    'form'
     'select[name=site]':       'formSite'
     'input[name=enabled]':     'formEnabled'
+    'textarea[name=content]':  'formContent'
     '.upload-ui':              'fileUploadContainer'
     '.save-button':            'saveButton'
     '.cancel-button':          'cancelButton'
@@ -47,6 +48,12 @@ class BlockForm extends Spine.Controller
       else
         @item = Block.find(params.id)
         @title = @item.name
+        
+      # Fetch missing data if need be
+      if not @item.content?
+        @item.ajax().reload {},
+          success: =>
+            @formContent.val(@item.content)
     else
       @title = 'New Block'
       @item = {}
@@ -67,6 +74,13 @@ class BlockForm extends Spine.Controller
       @formEnabled.prop('checked', true)
     @siteChange()
 
+    # Files upload area
+    @fileUploadUI = new FileUploadUI
+      docId: @item.id
+      selectedFile: @item.photo
+      attachments: @item._attachments
+    @fileUploadContainer.html @fileUploadUI.el
+
   siteChange: ->
     $siteSelected = @formSite.parents('.field').find('.site-selected')
     site = Site.exists(@formSite.val())
@@ -75,13 +89,6 @@ class BlockForm extends Spine.Controller
     else
       $siteSelected.html ""
 
-    # Files upload area
-    @fileUploadUI = new FileUploadUI
-      docId: @item.id
-      selectedFile: @item.photo
-      attachments: @item._attachments
-    @fileUploadContainer.html @fileUploadUI.el
-
   save: (e) ->
     e.preventDefault()
     if @editing

+ 7 - 0
admin/controllers/collections.coffee

@@ -21,6 +21,7 @@ class CollectionForm extends Spine.Controller
     'select[name=sponsor_id]': 'formSponsorId'
     'input[name=name]':        'formName'
     'input[name=pinned]':      'formPinned'
+    'textarea[name=intro]':    'formIntro'
     '.upload-ui':              'fileUploadContainer'
     '.save-button':            'saveButton'
     '.cancel-button':          'cancelButton'
@@ -52,6 +53,12 @@ class CollectionForm extends Spine.Controller
       else
         @item = Collection.find(params.id)
         @title = @item.name
+        
+      # Fetch missing data if need be
+      if not @item.intro?
+        @item.ajax().reload {},
+          success: =>
+            @formIntro.val(@item.intro)
     else
       @title = 'New Collection'
       @item = {}

+ 8 - 0
admin/controllers/essays.coffee

@@ -30,6 +30,7 @@ class EssayForm extends Spine.Controller
     'select[name=sponsor_id]': 'formSponsorId'
     'input[name=title]':       'formTitle'
     'input[name=published]':   'formPublished'
+    'textarea[name=intro]':    'formIntro'
     'textarea[name=body]':     'formBody'
     '.collections-list':       'collectionsList'
     '.upload-ui':              'fileUploadContainer'
@@ -66,6 +67,13 @@ class EssayForm extends Spine.Controller
       else
         @item = Essay.find(params.id)
         @title = @item.name
+        
+      # Fetch missing data if need be
+      if not @item.body?
+        @item.ajax().reload {},
+          success: =>
+            @formBody.val(@item.body)
+            @formIntro.val(@item.intro)
     else
       @title = 'New Essay'
       @item = {}

+ 6 - 0
admin/controllers/scenes.coffee

@@ -66,6 +66,12 @@ class SceneForm extends Spine.Controller
       else
         @item = Scene.find(params.id)
         @title = @item.name
+        
+      # Fetch missing data if need be
+      if not @item.body?
+        @item.ajax().reload {},
+          success: =>
+            @formBody.val(@item.body)
     else
       @title = 'New Scene'
       @item = {}

+ 7 - 0
admin/controllers/sponsors.coffee

@@ -17,6 +17,7 @@ class SponsorForm extends Spine.Controller
     'form':                    'form'
     'select[name=contact_id]': 'formContactId'
     'select[name=format]':     'formFormat'
+    'textarea[name=content]':  'formContent'
     '.upload-ui':              'fileUploadContainer'
     '.save-button':            'saveButton'
     '.cancel-button':          'cancelButton'
@@ -46,6 +47,12 @@ class SponsorForm extends Spine.Controller
       else
         @item = Sponsor.find(params.id)
         @title = @item.name
+        
+      # Fetch missing data if need be
+      if not @item.content?
+        @item.ajax().reload {},
+          success: =>
+            @formContent.val(@item.content)
     else
       @title = 'New Sponsor'
       @item = {}

+ 2 - 1
admin/kanso.json

@@ -39,6 +39,7 @@
   "app": {
     "dev_host": "admin.kleks.local",
     "prod_host": "kleks.markuso.com",
-    "themes": ["default","blue","green","brown","teal","aqua","purple"]
+    "themes": ["default","blue","green","brown","teal","aqua","purple"],
+    "content_types": ["essay","scene","video","profile"]
   }
 }

+ 1 - 1
admin/lib/spine-couch-ajax.coffee

@@ -187,7 +187,7 @@ class Singleton extends Base
       if Spine.isBlank(data)
         data = false
       else if data.rows
-        data = @model.fromJSON(_.pluck(data.rows, "doc"))
+        data = @model.fromJSON(_.pluck(data.rows, "doc")[0])
       else
         data = @model.fromJSON(data)
     

+ 10 - 9
admin/lib/utils.coffee

@@ -6,17 +6,18 @@ exports.msg = {
 }
 
 exports.cleanCode = (code) ->
-  code.toLowerCase().replace(/[\ \.\'\"\-]/g, '_').replace(/[\:\,\&]/g, '')
+  code.toLowerCase().replace(/[\ \-]/g, '_').replace(/[\/\\\=\.\'\"\`\:\,\;\&\?\!\#\+\@]/g, '')
 
 exports.cleanSlug = (slug) ->
-  slug.toLowerCase().replace(/[\ \.\'\"]/g, '-').replace(/[\:\,\&]/g, '')
+  slug.toLowerCase().replace(/[\ \_]/g, '-').replace(/[\/\\\=\.\'\"\`\:\,\;\&\?\!\#\+\@]/g, '')
 
 exports.cleanContent = (content) ->
-  protocol = "http(s)?:\/\/"
-  if settings.app.dev_host
-    dev_host = new RegExp(protocol+settings.app.dev_host, "g")
-    content = content.replace(dev_host, '')
-  if settings.app.prod_host
-    prod_host = new RegExp(protocol+settings.app.prod_host, "g")
-    content = content.replace(prod_host, '')
+  if content
+    protocol = "http(s)?:\/\/"
+    if settings.app.dev_host
+      dev_host = new RegExp(protocol+settings.app.dev_host, "g")
+      content = content.replace(dev_host, '')
+    if settings.app.prod_host
+      prod_host = new RegExp(protocol+settings.app.prod_host, "g")
+      content = content.replace(prod_host, '')
   return content

+ 23 - 0
admin/server/lists.coffee

@@ -0,0 +1,23 @@
+settings  = require('settings/root')
+
+exports.docs = (head, req) ->
+  start code: 200, headers: {'Content-Type': 'application/json'}
+
+  rows = []
+  typesToReduceLoad = ['block','collection','author','sponsor']
+  typesToReduceLoad = typesToReduceLoad.concat(settings.app.content_types)
+
+  while row = getRow()
+    doc = row.doc
+
+    # Remove some data that is not needed for list
+    # views to reduce the amount of data download
+    if doc.type in typesToReduceLoad
+      delete doc.intro
+      delete doc.body
+      delete doc.content
+      delete doc.bio
+
+    rows.push({id: doc._id, doc: doc})
+
+  return JSON.stringify({ count: rows.length, rows: rows })

+ 3 - 1
admin/server/rewrites.coffee

@@ -26,7 +26,9 @@ module.exports = [
 
   {
     from: "/spine-adapter/:type",
-    to: "_view/docs_by_type",
+    # to: "_view/docs_by_type",
+    # Using a list function to filter out large data attributes
+    to: "_list/docs/docs_by_type",
     method: "GET",
     query: {
       startkey: [":type"],

+ 3 - 2
site/server/lists.coffee

@@ -279,8 +279,9 @@ exports.doc = (head, req) ->
 
 
 exports.rssfeed = (head, req) ->
-  # start code: 200, headers: {'Content-Type': 'application/rss+xml'}
-  start code: 200, headers: {'Content-Type': 'text/plain'}
+  start code: 200, headers: {'Content-Type': 'application/rss+xml'}
+  # Output as plain text for troubleshooting
+  # start code: 200, headers: {'Content-Type': 'text/plain'}
 
   md = new Showdown.converter()
   docs = []