From 2c3705790c44f3953437fd217009d0cc79ab169c Mon Sep 17 00:00:00 2001 From: Benjamin ter Kuile Date: Mon, 21 Sep 2015 15:22:43 +0200 Subject: [PATCH] User specs in the green --- .../button/change-list-table.js.coffee | 8 +++++ .../modals/base_controller.js.coffee | 2 +- .../modals/change-list-table.js.coffee | 9 ++++++ .../app/helpers/table-number.js.coffee | 3 ++ .../supplier/app/models/list.js.coffee | 30 +++++++++++-------- .../supplier/app/models/section.js.coffee | 1 + .../app/routes/application.js.coffee.erb | 3 +- .../button/change-list-table.emblem | 1 + .../app/templates/list/_content.emblem | 12 ++++++-- .../templates/modals/change-list-table.emblem | 7 +++++ .../javascripts/translations.js.coffee.erb | 1 - .../supplier/foundation1/_qlists.sass | 14 ++++++++- app/controllers/dashboard_controller.rb | 4 +++ app/controllers/suppliers/lists_controller.rb | 17 +++++++++++ app/controllers/users/tables_controller.rb | 3 +- app/models/list.rb | 4 +-- config/initializers/emblem.rb | 2 +- config/locales/supplier.en.yml | 2 ++ config/locales/supplier.nl.yml | 2 ++ config/routes.rb | 2 ++ spec/acceptance/users/active_list.feature | 1 - ..._with_facebook.feature => sign_up.feature} | 0 spec/acceptance_steps/order_steps.rb | 2 +- .../users/authentication_steps.rb | 4 +-- .../users/join_request_steps.rb | 2 +- .../users/order_products_steps.rb | 2 +- spec/support/ember_helpers.rb | 4 +-- 27 files changed, 112 insertions(+), 30 deletions(-) create mode 100644 app/assets/javascripts/supplier/app/components/button/change-list-table.js.coffee create mode 100644 app/assets/javascripts/supplier/app/controllers/modals/change-list-table.js.coffee create mode 100644 app/assets/javascripts/supplier/app/helpers/table-number.js.coffee create mode 100644 app/assets/javascripts/supplier/app/templates/components/button/change-list-table.emblem create mode 100644 app/assets/javascripts/supplier/app/templates/modals/change-list-table.emblem rename spec/acceptance/users/{sign_up_with_facebook.feature => sign_up.feature} (100%) diff --git a/app/assets/javascripts/supplier/app/components/button/change-list-table.js.coffee b/app/assets/javascripts/supplier/app/components/button/change-list-table.js.coffee new file mode 100644 index 00000000..dd8a8ba1 --- /dev/null +++ b/app/assets/javascripts/supplier/app/components/button/change-list-table.js.coffee @@ -0,0 +1,8 @@ +App.ButtonChangeListTableComponent = Ember.Component.extend + layoutName: 'components/button/change-list-table' + tagName: 'button' + classNames: ['change-list-table-button'] + click: -> + @modal 'change-list-table', + model: @list + 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 bff43d1b..5f05c580 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 @@ -22,7 +22,7 @@ #underscored = @constructor.toString().replace(/[a-zA-Z_-]+\@controller:modals\//, '').replace(/:$/, '').underscore() # ember cli # find translated title or humanize the controller name if convention_translation = ttry("modal.#{underscored}.title", translation_params) - tspan(@get("modal.#{underscored}.title"), translation_params).htmlSafe() + tspan("modal.#{underscored}.title", translation_params).htmlSafe() else underscored.capitalize().replace(/_/, ' ') ).property('model.id', 'modal_options.title_path') diff --git a/app/assets/javascripts/supplier/app/controllers/modals/change-list-table.js.coffee b/app/assets/javascripts/supplier/app/controllers/modals/change-list-table.js.coffee new file mode 100644 index 00000000..d6e046b3 --- /dev/null +++ b/app/assets/javascripts/supplier/app/controllers/modals/change-list-table.js.coffee @@ -0,0 +1,9 @@ +App.modals.ChangeListTableController = @App.modals.BaseController.extend + list_moving: false + sections: Ember.computed -> @store.peekAll('section') + actions: + moveToTable: (table)-> + @set 'list_moving', true + Ember.$.post Routes.change_table_suppliers_list_path(@get('model.id')), {table_id: table.id}, (response)=> + #@set "model.table", table + @send 'close' diff --git a/app/assets/javascripts/supplier/app/helpers/table-number.js.coffee b/app/assets/javascripts/supplier/app/helpers/table-number.js.coffee new file mode 100644 index 00000000..ec09f16c --- /dev/null +++ b/app/assets/javascripts/supplier/app/helpers/table-number.js.coffee @@ -0,0 +1,3 @@ +App.TableNumberHelper = Ember.Helper.helper (params, options)-> + table_number = params[0] + "# #{table_number}".htmlSafe() diff --git a/app/assets/javascripts/supplier/app/models/list.js.coffee b/app/assets/javascripts/supplier/app/models/list.js.coffee index bda08e68..a097e624 100644 --- a/app/assets/javascripts/supplier/app/models/list.js.coffee +++ b/app/assets/javascripts/supplier/app/models/list.js.coffee @@ -16,13 +16,29 @@ App.List = DS.Model.extend #users: DS.hasMany('user', inverse: 'active_list') orders: DS.hasMany('order', async: false) section: DS.belongsTo('section', async: false) # should be async, but synchroneously loading now fails with JSONAPI, this seems to work - active: ( -> @get('state') is 'active' ).property('state') + + # COMPUTED PROPERTIES + active: Ember.computed.equal 'state', 'active' + total: (-> + @get('relevant_orders').getEach('total').reduce(((sum, total) -> sum + total), 0) + ).property('relevant_orders.@each.total') + relevant_orders: (-> @get('orders').filter((o)->o.get('state') isnt 'cancelled')).property('orders.@each.state') + active_orders: (-> @get('orders').filter((o)->o.get('state') is 'placed' or o.get('state') is 'active')).property('orders.@each.state') + sorted_orders: (-> @get('relevant_orders').sortBy('created_at').reverseObjects()).property('relevant_orders.[]') + + has_active_orders: (-> + return false unless @get('state') == 'active' + !!@get('orders').filter( (order) -> order.get('state') is 'active' or order.get('state') is 'placed').length + ).property('state', 'orders.@each.state') + isClosed: -> @set('state', 'closed') #@set 'has_active_orders', false @set 'table', null @isHelped() @isPaid() + + # EVENTS isHelped: -> @set 'needs_help', false isNeedingHelp: -> @@ -31,24 +47,14 @@ App.List = DS.Model.extend @set 'needs_payment', true isPaid: -> @set 'needs_payment', false - relevant_orders: (-> @get('orders').filter((o)->o.get('state') isnt 'cancelled')).property('orders.@each.state') - active_orders: (-> @get('orders').filter((o)->o.get('state') is 'placed' or o.get('state') is 'active')).property('orders.@each.state') - total: (-> - @get('relevant_orders').getEach('total').reduce(((sum, total) -> sum + total), 0) - ).property('relevant_orders.@each.total') - has_active_orders: (-> - return false unless @get('state') == 'active' - !!@get('orders').filter( (order) -> order.get('state') is 'active' or order.get('state') is 'placed').length - ).property('state', 'orders.@each.state') + # TRIGGERS close: -> @isClosed() $.post Routes.close_suppliers_list_path(@id) - markHelped: -> @isHelped() $.post Routes.mark_helped_suppliers_list_path(@id) remove_needs_payment: -> @set 'needs_payment', false $.post Routes.remove_needs_payment_suppliers_list_path(@id) - sorted_orders: (-> @get('relevant_orders').sortBy('created_at').reverseObjects()).property('relevant_orders.@each.isLoaded') diff --git a/app/assets/javascripts/supplier/app/models/section.js.coffee b/app/assets/javascripts/supplier/app/models/section.js.coffee index 8acad40b..9e762e1e 100644 --- a/app/assets/javascripts/supplier/app/models/section.js.coffee +++ b/app/assets/javascripts/supplier/app/models/section.js.coffee @@ -6,6 +6,7 @@ App.Section = DS.Model.extend tables: DS.hasMany('table', async: false) section_elements: DS.hasMany('section-element', async: false) section_areas: DS.hasMany('section-area', async: false) + sorted_tables: Ember.computed 'tables.[]', -> @get('tables').sortBy('number') editmode: false diff --git a/app/assets/javascripts/supplier/app/routes/application.js.coffee.erb b/app/assets/javascripts/supplier/app/routes/application.js.coffee.erb index eb65fc3b..23634c42 100644 --- a/app/assets/javascripts/supplier/app/routes/application.js.coffee.erb +++ b/app/assets/javascripts/supplier/app/routes/application.js.coffee.erb @@ -138,7 +138,8 @@ App.ApplicationRoute = Ember.Route.extend if data.payload @store.pushPayload(data.payload) try ion.sound.play('water_droplet') - list_changed_table: (data) -> @store.pushPayload('list', lists: [data.list]) + list_changed_table: (data)-> + @store.pushPayload(data.payload) list_closed: (data) -> list.isClosed() if list = @store.peekRecord('list', data.id) list_helped: (data) -> list.isHelped() if list = @store.peekRecord('list', data.id) remove_list_needs_payment: (data) -> list.set('needs_payment', false) if list = @store.peekRecord('list', data.id) diff --git a/app/assets/javascripts/supplier/app/templates/components/button/change-list-table.emblem b/app/assets/javascripts/supplier/app/templates/components/button/change-list-table.emblem new file mode 100644 index 00000000..71a63369 --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/components/button/change-list-table.emblem @@ -0,0 +1 @@ +span.fa.fa-random diff --git a/app/assets/javascripts/supplier/app/templates/list/_content.emblem b/app/assets/javascripts/supplier/app/templates/list/_content.emblem index 7138ce2d..5dd35f3d 100644 --- a/app/assets/javascripts/supplier/app/templates/list/_content.emblem +++ b/app/assets/javascripts/supplier/app/templates/list/_content.emblem @@ -7,8 +7,16 @@ if list.closed_at .display-field=time list.closed_at .display-row .display-label=t 'attributes.list.state' - .display-field - =state 'list' list.state + .display-field=state 'list' list.state +if list.active + .display-row + .display-label=t 'models.section' + .display-field= list.table.section.title + .display-row + .display-label=t 'models.table' + .display-field + = table-number list.table.number + = button-change-list-table list=list .display-row .display-label   .display-field diff --git a/app/assets/javascripts/supplier/app/templates/modals/change-list-table.emblem b/app/assets/javascripts/supplier/app/templates/modals/change-list-table.emblem new file mode 100644 index 00000000..581bface --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/modals/change-list-table.emblem @@ -0,0 +1,7 @@ +h3= tables.length +each sections as |section| + h3= section.title + ul.change-list-table-section-tables + each section.sorted_tables as |table| + unless table.active_list + li: a{action "moveToTable" table}= table-number table.number diff --git a/app/assets/javascripts/translations.js.coffee.erb b/app/assets/javascripts/translations.js.coffee.erb index d3dce2a4..2e668c6f 100644 --- a/app/assets/javascripts/translations.js.coffee.erb +++ b/app/assets/javascripts/translations.js.coffee.erb @@ -14,7 +14,6 @@ errors: <%= I18n.t('errors', locale: :nl).to_json %> date: <%= {day_name: Hash[Date::DAYNAMES.map(&:downcase).zip(I18n.t('date.day_names', locale: :nl))]}.to_json %> - @day_minutes_to_time = (minutes)-> return "" unless minutes [("0" + Math.floor(minutes/60)).substr(-2,2), ("0" + Math.floor(minutes%60)).substr(-2,2)].join(":") diff --git a/app/assets/stylesheets/supplier/foundation1/_qlists.sass b/app/assets/stylesheets/supplier/foundation1/_qlists.sass index c01f6cbe..09b45526 100644 --- a/app/assets/stylesheets/supplier/foundation1/_qlists.sass +++ b/app/assets/stylesheets/supplier/foundation1/_qlists.sass @@ -16,7 +16,19 @@ td.boolean .boolean-false @extend .fa, .fa-lg, .fa-minus - +.change-list-table-button + +button($bg: $warning-color, $padding: $button-tny) + margin: 0 +.change-list-table-section-tables + list-style: none + +clearfix + li + float: left + margin-right: 10px + margin-bottom: 10px + a + +button($padding: $button-sml) + margin: 0 td.colorbox +table-fit .list-orders-container diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb index 01e54f5f..d78d9376 100644 --- a/app/controllers/dashboard_controller.rb +++ b/app/controllers/dashboard_controller.rb @@ -35,6 +35,10 @@ class DashboardController < ApplicationController end end + def empty_page + render text: '' + end + # GET /select_qr_image # GET /select_qr_image.png diff --git a/app/controllers/suppliers/lists_controller.rb b/app/controllers/suppliers/lists_controller.rb index c8aeb33f..ad90573c 100644 --- a/app/controllers/suppliers/lists_controller.rb +++ b/app/controllers/suppliers/lists_controller.rb @@ -137,6 +137,23 @@ module Suppliers head :no_content end + # POST /list/:id/change_table?to_table=:table_id + def change_table + res = {} + status = 200 + @list = List.find_by_supplier_id_and_id!(current_supplier.id, params[:id]) + @table = Table.find(params[:table_id]) + res[:table_is_from_other_supplier] = true unless @table.supplier_id == @list.supplier_id + res[:table_occupied] = true if @table.occupied? + unless res[:table_is_from_other_supplier] or res[:table_occupied] + res[:ok] = true + @list.move_to_table! @table + else + res[:ok] = false + end + render json: res + end + private def list_params diff --git a/app/controllers/users/tables_controller.rb b/app/controllers/users/tables_controller.rb index fdf7d255..13566e99 100644 --- a/app/controllers/users/tables_controller.rb +++ b/app/controllers/users/tables_controller.rb @@ -75,7 +75,8 @@ module Users list = List.from_table( table, current_user ) res[:active_list_id] = list.id # used to set the active list in the app order = list.place_order product_orders: product_orders, user: current_user, first_order: true - res[:payload] = JSONAPI::Serializer.serialize(order, serializer: Users::OrderSerializer, include: %w[list list.users product_orders]) + res[:supplier_orders_placed_count] = list.supplier.orders_placed_count + res[:payload] = Users::OrderSerializer.serialize(order, include: %w[list list.users product_orders]) end render json: res end diff --git a/app/models/list.rb b/app/models/list.rb index 61aa5a51..665a85bd 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -163,7 +163,7 @@ class List for user in users user.active_list_id = nil user.save - #broadcast_user user.id, 'list_closed', broadcast_info + broadcast_user user.id, 'list_closed', broadcast_info end broadcast_supplier supplier_id, 'list_closed', broadcast_info end @@ -242,7 +242,7 @@ class List list_id: id, from_table_id: from_table_id, to_table_id: to_table.id, - payload: JSONAPI::Serializer.serialize(self, serializer: Suppliers::ListSerializer) + payload: Suppliers::ListSerializer.serialize(self) end end diff --git a/config/initializers/emblem.rb b/config/initializers/emblem.rb index 121997d5..462be9ca 100644 --- a/config/initializers/emblem.rb +++ b/config/initializers/emblem.rb @@ -2,7 +2,7 @@ if defined?(Ember::Emblem::Template) namespaces = %w[supplier waiter user] template_roots = namespaces.map{|namespace| namespace + '/app/templates'} Ember::Emblem::Template.configure do |config| - config.templates_root = ['app/templates'] + #config.templates_root = ['app/templates'] config.templates_root = template_roots # You can overwrite other config diff --git a/config/locales/supplier.en.yml b/config/locales/supplier.en.yml index 15e8741c..24de6ec4 100644 --- a/config/locales/supplier.en.yml +++ b/config/locales/supplier.en.yml @@ -194,6 +194,8 @@ en: modal: info: close: OK + change_list_table: + title: Change the ${models.table} of the ${models.list} supplier_status_info: title: "%{name} info" header: The icons at the top right corner contain information about the current orders diff --git a/config/locales/supplier.nl.yml b/config/locales/supplier.nl.yml index 04f3a5b6..3e3c45e8 100644 --- a/config/locales/supplier.nl.yml +++ b/config/locales/supplier.nl.yml @@ -197,6 +197,8 @@ nl: modal: info: close: OK + change_list_table: + title: Verander de ${models.table} van de ${models.list} supplier_status_info: title: "%{name} info" header: The icons at the top right corner contain information about the current orders diff --git a/config/routes.rb b/config/routes.rb index 0d662103..59843596 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -32,6 +32,7 @@ Qwaiter::Application.routes.draw do resources :product_categories root to: 'users#index' end + get 'empty-page' => 'dashboard#empty_page', as: :empty_page post '/user_app' => 'dashboard#user_app_log' #TODO: separate high speed app at log.mozo.bar @@ -169,6 +170,7 @@ Qwaiter::Application.routes.draw do post :mark_helped post :close post :remove_needs_payment + post :change_table end end resources :product_categories do diff --git a/spec/acceptance/users/active_list.feature b/spec/acceptance/users/active_list.feature index 10eddc36..36e5630a 100644 --- a/spec/acceptance/users/active_list.feature +++ b/spec/acceptance/users/active_list.feature @@ -18,7 +18,6 @@ Feature: Active list view And the user is on the active list page And the supplier orders placed counter for the user should be 1 When the order gets cancelled - And I wait 1 second Then the user should not see the order in the active list view And the supplier orders placed counter for the user should be 0 diff --git a/spec/acceptance/users/sign_up_with_facebook.feature b/spec/acceptance/users/sign_up.feature similarity index 100% rename from spec/acceptance/users/sign_up_with_facebook.feature rename to spec/acceptance/users/sign_up.feature diff --git a/spec/acceptance_steps/order_steps.rb b/spec/acceptance_steps/order_steps.rb index b314bf22..3f000030 100644 --- a/spec/acceptance_steps/order_steps.rb +++ b/spec/acceptance_steps/order_steps.rb @@ -49,5 +49,5 @@ step "the user orders list gets closed" do end step "the order gets cancelled" do - @order.cancel! + when_ember_is_ready { @order.cancel! } end diff --git a/spec/acceptance_steps/users/authentication_steps.rb b/spec/acceptance_steps/users/authentication_steps.rb index 83c1f920..5fcf3304 100644 --- a/spec/acceptance_steps/users/authentication_steps.rb +++ b/spec/acceptance_steps/users/authentication_steps.rb @@ -1,6 +1,6 @@ step "there is no user information stored in the local storage" do - user_visit '/' + visit empty_page_path page.execute_script %|Qstorage = window.localStorage| page.execute_script(%|Qstorage.removeItem('user_id')|) page.execute_script(%|Qstorage.removeItem('auth_token')|) @@ -27,7 +27,7 @@ step "there is a instagram user" do end step "the user is redirected to the sign in page" do - ember_route_should_be '/sign_in' + when_ember_is_ready { ember_route_should_be '/sign-in' } end step "I am signed in as a user" do diff --git a/spec/acceptance_steps/users/join_request_steps.rb b/spec/acceptance_steps/users/join_request_steps.rb index 78dbe8f0..f0a801d8 100644 --- a/spec/acceptance_steps/users/join_request_steps.rb +++ b/spec/acceptance_steps/users/join_request_steps.rb @@ -23,7 +23,7 @@ step "another user scans the QR code on the table" do end step "the original user should see the other user added below the active list" do - page.evaluate_script(%|$('.list-user-total-container').length()|).should eq 2 + page.evaluate_script(%|$('.list-user-total-container').length|).should eq 2 end step "the original user approves the other user's join request" do diff --git a/spec/acceptance_steps/users/order_products_steps.rb b/spec/acceptance_steps/users/order_products_steps.rb index a04a715e..7ab27374 100644 --- a/spec/acceptance_steps/users/order_products_steps.rb +++ b/spec/acceptance_steps/users/order_products_steps.rb @@ -67,7 +67,7 @@ step "the user order :product_name should be in the order list with price" do |p #ember_order = ember_store['product_orders'].find{|po| po['product_id'] == concerning_product.id} #ember_order = ember_find('product_order', concerning_product.id) sleep 0.1 - ember_order = ember_all('product_order').find{|po| po['product_id'] == concerning_product.id } + ember_order = ember_all('product_order').find{|po| po['product'] == concerning_product.id } quantity = ember_order['quantity'] order_price = quantity * concerning_product.price within '.product-orders .product-order' do diff --git a/spec/support/ember_helpers.rb b/spec/support/ember_helpers.rb index 23f41458..23989353 100644 --- a/spec/support/ember_helpers.rb +++ b/spec/support/ember_helpers.rb @@ -85,13 +85,13 @@ module SpecEmberHelpers def ember_find(typeKey, id) h = page.evaluate_script <<-SCRIPT - (MozoUser || App).__container__.lookup('store:main').all('#{typeKey}').findBy('id', '#{id}').serialize() + (MozoUser || App).__container__.lookup('service:store').peekRecord('#{typeKey}', '#{id}').toJSON() SCRIPT end def ember_all(typeKey) h = page.evaluate_script <<-SCRIPT - (MozoUser || App).__container__.lookup('store:main').all('#{typeKey}').invoke('serialize') + (MozoUser || App).__container__.lookup('service:store').peekAll('#{typeKey}').map(function(r){ result = r.toJSON(); result['id'] = r.id; return result }) SCRIPT end