From b8dfe131c6c5fe9d0e5b4ee2d271feeb5d411502 Mon Sep 17 00:00:00 2001 From: mo Date: Sat, 2 Sep 2017 14:48:43 -0600 Subject: promote backbone subdirectory up to root. --- app/assets/javascripts/application.js | 4 +- app/assets/javascripts/backbone/cakeside.js.coffee | 67 ------------------ .../controllers/cakes_controller.js.coffee | 34 --------- .../controllers/dashboard_controller.js.coffee | 6 -- .../controllers/profile_controller.js.coffee | 18 ----- .../controllers/tutorials_controller.js.coffee | 29 -------- app/assets/javascripts/backbone/models/.gitkeep | 0 .../javascripts/backbone/models/cake.js.coffee | 27 -------- .../javascripts/backbone/models/category.js.coffee | 10 --- .../javascripts/backbone/models/photo.js.coffee | 30 -------- .../javascripts/backbone/models/profile.js.coffee | 38 ---------- .../backbone/models/tutorials.js.coffee | 24 ------- app/assets/javascripts/backbone/routers/.gitkeep | 0 .../backbone/routers/cakes_router.js.coffee | 7 -- .../backbone/routers/dashboard_router.js.coffee | 3 - .../backbone/routers/profile_router.js.coffee | 3 - .../backbone/routers/tutorials_router.js.coffee | 5 -- app/assets/javascripts/backbone/templates/.gitkeep | 0 .../backbone/templates/cakes/cake.jst.ejs | 13 ---- .../backbone/templates/cakes/delete_modal.jst.ejs | 32 --------- .../backbone/templates/cakes/edit.jst.ejs | 39 ----------- .../backbone/templates/cakes/new.jst.ejs | 18 ----- .../backbone/templates/cakes/no_cakes.jst.ejs | 1 - .../backbone/templates/cakes/show.jst.ejs | 26 ------- .../backbone/templates/cakes/thumbnail.jst.ejs | 8 --- .../backbone/templates/photos/new-modal.jst.ejs | 24 ------- .../backbone/templates/profiles/show.jst.ejs | 45 ------------ .../backbone/templates/tutorials/new.jst.ejs | 23 ------ .../templates/tutorials/no_tutorials.jst.ejs | 1 - .../backbone/templates/tutorials/show.jst.ejs | 16 ----- .../backbone/templates/tutorials/tutorial.jst.ejs | 7 -- app/assets/javascripts/backbone/views/.gitkeep | 0 .../backbone/views/cakes/cake_view.js.coffee | 13 ---- .../views/cakes/delete_cake_modal_view.js.coffee | 40 ----------- .../backbone/views/cakes/edit_view.js.coffee | 80 --------------------- .../backbone/views/cakes/index_view.js.coffee | 8 --- .../backbone/views/cakes/new_view.js.coffee | 63 ----------------- .../backbone/views/cakes/no_cakes_view.js.coffee | 5 -- .../backbone/views/cakes/show_view.js.coffee | 37 ---------- .../backbone/views/cakes/thumbnail_view.js.coffee | 13 ---- .../backbone/views/disqus_view.js.coffee | 32 --------- .../backbone/views/error_view.js.coffee | 27 -------- .../backbone/views/photos/new_modal_view.js.coffee | 50 ------------- .../backbone/views/profiles/show_view.js.coffee | 71 ------------------- .../backbone/views/tutorials/index_view.js.coffee | 9 --- .../backbone/views/tutorials/new_view.js.coffee | 68 ------------------ .../views/tutorials/no_tutorials_view.js.coffee | 5 -- .../backbone/views/tutorials/show_view.js.coffee | 7 -- .../views/tutorials/tutorial_view.js.coffee | 10 --- app/assets/javascripts/cakeside.js.coffee | 68 ++++++++++++++++++ .../controllers/cakes_controller.js.coffee | 34 +++++++++ .../controllers/dashboard_controller.js.coffee | 6 ++ .../controllers/profile_controller.js.coffee | 18 +++++ .../controllers/tutorials_controller.js.coffee | 29 ++++++++ app/assets/javascripts/models/.gitkeep | 0 app/assets/javascripts/models/cake.js.coffee | 27 ++++++++ app/assets/javascripts/models/category.js.coffee | 10 +++ app/assets/javascripts/models/photo.js.coffee | 30 ++++++++ app/assets/javascripts/models/profile.js.coffee | 38 ++++++++++ app/assets/javascripts/models/tutorials.js.coffee | 24 +++++++ app/assets/javascripts/routers/.gitkeep | 0 .../javascripts/routers/cakes_router.js.coffee | 7 ++ .../javascripts/routers/dashboard_router.js.coffee | 3 + .../javascripts/routers/profile_router.js.coffee | 3 + .../javascripts/routers/tutorials_router.js.coffee | 5 ++ app/assets/javascripts/templates/.gitkeep | 0 .../javascripts/templates/cakes/cake.jst.ejs | 13 ++++ .../templates/cakes/delete_modal.jst.ejs | 32 +++++++++ .../javascripts/templates/cakes/edit.jst.ejs | 39 +++++++++++ app/assets/javascripts/templates/cakes/new.jst.ejs | 18 +++++ .../javascripts/templates/cakes/no_cakes.jst.ejs | 1 + .../javascripts/templates/cakes/show.jst.ejs | 26 +++++++ .../javascripts/templates/cakes/thumbnail.jst.ejs | 8 +++ .../javascripts/templates/photos/new-modal.jst.ejs | 24 +++++++ .../javascripts/templates/profiles/show.jst.ejs | 45 ++++++++++++ .../javascripts/templates/tutorials/new.jst.ejs | 23 ++++++ .../templates/tutorials/no_tutorials.jst.ejs | 1 + .../javascripts/templates/tutorials/show.jst.ejs | 16 +++++ .../templates/tutorials/tutorial.jst.ejs | 7 ++ app/assets/javascripts/views/.gitkeep | 0 .../javascripts/views/cakes/cake_view.js.coffee | 13 ++++ .../views/cakes/delete_cake_modal_view.js.coffee | 40 +++++++++++ .../javascripts/views/cakes/edit_view.js.coffee | 81 ++++++++++++++++++++++ .../javascripts/views/cakes/index_view.js.coffee | 9 +++ .../javascripts/views/cakes/new_view.js.coffee | 63 +++++++++++++++++ .../views/cakes/no_cakes_view.js.coffee | 5 ++ .../javascripts/views/cakes/show_view.js.coffee | 38 ++++++++++ .../views/cakes/thumbnail_view.js.coffee | 13 ++++ app/assets/javascripts/views/disqus_view.js.coffee | 32 +++++++++ app/assets/javascripts/views/error_view.js.coffee | 25 +++++++ .../views/photos/new_modal_view.js.coffee | 50 +++++++++++++ .../javascripts/views/profiles/show_view.js.coffee | 71 +++++++++++++++++++ .../views/tutorials/index_view.js.coffee | 10 +++ .../javascripts/views/tutorials/new_view.js.coffee | 69 ++++++++++++++++++ .../views/tutorials/no_tutorials_view.js.coffee | 5 ++ .../views/tutorials/show_view.js.coffee | 7 ++ .../views/tutorials/tutorial_view.js.coffee | 10 +++ 97 files changed, 1097 insertions(+), 1095 deletions(-) delete mode 100644 app/assets/javascripts/backbone/cakeside.js.coffee delete mode 100644 app/assets/javascripts/backbone/controllers/cakes_controller.js.coffee delete mode 100644 app/assets/javascripts/backbone/controllers/dashboard_controller.js.coffee delete mode 100644 app/assets/javascripts/backbone/controllers/profile_controller.js.coffee delete mode 100644 app/assets/javascripts/backbone/controllers/tutorials_controller.js.coffee delete mode 100644 app/assets/javascripts/backbone/models/.gitkeep delete mode 100644 app/assets/javascripts/backbone/models/cake.js.coffee delete mode 100644 app/assets/javascripts/backbone/models/category.js.coffee delete mode 100644 app/assets/javascripts/backbone/models/photo.js.coffee delete mode 100644 app/assets/javascripts/backbone/models/profile.js.coffee delete mode 100644 app/assets/javascripts/backbone/models/tutorials.js.coffee delete mode 100644 app/assets/javascripts/backbone/routers/.gitkeep delete mode 100644 app/assets/javascripts/backbone/routers/cakes_router.js.coffee delete mode 100644 app/assets/javascripts/backbone/routers/dashboard_router.js.coffee delete mode 100644 app/assets/javascripts/backbone/routers/profile_router.js.coffee delete mode 100644 app/assets/javascripts/backbone/routers/tutorials_router.js.coffee delete mode 100644 app/assets/javascripts/backbone/templates/.gitkeep delete mode 100644 app/assets/javascripts/backbone/templates/cakes/cake.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/cakes/delete_modal.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/cakes/edit.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/cakes/new.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/cakes/no_cakes.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/cakes/show.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/cakes/thumbnail.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/photos/new-modal.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/profiles/show.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/tutorials/new.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/tutorials/no_tutorials.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/tutorials/show.jst.ejs delete mode 100644 app/assets/javascripts/backbone/templates/tutorials/tutorial.jst.ejs delete mode 100644 app/assets/javascripts/backbone/views/.gitkeep delete mode 100644 app/assets/javascripts/backbone/views/cakes/cake_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/cakes/delete_cake_modal_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/cakes/edit_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/cakes/index_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/cakes/new_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/cakes/no_cakes_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/cakes/show_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/cakes/thumbnail_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/disqus_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/error_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/photos/new_modal_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/profiles/show_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/tutorials/index_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/tutorials/new_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/tutorials/no_tutorials_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/tutorials/show_view.js.coffee delete mode 100644 app/assets/javascripts/backbone/views/tutorials/tutorial_view.js.coffee create mode 100644 app/assets/javascripts/cakeside.js.coffee create mode 100644 app/assets/javascripts/controllers/cakes_controller.js.coffee create mode 100644 app/assets/javascripts/controllers/dashboard_controller.js.coffee create mode 100644 app/assets/javascripts/controllers/profile_controller.js.coffee create mode 100644 app/assets/javascripts/controllers/tutorials_controller.js.coffee create mode 100644 app/assets/javascripts/models/.gitkeep create mode 100644 app/assets/javascripts/models/cake.js.coffee create mode 100644 app/assets/javascripts/models/category.js.coffee create mode 100644 app/assets/javascripts/models/photo.js.coffee create mode 100644 app/assets/javascripts/models/profile.js.coffee create mode 100644 app/assets/javascripts/models/tutorials.js.coffee create mode 100644 app/assets/javascripts/routers/.gitkeep create mode 100644 app/assets/javascripts/routers/cakes_router.js.coffee create mode 100644 app/assets/javascripts/routers/dashboard_router.js.coffee create mode 100644 app/assets/javascripts/routers/profile_router.js.coffee create mode 100644 app/assets/javascripts/routers/tutorials_router.js.coffee create mode 100644 app/assets/javascripts/templates/.gitkeep create mode 100644 app/assets/javascripts/templates/cakes/cake.jst.ejs create mode 100644 app/assets/javascripts/templates/cakes/delete_modal.jst.ejs create mode 100644 app/assets/javascripts/templates/cakes/edit.jst.ejs create mode 100644 app/assets/javascripts/templates/cakes/new.jst.ejs create mode 100644 app/assets/javascripts/templates/cakes/no_cakes.jst.ejs create mode 100644 app/assets/javascripts/templates/cakes/show.jst.ejs create mode 100644 app/assets/javascripts/templates/cakes/thumbnail.jst.ejs create mode 100644 app/assets/javascripts/templates/photos/new-modal.jst.ejs create mode 100644 app/assets/javascripts/templates/profiles/show.jst.ejs create mode 100644 app/assets/javascripts/templates/tutorials/new.jst.ejs create mode 100644 app/assets/javascripts/templates/tutorials/no_tutorials.jst.ejs create mode 100644 app/assets/javascripts/templates/tutorials/show.jst.ejs create mode 100644 app/assets/javascripts/templates/tutorials/tutorial.jst.ejs create mode 100644 app/assets/javascripts/views/.gitkeep create mode 100644 app/assets/javascripts/views/cakes/cake_view.js.coffee create mode 100644 app/assets/javascripts/views/cakes/delete_cake_modal_view.js.coffee create mode 100644 app/assets/javascripts/views/cakes/edit_view.js.coffee create mode 100644 app/assets/javascripts/views/cakes/index_view.js.coffee create mode 100644 app/assets/javascripts/views/cakes/new_view.js.coffee create mode 100644 app/assets/javascripts/views/cakes/no_cakes_view.js.coffee create mode 100644 app/assets/javascripts/views/cakes/show_view.js.coffee create mode 100644 app/assets/javascripts/views/cakes/thumbnail_view.js.coffee create mode 100644 app/assets/javascripts/views/disqus_view.js.coffee create mode 100644 app/assets/javascripts/views/error_view.js.coffee create mode 100644 app/assets/javascripts/views/photos/new_modal_view.js.coffee create mode 100644 app/assets/javascripts/views/profiles/show_view.js.coffee create mode 100644 app/assets/javascripts/views/tutorials/index_view.js.coffee create mode 100644 app/assets/javascripts/views/tutorials/new_view.js.coffee create mode 100644 app/assets/javascripts/views/tutorials/no_tutorials_view.js.coffee create mode 100644 app/assets/javascripts/views/tutorials/show_view.js.coffee create mode 100644 app/assets/javascripts/views/tutorials/tutorial_view.js.coffee (limited to 'app/assets/javascripts') diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 77563570..495d1be1 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -13,9 +13,8 @@ //= require backbone.marionette //= require backbone_rails_sync //= require backbone_datalink -//= require backbone/cakeside //= require backbone-model-file-upload -//= require_tree . +//= require cakeside var initialize = function(){ $(window).scroll(function(){ @@ -25,4 +24,3 @@ var initialize = function(){ }); }; $(document).ready(initialize); -$(document).on("page:load", initialize); diff --git a/app/assets/javascripts/backbone/cakeside.js.coffee b/app/assets/javascripts/backbone/cakeside.js.coffee deleted file mode 100644 index 6f468e52..00000000 --- a/app/assets/javascripts/backbone/cakeside.js.coffee +++ /dev/null @@ -1,67 +0,0 @@ -#= require_self -#= require_tree ./templates -#= require_tree ./models -#= require_tree ./views -#= require_tree ./controllers -#= require_tree ./routers - -window.CakeSide = - Models: {} - Collections: {} - Routers: {} - Views: {} - Controllers: {} - initialize: (data) -> - $(document).ajaxSend (event, xhr) -> - if data.access_token - xhr.setRequestHeader "Authorization", "Token token=#{data.access_token}" - - CakeSide.Application = new Marionette.Application() - CakeSide.Application.addRegions - content_region: '#backbone-content' - comment_region: '#disqus_thread' - - CakeSide.Application.addInitializer (options) -> - new CakeSide.Routers.CakesRouter - controller: new CakeSide.Controllers.CakesController() - new CakeSide.Routers.TutorialsRouter - controller: new CakeSide.Controllers.TutorialsController() - new CakeSide.Routers.DashboardRouter - controller: new CakeSide.Controllers.DashboardController() - new CakeSide.Routers.ProfileRouter - controller: new CakeSide.Controllers.ProfileController() - - CakeSide.Application.on 'start', -> - if Backbone.history - Backbone.history.start() - - @cakes = new CakeSide.Collections.CakesCollection() - @categories = new CakeSide.Collections.CategoriesCollection() - @tutorials = new CakeSide.Collections.TutorialsCollection() - - #@disqus_view = new CakeSide.Views.DisqusView - #disqus_shortname: data.disqus_shortname - #CakeSide.Application.reqres.setHandler 'CommentView', => - #@disqus_view - CakeSide.Application.reqres.setHandler 'CakesRepository', => - @cakes - CakeSide.Application.reqres.setHandler 'CategoriesRepository', => - @categories - @photos_cache = {} - CakeSide.Application.reqres.setHandler 'PhotosRepository', (cake_id) => - if @photos_cache[cake_id] - @photos_cache[cake_id] - else - photos = new CakeSide.Collections.PhotosCollection(cake_id: cake_id) - @photos_cache[cake_id] = photos - photos.fetch(reset: true) - photos - CakeSide.Application.reqres.setHandler 'TutorialsRepository', => - @tutorials - CakeSide.Application.reqres.setHandler 'ProfilesRepository', => - @profiles ||= new CakeSide.Collections.ProfilesCollection() - - @categories.fetch(reset: true) - @tutorials.fetch(reset: true) - @cakes.fetch(reset: true).done -> - CakeSide.Application.start() diff --git a/app/assets/javascripts/backbone/controllers/cakes_controller.js.coffee b/app/assets/javascripts/backbone/controllers/cakes_controller.js.coffee deleted file mode 100644 index 3167248b..00000000 --- a/app/assets/javascripts/backbone/controllers/cakes_controller.js.coffee +++ /dev/null @@ -1,34 +0,0 @@ -class CakeSide.Controllers.CakesController extends Marionette.Controller - views: CakeSide.Views.Cakes - initialize: (options) -> - @content_region = CakeSide.Application.content_region - @cakes = CakeSide.Application.request('CakesRepository') - #@comment_view = CakeSide.Application.request('CommentView') - - index: -> - @selectTab() - #@comment_view.hide() - @content_region.show(new @views.IndexView(collection: @cakes)) - - show: (id, photo_id) -> - @selectTab() - cake = @cakes.get(id) - @content_region.show(new @views.ShowView(model: cake, photo_id: photo_id)) - #@comment_view.render - #identifier: "c-#{cake.id}" - #title: cake.get('name') - #url: cake.public_url() - - newCake: -> - @selectTab() - #@comment_view.hide() - @content_region.show(new @views.NewView(collection: @cakes)) - - edit: (id) -> - @selectTab() - @content_region.show(new @views.EditView(model: @cakes.get(id))) - #@comment_view.hide() - - selectTab: -> - $('.nav-link').removeClass('active') - $('a[href="/my#cakes/new"]').addClass('active') diff --git a/app/assets/javascripts/backbone/controllers/dashboard_controller.js.coffee b/app/assets/javascripts/backbone/controllers/dashboard_controller.js.coffee deleted file mode 100644 index 23169914..00000000 --- a/app/assets/javascripts/backbone/controllers/dashboard_controller.js.coffee +++ /dev/null @@ -1,6 +0,0 @@ -class CakeSide.Controllers.DashboardController extends Marionette.Controller - initialize: (options) -> - #@comment_view = CakeSide.Application.request('CommentView') - - index: -> - #@comment_view.hide() diff --git a/app/assets/javascripts/backbone/controllers/profile_controller.js.coffee b/app/assets/javascripts/backbone/controllers/profile_controller.js.coffee deleted file mode 100644 index c8577e2a..00000000 --- a/app/assets/javascripts/backbone/controllers/profile_controller.js.coffee +++ /dev/null @@ -1,18 +0,0 @@ -class CakeSide.Controllers.ProfileController extends Marionette.Controller - views: CakeSide.Views.Profiles - initialize: (options) -> - @content_region = CakeSide.Application.content_region - #@comment_view = CakeSide.Application.request('CommentView') - - show: (id) -> - @selectTab() - #@comment_view.hide() - profile = new CakeSide.Models.Profile - id: id - profile.fetch - success: => - @content_region.show(new @views.ShowView(model: profile)) - - selectTab: -> - $('.nav-link').removeClass('active') - $('a[href="/my#profile/me"]').addClass('active') diff --git a/app/assets/javascripts/backbone/controllers/tutorials_controller.js.coffee b/app/assets/javascripts/backbone/controllers/tutorials_controller.js.coffee deleted file mode 100644 index 732bea3e..00000000 --- a/app/assets/javascripts/backbone/controllers/tutorials_controller.js.coffee +++ /dev/null @@ -1,29 +0,0 @@ -class CakeSide.Controllers.TutorialsController extends Marionette.Controller - views: CakeSide.Views.Tutorials - initialize: (options) -> - @content_region = CakeSide.Application.content_region - @tutorials = CakeSide.Application.request('TutorialsRepository') - #@comment_view = CakeSide.Application.request('CommentView') - - index: -> - @selectTab() - #@comment_view.hide() - @content_region.show(new @views.IndexView(collection: @tutorials)) - - new: -> - @selectTab() - #@comment_view.hide() - @content_region.show(new @views.NewView(collection: @tutorials)) - - show: (id) -> - @selectTab() - tutorial = @tutorials.get(id) - @content_region.show(new @views.ShowView(model: tutorial)) - #@comment_view.render - #identifier: "t-#{tutorial.id}" - #title: tutorial.get('heading') - #url: tutorial.get('url') - - selectTab: -> - $('.nav-link').removeClass('active') - $('a[href="/my#tutorials/new"]').addClass('active') diff --git a/app/assets/javascripts/backbone/models/.gitkeep b/app/assets/javascripts/backbone/models/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/assets/javascripts/backbone/models/cake.js.coffee b/app/assets/javascripts/backbone/models/cake.js.coffee deleted file mode 100644 index 7f925394..00000000 --- a/app/assets/javascripts/backbone/models/cake.js.coffee +++ /dev/null @@ -1,27 +0,0 @@ -class CakeSide.Models.Cake extends Backbone.Model - paramRoot: 'cake' - - defaults: - id: null - name: null - story: null - created_at: null - updated_at: null - category_id: null - - validate: (attributes, options) -> - return "Name can't be blank" unless attributes.name && attributes.name.trim() - return "Category can't be blank" unless attributes.category_id - - photos: -> - CakeSide.Application.request('PhotosRepository', @id) - - public_url: -> - "#{window.location.origin}/creations/#{@get('slug')}" - - category_id: -> - @get('category_id') || @get('category').id - -class CakeSide.Collections.CakesCollection extends Backbone.Collection - model: CakeSide.Models.Cake - url: '/api/v1/cakes' diff --git a/app/assets/javascripts/backbone/models/category.js.coffee b/app/assets/javascripts/backbone/models/category.js.coffee deleted file mode 100644 index 98437966..00000000 --- a/app/assets/javascripts/backbone/models/category.js.coffee +++ /dev/null @@ -1,10 +0,0 @@ -class CakeSide.Models.Category extends Backbone.Model - paramRoot: 'category' - - defaults: - name: null - slug: null - -class CakeSide.Collections.CategoriesCollection extends Backbone.Collection - model: CakeSide.Models.Category - url: '/api/v1/categories' diff --git a/app/assets/javascripts/backbone/models/photo.js.coffee b/app/assets/javascripts/backbone/models/photo.js.coffee deleted file mode 100644 index eb1cff76..00000000 --- a/app/assets/javascripts/backbone/models/photo.js.coffee +++ /dev/null @@ -1,30 +0,0 @@ -class CakeSide.Models.Photo extends Backbone.Model - paramRoot: 'photo' - fileAttribute: 'image' - - defaults: - id: null - cake_id: null - content_type: null - original_filename: null - thumb_url: null - large_url: null - original_url: null - created_at: null - updated_at: null - - initialize: (options) -> - @set('cake_id', options.cake_id) - if options.id - @url="/api/v1/cakes/#{options.cake_id}/photos/#{options.id}" - else - @url="/api/v1/cakes/#{options.cake_id}/photos" - - super(options) - -class CakeSide.Collections.PhotosCollection extends Backbone.Collection - model: CakeSide.Models.Photo - - initialize: (options) -> - @set('cake_id', options.cake_id) - @url="/api/v1/cakes/#{options.cake_id}/photos" diff --git a/app/assets/javascripts/backbone/models/profile.js.coffee b/app/assets/javascripts/backbone/models/profile.js.coffee deleted file mode 100644 index 189d83e4..00000000 --- a/app/assets/javascripts/backbone/models/profile.js.coffee +++ /dev/null @@ -1,38 +0,0 @@ -class CakeSide.Models.Profile extends Backbone.Model - paramRoot: 'profile' - urlRoot: '/api/v1/profiles' - modelEvents: - "change": "render" - - defaults: - id: null - name: null - email: null - city: null - website: null - facebook: null - twitter: null - - validate: (attributes, options) -> - return "Name can't be blank" unless attributes.name && attributes.name.trim() - return "Email can't be blank" unless attributes.email && attributes.email.trim() - return "Email is invalid" unless @validateEmail(attributes.email) - return "URL is invalid" if attributes.website && !@validateUrl(attributes.website) - return "Twitter handle is invalid" if !@validateTwitter(attributes.twitter) - - validateEmail: (email) -> - regex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ - regex.test(email) - - validateUrl: (url) -> - regex = new RegExp( "^" + "(?:(?:https?|ftp)://)" + "(?:\\S+(?::\\S*)?@)?" + "(?:" + "(?!(?:10|127)(?:\\.\\d{1,3}){3})" + "(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" + "(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})" + "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" + "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" + "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" + "|" + "(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)" + "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*" + "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" + ")" + "(?::\\d{2,5})?" + "(?:/\\S*)?" + "$", "i") - regex.test(url) - - validateTwitter: (twitter) -> - return true unless twitter - regex = /^@?(\w){1,15}$/ - regex.test(twitter) - -class CakeSide.Collections.ProfilesCollection extends Backbone.Collection - model: CakeSide.Models.Profile - url: '/api/v1/profiles' diff --git a/app/assets/javascripts/backbone/models/tutorials.js.coffee b/app/assets/javascripts/backbone/models/tutorials.js.coffee deleted file mode 100644 index 9e2e8a1f..00000000 --- a/app/assets/javascripts/backbone/models/tutorials.js.coffee +++ /dev/null @@ -1,24 +0,0 @@ -class CakeSide.Models.Tutorial extends Backbone.Model - paramRoot: 'tutorial' - - defaults: - id: null - url: null - image_url: null - heading: null - description: null - - validate: (attributes, options) -> - return "Invalid Url." unless @isValidUrl(attributes.url || '') - return "This tutorial has no photos." unless @hasImage(attributes.image_url) - - isValidUrl: (url) -> - expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi; - url.match(new RegExp(expression)) - - hasImage: (image_url) -> - image_url - -class CakeSide.Collections.TutorialsCollection extends Backbone.Collection - model: CakeSide.Models.Tutorial - url: '/api/v1/tutorials' diff --git a/app/assets/javascripts/backbone/routers/.gitkeep b/app/assets/javascripts/backbone/routers/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/assets/javascripts/backbone/routers/cakes_router.js.coffee b/app/assets/javascripts/backbone/routers/cakes_router.js.coffee deleted file mode 100644 index 5a0922ae..00000000 --- a/app/assets/javascripts/backbone/routers/cakes_router.js.coffee +++ /dev/null @@ -1,7 +0,0 @@ -class CakeSide.Routers.CakesRouter extends Marionette.AppRouter - appRoutes: - "cakes/new": "newCake" - "cakes/:id/edit": "edit" - "cakes/:id": "show" - "cakes/:id/photos/:photo_id": "show" - "cakes": "index" diff --git a/app/assets/javascripts/backbone/routers/dashboard_router.js.coffee b/app/assets/javascripts/backbone/routers/dashboard_router.js.coffee deleted file mode 100644 index 513b2f04..00000000 --- a/app/assets/javascripts/backbone/routers/dashboard_router.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -class CakeSide.Routers.DashboardRouter extends Marionette.AppRouter - appRoutes: - "": "index" diff --git a/app/assets/javascripts/backbone/routers/profile_router.js.coffee b/app/assets/javascripts/backbone/routers/profile_router.js.coffee deleted file mode 100644 index cf83d4ae..00000000 --- a/app/assets/javascripts/backbone/routers/profile_router.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -class CakeSide.Routers.ProfileRouter extends Marionette.AppRouter - appRoutes: - "profile/:id": "show" diff --git a/app/assets/javascripts/backbone/routers/tutorials_router.js.coffee b/app/assets/javascripts/backbone/routers/tutorials_router.js.coffee deleted file mode 100644 index 9c942e88..00000000 --- a/app/assets/javascripts/backbone/routers/tutorials_router.js.coffee +++ /dev/null @@ -1,5 +0,0 @@ -class CakeSide.Routers.TutorialsRouter extends Marionette.AppRouter - appRoutes: - "tutorials": "index" - "tutorials/new": "new" - "tutorials/:id": "show" diff --git a/app/assets/javascripts/backbone/templates/.gitkeep b/app/assets/javascripts/backbone/templates/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/assets/javascripts/backbone/templates/cakes/cake.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/cake.jst.ejs deleted file mode 100644 index e9800ad5..00000000 --- a/app/assets/javascripts/backbone/templates/cakes/cake.jst.ejs +++ /dev/null @@ -1,13 +0,0 @@ -<% if(hasImage()) { %> - <% photo = randomPhoto() %> - - 64x64 - -<% } %> -
-

