From f7d8c4cc7cfbefe5c2ed0025b0e22adfcee15a41 Mon Sep 17 00:00:00 2001 From: Benjamin ter Kuile Date: Mon, 16 Feb 2015 17:53:01 +0100 Subject: [PATCH] End of day commit --- Gemfile | 2 + Gemfile.lock | 3 + .../supplier/app/application.js.coffee | 3 +- .../menu_product_component.js.coffee | 3 +- .../employees_index_controller.js.coffee | 16 +++++ .../app/controllers/menu_controller.js.coffee | 2 +- .../modals/base_controller.js.coffee | 5 +- .../supplier/app/helpers/errors.js.coffee | 13 ++-- .../supplier/app/models/employee.js.coffee | 8 +++ .../supplier/app/models/product.js.coffee | 2 +- .../javascripts/supplier/app/router.js.coffee | 2 + .../app/routes/employees_route.js.coffee | 2 + .../supplier/app/templates/employees.emblem | 1 + .../app/templates/employees/index.emblem | 21 ++++++ .../app/templates/global/_top_menu.emblem | 2 + .../app/templates/modals/employee_edit.emblem | 14 ++++ .../boolean_button_view.js.coffee | 2 +- .../foundation1/components/_forms.css.sass | 2 + .../foundation1/components/_tables.css.sass | 4 ++ .../suppliers/employees_controller.rb | 65 +++++++++++++++++++ app/models/employee.rb | 6 ++ .../suppliers/employee_serializer.rb | 6 ++ config/locales/models.en.yml | 2 + config/locales/models.nl.yml | 2 + config/locales/supplier.en.yml | 8 +++ config/locales/supplier.nl.yml | 5 ++ config/routes.rb | 2 + 27 files changed, 190 insertions(+), 13 deletions(-) create mode 100644 app/assets/javascripts/supplier/app/controllers/employees_index_controller.js.coffee create mode 100644 app/assets/javascripts/supplier/app/models/employee.js.coffee create mode 100644 app/assets/javascripts/supplier/app/routes/employees_route.js.coffee create mode 100644 app/assets/javascripts/supplier/app/templates/employees.emblem create mode 100644 app/assets/javascripts/supplier/app/templates/employees/index.emblem create mode 100644 app/assets/javascripts/supplier/app/templates/modals/employee_edit.emblem create mode 100644 app/controllers/suppliers/employees_controller.rb create mode 100644 app/serializers/suppliers/employee_serializer.rb diff --git a/Gemfile b/Gemfile index 2368e517..c3bf5dfd 100644 --- a/Gemfile +++ b/Gemfile @@ -35,7 +35,9 @@ group :assets do #gem 'therubyracer', :platforms => :ruby gem 'uglifier', '>= 1.0.3' + #gem "emblem-source", github: "machty/emblem.js" gem 'emblem-rails' + gem 'ember-validations-rails' gem 'foundation-rails' #, github: 'bterkuile/foundation-rails' #gem 'mustache' #, :require => 'mustache/railtie' diff --git a/Gemfile.lock b/Gemfile.lock index d959d95f..bde5f57c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -189,6 +189,8 @@ GEM railties (>= 3.1) ember-source (1.8.1) handlebars-source (~> 1.0) + ember-validations-rails (1.0.0) + railties ember_script (0.0.5) ember_script-source (>= 0.0.2) execjs @@ -462,6 +464,7 @@ DEPENDENCIES devise_simply_stored! ember-rails ember-source (= 1.8.1) + ember-validations-rails ember_script-rails! emblem-rails factory_girl_rails diff --git a/app/assets/javascripts/supplier/app/application.js.coffee b/app/assets/javascripts/supplier/app/application.js.coffee index 67d71ab7..d6e29874 100644 --- a/app/assets/javascripts/supplier/app/application.js.coffee +++ b/app/assets/javascripts/supplier/app/application.js.coffee @@ -2,12 +2,13 @@ #= require handlebars #= require ember #= require ember-data + #= require ember-validations #= require_directory ./modifications #= require shared-ember-helpers/all #= require ./app #= require ./controllers/modals/base_controller #= require ion.sound #= require_tree . -@$assets_path = '/assets/'; +@$assets_path = '/assets/' @EmberENV = {FEATURES: {'query-params-new': true}} @$days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'] diff --git a/app/assets/javascripts/supplier/app/components/menu_product_component.js.coffee b/app/assets/javascripts/supplier/app/components/menu_product_component.js.coffee index 52de3720..10abad03 100644 --- a/app/assets/javascripts/supplier/app/components/menu_product_component.js.coffee +++ b/app/assets/javascripts/supplier/app/components/menu_product_component.js.coffee @@ -25,8 +25,7 @@ App.MenuProductComponent = Ember.Component.extend save: -> return unless @get('product.isValid') if @get('product.isDirty') - @get('product').save().then((-> true), (-> true)) - @set 'editMode', false + @get('product').save().then((=> @set 'editMode', false), (-> true)) destroyProduct: (product)-> if product.get('isNew') product.deleteRecord() diff --git a/app/assets/javascripts/supplier/app/controllers/employees_index_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/employees_index_controller.js.coffee new file mode 100644 index 00000000..b4b0e3a5 --- /dev/null +++ b/app/assets/javascripts/supplier/app/controllers/employees_index_controller.js.coffee @@ -0,0 +1,16 @@ +App.EmployeesIndexController = Ember.ArrayController.extend + employees: (-> @get('model').sortBy('name')).property('model.@each.name') + actions: + newEmployee: -> + employee = @store.createRecord('employee') + @modal 'employee_edit', + model: employee + close: -> employee.deleteRecord() + editEmployee: (employee)-> + @modal 'employee_edit', + model: employee + close: -> employee.rollback() + destroyEmployee: (employee)-> + @modal 'confirm', + title: t('employee.destroy.modal.title', employee.serialize()) + ok: -> employee.destroyRecord() diff --git a/app/assets/javascripts/supplier/app/controllers/menu_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/menu_controller.js.coffee index bacc30ca..713c5714 100644 --- a/app/assets/javascripts/supplier/app/controllers/menu_controller.js.coffee +++ b/app/assets/javascripts/supplier/app/controllers/menu_controller.js.coffee @@ -3,7 +3,7 @@ App.MenuController = Ember.ObjectController.extend product_code_filter: '' product_categories: (-> @store.all('product_category')).property() filter: null - sorted_product_categories: (-> + sorted_product_categories: (-> list = @get('product_categories') if filter_day = @get('filter.day') list = list.filterBy "active_on_#{filter_day}" diff --git a/app/assets/javascripts/supplier/app/controllers/modals/base_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/modals/base_controller.js.coffee index def5e146..9472580f 100644 --- a/app/assets/javascripts/supplier/app/controllers/modals/base_controller.js.coffee +++ b/app/assets/javascripts/supplier/app/controllers/modals/base_controller.js.coffee @@ -36,8 +36,9 @@ @send 'closeModal' unless @preventClose confirm: -> @send('ok') save: -> - @get('model').save() - @send 'closeModal' unless @preventClose + if @get('model.isValid') + @get('model').save().then((=> @send 'closeModal' ), (-> true)) + #@send 'closeModal' unless @preventClose destroy: -> @modal 'confirm', title_path: @get('modal_options.destroy_text_path') || 'general.destroy.text' diff --git a/app/assets/javascripts/supplier/app/helpers/errors.js.coffee b/app/assets/javascripts/supplier/app/helpers/errors.js.coffee index d505270d..44afebc8 100644 --- a/app/assets/javascripts/supplier/app/helpers/errors.js.coffee +++ b/app/assets/javascripts/supplier/app/helpers/errors.js.coffee @@ -3,10 +3,13 @@ Ember.Handlebars.helper 'errors', (errors, params..., options)-> result = "" model_name = options.hash.includeAttribute for error in errors - if model_name - attribute = ttry("attributes.#{model_name}.#{error.attribute}") - message = "#{attribute} #{error.message}" + if typeof error is "string" + message = error else - message = error.message + if model_name + attribute = ttry("attributes.#{model_name}.#{error.attribute}") + message = "#{attribute} #{error.message}" + else + message = error.message result += "
#{message}
" - new Ember.Handlebars.SafeString(result) + result.htmlSafe() diff --git a/app/assets/javascripts/supplier/app/models/employee.js.coffee b/app/assets/javascripts/supplier/app/models/employee.js.coffee new file mode 100644 index 00000000..3fb785bb --- /dev/null +++ b/app/assets/javascripts/supplier/app/models/employee.js.coffee @@ -0,0 +1,8 @@ +attr = DS.attr +App.Employee= DS.Model.extend Ember.Validations.Mixin, + name: attr 'string' + email: attr 'string' + + validations: + name: + presence: true diff --git a/app/assets/javascripts/supplier/app/models/product.js.coffee b/app/assets/javascripts/supplier/app/models/product.js.coffee index 4fb40202..87dd0add 100644 --- a/app/assets/javascripts/supplier/app/models/product.js.coffee +++ b/app/assets/javascripts/supplier/app/models/product.js.coffee @@ -17,7 +17,7 @@ App.Product = DS.Model.extend image ).property('image') - isValid: (-> + isValid: (-> return false unless price = @get('price') return false unless "#{price}".match(/^[+-]?\d+(\.?\d?\d)?$/) true diff --git a/app/assets/javascripts/supplier/app/router.js.coffee b/app/assets/javascripts/supplier/app/router.js.coffee index 017526bb..1b439f15 100644 --- a/app/assets/javascripts/supplier/app/router.js.coffee +++ b/app/assets/javascripts/supplier/app/router.js.coffee @@ -12,6 +12,8 @@ App.Router.map -> @resource 'table', path: ':table_id' @resource 'lists', -> @resource 'list', path: ':list_id' + @resource 'employees', -> + @resource 'employee', path: ':employee_id' @route 'orders_display' # chromecast etc @route 'menu' @route 'settings' diff --git a/app/assets/javascripts/supplier/app/routes/employees_route.js.coffee b/app/assets/javascripts/supplier/app/routes/employees_route.js.coffee new file mode 100644 index 00000000..a386c344 --- /dev/null +++ b/app/assets/javascripts/supplier/app/routes/employees_route.js.coffee @@ -0,0 +1,2 @@ +App.EmployeesRoute = Ember.Route.extend + model: -> @store.find 'employee' diff --git a/app/assets/javascripts/supplier/app/templates/employees.emblem b/app/assets/javascripts/supplier/app/templates/employees.emblem new file mode 100644 index 00000000..26191258 --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/employees.emblem @@ -0,0 +1 @@ += outlet diff --git a/app/assets/javascripts/supplier/app/templates/employees/index.emblem b/app/assets/javascripts/supplier/app/templates/employees/index.emblem new file mode 100644 index 00000000..ca88805f --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/employees/index.emblem @@ -0,0 +1,21 @@ +.row: .small-12.columns + h1=t 'models.plural.employee' + if employees + table.table + thead + tr + th.name=t 'attributes.employee.name' + th.email=t 'attributes.employee.email' + th.actions=t 'helpers.actions.title' + tbody + each employee in employees + tr + td: link-to 'employee' employee: span= employee.name + td.email + = employee.email + = errors employee.errors.email + td.actions + a.table-edit{ action 'editEmployee' employee }: span + a.table-destroy{ action 'destroyEmployee' employee }: span + .form-actions + a.form-action-new.new-employee-button{action "newEmployee"}= t 'employee.new_button' diff --git a/app/assets/javascripts/supplier/app/templates/global/_top_menu.emblem b/app/assets/javascripts/supplier/app/templates/global/_top_menu.emblem index cd67d46f..6bcdaf19 100644 --- a/app/assets/javascripts/supplier/app/templates/global/_top_menu.emblem +++ b/app/assets/javascripts/supplier/app/templates/global/_top_menu.emblem @@ -13,6 +13,8 @@ header.top-menu = t 'models.plural.table' = link-to "lists" class="top-menu-lists" = t 'models.plural.list' + = link-to "employees" class="top-menu-employees" + = t 'models.plural.employee' .extra-info{action "showSupplierStatusInfo"} .supplier-info-row .counter.supplier-orders-placed-count diff --git a/app/assets/javascripts/supplier/app/templates/modals/employee_edit.emblem b/app/assets/javascripts/supplier/app/templates/modals/employee_edit.emblem new file mode 100644 index 00000000..a4857cd9 --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/modals/employee_edit.emblem @@ -0,0 +1,14 @@ +p=t 'employee.edit.modal.body_header' +.form-row.name + .form-label=t 'attributes.employee.name' + .form-field + = input valueBinding="model.name" + = errors model.errors.name +.form-row.name + .form-label=t 'attributes.employee.email' + .form-field + = input type="email" valueBinding="model.email" + = errors model.errors.email +hr +button.modal-close{action "close"}=t 'section.add_employees.modal.close_button' +button.modal-confirm.right{action "save"}=t 'section.add_employees.modal.add_button' diff --git a/app/assets/javascripts/supplier/app/views/form_elements/boolean_button_view.js.coffee b/app/assets/javascripts/supplier/app/views/form_elements/boolean_button_view.js.coffee index f3909859..52c08c78 100644 --- a/app/assets/javascripts/supplier/app/views/form_elements/boolean_button_view.js.coffee +++ b/app/assets/javascripts/supplier/app/views/form_elements/boolean_button_view.js.coffee @@ -3,7 +3,7 @@ App.BooleanButtonView = Ember.View.extend href: '#' classNames: "button" # templateName: "form_elements/boolean_switch" - template: Ember.Handlebars.compile "{{view.text}}" + #template: Ember.Handlebars.compile "{{view.text}}" classNameBindings: ['rounded:round', 'active:active:disabled'] text: Ember.computed 'text_path', -> diff --git a/app/assets/stylesheets/supplier/foundation1/components/_forms.css.sass b/app/assets/stylesheets/supplier/foundation1/components/_forms.css.sass index f6ad23bc..ea786eec 100644 --- a/app/assets/stylesheets/supplier/foundation1/components/_forms.css.sass +++ b/app/assets/stylesheets/supplier/foundation1/components/_forms.css.sass @@ -25,6 +25,8 @@ +grid-column($columns: 9, $last-column:true) &.half +grid-column(6) + .error + color: $alert-color &.form-actions padding-top: 12px body diff --git a/app/assets/stylesheets/supplier/foundation1/components/_tables.css.sass b/app/assets/stylesheets/supplier/foundation1/components/_tables.css.sass index 9524f2e4..aa655803 100644 --- a/app/assets/stylesheets/supplier/foundation1/components/_tables.css.sass +++ b/app/assets/stylesheets/supplier/foundation1/components/_tables.css.sass @@ -16,6 +16,10 @@ table text-align: right &.date text-align: right + .error + display: inline-block + padding-left: 5px + color: $alert-color a.table-qr-codes +button-icon-only .table-edit diff --git a/app/controllers/suppliers/employees_controller.rb b/app/controllers/suppliers/employees_controller.rb new file mode 100644 index 00000000..43fa287a --- /dev/null +++ b/app/controllers/suppliers/employees_controller.rb @@ -0,0 +1,65 @@ +module Suppliers + class EmployeesController < Suppliers::ApplicationController + + # GET /employees + # GET /employees.json + def index + @employees = current_supplier.employees + render json: @employees, each_serializer: Suppliers::EmployeeSerializer + end + + # GET /employees/1 + # GET /employees/1.json + def show + @employee = Employee.find(params[:id]) + render json: @employee, serializer: Suppliers::EmployeeSerializer + end + + # POST /employees + # POST /employees.json + def create + @employee = Employee.new(employee_params) + @employee.supplier = current_supplier + + respond_to do |format| + if @employee.save + render json: @employee, serializer: Suppliers::EmployeeSerializer, status: :created + else + render json: {errors: @employee.errors}, status: :unprocessable_entity + end + end + end + + # PUT /employees/1 + # PUT /employees/1.json + def update + @employee = Employee.find(params[:id]) + render json: {}, status: 404 unless @employee.supplier_id == current_supplier.id + respond_to do |format| + if @employee.update_attributes(employee_params) + format.json { head :no_content } + else + format.json { render json: {errors: @employee.errors}, status: :unprocessable_entity } + end + end + end + + # DELETE /employees/1 + # DELETE /employees/1.json + def destroy + @employee = Employee.find(params[:id]) + render json: {}, status: :forbidden unless @employee.supplier_id == current_supplier.id + @employee.destroy + + respond_to do |format| + format.json { head :no_content } + end + end + + private + + def employee_params + params.require(:employee).permit(:name, :email) + end + end +end diff --git a/app/models/employee.rb b/app/models/employee.rb index fe1db8b0..52068228 100644 --- a/app/models/employee.rb +++ b/app/models/employee.rb @@ -1,8 +1,14 @@ class Employee include SimplyStored::Couch + include ActiveModel::SerializerSupport devise :database_authenticatable, :recoverable, :rememberable, :trackable #, :omniauthable, :omniauth_providers => [:facebook] #, :token_authenticatable , :registerable + property :name + property :email + view :by_email, key: :email + + validates :email, email: true belongs_to :supplier has_many :orders has_and_belongs_to_many :lists, storing_keys: false diff --git a/app/serializers/suppliers/employee_serializer.rb b/app/serializers/suppliers/employee_serializer.rb new file mode 100644 index 00000000..d85da47f --- /dev/null +++ b/app/serializers/suppliers/employee_serializer.rb @@ -0,0 +1,6 @@ +class Suppliers::EmployeeSerializer < Qwaiter::Serializer + self.root = :employee + embed :ids, include: true + attributes :supplier_id, :name, :email + has_many :orders +end diff --git a/config/locales/models.en.yml b/config/locales/models.en.yml index 3d344d00..c29098e6 100644 --- a/config/locales/models.en.yml +++ b/config/locales/models.en.yml @@ -11,6 +11,7 @@ en: section: Section join_request: Join request user_feedback: User feedback + employee: Employee plural: user: Users supplier: Restaurants @@ -22,6 +23,7 @@ en: section: Sections join_request: Join requests user_feedback: User feedbacks + employee: Employees attributes: product_category: name: Name diff --git a/config/locales/models.nl.yml b/config/locales/models.nl.yml index ec02a883..ad33dd04 100644 --- a/config/locales/models.nl.yml +++ b/config/locales/models.nl.yml @@ -10,6 +10,7 @@ nl: product_category: Product categorie section: Afdeling join_request: Deelname verzoek + employee: Werknemer plural: user: Gebruikers supplier: Restaurants @@ -20,6 +21,7 @@ nl: product_category: Product categorieen section: Afdelingen join_request: Deelname verzoeken + employee: Werknemers attributes: product_category: name: Naam diff --git a/config/locales/supplier.en.yml b/config/locales/supplier.en.yml index 12e6c061..eaf980de 100644 --- a/config/locales/supplier.en.yml +++ b/config/locales/supplier.en.yml @@ -182,3 +182,11 @@ en: orders_placed_count_explanation: "  means that there are %{count} orders placed and not yet processing or finished" orders_in_process_count_explanation: "  means that there are %{count} orders currently processing" close: Got it + employee: + new_button: 'Add ${models.employee}' + destroy: + modal: + title: 'Delete ${models.employee} %{name}?' + edit: + modal: + body_header: '' diff --git a/config/locales/supplier.nl.yml b/config/locales/supplier.nl.yml index 447bb2e8..62c408eb 100644 --- a/config/locales/supplier.nl.yml +++ b/config/locales/supplier.nl.yml @@ -185,3 +185,8 @@ nl: orders_placed_count_explanation: "  means that there are %{count} orders placed and not yet processing or finished" orders_in_process_count_explanation: "  means that there are %{count} orders currently processing" close: Got it + employee: + new_button: '${models.employee} toevoegen' + destroy: + modal: + title: '${models.employee} %{name} verwijderen?' diff --git a/config/routes.rb b/config/routes.rb index 42af8b1f..b2d77ea5 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -128,6 +128,8 @@ Qwaiter::Application.routes.draw do get :qr_codes end end + + resources :employees resources :products do collection do get :preview_products