diff --git a/app/assets/javascripts/qrammer.js.coffee b/app/assets/javascripts/qrammer.js.coffee
new file mode 100644
index 00000000..929e9bfe
--- /dev/null
+++ b/app/assets/javascripts/qrammer.js.coffee
@@ -0,0 +1,53 @@
+root = exports ? this
+root.Qrammer =
+ alert: (msg) ->
+ alert(msg)
+ confirm: (callback, content) ->
+ content ||= 'Are you sure?'
+ wrapper = $('
')
+ callback_wrapper = ->
+ wrapper.modal('hide')
+ callback()
+ header = $('')
+ .append('')
+ .append('Confirm
').appendTo(wrapper)
+ body = $('').append(''+content+'
').appendTo(wrapper)
+ footer = $('')
+ .append($('Close').click(-> wrapper.modal('hide')))
+ .append($('Yes').click(callback_wrapper))
+ .appendTo(wrapper)
+ wrapper.modal()
+ currency: (num) ->
+ num = 0.0 if isNaN(num) || num == '' || num == null
+ '€ ' + parseFloat(num).toFixed(2)
+ add_product: (product) ->
+ window.active_list = {} unless window.active_list
+ window.active_list[product._id] = {product: product, number: 0} unless window.active_list[product._id]
+ window.active_list[product._id].number += 1
+ Qrammer.build_product_list()
+ build_product_list: ->
+ wrapper = $('')
+ callback_wrapper = ->
+ wrapper.modal('hide')
+ callback()
+ header = $('')
+ .append('')
+ .append('Product list
').appendTo(wrapper)
+
+ body = $('')
+ table = $('').appendTo(body)
+ tbody = $('').appendTo(table)
+ for product_id, info of window.active_list
+ row = $('
').appendTo(tbody)
+ row.append(''+info.product.name+' | ')
+ row.append(''+info.number+' | ')
+ row.append(''+Qrammer.currency(info.product.price * info.number)+' | ')
+
+ body.appendTo(wrapper)
+
+ footer = $('')
+ .append($('Close').click(-> wrapper.modal('hide')))
+ .append($('Yes').click(callback_wrapper))
+ .appendTo(wrapper)
+ wrapper.modal()
+
diff --git a/app/controllers/suppliers_controller.rb b/app/controllers/suppliers_controller.rb
index 1d533ea5..1a4b1241 100644
--- a/app/controllers/suppliers_controller.rb
+++ b/app/controllers/suppliers_controller.rb
@@ -92,6 +92,7 @@ class SuppliersController < ApplicationController
format.json do
products = @supplier.products
products.include_relation(:product_categories)
+ products.sort_by!{|p| p.product_category.try(:position) || 90000}
h = products.inject({}){|h, p| n = p.product_category.try(:name) || 'other'; h[n] ||= []; h[n] << p; h}
render json: h
end
diff --git a/app/models/product.rb b/app/models/product.rb
index 8a9d68ae..c243a0d8 100644
--- a/app/models/product.rb
+++ b/app/models/product.rb
@@ -3,7 +3,7 @@ class Product
property :name
property :code
- property :price
+ property :price, type: Float
belongs_to :product_category
belongs_to :supplier # direct! category is an aid
diff --git a/app/models/product_category.rb b/app/models/product_category.rb
index 63437d58..3cade073 100644
--- a/app/models/product_category.rb
+++ b/app/models/product_category.rb
@@ -2,6 +2,11 @@ class ProductCategory
include SimplyStored::Couch
property :name
+ property :position, type: Fixnum, default: 0
+
belongs_to :supplier
has_many :products
+
+ validates :position, numericality: true
+ validates :supplier_id, presence: true
end
diff --git a/app/views/dashboard/show_products.html.slim b/app/views/dashboard/show_products.html.slim
index 950bc197..c99ac7dc 100644
--- a/app/views/dashboard/show_products.html.slim
+++ b/app/views/dashboard/show_products.html.slim
@@ -1,3 +1,4 @@
+button onClick='Qrammer.build_product_list()' class='btn btn-inverse'Lijst
table#products-table.table.table-striped.table-hover
tbody
- content_for :footer do
@@ -6,10 +7,21 @@ table#products-table.table.table-striped.table-hover
$.get('#{product_list_supplier_path(@supplier, format: :json).html_safe}', function(res){
window.products = res
body = $('#products-table tbody')
- for(category in window.products){
- body.append(''+category+' |
')
- for(iproduct in window.products[category]){
- body.append('| '+window.products[category][iproduct].name+' |
')
+ for(var category in window.products){
+ body.append(''+category+' |
');
+ var category_ref = window.products[category];
+ for(var iproduct = 0; iproduct < window.products[category].length; iproduct++){
+ var product_index = iproduct;
+ row = $('
');
+ button = $('');
+ var callback = (function(ref){
+ return function(){ Qrammer.add_product(ref[product_index]) }
+ })(category_ref)
+ button.click(callback);
+ row.append(''+window.products[category][iproduct].name+' | ');
+ row.append(''+Qrammer.currency(window.products[category][iproduct].price)+' | ');
+ row.append($(' | ').append(button));
+ body.append(row);
}
}
})
diff --git a/app/views/layouts/application.html.slim b/app/views/layouts/application.html.slim
index 2441dbe7..1f69807d 100644
--- a/app/views/layouts/application.html.slim
+++ b/app/views/layouts/application.html.slim
@@ -51,12 +51,11 @@ html lang="en"
= yield
.span3
.well.sidebar-nav
- h3 Sidebar
+ h3 Qrammer
ul.nav.nav-list
- li.nav-header Sidebar
- li= link_to "Link 1", "/path1"
- li= link_to "Link 2", "/path2"
- li= link_to "Link 3", "/path3"
+ li.nav-header Links
+ li= link_to "Home", root_path
+ li= link_to "Companytools", 'http://www.companytools.nl/'
footer
p © Companytools 2012
diff --git a/app/views/product_categories/_form.html.slim b/app/views/product_categories/_form.html.slim
index 62cda1ff..2b645dee 100644
--- a/app/views/product_categories/_form.html.slim
+++ b/app/views/product_categories/_form.html.slim
@@ -4,6 +4,10 @@
= f.label :name, class: 'control-label'
.controls
= f.text_field :name, class: 'text_field'
+ .control-group class=(@product_category.errors[:position].any? ? 'error' : nil)
+ = f.label :position, class: 'control-label'
+ .controls
+ = f.text_field :position, class: 'text_field'
.control-group class=(@product_category.errors[:supplier_id].any? ? 'error' : nil)
= f.label :supplier_id, Supplier.model_name.human, class: 'control-label'
.controls
diff --git a/app/views/product_categories/index.html.slim b/app/views/product_categories/index.html.slim
index a3fb20d2..1391c790 100644
--- a/app/views/product_categories/index.html.slim
+++ b/app/views/product_categories/index.html.slim
@@ -5,6 +5,7 @@ div.page-header= title :index, model_class
thead
tr
th= model_class.human_attribute_name(:name)
+ th= model_class.human_attribute_name(:position)
th= Supplier.model_name.human
th= model_class.human_attribute_name(:created_at)
th=t 'helpers.actions'
@@ -12,7 +13,8 @@ div.page-header= title :index, model_class
- @product_categories.each do |product_category|
tr
td= link_to product_category.name, product_category
- td= link_to product_category.supplier.name, product_category.supplier
+ td= product_category.position
+ td= link_to_if product_category.supplier.present?, product_category.supplier.try(:name), product_category.supplier
td=l product_category.created_at, format: :short
td
= link_to t('helpers.links.edit'), [:edit, product_category], class: 'btn btn-mini'
diff --git a/app/views/product_categories/show.html.slim b/app/views/product_categories/show.html.slim
index 9b2ed4a7..89ecd5b9 100644
--- a/app/views/product_categories/show.html.slim
+++ b/app/views/product_categories/show.html.slim
@@ -4,8 +4,11 @@
dl.dl-horizontal.show-list
dt= model_class.human_attribute_name(:name)
dd= @product_category.name
- dt= Supplier.model_name.human
- dd= link_to @product_category.supplier.name, @product_category.supplier
+ dt= model_class.human_attribute_name(:position)
+ dd= @product_category.position
+ - if @product_category.supplier.present?
+ dt= Supplier.model_name.human
+ dd= link_to @product_category.supplier.name, @product_category.supplier
.form-actions
= link_to t("helpers.links.back"), product_categories_path, class: 'btn'
diff --git a/app/views/products/index.html.slim b/app/views/products/index.html.slim
index 5bd89ce4..cf21bdb5 100644
--- a/app/views/products/index.html.slim
+++ b/app/views/products/index.html.slim
@@ -17,8 +17,8 @@ div.page-header= title :index, model_class
td= link_to product.name, product
td= product.code
td= product.price
- td= link_to product.product_category.name, product.product_category
- td= link_to product.supplier.name, product.supplier
+ td= link_to_if product.product_category.present?, product.product_category.try(:name), product.product_category
+ td= link_to_if product.supplier.present?, product.supplier.try(:name), product.supplier
td=l product.created_at, format: :short
td
= link_to t('helpers.links.edit'), [:edit, product], class: 'btn btn-mini'
diff --git a/lib/generators/bootstrap/themed/templates/index.html.slim b/lib/generators/bootstrap/themed/templates/index.html.slim
index f6f4185e..e32c195d 100644
--- a/lib/generators/bootstrap/themed/templates/index.html.slim
+++ b/lib/generators/bootstrap/themed/templates/index.html.slim
@@ -22,7 +22,7 @@ div.page-header= title :index, model_class
td= <%= resource_name %>.<%= column.name %>
<%- end end -%>
<%- belongs_to_associations.each do |association| -%>
- td= link_to <%= resource_name %>.<%= association.name %>.<%= association.name_property %>, <%= resource_name %>.<%= association.name %>
+ td= link_to_if <%= resource_name %>.<%= association.name %>.present?, <%= resource_name %>.<%= association.name %>.try(:<%= association.name_property %>), <%= resource_name %>.<%= association.name %>
<%- end -%>
td=l <%= resource_name %>.created_at, format: :short
td