<%= name %>

-

- edit - fanclub -

-
diff --git a/app/assets/javascripts/backbone/templates/cakes/delete_modal.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/delete_modal.jst.ejs deleted file mode 100644 index 370109d5..00000000 --- a/app/assets/javascripts/backbone/templates/cakes/delete_modal.jst.ejs +++ /dev/null @@ -1,32 +0,0 @@ - diff --git a/app/assets/javascripts/backbone/templates/cakes/edit.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/edit.jst.ejs deleted file mode 100644 index cab7fc92..00000000 --- a/app/assets/javascripts/backbone/templates/cakes/edit.jst.ejs +++ /dev/null @@ -1,39 +0,0 @@ -
-
-

Edit <%= cake.name %>

-
-
- -
- - -
-
- - -
-
- - -
-
- - <% if (typeof(cake.tags) === "string") { %> - <% tags = _.map(cake.tags.split(','), function(x){ return x; }) %> - <% } else { %> - <% tags = _.map(cake.tags, function(x){ return x.name; }) %> - <% } %> - -
- - Cancel -
-
-
-
diff --git a/app/assets/javascripts/backbone/templates/cakes/new.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/new.jst.ejs deleted file mode 100644 index cc26c43b..00000000 --- a/app/assets/javascripts/backbone/templates/cakes/new.jst.ejs +++ /dev/null @@ -1,18 +0,0 @@ -

