Commit dfef69e6

mo khan <mo@mokhan.ca>
2014-06-30 03:55:02
fix the edit cake page.
1 parent 9921cc7
Changed files (8)
app
assets
controllers
services
views
app/assets/javascripts/backbone/templates/cakes/edit.jst.ejs
@@ -1,54 +1,55 @@
 <div class="row">
   <div class="span12">
-    <h1><small>Edit</small> <%= name %> <small>(Step 1 of 2)</small></h1>
+    <h1><small>Edit</small> <%= cake.name %> <small>(Step 1 of 2)</small></h1>
     <hr />
-    <form id="edit-cake" name="cake">
+    <form id="edit-cake" name="cake" class="form-horizontal">
       <fieldset>
         <div class="control-group">
-          <label class="control-label" for="name" />
+          <label class="control-label" for="cake_name">Name*</label>
           <div class="controls">
-            <input type="text" name="name" id="name" value="<%= name %>" class="input-xxlarge" />
+            <input class="input-xxlarge" id="cake_name" name="name" type="text" value="<%= cake.name %>" />
           </div>
         </div>
         <div class="control-group">
-          <label class="control-label" for="watermark" />
+          <label class="control-label" for="cake_watermark">Watermark</label>
           <div class="controls">
-            <input type="text" name="watermark" id="watermark" value="<%= watermark %>" class="input-xxlarge" max='30' />
+            <input class="input-xlarge" id="cake_watermark" maxlength="30" name="watermark" size="30" type="text" value="<%= cake.watermark %>"> on CakeSide.com
             <a class="tooltip-item" data-placement="right" rel="tooltip" href="#" data-original-title="Watermark your name or company on each uploaded image" data-animation="true"><i class="icon-question-sign"></i></a>
           </div>
         </div>
         <div class="control-group">
-          <label class="control-label" for="story" />
+          <label class="control-label" for="cake_story">Description</label>
           <div class="controls">
-            <textarea id="story" name="story" class="input=xxlarge" rows="3">
-            </textarea>
+            <textarea class="input-xxlarge" id="cake_story" name="story" rows="3"><%= cake.story %></textarea>
           </div>
         </div>
         <div class="control-group">
           <label class="control-label">Category</label>
           <div class="controls">
-            <select>
-            <option>Cake</option>
+            <select id="cake_category_id" name="category_id">
+              <% _.each(categories, function(category) { %>
+              <option value="<%= category.id %>"><%= category.name %></option>
+              <% }); %>
             </select>
           </div>
         </div>
         <div class="control-group">
-          <label for="tags" class="control-label">Tags</label>
+          <label for="cake_tags" class="control-label">Tags</label>
           <div class="controls">
-            <input name="creation_tags" type="text" id="tags" value="" class="input-xxlarge" autocomplete="off" />
+            <input name="cake_tags" type="text" id="cake_tags" value="<%= _.map(cake.tags, function(x){ return x.name; }) %>" class="input-xxlarge" autocomplete="off" />
           </div>
         </div>
         <div class="control-group">
           <div class="controls">
             <label class="checkbox">
-              <input type="checkbox" name="is_restricted" id="is_restricted" class="input-xxlarge" />
+              <input class="input-xxlarge" id="cake_is_restricted" type="checkbox" <%= cake.is_restricted ? "checked=checked" : "" %> />
               This cake is for adults only.
             </label>
           </div>
         </div>
         <div class="form-actions">
-          <button type="submit" class="btn btn-primary">NEXT STEP</button>
-          <a href="#/index" class="btn">Cancel</a>
+          <button id='save-button' type="submit" class="btn btn-primary">NEXT STEP</button>
+          <a href="#/cakes/<%= cake.id %>" class="btn">Cancel</a>
         </div>
       </fieldset>
     </form>
app/assets/javascripts/backbone/templates/cakes/new.jst.ejs
@@ -42,7 +42,7 @@
         <div class="control-group">
           <div class="controls">
             <label class="checkbox">
-              <input name="is_restricted" type="hidden" value="0"><input class="input-xxlarge" id="cake_is_restricted" type="checkbox" value="1">
+              <input class="input-xxlarge" id="cake_is_restricted" type="checkbox" />
               This cake is for adults only.
             </label>
           </div>
