From 2b0f754f4b7720a3b6b64968ac4ed78bf2b959cc Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 28 Mar 2023 15:14:49 +0200 Subject: [PATCH] Widget: improve accessibility with aria-label and role=button (#3179) Including fixes for previous commit --- .../static/pretixpresale/js/widget/widget.js | 76 ++++++++++++++----- .../static/pretixpresale/scss/widget.scss | 22 +----- 2 files changed, 63 insertions(+), 35 deletions(-) diff --git a/src/pretix/static/pretixpresale/js/widget/widget.js b/src/pretix/static/pretixpresale/js/widget/widget.js index 09f7e8d2e..6e40e0b9d 100644 --- a/src/pretix/static/pretixpresale/js/widget/widget.js +++ b/src/pretix/static/pretixpresale/js/widget/widget.js @@ -14,6 +14,10 @@ var Vue = module.exports; Vue.component('resize-observer', VueResize.ResizeObserver) var strings = { + 'quantity': django.pgettext('widget', 'Quantity'), + 'price': django.pgettext('widget', 'Price'), + 'select_item': django.pgettext('widget', 'Select %s'), + 'select_variant': django.pgettext('widget', 'Select variant %s'), 'sold_out': django.pgettext('widget', 'Sold out'), 'buy': django.pgettext('widget', 'Buy'), 'register': django.pgettext('widget', 'Register'), @@ -194,7 +198,7 @@ var widget_id = makeid(16); Vue.component('availbox', { template: ('
' + '' + '
' @@ -210,10 +214,13 @@ Vue.component('availbox', { + '
' + '
' + '' + '' + '
' + '
'), @@ -252,6 +259,11 @@ Vue.component('availbox', { this.$root.$emit("amounts_changed") } }, + label_select_item: function () { + return this.item.has_variations + ? strings.select_variant.replace("%s", this.variation.value) + : strings.select_item.replace("%s", this.item.name) + }, input_name: function () { if (this.item.has_variations) { return 'variation_' + this.item.id + '_' + this.variation.id; @@ -297,7 +309,7 @@ Vue.component('pricebox', { + '{{ $root.currency }} ' + '' + + ' step="any" aria-label="'+strings.price+'">' + '' + '' + '{{ taxline }}' @@ -418,8 +430,9 @@ Vue.component('item', { + '
' + '' + '
' - + '' + + '' + '{{ item.name }}' + '' + '{{ item.name }}' @@ -446,7 +459,8 @@ Vue.component('item', { // Availability + '' @@ -454,7 +468,7 @@ Vue.component('item', { + '
' // Variations - + '
' + + '
' + '' + '' + '
' @@ -468,6 +482,35 @@ Vue.component('item', { expanded: this.$root.show_variations_expanded }; }, + watch: { + expanded: function (newValue) { + var v = this.$refs.variations; + if (newValue) { + v.hidden = false; + } else { + // Vue.nextTick does not work here + window.setTimeout(function () { + v.style.maxHeight = 0; + }, 50); + } + v.style.maxHeight = v.scrollHeight + 'px'; + } + }, + mounted: function () { + if (this.$refs.variations) { + this.$refs.variations.hidden = !this.expanded; + if (!this.expanded) { + this.$refs.variations.style.maxHeight = '0px'; + } + this.$refs.variations.addEventListener('transitionend', function (event) { + if (this.style.maxHeight && this.style.maxHeight != '0px') { + this.style.maxHeight = 'none'; + } else { + this.hidden = true; + } + }); + } + }, methods: { expand: function () { this.expanded = !this.expanded; @@ -699,14 +742,14 @@ var shared_iframe_fragment = ( + '' + '
' + '
' - + '' + '' + '
' + '
' @@ -1000,7 +1043,7 @@ Vue.component('pretix-widget-event-list-entry', { Vue.component('pretix-widget-event-list', { template: ('
' + '' @@ -1215,7 +1258,7 @@ Vue.component('pretix-widget-event-calendar', { // Back navigation + '' @@ -1228,11 +1271,11 @@ Vue.component('pretix-widget-event-calendar', { // Calendar navigation + '' @@ -1298,7 +1341,7 @@ Vue.component('pretix-widget-event-week-calendar', { template: ('
' // Back navigation + '' @@ -1311,11 +1354,11 @@ Vue.component('pretix-widget-event-week-calendar', { // Calendar navigation + '
' + '' @@ -1962,7 +2005,6 @@ window.PretixWidget.open = function (target_url, voucher, subevent, items, widge if (this.$root.useIframe) { this.$refs.btn.buy(); } else { - console.log(this.$refs.btn.$refs.form); this.$refs.btn.$refs.form.submit(); } }) diff --git a/src/pretix/static/pretixpresale/scss/widget.scss b/src/pretix/static/pretixpresale/scss/widget.scss index 8768b474b..924515814 100644 --- a/src/pretix/static/pretixpresale/scss/widget.scss +++ b/src/pretix/static/pretixpresale/scss/widget.scss @@ -373,7 +373,6 @@ .pretix-widget-item-variations { overflow: hidden; - max-height: 0; padding-top: 0; padding-bottom: 0; margin-top: 0; @@ -382,23 +381,10 @@ -webkit-transition-duration: 0.5s; -o-transition-duration: 0.5s; transition-duration: 0.5s; - -moz-transition-timing-function: cubic-bezier(0, 1, 0.5, 1); - -webkit-transition-timing-function: cubic-bezier(0, 1, 0.5, 1); - -o-transition-timing-function: cubic-bezier(0, 1, 0.5, 1); - transition-timing-function: cubic-bezier(0, 1, 0.5, 1); - } - - .pretix-widget-item-variations-expanded { - -moz-transition-duration: 0.5s; - -webkit-transition-duration: 0.5s; - -o-transition-duration: 0.5s; - transition-duration: 0.5s; - -moz-transition-timing-function: ease-in; - -webkit-transition-timing-function: ease-in; - -o-transition-timing-function: ease-in; - transition-timing-function: ease-in; - max-height: 10000px; - overflow: hidden; + -moz-transition-timing-function: ease-in-out; + -webkit-transition-timing-function: ease-in-out; + -o-transition-timing-function: ease-in-out; + transition-timing-function: ease-in-out; } .pretix-widget-event-header { padding-top: 10px;