diff --git a/src/pretix/presale/views/widget.py b/src/pretix/presale/views/widget.py index 6588d78076..c0b6cbc449 100644 --- a/src/pretix/presale/views/widget.py +++ b/src/pretix/presale/views/widget.py @@ -272,6 +272,7 @@ class WidgetAPIProductList(EventListMixin, View): 'min_price': item.min_price if item.has_variations else None, 'max_price': item.max_price if item.has_variations else None, 'allow_waitinglist': item.allow_waitinglist, + 'mandatory_priced_addons': item.mandatory_priced_addons, 'free_price': item.free_price, 'avail': [ item.cached_availability[0], diff --git a/src/pretix/static/pretixpresale/js/widget/widget.js b/src/pretix/static/pretixpresale/js/widget/widget.js index 247f09c0ce..7c3d1fc2e4 100644 --- a/src/pretix/static/pretixpresale/js/widget/widget.js +++ b/src/pretix/static/pretixpresale/js/widget/widget.js @@ -307,7 +307,8 @@ Vue.component('pricebox', { price: Object, free_price: Boolean, field_name: String, - original_price: String + original_price: String, + mandatory_priced_addons: Boolean, }, computed: { display_price: function () { @@ -329,6 +330,9 @@ Vue.component('pricebox', { }, priceline: function () { if (this.price.gross === "0.00") { + if (this.mandatory_priced_addons) { + return "\xA0"; // nbsp, because an empty string would cause the HTML element to collapse + } return strings.free; } else { return this.$root.currency + " " + this.display_price; @@ -375,7 +379,8 @@ Vue.component('variation', { // Price + '
' - + '' + '' + ' ' @@ -432,6 +437,7 @@ Vue.component('item', { // Price + '
' + '' + '' + '
{{ pricerange }}
' @@ -500,6 +506,9 @@ Vue.component('item', { return this.$root.currency + " " + floatformat(this.item.min_price, 2) + " – " + floatformat(this.item.max_price, 2); } else if (this.item.min_price === "0.00" && this.item.max_price === "0.00") { + if (this.item.mandatory_priced_addons) { + return "\xA0"; // nbsp, because an empty string would cause the HTML element to collapse + } return strings.free; } else { return this.$root.currency + " " + floatformat(this.item.min_price, 2); diff --git a/src/tests/presale/test_widget.py b/src/tests/presale/test_widget.py index 691934b595..9d57e41aa9 100644 --- a/src/tests/presale/test_widget.py +++ b/src/tests/presale/test_widget.py @@ -185,6 +185,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "picture": None, "has_variations": 0, "allow_waitinglist": True, + "mandatory_priced_addons": False, "description": None, "min_price": None, "avail": [100, None], @@ -203,6 +204,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "picture": None, "has_variations": 4, "allow_waitinglist": True, + "mandatory_priced_addons": False, "description": None, "min_price": "12.00", "avail": None, @@ -263,6 +265,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "picture": None, "has_variations": 0, "allow_waitinglist": True, + "mandatory_priced_addons": False, "description": None, "min_price": None, "avail": [100, None], @@ -307,6 +310,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "picture": None, "has_variations": 4, "allow_waitinglist": True, + "mandatory_priced_addons": False, "description": None, "min_price": "12.00", "avail": None, @@ -365,6 +369,7 @@ class WidgetCartTest(CartTestMixin, TestCase): "picture": None, "has_variations": 0, "allow_waitinglist": True, + "mandatory_priced_addons": False, "description": None, "min_price": None, "avail": [100, None], @@ -417,6 +422,7 @@ class WidgetCartTest(CartTestMixin, TestCase): 'description': None, 'has_variations': 2, "allow_waitinglist": True, + "mandatory_priced_addons": False, 'require_voucher': False, 'order_min': None, 'order_max': None,