Passing spec for user product information

This commit is contained in:
2014-04-23 17:06:46 +02:00
parent ea498cb9c5
commit 546e4499ea
42 changed files with 190 additions and 482 deletions
+1 -1
View File
@@ -13,7 +13,7 @@
//= require jquery
//= require jquery_ujs
//= require jquery.ui.all
//= require bootstrap
// require bootstrap
// require twitter/bootstrap
//= require_directory .
//= require_self
@@ -58,7 +58,7 @@ App.ApplicationController = Ember.Controller.extend
if list.get('join_requests').toArray().length
@transitionToRoute 'join_requests'
callback.call(@) if callback
error = (emberError)=>
error = @ajaxError (emberError)=>
# if jqXHR.status == 404 officially, now assume close list on error
#@redirect_to 'index', message: 'the_list_has_been_closed'
console.log "Error: #{emberError.message}" if emberError.message
@@ -1,10 +1,11 @@
ControllerExtensions = Ember.Mixin.create
ajaxError: (callback)->
handler = (jqXHR, textStatus, errorThrown)=>
console.log "Error: #{textStatus}: #{errorThrown}"
callback.call(@, jqXHR)
if jqXHR.status == 401
handler = (emberError)=>
console.log "Error: status #{emberError.status}"
if emberError.status == 401
App.__container__.lookup('route:application').unauthorized()
else
callback.call(@, emberError)
handler
showModal: (options={})->
$(document).foundation('reflow') # needed (stupid!!!)
@@ -12,6 +13,7 @@ ControllerExtensions = Ember.Mixin.create
@set 'controllers.application.modal.title', options.title if options.title
@set 'controllers.application.modal.content', options.content if options.content
Ember.ArrayController.reopen ControllerExtensions
Ember.Controller.reopen ControllerExtensions
Ember.Controller.reopen
needs: ['application']
secured: (callback)->
@@ -14,6 +14,7 @@ App.ApplicationRoute = Ember.Route.extend
Qstorage.setItem('auth_token', '')
@controllerFor('application').set 'list', null
App.obtain_token(t('messages.unauthorized'))
@controllerFor('application').redirect_to 'index', message: 'unauthorized'
actions:
openModal: (modalName, model)->
@controllerFor(modalName).set('model', model)
@@ -59,20 +59,21 @@ header.top-menu
App.MenuItemListNeedsHelpView
App.MenuItemListNeedsPaymentView
section.extra-info
.supplier-info-row
.supplier-name= list.supplier.name
.table-number
|
= t 'models.table'
|
= list.table.number
.supplier-info-row
.counter.supplier-orders-placed-count
= list.supplier.orders_placed_count
span.orders-placed-count-icon
.counter.supplier-orders-in-process-count
= list.supplier.orders_in_process_count
span.orders-in-process-count-icon
if list
.supplier-info-row
.supplier-name= list.supplier.name
.table-number
|
= t 'models.table'
|
= list.table.number
.supplier-info-row
.counter.supplier-orders-placed-count
= list.supplier.orders_placed_count
span.orders-placed-count-icon
.counter.supplier-orders-in-process-count
= list.supplier.orders_in_process_count
span.orders-in-process-count-icon
aside.side-menu
ul
li
@@ -45,7 +45,7 @@
hr
ul.product_category-products
each product in product_category.products
li
li class="order-product-#{unbound product.id}"
if product.description
button.show-product-description{action showProductDescription product}
span
@@ -1,217 +0,0 @@
// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
//
//= require jquery
//= require jquery_ujs
// require bootstrap-transition
// require bootstrap-affix
// require bootstrap-alert
// require bootstrap-button
// require bootstrap-carousel
// require bootstrap-collapse
// require bootstrap-dropdown
// require bootstrap-modal
// require bootstrap-scrollspy
// require bootstrap-tab
// require bootstrap-tooltip
// require bootstrap-popover
// require bootstrap-typeahead
//= require bootstrap
//= require qwaiter
//= require supplier/order
//= require supplier/list
//= require mustache
//= require faye
//= require_directory .
//= require_self
var path_mapping = {
user_root: '/index',
join_occupied_table: '/join_occupied_table',
list_products_for_table: '/list_products_for_table',
list_products: '/list_products',
active_list: '/active_list',
history_list: '/history_list',
obtain_token: '/obtain_token',
lists_history: '/list_history'
}
var $translations = {
en: {
messages: <%= I18n.t('messages', locale: :en).to_json %>,
confirmations: {
},
// Moved to yml
list_needs_help: {
help_is_on_its_way: 'Help is already on its way',
title: 'Request a waiter',
content: 'Request a waiter to your table'
},
// Moved to yml
list_needs_payment: {
payment_already_requested: 'You already asked for the bill',
title: 'Ask for the check',
content: 'Do you want to pay?'
},
selected_products: {
order: 'Order',
clear: 'Clear'
},
join_request: {
title: 'Join request',
body: '%{email} wants to join the table',
reject: 'Reject',
approve: 'Approve',
requestor: {
title: 'This table is occupied',
go_back: 'Back',
show_the_products: 'Show the menu',
join_this_table: 'Join this table',
waiting_for_confirmation: 'Waiting for approval of the person on this table...'
}
},
// Moved to yml
move_table: {
cannot_move_to_occupied_table: 'You cannot move to an occupied table',
moved_to_another_table: 'The table is changed.',
confirmation_title: 'Move to another table?',
confirmation_body: 'Do you want to move to another table?'
},
models: <%= I18n.t('activemodel.models', locale: :en).to_json %>,
attributes: <%= I18n.t('activemodel.attributes', locale: :en).to_json %>,
<%= I18n.t('user', locale: :en).to_json[1..-2] %>
},
nl: {
messages: <%= I18n.t('messages', locale: :nl).to_json %>,
confirmations: {
},
// Moved to yml
list_needs_help: {
help_is_on_its_way: 'Er wordt al iemand naar je tafel gestuurd',
title: 'Ik heb een vraag',
content: 'Wil je een vraag stellen?'
},
// Moved to yml
list_needs_payment: {
payment_already_requested: 'De rekening is reeds gevraagd',
title: 'Vraag om de rekening',
content: 'Wil je betalen?'
},
selected_products: {
order: 'Bestellen',
clear: 'Leegmaken'
},
join_request: {
title: 'Lijst deling',
body: '%{email} wil ook op jouw lijst bestellen',
reject: 'Afwijzen',
approve: 'Toestaan',
requestor: {
title: 'Deze tafel is bezet',
go_back: 'Terug',
show_the_products: 'Toon het menu',
join_this_table: 'Ook bestellen aan deze tafel',
waiting_for_confirmation: 'Wachten op toestemming van huidige gebruikers om hier te kunnen bestellen...'
}
},
move_table: {
cannot_move_to_occupied_table: 'Je kan niet verhuizen naar een tafel die reeds gebruikt wordt.',
moved_to_another_table: 'De tafel is gewijzigd.',
confirmation_title: 'Naar een andere tafel verhuizen?',
confirmation_body: 'Wil je aan een andere tafel gaan zitten?'
},
models: <%= I18n.t('activemodel.models', locale: :nl).to_json %>,
attributes: <%= I18n.t('activemodel.attributes', locale: :nl).to_json %>,
<%= I18n.t('user', locale: :nl).to_json[1..-2] %>
}
}
function redirect_to(mapping, variables){
window.redirecting = true;
variables || (variables = {});
var vars = [];
for(var name in variables){
vars.push(name + '=' +variables[name]);
Qstorage.setItem(name, variables[name]);
}
window.location.href = QMobile.root_url() + path_mapping[mapping] + '.html'
}
function direct_to_site(mapping, variables){
variables || (variables = {});
var vars = []
for(var name in variables){
vars.push(name + '=' +variables[name])
}
window.location = data_host + path_mapping[mapping] + '.html?' + vars.join('&')
}
function currency(num) {
return Qwaiter.currency(num);
}
String.prototype.capitalize = function() {
return this.charAt(0).toUpperCase() + this.slice(1);
}
function t(path, vars){
vars || (vars = {});
var parts = path.split('.');
var locale = Qstorage.getItem('locale') || 'en';
var accessor = '$translations.'+locale+'["' + parts.join('"]["')+ '"]';
var result;
try{
result = eval(accessor);
} catch(err){
result = parts[parts.length - 1].capitalize();
}
if(!result) return parts[parts.length - 1].capitalize();
$.each(vars, function(v, value){ result = result.replace('%{'+v+'}', value)});
return result;
}
$.ajaxSetup({
error: function(xhr, ajaxOptions, error, another){
if(xhr.status == 401){
redirect_to('obtain_token');
}else if(xhr.status == 0){
QMobile.connection_problem();
}
}
});
$(function(){
if(Qstorage.getItem('message')){
var container = $('.alert-success');
var msg_finder = Qstorage.getItem('message');
if(msg_finder.indexOf('.') == -1) msg_finder = 'messages.'+msg_finder;
container.find('div').text(t(msg_finder));
container.show();
Qstorage.removeItem('message');
}
if(Qstorage.getItem('list_closed')){
var container = $('.alert-error');
container.find('div').text(t('messages.the_list_has_been_closed'));
container.show();
Qstorage.removeItem('list_closed');
}
setTranslations();
});
function setLocale(locale){
Qstorage.setItem('locale', locale);
setTranslations();
}
function Qupdate(selector){
setTranslations(selector);
}
function setTranslations(selector){
var list = $('#top-navigation-list');
var locale = Qstorage.getItem('locale');
list.find('.locale').show();
list.find('.locale-'+locale).hide();
if(selector){
$(selector).find('[data-t]').each(function(){$(this).text(t($(this).attr('data-t')))})
}else{
$('[data-t]').each(function(){$(this).text(t($(this).attr('data-t')))})
}
}
-136
View File
@@ -1,136 +0,0 @@
var Base64 = {
// private property
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
// public method for encoding
encode : function (input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
input = Base64._utf8_encode(input);
while (i < input.length) {
chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);
enc1 = chr1 >> 2;
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
enc4 = chr3 & 63;
if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}
output = output +
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
}
return output;
},
// public method for decoding
decode : function (input) {
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
while (i < input.length) {
enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
}
output = Base64._utf8_decode(output);
return output;
},
// private method for UTF-8 encoding
_utf8_encode : function (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
},
// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;
while ( i < utftext.length ) {
c = utftext.charCodeAt(i);
if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if((c > 191) && (c < 224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return string;
}
}
@@ -1,5 +1,3 @@
@import ./foundation_and_overrides
.form-row
@extend .row
.form-label
@@ -1,6 +1,3 @@
@import constants
@import font-awesome
@import foundation_and_overrides
header.top-menu
height: 90px
background-color: transparent
@@ -0,0 +1,7 @@
//$qbrown: #634227
$qbrown: #853d15
$qbrown-active: lighten($qbrown, 20%)
$green: #7BB459 //Heineken
//$wood: image-url('textures/wood001-vertical.jpg')
$wood: image-url('textures/theme1.jpg')
$background-brown: #57351f
@@ -1,4 +1,3 @@
@import foundation
.home-panel
+panel()
margin: 30px auto 20px auto
@@ -1,4 +1,3 @@
@import ./foundation_and_overrides
.join-request-container
.user-email
padding-left: 12px
@@ -1,4 +1,3 @@
@import "foundation_and_overrides"
.lists-overview-entry
+grid-column(12)
@media #{$medium-only}
@@ -0,0 +1,35 @@
ul.product_category-products
list-style: none
.product_category-title
cursor: pointer
.icon
@extend .fa
@extend .fa-arrow-down
color: #ccc
padding-right: 10px
&.collapsed
@extend .fa-arrow-right
.product_category-products
.product-price
float: right
.show-product-description
+button($bg: $secondary-color)
+button-icon-only
margin-right: 7px
span
@extend .fa
@extend .fa-info
@extend .fa-lg
.no-product-description
// Empty space to match the product description for layout
display: inline-block
width: 1.65rem
.add-product-to-list
+button($bg: $secondary-color)
+button-icon-only
float: right
margin-left: 5px
span
@extend .fa
@extend .fa-plus
@extend .fa-lg
@@ -1,5 +1,3 @@
@import foundation_and_overrides
@import font-awesome
ul.product-orders
list-style: none
li
@@ -1,8 +1,5 @@
@import constants
@import font-awesome
@import foundation_and_overrides
#ember-app-container
background-image: $wood
background-image: image-url('textures/theme1.jpg')
background-repeat: repeat
main.main-section
+panel($bg:rgba(200,200,200,0.8))
@@ -1,3 +1,15 @@
//= require ./foundation_and_overrides
//= require font-awesome
//= require_directory .
@import ./qconstants
@import ./foundation_and_overrides
@import font-awesome
@import constants
@import ./structure
@import ./menu_main
@import ./menu_side
@import ./qmodal
@import ./qproduct_orders
@import ./qproduct_categories
@import ./form_additions
@import ./qindex
@import ./qlists
@import ./qjoin_requests
@@ -13,8 +13,6 @@
// $rem-base: 16px;
// Allows the use of rem-calc() or lower-bound() in your settings
a.unused-class
display: inline-block
@import "foundation/functions"
// $experimental: true;
@@ -1,4 +1,3 @@
@import constants
aside.side-menu
background-color: #444
position: fixed
@@ -1,37 +0,0 @@
//@import ./foundation_and_overrides
//@import font-awesome
//ul.product_category-products
//list-style: none
//.product_category-title
//cursor: pointer
//.icon
//@extend .fa
//@extend .fa-arrow-down
//color: #ccc
//padding-right: 10px
//&.collapsed
//@extend .fa-arrow-right
//.product_category-products
//.product-price
//float: right
//.show-product-description
//+button($bg: $secondary-color)
//+button-icon-only
//margin-right: 7px
//span
//@extend .fa
//@extend .fa-info
//@extend .fa-lg
//.no-product-description
//// Empty space to match the product description for layout
//display: inline-block
//width: 1.65rem
//.add-product-to-list
//+button($bg: $secondary-color)
//+button-icon-only
//float: right
//margin-left: 5px
//span
//@extend .fa
//@extend .fa-plus
//@extend .fa-lg
+1 -1
View File
@@ -8,7 +8,7 @@ class DashboardController < ApplicationController
# Testing action
def select_qrcode
#@tables = Table.all.sample(2) | List.active.map(&:table)
@tables = Supplier.first.tables.sample(5) | List.active.map(&:table)
@tables = (current_supplier || Supplier.first).tables.sample(5) | List.active.map(&:table)
respond_to do |format|
format.html { render layout: 'phone' }
format.json { render json: @tables.to_json }
@@ -21,7 +21,7 @@ module Suppliers
respond_to do |format|
format.html # index.html.erb
format.json { render json: @lists }
format.json { render json: @lists, each_serializer: ListSerializer }
end
end
+1
View File
@@ -29,6 +29,7 @@ class Product
private
def persist_product_category_ids
return unless defined?(@product_category_ids) # Do not do anything if nothing happened to this attribute
@product_category_ids ||= []
existing_product_categories = product_categories
+1 -1
View File
@@ -1,4 +1,4 @@
class UserExtendedSupplierSerializer < Qwaiter::Serializer
class UserSupplierSerializer < Qwaiter::Serializer
self.root = :supplier
attributes :extended_version, :open, :name