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