Move some custorder logic to handler; allow force-swap of product selection
This commit is contained in:
parent
b0fa559760
commit
4d33e3dcbe
|
@ -32,10 +32,17 @@ const TailboneAutocomplete = {
|
|||
// allows for the "label" to display correctly as well
|
||||
initialLabel: String,
|
||||
|
||||
// TODO: i am not sure this is needed? but current logic does
|
||||
// handle it specially, so am leaving for now. if this prop
|
||||
// is set by the caller, then the `assignedLabel` will *always*
|
||||
// be shown for the button (when "selection" has been made)
|
||||
// while the `initialLabel` above is useful for setting the
|
||||
// *initial* label (of course), it cannot be used to
|
||||
// arbitrarily update the label during the component's life.
|
||||
// if you do need to *update* the label after initial page
|
||||
// load, then you should set `assignedLabel` instead. one
|
||||
// place this happens is in /custorders/create page, where
|
||||
// product autocomplete shows some results, and user clicks
|
||||
// one, but then handler logic can forcibly "swap" the
|
||||
// selection, causing *different* product data to come back
|
||||
// from the server, and autocomplete label should be updated
|
||||
// to match. this feels a bit awkward still but does work..
|
||||
assignedLabel: String,
|
||||
|
||||
// simple placeholder text for the input box
|
||||
|
|
|
@ -511,7 +511,7 @@
|
|||
<tailbone-autocomplete ref="productAutocomplete"
|
||||
v-model="productUUID"
|
||||
placeholder="Enter UPC or brand, description etc."
|
||||
:initial-label="productDisplay"
|
||||
:assigned-label="productDisplay"
|
||||
serviceUrl="${url('{}.product_autocomplete'.format(route_prefix))}"
|
||||
@input="productChanged">
|
||||
</tailbone-autocomplete>
|
||||
|
@ -1368,12 +1368,18 @@
|
|||
|
||||
productChanged(uuid) {
|
||||
if (uuid) {
|
||||
this.productUUID = uuid
|
||||
let params = {
|
||||
action: 'get_product_info',
|
||||
uuid: this.productUUID,
|
||||
uuid: uuid,
|
||||
}
|
||||
// nb. it is possible for the handler to "swap"
|
||||
// the product selection, i.e. user chooses a "per
|
||||
// LB" item but the handler only allows selling by
|
||||
// the "case" item. so we do not assume the uuid
|
||||
// received above is the correct one, but just use
|
||||
// whatever came back from handler
|
||||
this.submitBatchData(params, response => {
|
||||
this.productUUID = response.data.uuid
|
||||
this.productUPC = response.data.upc_pretty
|
||||
this.productKey = response.data.key
|
||||
this.productDisplay = response.data.full_description
|
||||
|
|
|
@ -551,61 +551,12 @@ class CustomerOrderView(MasterView):
|
|||
return self.info_for_product(batch, data, product)
|
||||
|
||||
def uom_choices_for_product(self, product):
|
||||
choices = []
|
||||
|
||||
# Each
|
||||
if not product or not product.weighed:
|
||||
unit_name = self.enum.UNIT_OF_MEASURE[self.enum.UNIT_OF_MEASURE_EACH]
|
||||
choices.append({'key': self.enum.UNIT_OF_MEASURE_EACH,
|
||||
'value': unit_name})
|
||||
|
||||
# Pound
|
||||
if not product or product.weighed:
|
||||
unit_name = self.enum.UNIT_OF_MEASURE[self.enum.UNIT_OF_MEASURE_POUND]
|
||||
choices.append({
|
||||
'key': self.enum.UNIT_OF_MEASURE_POUND,
|
||||
'value': unit_name,
|
||||
})
|
||||
|
||||
# Case
|
||||
case_text = None
|
||||
case_size = self.handler.get_case_size_for_product(product)
|
||||
if case_size is None:
|
||||
case_text = "{} (× ?? {})".format(
|
||||
self.enum.UNIT_OF_MEASURE[self.enum.UNIT_OF_MEASURE_CASE],
|
||||
unit_name)
|
||||
elif case_size > 1:
|
||||
case_text = "{} (× {} {})".format(
|
||||
self.enum.UNIT_OF_MEASURE[self.enum.UNIT_OF_MEASURE_CASE],
|
||||
pretty_quantity(case_size),
|
||||
unit_name)
|
||||
if case_text:
|
||||
choices.append({'key': self.enum.UNIT_OF_MEASURE_CASE,
|
||||
'value': case_text})
|
||||
|
||||
return choices
|
||||
return self.handler.uom_choices_for_product(product)
|
||||
|
||||
def info_for_product(self, batch, data, product):
|
||||
app = self.get_rattail_app()
|
||||
products = app.get_products_handler()
|
||||
data = {
|
||||
'uuid': product.uuid,
|
||||
'upc': six.text_type(product.upc),
|
||||
'upc_pretty': product.upc.pretty(),
|
||||
'unit_price_display': self.get_unit_price_display(product),
|
||||
'full_description': product.full_description,
|
||||
'url': self.request.route_url('products.view', uuid=product.uuid),
|
||||
'image_url': products.get_image_url(product),
|
||||
'uom_choices': self.uom_choices_for_product(product),
|
||||
}
|
||||
|
||||
key = self.rattail_config.product_key()
|
||||
if key == 'upc':
|
||||
data['key'] = data['upc_pretty']
|
||||
else:
|
||||
data['key'] = getattr(product, key, data['upc_pretty'])
|
||||
|
||||
return data
|
||||
info = self.handler.get_product_info(batch, product)
|
||||
info['url'] = self.request.route_url('products.view', uuid=info['uuid'])
|
||||
return info
|
||||
|
||||
def normalize_batch(self, batch):
|
||||
return {
|
||||
|
|
Loading…
Reference in a new issue