Share cake

-
-
-
- - -
-
- - -
- - Cancel -
diff --git a/app/assets/javascripts/backbone/templates/cakes/no_cakes.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/no_cakes.jst.ejs deleted file mode 100644 index 9d8787ba..00000000 --- a/app/assets/javascripts/backbone/templates/cakes/no_cakes.jst.ejs +++ /dev/null @@ -1 +0,0 @@ -

You haven't shared any creations yet. Get Started

diff --git a/app/assets/javascripts/backbone/templates/cakes/show.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/show.jst.ejs deleted file mode 100644 index 45fb0cd8..00000000 --- a/app/assets/javascripts/backbone/templates/cakes/show.jst.ejs +++ /dev/null @@ -1,26 +0,0 @@ -
-
-

<%= name %>

-
- <% if (typeof(tags) === "string") { %> - <% _.each(tags.split(','), function(tag){ %> - - <%= tag %> - - <% }); %> - <% } else { %> - <% _.each(tags, function(tag){ %> - - <%= tag.name %> - - <% }); %> - <% } %> - -

<%= story %>

-
-
-
diff --git a/app/assets/javascripts/backbone/templates/cakes/thumbnail.jst.ejs b/app/assets/javascripts/backbone/templates/cakes/thumbnail.jst.ejs deleted file mode 100644 index 7ae1bef3..00000000 --- a/app/assets/javascripts/backbone/templates/cakes/thumbnail.jst.ejs +++ /dev/null @@ -1,8 +0,0 @@ -<% if (uploading()) { %> -
-
<%= percentComplete %>%
-
-<% } %> - - - diff --git a/app/assets/javascripts/backbone/templates/photos/new-modal.jst.ejs b/app/assets/javascripts/backbone/templates/photos/new-modal.jst.ejs deleted file mode 100644 index c138b423..00000000 --- a/app/assets/javascripts/backbone/templates/photos/new-modal.jst.ejs +++ /dev/null @@ -1,24 +0,0 @@ - diff --git a/app/assets/javascripts/backbone/templates/profiles/show.jst.ejs b/app/assets/javascripts/backbone/templates/profiles/show.jst.ejs deleted file mode 100644 index 150073d8..00000000 --- a/app/assets/javascripts/backbone/templates/profiles/show.jst.ejs +++ /dev/null @@ -1,45 +0,0 @@ -

