diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html
index 2a1b7522a..93e38542d 100644
--- a/src/pretix/control/templates/pretixcontrol/order/index.html
+++ b/src/pretix/control/templates/pretixcontrol/order/index.html
@@ -280,6 +280,10 @@
{% endfor %}
{% endif %}
+
{% eventsignal event "pretix.control.signals.order_position_buttons" order=order position=line request=request %}
{% endif %}
diff --git a/src/pretix/static/pretixcontrol/js/ui/main.js b/src/pretix/static/pretixcontrol/js/ui/main.js
index 431207489..513e0155f 100644
--- a/src/pretix/static/pretixcontrol/js/ui/main.js
+++ b/src/pretix/static/pretixcontrol/js/ui/main.js
@@ -614,6 +614,36 @@ $(function () {
return false;
});
+ $("button[data-toggle=qrcode]").click(function (e) {
+ e.preventDefault();
+ var $current = $(".qr-code-overlay[data-qrcode=" + $(this).attr("data-qrcode") + "]");
+ if ($current.length) {
+ $(".qr-code-overlay").attr("data-qrcode", "").slideUp(200);
+ return false;
+ }
+ $(".qr-code-overlay").remove();
+ var $div = $("
").addClass("qr-code-overlay").attr("data-qrcode", $(this).attr("data-qrcode"));
+ $div.appendTo($("body"));
+ var offset = $(this).offset();
+ $div.css("top", offset.top + $(this).outerHeight() + 10).css("left", offset.left);
+ var $child = $("
");
+ $child.appendTo($div);
+ $child.qrcode(
+ {
+ text: $(this).attr("data-qrcode"),
+ correctLevel: 0, // M
+ width: 196,
+ height: 196
+ }
+ );
+ $div.append(gettext("Click to close"));
+ $div.slideDown(200);
+ $div.click(function (e) {
+ $(".qr-code-overlay").slideUp(200);
+ });
+ return false;
+ });
+
$("#ajaxerr").on("click", ".ajaxerr-close", ajaxErrDialog.hide);
moment.locale($("body").attr("data-datetimelocale"));
});
diff --git a/src/pretix/static/pretixcontrol/scss/main.scss b/src/pretix/static/pretixcontrol/scss/main.scss
index 0d13d49ae..7ead3e5b6 100644
--- a/src/pretix/static/pretixcontrol/scss/main.scss
+++ b/src/pretix/static/pretixcontrol/scss/main.scss
@@ -608,3 +608,13 @@ details summary {
h1 .label {
display: inline-block;
}
+
+.qr-code-overlay {
+ display: none;
+ position: absolute;
+ padding: 30px;
+ background: white;
+ text-align: center;
+ border-radius: $border-radius-small;
+ box-shadow: 0 7px 14px 0 rgba(78, 50, 92, 0.1),0 3px 6px 0 rgba(0,0,0,.07);
+}