Przeglądaj źródła

Installed and used the moment.js module

Markus Ochel 13 lat temu
rodzic
commit
70ee00db2f

+ 14 - 0
admin/controllers/collections.coffee

@@ -3,6 +3,8 @@ Spine       = require('spine/core')
 templates   = require('duality/templates')
 utils       = require('lib/utils')
 
+FileUploadUI  = require('controllers/ui/file-upload')
+
 Collection  = require('models/collection')
 Sponsor     = require('models/sponsor')
 Site        = require('models/site')
@@ -19,6 +21,7 @@ class CollectionForm extends Spine.Controller
     'select[name=sponsor_id]': 'formSponsorId'
     'input[name=name]':        'formName'
     'input[name=pinned]':      'formPinned'
+    '.upload-ui':              'fileUploadContainer'
     '.save-button':            'saveButton'
     '.cancel-button':          'cancelButton'
 
@@ -47,6 +50,8 @@ class CollectionForm extends Spine.Controller
     else
       @title = 'New Collection'
       @item = {}
+
+    @item._attachments ?= {}
     
     @item.sites = Site.all().sort(Site.nameSort)
     @item.sponsors = Sponsor.all().sort(Sponsor.nameSort)
@@ -63,6 +68,13 @@ class CollectionForm extends Spine.Controller
       @formSite.val(@stack.stack.filterBox.siteId)
     @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())
@@ -83,6 +95,8 @@ class CollectionForm extends Spine.Controller
     else
       @item = new Collection().fromForm(@form)
 
+    @item._attachments = @fileUploadUI.attachments
+
     # Take care of some boolean checkboxes
     @item.pinned = @formPinned.is(':checked')
 

+ 3 - 0
admin/controllers/ui/file-upload.coffee

@@ -58,6 +58,9 @@ class FileUploadUI extends Spine.Controller
       $item.append $("<div><em>#{type}</em><br>#{name}</div>")
 
     @filesList.append $item
+    
+    # Also select the item if it is the only one
+    @selectItem($item) if @attachments.length is 1
 
   itemClick: (e) ->
     # Selecting the main photo

Plik diff jest za duży
+ 5 - 0
admin/lib/moment.js


+ 4 - 0
admin/lib/utils.coffee

@@ -1,6 +1,10 @@
 # Bunch of utility functions
 settings   = require('settings/root')
 
