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