Public Profile

-
- - -
-
- - - -
-
- - - -
-
- - - -
-
- - - -
-
- -
- @ - -
- -
-
- - - -
- - -
diff --git a/app/assets/javascripts/backbone/templates/tutorials/new.jst.ejs b/app/assets/javascripts/backbone/templates/tutorials/new.jst.ejs deleted file mode 100644 index 965a62f1..00000000 --- a/app/assets/javascripts/backbone/templates/tutorials/new.jst.ejs +++ /dev/null @@ -1,23 +0,0 @@ -

Share a tutorial link

-
-
-
- - -
-
- - -

Note: help people find this tutorial by adding some keyword tags

-
- - Cancel -
-
- -
-

<%= heading %>

-

-

<%= description %>

-
-
diff --git a/app/assets/javascripts/backbone/templates/tutorials/no_tutorials.jst.ejs b/app/assets/javascripts/backbone/templates/tutorials/no_tutorials.jst.ejs deleted file mode 100644 index ab9705b1..00000000 --- a/app/assets/javascripts/backbone/templates/tutorials/no_tutorials.jst.ejs +++ /dev/null @@ -1 +0,0 @@ -

You have no tutorials. Get Started

diff --git a/app/assets/javascripts/backbone/templates/tutorials/show.jst.ejs b/app/assets/javascripts/backbone/templates/tutorials/show.jst.ejs deleted file mode 100644 index 7dcbea00..00000000 --- a/app/assets/javascripts/backbone/templates/tutorials/show.jst.ejs +++ /dev/null @@ -1,16 +0,0 @@ -
-
-