app/assets/javascripts/backbone/templates/cakes/show.jst.ejs
@@ -1,4 +1,3 @@
-
 <div class="row">
   <div class="span6">
     <% if(_.any(photos)) { %>
@@ -20,11 +19,9 @@
     <p><%= story %></p>
   </div>
 </div>
-
 <div class="row">
   <div class="span12">
     <a id="add-photo" class="btn">Add Photo</a>
-    <a href="<%= Routes.creation_photos_path(id) %>">View photos &raquo;</a>
   </div>
   <div class="span12">
     <ul class="thumbnails"></ul>
app/assets/javascripts/backbone/views/cakes/edit_view.js.coffee
@@ -1,24 +1,70 @@
 CakeSide.Views.Cakes ||= {}
 
-class CakeSide.Views.Cakes.EditView extends Backbone.View
+class CakeSide.Views.Cakes.EditView extends Marionette.ItemView
   template : JST["backbone/templates/cakes/edit"]
+  ui:
+    name: "#cake_name"
+    watermark: "#cake_watermark"
+    description: "#cake_story"
+    category: "#cake_category_id"
+    tags: "#cake_tags"
+    is_restricted: "#cake_is_restricted"
+    save_button: '#save-button'
+
+  modelEvents:
+    'invalid': 'displayError'
 
   events :
+    "change input": "refreshStatus"
+    "change select": "refreshStatus"
     "submit #edit-cake" : "update"
 
   update : (e) ->
     e.preventDefault()
     e.stopPropagation()
-
+    @disableSaveButton()
     @model.save(null,
-      success : (cake) =>
-        @model = cake
-        window.location.hash = "/#{@model.id}"
+      success: @savedSuccessfully
+      error: @couldNotSave
     )
 
-  render : ->
-    $(@el).html(@template(@model.toJSON() ))
+  onRender: ->
+    @$("#cake_category_id").val($("#cake_category_id option:first").val())
+    @$('#cake_tags').tagit({ availableTags: ALL_TAGS })
+    @$('.tooltip-item').tooltip()
+
+  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('watermark', @ui.watermark.val())
+    @model.set('story', @ui.description.val())
+    @model.set('category_id', @ui.category.val())
+    @model.set('tags', @ui.tags.val())
+    @model.set('is_restricted', @ui.is_restricted.val() == "" ? "true" : "false")
+    @model.isValid()
+
+  displayError: (model, error) ->
+    @disableSaveButton()
+
+  enableSaveButton: ->
+    @ui.save_button.removeAttr('disabled')
+
+  disableSaveButton: ->
+    @ui.save_button.attr('disabled', 'disabled')
 
-    this.$("form").backboneLink(@model)
+  serializeData: ->
+    {
+      cake: @model.toJSON(),
+      categories: CakeSide.Application.request('CategoriesRepository').toJSON(),
+    }
 
-    return this
app/assets/javascripts/backbone/views/cakes/new_view.js.coffee
@@ -53,7 +53,7 @@ class CakeSide.Views.Cakes.NewView extends Marionette.ItemView
     @model.set('story', @ui.description.val())
     @model.set('category_id', @ui.category.val())
     @model.set('tags', @ui.tags.val())
-    @model.set('is_restricted', @ui.is_restricted.val())
+    @model.set('is_restricted', @ui.is_restricted.val() == "" ? "true" : "false")
     @model.isValid()
 
   displayError: (model, error) ->
app/controllers/api/v1/cakes_controller.rb
@@ -12,7 +12,7 @@ module Api
       end
 
       def create
-        CreateCakeCommand.new(self).run(cake_params, params[:cake][:cake_tags])
+        CreateCakeCommand.new(self).run(cake_params, params[:cake][:tags])
       end
 
       def create_cake_succeeded(cake)
@@ -24,13 +24,21 @@ module Api
       end
 
       def update
-        raise params.inspect
+        UpdateCakeCommand.new(self).run(params[:id], params[:cake][:tags], cake_params)
+      end
+
+      def update_cake_succeeded(cake)
+        respond_with(@cake = cake)
+      end
+
+      def update_cake_failed(cake)
+        respond_with(@cake = cake)
       end
 
       private
 
       def cake_params
-        params.require(:cake).permit(:name, :story, :is_restricted, :watermark, :category_id)
+        params.require(:cake).permit(:name, :story, :is_restricted, :watermark, :category_id, :tags)
       end
     end
   end
app/services/application/update_cake_command.rb
@@ -9,7 +9,7 @@ class UpdateCakeCommand
     cake = current_user.creations.find(id)
     current_user.tag(cake, with: tags, on: :tags)
 
-    if cake.update_attributes(creation_params)
+    if cake.update_attributes(creation_params.reject { |key, value| key == "tags" })
       @context.update_cake_succeeded(cake)
     else
       @context.update_cake_failed(cake)
app/views/api/v1/cakes/_cake.json.jbuilder
@@ -1,6 +1,8 @@
 json.id cake.id
 json.name cake.name
 json.story cake.story
+json.watermark cake.watermark
+json.is_restricted cake.is_restricted
 json.category do
   json.id cake.category.id
   json.name cake.category.name