diff options
| author | mo <mokha@cisco.com> | 2017-09-02 14:48:43 -0600 |
|---|---|---|
| committer | mo <mokha@cisco.com> | 2017-09-02 14:48:43 -0600 |
| commit | b8dfe131c6c5fe9d0e5b4ee2d271feeb5d411502 (patch) | |
| tree | 05b475a8b6442e2a43d9529c42362a3460df7d13 /app/assets/javascripts/views | |
| parent | bba21d02643d632fee5fa4bdbc876d44832ccf4b (diff) | |
promote backbone subdirectory up to root.
Diffstat (limited to 'app/assets/javascripts/views')
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() |
