Setup of product variants

This commit is contained in:
2015-04-08 09:37:39 +02:00
parent 2503e09f65
commit a7a953dadb
13 changed files with 116 additions and 7 deletions
+2
View File
@@ -44,3 +44,5 @@ erl_crash.dump
/.project /.project
# dia # dia
/*.autosave /*.autosave
/db/data
/db/config
@@ -24,8 +24,11 @@ App.MenuProductComponent = Ember.Component.extend
makeEditable: -> @set('editMode', true) makeEditable: -> @set('editMode', true)
save: -> save: ->
return unless @get('product.isValid') return unless @get('product.isValid')
@get('product.product_variants').forEach (product_variant)->
product_variant.save() if product_variant.get('isDirty')
if @get('product.isDirty') if @get('product.isDirty')
@get('product').save().then((=> @set 'editMode', false), (-> true)) @get('product').save()
@set 'editMode', false
destroyProduct: (product)-> destroyProduct: (product)->
if product.get('isNew') if product.get('isNew')
product.deleteRecord() product.deleteRecord()
@@ -38,6 +41,8 @@ App.MenuProductComponent = Ember.Component.extend
if @get('product.isNew') if @get('product.isNew')
@get('product').deleteRecord() @get('product').deleteRecord()
else else
@get('product.product_variants').forEach (product_variant)->
product_variant.rollback()
@get('product').rollback() @get('product').rollback()
@set 'editMode', false @set 'editMode', false
didInsertElement: -> didInsertElement: ->
@@ -10,6 +10,7 @@ App.Product = DS.Model.extend Ember.Validations.Mixin,
image: attr() image: attr()
product_category: DS.belongsTo('product_category') product_category: DS.belongsTo('product_category')
product_orders: DS.hasMany('product_order') product_orders: DS.hasMany('product_order')
product_variants: DS.hasMany('product_variant')
image_src: (-> image_src: (->
image = @get('image') image = @get('image')
@@ -18,6 +19,12 @@ App.Product = DS.Model.extend Ember.Validations.Mixin,
image image
).property('image') ).property('image')
sorted_product_variants: Ember.computed 'product_variants.@each.name', 'product_variants.@each.position', ->
@get('product_variants').sortBy('position')
variantsDisplay: Ember.computed 'sorted_product_variants', ->
@get('sorted_product_variants').mapBy('name').join(', ')
#isValid: (-> #isValid: (->
#return false unless price = @get('price') #return false unless price = @get('price')
#return false unless "#{price}".match(/^[+-]?\d+(\.?\d?\d)?$/) #return false unless "#{price}".match(/^[+-]?\d+(\.?\d?\d)?$/)
@@ -0,0 +1,8 @@
attr = DS.attr
App.ProductVariant = DS.Model.extend Ember.Validations.Mixin,
name: attr 'string'
product: DS.belongsTo 'product'
position: attr 'number', defaultValue: 0
validations:
name:
presence: true
@@ -3,14 +3,14 @@ if editMode
.small-6.medium-3.columns.name .small-6.medium-3.columns.name
= input value=product.name placeholder=namePlaceholder action="save" = input value=product.name placeholder=namePlaceholder action="save"
= errors product.errors.name = errors product.errors.name
.small-6.medium-3.columns.actions
a.rollback-product-action{action "rollbackProduct"}: span
a.destroy-product-action{action "destroyProduct" product}: span
a.save-product-action{action "save"}: span
.small-6.medium-3.columns.price .small-6.medium-3.columns.price
= edit-currency value=product.price action="save" = edit-currency value=product.price action="save"
= errors product.errors.price = errors product.errors.price
.small-6.medium-3.columns.code= input value=product.code placeholder=codePlaceholder .small-6.medium-3.columns.code= input value=product.code placeholder=codePlaceholder
.small-6.medium-3.columns.actions
a.rollback-product-action{action "rollbackProduct"}: span
a.destroy-product-action{action "destroyProduct" product}: span
a.save-product-action{action "save"}: span
.row .row
.small-3.columns= t 'attributes.product.active' .small-3.columns= t 'attributes.product.active'
.small-9.columns: view boolean-switch value=product.active .small-9.columns: view boolean-switch value=product.active
@@ -21,6 +21,11 @@ if editMode
.small-12.medium-6.columns .small-12.medium-6.columns
= view "upload-file" name="image" accept="image/*" file=product.image = view "upload-file" name="image" accept="image/*" file=product.image
img src=product.image_src img src=product.image_src
each product_variant in product.product_variants
.row
.small-3.medium-2.large-1.columns plus
.small-9.medium-5.large-4.columns.end
= input value=product_variant.name
else else
if showProduct if showProduct
.row .row
@@ -34,3 +39,6 @@ else
.small-3.columns .small-3.columns
a.edit-product-action{action "makeEditable"}: span a.edit-product-action{action "makeEditable"}: span
/img src=product.image_src /img src=product.image_src
if product.product_variants
.row
.small-12.columns= product.variantsDisplay
@@ -0,0 +1,62 @@
module Suppliers
class ProductVariantsController < Suppliers::ApplicationController
layout 'tablet'
# GET /product_variants
# GET /product_variants.json
def index
end
# GET /product_variants/1
# GET /product_variants/1.json
def show
end
# GET /product_variants/new
# GET /product_variants/new.json
def new
end
# GET /product_variants/1/edit
def edit
end
# POST /product_variants
# POST /product_variants.json
def create
end
# PUT /product_variants/1
# PUT /product_variants/1.json
def update
@product_variant = ProductVariant.find(params[:id])
head :unprocessable_entity and return unless product_id = product_variant_params[:product_id]
product = Product.find(product_id)
head :forbidden and return unless product.supplier_id == current_supplier.id
if @product_variant.update_attributes(product_variant_params)
render json: @product_variant
else
render json: {errors: @product_variant.errors}, status: :unprocessable_entity
end
end
# DELETE /product_variants/1
# DELETE /product_variants/1.json
def destroy
@product_variant = ProductVariant.find_by_supplier_id_and_id!(current_supplier.id, params[:id])
@product_variant.destroy
respond_to do |format|
format.html { redirect_to suppliers_product_variants_url, notice: t('action.destroy.successfull', model: ProductVariant.model_name.human) }
format.json { head :no_content }
end
end
private
def product_variant_params
params.require(:product_variant).permit(:name, :product_id)
end
end
end
@@ -5,7 +5,7 @@ module Suppliers
end end
def show def show
[current_supplier].include_relations(sections: :tables, product_categories: :products) [current_supplier].include_relations(sections: :tables, product_categories: {products: :product_variants})
render json: current_supplier, serializer: Suppliers::SupplierSerializer #.new(current_supplier).as_json render json: current_supplier, serializer: Suppliers::SupplierSerializer #.new(current_supplier).as_json
end end
+1
View File
@@ -15,6 +15,7 @@ class Product
#has_and_belongs_to_many :product_categories, storing_keys: false #has_and_belongs_to_many :product_categories, storing_keys: false
belongs_to :supplier # direct! category is an aid belongs_to :supplier # direct! category is an aid
has_many :product_orders has_many :product_orders
has_many :product_variants
attr_protected :supplier_id attr_protected :supplier_id
+7
View File
@@ -0,0 +1,7 @@
class ProductVariant
include SimplyStored::Couch
include ActiveModel::SerializerSupport
property :name
property :position, type: Fixnum, default: 0
belongs_to :product
end
+3
View File
@@ -1,6 +1,9 @@
class ProductSerializer < Qwaiter::Serializer class ProductSerializer < Qwaiter::Serializer
root 'product'
attributes :name, :price, :description, :image, :code, :position, :visible, :active, :product_category_id attributes :name, :price, :description, :image, :code, :position, :visible, :active, :product_category_id
has_many :product_variants
def image def image
if object.image.present? if object.image.present?
{small: object.image.url(:small)} {small: object.image.url(:small)}
@@ -0,0 +1,4 @@
class ProductVariantSerializer < Qwaiter::Serializer
root 'product_variant'
attributes :name
end
+1
View File
@@ -139,6 +139,7 @@ Qwaiter::Application.routes.draw do
get :preview_products get :preview_products
end end
end end
resources :product_variants
resources :lists do resources :lists do
collection do collection do
get :active get :active
+2 -1
View File
@@ -1,7 +1,8 @@
db: db:
image: bterkuile/couchdb image: bterkuile/couchdb
volumes: volumes:
- db:/usr/local/var/lib/couchdb - db/data:/usr/local/var/lib/couchdb
- db/config:/usr/local/etc/couchdb
expose: expose:
- 5984 - 5984
net: host net: host