diff --git a/src/pretix/control/templates/pretixcontrol/event/dashboard_widget_welcome.html b/src/pretix/control/templates/pretixcontrol/event/dashboard_widget_welcome.html
new file mode 100644
index 0000000000..33b860b58b
--- /dev/null
+++ b/src/pretix/control/templates/pretixcontrol/event/dashboard_widget_welcome.html
@@ -0,0 +1,12 @@
+
+
{{ title }}
+ {% if subtitle %}
+
{{ subtitle }}
+ {% endif %}
+ {% if text %}
+
{{ text }}
+ {% endif %}
+ {% if button_text %}
+
{{ button_text }}
+ {% endif %}
+
\ No newline at end of file
diff --git a/src/pretix/control/views/dashboards.py b/src/pretix/control/views/dashboards.py
index cf6b293405..fc38fcc8be 100644
--- a/src/pretix/control/views/dashboards.py
+++ b/src/pretix/control/views/dashboards.py
@@ -4,6 +4,7 @@ from django.core.urlresolvers import reverse
from django.db.models import Sum
from django.dispatch import receiver
from django.shortcuts import render
+from django.template.loader import get_template
from django.utils import formats
from django.utils.formats import date_format
from django.utils.translation import ugettext_lazy as _
@@ -110,6 +111,40 @@ def shop_state_widget(sender, **kwargs):
}]
+@receiver(signal=event_dashboard_widgets)
+def welcome_wizard_widget(sender, **kwargs):
+ template = get_template('pretixcontrol/event/dashboard_widget_welcome.html')
+ ctx = {
+ 'title': _('Welcome to pretix!')
+ }
+ kwargs = {'event': sender.slug, 'organizer': sender.organizer.slug}
+
+ if not sender.items.exists():
+ ctx.update({
+ 'subtitle': _('Get started by creating a product'),
+ 'text': _('The first thing you need for selling tickets to your conference is one or more "products" your '
+ 'participants can choose from. A product can be a ticket or anything else that you want to sell, '
+ 'e.g. additional merchandise in form of t-shirts.'),
+ 'button_text': _('Create a first product'),
+ 'button_url': reverse('control:event.items.add', kwargs=kwargs)
+ })
+ elif not sender.quotas.exists():
+ ctx.update({
+ 'subtitle': _('Create quotas that apply to your products'),
+ 'text': _('Your tickets will only be available for sale if you create a matching quota, i.e. if you tell '
+ 'pretix how many tickets it should sell for your event.'),
+ 'button_text': _('Create a first quota'),
+ 'button_url': reverse('control:event.items.quotas.add', kwargs=kwargs)
+ })
+ else:
+ return []
+ return [{
+ 'width': 12,
+ 'priority': 2000,
+ 'content': template.render(ctx)
+ }]
+
+
def event_index(request, organizer, event):
widgets = []
for r, result in event_dashboard_widgets.send(sender=request.event):
diff --git a/src/static/pretixcontrol/scss/_dashboard.scss b/src/static/pretixcontrol/scss/_dashboard.scss
new file mode 100644
index 0000000000..a895ccf695
--- /dev/null
+++ b/src/static/pretixcontrol/scss/_dashboard.scss
@@ -0,0 +1,79 @@
+.dashboard-panels .panel-heading .fa {
+ opacity: 0.5;
+}
+.dashboard > div {
+ padding: 5px;
+}
+.dashboard .widget {
+ min-height: 160px;
+ background: #F8F8F8;
+ display: block;
+ position: relative;
+}
+.dashboard .widget:hover,.dashboard .widget:focus {
+ background: #EEEEEE;
+ text-decoration: none;
+}
+.dashboard .numwidget {
+ .num {
+ display: block;
+ padding: 28px 0 10px;
+ text-align: center;
+ font-size: 40px;
+ }
+ .text {
+ display: block;
+ text-align: center;
+ font-size: 20px;
+ }
+}
+.dashboard .shopstate {
+ text-align: center;
+ padding: 36px 0;
+
+ span.live, span.off {
+ display: block;
+ font-size: 20px;
+ padding: 10px 0;
+ }
+ span.live {
+ color: $brand-success;
+ }
+ span.off {
+ color: $brand-danger;
+ }
+}
+.dashboard .event {
+ text-align: center;
+ padding: 30px;
+ font-size: 20px;
+
+ span.from, span.to {
+ display: block;
+ font-size: 25px;
+ }
+}
+.dashboard .newevent {
+ text-align: center;
+ padding: 30px;
+ font-size: 20px;
+
+ span.fa {
+ display: block;
+ font-size: 60px;
+ padding-bottom: 15px;
+ }
+}
+.dashboard .welcome-wizard {
+ padding: 30px;
+ h3 {
+ margin: 0 0 10px 0;
+ }
+ .attentionline {
+ font-size: 18px;
+ margin: 0 0 10px 0;
+ }
+ p:last-child {
+ margin-bottom: 0;
+ }
+}
diff --git a/src/static/pretixcontrol/scss/main.scss b/src/static/pretixcontrol/scss/main.scss
index 3ffaa40f26..ff384797f9 100644
--- a/src/static/pretixcontrol/scss/main.scss
+++ b/src/static/pretixcontrol/scss/main.scss
@@ -7,6 +7,7 @@ $fa-font-path: static("fontawesome/fonts");
@import "_forms.scss";
@import "_flags.scss";
@import "_orders.scss";
+@import "_dashboard.scss";
footer {
text-align: center;
@@ -81,79 +82,12 @@ h1 .btn-sm {
-ms-transform: rotateX(180deg); /* IE 9 */
-webkit-transform: rotateX(180deg); /* Safari and Chrome */
}
-.dashboard-panels .panel-heading .fa {
- opacity: 0.5;
-}
@media (max-width: $screen-sm-max) {
.navbar-nav {
margin-left: 0;
}
}
-.dashboard > div {
- padding: 5px;
-}
-.dashboard .widget {
- min-height: 160px;
- background: #F8F8F8;
- display: block;
- position: relative;
-}
-.dashboard .widget:hover,.dashboard .widget:focus {
- background: #EEEEEE;
- text-decoration: none;
-}
-.dashboard .numwidget {
- .num {
- display: block;
- padding: 28px 0 10px;
- text-align: center;
- font-size: 40px;
- }
- .text {
- display: block;
- text-align: center;
- font-size: 20px;
- }
-}
-.dashboard .shopstate {
- text-align: center;
- padding: 36px 0;
-
- span.live, span.off {
- display: block;
- font-size: 20px;
- padding: 10px 0;
- }
- span.live {
- color: $brand-success;
- }
- span.off {
- color: $brand-danger;
- }
-}
-.dashboard .event {
- text-align: center;
- padding: 30px;
- font-size: 20px;
-
- span.from, span.to {
- display: block;
- font-size: 25px;
- }
-}
-.dashboard .newevent {
- text-align: center;
- padding: 30px;
- font-size: 20px;
-
- span.fa {
- display: block;
- font-size: 60px;
- padding-bottom: 15px;
- }
-
-}
.helper-display-inline {
display: inline !important;