Qwaiter supplier on Ember 1.0
This commit is contained in:
@@ -57,7 +57,6 @@ gem 'mini_magick'
|
|||||||
group :development do
|
group :development do
|
||||||
#gem 'pry-remote'
|
#gem 'pry-remote'
|
||||||
gem 'rspec-rails'
|
gem 'rspec-rails'
|
||||||
gem 'guard-rspec'
|
|
||||||
gem 'quiet_assets'
|
gem 'quiet_assets'
|
||||||
gem 'letter_opener'
|
gem 'letter_opener'
|
||||||
gem 'thin'
|
gem 'thin'
|
||||||
@@ -68,13 +67,12 @@ end
|
|||||||
group :test do
|
group :test do
|
||||||
#gem 'steak'
|
#gem 'steak'
|
||||||
gem 'rspec-rails'
|
gem 'rspec-rails'
|
||||||
gem 'cucumber-rails'
|
|
||||||
gem 'poltergeist'
|
|
||||||
gem 'selenium-webdriver'
|
|
||||||
gem 'database_cleaner'
|
gem 'database_cleaner'
|
||||||
|
gem 'capybara-webkit'
|
||||||
|
gem 'turnip'
|
||||||
|
gem 'launchy'
|
||||||
|
gem 'fuubar'
|
||||||
gem 'rb-fsevent', :require => false #if RUBY_PLATFORM =~ /darwin/i
|
gem 'rb-fsevent', :require => false #if RUBY_PLATFORM =~ /darwin/i
|
||||||
gem 'ruby_gntp'
|
|
||||||
gem 'guard-rspec'
|
|
||||||
gem 'factory_girl_rails'
|
gem 'factory_girl_rails'
|
||||||
gem 'pry-rails'
|
gem 'pry-rails'
|
||||||
end
|
end
|
||||||
|
|||||||
+16
-53
@@ -103,12 +103,12 @@ GEM
|
|||||||
rack (>= 1.0.0)
|
rack (>= 1.0.0)
|
||||||
rack-test (>= 0.5.4)
|
rack-test (>= 0.5.4)
|
||||||
xpath (~> 2.0)
|
xpath (~> 2.0)
|
||||||
childprocess (0.3.9)
|
capybara-webkit (1.0.0)
|
||||||
ffi (~> 1.0, >= 1.0.11)
|
capybara (~> 2.0, >= 2.0.2)
|
||||||
|
json
|
||||||
chunky_png (1.2.8)
|
chunky_png (1.2.8)
|
||||||
climate_control (0.0.3)
|
climate_control (0.0.3)
|
||||||
activesupport (>= 3.0)
|
activesupport (>= 3.0)
|
||||||
cliver (0.2.1)
|
|
||||||
cocaine (0.5.1)
|
cocaine (0.5.1)
|
||||||
climate_control (>= 0.0.3, < 1.0)
|
climate_control (>= 0.0.3, < 1.0)
|
||||||
coderay (1.0.9)
|
coderay (1.0.9)
|
||||||
@@ -130,17 +130,6 @@ GEM
|
|||||||
mime-types (~> 1.15)
|
mime-types (~> 1.15)
|
||||||
multi_json (~> 1.0)
|
multi_json (~> 1.0)
|
||||||
rest-client (~> 1.6.1)
|
rest-client (~> 1.6.1)
|
||||||
cucumber (1.3.8)
|
|
||||||
builder (>= 2.1.2)
|
|
||||||
diff-lcs (>= 1.1.3)
|
|
||||||
gherkin (~> 2.12.1)
|
|
||||||
multi_json (>= 1.7.5, < 2.0)
|
|
||||||
multi_test (>= 0.0.2)
|
|
||||||
cucumber-rails (1.4.0)
|
|
||||||
capybara (>= 1.1.2)
|
|
||||||
cucumber (>= 1.2.0)
|
|
||||||
nokogiri (>= 1.5.0)
|
|
||||||
rails (>= 3.0.0)
|
|
||||||
daemons (1.1.9)
|
daemons (1.1.9)
|
||||||
database_cleaner (1.1.1)
|
database_cleaner (1.1.1)
|
||||||
devise (3.1.0)
|
devise (3.1.0)
|
||||||
@@ -194,20 +183,13 @@ GEM
|
|||||||
faye-websocket (0.7.0)
|
faye-websocket (0.7.0)
|
||||||
eventmachine (>= 0.12.0)
|
eventmachine (>= 0.12.0)
|
||||||
websocket-driver (>= 0.3.0)
|
websocket-driver (>= 0.3.0)
|
||||||
ffi (1.9.0)
|
|
||||||
formatador (0.2.4)
|
|
||||||
fssm (0.2.10)
|
fssm (0.2.10)
|
||||||
|
fuubar (1.1.1)
|
||||||
|
rspec (~> 2.0)
|
||||||
|
rspec-instafail (~> 0.2.0)
|
||||||
|
ruby-progressbar (~> 1.0)
|
||||||
gherkin (2.12.1)
|
gherkin (2.12.1)
|
||||||
multi_json (~> 1.3)
|
multi_json (~> 1.3)
|
||||||
guard (1.8.2)
|
|
||||||
formatador (>= 0.2.4)
|
|
||||||
listen (>= 1.0.0)
|
|
||||||
lumberjack (>= 1.0.2)
|
|
||||||
pry (>= 0.9.10)
|
|
||||||
thor (>= 0.14.6)
|
|
||||||
guard-rspec (3.0.3)
|
|
||||||
guard (>= 1.8)
|
|
||||||
rspec (~> 2.13)
|
|
||||||
haml (4.0.3)
|
haml (4.0.3)
|
||||||
tilt
|
tilt
|
||||||
haml-rails (0.4)
|
haml-rails (0.4)
|
||||||
@@ -236,11 +218,6 @@ GEM
|
|||||||
addressable (~> 2.3)
|
addressable (~> 2.3)
|
||||||
letter_opener (1.1.2)
|
letter_opener (1.1.2)
|
||||||
launchy (~> 2.2)
|
launchy (~> 2.2)
|
||||||
listen (1.3.1)
|
|
||||||
rb-fsevent (>= 0.9.3)
|
|
||||||
rb-inotify (>= 0.9)
|
|
||||||
rb-kqueue (>= 0.2)
|
|
||||||
lumberjack (1.0.4)
|
|
||||||
mail (2.5.4)
|
mail (2.5.4)
|
||||||
mime-types (~> 1.16)
|
mime-types (~> 1.16)
|
||||||
treetop (~> 1.4.8)
|
treetop (~> 1.4.8)
|
||||||
@@ -250,7 +227,6 @@ GEM
|
|||||||
subexec (~> 0.2.1)
|
subexec (~> 0.2.1)
|
||||||
mini_portile (0.5.1)
|
mini_portile (0.5.1)
|
||||||
multi_json (1.8.0)
|
multi_json (1.8.0)
|
||||||
multi_test (0.0.2)
|
|
||||||
nokogiri (1.6.0)
|
nokogiri (1.6.0)
|
||||||
mini_portile (~> 0.5.0)
|
mini_portile (~> 0.5.0)
|
||||||
paperclip (3.5.1)
|
paperclip (3.5.1)
|
||||||
@@ -258,11 +234,6 @@ GEM
|
|||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
cocaine (~> 0.5.0)
|
cocaine (~> 0.5.0)
|
||||||
mime-types
|
mime-types
|
||||||
poltergeist (1.4.1)
|
|
||||||
capybara (~> 2.1.0)
|
|
||||||
cliver (~> 0.2.1)
|
|
||||||
multi_json (~> 1.0)
|
|
||||||
websocket-driver (>= 0.2.0)
|
|
||||||
polyglot (0.3.3)
|
polyglot (0.3.3)
|
||||||
pry (0.9.12.2)
|
pry (0.9.12.2)
|
||||||
coderay (~> 1.0.5)
|
coderay (~> 1.0.5)
|
||||||
@@ -298,10 +269,6 @@ GEM
|
|||||||
thor (>= 0.14.6, < 2.0)
|
thor (>= 0.14.6, < 2.0)
|
||||||
rake (10.1.0)
|
rake (10.1.0)
|
||||||
rb-fsevent (0.9.3)
|
rb-fsevent (0.9.3)
|
||||||
rb-inotify (0.9.2)
|
|
||||||
ffi (>= 0.5.0)
|
|
||||||
rb-kqueue (0.2.0)
|
|
||||||
ffi (>= 0.5.0)
|
|
||||||
rdoc (3.12.2)
|
rdoc (3.12.2)
|
||||||
json (~> 1.4)
|
json (~> 1.4)
|
||||||
rest-client (1.6.7)
|
rest-client (1.6.7)
|
||||||
@@ -314,6 +281,7 @@ GEM
|
|||||||
rspec-core (2.14.5)
|
rspec-core (2.14.5)
|
||||||
rspec-expectations (2.14.2)
|
rspec-expectations (2.14.2)
|
||||||
diff-lcs (>= 1.1.3, < 2.0)
|
diff-lcs (>= 1.1.3, < 2.0)
|
||||||
|
rspec-instafail (0.2.4)
|
||||||
rspec-mocks (2.14.3)
|
rspec-mocks (2.14.3)
|
||||||
rspec-rails (2.14.0)
|
rspec-rails (2.14.0)
|
||||||
actionpack (>= 3.0)
|
actionpack (>= 3.0)
|
||||||
@@ -322,18 +290,12 @@ GEM
|
|||||||
rspec-core (~> 2.14.0)
|
rspec-core (~> 2.14.0)
|
||||||
rspec-expectations (~> 2.14.0)
|
rspec-expectations (~> 2.14.0)
|
||||||
rspec-mocks (~> 2.14.0)
|
rspec-mocks (~> 2.14.0)
|
||||||
ruby_gntp (0.3.4)
|
ruby-progressbar (1.1.1)
|
||||||
rubyzip (0.9.9)
|
|
||||||
sass (3.2.10)
|
sass (3.2.10)
|
||||||
sass-rails (3.2.6)
|
sass-rails (3.2.6)
|
||||||
railties (~> 3.2.0)
|
railties (~> 3.2.0)
|
||||||
sass (>= 3.1.10)
|
sass (>= 3.1.10)
|
||||||
tilt (~> 1.3)
|
tilt (~> 1.3)
|
||||||
selenium-webdriver (2.35.1)
|
|
||||||
childprocess (>= 0.2.5)
|
|
||||||
multi_json (~> 1.0)
|
|
||||||
rubyzip (< 1.0.0)
|
|
||||||
websocket (~> 1.0.4)
|
|
||||||
simple_form (2.1.0)
|
simple_form (2.1.0)
|
||||||
actionpack (~> 3.0)
|
actionpack (~> 3.0)
|
||||||
activemodel (~> 3.0)
|
activemodel (~> 3.0)
|
||||||
@@ -366,13 +328,15 @@ GEM
|
|||||||
treetop (1.4.15)
|
treetop (1.4.15)
|
||||||
polyglot
|
polyglot
|
||||||
polyglot (>= 0.3.1)
|
polyglot (>= 0.3.1)
|
||||||
|
turnip (1.1.0)
|
||||||
|
gherkin (>= 2.5)
|
||||||
|
rspec (~> 2.0)
|
||||||
tzinfo (0.3.37)
|
tzinfo (0.3.37)
|
||||||
uglifier (2.2.1)
|
uglifier (2.2.1)
|
||||||
execjs (>= 0.3.0)
|
execjs (>= 0.3.0)
|
||||||
multi_json (~> 1.0, >= 1.0.2)
|
multi_json (~> 1.0, >= 1.0.2)
|
||||||
warden (1.2.3)
|
warden (1.2.3)
|
||||||
rack (>= 1.0)
|
rack (>= 1.0)
|
||||||
websocket (1.0.7)
|
|
||||||
websocket-driver (0.3.0)
|
websocket-driver (0.3.0)
|
||||||
xpath (2.0.0)
|
xpath (2.0.0)
|
||||||
nokogiri (~> 1.3)
|
nokogiri (~> 1.3)
|
||||||
@@ -385,11 +349,11 @@ DEPENDENCIES
|
|||||||
active_decorator
|
active_decorator
|
||||||
bootstrap-sass
|
bootstrap-sass
|
||||||
bourbon
|
bourbon
|
||||||
|
capybara-webkit
|
||||||
cmtool!
|
cmtool!
|
||||||
coffee-rails (~> 3.2.1)
|
coffee-rails (~> 3.2.1)
|
||||||
compass-rails
|
compass-rails
|
||||||
couch_potato!
|
couch_potato!
|
||||||
cucumber-rails
|
|
||||||
database_cleaner
|
database_cleaner
|
||||||
devise (= 3.1.0)
|
devise (= 3.1.0)
|
||||||
devise_simply_stored!
|
devise_simply_stored!
|
||||||
@@ -398,15 +362,15 @@ DEPENDENCIES
|
|||||||
emblem-rails
|
emblem-rails
|
||||||
factory_girl_rails
|
factory_girl_rails
|
||||||
faye
|
faye
|
||||||
guard-rspec
|
fuubar
|
||||||
jquery-rails
|
jquery-rails
|
||||||
jquery-ui-rails
|
jquery-ui-rails
|
||||||
js-routes
|
js-routes
|
||||||
kaminari
|
kaminari
|
||||||
|
launchy
|
||||||
letter_opener
|
letter_opener
|
||||||
mini_magick
|
mini_magick
|
||||||
orm_adapter!
|
orm_adapter!
|
||||||
poltergeist
|
|
||||||
pry-rails
|
pry-rails
|
||||||
quiet_assets
|
quiet_assets
|
||||||
rack-cors
|
rack-cors
|
||||||
@@ -414,11 +378,10 @@ DEPENDENCIES
|
|||||||
rb-fsevent
|
rb-fsevent
|
||||||
rqrcode
|
rqrcode
|
||||||
rspec-rails
|
rspec-rails
|
||||||
ruby_gntp
|
|
||||||
sass-rails (~> 3.2.3)
|
sass-rails (~> 3.2.3)
|
||||||
selenium-webdriver
|
|
||||||
simple_form
|
simple_form
|
||||||
simply_stored!
|
simply_stored!
|
||||||
slim-rails
|
slim-rails
|
||||||
thin
|
thin
|
||||||
|
turnip
|
||||||
uglifier (>= 1.0.3)
|
uglifier (>= 1.0.3)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ Qsupplier.App.IndexController = Ember.ObjectController.extend
|
|||||||
list = Qsupplier.App.List.find(id)
|
list = Qsupplier.App.List.find(id)
|
||||||
list.set('needs_help', false)
|
list.set('needs_help', false)
|
||||||
$.post '/supplier/mark_list_as_helped', {list_id: id}
|
$.post '/supplier/mark_list_as_helped', {list_id: id}
|
||||||
|
|
||||||
closeList: (id)->
|
closeList: (id)->
|
||||||
list = Qsupplier.App.List.find(id)
|
list = Qsupplier.App.List.find(id)
|
||||||
list.set('state', 'closed')
|
list.set('state', 'closed')
|
||||||
|
|||||||
@@ -11,3 +11,8 @@ Qsupplier.App.List = DS.Model.extend
|
|||||||
orders: DS.hasMany('Qsupplier.App.Order')
|
orders: DS.hasMany('Qsupplier.App.Order')
|
||||||
section: DS.belongsTo('Qsupplier.App.Section')
|
section: DS.belongsTo('Qsupplier.App.Section')
|
||||||
section_id: attr('string')
|
section_id: attr('string')
|
||||||
|
close: ->
|
||||||
|
@get('orders').forEach (order)->
|
||||||
|
order.close()
|
||||||
|
@set('table', null)
|
||||||
|
@list.set('state', 'closed')
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ attr = DS.attr
|
|||||||
Qsupplier.App.Order = DS.Model.extend
|
Qsupplier.App.Order = DS.Model.extend
|
||||||
state: attr('string')
|
state: attr('string')
|
||||||
list: DS.belongsTo('Qsupplier.App.List')
|
list: DS.belongsTo('Qsupplier.App.List')
|
||||||
total_amount: attr('number')
|
price: attr('number')
|
||||||
product_orders: attr('object')
|
product_orders: attr('object')
|
||||||
section: DS.belongsTo('Qsupplier.App.Section')
|
section: DS.belongsTo('Qsupplier.App.Section')
|
||||||
section_id: attr('string')
|
section_id: attr('string')
|
||||||
@@ -13,5 +13,9 @@ Qsupplier.App.Order = DS.Model.extend
|
|||||||
needs_supplier_attention: (-> @get('state') == 'placed' || @get('state') == 'active').property('state')
|
needs_supplier_attention: (-> @get('state') == 'placed' || @get('state') == 'active').property('state')
|
||||||
|
|
||||||
display: (->
|
display: (->
|
||||||
|
return '' unless @get('product_orders')
|
||||||
@get('product_orders').map((po)-> "#{po.product_name} (#{po.quantity})").join(',')
|
@get('product_orders').map((po)-> "#{po.product_name} (#{po.quantity})").join(',')
|
||||||
).property('product_orders')
|
).property('product_orders')
|
||||||
|
|
||||||
|
close: ->
|
||||||
|
@set('state', 'closed')
|
||||||
|
|||||||
@@ -3,9 +3,25 @@ DS.Model.reopen
|
|||||||
updated_at: DS.attr('string')
|
updated_at: DS.attr('string')
|
||||||
DS.Model.reopenClass
|
DS.Model.reopenClass
|
||||||
findCached: (id)->
|
findCached: (id)->
|
||||||
|
return null unless id
|
||||||
@all().findProperty('id', id)
|
@all().findProperty('id', id)
|
||||||
updateOrCreate: (attributes)->
|
updateOrAdd: (attributes)->
|
||||||
if cached = @findCached(attributes.id)
|
if cached = @findCached(attributes.id)
|
||||||
cached.setProperties attributes
|
cached.setProperties attributes
|
||||||
else
|
else
|
||||||
@createRecord(attributes)
|
@find(attributes.id)
|
||||||
|
pushByAttriburtes: (attributes)->
|
||||||
|
#store = @all().get('store')
|
||||||
|
|
||||||
|
#Ugly hack at the cost of an extra request since I do not yet know the proper
|
||||||
|
#code for adding a record by its attributes and having its associations set
|
||||||
|
#@find(attributes.id)
|
||||||
|
|
||||||
|
Ember.get(@, 'relationships').forEach (model, relation)->
|
||||||
|
relation = relation[0]
|
||||||
|
if relation.kind == 'belongsTo' and attributes["#{relation.name}_id"]
|
||||||
|
attributes[relation.name] = model.find(attributes["#{relation.name}_id"])
|
||||||
|
delete attributes["#{relation.name}_id"]
|
||||||
|
|
||||||
|
#store.push @, attributes
|
||||||
|
@createRecord attributes
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# For more information see: http://emberjs.com/guides/routing/
|
# For more information see: http://emberjs.com/guides/routing/
|
||||||
|
# and for queryParams: https://github.com/alexspeller/website/blob/a96d9afe4506454b155cc64299e86e558ce3c9f1/source/guides/routing/query-params.md
|
||||||
Qsupplier.App.Router.reopen
|
Qsupplier.App.Router.reopen
|
||||||
location: 'history'
|
location: 'history'
|
||||||
rootURL: '/supplier'
|
rootURL: '/supplier'
|
||||||
@@ -6,4 +7,4 @@ Qsupplier.App.Router.reopen
|
|||||||
Qsupplier.App.Router.map ->
|
Qsupplier.App.Router.map ->
|
||||||
@resource 'sections', ->
|
@resource 'sections', ->
|
||||||
@resource 'section', path: ':section_id'
|
@resource 'section', path: ':section_id'
|
||||||
|
@resource 'lists', queryParams: ['state']
|
||||||
|
|||||||
@@ -1,11 +1,20 @@
|
|||||||
Qsupplier.App.IndexRoute = Ember.Route.extend
|
Qsupplier.App.IndexRoute = Ember.Route.extend
|
||||||
model: ->
|
model: (params, queryParams)->
|
||||||
|
# Preload only active lists and orders
|
||||||
|
@store.find 'list', state: 'active'
|
||||||
|
@store.find 'order', state: 'active'
|
||||||
Ember.Object.create
|
Ember.Object.create
|
||||||
lists: Qsupplier.App.List.find({state: 'active'})
|
# Find with condition does not work since the resulting array promise is not updated for newly created records
|
||||||
orders: Qsupplier.App.Order.find()
|
#lists: Qsupplier.App.List.find({state: 'active'})
|
||||||
|
#orders: Qsupplier.App.Order.find({state: 'active'})
|
||||||
|
#lists: @store.filter 'list', (l)-> l.get('state') == 'active' # DOES NOT WORK!!!! (yet)
|
||||||
|
# use filter to create a scope on all the records
|
||||||
|
lists: Qsupplier.App.List.filter -> true
|
||||||
|
orders: Qsupplier.App.Order.filter -> true
|
||||||
setupController: (controller, model)->
|
setupController: (controller, model)->
|
||||||
controller.set('model', model)
|
controller.set('model', model)
|
||||||
$('#section_selector').on 'change', (-> controller.set('sectionId', $(this).val()))
|
$('#section_selector').on 'change', (-> controller.set('sectionId', $(this).val()))
|
||||||
|
#controller.set 'lists', @store.all('list')
|
||||||
#controller.set 'lists', Qsupplier.App.List.all() #.filterProperty('state', 'active')
|
#controller.set 'lists', Qsupplier.App.List.all() #.filterProperty('state', 'active')
|
||||||
#controller.set 'orders', Qsupplier.App.Order.all()
|
#controller.set 'orders', Qsupplier.App.Order.all()
|
||||||
#controller.set 'lists', model.get('lists')
|
#controller.set 'lists', model.get('lists')
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# http://emberjs.com/guides/models/defining-a-store/
|
# http://emberjs.com/guides/models/defining-a-store/
|
||||||
|
|
||||||
Qsupplier.App.Store = DS.Store.extend
|
Qsupplier.App.Store = DS.Store.extend
|
||||||
revision: 11
|
revision: 13
|
||||||
adapter: DS.RESTAdapter.create
|
adapter: DS.RESTAdapter.create
|
||||||
namespace: 'supplier'
|
namespace: 'supplier'
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ td.list-status
|
|||||||
if view.content.needs_payment
|
if view.content.needs_payment
|
||||||
span.list-needs-payment-indicator €
|
span.list-needs-payment-indicator €
|
||||||
td.numeric.table_number {{view.content.table_number}}
|
td.numeric.table_number {{view.content.table_number}}
|
||||||
td.section_title {{view.content.section_title}}
|
td.section_title {{view.content.section.title}}
|
||||||
td.currency.total_list_amount {{currency total_amount}}
|
td.currency.total_list_amount {{currency view.content.price}}
|
||||||
td.actions
|
td.actions
|
||||||
if view.content.needs_help
|
if view.content.needs_help
|
||||||
button.btn.btn-info{ action markListAsHelped view.content.id} {{t 'list.is_helped_button'}}
|
button.btn.btn-info.mark_list_as_helped{ action markListAsHelped view.content.id} {{t 'list.is_helped_button'}}
|
||||||
button.btn.btn-warning{ action closeList view.content.id} {{t 'list.close_list' }}
|
button.btn.btn-warning.close_list{ action closeList view.content.id} {{t 'list.close_list' }}
|
||||||
a.btn href="/supplier/lists/{{unbound view.content.id}}"
|
a.btn href="/supplier/lists/{{unbound view.content.id}}"
|
||||||
span.icon-list
|
span.icon-list
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
td {{view.content.display}}
|
td {{view.content.display}}
|
||||||
td.numeric.table_number {{view.content.table_number}}
|
td.numeric.table_number {{view.content.list.table.number}}
|
||||||
td.section_title {{view.content.section_title}}
|
td.section_title {{view.content.section.title}}
|
||||||
td.currency {{currency view.content.total_amount}}
|
td.currency {{currency view.content.price }}
|
||||||
td.actions
|
td.actions
|
||||||
if view.content.placed
|
if view.content.placed
|
||||||
button.btn.btn-success{ action markOrderActive view.content.id} {{t 'order.being_processed'}}
|
button.btn.btn-success{ action markOrderActive view.content.id} {{t 'order.being_processed'}}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
view Ember.TextField valueBinding="width" classNames="dimension"
|
view Ember.TextField valueBinding="width" classNames="dimension"
|
||||||
span x
|
span x
|
||||||
view Ember.TextField valueBinding="height" classNames="dimension"
|
view Ember.TextField valueBinding="height" classNames="dimension"
|
||||||
a.btn.btn-mini{ action finishEditable}
|
a.btn.btn-mini{ action finishEditable }
|
||||||
span.icon-ok
|
span.icon-ok
|
||||||
else
|
else
|
||||||
a.btn.btn-mini{ action makeEditable }
|
a.btn.btn-mini{ action makeEditable }
|
||||||
|
|||||||
@@ -1,3 +1,5 @@
|
|||||||
Qsupplier.App.ActiveListView = Ember.View.extend
|
Qsupplier.App.ActiveListView = Ember.View.extend
|
||||||
tagName: 'tr'
|
tagName: 'tr'
|
||||||
templateName: 'active_list'
|
templateName: 'active_list'
|
||||||
|
classNameBindings: ['classIdentifier']
|
||||||
|
classIdentifier: (-> "list-row-#{@get('content.id')}").property()
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
Qsupplier.App.ActiveOrderView = Ember.View.extend
|
Qsupplier.App.ActiveOrderView = Ember.View.extend
|
||||||
tagName: 'tr'
|
tagName: 'tr'
|
||||||
templateName: 'active_order'
|
templateName: 'active_order'
|
||||||
classNameBindings: ['content.active:active', 'content.delivered:delivered']
|
classNameBindings: ['content.active:active', 'content.delivered:delivered', 'classIdentifier']
|
||||||
|
classIdentifier: (-> "order-row-#{@get('content.id')}").property()
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ root.Qsupplier=
|
|||||||
faye = new Faye.Client(event_host)
|
faye = new Faye.Client(event_host)
|
||||||
faye.subscribe "/supplier/"+supplier_id, (e)=>
|
faye.subscribe "/supplier/"+supplier_id, (e)=>
|
||||||
if(e.event == 'new_order')
|
if(e.event == 'new_order')
|
||||||
Qsupplier.App.Order.create(e.data.order)
|
Qsupplier.App.Order.pushByAttriburtes(e.data.order) if Qsupplier.App
|
||||||
# old stuff
|
# old stuff
|
||||||
body = $('#active-orders-table tbody')
|
body = $('#active-orders-table tbody')
|
||||||
order = new Order(e.data.order)
|
order = new Order(e.data.order)
|
||||||
@@ -12,14 +12,14 @@ root.Qsupplier=
|
|||||||
body.append @mustache('#active-order-template', order)
|
body.append @mustache('#active-order-template', order)
|
||||||
$('.section-table-list-'+order.list_id()).addClass('active_order')
|
$('.section-table-list-'+order.list_id()).addClass('active_order')
|
||||||
else if(e.event == 'list_needs_help')
|
else if(e.event == 'list_needs_help')
|
||||||
if list = Qsupplier.App.List.findCached(e.data.id)
|
if Qsupplier.App and list = Qsupplier.App.List.findCached(e.data.id)
|
||||||
list.set('needs_help', true)
|
list.set('needs_help', true)
|
||||||
# old stuff
|
# old stuff
|
||||||
$('#list-needs-help-indicator-'+e.data.id).removeClass('hide')
|
$('#list-needs-help-indicator-'+e.data.id).removeClass('hide')
|
||||||
$('#list-is-helped-button-'+e.data.id).removeClass('hide')
|
$('#list-is-helped-button-'+e.data.id).removeClass('hide')
|
||||||
$('.section-table-list-'+e.data.id).addClass('needs_help')
|
$('.section-table-list-'+e.data.id).addClass('needs_help')
|
||||||
else if(e.event == 'list_needs_payment')
|
else if(e.event == 'list_needs_payment')
|
||||||
if list = Qsupplier.App.List.findCached(e.data.id)
|
if Qsupplier.App and list = Qsupplier.App.List.findCached(e.data.id)
|
||||||
list.set('needs_payment', true)
|
list.set('needs_payment', true)
|
||||||
# old stuff
|
# old stuff
|
||||||
$('#list-needs-payment-indicator-'+e.data.id).removeClass('hide')
|
$('#list-needs-payment-indicator-'+e.data.id).removeClass('hide')
|
||||||
@@ -28,10 +28,10 @@ root.Qsupplier=
|
|||||||
if list = Qsupplier.App.List.findCached(e.data.id)
|
if list = Qsupplier.App.List.findCached(e.data.id)
|
||||||
list.set('needs_payment', false)
|
list.set('needs_payment', false)
|
||||||
else if e.event == 'list_update'
|
else if e.event == 'list_update'
|
||||||
Qsupplier.App.List.updateOrCreate(e.data.list)
|
Qsupplier.App.List.updateOrAdd(e.data.list) if Qsupplier.App
|
||||||
# old stuff
|
# old stuff
|
||||||
list = new List(e.data.list)
|
list = new List(e.data.list)
|
||||||
row = $('#list-row-'+list.id())
|
row = $('#active-lists-table .list-row-'+list.id())
|
||||||
content = @mustache('#active-list-template', list)
|
content = @mustache('#active-list-template', list)
|
||||||
if row.length then row.replaceWith(content) else $('#active-lists-table tbody').append(content)
|
if row.length then row.replaceWith(content) else $('#active-lists-table tbody').append(content)
|
||||||
table = $('#section-table-'+list.table_id())
|
table = $('#section-table-'+list.table_id())
|
||||||
@@ -42,15 +42,14 @@ root.Qsupplier=
|
|||||||
table.addClass('needs_payment') if list.needs_payment()
|
table.addClass('needs_payment') if list.needs_payment()
|
||||||
table.addClass('active_order') if list.has_active_orders()
|
table.addClass('active_order') if list.has_active_orders()
|
||||||
else if e.event == 'list_closed'
|
else if e.event == 'list_closed'
|
||||||
if list = Qsupplier.App.List.findCached(e.data.id)
|
if Qsupplier.App and list = Qsupplier.App.List.findCached(e.data.id)
|
||||||
list.set('table', null)
|
list.close()
|
||||||
list.set('state', 'closed')
|
$('.list-row-'+e.data.id).remove()
|
||||||
$('#list-row-'+e.data.id).remove()
|
|
||||||
$('.of-list-'+e.data.id).remove()
|
$('.of-list-'+e.data.id).remove()
|
||||||
table_list_class = 'section-table-list-'+e.data.id
|
table_list_class = 'section-table-list-'+e.data.id
|
||||||
$('.'+table_list_class).removeClass('occupied needs_help needs_payment active_order').removeClass(table_list_class)
|
$('.'+table_list_class).removeClass('occupied needs_help needs_payment active_order').removeClass(table_list_class)
|
||||||
else if e.event == 'list_helped'
|
else if e.event == 'list_helped'
|
||||||
if list = Qsupplier.App.List.findCached(e.data.id)
|
if Qsupplier.App and list = Qsupplier.App.List.findCached(e.data.id)
|
||||||
list.set('needs_help', false)
|
list.set('needs_help', false)
|
||||||
list_id = e.data.id
|
list_id = e.data.id
|
||||||
$('#list-needs-help-indicator-'+list_id).addClass('hide')
|
$('#list-needs-help-indicator-'+list_id).addClass('hide')
|
||||||
@@ -58,13 +57,13 @@ root.Qsupplier=
|
|||||||
$('.section-table-list-'+list_id).removeClass('needs_help')
|
$('.section-table-list-'+list_id).removeClass('needs_help')
|
||||||
else if e.event == 'order_being_processed'
|
else if e.event == 'order_being_processed'
|
||||||
$('#order-in-process-button-'+e.data.id).hide()
|
$('#order-in-process-button-'+e.data.id).hide()
|
||||||
$('#order-row-'+e.data.id).removeClass('placed').addClass('active')
|
$('.order-row-'+e.data.id).removeClass('placed').addClass('active')
|
||||||
else if e.event == 'order_being_delivered'
|
else if e.event == 'order_being_delivered'
|
||||||
$('#order-row-'+e.data.id).remove()
|
$('.order-row-'+e.data.id).remove()
|
||||||
$('.section-table-list-'+e.data.list_id).removeClass('active_order')
|
$('.section-table-list-'+e.data.list_id).removeClass('active_order')
|
||||||
else if e.event == 'list_changed_table'
|
else if e.event == 'list_changed_table'
|
||||||
list = new List(e.data.list)
|
list = new List(e.data.list)
|
||||||
list_row = $('#list-row-'+list.id())
|
list_row = $('.list-row-'+list.id())
|
||||||
list_row.find('.table_number').text(list.table_number()).addClass('changed')
|
list_row.find('.table_number').text(list.table_number()).addClass('changed')
|
||||||
list_row.find('.section_title').text(e.data.section_title)
|
list_row.find('.section_title').text(e.data.section_title)
|
||||||
order_rows = $('.of-list-'+list.id())
|
order_rows = $('.of-list-'+list.id())
|
||||||
|
|||||||
@@ -23,9 +23,9 @@ class Quser
|
|||||||
window.active_list.needs_help = false
|
window.active_list.needs_help = false
|
||||||
@list_needs_help_default_action()
|
@list_needs_help_default_action()
|
||||||
else if(e.event == 'order_being_processed')
|
else if(e.event == 'order_being_processed')
|
||||||
$('#order-row-'+e.data.id).addClass('active')
|
$('.order-row-'+e.data.id).addClass('active')
|
||||||
else if(e.event == 'order_being_delivered')
|
else if(e.event == 'order_being_delivered')
|
||||||
$('#order-row-'+e.data.id).addClass('delivered')
|
$('.order-row-'+e.data.id).addClass('delivered')
|
||||||
else if(e.event == 'list_changed_table')
|
else if(e.event == 'list_changed_table')
|
||||||
list = new List(e.data.list)
|
list = new List(e.data.list)
|
||||||
$('.table-number').text(list.table_number())
|
$('.table-number').text(list.table_number())
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ private
|
|||||||
end
|
end
|
||||||
|
|
||||||
def set_locale
|
def set_locale
|
||||||
I18n.locale = (params[:locale].presence || :nl).to_sym
|
I18n.locale = (params[:locale].presence || Rails.configuration.i18n.default_locale).to_sym
|
||||||
end
|
end
|
||||||
|
|
||||||
def layout_by_resource
|
def layout_by_resource
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ class SupplierController < ApplicationController
|
|||||||
ho = {products: []}
|
ho = {products: []}
|
||||||
order_total = 0.0
|
order_total = 0.0
|
||||||
for product_order in order.product_orders
|
for product_order in order.product_orders
|
||||||
order_total += (product_order.amount * product_order.price).round(2)
|
order_total += (product_order.quantity * product_order.price).round(2)
|
||||||
ho[:products] << {name: product_order.product.name, id: product_order.product_id, number: product_order.amount, price: product_order.price}
|
ho[:products] << {name: product_order.product.name, id: product_order.product_id, number: product_order.quantity, price: product_order.price}
|
||||||
end
|
end
|
||||||
ho[:total_amount] = order_total.round(2)
|
ho[:total_amount] = order_total.round(2)
|
||||||
ho[:state] = order.state
|
ho[:state] = order.state
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ module Suppliers
|
|||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html {}
|
format.html {}
|
||||||
format.json do
|
format.json do
|
||||||
render json: {list: @list.with_orders_as_json}
|
render json: @list
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,12 +6,19 @@ module Suppliers
|
|||||||
if params[:state] == 'active'
|
if params[:state] == 'active'
|
||||||
@orders = Order.active_for_supplier(current_supplier.id)
|
@orders = Order.active_for_supplier(current_supplier.id)
|
||||||
else
|
else
|
||||||
@orders = Order.for_supplier(current_supplier, page: params[:page], per_page: params['per_page'] || 10)
|
@orders = Order.for_supplier(current_supplier, page: params[:page], per_page: params['per_page'] || 25)
|
||||||
end
|
end
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html # index.html.erb
|
format.html # index.html.erb
|
||||||
format.json { render json: {orders: @orders.map(&:with_products_as_json)} }
|
format.json { render json: @orders }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def show
|
||||||
|
@order = current_supplier.find_order(params[:id])
|
||||||
|
respond_to do |format|
|
||||||
|
format.json { render json: @order }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
+10
-9
@@ -243,12 +243,13 @@ class List
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Store the final list price in a property
|
||||||
def set_price
|
def set_price
|
||||||
list_total = 0.0
|
list_total = 0.0
|
||||||
for order in orders
|
for order in orders
|
||||||
order_total = 0.0
|
order_total = 0.0
|
||||||
for product_order in order.product_orders
|
for product_order in order.product_orders
|
||||||
order_total += (product_order.amount * product_order.price).round(2)
|
order_total += (product_order.quantity * product_order.price).round(2)
|
||||||
end
|
end
|
||||||
list_total += order_total.round(2)
|
list_total += order_total.round(2)
|
||||||
end
|
end
|
||||||
@@ -269,23 +270,23 @@ class List
|
|||||||
order = Order.create list: self, supplier: supplier, user: user, section_id: section_id
|
order = Order.create list: self, supplier: supplier, user: user, section_id: section_id
|
||||||
return unless order.id
|
return unless order.id
|
||||||
loaded_products = self.class.database.load_document products.keys
|
loaded_products = self.class.database.load_document products.keys
|
||||||
products.each do |product_id, number|
|
products.each do |product_id, quantity|
|
||||||
number = number.to_i
|
quantity = quantity.to_i
|
||||||
product = loaded_products.find{|p| p.id == product_id} # to get the price
|
product = loaded_products.find{|p| p.id == product_id} # to get the price
|
||||||
ProductOrder.create order: order, product_id: product_id, amount: number, price: product.price if number > 0
|
ProductOrder.create order: order, product_id: product_id, quantity: quantity, price: product.price if quantity > 0
|
||||||
end
|
end
|
||||||
set_price
|
set_price
|
||||||
save
|
save
|
||||||
for user_id in user_ids
|
for user_id in user_ids
|
||||||
broadcast_user user_id, 'new_order', order: order.with_products_as_json, total_amount: price
|
broadcast_user user_id, 'new_order', order: order.with_products_as_json, total_amount: price
|
||||||
end
|
end
|
||||||
broadcast_supplier supplier.id, 'list_update', list: with_info_as_json
|
broadcast_supplier supplier.id, 'list_update', active_model_serializer.new(self).as_json
|
||||||
broadcast_supplier supplier.id, 'new_order', order: order.with_products_as_json
|
broadcast_supplier supplier.id, 'new_order', order: order.with_products_as_json
|
||||||
order
|
order
|
||||||
end
|
end
|
||||||
|
|
||||||
def as_json(*args)
|
def as_json(*args)
|
||||||
super.merge(table_number: table_number, has_active_orders: has_active_orders? )
|
super.merge(id: id, table_number: table_number, has_active_orders: has_active_orders? )
|
||||||
end
|
end
|
||||||
|
|
||||||
def with_orders_as_json
|
def with_orders_as_json
|
||||||
@@ -301,8 +302,8 @@ class List
|
|||||||
ho[:state] = order.state
|
ho[:state] = order.state
|
||||||
order_total = 0.0
|
order_total = 0.0
|
||||||
for product_order in order.product_orders
|
for product_order in order.product_orders
|
||||||
order_total += (product_order.amount * product_order.price).round(2)
|
order_total += (product_order.quantity * product_order.price).round(2)
|
||||||
ho[:products] << {name: product_order.product_name, id: product_order.product_id, number: product_order.amount, price: product_order.price}
|
ho[:products] << {name: product_order.product_name, id: product_order.product_id, number: product_order.quantity, price: product_order.price}
|
||||||
end
|
end
|
||||||
ho[:total_amount] = order_total.round(2)
|
ho[:total_amount] = order_total.round(2)
|
||||||
ho[:state] = order.state
|
ho[:state] = order.state
|
||||||
@@ -343,7 +344,7 @@ class List
|
|||||||
def with_info_as_json
|
def with_info_as_json
|
||||||
return @with_info_as_json if @with_info_as_json.present?
|
return @with_info_as_json if @with_info_as_json.present?
|
||||||
hl = as_json
|
hl = as_json
|
||||||
hl[:total_amount] = orders.inject(0.0){|sum, o| sum + o.product_orders.inject(0.0){|s, po| s + (po.amount * po.price).round(2)}}.round(2)
|
hl[:total_amount] = orders.inject(0.0){|sum, o| sum + o.product_orders.inject(0.0){|s, po| s + (po.quantity * po.price).round(2)}}.round(2)
|
||||||
hl[:section_title] = table.section.try(:title)
|
hl[:section_title] = table.section.try(:title)
|
||||||
@with_info_as_json = hl
|
@with_info_as_json = hl
|
||||||
end
|
end
|
||||||
|
|||||||
+4
-3
@@ -1,5 +1,6 @@
|
|||||||
class Order
|
class Order
|
||||||
include SimplyStored::Couch
|
include SimplyStored::Couch
|
||||||
|
include ActiveModel::SerializerSupport
|
||||||
|
|
||||||
property :state, default: 'placed' # placed, active, delivered, cancelled, closed
|
property :state, default: 'placed' # placed, active, delivered, cancelled, closed
|
||||||
|
|
||||||
@@ -115,9 +116,9 @@ class Order
|
|||||||
ho[:product_orders] = []
|
ho[:product_orders] = []
|
||||||
order_total = 0.0
|
order_total = 0.0
|
||||||
for product_order in product_orders
|
for product_order in product_orders
|
||||||
order_total += (product_order.amount * product_order.price).round(2)
|
order_total += (product_order.quantity * product_order.price).round(2)
|
||||||
ho[:products] << {name: product_order.product.name, id: product_order.product_id, number: product_order.amount, price: product_order.price}
|
ho[:products] << {name: product_order.product.name, id: product_order.product_id, number: product_order.quantity, price: product_order.price}
|
||||||
ho[:product_orders] << {product_name: product_order.product.name, id: product_order.id, quantity: product_order.amount, price: product_order.price}
|
ho[:product_orders] << {product_name: product_order.product.name, id: product_order.id, quantity: product_order.quantity, price: product_order.price}
|
||||||
end
|
end
|
||||||
ho[:total_amount] = order_total.round(2)
|
ho[:total_amount] = order_total.round(2)
|
||||||
@with_products_as_json = ho
|
@with_products_as_json = ho
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
class ProductOrder
|
class ProductOrder
|
||||||
include SimplyStored::Couch
|
include SimplyStored::Couch
|
||||||
|
|
||||||
property :amount, type: Fixnum
|
property :quantity, type: Fixnum
|
||||||
property :price, type: Float
|
property :price, type: Float
|
||||||
|
|
||||||
belongs_to :product
|
belongs_to :product
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ class Supplier
|
|||||||
#LOCATION
|
#LOCATION
|
||||||
property :lat, type: Float, default: 52.08062426379751
|
property :lat, type: Float, default: 52.08062426379751
|
||||||
property :lng, type: Float, default: 4.312562942504883
|
property :lng, type: Float, default: 4.312562942504883
|
||||||
|
|
||||||
#WIFI
|
#WIFI
|
||||||
property :offer_wifi
|
property :offer_wifi
|
||||||
property :wifi_ssid
|
property :wifi_ssid
|
||||||
@@ -112,6 +112,12 @@ class Supplier
|
|||||||
self.devise_mailer.confirmation_instructions(self).deliver
|
self.devise_mailer.confirmation_instructions(self).deliver
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def find_order(id)
|
||||||
|
order = Order.find(id)
|
||||||
|
raise SimplyStored::RecordNotFound unless order.supplier_id == self.id
|
||||||
|
order
|
||||||
|
end
|
||||||
|
|
||||||
def send_creation_notifications
|
def send_creation_notifications
|
||||||
SupplierMailer.creation(self).deliver
|
SupplierMailer.creation(self).deliver
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ class User
|
|||||||
|
|
||||||
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :token_authenticatable # , :registerable
|
devise :database_authenticatable, :recoverable, :rememberable, :trackable, :token_authenticatable # , :registerable
|
||||||
|
|
||||||
|
property :authentication_token
|
||||||
|
|
||||||
has_and_belongs_to_many :lists, storing_keys: false
|
has_and_belongs_to_many :lists, storing_keys: false
|
||||||
has_many :orders
|
has_many :orders
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,14 @@
|
|||||||
class OrderSerializer < Qwaiter::Serializer
|
class OrderSerializer < Qwaiter::Serializer
|
||||||
embed :ids
|
embed :ids
|
||||||
attributes :state, :list_id, :section_id
|
attributes :state, :list_id, :section_id, :product_orders, :price
|
||||||
|
|
||||||
|
def product_orders
|
||||||
|
@product_orders ||= object.product_orders.include_relation(:product) .map do |product_order|
|
||||||
|
{product_name: product_order.product.name, id: product_order.id, quantity: product_order.quantity, price: product_order.price}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def price
|
||||||
|
product_orders.inject(0){|sum, po| sum + po[:quantity] * po[:price]}.round(2)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<tr id="list-row-{{id}}">
|
<tr class="list-row-{{id}}">
|
||||||
<td class="list-status">
|
<td class="list-status">
|
||||||
<span id="list-needs-help-indicator-{{id}}" class="list-needs-help-indicator {{^needs_help}}hide{{/needs_help}}">?</span>
|
<span id="list-needs-help-indicator-{{id}}" class="list-needs-help-indicator {{^needs_help}}hide{{/needs_help}}">?</span>
|
||||||
<span id="list-needs-payment-indicator-{{id}}" class="list-needs-payment-indicator {{^needs_payment}}hide{{/needs_payment}}">€</span>
|
<span id="list-needs-payment-indicator-{{id}}" class="list-needs-payment-indicator {{^needs_payment}}hide{{/needs_payment}}">€</span>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<tr id="order-row-{{id}}" class="of-list-{{list_id}} {{state}}">
|
<tr class="order-row-{{id}} of-list-{{list_id}} {{state}}">
|
||||||
<td>{{display}}</td>
|
<td>{{display}}</td>
|
||||||
<td class="numeric table_number">{{table_number}}</td>
|
<td class="numeric table_number">{{table_number}}</td>
|
||||||
<td class="section_title">{{section_title}}</td>
|
<td class="section_title">{{section_title}}</td>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<tr id="order-row-{{id}}" class="{{state}}">
|
<tr class="order-row-{{id}} {{state}}">
|
||||||
<td>{{display}}</td>
|
<td>{{display}}</td>
|
||||||
<td class="currency">{{#currency}}{{total_amount}}{{/currency}}</td>
|
<td class="currency">{{#currency}}{{total_amount}}{{/currency}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<tr id="order-row-{{id}}" class="{{state}}">
|
<tr class="order-row-{{id}} {{state}}">
|
||||||
<td>{{display}}</td>
|
<td>{{display}}</td>
|
||||||
<td class="currency">{{#currency}}{{total_amount}}{{/currency}}</td>
|
<td class="currency">{{#currency}}{{total_amount}}{{/currency}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
.pull-right
|
.pull-right
|
||||||
= select_tag('current_section_selector', options_for_select([[current_supplier.name, '']] + current_supplier.sections.map{|s| ["- #{s.title}", s.id]}, params[:section_id]), id: :section_selector)
|
= select_tag('current_section_selector', options_for_select([[current_supplier.name, '']] + current_supplier.sections.map{|s| ["- #{s.title}", s.id]}, params[:section_id]), id: :section_selector)
|
||||||
a.icon-arrow-right.go-to-tables-view.hide href=tables_view_suppliers_section_path('0000')
|
a.icon-arrow-right.go-to-tables-view.hide href=tables_view_suppliers_section_path('0000')
|
||||||
= render template: 'supplier/active_lists'
|
/= render template: 'supplier/active_lists'
|
||||||
= render template: 'supplier/active_orders'
|
/= render template: 'supplier/active_orders'
|
||||||
- content_for :footer do
|
- content_for :footer do
|
||||||
javascript:
|
javascript:
|
||||||
$(function(){
|
$(function(){
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
Feature: Supplier main board
|
||||||
|
|
||||||
|
@javascript
|
||||||
|
Scenario: the active list should be present and contained in row having its id
|
||||||
|
Given there is an active list and order
|
||||||
|
And I am signed in as supplier
|
||||||
|
|
||||||
|
When I visit the supplier root path
|
||||||
|
Then the supplier dashboard should display the active list
|
||||||
|
And the supplier dashboard should display the active order
|
||||||
|
|
||||||
|
When I click on translation 'supplier.order.being_processed'
|
||||||
|
# waiting here only needed in old style implementation
|
||||||
|
And I wait 1 second
|
||||||
|
Then the supplier order row should be marked as active
|
||||||
|
|
||||||
|
When I click on translation 'supplier.order.being_served'
|
||||||
|
And I wait 1 second
|
||||||
|
Then the order in the supplier dashboard should not be displayed anymore
|
||||||
|
And the order should be marked as delivered
|
||||||
|
|
||||||
|
And the list on the supplier dashboard should not be marked as in need of help
|
||||||
|
When the list is marked as in need of help
|
||||||
|
# waiting here only needed in old style implementation
|
||||||
|
And I wait 1 second
|
||||||
|
Then the list on the supplier dashboard should be marked as in need of help
|
||||||
|
|
||||||
|
When I click on the mark list as helped button in the supplier dashboard
|
||||||
|
Then the list on the supplier dashboard should not be marked as in need of help
|
||||||
|
|
||||||
|
When the list is marked as in need of payment
|
||||||
|
Then the list on the supplier dashboard should be marked as in need of payment
|
||||||
|
|
||||||
|
When another order is placed
|
||||||
|
Then the supplier dashboard list should display the updated price
|
||||||
|
And the new order should be present in the supplier dashboard
|
||||||
|
|
||||||
|
When a new order on a table in another section is created
|
||||||
|
And I wait 1 second
|
||||||
|
Then the new list should appear in the supplier dashboard
|
||||||
|
And the new order on a table in another section should be present in the supplier dashboard
|
||||||
|
|
||||||
|
When I click on the close list button in the supplier dashboard
|
||||||
|
And I wait 1 second
|
||||||
|
Then the list in the supplier dashboard should not be displayed anymore
|
||||||
|
And the list should be marked as closed
|
||||||
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
step "there is a fresh database with a user and supplier" do
|
||||||
|
CouchPotato.couchrest_database.recreate!
|
||||||
|
create_confirmed_supplier 'supplier@qwaiter.com'
|
||||||
|
create_user 'user@qwaiter.com'
|
||||||
|
end
|
||||||
|
|
||||||
|
step "I click on translation :translation" do |translation_key|
|
||||||
|
text = I18n.t(translation_key)
|
||||||
|
click_on text
|
||||||
|
end
|
||||||
|
step "I wait :number second/seconds" do |number|
|
||||||
|
sleep number.to_f
|
||||||
|
end
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
step "the list is marked as in need of help" do
|
||||||
|
@list.needs_help.should_not be_true
|
||||||
|
@list.needs_help!
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the list is marked as in need of payment" do
|
||||||
|
@list.needs_payment!
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the list should be marked as closed" do
|
||||||
|
@list.reload
|
||||||
|
@list.state.should == 'closed'
|
||||||
|
end
|
||||||
|
|
||||||
|
step 'a new order on a table in another section is created' do
|
||||||
|
@new_section = create :section, title: 'Terrace', supplier: @supplier
|
||||||
|
@new_table = create :table, number: 59, section: @new_section, supplier: @supplier
|
||||||
|
@new_list = create :list, section: @new_section, table: @new_table, supplier: @supplier, user_ids: [@user.id]
|
||||||
|
@new_order = @new_list.place_order @user, {@product.id => 3}
|
||||||
|
end
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
step "the order should be closed" do
|
||||||
|
@order.reload
|
||||||
|
@order.state.should == 'closed'
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the order should be marked as delivered" do
|
||||||
|
@order.reload
|
||||||
|
@order.state.should == 'delivered'
|
||||||
|
end
|
||||||
|
|
||||||
|
step "another order is placed" do
|
||||||
|
@new_order = @list.place_order @user, {@product.id => 5}
|
||||||
|
end
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
step "I am signed in as supplier" do
|
||||||
|
step 'visit the supplier sign in path'
|
||||||
|
find('#supplier_email').set @supplier.email
|
||||||
|
find('#supplier_password').set @supplier_password
|
||||||
|
click_on 'Inloggen'
|
||||||
|
end
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
step 'there is a confirmed and open supplier' do
|
||||||
|
@supplier_password = 'secret1'
|
||||||
|
@supplier = create :supplier, email: 'supplier@qwaiter.com', password: @supplier_password, confirmation_token: 'abc', confirmed_at: Time.now.utc, open: true
|
||||||
|
@section = create :section, title: 'Room', supplier: @supplier
|
||||||
|
end
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
step "there is an active list and order" do
|
||||||
|
@user ||= create :user
|
||||||
|
step 'there is a confirmed and open supplier'
|
||||||
|
@table = create :table, supplier: @supplier, section: @section
|
||||||
|
@section.should be_present
|
||||||
|
@list = create :list, state: 'active', supplier: @supplier, table: @table, section: @section, user_ids: [@user.id]
|
||||||
|
@product = create :product, price: 2.22, supplier: @supplier
|
||||||
|
@order = create :order, user: @user, list: @list, supplier: @supplier, section: @section
|
||||||
|
@product_order = create :product_order, order: @order, product: @product, quantity: 3, price: 2.11
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the supplier dashboard should display the active list" do
|
||||||
|
el = find(".list-row-#{@list.id}")
|
||||||
|
el['class'].should_not =~ /active/
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the list in the supplier dashboard should not be displayed anymore" do
|
||||||
|
page.should_not have_selector(".list-row-#{@list.id}")
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the supplier dashboard should display the active order" do
|
||||||
|
el = find(".order-row-#{@order.id}")
|
||||||
|
el['class'].should_not =~ /active/
|
||||||
|
end
|
||||||
|
step "the supplier order row should be marked as active" do
|
||||||
|
el = find(".order-row-#{@order.id}")
|
||||||
|
el['class'].should =~ /active/
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the order in the supplier dashboard should not be displayed anymore" do
|
||||||
|
page.should_not have_selector(".order-row-#{@order.id}")
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the list on the supplier dashboard should not be marked as in need of help" do
|
||||||
|
page.should_not have_selector(".list-row-#{@list.id} .list-needs-help-indicator")
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the list on the supplier dashboard should be marked as in need of help" do
|
||||||
|
page.should have_selector(".list-row-#{@list.id} .list-needs-help-indicator")
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the list on the supplier dashboard should not be marked as in need of payment" do
|
||||||
|
page.should_not have_selector(".list-row-#{@list.id} .list-needs-payment-indicator")
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the list on the supplier dashboard should be marked as in need of payment" do
|
||||||
|
page.should have_selector(".list-row-#{@list.id} .list-needs-payment-indicator")
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the supplier dashboard list should display the updated price" do
|
||||||
|
el = find(".list-row-#{@list.id} .total_list_amount")
|
||||||
|
# original order is 3 * 2.11 = 6.33
|
||||||
|
# new order price = 5 * 2.22 = 11.10
|
||||||
|
# therefore the updated price should be 17.43
|
||||||
|
el.text.should =~ /17.43/
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the new order should be present in the supplier dashboard" do
|
||||||
|
el = find(".order-row-#{@new_order.id}")
|
||||||
|
el.find('.table_number').text.should == @table.number.to_s
|
||||||
|
el.find('.section_title').text.should == @section.title
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the new order on a table in another section should be present in the supplier dashboard" do
|
||||||
|
el = find(".order-row-#{@new_order.id}")
|
||||||
|
el.find('.table_number').text.should == @new_table.number.to_s
|
||||||
|
el.find('.section_title').text.should == @new_section.title
|
||||||
|
end
|
||||||
|
|
||||||
|
step "the new list should appear in the supplier dashboard" do
|
||||||
|
el = find(".list-row-#{@new_list.id}")
|
||||||
|
el.find('.total_list_amount').text.should =~ /6.66/
|
||||||
|
el.find('.section_title').text.should == 'Terrace'
|
||||||
|
el.find('.table_number').text.should == @new_table.number.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
step "I click on the close list button in the supplier dashboard" do
|
||||||
|
find(".list-row-#{@list.id} .close_list").click
|
||||||
|
end
|
||||||
|
|
||||||
|
step "I click on the mark list as helped button in the supplier dashboard" do
|
||||||
|
find(".list-row-#{@list.id} .mark_list_as_helped").click
|
||||||
|
end
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
step 'visit the supplier sign in path' do
|
||||||
|
visit '/suppliers/sign_in'
|
||||||
|
end
|
||||||
|
|
||||||
|
step "I visit the supplier root path" do
|
||||||
|
visit '/supplier' unless page.current_path == '/supplier'
|
||||||
|
end
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
FactoryGirl.define do
|
||||||
|
factory :product_order do
|
||||||
|
association :order
|
||||||
|
association :product
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
require 'spec_helper'
|
|
||||||
feature 'Supplier product categories spec', %q{
|
|
||||||
In order to manage product categories
|
|
||||||
As a confirmed supplier
|
|
||||||
I want to have control over product categories and associated products
|
|
||||||
} do
|
|
||||||
background do
|
|
||||||
create_confirmed_supplier 'supplier@qwaiter.com'
|
|
||||||
end
|
|
||||||
context "GET #index" do
|
|
||||||
background do
|
|
||||||
@product_category = create :product_category, supplier: @supplier
|
|
||||||
end
|
|
||||||
scenario "I can see a drag handle having class .handle for sorting the product categories" do
|
|
||||||
login_supplier_as 'supplier@qwaiter.com'
|
|
||||||
visit '/supplier/product_categories'
|
|
||||||
page.should have_selector '.handle'
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
+21
-10
@@ -3,10 +3,15 @@ require 'spec_helper'
|
|||||||
|
|
||||||
describe List do
|
describe List do
|
||||||
let(:supplier) { create :supplier }
|
let(:supplier) { create :supplier }
|
||||||
|
let(:supplier_password){'secret1'}
|
||||||
|
let(:supplier) { create :supplier, email: 'supplier@qwaiter.com', password: supplier_password, confirmation_token: 'abc', confirmed_at: Time.now.utc, open: true }
|
||||||
let(:user) { create :user }
|
let(:user) { create :user }
|
||||||
let(:section) { create :section, supplier: supplier}
|
let(:section) { create :section, supplier: supplier}
|
||||||
let(:table) { create :table, supplier: supplier}
|
let(:table) { create :table, supplier: supplier}
|
||||||
let(:list){ create :list, supplier: supplier, table: table, user_ids: [user.id] }
|
let(:list){ create :list, supplier: supplier, table: table, section: section, user_ids: [user.id] }
|
||||||
|
let(:product){ create :product, price: 2.22, supplier: supplier }
|
||||||
|
let(:order) { create :order, user: user, list: list, supplier: supplier, section: section }
|
||||||
|
let(:product_order ){ create :product_order, order: order, product: product, quantity: 3, price: 2.11 }
|
||||||
subject { list }
|
subject { list }
|
||||||
describe :as_json do
|
describe :as_json do
|
||||||
it 'should include _id in as_json serialization' do
|
it 'should include _id in as_json serialization' do
|
||||||
@@ -17,16 +22,22 @@ describe List do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe :mark_as_payed do
|
describe :mark_as_paid do
|
||||||
it "should set payed_at to a time" do
|
it "should set paid_at to a time" do
|
||||||
list.payed_at.should be_nil
|
list.paid_at.should be_nil
|
||||||
list.mark_as_payed
|
list.is_paid!
|
||||||
list.payed_at.should be_kind_of Time
|
list.paid_at.should be_kind_of Time
|
||||||
end
|
end
|
||||||
it "should set is_payed to true" do
|
it "should set is_paid to true" do
|
||||||
list.is_payed.should be_false
|
list.is_paid.should be_false
|
||||||
list.mark_as_payed
|
list.is_paid!
|
||||||
list.is_payed.should be_true
|
list.is_paid.should be_true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#set_price' do
|
||||||
|
it 'takes the product_order price in stead of the product price' do
|
||||||
|
product_order and list.set_price.should == 6.33
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
+11
-7
@@ -2,16 +2,19 @@
|
|||||||
ENV["RAILS_ENV"] ||= 'test'
|
ENV["RAILS_ENV"] ||= 'test'
|
||||||
require File.expand_path("../../config/environment", __FILE__)
|
require File.expand_path("../../config/environment", __FILE__)
|
||||||
require 'rspec/rails'
|
require 'rspec/rails'
|
||||||
require 'rspec/autorun'
|
require 'rspec/matchers'
|
||||||
|
require 'capybara/rspec'
|
||||||
|
require 'turnip/capybara'
|
||||||
|
|
||||||
# Requires supporting ruby files with custom matchers and macros, etc,
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
||||||
# in spec/support/ and its subdirectories.
|
# in spec/support/ and its subdirectories.
|
||||||
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
|
||||||
#Dir[Rails.root.join("spec/factories/**/*.rb")].each {|f| require f }
|
#Dir[Rails.root.join("spec/factories/**/*.rb")].each {|f| require f }
|
||||||
|
Dir.glob("spec/acceptance_steps/**/*steps.rb") { |f| load f, true }
|
||||||
|
|
||||||
I18n.locale = :en
|
I18n.locale = Rails.configuration.i18n.default_locale
|
||||||
Devise.stretches = 1
|
Devise.stretches = 1
|
||||||
Capybara.javascript_driver = :selenium
|
Capybara.javascript_driver = :webkit
|
||||||
#Capybara.default_driver = :selenium
|
#Capybara.default_driver = :selenium
|
||||||
|
|
||||||
module FactoryAttributesFor
|
module FactoryAttributesFor
|
||||||
@@ -45,7 +48,7 @@ RSpec.configure do |config|
|
|||||||
config.tty = true
|
config.tty = true
|
||||||
|
|
||||||
# Use the specified formatter
|
# Use the specified formatter
|
||||||
config.formatter = :documentation # :progress, :html, :textmate
|
#config.formatter = :documentation # :progress, :html, :textmate
|
||||||
|
|
||||||
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
|
||||||
#config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
#config.fixture_path = "#{::Rails.root}/spec/fixtures"
|
||||||
@@ -58,10 +61,11 @@ RSpec.configure do |config|
|
|||||||
config.before :each do
|
config.before :each do
|
||||||
CouchPotato.couchrest_database.recreate!
|
CouchPotato.couchrest_database.recreate!
|
||||||
end
|
end
|
||||||
config.before :each, type: :request do
|
|
||||||
#Capybara.current_driver = :selenium
|
config.before :each, type: :feature do
|
||||||
#sign_in_user_through_request
|
Supplier.any_instance.stub send_confirmation_instructions: true
|
||||||
end
|
end
|
||||||
|
|
||||||
# If true, the base class of anonymous controllers will be inferred
|
# If true, the base class of anonymous controllers will be inferred
|
||||||
# automatically. This will be the default behavior in future versions of
|
# automatically. This will be the default behavior in future versions of
|
||||||
# rspec-rails.
|
# rspec-rails.
|
||||||
|
|||||||
Reference in New Issue
Block a user