+
{% for day in days %}
diff --git a/src/pretix/presale/views/event.py b/src/pretix/presale/views/event.py
index 4d48902d75..a7cff433eb 100644
--- a/src/pretix/presale/views/event.py
+++ b/src/pretix/presale/views/event.py
@@ -356,6 +356,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
after,
future_only=self.request.event.settings.event_calendar_future_only
)
+ context['any_events'] = any(ebd)
elif context['list_type'] == "week":
self._set_week_year()
tz = self.request.event.timezone
@@ -430,6 +431,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
after,
future_only=self.request.event.settings.event_calendar_future_only
)
+ context['any_events'] = any(ebd)
else:
subevents = self.request.event.subevents_sorted(
filter_qs_by_attr(
diff --git a/src/pretix/presale/views/widget.py b/src/pretix/presale/views/widget.py
index 61fee33dfe..553e484581 100644
--- a/src/pretix/presale/views/widget.py
+++ b/src/pretix/presale/views/widget.py
@@ -635,6 +635,8 @@ class WidgetAPIProductList(EventListMixin, View):
cart_namespace=kwargs.get('cart_namespace'),
sales_channel=self.request.sales_channel,
)
+ if not any(ebd):
+ data['empty_text'] = str(rich_text(request.event.settings.event_list_empty_text, safelinks=False))
else:
timezones = set()
add_events_for_days(
@@ -702,6 +704,8 @@ class WidgetAPIProductList(EventListMixin, View):
cart_namespace=kwargs.get('cart_namespace'),
sales_channel=self.request.sales_channel,
)
+ if not any(ebd):
+ data['empty_text'] = str(rich_text(request.event.settings.event_list_empty_text, safelinks=False))
else:
timezones = set()
add_events_for_days(
@@ -772,6 +776,8 @@ class WidgetAPIProductList(EventListMixin, View):
'subevent': ev.pk,
} for ev in evs
]
+ if not data['events']:
+ data['empty_text'] = str(rich_text(request.event.settings.event_list_empty_text, safelinks=False))
else:
data['events'] = []
qs = self._get_event_list_queryset()
diff --git a/src/pretix/static/pretixpresale/scss/_calendar.scss b/src/pretix/static/pretixpresale/scss/_calendar.scss
index 5ff92a785c..4e1fc9ae72 100644
--- a/src/pretix/static/pretixpresale/scss/_calendar.scss
+++ b/src/pretix/static/pretixpresale/scss/_calendar.scss
@@ -1,3 +1,35 @@
+.calendar-container:has(.calendar-empty), .event-list:has(.calendar-empty) {
+ position: relative;
+ overflow: hidden;
+
+ .table-responsive, .week-calendar {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ z-index: 0;
+ }
+
+ .calendar-empty {
+ position: relative;
+ z-index: 100;
+ background: rgba(255, 255, 255, 0.9);
+ text-align: center;
+ font-size: $font-size-large;
+ padding: 30px 0;
+
+ .fa {
+ margin-block: 12px;
+ }
+
+ *:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+}
.table-calendar, .week-calendar, .day-calendar {
td, th {
width: 14.29%;
diff --git a/src/pretix/static/pretixpresale/scss/main.scss b/src/pretix/static/pretixpresale/scss/main.scss
index d598c8d928..8b2e2a5058 100644
--- a/src/pretix/static/pretixpresale/scss/main.scss
+++ b/src/pretix/static/pretixpresale/scss/main.scss
@@ -513,7 +513,7 @@ h2 .label {
}
.event-list.full-width-list {
- h3, h4, p {
+ h3, h4, article p {
margin-top: 0;
margin-bottom: 0;
}
diff --git a/src/pretix/static/pretixpresale/scss/widget.scss b/src/pretix/static/pretixpresale/scss/widget.scss
index 9060ea0469..5c9905c341 100644
--- a/src/pretix/static/pretixpresale/scss/widget.scss
+++ b/src/pretix/static/pretixpresale/scss/widget.scss
@@ -748,6 +748,13 @@ $table-bg-accent: rgba(128, 128, 128, 0.05);
display: block;
width: 100%;
}
+
+ .pretix-widget-event-list-empty,
+ .pretix-widget-event-week-empty,
+ .pretix-widget-event-calendar-empty {
+ padding: 10px 0;
+ text-align: center;
+ }
}
diff --git a/src/pretix/static/pretixpresale/widget/src/api.ts b/src/pretix/static/pretixpresale/widget/src/api.ts
index cbe0a9e19a..a43b8acf99 100644
--- a/src/pretix/static/pretixpresale/widget/src/api.ts
+++ b/src/pretix/static/pretixpresale/widget/src/api.ts
@@ -38,6 +38,7 @@ export interface ProductListResponse {
events?: EventEntry[]
has_more_events?: boolean
meta_filter_fields?: MetaFilterField[]
+ empty_text?: string
weeks?: DayEntry[][]
date?: string
days?: DayEntry[]
diff --git a/src/pretix/static/pretixpresale/widget/src/components/EventCalendar.vue b/src/pretix/static/pretixpresale/widget/src/components/EventCalendar.vue
index b1ed41aa95..8971e85c4f 100644
--- a/src/pretix/static/pretixpresale/widget/src/components/EventCalendar.vue
+++ b/src/pretix/static/pretixpresale/widget/src/components/EventCalendar.vue
@@ -92,7 +92,9 @@ function nextmonth () {
| {{ STRINGS.next_month }} »
//- Calendar
+ .pretix-widget-event-calendar-empty(v-if="!!store.emptyText", v-html="store.emptyText")
table.pretix-widget-event-calendar-table(
+ v-else
:id="id",
tabindex="0",
:aria-labelledby="ariaLabelledby"
diff --git a/src/pretix/static/pretixpresale/widget/src/components/EventList.vue b/src/pretix/static/pretixpresale/widget/src/components/EventList.vue
index b874675beb..198619d8e8 100644
--- a/src/pretix/static/pretixpresale/widget/src/components/EventList.vue
+++ b/src/pretix/static/pretixpresale/widget/src/components/EventList.vue
@@ -62,6 +62,8 @@ console.log(store)
:event="event"
)
+ .pretix-widget-event-list-empty(v-if="!store.events.length && store.emptyText", v-html="store.emptyText")
+
p.pretix-widget-event-list-load-more(v-if="store.hasMoreEvents")
button(@click.prevent.stop="loadMore") {{ STRINGS.load_more }}
diff --git a/src/pretix/static/pretixpresale/widget/src/components/EventWeekCalendar.vue b/src/pretix/static/pretixpresale/widget/src/components/EventWeekCalendar.vue
index ad0a2cdeb8..63996693d3 100644
--- a/src/pretix/static/pretixpresale/widget/src/components/EventWeekCalendar.vue
+++ b/src/pretix/static/pretixpresale/widget/src/components/EventWeekCalendar.vue
@@ -88,7 +88,8 @@ function nextweek () {
| {{ STRINGS.next_week }} »
//- Actual calendar
- .pretix-widget-event-week-table(:id="id", tabindex="0", :aria-label="weekname")
+ .pretix-widget-event-week-empty(v-if="store.emptyText", v-html="store.emptyText")
+ .pretix-widget-event-week-table(v-else, :id="id", tabindex="0", :aria-label="weekname")
.pretix-widget-event-week-col(v-for="d in store.days", :key="d?.date || ''")
EventWeekCell(:day="d", :mobile="mobile")
diff --git a/src/pretix/static/pretixpresale/widget/src/sharedStore.ts b/src/pretix/static/pretixpresale/widget/src/sharedStore.ts
index 00d36c02f7..c2273e299b 100644
--- a/src/pretix/static/pretixpresale/widget/src/sharedStore.ts
+++ b/src/pretix/static/pretixpresale/widget/src/sharedStore.ts
@@ -95,6 +95,7 @@ export function createWidgetStore (config: {
offset: 0,
appendEvents: false,
metaFilterFields: [] as MetaFilterField[],
+ emptyText: null as string | null,
// UI state
mobile: false,
@@ -270,6 +271,7 @@ export function createWidgetStore (config: {
this.name = data.name ?? null
this.frontpageText = data.frontpage_text ?? null
this.metaFilterFields = data.meta_filter_fields ?? []
+ this.emptyText = data.empty_text ?? null
} else if (data.days !== undefined) {
this.days = data.days
this.date = null
@@ -279,6 +281,7 @@ export function createWidgetStore (config: {
this.name = data.name ?? null
this.frontpageText = data.frontpage_text ?? null
this.metaFilterFields = data.meta_filter_fields ?? []
+ this.emptyText = data.empty_text ?? null
} else if (data.events !== undefined) {
this.events = this.appendEvents && this.events
? this.events.concat(data.events)
@@ -290,6 +293,7 @@ export function createWidgetStore (config: {
this.frontpageText = data.frontpage_text ?? null
this.hasMoreEvents = data.has_more_events ?? false
this.metaFilterFields = data.meta_filter_fields ?? []
+ this.emptyText = data.empty_text ?? null
} else {
this.view = 'event'
this.targetUrl = data.target_url ?? this.targetUrl