+exports.msg = {
+  DATE_NOT_VALID: "Date format is wrong. Use this format: 'Feb 20 2012 6:30 PM'"
+}
+
 exports.cleanCode = (code) ->
   code.toLowerCase().replace(/[\ \.\'\"\-]/g, '_')
 

+ 14 - 14
admin/models/collection.coffee

@@ -1,12 +1,13 @@
 Spine = require('spine/core')
 require('lib/spine-couch-ajax')
 
-utils = require('lib/utils')
+utils  = require('lib/utils')
+moment = require('lib/moment')
 
 BaseModel = require('models/base')
 
 class Collection extends BaseModel
-  @configure "Collection", "site", "slug", "name", "intro", "pinned", "updated_at", "sponsor_id", "sponsor_start", "sponsor_end", "_attachments"
+  @configure "Collection", "site", "slug", "name", "intro", "photo", "pinned", "updated_at", "sponsor_id", "sponsor_start", "sponsor_end", "sponsors_history", "_attachments"
 
   @extend Spine.Model.CouchAjax
 
@@ -20,13 +21,9 @@ class Collection extends BaseModel
     return 'Name is required' unless @name
     
     # Take care of some dates
-    try
-      if @updated_at
-        @updated_at = new Date(@updated_at).toJSON()
-      else
-        @updated_at = new Date().toJSON()
-    catch error
-      return "Date format is wrong. Use this format: 'Feb 20 2012 6:30 PM'"
+    updated_at = moment(@updated_at)
+    return "Updated #{utils.msg.DATE_NOT_VALID}" unless updated_at.isValid()
+    @updated_at = updated_at.utc().format()
     
     # Convert some boolean properties
     @pinned = Boolean(@pinned)
@@ -35,11 +32,14 @@ class Collection extends BaseModel
     if @sponsor_id
       return 'Sponsor Start Date is required' unless @sponsor_start
       return 'Sponsor End Date is required' unless @sponsor_end
-      try
-        if new Date(@sponsor_start).toJSON() >= new Date(@sponsor_end).toJSON()
-          return 'Sponsor Start Date cannot be later than End Date'
-      catch error
-        return "Sponsor date format is wrong. Use this format: 'Feb 20 2012 6:30 PM'"
+      sponsor_start = moment(@sponsor_start)
+      sponsor_end = moment(@sponsor_end)
+      return "Sponsor Start #{utils.msg.DATE_NOT_VALID}" unless sponsor_start.isValid()
+      return "Sponsor End #{utils.msg.DATE_NOT_VALID}" unless sponsor_end.isValid()
+      return 'Sponsor Start Date cannot be later than End Date' if sponsor_start >= sponsor_end
+      # Save in UTC format string
+      @sponsor_start = sponsor_start.utc().format()
+      @sponsor_end = sponsor_end.utc().format()
 
     # Some content transformation
     @intro = utils.cleanContent @intro

+ 15 - 14
admin/models/essay.coffee

@@ -2,11 +2,12 @@ Spine = require('spine/core')
 require('lib/spine-couch-ajax')
 
 utils = require('lib/utils')
+moment = require('lib/moment')
 
 BaseModel = require('models/base')
 
 class Essay extends BaseModel
-  @configure "Essay", "site", "slug", "title", "intro", "body", "photo", "published", "published_at", "updated_at", "author_id", "sponsor_id", "sponsor_start", "sponsor_end", "sponsors_history", "collections", "_attachments"
+  @configure "Essay", "site", "slug", "title", "intro", "body", "photo", "published", "published_at", "published_at", "author_id", "sponsor_id", "sponsor_start", "sponsor_end", "sponsors_history", "collections", "_attachments"
   
   @extend Spine.Model.CouchAjax
   
@@ -26,14 +27,11 @@ class Essay extends BaseModel
     return 'Title is required' unless @title
 
     # Take care of some dates
-    @updated_at = new Date().toJSON()
-    try
-      if @published_at
-        @published_at = new Date(@published_at).toJSON()
-      else
-        @published_at = new Date().toJSON()
-    catch error
-      return "Date format is wrong. Use this format: 'Feb 20 2012 6:30 PM'"
+    @updated_at = moment.utc().format()
+
+    published_at = moment(@published_at)
+    return "Published #{utils.msg.DATE_NOT_VALID}" unless published_at.isValid()
+    @published_at = published_at.utc().format()
 
     # Convert some boolean properties
     @published = Boolean(@published)
@@ -42,11 +40,14 @@ class Essay extends BaseModel
     if @sponsor_id
       return 'Sponsor Start Date is required' unless @sponsor_start
       return 'Sponsor End Date is required' unless @sponsor_end
-      try
-        if new Date(@sponsor_start).toJSON() >= new Date(@sponsor_end).toJSON()
-          return 'Sponsor Start Date cannot be later than End Date'
-      catch error
-        return "Sponsor date format is wrong. Use this format: 'Feb 20 2012 6:30 PM'"
+      sponsor_start = moment(@sponsor_start)
+      sponsor_end = moment(@sponsor_end)
+      return "Sponsor Start #{utils.msg.DATE_NOT_VALID}" unless sponsor_start.isValid()
+      return "Sponsor End #{utils.msg.DATE_NOT_VALID}" unless sponsor_end.isValid()
+      return 'Sponsor Start Date cannot be later than End Date' if sponsor_start >= sponsor_end
+      # Save in UTC format string
+      @sponsor_start = sponsor_start.utc().format()
+      @sponsor_end = sponsor_end.utc().format()
 
     # Some content transformation
     @intro = utils.cleanContent @intro

+ 1 - 0
admin/static/css/theme.styl

@@ -234,6 +234,7 @@ span.label
       .count, .status
         float: right
         color: $lightGrey
+        font-size: 0.5em
         font-weight: 300
         margin-left: 0.5em
 

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

@@ -49,6 +49,11 @@
 
     <div class="top-spacer"></div>
 
+    <h3 class="heading">Files</h3>
+    <div class="field">
+      <div class="upload-ui"></div>
+    </div>
+
     <h3 class="heading">Sponsorship</h3>
     <div class="field">
       <div class="field-left">

Plik diff jest za duży
+ 5 - 0
site/lib/moment.js


+ 9 - 0
site/lib/utils.coffee

@@ -0,0 +1,9 @@
+moment    = require('lib/moment')
+
+exports.prettyDate = (date) ->
+  moment.utc(date).local().format('MMM Do YYYY')
+
+exports.isItFresh = (date) ->
+  if moment.utc().eod() < moment.utc(date).add('days', 30).eod()
+    return true
+  return false

+ 25 - 15
site/server/lists.coffee

@@ -2,6 +2,8 @@ templates = require('duality/templates')
 dutils    = require('duality/utils')
 Showdown  = require('showdown')
 _         = require('underscore')._
+utils     = require('lib/utils')
+moment    = require('lib/moment')
 
 
 exports.home = (head, req) ->
@@ -25,7 +27,8 @@ exports.home = (head, req) ->
       doc.intro_html = converter.makeHtml(
         doc.intro.replace(/\{\{?baseURL\}?\}/g, dutils.getBaseURL(req))
       )
-    doc.updated_at_html = new Date(doc.updated_at).toDateString()
+    doc.updated_at_html = utils.prettyDate(doc.updated_at)
+    doc.fresh = utils.isItFresh(doc.updated_at)
     return doc
 
   return {
@@ -56,20 +59,24 @@ exports.collection = (head, req) ->
     sponsor ?= doc if doc.type is 'sponsor'
     site ?= doc if doc.type is 'site'
 
+  if collection
+    collection.fresh = utils.isItFresh(collection.updated_at)
+
   essays = _.map essays, (doc) ->
     if doc.intro?
       doc.intro_html = converter.makeHtml(
         doc.intro.replace(/\{\{?baseURL\}?\}/g, dutils.getBaseURL(req))
       )
-    doc.published_at_html = new Date(doc.published_at).toDateString()
+    doc.published_at_html = utils.prettyDate(doc.published_at)
+    doc.fresh = utils.isItFresh(doc.published_at)
     return doc
 
   if sponsor
     # Check for strat/end dates of sponsorship
-    sponsor_start = new Date(collection.sponsor_start)
-    sponsor_end = new Date(collection.sponsor_end)
-    now = new Date()
-    if sponsor_start <= now and sponsor_end >= now
+    sponsor_start = moment.utc(collection.sponsor_start)
+    sponsor_end = moment.utc(collection.sponsor_end)
+    now = moment.utc()
+    if sponsor_start.diff(now) <= 0 and sponsor_start.diff(now) >= 0
       # let continue on
       sponsor.text_format = sponsor.format is 'text'
       sponsor.image_format = sponsor.format is 'image'
@@ -120,8 +127,9 @@ exports.essays = (head, req) ->
       doc.intro_html = converter.makeHtml(
         doc.intro.replace(/\{\{?baseURL\}?\}/g, dutils.getBaseURL(req))
       )
-    doc.published_at_html = new Date(doc.published_at).toDateString()
-    doc.updated_at_html = new Date(doc.updated_at).toDateString()
+    doc.published_at_html = utils.prettyDate(doc.published_at)
+    doc.updated_at_html = utils.prettyDate(doc.updated_at)
+    doc.fresh = utils.isItFresh(doc.published_at)
     return doc
 
   return {
@@ -164,8 +172,9 @@ exports.essay = (head, req) ->
     doc.body_html = converter.makeHtml(
       doc.body.replace(/\{\{?baseURL\}?\}/g, dutils.getBaseURL(req))
     )
-    doc.published_at_html = new Date(doc.published_at).toDateString()
-    doc.updated_at_html = new Date(doc.updated_at).toDateString()
+    doc.published_at_html = utils.prettyDate(doc.published_at)
+    doc.updated_at_html = utils.prettyDate(doc.updated_at)
+    doc.fresh = utils.isItFresh(doc.published_at)
     return doc
 
   essay = transformEssay(essay) if essay
@@ -175,15 +184,16 @@ exports.essay = (head, req) ->
       doc.intro_html = converter.makeHtml(
         doc.intro.replace(/\{\{?baseURL\}?\}/g, dutils.getBaseURL(req))
       )
-    doc.updated_at_html = new Date(doc.updated_at).toDateString()
+    doc.updated_at_html = utils.prettyDate(doc.updated_at)
+    doc.fresh = utils.isItFresh(doc.updated_at)
     return doc
 
   if sponsor
     # Check for strat/end dates of sponsorship
-    sponsor_start = new Date(essay.sponsor_start)
-    sponsor_end = new Date(essay.sponsor_end)
-    now = new Date()
-    if sponsor_start <= now and sponsor_end >= now
+    sponsor_start = moment.utc(essay.sponsor_start)
+    sponsor_end = moment.utc(essay.sponsor_end)
+    now = moment.utc()
+    if sponsor_start.diff(now) <= 0 and sponsor_start.diff(now) >= 0
       # let continue on
       sponsor.text_format = sponsor.format is 'text'
       sponsor.image_format = sponsor.format is 'image'

+ 0 - 0
site/server/utils.coffee


+ 26 - 17
site/static/css/theme.styl

@@ -69,7 +69,7 @@
       arrow('top', 12px, #fff, 12px, 7px)
       margin: 0 auto
       display: block
-      top: 0
+      top: 2px
 
   > ul
     display: none
@@ -97,7 +97,7 @@
       padding: 0
 
       &.heading
-        padding: 10px 20px
+        padding: 7px 20px
         font-size: 1.1em
         font-weight: $boldFont
         color: #fff
@@ -245,6 +245,26 @@ article
       iframe
         display: block
 
+  > ul.list
+    list-style-type: none
+    margin: 0
+    padding: 0
+
+    > li
+      margin-bottom: 1em
+      clearfix()
+      
+      .date
+        float: right
+        padding: 5px 10px
+        color: $lightGrey
+
+      .meta
+        font-size: 0.875em
+        > a
+          display: inline-block
+          margin-right: 2em
+
 article.home
 
   .collections
@@ -270,6 +290,7 @@ article.home
             padding: 1em
 
         .updated
+          display: none
           position: absolute
           bottom: 0
           right: 0
@@ -277,6 +298,9 @@ article.home
           background: $primaryColor
           color: #fff
 
+          &.fresh-true
+            display: block
+
 article.essay
 
   .body
@@ -327,21 +351,6 @@ article.essay
           display: inline-block
           margin-right: 2em
 
-article.essays
-
-  > ul.list
-    list-style-type: none
-    margin: 0
-    padding: 0
-
-    li.item
-      margin-bottom: 1em
-      
-      .meta
-        font-size: 0.875em
-        > a
-          display: inline-block
-          margin-right: 2em
 
 footer
   margin-top: 2em

+ 11 - 2
site/templates/collection.html

@@ -1,13 +1,17 @@
 {{#if collection.css}}<style>{{{collection.css}}}</style>{{/if}}
 
 <article class="collection">
-  <h2 class="title"><a href="{{baseURL}}/collection/{{collection.slug}}">{{collection.title}}</a></h2>
+  <h2 class="title"><a href="{{baseURL}}/collection/{{collection.slug}}">{{collection.name}}</a></h2>
 
   {{#if collection.photo}}
   <section class="photo">
     <img src="/file/{{collection._id}}/{{collection.photo}}">
   </section>
   {{/if}}
+
+  <section class="intro">
+    {{{collection.intro_html}}}
+  </section>
   
   {{#if sponsor}}
   <section class="sponsor collection-sponsor">
@@ -46,7 +50,12 @@
   </section>
   {{/if}}
 
+  <ul class="list">
   {{#each essays}}
-    <h3><a href="{{baseURL}}/essay/{{slug}}">{{title}}</a></h3>
+    <li>
+      <div class="date fresh-{{fresh}}">{{published_at_html}}</div>
+      <h3><a href="{{baseURL}}/essay/{{slug}}">{{title}}</a></h3>
+    </li>
   {{/each}}
+  </ul>
 </article>

+ 1 - 1
site/templates/collections.html

@@ -6,7 +6,7 @@
   {{#each collections}}
     <li class="collection">
       <h4 class="name"><a href="{{baseURL}}/collection/{{slug}}">{{name}}</a></h4>
-      <div class="updated">{{{updated_at_html}}}</div>
+      <div class="updated fresh-{{fresh}}">{{{updated_at_html}}}</div>
     </li>
   {{/each}}
   </ul>

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików