From 5650ada04ca01be3829d82c2769687a1857054ad Mon Sep 17 00:00:00 2001 From: Benjamin ter Kuile Date: Tue, 24 Sep 2013 08:47:30 +0200 Subject: [PATCH] Ember temp commit --- Gemfile | 11 +++-- Gemfile.lock | 12 +++++ app/assets/javascripts/qwaiter.js.coffee | 4 -- .../javascripts/supplier/app/app.js.coffee | 3 ++ .../supplier/app/application.js.coffee | 6 +++ .../controllers/index_controller.js.coffee | 17 +++++++ .../controllers/section_controller.js.coffee | 13 +++++ .../controllers/sections_controller.js.coffee | 1 + .../app/helpers/currency_helper.js.coffee | 2 + .../app/helpers/drag_n_drop.js.coffee | 43 ++++++++++++++++ .../app/helpers/route_helper.js.coffee | 8 +++ .../app/helpers/translation.js.coffee | 4 ++ .../supplier/app/models/list.js.coffee | 11 +++++ .../supplier/app/models/order.js.coffee | 9 ++++ .../supplier/app/models/product.js.coffee | 3 ++ .../supplier/app/models/section.js.coffee | 6 +++ .../supplier/app/models/table.js.coffee | 10 ++++ .../modifications/attribute_types.js.coffee | 5 ++ .../modifications/model_extensions.js.coffee | 11 +++++ .../javascripts/supplier/app/router.js.coffee | 9 ++++ .../supplier/app/routes/index_route.js.coffee | 11 +++++ .../app/routes/section_route.js.coffee | 3 ++ .../app/routes/sections_route.js.coffee | 5 ++ .../javascripts/supplier/app/store.js.coffee | 7 +++ .../supplier/app/templates/active_list.emblem | 14 ++++++ .../app/templates/active_order.emblem | 8 +++ .../supplier/app/templates/application.hbs | 1 + .../supplier/app/templates/index.emblem | 28 +++++++++++ .../supplier/app/templates/section.emblem | 26 ++++++++++ .../supplier/app/templates/sections.hbs | 6 +++ .../supplier/app/templates/table.emblem | 5 ++ .../app/views/active_list_view.js.coffee | 3 ++ .../app/views/active_order_view.js.coffee | 6 +++ .../views/section_tab_header_view.js.coffee | 19 +++++++ .../app/views/section_table_view.js.coffee | 40 +++++++++++++++ .../supplier/app/views/section_view.js.coffee | 14 ++++++ .../javascripts/supplier/application.js | 9 ++-- .../javascripts/supplier/qsupplier.js.coffee | 31 +++++++----- .../javascripts/supplier/translations.js.erb | 1 + app/assets/javascripts/templates/.gitkeep | 0 app/assets/javascripts/views/.gitkeep | 0 .../supplier/active_lists.css.sass | 2 +- .../supplier/section_tables.css.sass | 4 +- .../stylesheets/supplier/structure.css.sass | 4 ++ app/controllers/application_controller.rb | 2 +- app/controllers/suppliers/lists_controller.rb | 4 +- .../suppliers/orders_controller.rb | 18 +++++++ .../suppliers/products_controller.rb | 5 +- .../suppliers/sections_controller.rb | 5 +- .../suppliers/tables_controller.rb | 4 +- app/models/list.rb | 48 ++++++++++-------- app/models/order.rb | 12 ++++- app/models/section.rb | 9 +++- app/models/table.rb | 8 +++ app/serializers/list_serializer.rb | 4 ++ app/serializers/order_serializer.rb | 4 ++ app/serializers/section_serializer.rb | 5 ++ app/serializers/table_serializer.rb | 7 +++ app/views/layouts/tablet.html.slim | 3 ++ app/views/supplier/active_lists.html.slim | 2 +- app/views/supplier/active_orders.html.slim | 2 +- .../suppliers/sections/tables_view.html.slim | 49 ++++++++++++++++++- config/application.rb | 3 ++ config/environments/development.rb | 2 + config/environments/production.rb | 2 + config/locales/supplier.en.yml | 4 +- config/locales/supplier.nl.yml | 6 +-- config/routes.rb | 1 + lib/qwaiter.rb | 2 + lib/qwaiter/serializer.rb | 5 ++ spec/models/order_spec.rb | 10 ++++ 71 files changed, 595 insertions(+), 66 deletions(-) create mode 100644 app/assets/javascripts/supplier/app/app.js.coffee create mode 100644 app/assets/javascripts/supplier/app/application.js.coffee create mode 100644 app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee create mode 100644 app/assets/javascripts/supplier/app/controllers/section_controller.js.coffee create mode 100644 app/assets/javascripts/supplier/app/controllers/sections_controller.js.coffee create mode 100644 app/assets/javascripts/supplier/app/helpers/currency_helper.js.coffee create mode 100644 app/assets/javascripts/supplier/app/helpers/drag_n_drop.js.coffee create mode 100644 app/assets/javascripts/supplier/app/helpers/route_helper.js.coffee create mode 100644 app/assets/javascripts/supplier/app/helpers/translation.js.coffee create mode 100644 app/assets/javascripts/supplier/app/models/list.js.coffee create mode 100644 app/assets/javascripts/supplier/app/models/order.js.coffee create mode 100644 app/assets/javascripts/supplier/app/models/product.js.coffee create mode 100644 app/assets/javascripts/supplier/app/models/section.js.coffee create mode 100644 app/assets/javascripts/supplier/app/models/table.js.coffee create mode 100644 app/assets/javascripts/supplier/app/modifications/attribute_types.js.coffee create mode 100644 app/assets/javascripts/supplier/app/modifications/model_extensions.js.coffee create mode 100644 app/assets/javascripts/supplier/app/router.js.coffee create mode 100644 app/assets/javascripts/supplier/app/routes/index_route.js.coffee create mode 100644 app/assets/javascripts/supplier/app/routes/section_route.js.coffee create mode 100644 app/assets/javascripts/supplier/app/routes/sections_route.js.coffee create mode 100644 app/assets/javascripts/supplier/app/store.js.coffee create mode 100644 app/assets/javascripts/supplier/app/templates/active_list.emblem create mode 100644 app/assets/javascripts/supplier/app/templates/active_order.emblem create mode 100644 app/assets/javascripts/supplier/app/templates/application.hbs create mode 100644 app/assets/javascripts/supplier/app/templates/index.emblem create mode 100644 app/assets/javascripts/supplier/app/templates/section.emblem create mode 100644 app/assets/javascripts/supplier/app/templates/sections.hbs create mode 100644 app/assets/javascripts/supplier/app/templates/table.emblem create mode 100644 app/assets/javascripts/supplier/app/views/active_list_view.js.coffee create mode 100644 app/assets/javascripts/supplier/app/views/active_order_view.js.coffee create mode 100644 app/assets/javascripts/supplier/app/views/section_tab_header_view.js.coffee create mode 100644 app/assets/javascripts/supplier/app/views/section_table_view.js.coffee create mode 100644 app/assets/javascripts/supplier/app/views/section_view.js.coffee create mode 100644 app/assets/javascripts/templates/.gitkeep create mode 100644 app/assets/javascripts/views/.gitkeep create mode 100644 app/controllers/suppliers/orders_controller.rb create mode 100644 app/serializers/list_serializer.rb create mode 100644 app/serializers/order_serializer.rb create mode 100644 app/serializers/section_serializer.rb create mode 100644 app/serializers/table_serializer.rb create mode 100644 lib/qwaiter/serializer.rb diff --git a/Gemfile b/Gemfile index 9f7b59d6..21edcfad 100644 --- a/Gemfile +++ b/Gemfile @@ -9,6 +9,11 @@ gem 'rack-cors', :require => 'rack/cors' # gem 'sqlite3' +gem 'jquery-rails' +gem 'jquery-ui-rails' +gem 'ember-rails' +gem 'ember-source' +gem 'slim-rails' # Gems used only for assets and not required # in production environments by default. group :assets do @@ -18,18 +23,16 @@ group :assets do gem 'bootstrap-sass' gem 'bourbon' gem 'compass-rails' + gem 'js-routes' # See https://github.com/sstephenson/execjs#readme for more supported runtimes #gem 'therubyracer', :platforms => :ruby gem 'uglifier', '>= 1.0.3' + gem 'emblem-rails' #gem 'mustache' #, :require => 'mustache/railtie' end -gem 'jquery-rails' -gem 'jquery-ui-rails' -gem 'ember-rails' -gem 'slim-rails' #gem 'less-rails' gem 'couch_potato' , github: 'bterkuile/couch_potato' diff --git a/Gemfile.lock b/Gemfile.lock index 7d26a05b..d932e9ce 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -87,6 +87,9 @@ GEM ember-source execjs handlebars-source + barber-emblem (0.1.1) + barber (>= 0.4.1) + emblem-source bcrypt-ruby (3.1.2) bootstrap-sass (2.3.2.2) sass (~> 3.2) @@ -169,6 +172,10 @@ GEM railties (>= 3.1) ember-source (1.0.0) handlebars-source (= 1.0.12) + emblem-rails (0.1.1) + barber-emblem (~> 0.1.1) + ember-rails (>= 0.11.1) + emblem-source (0.3.2) erubis (2.7.0) eventmachine (1.0.3) execjs (2.0.1) @@ -219,6 +226,8 @@ GEM jquery-ui-rails (4.0.4) jquery-rails railties (>= 3.1.0) + js-routes (0.9.0) + rails (>= 3.2) json (1.8.0) kaminari (0.14.1) actionpack (>= 3.0.0) @@ -385,11 +394,14 @@ DEPENDENCIES devise (= 3.1.0) devise_simply_stored! ember-rails + ember-source + emblem-rails factory_girl_rails faye guard-rspec jquery-rails jquery-ui-rails + js-routes kaminari letter_opener mini_magick diff --git a/app/assets/javascripts/qwaiter.js.coffee b/app/assets/javascripts/qwaiter.js.coffee index 1fe8cde7..693a76fa 100644 --- a/app/assets/javascripts/qwaiter.js.coffee +++ b/app/assets/javascripts/qwaiter.js.coffee @@ -42,7 +42,3 @@ window.Qwaiter= currency(Mustache.render(val, this)) ) Mustache.to_html($(selector).html(), locs) - -jQuery.ajaxSetup - 'beforeSend': (xhr) -> - xhr.setRequestHeader("Accept", "text/javascript") diff --git a/app/assets/javascripts/supplier/app/app.js.coffee b/app/assets/javascripts/supplier/app/app.js.coffee new file mode 100644 index 00000000..64f15ca1 --- /dev/null +++ b/app/assets/javascripts/supplier/app/app.js.coffee @@ -0,0 +1,3 @@ +Qsupplier.App = Ember.Application.create + LOG_TRANSITIONS: true + rootElement: '#app' diff --git a/app/assets/javascripts/supplier/app/application.js.coffee b/app/assets/javascripts/supplier/app/application.js.coffee new file mode 100644 index 00000000..810aaa4d --- /dev/null +++ b/app/assets/javascripts/supplier/app/application.js.coffee @@ -0,0 +1,6 @@ +#= require handlebars +#= require ember +#= require ember-data +#= require_directory ./modifications +#= require ./app +#= require_tree . diff --git a/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee new file mode 100644 index 00000000..bf820269 --- /dev/null +++ b/app/assets/javascripts/supplier/app/controllers/index_controller.js.coffee @@ -0,0 +1,17 @@ +Qsupplier.App.IndexController = Ember.ObjectController.extend + active_lists: (-> + @get('lists').filterProperty('state', 'active') + ).property('lists.@each.state') + + active_orders: (-> + @get('orders').filter (o)->(o.get('state') == 'active') + ).property('orders.@each.state') + + markListAsHelped: (id)-> + list = Qsupplier.App.List.find(id) + list.set('needs_help', false) + $.post '/supplier/mark_list_as_helped', {list_id: id} + closeList: (id)-> + list = Qsupplier.App.List.find(id) + list.set('state', 'closed') + $.post '/supplier/close_list', {list_id: id} diff --git a/app/assets/javascripts/supplier/app/controllers/section_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/section_controller.js.coffee new file mode 100644 index 00000000..236c78ae --- /dev/null +++ b/app/assets/javascripts/supplier/app/controllers/section_controller.js.coffee @@ -0,0 +1,13 @@ +Qsupplier.App.SectionController = Ember.ObjectController.extend + #width: -> $('.section-tables-active').width() + #height: -> $('.section-tables-active').height() + dummy: -> 3 + editmode: false + makeEditable: -> @set('editmode', true) + finishEditable: -> + @set('editmode', false) + @get('model').save() + addTables: -> + $('#add-tables-modal').modal() + arrangeTables: -> + $('#arrange-tables-modal').modal() diff --git a/app/assets/javascripts/supplier/app/controllers/sections_controller.js.coffee b/app/assets/javascripts/supplier/app/controllers/sections_controller.js.coffee new file mode 100644 index 00000000..b027479e --- /dev/null +++ b/app/assets/javascripts/supplier/app/controllers/sections_controller.js.coffee @@ -0,0 +1 @@ +Qsupplier.App.SectionsController = Ember.ArrayController.extend {} diff --git a/app/assets/javascripts/supplier/app/helpers/currency_helper.js.coffee b/app/assets/javascripts/supplier/app/helpers/currency_helper.js.coffee new file mode 100644 index 00000000..2928b20e --- /dev/null +++ b/app/assets/javascripts/supplier/app/helpers/currency_helper.js.coffee @@ -0,0 +1,2 @@ +Ember.Handlebars.registerBoundHelper 'currency', (amount, params..., options)-> + new Handlebars.SafeString Qwaiter.currency(amount) diff --git a/app/assets/javascripts/supplier/app/helpers/drag_n_drop.js.coffee b/app/assets/javascripts/supplier/app/helpers/drag_n_drop.js.coffee new file mode 100644 index 00000000..d6c75ea5 --- /dev/null +++ b/app/assets/javascripts/supplier/app/helpers/drag_n_drop.js.coffee @@ -0,0 +1,43 @@ +# on why local storage is used in the enter events +# http://stackoverflow.com/questions/8762635/getting-the-filename-during-the-dragenter-event +DragNDrop = Ember.Namespace.create() +DragNDrop.cancel = (e)-> + e.preventDefault() + false + +DragNDrop.Draggable = Ember.Mixin.create + attributeBindings: 'draggable' + draggable: 'true' + dragStart: (e)-> + @set 'content.isDragging', true + localStorage.setItem('draggingView', @get('elementId')) + dataTransfer = e.originalEvent.dataTransfer + dataTransfer.setData 'Text', @get('elementId') + dragEnd: (e)-> + @set 'content.isDragging', false + localStorage.removeItem 'draggingView' if localStorage.getItem 'draggingView' + +DragNDrop.Droppable = Ember.Mixin.create + dragEnter: (e)-> + if @dragEntered + e.preventDefault() + viewId = localStorage.getItem 'draggingView' + view = Ember.View.views[viewId] + @dragEntered view + else + DragNDrop.cancel(e) + dragOver: DragNDrop.cancel + drop: (e)-> + e.preventDefault() + viewId = e.originalEvent.dataTransfer.getData('Text') + view = Ember.View.views[viewId] + return unless view + # Calculate drop position relative to container + position = + left: Math.max(e.originalEvent.pageX - view.$el.offsetParent().offset().left - (view.$el.outerWidth()/2), 0) + top: Math.max(e.originalEvent.pageY - view.$el.offsetParent().offset().top - (view.$el.outerHeight()/2), 0) + + @dropped view, position if @dropped + false + +@DragNDrop = DragNDrop diff --git a/app/assets/javascripts/supplier/app/helpers/route_helper.js.coffee b/app/assets/javascripts/supplier/app/helpers/route_helper.js.coffee new file mode 100644 index 00000000..73fc8c18 --- /dev/null +++ b/app/assets/javascripts/supplier/app/helpers/route_helper.js.coffee @@ -0,0 +1,8 @@ +Ember.Handlebars.registerHelper 'route', (route_name, params..., options)-> + opts = options.hash + if scope = @get('content') + params = params.map (a) -> scope.get(a) + for k,v of opts + opts[k] = scope.get(v) if typeof(v) == 'string' && scope.get(v) + route = if params.length then Routes[route_name].call(this, params, opts) else Routes[route_name].call(this, opts) + new Handlebars.SafeString route diff --git a/app/assets/javascripts/supplier/app/helpers/translation.js.coffee b/app/assets/javascripts/supplier/app/helpers/translation.js.coffee new file mode 100644 index 00000000..b8f4bd46 --- /dev/null +++ b/app/assets/javascripts/supplier/app/helpers/translation.js.coffee @@ -0,0 +1,4 @@ +Ember.Handlebars.registerHelper 't', (path, params..., options)-> + text = t(path) + tag = if options.hash.bare then text else "#{text}" + new Handlebars.SafeString tag diff --git a/app/assets/javascripts/supplier/app/models/list.js.coffee b/app/assets/javascripts/supplier/app/models/list.js.coffee new file mode 100644 index 00000000..7a0ed6e1 --- /dev/null +++ b/app/assets/javascripts/supplier/app/models/list.js.coffee @@ -0,0 +1,11 @@ +attr = DS.attr +Qsupplier.App.List = DS.Model.extend + state: attr 'string' + needs_help: attr 'boolean' + needs_payment: attr 'boolean' + is_paid: attr 'boolean' + has_active_orders: attr 'boolean' + price: attr 'number' + table_number: attr 'number' + table: DS.belongsTo('Qsupplier.App.Table', inverse: 'active_list') + orders: DS.hasMany('Qsupplier.App.Order') diff --git a/app/assets/javascripts/supplier/app/models/order.js.coffee b/app/assets/javascripts/supplier/app/models/order.js.coffee new file mode 100644 index 00000000..291ed553 --- /dev/null +++ b/app/assets/javascripts/supplier/app/models/order.js.coffee @@ -0,0 +1,9 @@ +attr = DS.attr +Qsupplier.App.Order = DS.Model.extend + state: attr('string') + list: DS.belongsTo('Qsupplier.App.List') + total_amount: attr('number') + #products: attr('object') + products: DS.hasMany('Qsupplier.App.Product') + active: (-> @get('state') == 'active').property('state') + delivered: (-> @get('state') == 'delivered').property('state') diff --git a/app/assets/javascripts/supplier/app/models/product.js.coffee b/app/assets/javascripts/supplier/app/models/product.js.coffee new file mode 100644 index 00000000..65ee743e --- /dev/null +++ b/app/assets/javascripts/supplier/app/models/product.js.coffee @@ -0,0 +1,3 @@ +attr = DS.attr +Qsupplier.App.Product = DS.Model.extend + order: DS.belongsTo('Qsupplier.App.Order') diff --git a/app/assets/javascripts/supplier/app/models/section.js.coffee b/app/assets/javascripts/supplier/app/models/section.js.coffee new file mode 100644 index 00000000..c05eb488 --- /dev/null +++ b/app/assets/javascripts/supplier/app/models/section.js.coffee @@ -0,0 +1,6 @@ +attr = DS.attr +Qsupplier.App.Section = DS.Model.extend + title: attr 'string' + width: attr 'number' + height: attr 'number' + tables: DS.hasMany('Qsupplier.App.Table') diff --git a/app/assets/javascripts/supplier/app/models/table.js.coffee b/app/assets/javascripts/supplier/app/models/table.js.coffee new file mode 100644 index 00000000..d8b778b4 --- /dev/null +++ b/app/assets/javascripts/supplier/app/models/table.js.coffee @@ -0,0 +1,10 @@ +attr = DS.attr +Qsupplier.App.Table = DS.Model.extend + number: attr 'number' + width: attr 'number' + height: attr 'number' + position_x: attr 'number' + position_y: attr 'number' + occupied: attr 'boolean' + section: DS.belongsTo('Qsupplier.App.Section') + active_list: DS.belongsTo('Qsupplier.App.List') diff --git a/app/assets/javascripts/supplier/app/modifications/attribute_types.js.coffee b/app/assets/javascripts/supplier/app/modifications/attribute_types.js.coffee new file mode 100644 index 00000000..b4a29970 --- /dev/null +++ b/app/assets/javascripts/supplier/app/modifications/attribute_types.js.coffee @@ -0,0 +1,5 @@ +DS.JSONTransforms['object'] = + deserialize: (serialized)-> + serialized + serialize: (deserialized)-> + deserialized diff --git a/app/assets/javascripts/supplier/app/modifications/model_extensions.js.coffee b/app/assets/javascripts/supplier/app/modifications/model_extensions.js.coffee new file mode 100644 index 00000000..d4b39678 --- /dev/null +++ b/app/assets/javascripts/supplier/app/modifications/model_extensions.js.coffee @@ -0,0 +1,11 @@ +DS.Model.reopen + created_at: DS.attr('string') + updated_at: DS.attr('string') +DS.Model.reopenClass + findCached: (id)-> + @all().findProperty('id', id) + updateOrCreate: (attributes)-> + if cached = @findCached(attributes.id) + cached.setProperties attributes + else + @createRecord(attributes) diff --git a/app/assets/javascripts/supplier/app/router.js.coffee b/app/assets/javascripts/supplier/app/router.js.coffee new file mode 100644 index 00000000..7263149a --- /dev/null +++ b/app/assets/javascripts/supplier/app/router.js.coffee @@ -0,0 +1,9 @@ +# For more information see: http://emberjs.com/guides/routing/ +Qsupplier.App.Router.reopen + location: 'history' + rootURL: '/supplier' + +Qsupplier.App.Router.map -> + @resource 'sections', -> + @resource 'section', path: ':section_id' + diff --git a/app/assets/javascripts/supplier/app/routes/index_route.js.coffee b/app/assets/javascripts/supplier/app/routes/index_route.js.coffee new file mode 100644 index 00000000..67dd4fdf --- /dev/null +++ b/app/assets/javascripts/supplier/app/routes/index_route.js.coffee @@ -0,0 +1,11 @@ +Qsupplier.App.IndexRoute = Ember.Route.extend + model: -> + Ember.Object.create + lists: Qsupplier.App.List.find({state: 'active'}) + orders: Qsupplier.App.Order.find() + #setupController: (controller, model)-> + #controller.set('model', model) + #controller.set 'lists', Qsupplier.App.List.all() #.filterProperty('state', 'active') + #controller.set 'orders', Qsupplier.App.Order.all() + #controller.set 'lists', model.get('lists') + #controller.set 'orders', model.get('orders') diff --git a/app/assets/javascripts/supplier/app/routes/section_route.js.coffee b/app/assets/javascripts/supplier/app/routes/section_route.js.coffee new file mode 100644 index 00000000..3a9b3da1 --- /dev/null +++ b/app/assets/javascripts/supplier/app/routes/section_route.js.coffee @@ -0,0 +1,3 @@ +Qsupplier.App.SectionRoute = Ember.Route.extend + renderTemplate: -> + @render 'section' diff --git a/app/assets/javascripts/supplier/app/routes/sections_route.js.coffee b/app/assets/javascripts/supplier/app/routes/sections_route.js.coffee new file mode 100644 index 00000000..7f5baa04 --- /dev/null +++ b/app/assets/javascripts/supplier/app/routes/sections_route.js.coffee @@ -0,0 +1,5 @@ +Qsupplier.App.SectionsRoute = Ember.Route.extend + model: -> Qsupplier.App.Section.find() + + setupController: (controller, collection) -> + controller.set 'content', collection diff --git a/app/assets/javascripts/supplier/app/store.js.coffee b/app/assets/javascripts/supplier/app/store.js.coffee new file mode 100644 index 00000000..a295d7bc --- /dev/null +++ b/app/assets/javascripts/supplier/app/store.js.coffee @@ -0,0 +1,7 @@ +# http://emberjs.com/guides/models/defining-a-store/ + +Qsupplier.App.Store = DS.Store.extend + revision: 11 + adapter: DS.RESTAdapter.create + namespace: 'supplier' + diff --git a/app/assets/javascripts/supplier/app/templates/active_list.emblem b/app/assets/javascripts/supplier/app/templates/active_list.emblem new file mode 100644 index 00000000..bc6c09b3 --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/active_list.emblem @@ -0,0 +1,14 @@ +td.list-status + if view.content.needs_help + span.list-needs-help-indicator ? + if view.content.needs_payment + span.list-needs-payment-indicator € +td.numeric.table_number {{view.content.table_number}} +td.section_title {{view.content.section_title}} +td.currency.total_list_amount {{currency total_amount}} +td.actions + if view.content.needs_help + button.btn.btn-info{ action markListAsHelped view.content.id} {{t 'list.is_helped_button'}} + button.btn.btn-warning{ action closeList view.content.id} {{t 'list.close_list' }} + a.btn href="/supplier/lists/{{unbound view.content.id}}" + span.icon-list   diff --git a/app/assets/javascripts/supplier/app/templates/active_order.emblem b/app/assets/javascripts/supplier/app/templates/active_order.emblem new file mode 100644 index 00000000..07a0e759 --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/active_order.emblem @@ -0,0 +1,8 @@ +td {{view.content.display}} +td.numeric.table_number {{view.content.table_number}} +td.section_title {{view.content.section_title}} +td.currency {{currency total_amount}} +td.actions + /**/ + /**/ + ' Actions diff --git a/app/assets/javascripts/supplier/app/templates/application.hbs b/app/assets/javascripts/supplier/app/templates/application.hbs new file mode 100644 index 00000000..c24cd689 --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/application.hbs @@ -0,0 +1 @@ +{{outlet}} diff --git a/app/assets/javascripts/supplier/app/templates/index.emblem b/app/assets/javascripts/supplier/app/templates/index.emblem new file mode 100644 index 00000000..b9ace7a9 --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/index.emblem @@ -0,0 +1,28 @@ +.page-header + h3 {{t 'active_lists.title'}} +.well + table.active-lists-table.table + thead + tr + th.status-icons + th.numeric {{t 'table_number'}} + th {{t 'models.section'}} + th.currency {{t 'active_lists.price'}} + th.actions + tbody + each list in controller.active_lists + ' {{view 'Qsupplier.App.ActiveListView' contentBinding=list}} +.page-header + h3 {{t 'active_orders.title' }} +.well + table.active-orders-table.table + thead + tr + th {{t 'models.order'}} + th.numeric {{t 'table_number'}} + th {{t 'models.section'}} + th.currency {{t 'active_orders.price'}} + th.actions + tbody + each order in controller.active_orders + ' {{view 'Qsupplier.App.ActiveOrderView' contentBinding=order}} diff --git a/app/assets/javascripts/supplier/app/templates/section.emblem b/app/assets/javascripts/supplier/app/templates/section.emblem new file mode 100644 index 00000000..b35e01dd --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/section.emblem @@ -0,0 +1,26 @@ +.section-manage-tables.pull-right + if editmode + .btn-group + a.btn.dropdown-toggle data-toggle="dropdown" href="#" + span Action + span.caret + ul.dropdown-menu + li + a{action addTables} {{t 'section.add_tables.button_label'}} + li + a{action arrangeTables} {{t 'section.arrange_tables.modal.title'}} + li + a href="{{route 'qr_codes_suppliers_tables_path' section_id=id}}" {{t 'tables.qr_codes.link'}} + li + a href="{{route 'suppliers_section_path' id}}" data-method="delete" data-confirm="{{t 'helpers.links.are_you_sure' bare=true}}" {{t 'helpers.links.destroy'}} + view Ember.TextField valueBinding="title" + view Ember.TextField valueBinding="width" classNames="dimension" + span x + view Ember.TextField valueBinding="height" classNames="dimension" + a.btn.btn-mini{ action finishEditable} + span.icon-ok + else + a.btn.btn-mini{ action makeEditable } + span.icon-pencil +each table in tables + view 'Qsupplier.App.SectionTableView' contentBinding="table" diff --git a/app/assets/javascripts/supplier/app/templates/sections.hbs b/app/assets/javascripts/supplier/app/templates/sections.hbs new file mode 100644 index 00000000..4e513b1c --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/sections.hbs @@ -0,0 +1,6 @@ + +{{outlet}} diff --git a/app/assets/javascripts/supplier/app/templates/table.emblem b/app/assets/javascripts/supplier/app/templates/table.emblem new file mode 100644 index 00000000..4cc0f315 --- /dev/null +++ b/app/assets/javascripts/supplier/app/templates/table.emblem @@ -0,0 +1,5 @@ +.table-number {{table.number}} +.status-icons + span.needs_payment.icon-flag + span.needs_help.icon-bell + span.active_order.icon-glass diff --git a/app/assets/javascripts/supplier/app/views/active_list_view.js.coffee b/app/assets/javascripts/supplier/app/views/active_list_view.js.coffee new file mode 100644 index 00000000..6e5e900e --- /dev/null +++ b/app/assets/javascripts/supplier/app/views/active_list_view.js.coffee @@ -0,0 +1,3 @@ +Qsupplier.App.ActiveListView = Ember.View.extend + tagName: 'tr' + templateName: 'active_list' diff --git a/app/assets/javascripts/supplier/app/views/active_order_view.js.coffee b/app/assets/javascripts/supplier/app/views/active_order_view.js.coffee new file mode 100644 index 00000000..a8ab8bd8 --- /dev/null +++ b/app/assets/javascripts/supplier/app/views/active_order_view.js.coffee @@ -0,0 +1,6 @@ +Qsupplier.App.ActiveOrderView = Ember.View.extend + tagName: 'tr' + templateName: 'active_order' + classNameBindings: ['content.active:active', 'content.delivered:delivered'] + didInsertElement: -> + debugger diff --git a/app/assets/javascripts/supplier/app/views/section_tab_header_view.js.coffee b/app/assets/javascripts/supplier/app/views/section_tab_header_view.js.coffee new file mode 100644 index 00000000..74b82224 --- /dev/null +++ b/app/assets/javascripts/supplier/app/views/section_tab_header_view.js.coffee @@ -0,0 +1,19 @@ +Qsupplier.App.SectionTabHeaderView = Ember.View.extend DragNDrop.Droppable, + template: Ember.Handlebars.compile('{{view.content.title}}') + tagName: 'a' + attributeBindings: ['href'] + href: (-> Routes.suppliers_section_path(@content.id)).property() + dragEntered: (view)-> + return false + # Changing the route for now is too difficult. Just do a move + #if view.constructor.toString().match(/SectionTableView$/) + #@get('controller').transitionToRoute 'section', @get('content') + dropped: (view)-> + if view.constructor.toString().match(/SectionTableView$/) + table = view.get('content') + table.set 'section', @content + console.log "dirty? #{table.get('isDirty')}" + #table.get('transaction').commit() + table.save() + didInsertElement: -> + @$el = $ @get('element') diff --git a/app/assets/javascripts/supplier/app/views/section_table_view.js.coffee b/app/assets/javascripts/supplier/app/views/section_table_view.js.coffee new file mode 100644 index 00000000..9dce75c3 --- /dev/null +++ b/app/assets/javascripts/supplier/app/views/section_table_view.js.coffee @@ -0,0 +1,40 @@ +Qsupplier.App.SectionTableView = Ember.View.extend DragNDrop.Draggable, + templateName: 'table' + classNames: ['section-table'] + classNameBindings: [ + 'content.active_list:occupied', + 'controller.editmode:draggable', + 'content.active_list.needs_help:needs_help', + 'content.active_list.needs_payment:needs_payment', + 'content.active_list.has_active_orders:active_order' + ] + offsetX: -> + (@content.get('position_x') || 0) * @containerWidth() / (@content.get('section').get('width') || 1) + offsetY: (-> + (@content.get('position_y') || 0) * @containerHeight() / (@content.get('section').get('height') || 1) + ) + activeList: (-> + !!@get('content.active_list_id') + ).property('content.active_list_id') + attributeBindings: ['style'] + style: (-> + "position:absolute;width:83px;height:48px" + ).property() + draggable: (-> if @get('controller.editmode') then 'true' else 'false' ).property('controller.editmode') + placeInSection: -> + @$el.css 'left', @offsetX() + @$el.css 'top', @offsetY() + didInsertElement: -> + @$el = $ @get('element') + @placeInSection() + positionChange: (position)-> + @$el.css 'left', position.left + @$el.css 'top', position.top + @content.setProperties + position_x: position.left*@content.get('section').get('width') / @containerWidth() + position_y: position.top *@content.get('section').get('height') / @containerHeight() + @content.get('transaction').commit() + containerWidth: -> + $(@get('parentView.element')).width() + containerHeight: -> + $(@get('parentView.element')).height() diff --git a/app/assets/javascripts/supplier/app/views/section_view.js.coffee b/app/assets/javascripts/supplier/app/views/section_view.js.coffee new file mode 100644 index 00000000..af238a37 --- /dev/null +++ b/app/assets/javascripts/supplier/app/views/section_view.js.coffee @@ -0,0 +1,14 @@ +Qsupplier.App.SectionView = Ember.View.extend DragNDrop.Droppable, + classNames: ['well', 'section-tables-container', 'section-tables-active'] + didInsertElement: -> + @$el = $(@get('element')) + height = @$el.width() * @get('controller.model.height') / @get('controller.model.width') + @$el.css('height', height) + dropped: (view, position)-> + view.positionChange(position, @content) + observeSectionDimensions: (-> + return unless @get('element') + @$el = $(@get('element')) + height = @$el.width() * @get('controller.model.height') / @get('controller.model.width') + @$el.css('height', height) + ).observes('controller.model.height', 'controller.model.width') diff --git a/app/assets/javascripts/supplier/application.js b/app/assets/javascripts/supplier/application.js index 2a7ae0d3..1965b901 100644 --- a/app/assets/javascripts/supplier/application.js +++ b/app/assets/javascripts/supplier/application.js @@ -17,10 +17,13 @@ // require bootstrap-popover // require bootstrap-typeahead //= require bootstrap -//= require handlebars -//= require faye -//= require supplier/base +//= require js-routes //= require qwaiter +//= require ./qsupplier +//= require handlebars +//= require ./app/application +//= require faye +//= require ./base //= require qtip //= require_directory . //= require_self diff --git a/app/assets/javascripts/supplier/qsupplier.js.coffee b/app/assets/javascripts/supplier/qsupplier.js.coffee index c0ea7b65..c3f154ba 100644 --- a/app/assets/javascripts/supplier/qsupplier.js.coffee +++ b/app/assets/javascripts/supplier/qsupplier.js.coffee @@ -4,29 +4,33 @@ root.Qsupplier= faye = new Faye.Client(event_host) faye.subscribe "/supplier/"+supplier_id, (e)=> if(e.event == 'new_order') + Qsupplier.App.Order.create(e.data.order) + # old stuff body = $('#active-orders-table tbody') - order = new Order(e.data) + order = new Order(e.data.order) if body.length body.append @mustache('#active-order-template', order) $('.section-table-list-'+order.list_id()).addClass('active_order') else if(e.event == 'list_needs_help') + if list = Qsupplier.App.List.findCached(e.data.id) + list.set('needs_help', true) + # old stuff $('#list-needs-help-indicator-'+e.data.id).removeClass('hide') $('#list-is-helped-button-'+e.data.id).removeClass('hide') $('.section-table-list-'+e.data.id).addClass('needs_help') else if(e.event == 'list_needs_payment') + if list = Qsupplier.App.List.findCached(e.data.id) + list.set('needs_payment', true) + # old stuff $('#list-needs-payment-indicator-'+e.data.id).removeClass('hide') $('.section-table-list-'+e.data.id).addClass('needs_payment') - else if(e.event == 'list_added') # DEPRICATED now handled by list_update - list = new List(e.data) - $('#active-lists-table tbody').append @mustache('#active-list-template', list) - # Add classes to section table view - table = $('#section-table-'+list.table_id()) - table.addClass('section-table-list-'+list.id()) - table.addClass('occupied') - table.addClass('needs_help') if list.needs_help() - table.addClass('needs_payment') if list.needs_payment() + else if(e.event == 'list_is_paid') + if list = Qsupplier.App.List.findCached(e.data.id) + list.set('needs_payment', false) else if e.event == 'list_update' - list = new List(e.data) + Qsupplier.App.List.updateOrCreate(e.data.list) + # old stuff + list = new List(e.data.list) row = $('#list-row-'+list.id()) content = @mustache('#active-list-template', list) if row.length then row.replaceWith(content) else $('#active-lists-table tbody').append(content) @@ -38,11 +42,16 @@ root.Qsupplier= table.addClass('needs_payment') if list.needs_payment() table.addClass('active_order') if list.has_active_orders() else if e.event == 'list_closed' + if list = Qsupplier.App.List.findCached(e.data.id) + list.set('table', null) + list.set('state', 'closed') $('#list-row-'+e.data.id).remove() $('.of-list-'+e.data.id).remove() table_list_class = 'section-table-list-'+e.data.id $('.'+table_list_class).removeClass('occupied needs_help needs_payment active_order').removeClass(table_list_class) else if e.event == 'list_helped' + if list = Qsupplier.App.List.findCached(e.data.id) + list.set('needs_help', false) list_id = e.data.id $('#list-needs-help-indicator-'+list_id).addClass('hide') $('#list-is-helped-button-'+list_id).addClass('hide') diff --git a/app/assets/javascripts/supplier/translations.js.erb b/app/assets/javascripts/supplier/translations.js.erb index 67a5407b..3e93b576 100644 --- a/app/assets/javascripts/supplier/translations.js.erb +++ b/app/assets/javascripts/supplier/translations.js.erb @@ -15,6 +15,7 @@ var $translations = { } } + $transformation_mappings = { downcase: 'toLowerCase', upcase: 'toUpperCase' diff --git a/app/assets/javascripts/templates/.gitkeep b/app/assets/javascripts/templates/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/app/assets/javascripts/views/.gitkeep b/app/assets/javascripts/views/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/app/assets/stylesheets/supplier/active_lists.css.sass b/app/assets/stylesheets/supplier/active_lists.css.sass index d9059663..132799a5 100644 --- a/app/assets/stylesheets/supplier/active_lists.css.sass +++ b/app/assets/stylesheets/supplier/active_lists.css.sass @@ -17,7 +17,7 @@ margin-right: 7px &.hide display: none -#active-orders-table +.active-orders-table tbody tr td diff --git a/app/assets/stylesheets/supplier/section_tables.css.sass b/app/assets/stylesheets/supplier/section_tables.css.sass index cf7ca25f..f640c246 100644 --- a/app/assets/stylesheets/supplier/section_tables.css.sass +++ b/app/assets/stylesheets/supplier/section_tables.css.sass @@ -1,4 +1,3 @@ -$table-width: 83px .section-title font-size: 24px padding: 4px 0px @@ -7,9 +6,10 @@ $table-width: 83px margin: -26px 6px 4px 6px .section-table background-color: #ccc + //TODO remove width and height for ember control height: 48px + width: 83px background-repeat: no-repeat - width: $table-width color: black a color: black diff --git a/app/assets/stylesheets/supplier/structure.css.sass b/app/assets/stylesheets/supplier/structure.css.sass index 4c5d44f4..bd2fa972 100644 --- a/app/assets/stylesheets/supplier/structure.css.sass +++ b/app/assets/stylesheets/supplier/structure.css.sass @@ -31,6 +31,10 @@ body margin: 0 .location_picker_search float: left +.draggable + cursor: move !important +input.dimension + width: 40px .location_picker_map width: 600px height: 500px diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 4d7ad695..0355ac8f 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,7 +1,7 @@ class ApplicationController < ActionController::Base before_filter :set_locale layout :layout_by_resource - protect_from_forgery + #protect_from_forgery rescue_from SimplyStored::RecordNotFound, with: :show_404 diff --git a/app/controllers/suppliers/lists_controller.rb b/app/controllers/suppliers/lists_controller.rb index 18eb1963..86eeb131 100644 --- a/app/controllers/suppliers/lists_controller.rb +++ b/app/controllers/suppliers/lists_controller.rb @@ -13,6 +13,8 @@ module Suppliers end if params[:show_all] == 'yes' @lists = List.for_supplier(current_supplier, page: params[:page], per_page: params[:per_page] || 25) + elsif params[:state] == 'active' + @lists = List.active_for_supplier(current_supplier.id) else @lists = List.for_supplier_created_at current_supplier, @start_time..@end_time end @@ -31,7 +33,7 @@ module Suppliers respond_to do |format| format.html {} format.json do - render json: @list.with_orders_as_json + render json: {list: @list.with_orders_as_json} end end end diff --git a/app/controllers/suppliers/orders_controller.rb b/app/controllers/suppliers/orders_controller.rb new file mode 100644 index 00000000..18c86b11 --- /dev/null +++ b/app/controllers/suppliers/orders_controller.rb @@ -0,0 +1,18 @@ +module Suppliers + class OrdersController < Suppliers::ApplicationController + # GET /tables + # GET /tables.json + def index + if params[:state] == 'active' + @orders = Order.active_for_supplier(current_supplier.id) + else + @orders = Order.for_supplier(current_supplier, page: params[:page], per_page: params['per_page'] || 10) + end + + respond_to do |format| + format.html # index.html.erb + format.json { render json: {orders: @orders.map(&:with_products_as_json)} } + end + end + end +end diff --git a/app/controllers/suppliers/products_controller.rb b/app/controllers/suppliers/products_controller.rb index 807c6541..73ef52da 100644 --- a/app/controllers/suppliers/products_controller.rb +++ b/app/controllers/suppliers/products_controller.rb @@ -86,10 +86,9 @@ module Suppliers end def preview_products - @date = Date.parse(params[:date]) rescue Date.today - product_categories = ProductCategory.for_supplier_in_time(current_supplier, @date.to_time) + @time = Time.parse(params[:date]) rescue Time.now + product_categories = ProductCategory.for_supplier_in_time(current_supplier, @time) render json: {categories: product_categories.map(&:to_client_format).select(&:present?)} - end end end diff --git a/app/controllers/suppliers/sections_controller.rb b/app/controllers/suppliers/sections_controller.rb index e04072c7..0abb169e 100644 --- a/app/controllers/suppliers/sections_controller.rb +++ b/app/controllers/suppliers/sections_controller.rb @@ -19,9 +19,10 @@ module Suppliers # GET /sections/1.json def show @section = Section.find_by_supplier_id_and_id!(current_supplier.id, params[:id]) + @tables = @section.tables_with_active_list_id respond_to do |format| - format.html # show.html.erb + format.html { render action: 'tables_view' }# show.html.erb format.json { render json: @section } end end @@ -103,7 +104,7 @@ module Suppliers # GET /sections/1/tables_view.json def tables_view @section = Section.find_by_supplier_id_and_id!(current_supplier.id, params[:id]) - @tables = Table.enrich_active_list_id(@section.tables) + @tables = @section.tables_with_active_list_id respond_to do |format| format.html # show.html.erb diff --git a/app/controllers/suppliers/tables_controller.rb b/app/controllers/suppliers/tables_controller.rb index b8c75869..7265e6b4 100644 --- a/app/controllers/suppliers/tables_controller.rb +++ b/app/controllers/suppliers/tables_controller.rb @@ -57,8 +57,8 @@ module Suppliers end end - # PUT /tables/1 - # PUT /tables/1.json + # PUT /supplier/tables/1 + # PUT /supplier/tables/1.json def update @table= Table.find_by_supplier_id_and_id!(current_supplier.id, params[:id]) diff --git a/app/models/list.rb b/app/models/list.rb index dc19c8a3..2f6bd201 100644 --- a/app/models/list.rb +++ b/app/models/list.rb @@ -1,15 +1,16 @@ class List include SimplyStored::Couch + include ActiveModel::SerializerSupport per_page_method :limit_value #kaminari - + property :state, default: 'active' # active, #closed property :needs_help, type: :boolean, default: false property :needs_payment, type: :boolean, default: false property :closed_at, type: Time property :join_requests, type: Array, default: [] property :price, type: Float - property :is_payed, type: :boolean, default: false - property :payed_at, type: Time + property :is_paid, type: :boolean, default: false + property :paid_at, type: Time has_many :orders, dependent: :destroy belongs_to :table @@ -121,11 +122,6 @@ class List database.view(for_supplier_view({startkey: [supplier.id, range.last], endkey: [supplier.id, range.first], include_docs: true, reduce: false, descending: true}.merge(options))) end - def mark_as_payed - self.is_payed = true - self.payed_at = Time.now - end - def close! orders.include_relation(:product_orders) set_price @@ -142,6 +138,16 @@ class List end end + def needs_help! + self.needs_help = true + if save + for user_id in user_ids + broadcast_user user_id, 'list_needs_help', id: id + end + broadcast_supplier(supplier_id, 'list_needs_help', id: id) + end + end + def is_helped! self.needs_help = false if save @@ -162,6 +168,18 @@ class List end end + def is_paid! + self.is_paid = true + self.paid_at ||= Time.now + if save + for user_id in user_ids + broadcast_user user_id, 'list_is_paid', id: id + end + broadcast_supplier supplier_id, 'list_is_paid', id: id + end + end + + def move_to_table! to_table UserTableMove.create list: self, from_table_id: table_id, to_table: to_table from_table = self.table_id.try(:dup) @@ -180,16 +198,6 @@ class List end end - def needs_help! - self.needs_help = true - if save - for user_id in user_ids - broadcast_user user_id, 'list_needs_help', id: id - end - broadcast_supplier(supplier_id, 'list_needs_help', id: id) - end - end - def approve_join_request_for_user!(user) if join_requests.include?(user.id) join_requests.delete(user.id) @@ -271,8 +279,8 @@ class List for user_id in user_ids broadcast_user user_id, 'new_order', order: order.with_products_as_json, total_amount: price end - broadcast_supplier supplier.id, 'new_order', order.with_products_as_json - broadcast_supplier supplier.id, 'list_update', with_info_as_json + broadcast_supplier supplier.id, 'list_update', list: with_info_as_json + broadcast_supplier supplier.id, 'new_order', order: order.with_products_as_json order end diff --git a/app/models/order.rb b/app/models/order.rb index 8f3e86cf..56a9b6fb 100644 --- a/app/models/order.rb +++ b/app/models/order.rb @@ -27,6 +27,14 @@ class Order view :by_supplier_id_and_id, key: [:supplier_id, :_id] # Do not comment me out + def self.for_supplier(supplier, options = {}) + total_entries = database.view(by_supplier_id_and_id({startkey: ["#{supplier.id}\u9999"], endkey: [supplier.id], include_docs: false, reduce: true, descending: true})) + options[:total_entries] = total_entries + with_pagination_options(options) do |options| + database.view(by_supplier_id_and_id({startkey: ["#{supplier.id}\u9999"], endkey: [supplier.id], include_docs: true, reduce: false, descending: true}.merge(options))) + end + end + # Return all currently active orders for a given supplier def self.active_for_supplier(supplier_id) database.view(active_for_supplier_view(startkey: [supplier_id], endkey: [supplier_id, {}], reduce: false, include_docs: true)) @@ -92,6 +100,7 @@ class Order def as_json(*args) h = super.with_indifferent_access + h[:id] = h[:_id] h[:table_number] = table_number h[:section_title] = list.table.section.try(:title) h @@ -105,7 +114,8 @@ class Order order_total = 0.0 for product_order in product_orders order_total += (product_order.amount * 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} + # Use product order id as id since the price can be different for products and the state should be preserved + ho[:products] << {name: product_order.product.name, id: product_order.id, number: product_order.amount, price: product_order.price} end ho[:total_amount] = order_total.round(2) @with_products_as_json = ho diff --git a/app/models/section.rb b/app/models/section.rb index f1dce6ee..0e907461 100644 --- a/app/models/section.rb +++ b/app/models/section.rb @@ -1,6 +1,7 @@ class Section include SimplyStored::Couch include Qwaiter::Distribution + include ActiveModel::SerializerSupport property :title property :path, type: Array, default: [[0.0, 0.0], [20.0, 30.0]] # default width 20m height 30m @@ -61,10 +62,14 @@ class Section end end - def as_json - super.merge(width: width, height: height) + def tables_with_active_list_id + Table.enrich_active_list_id(tables) end + #def as_json(*) + #super.merge(width: width, height: height) + #end + def for_tables_as_json return @for_tables_as_json if @for_tables_as_json.present? h = as_json diff --git a/app/models/table.rb b/app/models/table.rb index 610ede59..85698044 100644 --- a/app/models/table.rb +++ b/app/models/table.rb @@ -1,5 +1,6 @@ class Table include SimplyStored::Couch + include ActiveModel::SerializerSupport per_page_method :limit_value #kaminari property :number, type: Fixnum, default: 1 @@ -41,10 +42,15 @@ class Table end end + def serializable_hash + attributes + end + def occupied? return @is_occupied if instance_variable_defined?(:'@is_occupied') @is_occupied = !self.class.database.view(List.active_by_table_id_view(key: id, reduce: true)).zero? end + def occupied=(val) end def self.enrich_active_list_id(tables) if tables.is_a?(Array) @@ -77,9 +83,11 @@ class Table def width 2.0 end + def width=(val) end # Method returning the sections table height def height 2.0 end + def height=(val) end end diff --git a/app/serializers/list_serializer.rb b/app/serializers/list_serializer.rb new file mode 100644 index 00000000..44c3b6cc --- /dev/null +++ b/app/serializers/list_serializer.rb @@ -0,0 +1,4 @@ +class ListSerializer < Qwaiter::Serializer + embed :ids + attributes :state, :needs_help, :needs_payment, :is_paid, :price, :table_id, :table_number +end diff --git a/app/serializers/order_serializer.rb b/app/serializers/order_serializer.rb new file mode 100644 index 00000000..a244cc15 --- /dev/null +++ b/app/serializers/order_serializer.rb @@ -0,0 +1,4 @@ +class OrderSerializer < Qwaiter::Serializer + embed :ids + attributes :state, :list_id +end diff --git a/app/serializers/section_serializer.rb b/app/serializers/section_serializer.rb new file mode 100644 index 00000000..40344355 --- /dev/null +++ b/app/serializers/section_serializer.rb @@ -0,0 +1,5 @@ +class SectionSerializer < Qwaiter::Serializer + embed :ids, include: true + attributes *%i[title path width height] + has_many :tables +end diff --git a/app/serializers/table_serializer.rb b/app/serializers/table_serializer.rb new file mode 100644 index 00000000..72bf8750 --- /dev/null +++ b/app/serializers/table_serializer.rb @@ -0,0 +1,7 @@ +class TableSerializer < Qwaiter::Serializer + attributes(*%i[number width height position_x position_y section_id occupied active_list_id]) + + def occupied + object.active_list_id.present? + end +end diff --git a/app/views/layouts/tablet.html.slim b/app/views/layouts/tablet.html.slim index 55f6af1b..cb452e16 100644 --- a/app/views/layouts/tablet.html.slim +++ b/app/views/layouts/tablet.html.slim @@ -72,6 +72,9 @@ html lang="en" = content_for?(:content) ? yield(:content) : yield - if content_for?(:row) .row= yield :row + .row + .span12 + #app = javascript_include_tag "supplier/application" script#alert-template[type="text/html"]= mustache_template 'supplier/alert' = yield :footer diff --git a/app/views/supplier/active_lists.html.slim b/app/views/supplier/active_lists.html.slim index 2690a168..9440539d 100644 --- a/app/views/supplier/active_lists.html.slim +++ b/app/views/supplier/active_lists.html.slim @@ -1,5 +1,5 @@ .page-header - h3 = t('supplier.active_lists.title', lists: List.model_name.human_plural) + h3 = t('supplier.active_lists.title') .well table#active-lists-table.table thead diff --git a/app/views/supplier/active_orders.html.slim b/app/views/supplier/active_orders.html.slim index 61fc839e..278eefa5 100644 --- a/app/views/supplier/active_orders.html.slim +++ b/app/views/supplier/active_orders.html.slim @@ -1,7 +1,7 @@ .page-header h3 = t('supplier.active_orders.title', orders: Order.model_name.human_plural) .well - table#active-orders-table.table + table#active-orders-table.active-orders-table.table thead tr th= Order.model_name.human diff --git a/app/views/suppliers/sections/tables_view.html.slim b/app/views/suppliers/sections/tables_view.html.slim index ce81c07e..a749161d 100644 --- a/app/views/suppliers/sections/tables_view.html.slim +++ b/app/views/suppliers/sections/tables_view.html.slim @@ -17,8 +17,53 @@ - @tables.each do |table| .section-table-menu-content class="section-table-menu-#{table.id} section-table-list-#{table.active_list_id}" button.btn.btn-info.list-is-helped.hide Question answered! - - +#add-tables-modal.modal.hide.fade tabindex=-1 role=:dialog aria-labeledby='add-tables-modal-label' aria-hidden=true + .modal-header + button.close type=:button data-dismiss=:modal aria-hidden=true x + h3#add-tables-modal-label data-t='section.add_tables.modal.title' = t('supplier.section.add_tables.modal.title') + .modal-body + p data-t='section.add_tables.modal.body_header' = t('supplier.section.add_tables.modal.body_header') + form.form-horizontal + .control-group + label.control-label for='add-tables-number-start' data-t='section.add_tables.modal.number_start' = t('supplier.section.add_tables.modal.number_start') + .controls + input.input-mini#add-tables-number-start type=:number value=100 + .control-group + label.control-label for='add-tables-number-end' data-t='section.add_tables.modal.number_end' = t('supplier.section.add_tables.modal.number_end') + .controls + input.input-mini#add-tables-number-end type=:number value=120 + .modal-footer + button.btn data-dismiss="modal" aria-hidden=true data-t='section.add_tables.modal.close_button' + button.btn.btn-primary onclick="Qsupplier.add_tables_to_active_section()" data-t='section.add_tables.modal.add_button' +#arrange-tables-modal.modal.hide.fade tabindex=-1 role=:dialog aria-labeledby='add-tables-modal-label' aria-hidden=true + button.close type=:button data-dismiss=:modal aria-hidden=true x + h3#arrange-tables-modal-label data-t='section.arrange_tables.modal.title' = t('supplier.section.arrange_tables.modal.title') + .modal-body + p data-t='section.arrange_tables.modal.body_header' = t('supplier.section.arrange_tables.modal.body_header') + form.form-horizontal + .control-group + label.control-label for='arrange-tables-distributed' data-t='section.arrange_tables.modal.distributed' = t('supplier.section.arrange_tables.modal.distributed') + .controls + input#arrange-tables-distributed type="radio" name="arrange-table-option" checked=true value="distributed" + .control-group + label.control-label for='arrange-tables-by_row' data-t='section.arrange_tables.modal.by_row' = t('supplier.section.arrange_tables.modal.by_row') + .controls + input#arrange-tables-by_row type="radio" name="arrange-table-option" value="by_row" + label for="arrange-tables-by-row-count" data-t='section.arrange_tables.modal.by_row_count' = t('supplier.section.arrange_tables.modal.by_row_count') + input.input-mini#arrange-tables-by-row-count type="text" value=0 + ' + span data-t='models.plural.table' + .control-group + label.control-label for='arrange-tables-by_column' data-t='section.arrange_tables.modal.by_column' = t('supplier.section.arrange_tables.modal.by_column') + .controls + input#arrange-tables-by_column type="radio" name="arrange-table-option" value="by_column" + label for="arrange-tables-by-column-count" data-t='section.arrange_tables.modal.by_column_count' = t('supplier.section.arrange_tables.modal.by_column_count') + input.input-mini#arrange-tables-by-column-count type="text" value=0 + ' + span data-t='models.plural.table' + .modal-footer + button.btn data-dismiss="modal" aria-hidden=true data-t='section.arrange_tables.modal.close_button' + button.btn.btn-primary onclick="Qsupplier.arrange_tables_of_active_section()" data-t='section.arrange_tables.modal.arrange_button' - content_for :footer do javascript: var current_section_id = '#{@section.id}'; diff --git a/config/application.rb b/config/application.rb index d657f0a2..0fceb5aa 100644 --- a/config/application.rb +++ b/config/application.rb @@ -72,6 +72,9 @@ module Qwaiter # Enable escaping HTML in JSON. config.active_support.escape_html_entities_in_json = true + + config.handlebars.templates_root = %w[supplier/app/templates] + config.generators do |g| g.orm :simply_stored g.template_engine :slim diff --git a/config/environments/development.rb b/config/environments/development.rb index ab3c33b4..14210e9e 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -13,6 +13,8 @@ Qwaiter::Application.configure do config.consider_all_requests_local = true config.action_controller.perform_caching = false + config.ember.variant = :development + # Don't care if the mailer can't send config.action_mailer.raise_delivery_errors = false config.action_mailer.delivery_method = :letter_opener diff --git a/config/environments/production.rb b/config/environments/production.rb index 8c6c07d0..c2104bd2 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -17,6 +17,8 @@ Qwaiter::Application.configure do # Don't fallback to assets pipeline if a precompiled asset is missed config.assets.compile = false + config.ember.variant = :production + # Generate digests for assets URLs config.assets.digest = true diff --git a/config/locales/supplier.en.yml b/config/locales/supplier.en.yml index b692f4c2..2646c5e0 100644 --- a/config/locales/supplier.en.yml +++ b/config/locales/supplier.en.yml @@ -8,10 +8,10 @@ en: menu: active_lists: Active lists active_lists: - title: Active list + title: Active lists price: Price active_orders: - title: Active %{orders} + title: Active orders price: Price close: Close the shop you_are_currently_closed_alert: 'You are currently closed and not able to take orders' diff --git a/config/locales/supplier.nl.yml b/config/locales/supplier.nl.yml index 43ec1413..8caa2f64 100644 --- a/config/locales/supplier.nl.yml +++ b/config/locales/supplier.nl.yml @@ -6,12 +6,12 @@ nl: could_not_arrange_tables_by_row: 'De ${models.plural.table} konden niet worden gepositioneerd. Heeft de ${models.section|downcase} een hoogte en breedte?' could_not_arrange_tables_by_column: 'De ${models.plural.table} konden niet worden gepositioneerd. Heeft de ${models.section|downcase} een hoogte en breedte?' menu: - active_lists: Actieve %{lists} + active_lists: Actieve lijsten active_lists: - title: Actieve %{lists} + title: Actieve lijsten price: Prijs active_orders: - title: Actieve %{orders} + title: Actieve orders price: Prijs close: De zaak afsluiten voor bestellingen you_are_currently_closed_alert: 'Je bent momenteel gesloten en kan geen orders ontvangen' diff --git a/config/routes.rb b/config/routes.rb index fb611ac1..55b09ab4 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -99,6 +99,7 @@ Qwaiter::Application.routes.draw do post :sort end end + resources :orders, only: [:index, :show] root to: 'sections#index' end diff --git a/lib/qwaiter.rb b/lib/qwaiter.rb index dd167bbc..f7338758 100644 --- a/lib/qwaiter.rb +++ b/lib/qwaiter.rb @@ -1,4 +1,6 @@ module Qwaiter extend ActiveSupport::Autoload autoload :Distribution + autoload :Serializer end + diff --git a/lib/qwaiter/serializer.rb b/lib/qwaiter/serializer.rb new file mode 100644 index 00000000..e0227ca2 --- /dev/null +++ b/lib/qwaiter/serializer.rb @@ -0,0 +1,5 @@ +module Qwaiter + class Serializer < ActiveModel::Serializer + attribute :_id, key: :id + end +end diff --git a/spec/models/order_spec.rb b/spec/models/order_spec.rb index 5a428b19..dd63d4b8 100644 --- a/spec/models/order_spec.rb +++ b/spec/models/order_spec.rb @@ -27,4 +27,14 @@ describe Order do end end + + describe '.for_supplier' do + before { order } + it 'works' do + Order.for_supplier(supplier).should == order + end + + it 'paginates' + end + end