summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/views
diff options
context:
space:
mode:
authormo <mokha@cisco.com>2017-09-02 14:48:43 -0600
committermo <mokha@cisco.com>2017-09-02 14:48:43 -0600
commitb8dfe131c6c5fe9d0e5b4ee2d271feeb5d411502 (patch)
tree05b475a8b6442e2a43d9529c42362a3460df7d13 /app/assets/javascripts/views
parentbba21d02643d632fee5fa4bdbc876d44832ccf4b (diff)
promote backbone subdirectory up to root.
Diffstat (limited to 'app/assets/javascripts/views')
-rw-r--r--app/assets/javascripts/views/.gitkeep0
-rw-r--r--app/assets/javascripts/views/cakes/cake_view.js.coffee13
-rw-r--r--app/assets/javascripts/views/cakes/delete_cake_modal_view.js.coffee40
-rw-r--r--app/assets/javascripts/views/cakes/edit_view.js.coffee81
-rw-r--r--app/assets/javascripts/views/cakes/index_view.js.coffee9
-rw-r--r--app/assets/javascripts/views/cakes/new_view.js.coffee63
-rw-r--r--app/assets/javascripts/views/cakes/no_cakes_view.js.coffee5
-rw-r--r--app/assets/javascripts/views/cakes/show_view.js.coffee38
-rw-r--r--app/assets/javascripts/views/cakes/thumbnail_view.js.coffee13
-rw-r--r--app/assets/javascripts/views/disqus_view.js.coffee32
-rw-r--r--app/assets/javascripts/views/error_view.js.coffee25
-rw-r--r--app/assets/javascripts/views/photos/new_modal_view.js.coffee50
-rw-r--r--app/assets/javascripts/views/profiles/show_view.js.coffee71
-rw-r--r--app/assets/javascripts/views/tutorials/index_view.js.coffee10
-rw-r--r--app/assets/javascripts/views/tutorials/new_view.js.coffee69
-rw-r--r--app/assets/javascripts/views/tutorials/no_tutorials_view.js.coffee5
-rw-r--r--app/assets/javascripts/views/tutorials/show_view.js.coffee7
-rw-r--r--app/assets/javascripts/views/tutorials/tutorial_view.js.coffee10
18 files changed, 541 insertions, 0 deletions
diff --git a/app/assets/javascripts/views/.gitkeep b/app/assets/javascripts/views/.gitkeep
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/app/assets/javascripts/views/.gitkeep
diff --git a/app/assets/javascripts/views/cakes/cake_view.js.coffee b/app/assets/javascripts/views/cakes/cake_view.js.coffee
new file mode 100644
index 00000000..ac3394bb
--- /dev/null
+++ b/app/assets/javascripts/views/cakes/cake_view.js.coffee
@@ -0,0 +1,13 @@
+CakeSide.Views.Cakes ||= {}
+
+class CakeSide.Views.Cakes.CakeView extends Marionette.ItemView
+ template: JST["templates/cakes/cake"]
+ tagName: 'div'
+ className: 'media'
+ templateHelpers:
+ randomPhoto: ->
+ @photos[Math.floor(Math.random()*@photos.length)]
+ hasImage: ->
+ typeof(@photos) != 'undefined' && _.any(@photos)
+ shrink: (message) ->
+ message.substring(0, 12)
diff --git a/app/assets/javascripts/views/cakes/delete_cake_modal_view.js.coffee b/app/assets/javascripts/views/cakes/delete_cake_modal_view.js.coffee
new file mode 100644
index 00000000..45cc51fc
--- /dev/null
+++ b/app/assets/javascripts/views/cakes/delete_cake_modal_view.js.coffee
@@ -0,0 +1,40 @@
+CakeSide.Views.Cakes ||= {}
+
+class CakeSide.Views.Cakes.DeleteCakeModalView extends Marionette.ItemView
+ template: JST["templates/cakes/delete_modal"]
+ ui:
+ remove_button: "#remove-button"
+ confirmation_textbox: '#confirmation-textbox'
+
+ templateHelpers:
+ hasError: ->
+ typeof(@errorMessage) != "undefined"
+
+ events:
+ "click #remove-button": "remove"
+ 'keyup #confirmation-textbox': 'refreshStatus'
+
+ modelEvents:
+ 'change:errorMessage':'render'
+
+ remove: (e) ->
+ e.preventDefault()
+ e.stopPropagation()
+ @model.unset('errorMessage')
+ @model.destroy(success: @successfullyDeleted, error: @errorDeletingCake)
+
+ successfullyDeleted: =>
+ @closeDialog()
+ window.location.hash = "cakes"
+
+ errorDeletingCake: (model, response, options) ->
+ model.set('errorMessage', 'Could not delete cake.')
+
+ refreshStatus: ->
+ if @ui.confirmation_textbox.val() == @model.get('name')
+ @ui.remove_button.removeAttr('disabled')
+ else
+ @ui.remove_button.attr('disabled', 'disabled')
+
+ closeDialog: (photo) ->
+ $('#modal').modal('hide')
diff --git a/app/assets/javascripts/views/cakes/edit_view.js.coffee b/app/assets/javascripts/views/cakes/edit_view.js.coffee
new file mode 100644
index 00000000..2a92f47d
--- /dev/null
+++ b/app/assets/javascripts/views/cakes/edit_view.js.coffee
@@ -0,0 +1,81 @@
+#= require views/cakes/thumbnail_view
+
+CakeSide.Views.Cakes ||= {}
+
+class CakeSide.Views.Cakes.EditView extends Marionette.CompositeView
+ template : JST["templates/cakes/edit"]
+ childView: CakeSide.Views.Cakes.ThumbnailView
+ childViewContainer: '.card-columns'
+ ui:
+ name: "#cake_name"
+ description: "#cake_story"
+ category: "#cake_category_id"
+ tags: "#cake_tags"
+ save_button: '#save-button'
+
+ modelEvents:
+ 'invalid': 'displayError'
+
+ events :
+ "keyup input": "refreshStatus"
+ "change select": "refreshStatus"
+ "submit #edit-cake" : "update"
+ "click .add-photo": "launchAddPhoto"
+
+ constructor: (options) ->
+ super(options)
+ @collection = @model.photos()
+
+ update : (e) ->
+ e.preventDefault()
+ e.stopPropagation()
+ @disableSaveButton()
+ @model.save(null,
+ success: @savedSuccessfully
+ error: @couldNotSave
+ )
+
+ onRender: ->
+ @$("#cake_category_id").val(@model.category_id())
+ @ui.tags.tagit({ availableTags: ALL_TAGS })
+ @disableSaveButton()
+
+ savedSuccessfully: (cake) =>
+ window.location.hash = "cakes/#{cake.id}"
+
+ couldNotSave: (cake, xhr) =>
+ @enableSaveButton()
+ error = new CakeSide.Views.ErrorView
+ el: @$('form#edit-cake'),
+ attributesWithErrors: $.parseJSON(xhr.responseText)
+ error.render()
+
+ refreshStatus: ->
+ @enableSaveButton()
+ @model.set('name', @ui.name.val())
+ @model.set('story', @ui.description.val())
+ @model.set('category_id', @ui.category.val())
+ @model.set('tags', @ui.tags.val())
+ @model.isValid()
+
+ displayError: (model, error) ->
+ @disableSaveButton()
+
+ enableSaveButton: ->
+ @ui.save_button.removeAttr('disabled')
+
+ disableSaveButton: ->
+ @ui.save_button.attr('disabled', 'disabled')
+
+ serializeData: ->
+ {
+ cake: @model.toJSON(),
+ categories: CakeSide.Application.request('CategoriesRepository').toJSON(),
+ }
+
+ launchAddPhoto: ->
+ @displayModal(new CakeSide.Views.Photos.NewModalView(cake: @model))
+
+ displayModal: (view) ->
+ $("#modal").html(view.render().el)
+ $("#modal").modal()
diff --git a/app/assets/javascripts/views/cakes/index_view.js.coffee b/app/assets/javascripts/views/cakes/index_view.js.coffee
new file mode 100644
index 00000000..0964e8bd
--- /dev/null
+++ b/app/assets/javascripts/views/cakes/index_view.js.coffee
@@ -0,0 +1,9 @@
+#= require views/cakes/no_cakes_view
+
+CakeSide.Views.Cakes ||= {}
+
+class CakeSide.Views.Cakes.IndexView extends Marionette.CollectionView
+ childView: CakeSide.Views.Cakes.CakeView
+ emptyView: CakeSide.Views.Cakes.NoCakesView
+ className: ''
+ tagName: 'div'
diff --git a/app/assets/javascripts/views/cakes/new_view.js.coffee b/app/assets/javascripts/views/cakes/new_view.js.coffee
new file mode 100644
index 00000000..bf7341a0
--- /dev/null
+++ b/app/assets/javascripts/views/cakes/new_view.js.coffee
@@ -0,0 +1,63 @@
+CakeSide.Views.Cakes ||= {}
+
+class CakeSide.Views.Cakes.NewView extends Marionette.ItemView
+ template: JST["templates/cakes/new"]
+ ui:
+ name: "#cake_name"
+ category: "#cake_category_id"
+ save_button: '#save-button'
+
+ modelEvents:
+ 'invalid': 'displayError'
+
+ events:
+ "keyup input": "refreshStatus"
+ "change select": "refreshStatus"
+ "submit #new-cake": "save"
+
+ constructor: (options) ->
+ super(_.extend(options, { model: new options.collection.model() }))
+
+ save: (e) ->
+ e.preventDefault()
+ e.stopPropagation()
+ @disableSaveButton()
+ @collection.create(@model,
+ success: @savedSuccessfully
+ error: @couldNotSave
+ )
+
+ onRender: ->
+ @$("#cake_category_id").val($("#cake_category_id option:first").val())
+ @model.isValid()
+
+ savedSuccessfully: (cake) =>
+ window.location.hash = "cakes/#{cake.id}/edit"
+
+ couldNotSave: (cake, xhr) =>
+ @enableSaveButton()
+ error = new CakeSide.Views.ErrorView
+ el: @$('form#new-cake'),
+ attributesWithErrors: $.parseJSON(xhr.responseText)
+ error.render()
+
+ refreshStatus: ->
+ @enableSaveButton()
+ @model.set('name', @ui.name.val())
+ @model.set('category_id', @ui.category.val())
+ @model.isValid()
+
+ displayError: (model, error) ->
+ @disableSaveButton()
+
+ enableSaveButton: ->
+ @ui.save_button.removeAttr('disabled')
+
+ disableSaveButton: ->
+ @ui.save_button.attr('disabled', 'disabled')
+
+ serializeData: ->
+ {
+ cake: @model.toJSON(),
+ categories: CakeSide.Application.request('CategoriesRepository').toJSON(),
+ }
diff --git a/app/assets/javascripts/views/cakes/no_cakes_view.js.coffee b/app/assets/javascripts/views/cakes/no_cakes_view.js.coffee
new file mode 100644
index 00000000..f85172c2
--- /dev/null
+++ b/app/assets/javascripts/views/cakes/no_cakes_view.js.coffee
@@ -0,0 +1,5 @@
+CakeSide.Views.Cakes ||= {}
+
+class CakeSide.Views.Cakes.NoCakesView extends Marionette.ItemView
+ template: JST["templates/cakes/no_cakes"]
+ tagName: 'li'
diff --git a/app/assets/javascripts/views/cakes/show_view.js.coffee b/app/assets/javascripts/views/cakes/show_view.js.coffee
new file mode 100644
index 00000000..3f8df07d
--- /dev/null
+++ b/app/assets/javascripts/views/cakes/show_view.js.coffee
@@ -0,0 +1,38 @@
+#= require views/cakes/thumbnail_view
+
+CakeSide.Views.Cakes ||= {}
+
+class CakeSide.Views.Cakes.ShowView extends Marionette.CompositeView
+ template: JST["templates/cakes/show"]
+ childView: CakeSide.Views.Cakes.ThumbnailView
+ childViewContainer: '.card-columns'
+
+ events:
+ "click .add-photo": "launchAddPhoto"
+ "click #remove-cake-button": "removeCake"
+
+ templateHelpers:
+ hasImage: ->
+ typeof(@photos) != 'undefined' && _.any(@photos)
+
+ randomPhoto: ->
+ if @primary_photo_id
+ _.find @photos, (photo) =>
+ photo.id.toString() == @primary_photo_id
+ else
+ @photos[Math.floor(Math.random()*@photos.length)]
+
+ constructor: (options) ->
+ super(options)
+ @collection = @model.photos()
+ @model.set('primary_photo_id', options.photo_id) if options.photo_id
+
+ launchAddPhoto: ->
+ @displayModal(new CakeSide.Views.Photos.NewModalView(cake: @model))
+
+ removeCake: ->
+ @displayModal(new CakeSide.Views.Cakes.DeleteCakeModalView(model: @model))
+
+ displayModal: (view) ->
+ $("#modal").html(view.render().el)
+ $("#modal").modal()
diff --git a/app/assets/javascripts/views/cakes/thumbnail_view.js.coffee b/app/assets/javascripts/views/cakes/thumbnail_view.js.coffee
new file mode 100644
index 00000000..a22e6e63
--- /dev/null
+++ b/app/assets/javascripts/views/cakes/thumbnail_view.js.coffee
@@ -0,0 +1,13 @@
+CakeSide.Views.Cakes ||= {}
+
+class CakeSide.Views.Cakes.ThumbnailView extends Marionette.ItemView
+ template: JST['templates/cakes/thumbnail']
+ tagName: 'div'
+ className: 'card'
+ modelEvents:
+ 'sync': 'render'
+ 'change:percentComplete': 'render'
+
+ templateHelpers:
+ uploading: ->
+ typeof(@percentComplete) != "undefined" && @percentComplete != 100
diff --git a/app/assets/javascripts/views/disqus_view.js.coffee b/app/assets/javascripts/views/disqus_view.js.coffee
new file mode 100644
index 00000000..1379691a
--- /dev/null
+++ b/app/assets/javascripts/views/disqus_view.js.coffee
@@ -0,0 +1,32 @@
+class CakeSide.Views.DisqusView extends Backbone.View
+ el: "#disqus_thread"
+ initialize: (options) ->
+ disqus = document.createElement('script')
+ disqus.type = 'text/javascript'
+ disqus.async = true
+ disqus.src = "//#{options.disqus_shortname}.disqus.com/embed.js"
+ (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(disqus)
+
+ render: (options) ->
+ try
+ @$el.removeClass('hidden')
+ that = @
+ DISQUS.reset
+ reload: true,
+ config: ->
+ @page.identifier = options.identifier
+ @page.title = "CakeSide - #{options.title}"
+ @page.url = options.url
+ @callbacks.onNewComment = [that.saveComment]
+ @
+ catch error
+ console.log(error)
+ finally
+ @
+
+ hide: ->
+ @$el.addClass('hidden')
+
+ saveComment: (comment) ->
+ $.post Routes.comments_path(), { id: comment.id, url: document.URL, comment: comment }, (result) ->
+ console.log(result)
diff --git a/app/assets/javascripts/views/error_view.js.coffee b/app/assets/javascripts/views/error_view.js.coffee
new file mode 100644
index 00000000..0d232fca
--- /dev/null
+++ b/app/assets/javascripts/views/error_view.js.coffee
@@ -0,0 +1,25 @@
+class CakeSide.Views.ErrorView extends Backbone.View
+ initialize: (options) ->
+ @attributesWithErrors = options.attributesWithErrors
+ _.bindAll(@, "clearOldErrors", "renderErrors", "renderError", "fieldFor")
+
+ render: () ->
+ @clearOldErrors()
+ @renderErrors()
+
+ clearOldErrors: () ->
+ @$(".error").removeClass("error")
+ @$("p.inline-errors").remove()
+
+ renderErrors: () ->
+ _.each(@attributesWithErrors.errors, @renderError)
+
+ renderError: (errors, attribute) ->
+ errorString = errors.join(", ")
+ field = @fieldFor(attribute)
+ errorTag = $('<p>').addClass('inline-errors').text(errorString)
+ field.append(errorTag)
+ field.addClass("error")
+
+ fieldFor: (attribute) ->
+ @$("#cake_#{attribute}").parent()
diff --git a/app/assets/javascripts/views/photos/new_modal_view.js.coffee b/app/assets/javascripts/views/photos/new_modal_view.js.coffee
new file mode 100644
index 00000000..deb9c281
--- /dev/null
+++ b/app/assets/javascripts/views/photos/new_modal_view.js.coffee
@@ -0,0 +1,50 @@
+CakeSide.Views.Photos ||= {}
+
+class CakeSide.Views.Photos.NewModalView extends Marionette.ItemView
+ template: JST["templates/photos/new-modal"]
+ ui:
+ watermark: '#watermark'
+ upload_button: "#upload-photo-button"
+
+ events:
+ "click #upload-photo-button": "save"
+ "change #photo-attachment": "displayPreview"
+ "keyup #watermark": "updateWatermark"
+
+ constructor: (options) ->
+ super(options)
+ @collection = CakeSide.Application.request('PhotosRepository', options.cake.id)
+ @cake = options.cake
+ @model = new @collection.model(cake_id: @cake.id)
+
+ save: (e) ->
+ e.preventDefault()
+ e.stopPropagation()
+ @closeDialog()
+ @model.on('progress', @displayProgress)
+ @collection.create(@model)
+
+ displayPreview: (event) ->
+ input = event.currentTarget
+ if (input.files && input.files[0])
+ file = input.files[0]
+ reader = new FileReader()
+ reader.onload = (e) ->
+ $('#preview-image').attr('src', e.target.result)
+ $('#preview-image').removeClass('hide')
+ reader.readAsDataURL(file)
+ @model.set('image', file)
+ @model.set('thumb_url', event.target.result)
+ else
+ $('#preview-image').addClass('hide')
+
+ displayProgress: (progress) ->
+ percentCompleted = progress*100
+ @set('percentComplete', percentCompleted)
+
+ closeDialog: (photo) ->
+ $('#modal').modal('hide')
+ @remove()
+
+ updateWatermark: ->
+ @model.set('watermark', @ui.watermark.val())
diff --git a/app/assets/javascripts/views/profiles/show_view.js.coffee b/app/assets/javascripts/views/profiles/show_view.js.coffee
new file mode 100644
index 00000000..545ac1e0
--- /dev/null
+++ b/app/assets/javascripts/views/profiles/show_view.js.coffee
@@ -0,0 +1,71 @@
+CakeSide.Views.Profiles ||= {}
+
+class CakeSide.Views.Profiles.ShowView extends Marionette.ItemView
+ template: JST["templates/profiles/show"]
+ ui:
+ name: '#user_name'
+ email: '#user_email'
+ city: '#user_city'
+ website: '#user_website'
+ facebook: '#user_facebook'
+ twitter: '#user_twitter'
+ save_button: '#save-button'
+ cancel_button: '#cancel-button'
+ status: '#status-message'
+
+ modelEvents:
+ 'invalid': 'displayError'
+ 'sync': 'syncedUp'
+
+ events:
+ "submit #profile-form": "save"
+ "keyup input": "refreshStatus"
+ 'click #cancel-button': 'cancel'
+
+ save: (event) ->
+ event.preventDefault()
+ event.stopPropagation()
+ @disableSaveButton()
+ @model.save(null,
+ success: @savedSuccessfully
+ error: @couldNotSave
+ )
+
+ syncedUp: (event) ->
+ console.log(arguments)
+ console.log('syncd')
+
+ savedSuccessfully: (profile) =>
+ @disableSaveButton()
+ @ui.status.removeClass('hide')
+ @ui.status.removeClass('alert-danger')
+ @ui.status.html("Saved!")
+
+ couldNotSave: =>
+ console.log('fudge')
+
+ enableSaveButton: ->
+ @ui.save_button.removeAttr('disabled')
+
+ disableSaveButton: ->
+ @ui.save_button.attr('disabled', 'disabled')
+
+ displayError: ->
+ @disableSaveButton()
+ @ui.status.addClass('alert-danger')
+ @ui.status.removeClass('hide')
+ @ui.status.html(@model.validationError)
+
+ refreshStatus: ->
+ @ui.status.addClass('hide')
+ @enableSaveButton()
+ @model.set('name', @ui.name.val())
+ @model.set('email', @ui.email.val())
+ @model.set('city', @ui.city.val())
+ @model.set('website', @ui.website.val())
+ @model.set('facebook', @ui.facebook.val())
+ @model.set('twitter', @ui.twitter.val())
+ @model.isValid()
+
+ cancel: ->
+ @enableSaveButton()
diff --git a/app/assets/javascripts/views/tutorials/index_view.js.coffee b/app/assets/javascripts/views/tutorials/index_view.js.coffee
new file mode 100644
index 00000000..764611ed
--- /dev/null
+++ b/app/assets/javascripts/views/tutorials/index_view.js.coffee
@@ -0,0 +1,10 @@
+#= require views/tutorials/no_tutorials_view
+#= require views/tutorials/tutorial_view
+
+CakeSide.Views.Tutorials ||= {}
+
+class CakeSide.Views.Tutorials.IndexView extends Marionette.CollectionView
+ childView: CakeSide.Views.Tutorials.TutorialView
+ emptyView: CakeSide.Views.Tutorials.NoTutorialsView
+ className: ''
+ tagName: 'div'
diff --git a/app/assets/javascripts/views/tutorials/new_view.js.coffee b/app/assets/javascripts/views/tutorials/new_view.js.coffee
new file mode 100644
index 00000000..6aca51a7
--- /dev/null
+++ b/app/assets/javascripts/views/tutorials/new_view.js.coffee
@@ -0,0 +1,69 @@
+#= require service/embedly_service
+
+class CakeSide.Views.Tutorials.NewView extends Marionette.ItemView
+ template: JST['templates/tutorials/new']
+ ui:
+ url: '#tutorial_url'
+ url_group: '#url-group'
+ save_button: '#save-button'
+ preview: '#preview-panel'
+ tags: '#tutorial_tags'
+
+ modelEvents:
+ 'invalid': 'displayError'
+ 'change:url': 'render'
+
+ events:
+ 'change #tutorial_url': 'loadUrl'
+ "submit #new-tutorial": "save"
+
+ initialize: ->
+ @model = new @collection.model()
+ @service = new EmbedlyService()
+
+ loadUrl: ->
+ if @model.isValidUrl(@ui.url.val())
+ @service.retrieve_info_on(@ui.url.val(), @updateTutorial)
+ @validate()
+
+ updateTutorial: (attributes) =>
+ @model.set
+ url: attributes.url
+ heading: attributes.title
+ description: attributes.description
+ image_url: if _.any(attributes.images) then attributes.images[0].url else ''
+ author: attributes.provider_name
+ author_url: attributes.provider_url
+
+ onRender: ->
+ @ui.tags.tagit({ availableTags: ALL_TAGS })
+
+ validate: ->
+ @model.isValid()
+
+ displayError: (model, error) ->
+ @ui.save_button.attr('disabled', 'disabled')
+ @ui.preview.hide()
+ @ui.url_group.addClass("error")
+ errorTag = $('<span>').addClass('help-inline').text(error)
+ @ui.url_group.find('.controls').append(errorTag)
+
+ save: (event) ->
+ event.preventDefault()
+ event.stopPropagation()
+ @model.set('tags', @ui.tags.val())
+ @ui.save_button.attr('disabled', 'disabled')
+ @collection.create(@model,
+ success: @savedSuccessfully
+ error: @couldNotSave
+ )
+
+ savedSuccessfully: (cake) =>
+ window.location.hash = "tutorials"
+
+ couldNotSave: (cake, xhr) =>
+ @ui.save_button.removeAttr('disabled')
+ error = new CakeSide.Views.ErrorView
+ el: @$('form#new-tutorial'),
+ attributesWithErrors: $.parseJSON(xhr.responseText)
+ error.render()
diff --git a/app/assets/javascripts/views/tutorials/no_tutorials_view.js.coffee b/app/assets/javascripts/views/tutorials/no_tutorials_view.js.coffee
new file mode 100644
index 00000000..979d52e9
--- /dev/null
+++ b/app/assets/javascripts/views/tutorials/no_tutorials_view.js.coffee
@@ -0,0 +1,5 @@
+CakeSide.Views.Tutorials ||= {}
+
+class CakeSide.Views.Tutorials.NoTutorialsView extends Marionette.ItemView
+ template: JST['templates/tutorials/no_tutorials']
+ tagName: 'li'
diff --git a/app/assets/javascripts/views/tutorials/show_view.js.coffee b/app/assets/javascripts/views/tutorials/show_view.js.coffee
new file mode 100644
index 00000000..544338d6
--- /dev/null
+++ b/app/assets/javascripts/views/tutorials/show_view.js.coffee
@@ -0,0 +1,7 @@
+CakeSide.Views.Tutorials ||= {}
+
+class CakeSide.Views.Tutorials.ShowView extends Marionette.ItemView
+ template: JST["templates/tutorials/show"]
+ templateHelpers:
+ displayDate: (date) ->
+ date
diff --git a/app/assets/javascripts/views/tutorials/tutorial_view.js.coffee b/app/assets/javascripts/views/tutorials/tutorial_view.js.coffee
new file mode 100644
index 00000000..6ec82e06
--- /dev/null
+++ b/app/assets/javascripts/views/tutorials/tutorial_view.js.coffee
@@ -0,0 +1,10 @@
+CakeSide.Views.Tutorials ||= {}
+
+class CakeSide.Views.Tutorials.TutorialView extends Marionette.ItemView
+ template: JST['templates/tutorials/tutorial']
+ tagName: 'div'
+ className: 'media'
+
+ templateHelpers:
+ displayDate: (date) ->
+ new Date(date).toLocaleDateString()