Many supplier features and style upgrades and fixes
This commit is contained in:
+1
-1
@@ -1,7 +1,7 @@
|
||||
App.ButtonRemoveListNeedsPaymentComponent = Ember.Component.extend
|
||||
tagName: 'button'
|
||||
layoutName: 'components/button/remove-list-needs-payment'
|
||||
classNames: ['remove_list_needs_payment']
|
||||
classNames: ['remove-list-needs-payment-button']
|
||||
classNameBindings: ['content.needs_payment:show:hide']
|
||||
click: ->
|
||||
@get('content').invoke 'remove_needs_payment'
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
App.ButtonShowListComponent = Ember.Component.extend
|
||||
tagName: 'button'
|
||||
layoutName: 'components/button/show-list'
|
||||
classNames: ['show-list-button']
|
||||
click: ->
|
||||
@get('targetObject.targetObject').transitionToRoute('list', @get('content'))
|
||||
@@ -1,8 +1,5 @@
|
||||
App.DashboardActiveListComponent = Ember.Component.extend
|
||||
tagName: 'tr'
|
||||
classNames: ['row']
|
||||
layoutName: 'dashboard/active-list'
|
||||
classNameBindings: ['classIdentifier']
|
||||
classIdentifier: Ember.computed 'list.id', -> "list-row-#{@get('list.id')}"
|
||||
actions:
|
||||
showList: (list)->
|
||||
@get('targetObject').transitionToRoute 'list', list
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
App.DashboardActiveOrderComponent = Ember.Component.extend
|
||||
tagName: 'tr'
|
||||
classNames: ['row']
|
||||
layoutName: 'dashboard/active-order'
|
||||
classNameBindings: ['order.active:active', 'order.delivered:delivered', 'classIdentifier']
|
||||
classIdentifier: Ember.computed 'order.id', -> "order-row-#{@get('order.id')}"
|
||||
|
||||
@@ -28,6 +28,7 @@ App.MySelectComponent = Ember.Component.extend
|
||||
@$('select:first').prop('selectedIndex', index)
|
||||
|
||||
actions:
|
||||
showDebugger: -> debugger
|
||||
change: ->
|
||||
selectedIndex = @$('select:first').get(0).selectedIndex
|
||||
|
||||
|
||||
@@ -17,5 +17,6 @@ App.SelectMinuteOfDayComponent = Ember.Component.extend
|
||||
@set 'value', 60*hour + parseInt(value)
|
||||
value
|
||||
get: ->
|
||||
number = Math.floor @get('value')%60
|
||||
return "00" unless value = @get('value')
|
||||
number = Math.floor value%60
|
||||
"0#{number}".substr(-2,2)
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
App.UsersButtonsComponent = Ember.Component.extend
|
||||
classNames: ['users-buttons']
|
||||
actions:
|
||||
userClick: (user)->
|
||||
@modal 'user_info',
|
||||
title_path: 'modal.user_info.title'
|
||||
model: user
|
||||
@@ -1,20 +1,18 @@
|
||||
App.ListsIndexController = Ember.Controller.extend
|
||||
loading: true
|
||||
date: (new Date()).toISOString().substr(0,10) # 2015-11-02
|
||||
dateChanged: (->
|
||||
return unless date = @get('date')
|
||||
@set 'loading', true
|
||||
lists = if @get('date') then @store.findAll('list', date: @get('date')) else @store.findAll('list')
|
||||
lists.then => @set('loading', false)
|
||||
@set 'model', lists
|
||||
@store.query 'list', date: date
|
||||
.then => @set('loading', false)
|
||||
).observes('date')
|
||||
lists: (->
|
||||
return @store.peekAll('list') unless date = @get('date')
|
||||
@store.filter('list', (l)->
|
||||
return false unless list_date = l.get('created_at')
|
||||
list_date = list_date.toISOString().substring(0,10) if typeof(list_date) is 'object'
|
||||
list_date == date
|
||||
)
|
||||
).property('date')
|
||||
lists: Ember.computed 'date', ->
|
||||
return @store.peekAll('list') unless selected_date = @get('date')
|
||||
@store.peekAll('list').filter (list)->
|
||||
return false unless list_creation_date = list.get('created_at')
|
||||
list_creation_date = list_creation_date.toISOString().substring(0,10) if typeof(list_creation_date) is 'object'
|
||||
selected_date is list_creation_date
|
||||
|
||||
sorted_lists: (->
|
||||
sorted_lists: Ember.computed 'lists.[]', ->
|
||||
@get('lists').sortBy('created_at').reverseObjects()
|
||||
).property('lists.[]')
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
App.ListsIndexRoute = Ember.Route.extend
|
||||
#model: -> @store.findAll 'list'
|
||||
setupController: (controller, model)->
|
||||
controller.set 'date', (new Date()).toISOString().substr(0,10) unless controller.get('date')
|
||||
#App.ListsIndexRoute = Ember.Route.extend
|
||||
# #model: -> @store.findAll 'list'
|
||||
# setupController: (controller, model)->
|
||||
# controller.set 'date', (new Date()).toISOString().substr(0,10) unless controller.get('date')
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
span.fa.fa-list.fa-2x
|
||||
@@ -0,0 +1,5 @@
|
||||
if user
|
||||
a.user-avatar-button{action "userClick" user}= user.avatar_tag
|
||||
else
|
||||
each users as |user|
|
||||
a.user-avatar-button{action "userClick" user}= user.avatar_tag
|
||||
@@ -1,17 +1,16 @@
|
||||
td.user-info.show-for-large-up
|
||||
each list.users as |user|
|
||||
= user.avatar_tag
|
||||
td.status-icons
|
||||
if list.needs_help
|
||||
span.icon.needs-help
|
||||
if list.needs_payment
|
||||
|
|
||||
span.icon.needs-payment
|
||||
td.numeric.table_number= table-number-with-info list=list
|
||||
td.section_title: link-to 'section' list.table.section.id: span=list.table.section.title
|
||||
td.currency.total_list_amount=currency list.total
|
||||
td.actions
|
||||
= button-mark-list-helped content=list
|
||||
= button-remove-list-needs-payment content=list
|
||||
= button-close-list content=list
|
||||
button.show-list.button{action "showList" list}: span
|
||||
.small-12.columns
|
||||
= users-buttons users=list.users
|
||||
.status-icons
|
||||
if list.needs_help
|
||||
span.icon.needs-help
|
||||
if list.needs_payment
|
||||
span.icon.needs-payment
|
||||
span.table-number= table-number list.table.number
|
||||
= link-to 'section' list.table.section class="link-to-section"
|
||||
span=list.table.section.title
|
||||
span.currency=currency list.total
|
||||
.actions
|
||||
= button-mark-list-helped content=list
|
||||
= button-remove-list-needs-payment content=list
|
||||
= button-close-list content=list
|
||||
= button-show-list content=list
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
td.user-info.show-for-large-up= order.user.avatar_tag
|
||||
td.status-icons
|
||||
if order.active
|
||||
span.active-order
|
||||
td= order.display
|
||||
td.numeric.table_number= table-number-with-info list=order.list
|
||||
td.section_title= link-to 'section' order.list.table.section.id: span=order.list.table.section.title
|
||||
td.currency=currency order.total
|
||||
td.time= time order.created_at format="HH:mm"
|
||||
td.actions
|
||||
= button-mark-order-active order=order
|
||||
= button-mark-order-delivered order=order
|
||||
= button-mark-order-cancelled order=order
|
||||
.small-12.columns
|
||||
= users-buttons users=order.list.users
|
||||
.status-icons
|
||||
if order.active
|
||||
span.active-order
|
||||
span.order-display= order.display
|
||||
span.table-number= table-number order.list.table.number
|
||||
= link-to 'section' order.list.table.section class="link-to-section"
|
||||
span=order.list.table.section.title
|
||||
span.currency=currency order.total
|
||||
span.time= time order.created_at format="HH:mm"
|
||||
.actions
|
||||
= button-mark-order-active order=order
|
||||
= button-mark-order-delivered order=order
|
||||
= button-mark-order-cancelled order=order
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
.row.select-minute-of-day
|
||||
.small-5.columns= my-select content=hours_list selection=hour identity=false
|
||||
.small-5.columns.hour-of-day= my-select content=hours_list selection=hour identity=false
|
||||
.small-1.columns: span
|
||||
.small-5.columns.end= my-select content=minutes_list selection=minute identity=false
|
||||
.small-5.columns.end.minute-of-hour= my-select content=minutes_list selection=minute identity=false
|
||||
|
||||
@@ -17,18 +17,9 @@
|
||||
else
|
||||
h3=t 'dashboard.active_lists.no_lists'
|
||||
if show_lists_table
|
||||
table.active-lists-table.table
|
||||
thead
|
||||
tr
|
||||
th.user-info.show-for-large-up
|
||||
th.status-icons
|
||||
th.numeric=t 'table_number'
|
||||
th=t 'models.section'
|
||||
th.currency=t 'active_lists.price'
|
||||
th.actions
|
||||
tbody
|
||||
each active_lists as |list|
|
||||
= dashboard-active-list list=list
|
||||
.active-lists-table
|
||||
each active_lists as |list|
|
||||
= dashboard-active-list list=list
|
||||
.page-header
|
||||
if active_orders.length
|
||||
h3.dashboard-orders-header{action "toggleDashboardOrders"}
|
||||
@@ -41,17 +32,6 @@
|
||||
else
|
||||
h3= t 'dashboard.active_orders.no_orders'
|
||||
if show_orders_table
|
||||
table.active-orders-table.table
|
||||
thead
|
||||
tr
|
||||
th.user-info.show-for-large-up
|
||||
th.status-icons
|
||||
th=t 'models.order'
|
||||
th.numeric=t 'table_number'
|
||||
th=t 'models.section'
|
||||
th.currency=t 'active_orders.price'
|
||||
th.time
|
||||
th.actions
|
||||
tbody
|
||||
each active_orders as |order|
|
||||
= dashboard-active-order order=order
|
||||
.active-orders-table
|
||||
each active_orders as |order|
|
||||
= dashboard-active-order order=order
|
||||
|
||||
@@ -21,9 +21,7 @@ if list.active
|
||||
.display-field
|
||||
= button-mark-list-helped content=list
|
||||
= button-close-list content=list
|
||||
.user-info-container
|
||||
each list.users as |user|
|
||||
= user.avatar_tag
|
||||
= users-buttons users=list.users
|
||||
if list.sorted_orders
|
||||
.list-orders-container
|
||||
each list.sorted_orders as |order|
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
h4=t 'modal.change_list_table.subtitle' current_table_number=model.table.number
|
||||
.user-info-container
|
||||
each model.users as |user|
|
||||
= user.avatar_tag
|
||||
= users-buttons users=model.users
|
||||
each sections as |section|
|
||||
h3= section.title
|
||||
ul.change-list-table-section-tables
|
||||
|
||||
@@ -31,11 +31,11 @@
|
||||
.form-field.half= boolean-switch value=model.active_on_sunday
|
||||
.small-12.medium-6.columns
|
||||
.row
|
||||
.small-12.columns.text-center= boolean-button value=model.full_day reverse=true text_path="product_category.modal.active_between.top"
|
||||
.small-12.columns.text-center= boolean-button value=model.full_day reverse=true text_path="product_category.modal.active_between.top" class="toggle-full-day-button"
|
||||
unless model.full_day
|
||||
.row
|
||||
.small-12.columns= select-minute-of-day value=model.start_from
|
||||
.small-12.columns.select-start_from= select-minute-of-day value=model.start_from
|
||||
.row
|
||||
.small-12.columns.text-center= t 'product_category.modal.active_between.middle'
|
||||
.row
|
||||
.small-12.columns= select-minute-of-day value=model.end_on
|
||||
.small-12.columns.select-end_on= select-minute-of-day value=model.end_on
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
.form-row
|
||||
.form-label
|
||||
.form-value= model.avatar_tag
|
||||
.form-row
|
||||
.form-label= t 'attributes.user.name'
|
||||
.form-value= model.name
|
||||
.form-row
|
||||
.form-label= t 'user.number_of_lists_at_supplier'
|
||||
.form-value 1
|
||||
@@ -12,9 +12,7 @@ table.table
|
||||
tbody
|
||||
each orders as |order|
|
||||
tr
|
||||
td
|
||||
each order.list.users as |user|
|
||||
= user.avatar_tag
|
||||
td= users-buttons users=order.list.users
|
||||
td.status-icons
|
||||
if order.active
|
||||
span.active-order.fa.fa-check.fa-lg
|
||||
|
||||
@@ -20,5 +20,4 @@ if table.active_list
|
||||
=currency table.active_list.total
|
||||
/.table-action-row
|
||||
a{action "editTable" table}: span.fa.fa-lg.fa-wrench
|
||||
each table.active_list.users as |user|
|
||||
= user.avatar_tag
|
||||
= users-buttons users=table.active_list.users
|
||||
|
||||
@@ -22,7 +22,6 @@ var Qstorage = localStorage;
|
||||
$.extend($translations.en, <%= I18n.t('supplier', locale: :en).to_json %>);
|
||||
$.extend($translations.nl, <%= I18n.t('supplier', locale: :nl).to_json %>);
|
||||
|
||||
|
||||
String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); }
|
||||
|
||||
window.time_zones = <%= ActiveSupport::TimeZone.all.map{|tz| {name: tz.name, formatted: "GMT#{tz.formatted_offset} #{tz.name}"}}.to_json.html_safe %>;
|
||||
|
||||
@@ -16,10 +16,6 @@ td.boolean
|
||||
.boolean-false
|
||||
@extend .fa, .fa-lg, .fa-minus
|
||||
|
||||
.change-list-table-button
|
||||
+button($bg: $warning-color, $padding: $button-tny)
|
||||
margin: 0
|
||||
margin-bottom: 8px
|
||||
.change-list-table-section-tables
|
||||
list-style: none
|
||||
+clearfix
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// spin-rotate is currently used when clicked on a section-element in a section view
|
||||
.spin-rotate
|
||||
+animation(spinRotate 2s)
|
||||
+keyframes(spinRotate)
|
||||
|
||||
@@ -1,3 +1,42 @@
|
||||
.button-text
|
||||
// Only icons for now
|
||||
display: none
|
||||
.mark-list-as-helped-button
|
||||
+button-icon-only
|
||||
vertical-align: middle
|
||||
padding-left: 8px //do not ask me why, just looks
|
||||
padding-right: 2px //do not ask me why, just looks
|
||||
margin-right: $button-spacing
|
||||
span
|
||||
@extend .fa, .fa-2x, .fa-bell-slash-o
|
||||
.mark-order-active-button
|
||||
+button-icon-only
|
||||
margin-right: 0.6em
|
||||
.mark-order-delivered-button
|
||||
+button-icon-only
|
||||
.show-list-button
|
||||
+button-icon-only
|
||||
vertical-align: middle
|
||||
margin-left: $button-spacing
|
||||
.mark-order-cancelled-button
|
||||
+button($bg: $alert-color)
|
||||
+button-icon-only
|
||||
margin-left: $button-spacing
|
||||
span
|
||||
@extend .fa
|
||||
@extend .fa-2x
|
||||
@extend .fa-times
|
||||
|
||||
.change-list-table-button
|
||||
+button($bg: $warning-color, $padding: $button-tny)
|
||||
margin: 0
|
||||
margin-bottom: 8px
|
||||
.close-list-button
|
||||
+button-icon-only
|
||||
vertical-align: middle
|
||||
.remove-list-needs-payment-button
|
||||
+button-icon-only
|
||||
vertical-align: middle
|
||||
padding-left: 8px //do not ask me why, just looks
|
||||
padding-right: 2px //do not ask me why, just looks
|
||||
margin-right: $button-spacing
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
.mark-list-as-helped-button
|
||||
+button-icon-only
|
||||
vertical-align: top
|
||||
padding-left: 8px //do not ask me why, just looks
|
||||
padding-right: 2px //do not ask me why, just looks
|
||||
margin-right: $button-spacing
|
||||
span
|
||||
@extend .fa, .fa-2x, .fa-bell-slash-o
|
||||
.mark-order-active-button
|
||||
+button-icon-only
|
||||
margin-right: 0.6em
|
||||
.mark-order-delivered-button
|
||||
+button-icon-only
|
||||
.mark-order-cancelled-button
|
||||
+button($bg: $alert-color)
|
||||
+button-icon-only
|
||||
margin-left: $button-spacing
|
||||
span
|
||||
@extend .fa
|
||||
@extend .fa-2x
|
||||
@extend .fa-times
|
||||
@@ -18,23 +18,41 @@
|
||||
min-width: 124px
|
||||
select
|
||||
width: calc(100% - 30px)
|
||||
.active-lists-table
|
||||
width: 100%
|
||||
.show-list
|
||||
+button-icon-only
|
||||
margin-left: $button-spacing
|
||||
span
|
||||
@extend .fa
|
||||
@extend .fa-2x
|
||||
@extend .fa-list
|
||||
.remove_list_needs_payment
|
||||
+button-icon-only
|
||||
vertical-align: top
|
||||
padding-left: 8px //do not ask me why, just looks
|
||||
padding-right: 2px //do not ask me why, just looks
|
||||
margin-right: $button-spacing
|
||||
.close-list-button
|
||||
+button-icon-only
|
||||
= active-list-div($float: left, $padding: 4px)
|
||||
line-height: 50px
|
||||
float: $float
|
||||
display: inline-block
|
||||
vertical-align: middle
|
||||
padding-left: $padding
|
||||
padding-right: $padding
|
||||
.active-lists-table, .active-orders-table
|
||||
.row
|
||||
border-bottom: 1px solid #777
|
||||
background-color: white
|
||||
padding: 5px
|
||||
.users-buttons
|
||||
float: left
|
||||
.status-icons
|
||||
font-size: 1.5rem
|
||||
+active-list-div
|
||||
.needs-payment
|
||||
margin-left: 7px
|
||||
.order-display
|
||||
+active-list-div
|
||||
.table-number
|
||||
+active-list-div
|
||||
.link-to-section
|
||||
+active-list-div
|
||||
.currency
|
||||
+active-list-div
|
||||
font-weight: bold
|
||||
.actions
|
||||
+active-list-div(right)
|
||||
button
|
||||
vertical-align: middle
|
||||
.time
|
||||
+active-list-div(right)
|
||||
|
||||
.active-orders-table
|
||||
width: 100%
|
||||
.go-to-orders-list
|
||||
|
||||
@@ -91,15 +91,6 @@ private
|
||||
end
|
||||
end
|
||||
|
||||
def check_active_list_state
|
||||
if current_user.try(:active_list_id)
|
||||
unless active_list.active?
|
||||
current_user.list_is_closed!
|
||||
redirect_to user_root_path, alert: t('messages.the_list_has_been_closed', list: List.model_name.human)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def active_list
|
||||
return nil unless current_user.try(:active_list_id).present?
|
||||
@active_list ||= List.find(current_user.active_list_id)
|
||||
@@ -113,6 +104,7 @@ private
|
||||
{ok: false, message: message}.merge(options).to_json
|
||||
end
|
||||
alias json_alert js_alert
|
||||
|
||||
def js_notice(*args)
|
||||
options = args.extract_options!
|
||||
message = args.first || ''
|
||||
|
||||
@@ -1,209 +1,19 @@
|
||||
class UserController < Users::ApplicationController
|
||||
before_action :allow_all_origins
|
||||
layout 'user/foundation'
|
||||
#layout 'phone'
|
||||
|
||||
alias :list :active_list
|
||||
|
||||
def index
|
||||
handle_message_params
|
||||
end
|
||||
|
||||
# POST /user/create_list {table_id: 1234}
|
||||
#DEPRICATED, see order_selected_products, this one now handles list creation as well
|
||||
#def create_list
|
||||
#render nothing: true and return unless current_user.present?
|
||||
#@table = Table.find(params[:table_id])
|
||||
#if @table.occupied?
|
||||
#respond_to do |format|
|
||||
#format.html { redirect_to user_root_path, alert: t('messages.table_is_occupied') }
|
||||
#format.json { render json: json_alert('messages.table_is_occupied')}
|
||||
#end
|
||||
#else
|
||||
#if @list = List.from_table( @table, current_user )
|
||||
#end
|
||||
#respond_to do |format|
|
||||
#format.html { redirect_to user_list_products_path }
|
||||
#format.json { render json: json_notice('messages.new_list_created')}
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
|
||||
# GET /suppliers/1/product_list
|
||||
# GET /suppliers/1/product_list.json
|
||||
def list_products
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
redirect_to(user_root_path(message: 'the_list_has_been_closed')) and return unless list
|
||||
@supplier = list.supplier
|
||||
handle_message_params
|
||||
end
|
||||
format.json do
|
||||
unless list
|
||||
render json: {not_present: true} and return
|
||||
end
|
||||
@supplier = list.supplier
|
||||
h = ProductCategory.for_user(current_user, table: list.table, list: list, supplier: @supplier) # list is performance parameter
|
||||
render json: h
|
||||
#products = list.supplier.products
|
||||
#product_categories = list.supplier.product_categories
|
||||
#other = product_categories.find(&:other?) || (product_categories << ProductCategory.other).last # Container for non categorized products
|
||||
|
||||
#product_categories.sort_by!{|p| p.product_category.try(:position) || 90000}
|
||||
#h = {table_number: list.table_number, supplier_name: @supplier.name}
|
||||
#h[:categories] = product_categories.map{|pc| {pc.name => pc.product_ids.map{|p| p.as_json}}}
|
||||
#){|h, p| n = p.product_category.try(:name) || 'other'; h[n] ||= []; h[n] << p; h}
|
||||
#render json: h
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def list_products_for_table
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
end
|
||||
format.json do
|
||||
render json: json_alert('messages.table_not_found') and return unless params[:table_id].present?
|
||||
@table = Table.find(params[:table_id])
|
||||
h = ProductCategory.for_user(current_user, table: @table)
|
||||
render json: h
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# POST /user/check_table_join_status.json table_id:12345
|
||||
def check_table_join_status
|
||||
render json: json_alert('messages.table_not_found') and return unless params[:table_id].present?
|
||||
@table = Table.find(params[:table_id])
|
||||
if @list = @table.active_list
|
||||
if @list.user_ids.include?(current_user.id)
|
||||
render json: {approved: true}
|
||||
elsif @list.join_request_user_ids.include?(current_user.id)
|
||||
render json: {waiting: true}
|
||||
else
|
||||
render json: {rejected: true}
|
||||
end
|
||||
else
|
||||
render json: {rejected: true}
|
||||
end
|
||||
end
|
||||
|
||||
# GET /user/current_list.json
|
||||
# Information about the currently active list
|
||||
# This information includes detailed order information
|
||||
def active_list
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
redirect_to(user_root_path, alert: t('messages.there_is_no_list_active')) and return unless list.present?
|
||||
end
|
||||
format.json do
|
||||
render json: js_alert(t('messages.the_list_has_been_closed')) and return unless list.present?
|
||||
render json: list.with_orders_and_join_requests_and_supplier_info_as_json
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# GET /user/list_info.json
|
||||
# Information about the currently active list
|
||||
# Fast version to verify wether the is is still currently active
|
||||
# for handle_active_list
|
||||
def list_info
|
||||
respond_to do |format|
|
||||
format.json do
|
||||
if list.present?
|
||||
if !list.try(:active?)
|
||||
current_user.list_is_closed!
|
||||
render json: json_response(list_active: false)
|
||||
return
|
||||
else
|
||||
render json: json_response(list.serialized_with_status_join_requests_and_supplier_counters)
|
||||
end
|
||||
else
|
||||
render json: json_response(not_present: true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def feedback
|
||||
user_feedback = UserFeedback.create(user_id: current_user.id, content: params[:feedback].to_s)
|
||||
Notifier.user_feedback(user_feedback.id).deliver_later
|
||||
render json: {}
|
||||
end
|
||||
|
||||
##
|
||||
# Displays the closed lists of the user
|
||||
# GET /user/list_history
|
||||
#def list_history
|
||||
#respond_to do |format|
|
||||
#format.html {}
|
||||
#format.json do
|
||||
#@lists = List.for_user(current_user, page: params[:page], per_page: params[:per_page].presence || 14)
|
||||
#@lists.include_relation(:supplier)
|
||||
#render json: @lists.inject(lists: [], current_page: @lists.current_page, num_pages: @lists.num_pages, total_count: @lists.total_count){|h, l| h[:lists] << l.as_json.merge(supplier_name: l.supplier.name); h}
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
|
||||
##
|
||||
# Displays a closed list of the user
|
||||
# GET /user/list_history/:list_id
|
||||
#def history_list
|
||||
#respond_to do |format|
|
||||
#format.html do
|
||||
#end
|
||||
#format.json do
|
||||
#@list = List.find(params[:list_id])
|
||||
#render json: json_alert('messages.illegal_history_list_attempt') and return unless @list.user_ids.include?(current_user.id)
|
||||
#if params[:list_closed].present? && current_user.active_list_id == @list.id
|
||||
#current_user.list_is_closed!
|
||||
#flash.now[:notice] = t('messages.the_list_has_been_closed', list: List.model_name.human)
|
||||
#end
|
||||
#render json: @list.with_orders_as_json.merge(supplier_name: @list.supplier.name)
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
|
||||
|
||||
# POST /user/order_selected_products.json
|
||||
#def order_selected_products
|
||||
#if list.present?
|
||||
#@list = list
|
||||
#else
|
||||
#render json: json_alert('messages.table_not_found') and return unless params[:table_id].present?
|
||||
#@table = Table.find(params[:table_id])
|
||||
#if @table.occupied?
|
||||
#render json: json_alert('messages.table_is_occupied', location: :join_occupied_table, location_params: {table_id: @table.id})
|
||||
#else
|
||||
#if @list = List.from_table( @table, current_user )
|
||||
#else
|
||||
##TODO handle second list creation for user
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#respond_to do |format|
|
||||
#format.html do
|
||||
#redirect_to(user_root_path, alert: t('messages.cannot_order_on_non_active_list')) and return unless @list.active?
|
||||
#@list.place_order products: params[:products], user: current_user
|
||||
#redirect_to user_root_path, notice: t('messages.order_is_placed')
|
||||
#end
|
||||
#format.json do
|
||||
#render json: json_alert('messages.cannot_order_on_non_active_list') and return unless @list.active?
|
||||
## Todo, better document and uniform this
|
||||
#@list.place_order products: (params[:order] || params[:products]), user: current_user
|
||||
#render json: json_notice('messages.order_is_placed', location: :active_list)
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
|
||||
def obtain_token
|
||||
redirect_to user_omniauth_authorize_path(params[:provider].presence || 'facebook') and return unless current_user.present?
|
||||
# redirect_to case platform
|
||||
# when 'android' then "file:///android_asset/user/index.html?user_id=#{current_user.id}&auth_token=#{current_user.authentication_token}"
|
||||
# when
|
||||
# else user_root_path(user_id: current_user.id, auth_token: current_user.authentication_token)
|
||||
# end
|
||||
# return
|
||||
respond_to do |format|
|
||||
format.html { render layout: 'user/obtain_token' }
|
||||
format.json do
|
||||
|
||||
@@ -12,7 +12,6 @@ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
||||
if @user.persisted?
|
||||
flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => @user.provider.to_s.capitalize
|
||||
sign_in @user
|
||||
#redirect_to user_root_path, :event => :authentication, :current_user => @user # infinite loop
|
||||
redirect_to user_obtain_token_path, :event => :authentication, :current_user => @user
|
||||
else
|
||||
session["devise.facebook_data"] = request.env["omniauth.auth"]
|
||||
|
||||
+1
-1
@@ -83,7 +83,7 @@ class User
|
||||
|
||||
# This is the user name as it is shown to the supplier
|
||||
def supplier_name
|
||||
auth_data['info']['name'] rescue I18n.t('supplier.unknown_user_name')
|
||||
auth_data['info']['name'] rescue I18n.t('supplier.user.unknown_name')
|
||||
end
|
||||
|
||||
# This is the user name as it is shown to other users
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
= top_bar title: 'active_list.title' do
|
||||
.pull-right
|
||||
.supplier-info-row
|
||||
.table-number
|
||||
.supplier-name
|
||||
.supplier-info-row
|
||||
.counter.supplier-orders-placed-count
|
||||
.counter.supplier-orders-in-process-count
|
||||
.action-buttons
|
||||
= link_to content_tag(:span, t('helpers.links.place_order')), user_list_products_path, class: ['user-top-button'], id: 'place-order-on-list'
|
||||
span#list-needs-payment-button.user-top-button
|
||||
span
|
||||
span#list-needs-help-button.user-top-button
|
||||
span
|
||||
.well
|
||||
table#active-list-table.table
|
||||
thead
|
||||
tr
|
||||
th data-t="models.order" = Order.model_name.human
|
||||
th.currency data-t="attributes.product.price" = Product.human_attribute_name(:price)
|
||||
tbody
|
||||
tr
|
||||
td colspan=2 = slider_image
|
||||
tfoot
|
||||
tr
|
||||
td
|
||||
td.currency
|
||||
strong.list-total-amount
|
||||
script#active-list-order-template[type="text/html"]= mustache_template 'active_list_order'
|
||||
- content_for :footer do
|
||||
javascript:
|
||||
jQuery(function(){
|
||||
Quser.load_active_list();
|
||||
Quser.watch_events();
|
||||
//setInterval( "Quser.load_active_list()", 7500);
|
||||
})
|
||||
@@ -1,31 +0,0 @@
|
||||
= top_bar title: 'history_list.title' do
|
||||
.pull-right
|
||||
.table-number
|
||||
.supplier-name
|
||||
table.table.table-condensed
|
||||
tbody
|
||||
tr
|
||||
td.key data-t="attributes.list.created_at" = List.human_attribute_name(:created_at)
|
||||
td.value.list-created-at
|
||||
tr
|
||||
td.key data-t="attributes.list.closed_at" = List.human_attribute_name(:closed_at)
|
||||
td.value.list-closed-at
|
||||
tr
|
||||
td.key data-t="models.supplier" = Supplier.model_name.human
|
||||
td.value.supplier-name
|
||||
.well
|
||||
table#history-list-table.table.list-table
|
||||
thead
|
||||
tr
|
||||
th data-t="models.order" = Order.model_name.human
|
||||
th.currency data-t="attributes.product.price" = Product.human_attribute_name(:price)
|
||||
tbody
|
||||
tr
|
||||
td colspan=2 = slider_image
|
||||
tfoot
|
||||
tr
|
||||
td
|
||||
td.currency
|
||||
strong.list-total-amount
|
||||
script#active-list-order-template[type="text/html"]= render 'active_list_order.mustache'
|
||||
- onload_javascript "Quser.load_history_list()"
|
||||
@@ -1,10 +0,0 @@
|
||||
.page-header
|
||||
h4 data-t="join_request.requestor.title" = t('user.join_occupied_table.title')
|
||||
.form-actions
|
||||
= link_to t('user.join_occupied_table.back'), user_root_path, class: :btn, data: {t: 'join_request.requestor.go_back'}
|
||||
'
|
||||
button.btn.btn-primary.show-menu-button onclick="Quser.show_table_products()" data-t='join_request.requestor.show_the_products'= t('user.join_occupied_table.show_the_products')
|
||||
'
|
||||
button.btn.btn-warning.join-table-button onClick="Quser.join_occupied_table()" data-t='join_request.requestor.join_this_table'= t('user.join_occupied_table.join_this_table')
|
||||
#join-occupied-table-progress-container
|
||||
- onload_javascript 'Quser.watch_events()'
|
||||
@@ -1,6 +0,0 @@
|
||||
= top_bar title: 'list_history.title' do
|
||||
span
|
||||
nav.pagination
|
||||
ul#list-history-container
|
||||
script#list-history-template[type="text/html"]= mustache_template 'list_history'
|
||||
- onload_javascript "Qstorage.page = 1; Quser.load_list_history()"
|
||||
@@ -1,18 +0,0 @@
|
||||
= top_bar title: 'show_products.title' do
|
||||
.pull-right
|
||||
.supplier-info-row
|
||||
.table-number
|
||||
.supplier-name
|
||||
.supplier-info-row
|
||||
.counter.supplier-orders-placed-count
|
||||
.counter.supplier-orders-in-process-count
|
||||
.well
|
||||
table#products-table.table.table-hover
|
||||
tbody
|
||||
tr
|
||||
td= slider_image
|
||||
#active-order-container
|
||||
script#products-category-template[type="text/html"]= mustache_template 'products_category'
|
||||
script#products-category-for-order-template[type="text/html"]= mustache_template 'products_category_for_order'
|
||||
script#active-order-template[type="text/html"]= mustache_template 'active_order'
|
||||
- onload_javascript 'Quser.load_table_products()'
|
||||
@@ -62,6 +62,7 @@ en:
|
||||
needs_help: Needs attention
|
||||
needs_payment: Wants to pay
|
||||
closed_at: Closed at
|
||||
price: Total
|
||||
section:
|
||||
title: Title
|
||||
width: Width
|
||||
@@ -93,10 +94,11 @@ en:
|
||||
width: Width
|
||||
height: Height
|
||||
user:
|
||||
email: 'E-mail'
|
||||
name: Name
|
||||
email: E-mail
|
||||
employee:
|
||||
name: Name
|
||||
email: 'E-mail'
|
||||
email: E-mail
|
||||
manager: 'Manager?'
|
||||
active: 'Active?'
|
||||
color: Color
|
||||
|
||||
@@ -60,7 +60,7 @@ nl:
|
||||
needs_help: Vraag actief
|
||||
needs_payment: Rekening gevraagd
|
||||
closed_at: Afgesloten op
|
||||
price: Prijs
|
||||
price: Totaal
|
||||
section:
|
||||
title: Titel
|
||||
width: Breedte
|
||||
@@ -92,6 +92,7 @@ nl:
|
||||
width: Breedte
|
||||
height: Hoogte
|
||||
user:
|
||||
name: Naam
|
||||
email: 'E-mail'
|
||||
employee:
|
||||
name: Naam
|
||||
|
||||
@@ -21,7 +21,7 @@ en:
|
||||
dashboard:
|
||||
title: Dashboard
|
||||
active_lists:
|
||||
no_lists: No active ${models.list|downcase}
|
||||
no_lists: No active ${models.plural.list|downcase}
|
||||
active_orders:
|
||||
no_orders: No active ${models.plural.order|downcase}
|
||||
top_menu:
|
||||
@@ -200,6 +200,8 @@ en:
|
||||
title: Change the ${models.table} of the ${models.list}
|
||||
subtitle: 'The current ${model.table} number is # %{current_table_number}'
|
||||
close_button: Close
|
||||
user_info:
|
||||
title: ${models.user} info
|
||||
supplier_status_info:
|
||||
title: "%{name} info"
|
||||
header: The icons at the top right corner contain information about the current orders
|
||||
@@ -254,4 +256,6 @@ en:
|
||||
link: My schedule
|
||||
schedule:
|
||||
title: Schedule for %{name}
|
||||
unknown_user_name: "?"
|
||||
user:
|
||||
unknown_name: '?'
|
||||
number_of_lists_at_supplier: Number of ${models.plural.list} at your place
|
||||
|
||||
@@ -201,6 +201,8 @@ nl:
|
||||
title: Verander de ${models.table} van de ${models.list}
|
||||
subtitle: 'De huidige ${model.table} is # %{current_table_number}'
|
||||
close_button: Sluiten
|
||||
user_info:
|
||||
title: ${models.user} informatie
|
||||
supplier_status_info:
|
||||
title: "%{name} info"
|
||||
header: The icons at the top right corner contain information about the current orders
|
||||
@@ -255,4 +257,6 @@ nl:
|
||||
link: Mijn schema
|
||||
schedule:
|
||||
title: Schema voor %{name}
|
||||
unknown_user_name: "?"
|
||||
user:
|
||||
unknown_name: '?'
|
||||
number_of_lists_at_supplier: Aantal ${models.plural.list} hier
|
||||
|
||||
+1
-4
@@ -57,7 +57,6 @@ Qwaiter::Application.routes.draw do
|
||||
#get '/user/index' => 'user#index', as: :user_root
|
||||
#get '/user/index.html#' => 'user#index', as: :user_root
|
||||
#get '/user/active_list(.:format)' => 'user#active_list', as: :user_active_list
|
||||
#get '/user/list_info' => 'user#list_info', as: :user_list_info, via: [:get, :options]
|
||||
#post '/user/needs_help' => 'user#needs_help', as: :user_needs_help
|
||||
#post '/user/list_needs_payment' => 'user#list_needs_payment', as: :user_list_needs_payment
|
||||
#post '/user/create_list' => 'user#create_list', as: :user_create_list
|
||||
@@ -73,8 +72,6 @@ Qwaiter::Application.routes.draw do
|
||||
#post '/user/reject_join_request' => 'user#reject_join_request'
|
||||
#post '/user/approve_join_request' => 'user#approve_join_request'
|
||||
|
||||
|
||||
#post '/user/check_table_join_status' => 'user#check_table_join_status'
|
||||
get '/user/obtain_token' => 'user#obtain_token', as: :user_obtain_token
|
||||
#post '/user/obtain_token' => 'user#obtain_token', constraints: {format: :json}
|
||||
get '/close_window' => 'dashboard#close_window'
|
||||
@@ -208,7 +205,7 @@ Qwaiter::Application.routes.draw do
|
||||
#devise_scope :supplier do
|
||||
#get '/:locale/suppliers/sign_up' => 'registrations#new', constraints: {locale: ALLOWED_LOCALES}
|
||||
#end
|
||||
scope '(/:locale)', constraints: {locale: ALLOWED_LOCALES}, defaults: { locale: Rails.application.config.i18n.default_locale } do
|
||||
scope '(/:locale)', constraints: {locale: ALLOWED_LOCALES}, defaults: { locale: Rails.application.config.i18n.default_locale.to_s } do
|
||||
root to: 'pages#home'
|
||||
resources :contact_forms, only: [:create]
|
||||
resources :new_suppliers
|
||||
|
||||
@@ -8,7 +8,7 @@ Feature: Manage employees
|
||||
And I click on selector '.new-employee-button'
|
||||
And the supplier emloyee sets the 'name' to 'New employee' in the employee popup
|
||||
And the supplier emloyee sets the 'email' to 'new-employee@example.com' in the employee popup
|
||||
And I click on selector '.form-row.manager .switch'
|
||||
And I click on selector '.form-row.manager label'
|
||||
And I click on selector '.modal-confirm'
|
||||
And I wait 1 second
|
||||
Then the new employee should be added to the supplier
|
||||
@@ -23,14 +23,14 @@ Feature: Manage employees
|
||||
And I click on selector '.new-employee-button'
|
||||
And the supplier emloyee sets the 'name' to 'Existing employee' in the employee popup
|
||||
And the supplier emloyee sets the 'email' to 'existing-employee@example.com' in the employee popup
|
||||
And I click on selector '.form-row.manager .switch'
|
||||
And I click on selector '.form-row.manager label'
|
||||
And I click on selector '.modal-confirm'
|
||||
And the supplier employee clicks on the existing employee table destroy button
|
||||
And I click on selector '.modal-confirm'
|
||||
And I click on selector '.new-employee-button'
|
||||
And the supplier emloyee sets the 'name' to 'Existing employee readded' in the employee popup
|
||||
And the supplier emloyee sets the 'email' to 'existing-employee@example.com' in the employee popup
|
||||
And I click on selector '.form-row.active .switch'
|
||||
And I click on selector '.form-row.active label'
|
||||
And I click on selector '.modal-confirm'
|
||||
And I wait 1 second
|
||||
Then the new employee should be re-added to the supplier as non manager non active
|
||||
|
||||
@@ -19,3 +19,6 @@ Feature: Adding product category
|
||||
#And the supplier clicks on the tuesday and wednesday buttons selecting wednesday as active day
|
||||
#And the supplier submits the product category form
|
||||
#Then the the product category is active on wednesday and only linked to the last product
|
||||
|
||||
#@javascript
|
||||
#Scenario: Setting a day for which the product category is active from false to true
|
||||
|
||||
@@ -52,7 +52,7 @@ end
|
||||
|
||||
step "the supplier dashboard list should display the updated price" do
|
||||
sleep 0.5
|
||||
el = find(".list-row-#{@list.id} .total_list_amount")
|
||||
el = find(".list-row-#{@list.id} .currency")
|
||||
# original order is 3 * 2.11 = 6.33
|
||||
# new order price = 5 * 2.22 = 11.10
|
||||
# therefore the updated price should be 17.43
|
||||
@@ -61,21 +61,21 @@ end
|
||||
|
||||
step "the new order should be present in the supplier dashboard" do
|
||||
el = find(".order-row-#{@new_order.id}")
|
||||
el.find('.table_number').text.should == @table.number.to_s
|
||||
el.find('.section_title').text.should == @section.title
|
||||
el.find('.table-number').text.should == "# #{@table.number}"
|
||||
el.find('.link-to-section').text.should == @section.title
|
||||
end
|
||||
|
||||
step "the new order on a table in another section should be present in the supplier dashboard" do
|
||||
el = find(".order-row-#{@new_order.id}")
|
||||
el.find('.table_number').text.should == @other_table.number.to_s
|
||||
el.find('.section_title').text.should == @other_section.title
|
||||
el.find('.table-number').text.should == "# #{@other_table.number}"
|
||||
el.find('.link-to-section').text.should == @other_section.title
|
||||
end
|
||||
|
||||
step "the new list should appear in the supplier dashboard" do
|
||||
el = find(".list-row-#{@new_list.id}")
|
||||
el.find('.total_list_amount').text.should =~ /6.66/
|
||||
el.find('.section_title').text.should == @other_section.title
|
||||
el.find('.table_number').text.should == @other_table.number.to_s
|
||||
el.find('.currency').text.should =~ /6.66/
|
||||
el.find('.link-to-section').text.should == @other_section.title
|
||||
el.find('.table-number').text.should == "# #{@other_table.number}"
|
||||
end
|
||||
|
||||
step "I click on the close list button in the supplier dashboard" do
|
||||
@@ -133,13 +133,13 @@ step "the active list changes to another table in another section" do
|
||||
end
|
||||
|
||||
step "the supplier main board table number should be updated to the new table number" do
|
||||
expect( find(".list-row-#{@list.id} .table_number").text ).to eq "65"
|
||||
expect( find(".order-row-#{@list.orders.first.id} .table_number").text ).to eq "65"
|
||||
expect( find(".list-row-#{@list.id} .table-number").text ).to eq "# 65"
|
||||
expect( find(".order-row-#{@list.orders.first.id} .table-number").text ).to eq "65"
|
||||
end
|
||||
|
||||
step "the supplier main board section name should be updated to the new section" do
|
||||
expect( find(".list-row-#{@list.id} .section_title").text ).to eq "New Section"
|
||||
expect( find(".order-row-#{@list.orders.first.id} .section_title").text ).to eq "New Section"
|
||||
expect( find(".list-row-#{@list.id} .link-to-section").text ).to eq "New Section"
|
||||
expect( find(".order-row-#{@list.orders.first.id} .link-to-section").text ).to eq "New Section"
|
||||
end
|
||||
|
||||
# Marking order as wrong
|
||||
@@ -152,7 +152,7 @@ step "the supplier main board order should not be visible anymore" do
|
||||
end
|
||||
|
||||
step "the supplier main board list total should be updated" do
|
||||
find(".list-row-#{@list.id} .total_list_amount").text.should == "€ 0.00"
|
||||
find(".list-row-#{@list.id} .currency").text.should == "€ 0.00"
|
||||
end
|
||||
|
||||
step "the supplier placed orders counter should be reduced" do
|
||||
|
||||
@@ -23,7 +23,7 @@ step "the supplier emloyee sets the :attribute to :value in the employee popup"
|
||||
end
|
||||
|
||||
step "the supplier emloyee clicks the active switch to deactivate the employee" do
|
||||
js_click '.form-row.active .switch'
|
||||
js_click '.form-row.active label'
|
||||
end
|
||||
|
||||
step "the other employee should no longer be active for the current supplier" do
|
||||
|
||||
@@ -7,7 +7,12 @@ step "the supplier fills in the new product category form selecting not availabl
|
||||
# default all days on, so click on tuesday deactivates it
|
||||
within '.modal' do
|
||||
js_set_field '.form-row.name input', 'New product category'
|
||||
find('.form-row.tuesday .switch').click
|
||||
find('.form-row.tuesday label').click
|
||||
js_click '.toggle-full-day-button'
|
||||
js_set_field '.select-start_from .hour-of-day select', '08'
|
||||
js_set_field '.select-start_from .minute-of-hour select', '20'
|
||||
js_set_field '.select-end_on .hour-of-day select', '12'
|
||||
js_set_field '.select-end_on .minute-of-hour select', '30'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -19,7 +24,9 @@ step "then new product category with proper properties should have been created"
|
||||
sleep 1
|
||||
@product_category = ProductCategory.find_by_name 'New product category'
|
||||
#@product_category.week_days.should == [0, 0, 1, 0, 0, 0, 0]
|
||||
@product_category.full_day.should be true
|
||||
@product_category.full_day.should be false
|
||||
@product_category.start_from.should be 500 # 8:20
|
||||
@product_category.end_on.should be 750 # 12:30
|
||||
expect( @product_category.active_on_monday ).to be true
|
||||
expect( @product_category.active_on_tuesday ).to be false
|
||||
expect( @product_category.active_on_wednesday ).to be true
|
||||
|
||||
@@ -10,7 +10,7 @@ describe User do
|
||||
end
|
||||
|
||||
it 'falls back to unkown if not present' do
|
||||
user.supplier_name.should == I18n.t('supplier.unknown_user_name')
|
||||
user.supplier_name.should == I18n.t('supplier.user.unkown_name')
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
require "spec_helper"
|
||||
|
||||
describe "routing", type: :routing do
|
||||
it('roots to pages#home'){get('/').should route_to('pages#home', locale: 'en')}
|
||||
it('roots to pages#home'){get('/').should route_to('pages#home', locale: 'nl')}
|
||||
it('roots to pages#home for en locale'){get('/en').should route_to('pages#home', locale: 'en')}
|
||||
it('roots to pages#home for nl locale'){get('/nl').should route_to('pages#home', locale: 'nl')}
|
||||
it('handles about page as root'){ get('/about').should route_to('pages#show', name: 'about', locale: 'en')}
|
||||
it('handles about page as root'){ get('/about').should route_to('pages#show', name: 'about', locale: 'nl')}
|
||||
it('handles about page in nl'){ get('/nl/about').should route_to('pages#show', name: 'about', locale: 'nl')}
|
||||
it('handles about page in en'){ get('/en/about').should route_to('pages#show', name: 'about', locale: 'en')}
|
||||
end
|
||||
|
||||
@@ -23,7 +23,7 @@ module Features
|
||||
|
||||
def user_visit(path)
|
||||
#visit File.join("http://localhost:3/")
|
||||
visit File.join(user_root_path, path)
|
||||
visit File.join("/user/index.html#/", path)
|
||||
end
|
||||
|
||||
def login_employee_as(email)
|
||||
|
||||
@@ -11,6 +11,7 @@ Release todos:
|
||||
|
||||
Supplier
|
||||
--------
|
||||
- Test new product_category creation
|
||||
- Better message when signing up and already logged in, give link to go
|
||||
to current supplier!!!
|
||||
- fix page-body template compile view
|
||||
@@ -29,6 +30,7 @@ Supplier
|
||||
- Testing
|
||||
- Change list table
|
||||
- Set product_category day from false to true
|
||||
- Go to list from dashboard (targetObject.targetObject stupidity)
|
||||
- Product order check for product being active
|
||||
- Add product_variant price_difference
|
||||
|
||||
|
||||
Reference in New Issue
Block a user