Commit dfef69e6
Changed files (8)
app
assets
javascripts
backbone
templates
views
controllers
api
services
application
views
api
v1
cakes
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 »</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