Files
mozo-backend/app/assets/javascripts/user/quser.js.coffee
T
2012-12-11 11:27:41 +01:00

421 lines
18 KiB
CoffeeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#authentication_string = QMobile.authentication_string()
#authentication_object = $.parseJSON(QMobile.authentication_object())
class Quser
format_date: (utc) ->
formatted = ''
formatted += utc.substr(0,10)
formatted += ' '
formatted += utc.substr(11, 5)
formatted
watch_events: ->
faye = new Faye.Client(event_host)
user_id = Qstorage.getItem('user_id')
return unless user_id && user_id.length > 0
faye.subscribe "/user/"+user_id, (e)=>
if(e.event == 'list_closed')
#redirect_to 'user_root', {list_closed: 'true'}
redirect_to 'history_list', {list_id: e.data.id, list_closed: true}
else if(e.event == 'list_helped')
window.active_list.needs_help = false
@list_needs_help_default_action()
else if(e.event == 'order_being_processed')
$('#order-row-'+e.data.id).addClass('active')
else if(e.event == 'order_being_delivered')
$('#order-row-'+e.data.id).addClass('delivered')
else if(e.event == 'list_changed_table')
$('.table-number').text(e.data.table.number)
else if(e.event == 'list_needs_help')
window.active_list.needs_help = true
@list_needs_help_default_action()
else if(e.event == 'list_needs_payment')
window.active_list.needs_payment = true
@list_needs_payment_default_action()
else if(e.event == 'user_join_request')
@show_join_request(e.data)
else if(e.event == 'join_request_approved')
redirect_to 'list_products', message: 'join_request_approved'
else if(e.event == 'join_request_rejected')
redirect_to 'user_root', message: 'join_request_rejected'
else if(e.event == 'new_order')
$('#active-list-table tbody').append @mustache('#active-list-order-template', new Order(e.data.order))
$('.list-total-amount').html(currency(e.data.total_amount))
console.log(e)
false
reset_user: ->
Qstorage.removeItem('auth_token')
Qstorage.removeItem('user_id')
authenticate_user: ->
email = $('#user-email')
password = $('#user-password')
return unless email.length && password.length
return email.focus() unless email.val() && email.val().length > 0
return password.focus() unless password.val() && password.val().length > 0
$.post(data_host + '/user/obtain_token.json', {"user[email]": email.val(), "user[password]": password.val()}, (res)=>
if res.auth_token
Qstorage.setItem('auth_token', res.auth_token)
Qstorage.setItem('user_id', res.user_id)
redirect_to 'user_root'
else
$('.user-alert').html(t('obtain_token.invalid_combination')).show()
)
false
ensure_token: (callback)->
redirect_to('obtain_token') unless Qstorage.getItem('auth_token') && typeof(Qstorage.getItem('auth_token')) == 'string' && Qstorage.getItem('auth_token').length > 0
@authentication_string = 'auth_token='+Qstorage.getItem('auth_token')
@authentication_object = {auth_token: Qstorage.getItem('auth_token')}
callback.call() if callback
home_loader: ->
@ensure_token =>
$.getJSON(data_host + '/user/list_info.json?' + @authentication_string, (res) => @handle_active_list_default_actions(res))
handle_active_list: (callback) ->
@ensure_token =>
$.getJSON(data_host + '/user/list_info.json?' + @authentication_string, (res) =>
if(res.ok == false && res.status && res.status == 401)
redirect_to('obtain_token')
else if !res.list_active
redirect_to 'user_root', {list_closed: 'true'}
return
window.active_list = res
callback.call() if callback
@handle_active_list_default_actions(res)
)
handle_active_list_default_actions: (response)->
response ||= {}
if(response.ok == false && response.status && response.status == 401)
redirect_to('obtain_token')
return
$('.table-number').text(response.table_number) if response.table_number
$('.supplier-name').text(response.supplier_name) if response.supplier_name
if response.not_present || response.list_active == false then $('.home-link').hide() else $('.home-link').show()
@list_needs_payment_default_action(response)
@list_needs_help_default_action(response)
# join_request_active is to ensure that there are no more modals loaded when one is still active
# console.log('join_request_active=' + window.join_request_active)
@handle_join_requests(response)
handle_join_requests: (response)->
if !window.join_request_active && response.join_requests && response.join_requests.length
window.join_request_active = true
for join_request in response.join_requests
@show_join_request(join_request)
show_join_request: (join_request)->
$(@mustache('#join-request-template',
title: t('join_request.title')
message: t('join_request.body', {email: join_request.user_email})
reject: t('join_request.reject')
approve: t('join_request.approve')
requester_id: join_request.user_id
)).modal()
false
approve_join_request: (user_id)->
$.post(data_host + '/user/approve_join_request', $.extend({user_id: user_id}, authentication_object), -> window.join_request_active = false)
reject_join_request: (user_id)->
$.post(data_host + '/user/reject_join_request', $.extend({user_id: user_id}, authentication_object), -> window.join_request_active = false)
bogus1: ->
wrapper = $('<div class="modal"></div>')
join_callback = ( (request)->
->
$.post(data_host + '/user/approve_join_request', $.extend({user_id: request.user_id}, authentication_object), -> window.join_request_active = false; wrapper.modal('hide') )
)(join_request)
reject_callback = ( (request)->
->
$.post(data_host + '/user/reject_join_request', $.extend({user_id: request.user_id}, authentication_object), -> window.join_request_active = false; wrapper.modal('hide' ))
)(join_request)
header = $('<div class="modal-header"></div>')
.append('<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>')
.append($('<h3></h3>').text(t('join_request.title'))).appendTo(wrapper)
body = $('<div class="modal-body"></div>')
#body.append(join_request.user_email + ' wants to join the table')
body.text(t('join_request.body', {email: join_request.user_email}))
body.appendTo(wrapper)
footer = $('<div class="modal-footer"></div>')
.append($('<a href="#" class="btn"></a>').text(t('join_request.reject')).click(reject_callback))
.append($('<a href="#" class="btn btn-primary"></a>').text(t('join_request.approve')).click(join_callback))
.appendTo(wrapper)
wrapper.modal()
list_needs_help_default_action: (response)=>
response ||= window.active_list
needs_help_container = $('#list-needs-help-button')
if needs_help_container.length
if response.needs_help
needs_help_container.data('needs-help', true)
needs_help_container.addClass('active')
else
needs_help_container.data('needs-help', false)
needs_help_container.removeClass('active')
unless needs_help_container.data('click-initialized')
needs_help_container.click( ->
if $(this).data('needs-help')
Qwaiter.alert(t('list_needs_help.help_is_on_its_way'))
else
Qwaiter.confirm(
title: t('list_needs_help.title')
content: t('list_needs_help.content')
ok: window.Quser.list_needs_help
)
)
needs_help_container.data('click-initialized', true)
list_needs_help: ->
return unless window.active_list && !window.active_list.needs_help
$.post(data_host + '/user/needs_help.json', authentication_object, (res) => window.active_list = res; window.Quser.list_needs_help_default_action(res))
list_needs_payment_default_action: (response)->
response ||= window.active_list
needs_payment_container = $('#list-needs-payment-button')
if needs_payment_container.length
if response.needs_payment
needs_payment_container.data('needs-payment', true)
needs_payment_container.addClass('active')
else
needs_payment_container.data('needs-payment', false)
needs_payment_container.removeClass('active')
unless needs_payment_container.data('click-initialized')
needs_payment_container.click( ->
if $(this).data('needs-payment')
Qwaiter.alert(t('list_needs_payment.payment_already_requested'))
else
Qwaiter.confirm(
title: t('list_needs_payment.title')
content: t('list_needs_payment.content')
ok: window.Quser.list_needs_payment
)
)
needs_payment_container.data('click-initialized', true)
list_needs_payment: ->
return unless window.active_list && !window.active_list.needs_payment
$.post(data_host + '/user/list_needs_payment.json', authentication_object, (res) => window.active_list = res; window.Quser.list_needs_payment_default_action(res))
load_active_list: () ->
@ensure_token =>
$.getJSON(data_host + '/user/active_list.json?'+@authentication_string, (res) =>
if(res.ok == false && res.status && res.status == 401)
redirect_to('obtain_token')
window.active_list = res if res._id
unless res.list_active
redirect_to 'history_list', {list_id: window.active_list._id, list_closed: true}
return
@handle_active_list_default_actions(res)
body = $('#active-list-table tbody')
foot = $('#active-list-table tfoot')
@build_list_table(body, foot, res)
)
load_history_list: () ->
return unless list_id = Qstorage.list_id
@ensure_token =>
$.getJSON(data_host + '/user/history_list.json?list_id='+list_id+'&'+ @authentication_string, (res) =>
body = $('#history-list-table tbody')
foot = $('#history-list-table tfoot')
@build_list_table(body, foot, res)
$('.list-created-at').text(@format_date(res.created_at))
$('.list-closed-at').text(@format_date(res.closed_at))
$('.supplier-name').text(res.supplier_name)
)
load_list_history: ->
@ensure_token =>
page = Qstorage.getItem('page') || 1
page = parseInt(page)
$.getJSON(data_host + '/user/list_history.json?'+@authentication_string+'&page='+page, (res) =>
@paginate(res, @load_list_history)
container = $('#list-history-container').html('')
for list in res.lists
li = $('<li></li>').appendTo(container)
link = $('<a href="#"></a>').appendTo(li)
link.click(-> redirect_to 'history_list', list_id: list._id)
txt = list.supplier_name
txt += ' - '
txt += @format_date(list.created_at)
link.text(txt)
)
paginate: (wrapper, callback) ->
container = $('nav.pagination')
container.html('')
list = $('<ul></ul>').appendTo(container)
if wrapper.num_pages && wrapper.num_pages > 1
for i in [1..wrapper.num_pages]
li = $('<li class="page"></li>')
link = $('<a href="#"></a>')
link.text(i)
if wrapper.current_page && wrapper.current_page == i
li.addClass('active')
else
callback = ((i)->
->
Qstorage.page = i
window.Quser.load_list_history()
)(i)
link.click(callback)
li.append(link)
list.append(li)
mustache: (selector, locals)->
locs = $.extend(locals,
currency: ->
(val)->
currency(Mustache.render(val, this))
)
Mustache.to_html($(selector).html(), locs)
build_list_table: (body, foot, res) ->
body.find('tr').remove()
if !res.orders && !res.orders.length
Qwaiter.alert('No orders in list')
return
m_obj = res
body.append @mustache('#active-list-order-template', new Order(order)) for order in m_obj.orders
$('.list-total-amount').html(currency(m_obj.total_amount))
order_selected_products: ()->
@ensure_token =>
return if $.isEmptyObject(window.active_products_list)
h = {}
h['table_id'] = Qstorage.getItem('table_id') if Qstorage.getItem('table_id')
for product_id, number of window.active_products_list
h['products['+product_id+']'] = number
$.post(data_host + '/user/order_selected_products', $.extend(h, @authentication_object), ((res) => @handle_response(res)), 'json')
handle_response: (res) ->
if(typeof(res) == 'string')
return unless res.length
if res[0] == '{'
res = JSON.parse(res)
else
eval(res)
return
if res['message'] && !res['ok']
redirect_to 'user_root', {message: res['message']}
else
redirect_to res.location || 'list_products' if res['ok']
build_product_list: ->
total = 0.0
h = {products: []}
for product_id, number of window.active_products_list
product = window.products[product_id]
product.number = number
product.product_total = product.price * number
h.products.push product
total += product.price * number
h.total = total
$('#active-order-container').html @mustache('#active-order-template', h)
Qupdate('#active-order-container')
load_active_list_products: ->
@populate_products_table('/user/list_products.json?'+@authentication_string)
load_table_products: ->
@ensure_token =>
return redirect_to 'user_root', {message: 'cannot_identify_table'} unless Qstorage.table_id
@populate_products_table('/user/list_products_for_table.json?'+@authentication_string+'&table_id='+Qstorage.table_id)
populate_products_table: (src)->
$.getJSON(data_host + src, (res) =>
include_order_buttons = res.my_list || !res.table_occupied
$('.table-number').text(res.table_number) if res.table_number
$('.supplier-name').text(res.supplier_name) if res.supplier_name
window.products = {}
body = $('#products-table tbody')
body.find('tr').remove()
script_id = if include_order_buttons then '#products-category-for-order-template' else '#products-category-template'
#for category, products of res
for category in res.categories
body.append @mustache(script_id,
category: category.name,
products: category.products,
include_order_buttons: include_order_buttons
)
for product in category.products
window.products[product._id] = product
)
increment_products_counter: (product_id)->
product_count_holder = $('#order-product-count-'+product_id)
count = parseInt(product_count_holder.text())
product_count_holder.text(count + 1)
false
lower_products_counter: (product_id)->
product_count_holder = $('#order-product-count-'+product_id)
count = parseInt(product_count_holder.text())
product_count_holder.text(count - 1)
false
add_product_to_order: (product_id, context) ->
product_count_holder = $('#order-product-count-'+product_id)
count = parseInt(product_count_holder.text())
count ||= 1
product_count_holder.text(1)
window.active_products_list ||= {}
window.active_products_list[product_id] ||= 0
window.active_products_list[product_id] += count
delete(window.active_products_list[product_id]) if window.active_products_list[product_id] < 1
@build_product_list()
false
actions_for_table: (table)->
table = JSON.parse(table) if typeof(table) == 'string'
Qstorage.table_id = table.table_id
$.getJSON(data_host + '/user/table_info.json?'+@authentication_string+'&table_id='+table.table_id, (res)=>
if res.current_table_id
if res.other_supplier
redirect_to 'user_root', {message: 'table_is_from_other_supplier'}
else if res.current_table_id == table.table_id
#nothing has changed, show product list
redirect_to 'list_products'
else if res.current_table_id != table.table_id
if res.occupied
redirect_to 'user_root', {message: 'table_is_occupied'}
else if res.reserved
redirect_to 'user_root', {message: 'table_is_reserved'}
else if table.closed
redirect_to 'user_root', {message: 'table_is_closed'}
else if res.supplier_closed
redirect_to 'user_root', {message: 'supplier_is_closed'}
else
## Offer to move table
Qwaiter.confirm(
ok: ->
$.post(data_host + '/user/move_table', $.extend({table_id: table.table_id}, @authentication_object), (res2)->
if res2.occupied
redirect_to 'user_root', {message: 'move_table.cannot_move_to_occupied_tabe'}
else
redirect_to 'list_products', {message: 'move_table.moved_to_another_table'}
)
cancel: ->
redirect_to 'list_products'
title: t('move_table.confirmation_title')
content: t('move_table.confirmation_body')
)
else
if res.occupied
redirect_to 'join_occupied_table', {table_id: table.table_id}
else if res.supplier_closed
redirect_to 'user_root', {message: 'supplier_is_closed'}
else
#$.post(data_host + '/user/create_list.json', {table_id: table.table_id}, (res)-> Quser.handle_response(res))
redirect_to 'list_products_for_table', {table_id: table.table_id}
, 'json')
show_table_products: ->
unless table_id = Qstorage.table_id
redirect_to 'user_root', {message: 'cannot_identify_table'}
return
redirect_to 'list_products_for_table', table_id: table_id
join_occupied_table: () ->
unless table_id = Qstorage.table_id
redirect_to 'user_root', {message: 'cannot_identify_table'}
return
$('.form-actions').remove()
cont = $('#join-occupied-table-progress-container')
cont.html('')
cont.append $($('<img />').attr('src', "#{$asset_path}spinner.gif"))
cont.append $($('<p>').html(t('join_request.waiting_for_confirmation')))
$.post(data_host + '/user/join_occupied_table', $.extend({table_id: table_id}, @authentication_object))
#setInterval('Quser.check_if_can_join_occupied_table("'+table_id+'")', 7500)
add_product: (product_id, count) ->
count ||= 1
window.active_products_list ||= {}
window.active_products_list[product_id] ||= 0
window.active_products_list[product_id] += count
@build_product_list()
clear_selected_products: ->
window.active_products_list = {}
$('#active-order-table').hide()
@Quser = new Quser