From e720d6b31cfb9d6576e490caf6799ccd5395c23d Mon Sep 17 00:00:00 2001 From: Benjamin ter Kuile Date: Tue, 24 Mar 2015 14:53:02 +0100 Subject: [PATCH] Add push buttons and support inactive products --- ...onent.js.coffee => menu-product.js.coffee} | 4 +-- .../supplier/app/models/product.js.coffee | 10 +++++-- .../templates/components/menu-product.emblem | 7 +++-- .../supplier/app/templates/menu.emblem | 2 +- ...onent.js.coffee => menu-product.js.coffee} | 2 +- .../user/app/models/product.js.coffee | 1 + .../templates/components/menu-product.emblem | 9 ++++-- .../supplier/foundation1/_mixins.sass | 10 +++++++ ...products_menu.sass => _menu-products.sass} | 30 +++++++++++++++---- ...e_preview.sass => _menu-time-preview.sass} | 0 .../{_menu_main.sass => _nav_main.sass} | 0 .../{_menu_side.sass => _nav_side.sass} | 0 .../{_menu_main.sass => _nav_main.sass} | 0 .../{_menu_side.sass => _nav_side.sass} | 0 .../components/_product_categories.sass | 4 +++ app/controllers/dashboard_controller.rb | 2 +- .../suppliers/products_controller.rb | 2 +- app/models/product.rb | 3 +- app/serializers/product_serializer.rb | 2 +- config/locales/models.en.yml | 1 + config/locales/models.nl.yml | 1 + wip.md | 5 ++++ 22 files changed, 74 insertions(+), 21 deletions(-) rename app/assets/javascripts/supplier/app/components/{menu_product_component.js.coffee => menu-product.js.coffee} (90%) rename app/assets/javascripts/user/app/components/{menu-product-component.js.coffee => menu-product.js.coffee} (89%) rename app/assets/stylesheets/supplier/foundation1/components/{_products_menu.sass => _menu-products.sass} (72%) rename app/assets/stylesheets/supplier/foundation1/components/{_menu_products_time_preview.sass => _menu-time-preview.sass} (100%) rename app/assets/stylesheets/supplier/foundation1/components/{_menu_main.sass => _nav_main.sass} (100%) rename app/assets/stylesheets/supplier/foundation1/components/{_menu_side.sass => _nav_side.sass} (100%) rename app/assets/stylesheets/user/foundation/components/{_menu_main.sass => _nav_main.sass} (100%) rename app/assets/stylesheets/user/foundation/components/{_menu_side.sass => _nav_side.sass} (100%) diff --git a/app/assets/javascripts/supplier/app/components/menu_product_component.js.coffee b/app/assets/javascripts/supplier/app/components/menu-product.js.coffee similarity index 90% rename from app/assets/javascripts/supplier/app/components/menu_product_component.js.coffee rename to app/assets/javascripts/supplier/app/components/menu-product.js.coffee index 55dcef2c..7506ef19 100644 --- a/app/assets/javascripts/supplier/app/components/menu_product_component.js.coffee +++ b/app/assets/javascripts/supplier/app/components/menu-product.js.coffee @@ -2,7 +2,7 @@ App.MenuProductComponent = Ember.Component.extend editMode: false code_filter: '' classNames: 'menu-product-container' - classNameBindings: ['menu_product_class', 'editMode:editing'] + classNameBindings: ['menu_product_class', 'editMode:editing', 'product.active:active:inactive'] showProduct: (-> return true unless filter = @get('code_filter') (@get('product.code') || "").toLowerCase().indexOf(filter.toLowerCase()) >= 0 @@ -16,7 +16,7 @@ App.MenuProductComponent = Ember.Component.extend pre_code = code.substring(0,index) highlight = code.substring(index,index + filter.length) post_code = code.substring(index + filter.length) - new Ember.Handlebars.SafeString("#{pre_code}#{highlight}#{post_code}") + "#{pre_code}#{highlight}#{post_code}".htmlSafe() else code ).property('code_filter') diff --git a/app/assets/javascripts/supplier/app/models/product.js.coffee b/app/assets/javascripts/supplier/app/models/product.js.coffee index 67a21bb8..68714560 100644 --- a/app/assets/javascripts/supplier/app/models/product.js.coffee +++ b/app/assets/javascripts/supplier/app/models/product.js.coffee @@ -1,10 +1,11 @@ attr = DS.attr App.Product = DS.Model.extend Ember.Validations.Mixin, name: attr 'string' - price: attr 'number' + price: attr 'number', defaultValue: 0 code: attr 'string' description: attr 'string' visible: attr('boolean', defaultValue: true) + active: attr('boolean', defaultValue: true) position: attr('number', defaultValue: 0) image: attr() product_category: DS.belongsTo('product_category') @@ -23,5 +24,8 @@ App.Product = DS.Model.extend Ember.Validations.Mixin, #true #).property('price') validations: - name: {presence: true} - price: {format: /^[+-]?\d+(\.?\d?\d)?$/} + name: + presence: true + price: + format: + width: /^[+-]?\d*(\.?\d?\d)?$/ diff --git a/app/assets/javascripts/supplier/app/templates/components/menu-product.emblem b/app/assets/javascripts/supplier/app/templates/components/menu-product.emblem index fdcd0b03..3406a0a4 100644 --- a/app/assets/javascripts/supplier/app/templates/components/menu-product.emblem +++ b/app/assets/javascripts/supplier/app/templates/components/menu-product.emblem @@ -4,13 +4,16 @@ if editMode = input value=product.name placeholder=namePlaceholder action="save" = errors product.errors.name .small-3.columns.price - = edit-currency value=product.price validatePresence=true action="save" + = edit-currency value=product.price action="save" = errors product.errors.price .small-3.columns.code= input value=product.code placeholder=codePlaceholder .small-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 + .small-4.large-2.columns= t 'attributes.product.active' + .small-8.large-10.columns: view boolean-switch value=product.active .row.menu-product-container .medium-4.small-6.columns = view "upload-file" name="image" accept="image/*" file=product.image @@ -27,5 +30,5 @@ else = errors product.errors.price includeAttribute="product" .small-3.columns: span= code_filter_display .small-3.columns - span.fa.fa-edit{action "makeEditable"} + a.edit-product-action{action "makeEditable"}: span /img src=product.image_src diff --git a/app/assets/javascripts/supplier/app/templates/menu.emblem b/app/assets/javascripts/supplier/app/templates/menu.emblem index 900604c1..abcfe282 100644 --- a/app/assets/javascripts/supplier/app/templates/menu.emblem +++ b/app/assets/javascripts/supplier/app/templates/menu.emblem @@ -11,7 +11,7 @@ each product_category in sorted_product_categories span.title= product_category.name span.availability= product_category.availability_text can manage menu - a.edit-product-category-button{action "editProductCategory" product_category} href="#" + a.edit-product-category-button{action "editProductCategory" product_category} href="#": span a.add-product-product_category-button{action "addProduct" product_category} href="#": span each product in product_category.sorted_products = menu-product product=product code_filter=product_code_filter diff --git a/app/assets/javascripts/user/app/components/menu-product-component.js.coffee b/app/assets/javascripts/user/app/components/menu-product.js.coffee similarity index 89% rename from app/assets/javascripts/user/app/components/menu-product-component.js.coffee rename to app/assets/javascripts/user/app/components/menu-product.js.coffee index 567af68c..bbc508ff 100644 --- a/app/assets/javascripts/user/app/components/menu-product-component.js.coffee +++ b/app/assets/javascripts/user/app/components/menu-product.js.coffee @@ -1,6 +1,6 @@ App.MenuProductComponent = Ember.Component.extend tagName: 'li' - classNameBindings: ['specific_id'] + classNameBindings: ['specific_id', 'product.active:active:inactive'] specific_id: (-> "order-product-#{@get('product.id')}").property('product.id') orderProducts: false target: -> @get('parentView.targetObject') diff --git a/app/assets/javascripts/user/app/models/product.js.coffee b/app/assets/javascripts/user/app/models/product.js.coffee index b9959d99..decacdb1 100644 --- a/app/assets/javascripts/user/app/models/product.js.coffee +++ b/app/assets/javascripts/user/app/models/product.js.coffee @@ -4,6 +4,7 @@ App.Product = DS.Model.extend price: attr 'number' description: attr 'string' position: attr('number', defaultValue: 0) + active: attr 'boolean', defaultValue: true image: attr() product_category: DS.belongsTo('product_category') product_orders: DS.hasMany('product_order') diff --git a/app/assets/javascripts/user/app/templates/components/menu-product.emblem b/app/assets/javascripts/user/app/templates/components/menu-product.emblem index 785b541a..ef067026 100644 --- a/app/assets/javascripts/user/app/templates/components/menu-product.emblem +++ b/app/assets/javascripts/user/app/templates/components/menu-product.emblem @@ -4,9 +4,12 @@ if product.description else span.no-product-description if orderProducts - a{action "addProduct" product}= product.name - button.add-product-to-list{action "addProduct" product} - span + if product.active + a{action "addProduct" product}= product.name + button.add-product-to-list{action "addProduct" product} + span + else + a{action "showProductDescription" product}= product.name else span= product.name span.product-price.currency=currency product.price diff --git a/app/assets/stylesheets/supplier/foundation1/_mixins.sass b/app/assets/stylesheets/supplier/foundation1/_mixins.sass index 28b98aab..5d561e49 100644 --- a/app/assets/stylesheets/supplier/foundation1/_mixins.sass +++ b/app/assets/stylesheets/supplier/foundation1/_mixins.sass @@ -5,3 +5,13 @@ @mixin table-fit width: 1px white-space: nowrap += button-shadow + transition: box-shadow 0.2s cubic-bezier(0.4, 0, 0.2, 1) + transition-delay: 0.2s + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26) += push-button($bg: $secondary-color, $padding: 10px) + +button($bg: $bg) + +button-shadow + padding: $padding + margin: 0 + border-radius: $global-rounded diff --git a/app/assets/stylesheets/supplier/foundation1/components/_products_menu.sass b/app/assets/stylesheets/supplier/foundation1/components/_menu-products.sass similarity index 72% rename from app/assets/stylesheets/supplier/foundation1/components/_products_menu.sass rename to app/assets/stylesheets/supplier/foundation1/components/_menu-products.sass index 566a02d6..afc701f8 100644 --- a/app/assets/stylesheets/supplier/foundation1/components/_products_menu.sass +++ b/app/assets/stylesheets/supplier/foundation1/components/_menu-products.sass @@ -26,12 +26,20 @@ .time-range color: rgb(39, 6, 121) .edit-product-category-button - @extend .fa - @extend .fa-lg - @extend .fa-edit + +push-button($bg: $secondary-color, $padding: 5px) + color: $warning-color + font-size: 0.7em + vertical-align: top + span + @extend .fa + @extend .fa-lg + @extend .fa-edit .add-product-product_category-button - float: right - margin-top: 1.2em + +push-button($bg: $secondary-color) + font-size: 0.7em + position: absolute + right: 10px + top: 0.6em span @extend .fa @extend .fa-lg @@ -45,19 +53,29 @@ color: rgb(39, 6, 121) .menu-product-container + &.inactive + color: #777 &.editing box-shadow: 5px 5px 5px #555 //border-left: 1px solid rgba(100,100,100,0.3) //border-top: 1px solid rgba(100,100,100,0.3) margin-left: -5px margin-top: -5px + margin-bottom: 16px background-color: #ccc padding: 5px z-index: 722 .highlight text-decoration: underline font-weight: bold + .edit-product-action + +push-button($bg: $secondary-color) + padding: 4px + font-size: 0.7em + span + @extend .fa, .fa-edit .rollback-product-action + +push-button($bg: $secondary-color) color: $warning-color margin-right: 12px span @@ -65,6 +83,7 @@ @extend .fa-lg @extend .fa-undo .destroy-product-action + +push-button($bg: $secondary-color) color: $alert-color margin-right: 12px span @@ -76,6 +95,7 @@ input margin-bottom: 0 .save-product-action + +push-button($bg: $secondary-color) color: $success-color span @extend .fa diff --git a/app/assets/stylesheets/supplier/foundation1/components/_menu_products_time_preview.sass b/app/assets/stylesheets/supplier/foundation1/components/_menu-time-preview.sass similarity index 100% rename from app/assets/stylesheets/supplier/foundation1/components/_menu_products_time_preview.sass rename to app/assets/stylesheets/supplier/foundation1/components/_menu-time-preview.sass diff --git a/app/assets/stylesheets/supplier/foundation1/components/_menu_main.sass b/app/assets/stylesheets/supplier/foundation1/components/_nav_main.sass similarity index 100% rename from app/assets/stylesheets/supplier/foundation1/components/_menu_main.sass rename to app/assets/stylesheets/supplier/foundation1/components/_nav_main.sass diff --git a/app/assets/stylesheets/supplier/foundation1/components/_menu_side.sass b/app/assets/stylesheets/supplier/foundation1/components/_nav_side.sass similarity index 100% rename from app/assets/stylesheets/supplier/foundation1/components/_menu_side.sass rename to app/assets/stylesheets/supplier/foundation1/components/_nav_side.sass diff --git a/app/assets/stylesheets/user/foundation/components/_menu_main.sass b/app/assets/stylesheets/user/foundation/components/_nav_main.sass similarity index 100% rename from app/assets/stylesheets/user/foundation/components/_menu_main.sass rename to app/assets/stylesheets/user/foundation/components/_nav_main.sass diff --git a/app/assets/stylesheets/user/foundation/components/_menu_side.sass b/app/assets/stylesheets/user/foundation/components/_nav_side.sass similarity index 100% rename from app/assets/stylesheets/user/foundation/components/_menu_side.sass rename to app/assets/stylesheets/user/foundation/components/_nav_side.sass diff --git a/app/assets/stylesheets/user/foundation/components/_product_categories.sass b/app/assets/stylesheets/user/foundation/components/_product_categories.sass index c16aeac5..8dfeceae 100644 --- a/app/assets/stylesheets/user/foundation/components/_product_categories.sass +++ b/app/assets/stylesheets/user/foundation/components/_product_categories.sass @@ -16,6 +16,10 @@ ul.product_category-products list-style: none margin: 0 0 5px rem-calc(1.0) .product_category-products + .inactive + color: #777 + a + color: #777 .product-price float: right .show-product-description diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 9e33dd78..01e54f5f 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -27,7 +27,7 @@ class DashboardController < ApplicationController if Rails.env.test? @tables = Table.all else - @tables = List.active.map(&:table) | Supplier.find_by_name('Mozo').tables.select{|t| t.number.between? 20, 50}.sample(3) + @tables = List.active.map(&:table) | Supplier.find_by_name('Mozo').tables.select{|t| t.number.between? 20, 500}.sample(3) end respond_to do |format| format.html { render layout: 'phone' } diff --git a/app/controllers/suppliers/products_controller.rb b/app/controllers/suppliers/products_controller.rb index 5b589e1b..837e62e8 100644 --- a/app/controllers/suppliers/products_controller.rb +++ b/app/controllers/suppliers/products_controller.rb @@ -98,7 +98,7 @@ module Suppliers private def product_params - params.require(:product).permit(:name, :code, :price, :description, :image, :visible, :position, :product_category_id) + params.require(:product).permit(:name, :code, :price, :description, :image, :visible, :position, :active, :product_category_id) end end end diff --git a/app/models/product.rb b/app/models/product.rb index 8e69eaf4..94485a08 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -8,6 +8,7 @@ class Product property :price, type: Float property :description property :visible, type: :boolean, default: true + property :active, type: :boolean, default: true property :position, type: Fixnum belongs_to :product_category @@ -19,7 +20,7 @@ class Product validates :name, presence: true validates :supplier_id, presence: true - validates :price, numericality: {greater_than: 0} + validates :price, numericality: true view :by_supplier_id_and_id, key: [:supplier_id, :_id] #after_save :persist_product_category_ids diff --git a/app/serializers/product_serializer.rb b/app/serializers/product_serializer.rb index 294ceffd..c294f6a5 100644 --- a/app/serializers/product_serializer.rb +++ b/app/serializers/product_serializer.rb @@ -1,5 +1,5 @@ class ProductSerializer < Qwaiter::Serializer - attributes :name, :price, :description, :image, :code, :position, :visible, :product_category_id + attributes :name, :price, :description, :image, :code, :position, :visible, :active, :product_category_id def image if object.image.present? diff --git a/config/locales/models.en.yml b/config/locales/models.en.yml index c7a6443e..cab03e43 100644 --- a/config/locales/models.en.yml +++ b/config/locales/models.en.yml @@ -48,6 +48,7 @@ en: code: Code price: Price description: Description + active: "Active?" visible: Visible? created_at: Created image: Image diff --git a/config/locales/models.nl.yml b/config/locales/models.nl.yml index d955fbd4..737608c4 100644 --- a/config/locales/models.nl.yml +++ b/config/locales/models.nl.yml @@ -47,6 +47,7 @@ nl: price: Prijs description: Omschrijving visible: Zichtbaar? + active: "Actief?" created_at: Aangemaakt image: Afbeelding list: diff --git a/wip.md b/wip.md index be293368..944a7224 100644 --- a/wip.md +++ b/wip.md @@ -23,10 +23,15 @@ User - test met veel producten - product variants +- option to make products inactive, no order plus and click on name + opens information - remove active orders on list close - fix ajaxError duplicity - rename "I am signed in as a user" to "there is a signed in user" in the specs +- Kom in aanmerking voor vaste klanten acties! + + Bugs ----