<%= heading %> <%= displayDate(created_at) %>

- - - -

- <% _.each(tags, function(tag) { %> - - <%= tag.name %> - - <% }); %> -

-

<%= description %>

-
-
diff --git a/app/assets/javascripts/backbone/templates/tutorials/tutorial.jst.ejs b/app/assets/javascripts/backbone/templates/tutorials/tutorial.jst.ejs deleted file mode 100644 index 255344d7..00000000 --- a/app/assets/javascripts/backbone/templates/tutorials/tutorial.jst.ejs +++ /dev/null @@ -1,7 +0,0 @@ - - 64x64 - -
-

<%= heading %>

- <%= description %> -
diff --git a/app/assets/javascripts/backbone/views/.gitkeep b/app/assets/javascripts/backbone/views/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/app/assets/javascripts/backbone/views/cakes/cake_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/cake_view.js.coffee deleted file mode 100644 index f0faf97e..00000000 --- a/app/assets/javascripts/backbone/views/cakes/cake_view.js.coffee +++ /dev/null @@ -1,13 +0,0 @@ -CakeSide.Views.Cakes ||= {} - -class CakeSide.Views.Cakes.CakeView extends Marionette.ItemView - template: JST["backbone/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/backbone/views/cakes/delete_cake_modal_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/delete_cake_modal_view.js.coffee deleted file mode 100644 index 85253924..00000000 --- a/app/assets/javascripts/backbone/views/cakes/delete_cake_modal_view.js.coffee +++ /dev/null @@ -1,40 +0,0 @@ -CakeSide.Views.Cakes ||= {} - -class CakeSide.Views.Cakes.DeleteCakeModalView extends Marionette.ItemView - template: JST["backbone/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/backbone/views/cakes/edit_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/edit_view.js.coffee deleted file mode 100644 index 84883bd3..00000000 --- a/app/assets/javascripts/backbone/views/cakes/edit_view.js.coffee +++ /dev/null @@ -1,80 +0,0 @@ -#= require backbone/views/cakes/thumbnail_view -CakeSide.Views.Cakes ||= {} - -class CakeSide.Views.Cakes.EditView extends Marionette.CompositeView - template : JST["backbone/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/backbone/views/cakes/index_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/index_view.js.coffee deleted file mode 100644 index 6d6d2f9a..00000000 --- a/app/assets/javascripts/backbone/views/cakes/index_view.js.coffee +++ /dev/null @@ -1,8 +0,0 @@ -#= require backbone/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/backbone/views/cakes/new_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/new_view.js.coffee deleted file mode 100644 index 321be655..00000000 --- a/app/assets/javascripts/backbone/views/cakes/new_view.js.coffee +++ /dev/null @@ -1,63 +0,0 @@ -CakeSide.Views.Cakes ||= {} - -class CakeSide.Views.Cakes.NewView extends Marionette.ItemView - template: JST["backbone/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/backbone/views/cakes/no_cakes_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/no_cakes_view.js.coffee deleted file mode 100644 index 278d7d37..00000000 --- a/app/assets/javascripts/backbone/views/cakes/no_cakes_view.js.coffee +++ /dev/null @@ -1,5 +0,0 @@ -CakeSide.Views.Cakes ||= {} - -class CakeSide.Views.Cakes.NoCakesView extends Marionette.ItemView - template: JST["backbone/templates/cakes/no_cakes"] - tagName: 'li' diff --git a/app/assets/javascripts/backbone/views/cakes/show_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/show_view.js.coffee deleted file mode 100644 index d225e93f..00000000 --- a/app/assets/javascripts/backbone/views/cakes/show_view.js.coffee +++ /dev/null @@ -1,37 +0,0 @@ -#= require backbone/views/cakes/thumbnail_view -CakeSide.Views.Cakes ||= {} - -class CakeSide.Views.Cakes.ShowView extends Marionette.CompositeView - template: JST["backbone/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/backbone/views/cakes/thumbnail_view.js.coffee b/app/assets/javascripts/backbone/views/cakes/thumbnail_view.js.coffee deleted file mode 100644 index 085a8f11..00000000 --- a/app/assets/javascripts/backbone/views/cakes/thumbnail_view.js.coffee +++ /dev/null @@ -1,13 +0,0 @@ -CakeSide.Views.Cakes ||= {} - -class CakeSide.Views.Cakes.ThumbnailView extends Marionette.ItemView - template: JST['backbone/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/backbone/views/disqus_view.js.coffee b/app/assets/javascripts/backbone/views/disqus_view.js.coffee deleted file mode 100644 index 1379691a..00000000 --- a/app/assets/javascripts/backbone/views/disqus_view.js.coffee +++ /dev/null @@ -1,32 +0,0 @@ -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/backbone/views/error_view.js.coffee b/app/assets/javascripts/backbone/views/error_view.js.coffee deleted file mode 100644 index 86f907e0..00000000 --- a/app/assets/javascripts/backbone/views/error_view.js.coffee +++ /dev/null @@ -1,27 +0,0 @@ -CakeSide.Views.Cakes ||= {} - -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 = $('

').addClass('inline-errors').text(errorString) - field.append(errorTag) - field.addClass("error") - - fieldFor: (attribute) -> - @$("#cake_#{attribute}").parent() diff --git a/app/assets/javascripts/backbone/views/photos/new_modal_view.js.coffee b/app/assets/javascripts/backbone/views/photos/new_modal_view.js.coffee deleted file mode 100644 index b618ef16..00000000 --- a/app/assets/javascripts/backbone/views/photos/new_modal_view.js.coffee +++ /dev/null @@ -1,50 +0,0 @@ -CakeSide.Views.Photos ||= {} - -class CakeSide.Views.Photos.NewModalView extends Marionette.ItemView - template: JST["backbone/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/backbone/views/profiles/show_view.js.coffee b/app/assets/javascripts/backbone/views/profiles/show_view.js.coffee deleted file mode 100644 index d7f36ae5..00000000 --- a/app/assets/javascripts/backbone/views/profiles/show_view.js.coffee +++ /dev/null @@ -1,71 +0,0 @@ -CakeSide.Views.Profiles ||= {} - -class CakeSide.Views.Profiles.ShowView extends Marionette.ItemView - template: JST["backbone/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/backbone/views/tutorials/index_view.js.coffee b/app/assets/javascripts/backbone/views/tutorials/index_view.js.coffee deleted file mode 100644 index 6cdce8db..00000000 --- a/app/assets/javascripts/backbone/views/tutorials/index_view.js.coffee +++ /dev/null @@ -1,9 +0,0 @@ -#= require backbone/views/tutorials/no_tutorials_view -#= require backbone/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/backbone/views/tutorials/new_view.js.coffee b/app/assets/javascripts/backbone/views/tutorials/new_view.js.coffee deleted file mode 100644 index e8ba976f..00000000 --- a/app/assets/javascripts/backbone/views/tutorials/new_view.js.coffee +++ /dev/null @@ -1,68 +0,0 @@ -#= require service/embedly_service -class CakeSide.Views.Tutorials.NewView extends Marionette.ItemView - template: JST['backbone/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 = $('').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/backbone/views/tutorials/no_tutorials_view.js.coffee b/app/assets/javascripts/backbone/views/tutorials/no_tutorials_view.js.coffee deleted file mode 100644 index 77b2e71c..00000000 --- a/app/assets/javascripts/backbone/views/tutorials/no_tutorials_view.js.coffee +++ /dev/null @@ -1,5 +0,0 @@ -CakeSide.Views.Tutorials ||= {} - -class CakeSide.Views.Tutorials.NoTutorialsView extends Marionette.ItemView - template: JST['backbone/templates/tutorials/no_tutorials'] - tagName: 'li' diff --git a/app/assets/javascripts/backbone/views/tutorials/show_view.js.coffee b/app/assets/javascripts/backbone/views/tutorials/show_view.js.coffee deleted file mode 100644 index 9f6ef782..00000000 --- a/app/assets/javascripts/backbone/views/tutorials/show_view.js.coffee +++ /dev/null @@ -1,7 +0,0 @@ -CakeSide.Views.Tutorials ||= {} - -class CakeSide.Views.Tutorials.ShowView extends Marionette.ItemView - template: JST["backbone/templates/tutorials/show"] - templateHelpers: - displayDate: (date) -> - date diff --git a/app/assets/javascripts/backbone/views/tutorials/tutorial_view.js.coffee b/app/assets/javascripts/backbone/views/tutorials/tutorial_view.js.coffee deleted file mode 100644 index 2766b53e..00000000 --- a/app/assets/javascripts/backbone/views/tutorials/tutorial_view.js.coffee +++ /dev/null @@ -1,10 +0,0 @@ -CakeSide.Views.Tutorials ||= {} - -class CakeSide.Views.Tutorials.TutorialView extends Marionette.ItemView - template: JST['backbone/templates/tutorials/tutorial'] - tagName: 'div' - className: 'media' - - templateHelpers: - displayDate: (date) -> - new Date(date).toLocaleDateString() diff --git a/app/assets/javascripts/cakeside.js.coffee b/app/assets/javascripts/cakeside.js.coffee new file mode 100644 index 00000000..7ed82c0e --- /dev/null +++ b/app/assets/javascripts/cakeside.js.coffee @@ -0,0 +1,68 @@ +#= require_self +#= require_tree ./templates +#= require_tree ./models +#= require_tree ./views +#= require_tree ./controllers +#= require_tree ./routers +#= require_tree ./service + +window.CakeSide = + Models: {} + Collections: {} + Routers: {} + Views: {} + Controllers: {} + initialize: (data) -> + $(document).ajaxSend (event, xhr) -> + if data.access_token + xhr.setRequestHeader "Authorization", "Token token=#{data.access_token}" + + CakeSide.Application = new Marionette.Application() + CakeSide.Application.addRegions + content_region: '#backbone-content' + comment_region: '#disqus_thread' + + CakeSide.Application.addInitializer (options) -> + new CakeSide.Routers.CakesRouter + controller: new CakeSide.Controllers.CakesController() + new CakeSide.Routers.TutorialsRouter + controller: new CakeSide.Controllers.TutorialsController() + new CakeSide.Routers.DashboardRouter + controller: new CakeSide.Controllers.DashboardController() + new CakeSide.Routers.ProfileRouter + controller: new CakeSide.Controllers.ProfileController() + + CakeSide.Application.on 'start', -> + if Backbone.history + Backbone.history.start() + + @cakes = new CakeSide.Collections.CakesCollection() + @categories = new CakeSide.Collections.CategoriesCollection() + @tutorials = new CakeSide.Collections.TutorialsCollection() + + #@disqus_view = new CakeSide.Views.DisqusView + #disqus_shortname: data.disqus_shortname + #CakeSide.Application.reqres.setHandler 'CommentView', => + #@disqus_view + CakeSide.Application.reqres.setHandler 'CakesRepository', => + @cakes + CakeSide.Application.reqres.setHandler 'CategoriesRepository', => + @categories + @photos_cache = {} + CakeSide.Application.reqres.setHandler 'PhotosRepository', (cake_id) => + if @photos_cache[cake_id] + @photos_cache[cake_id] + else + photos = new CakeSide.Collections.PhotosCollection(cake_id: cake_id) + @photos_cache[cake_id] = photos + photos.fetch(reset: true) + photos + CakeSide.Application.reqres.setHandler 'TutorialsRepository', => + @tutorials + CakeSide.Application.reqres.setHandler 'ProfilesRepository', => + @profiles ||= new CakeSide.Collections.ProfilesCollection() + + @categories.fetch(reset: true) + @tutorials.fetch(reset: true) + @cakes.fetch(reset: true).done -> + CakeSide.Application.start() diff --git a/app/assets/javascripts/controllers/cakes_controller.js.coffee b/app/assets/javascripts/controllers/cakes_controller.js.coffee new file mode 100644 index 00000000..3167248b --- /dev/null +++ b/app/assets/javascripts/controllers/cakes_controller.js.coffee @@ -0,0 +1,34 @@ +class CakeSide.Controllers.CakesController extends Marionette.Controller + views: CakeSide.Views.Cakes + initialize: (options) -> + @content_region = CakeSide.Application.content_region + @cakes = CakeSide.Application.request('CakesRepository') + #@comment_view = CakeSide.Application.request('CommentView') + + index: -> + @selectTab() + #@comment_view.hide() + @content_region.show(new @views.IndexView(collection: @cakes)) + + show: (id, photo_id) -> + @selectTab() + cake = @cakes.get(id) + @content_region.show(new @views.ShowView(model: cake, photo_id: photo_id)) + #@comment_view.render + #identifier: "c-#{cake.id}" + #title: cake.get('name') + #url: cake.public_url() + + newCake: -> + @selectTab() + #@comment_view.hide() + @content_region.show(new @views.NewView(collection: @cakes)) + + edit: (id) -> + @selectTab() + @content_region.show(new @views.EditView(model: @cakes.get(id))) + #@comment_view.hide() + + selectTab: -> + $('.nav-link').removeClass('active') + $('a[href="/my#cakes/new"]').addClass('active') diff --git a/app/assets/javascripts/controllers/dashboard_controller.js.coffee b/app/assets/javascripts/controllers/dashboard_controller.js.coffee new file mode 100644 index 00000000..23169914 --- /dev/null +++ b/app/assets/javascripts/controllers/dashboard_controller.js.coffee @@ -0,0 +1,6 @@ +class CakeSide.Controllers.DashboardController extends Marionette.Controller + initialize: (options) -> + #@comment_view = CakeSide.Application.request('CommentView') + + index: -> + #@comment_view.hide() diff --git a/app/assets/javascripts/controllers/profile_controller.js.coffee b/app/assets/javascripts/controllers/profile_controller.js.coffee new file mode 100644 index 00000000..c8577e2a --- /dev/null +++ b/app/assets/javascripts/controllers/profile_controller.js.coffee @@ -0,0 +1,18 @@ +class CakeSide.Controllers.ProfileController extends Marionette.Controller + views: CakeSide.Views.Profiles + initialize: (options) -> + @content_region = CakeSide.Application.content_region + #@comment_view = CakeSide.Application.request('CommentView') + + show: (id) -> + @selectTab() + #@comment_view.hide() + profile = new CakeSide.Models.Profile + id: id + profile.fetch + success: => + @content_region.show(new @views.ShowView(model: profile)) + + selectTab: -> + $('.nav-link').removeClass('active') + $('a[href="/my#profile/me"]').addClass('active') diff --git a/app/assets/javascripts/controllers/tutorials_controller.js.coffee b/app/assets/javascripts/controllers/tutorials_controller.js.coffee new file mode 100644 index 00000000..732bea3e --- /dev/null +++ b/app/assets/javascripts/controllers/tutorials_controller.js.coffee @@ -0,0 +1,29 @@ +class CakeSide.Controllers.TutorialsController extends Marionette.Controller + views: CakeSide.Views.Tutorials + initialize: (options) -> + @content_region = CakeSide.Application.content_region + @tutorials = CakeSide.Application.request('TutorialsRepository') + #@comment_view = CakeSide.Application.request('CommentView') + + index: -> + @selectTab() + #@comment_view.hide() + @content_region.show(new @views.IndexView(collection: @tutorials)) + + new: -> + @selectTab() + #@comment_view.hide() + @content_region.show(new @views.NewView(collection: @tutorials)) + + show: (id) -> + @selectTab() + tutorial = @tutorials.get(id) + @content_region.show(new @views.ShowView(model: tutorial)) + #@comment_view.render + #identifier: "t-#{tutorial.id}" + #title: tutorial.get('heading') + #url: tutorial.get('url') + + selectTab: -> + $('.nav-link').removeClass('active') + $('a[href="/my#tutorials/new"]').addClass('active') diff --git a/app/assets/javascripts/models/.gitkeep b/app/assets/javascripts/models/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/app/assets/javascripts/models/cake.js.coffee b/app/assets/javascripts/models/cake.js.coffee new file mode 100644 index 00000000..7f925394 --- /dev/null +++ b/app/assets/javascripts/models/cake.js.coffee @@ -0,0 +1,27 @@ +class CakeSide.Models.Cake extends Backbone.Model + paramRoot: 'cake' + + defaults: + id: null + name: null + story: null + created_at: null + updated_at: null + category_id: null + + validate: (attributes, options) -> + return "Name can't be blank" unless attributes.name && attributes.name.trim() + return "Category can't be blank" unless attributes.category_id + + photos: -> + CakeSide.Application.request('PhotosRepository', @id) + + public_url: -> + "#{window.location.origin}/creations/#{@get('slug')}" + + category_id: -> + @get('category_id') || @get('category').id + +class CakeSide.Collections.CakesCollection extends Backbone.Collection + model: CakeSide.Models.Cake + url: '/api/v1/cakes' diff --git a/app/assets/javascripts/models/category.js.coffee b/app/assets/javascripts/models/category.js.coffee new file mode 100644 index 00000000..98437966 --- /dev/null +++ b/app/assets/javascripts/models/category.js.coffee @@ -0,0 +1,10 @@ +class CakeSide.Models.Category extends Backbone.Model + paramRoot: 'category' + + defaults: + name: null + slug: null + +class CakeSide.Collections.CategoriesCollection extends Backbone.Collection + model: CakeSide.Models.Category + url: '/api/v1/categories' diff --git a/app/assets/javascripts/models/photo.js.coffee b/app/assets/javascripts/models/photo.js.coffee new file mode 100644 index 00000000..eb1cff76 --- /dev/null +++ b/app/assets/javascripts/models/photo.js.coffee @@ -0,0 +1,30 @@ +class CakeSide.Models.Photo extends Backbone.Model + paramRoot: 'photo' + fileAttribute: 'image' + + defaults: + id: null + cake_id: null + content_type: null + original_filename: null + thumb_url: null + large_url: null + original_url: null + created_at: null + updated_at: null + + initialize: (options) -> + @set('cake_id', options.cake_id) + if options.id + @url="/api/v1/cakes/#{options.cake_id}/photos/#{options.id}" + else + @url="/api/v1/cakes/#{options.cake_id}/photos" + + super(options) + +class CakeSide.Collections.PhotosCollection extends Backbone.Collection + model: CakeSide.Models.Photo + + initialize: (options) -> + @set('cake_id', options.cake_id) + @url="/api/v1/cakes/#{options.cake_id}/photos" diff --git a/app/assets/javascripts/models/profile.js.coffee b/app/assets/javascripts/models/profile.js.coffee new file mode 100644 index 00000000..189d83e4 --- /dev/null +++ b/app/assets/javascripts/models/profile.js.coffee @@ -0,0 +1,38 @@ +class CakeSide.Models.Profile extends Backbone.Model + paramRoot: 'profile' + urlRoot: '/api/v1/profiles' + modelEvents: + "change": "render" + + defaults: + id: null + name: null + email: null + city: null + website: null + facebook: null + twitter: null + + validate: (attributes, options) -> + return "Name can't be blank" unless attributes.name && attributes.name.trim() + return "Email can't be blank" unless attributes.email && attributes.email.trim() + return "Email is invalid" unless @validateEmail(attributes.email) + return "URL is invalid" if attributes.website && !@validateUrl(attributes.website) + return "Twitter handle is invalid" if !@validateTwitter(attributes.twitter) + + validateEmail: (email) -> + regex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ + regex.test(email) + + validateUrl: (url) -> + regex = new RegExp( "^" + "(?:(?:https?|ftp)://)" + "(?:\\S+(?::\\S*)?@)?" + "(?:" + "(?!(?:10|127)(?:\\.\\d{1,3}){3})" + "(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" + "(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})" + "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" + "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" + "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" + "|" + "(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)" + "(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*" + "(?:\\.(?:[a-z\\u00a1-\\uffff]{2,}))" + ")" + "(?::\\d{2,5})?" + "(?:/\\S*)?" + "$", "i") + regex.test(url) + + validateTwitter: (twitter) -> + return true unless twitter + regex = /^@?(\w){1,15}$/ + regex.test(twitter) + +class CakeSide.Collections.ProfilesCollection extends Backbone.Collection + model: CakeSide.Models.Profile + url: '/api/v1/profiles' diff --git a/app/assets/javascripts/models/tutorials.js.coffee b/app/assets/javascripts/models/tutorials.js.coffee new file mode 100644 index 00000000..9e2e8a1f --- /dev/null +++ b/app/assets/javascripts/models/tutorials.js.coffee @@ -0,0 +1,24 @@ +class CakeSide.Models.Tutorial extends Backbone.Model + paramRoot: 'tutorial' + + defaults: + id: null + url: null + image_url: null + heading: null + description: null + + validate: (attributes, options) -> + return "Invalid Url." unless @isValidUrl(attributes.url || '') + return "This tutorial has no photos." unless @hasImage(attributes.image_url) + + isValidUrl: (url) -> + expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi; + url.match(new RegExp(expression)) + + hasImage: (image_url) -> + image_url + +class CakeSide.Collections.TutorialsCollection extends Backbone.Collection + model: CakeSide.Models.Tutorial + url: '/api/v1/tutorials' diff --git a/app/assets/javascripts/routers/.gitkeep b/app/assets/javascripts/routers/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/app/assets/javascripts/routers/cakes_router.js.coffee b/app/assets/javascripts/routers/cakes_router.js.coffee new file mode 100644 index 00000000..5a0922ae --- /dev/null +++ b/app/assets/javascripts/routers/cakes_router.js.coffee @@ -0,0 +1,7 @@ +class CakeSide.Routers.CakesRouter extends Marionette.AppRouter + appRoutes: + "cakes/new": "newCake" + "cakes/:id/edit": "edit" + "cakes/:id": "show" + "cakes/:id/photos/:photo_id": "show" + "cakes": "index" diff --git a/app/assets/javascripts/routers/dashboard_router.js.coffee b/app/assets/javascripts/routers/dashboard_router.js.coffee new file mode 100644 index 00000000..513b2f04 --- /dev/null +++ b/app/assets/javascripts/routers/dashboard_router.js.coffee @@ -0,0 +1,3 @@ +class CakeSide.Routers.DashboardRouter extends Marionette.AppRouter + appRoutes: + "": "index" diff --git a/app/assets/javascripts/routers/profile_router.js.coffee b/app/assets/javascripts/routers/profile_router.js.coffee new file mode 100644 index 00000000..cf83d4ae --- /dev/null +++ b/app/assets/javascripts/routers/profile_router.js.coffee @@ -0,0 +1,3 @@ +class CakeSide.Routers.ProfileRouter extends Marionette.AppRouter + appRoutes: + "profile/:id": "show" diff --git a/app/assets/javascripts/routers/tutorials_router.js.coffee b/app/assets/javascripts/routers/tutorials_router.js.coffee new file mode 100644 index 00000000..9c942e88 --- /dev/null +++ b/app/assets/javascripts/routers/tutorials_router.js.coffee @@ -0,0 +1,5 @@ +class CakeSide.Routers.TutorialsRouter extends Marionette.AppRouter + appRoutes: + "tutorials": "index" + "tutorials/new": "new" + "tutorials/:id": "show" diff --git a/app/assets/javascripts/templates/.gitkeep b/app/assets/javascripts/templates/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/app/assets/javascripts/templates/cakes/cake.jst.ejs b/app/assets/javascripts/templates/cakes/cake.jst.ejs new file mode 100644 index 00000000..e9800ad5 --- /dev/null +++ b/app/assets/javascripts/templates/cakes/cake.jst.ejs @@ -0,0 +1,13 @@ +<% if(hasImage()) { %> + <% photo = randomPhoto() %> + + 64x64 + +<% } %> +

+

<%= name %>

+

+ edit + fanclub +

+
diff --git a/app/assets/javascripts/templates/cakes/delete_modal.jst.ejs b/app/assets/javascripts/templates/cakes/delete_modal.jst.ejs new file mode 100644 index 00000000..370109d5 --- /dev/null +++ b/app/assets/javascripts/templates/cakes/delete_modal.jst.ejs @@ -0,0 +1,32 @@ + diff --git a/app/assets/javascripts/templates/cakes/edit.jst.ejs b/app/assets/javascripts/templates/cakes/edit.jst.ejs new file mode 100644 index 00000000..cab7fc92 --- /dev/null +++ b/app/assets/javascripts/templates/cakes/edit.jst.ejs @@ -0,0 +1,39 @@ +
+
+

Edit <%= cake.name %>

+
+
+ +
+ + +
+
+ + +
+
+ + +
+
+ + <% if (typeof(cake.tags) === "string") { %> + <% tags = _.map(cake.tags.split(','), function(x){ return x; }) %> + <% } else { %> + <% tags = _.map(cake.tags, function(x){ return x.name; }) %> + <% } %> + +
+ + Cancel +
+
+
+
diff --git a/app/assets/javascripts/templates/cakes/new.jst.ejs b/app/assets/javascripts/templates/cakes/new.jst.ejs new file mode 100644 index 00000000..cc26c43b --- /dev/null +++ b/app/assets/javascripts/templates/cakes/new.jst.ejs @@ -0,0 +1,18 @@ +

Share cake

+
+
+
+ + +
+
+ + +
+ + Cancel +
diff --git a/app/assets/javascripts/templates/cakes/no_cakes.jst.ejs b/app/assets/javascripts/templates/cakes/no_cakes.jst.ejs new file mode 100644 index 00000000..9d8787ba --- /dev/null +++ b/app/assets/javascripts/templates/cakes/no_cakes.jst.ejs @@ -0,0 +1 @@ +

You haven't shared any creations yet. Get Started

diff --git a/app/assets/javascripts/templates/cakes/show.jst.ejs b/app/assets/javascripts/templates/cakes/show.jst.ejs new file mode 100644 index 00000000..45fb0cd8 --- /dev/null +++ b/app/assets/javascripts/templates/cakes/show.jst.ejs @@ -0,0 +1,26 @@ +
+
+

<%= name %>

+
+ <% if (typeof(tags) === "string") { %> + <% _.each(tags.split(','), function(tag){ %> + + <%= tag %> + + <% }); %> + <% } else { %> + <% _.each(tags, function(tag){ %> + + <%= tag.name %> + + <% }); %> + <% } %> + +

<%= story %>

+
+
+
diff --git a/app/assets/javascripts/templates/cakes/thumbnail.jst.ejs b/app/assets/javascripts/templates/cakes/thumbnail.jst.ejs new file mode 100644 index 00000000..7ae1bef3 --- /dev/null +++ b/app/assets/javascripts/templates/cakes/thumbnail.jst.ejs @@ -0,0 +1,8 @@ +<% if (uploading()) { %> +
+
<%= percentComplete %>%
+
+<% } %> + + + diff --git a/app/assets/javascripts/templates/photos/new-modal.jst.ejs b/app/assets/javascripts/templates/photos/new-modal.jst.ejs new file mode 100644 index 00000000..c138b423 --- /dev/null +++ b/app/assets/javascripts/templates/photos/new-modal.jst.ejs @@ -0,0 +1,24 @@ + diff --git a/app/assets/javascripts/templates/profiles/show.jst.ejs b/app/assets/javascripts/templates/profiles/show.jst.ejs new file mode 100644 index 00000000..150073d8 --- /dev/null +++ b/app/assets/javascripts/templates/profiles/show.jst.ejs @@ -0,0 +1,45 @@ +

Public Profile

+
+ + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ +
+ @ + +
+ +
+
+ + + +
+ + +
diff --git a/app/assets/javascripts/templates/tutorials/new.jst.ejs b/app/assets/javascripts/templates/tutorials/new.jst.ejs new file mode 100644 index 00000000..965a62f1 --- /dev/null +++ b/app/assets/javascripts/templates/tutorials/new.jst.ejs @@ -0,0 +1,23 @@ +

Share a tutorial link

+
+
+
+ + +
+
+ + +

Note: help people find this tutorial by adding some keyword tags

+
+ + Cancel +
+
+ +
+

<%= heading %>

+

+

<%= description %>

+
+
diff --git a/app/assets/javascripts/templates/tutorials/no_tutorials.jst.ejs b/app/assets/javascripts/templates/tutorials/no_tutorials.jst.ejs new file mode 100644 index 00000000..ab9705b1 --- /dev/null +++ b/app/assets/javascripts/templates/tutorials/no_tutorials.jst.ejs @@ -0,0 +1 @@ +

You have no tutorials. Get Started

diff --git a/app/assets/javascripts/templates/tutorials/show.jst.ejs b/app/assets/javascripts/templates/tutorials/show.jst.ejs new file mode 100644 index 00000000..7dcbea00 --- /dev/null +++ b/app/assets/javascripts/templates/tutorials/show.jst.ejs @@ -0,0 +1,16 @@ +
+
+

<%= heading %> <%= displayDate(created_at) %>

+ + + +

+ <% _.each(tags, function(tag) { %> + + <%= tag.name %> + + <% }); %> +

+

<%= description %>

+
+
diff --git a/app/assets/javascripts/templates/tutorials/tutorial.jst.ejs b/app/assets/javascripts/templates/tutorials/tutorial.jst.ejs new file mode 100644 index 00000000..255344d7 --- /dev/null +++ b/app/assets/javascripts/templates/tutorials/tutorial.jst.ejs @@ -0,0 +1,7 @@ + + 64x64 + +
+

<%= heading %>

+ <%= description %> +
diff --git a/app/assets/javascripts/views/.gitkeep b/app/assets/javascripts/views/.gitkeep new file mode 100644 index 00000000..e69de29b 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 = $('

').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 = $('').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() -- cgit v1.2.3