Skip to content

Commit 347ee48

Browse files
authored
Feature: Add ticket date display options (#1214)
1 parent d5fefda commit 347ee48

44 files changed

Lines changed: 931 additions & 521 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.8.0-beta
1+
1.10.0-beta

backend/VERSION

Whitespace-only changes.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace HiEvents\DomainObjects\Enums;
4+
5+
enum TicketDateDisplayMode: string
6+
{
7+
use BaseEnum;
8+
9+
case START_DATE_TIME = 'START_DATE_TIME';
10+
case DATE_RANGE = 'DATE_RANGE';
11+
case HIDDEN = 'HIDDEN';
12+
}

backend/app/Http/Request/EventSettings/UpdateEventSettingsRequest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use HiEvents\DomainObjects\Enums\HomepageFontFamily;
88
use HiEvents\DomainObjects\Enums\PaymentProviders;
99
use HiEvents\DomainObjects\Enums\PriceDisplayMode;
10+
use HiEvents\DomainObjects\Enums\TicketDateDisplayMode;
1011
use HiEvents\Http\Request\BaseRequest;
1112
use HiEvents\Validators\Rules\RulesHelper;
1213
use Illuminate\Validation\Rule;
@@ -85,6 +86,7 @@ public function rules(): array
8586
'ticket_design_settings.logo_image_id' => ['nullable', 'integer'],
8687
'ticket_design_settings.footer_text' => ['nullable', 'string', 'max:500'],
8788
'ticket_design_settings.layout_type' => ['nullable', 'string', Rule::in(['default', 'modern'])],
89+
'ticket_design_settings.date_display_mode' => ['nullable', 'string', Rule::in(TicketDateDisplayMode::valuesArray())],
8890
'ticket_design_settings.enabled' => ['boolean'],
8991

9092
// Marketing settings

backend/app/Services/Application/Handlers/EventSettings/DTO/UpdateEventSettingsDTO.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use HiEvents\DomainObjects\Enums\HomepageBackgroundType;
99
use HiEvents\DomainObjects\Enums\PaymentProviders;
1010
use HiEvents\DomainObjects\Enums\PriceDisplayMode;
11+
use HiEvents\DomainObjects\Enums\TicketDateDisplayMode;
1112
use HiEvents\DomainObjects\OrganizerDomainObject;
1213

1314
class UpdateEventSettingsDTO extends BaseDTO
@@ -150,6 +151,7 @@ public static function createWithDefaults(
150151
'logo_image_id' => null,
151152
'footer_text' => null,
152153
'layout_type' => 'classic',
154+
'date_display_mode' => TicketDateDisplayMode::START_DATE_TIME->value,
153155
'enabled' => true,
154156
],
155157

backend/composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"description": "hi.events - Ticket selling and event management.",
55
"keywords": ["ticketing", "events"],
66
"license": "AGPL-3.0",
7-
"version": "1.8.0-beta",
7+
"version": "1.10.0-beta",
88
"require": {
99
"php": "^8.2",
1010
"ext-intl": "*",
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace Tests\Unit\Http\Request\EventSettings;
4+
5+
use HiEvents\DomainObjects\Enums\TicketDateDisplayMode;
6+
use HiEvents\Http\Request\EventSettings\UpdateEventSettingsRequest;
7+
use Illuminate\Support\Facades\Validator;
8+
use Tests\TestCase;
9+
10+
class UpdateEventSettingsRequestTest extends TestCase
11+
{
12+
public function test_valid_date_display_modes_are_accepted(): void
13+
{
14+
foreach (TicketDateDisplayMode::valuesArray() as $mode) {
15+
$validator = Validator::make(
16+
['ticket_design_settings' => ['date_display_mode' => $mode]],
17+
(new UpdateEventSettingsRequest)->rules()
18+
);
19+
20+
$this->assertFalse(
21+
$validator->errors()->has('ticket_design_settings.date_display_mode'),
22+
"Expected '{$mode}' to be a valid date display mode"
23+
);
24+
}
25+
}
26+
27+
public function test_invalid_date_display_mode_is_rejected(): void
28+
{
29+
$validator = Validator::make(
30+
['ticket_design_settings' => ['date_display_mode' => 'NOT_A_MODE']],
31+
(new UpdateEventSettingsRequest)->rules()
32+
);
33+
34+
$this->assertTrue($validator->errors()->has('ticket_design_settings.date_display_mode'));
35+
}
36+
37+
public function test_date_display_mode_is_optional(): void
38+
{
39+
$validator = Validator::make(
40+
['ticket_design_settings' => ['accent_color' => '#333333']],
41+
(new UpdateEventSettingsRequest)->rules()
42+
);
43+
44+
$this->assertFalse($validator->errors()->has('ticket_design_settings.date_display_mode'));
45+
}
46+
}

frontend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "hievents-frontend",
33
"private": true,
4-
"version": "1.8.0-beta",
4+
"version": "1.10.0-beta",
55
"type": "module",
66
"scripts": {
77
"dev:csr": "vite --port 5678 --host 0.0.0.0",

frontend/src/components/common/AttendeeTicket/index.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {Button, CopyButton} from "@mantine/core";
33
import {formatCurrency} from "../../../utilites/currency.ts";
44
import {t} from "@lingui/macro";
55
import {prettyDate} from "../../../utilites/dates.ts";
6+
import {EventDateRange} from "../EventDateRange";
67
import QRCode from "react-qr-code";
78
import {IconCopy, IconPrinter, IconLock, IconX} from "@tabler/icons-react";
89
import {Address, Attendee, Event, Product} from "../../../types.ts";
@@ -32,6 +33,7 @@ export const AttendeeTicket = ({
3233
const ticketDesignSettings = event?.settings?.ticket_design_settings;
3334
const accentColor = ticketDesignSettings?.accent_color || '#6B46C1';
3435
const footerText = ticketDesignSettings?.footer_text;
36+
const dateDisplayMode = ticketDesignSettings?.date_display_mode || 'START_DATE_TIME';
3537
const logoUrl = imageUrl('TICKET_LOGO', event?.images);
3638

3739
const ticketStyle = {
@@ -71,12 +73,16 @@ export const AttendeeTicket = ({
7173
<div className={classes.contentLeft}>
7274
{/* Event Details */}
7375
<div className={classes.eventDetails}>
74-
<div className={classes.detailRow}>
75-
<div className={classes.detailLabel}>{t`Date & Time`}</div>
76-
<div className={classes.detailValue}>
77-
{prettyDate(event.start_date, event.timezone, true)}
76+
{dateDisplayMode !== 'HIDDEN' && (
77+
<div className={classes.detailRow}>
78+
<div className={classes.detailLabel}>{t`Date & Time`}</div>
79+
<div className={classes.detailValue}>
80+
{dateDisplayMode === 'DATE_RANGE'
81+
? <EventDateRange event={event}/>
82+
: prettyDate(event.start_date, event.timezone, true)}
83+
</div>
7884
</div>
79-
</div>
85+
)}
8086
{event?.organizer?.name && (
8187
<div className={classes.detailRow}>
8288
<div className={classes.detailLabel}>{t`Organizer`}</div>

frontend/src/components/routes/event/TicketDesigner/TicketPreview.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ interface TicketDesignSettings {
1010
accent_color: string;
1111
logo_image_id: IdParam | null;
1212
footer_text: string | null;
13+
date_display_mode: 'START_DATE_TIME' | 'DATE_RANGE' | 'HIDDEN';
1314
enabled: boolean;
1415
}
1516

@@ -82,6 +83,7 @@ export const TicketPreview = ({settings, eventId, logoUrl}: TicketPreviewProps)
8283
accent_color: settings.accent_color,
8384
logo_image_id: settings.logo_image_id,
8485
footer_text: settings.footer_text,
86+
date_display_mode: settings.date_display_mode,
8587
enabled: settings.enabled
8688
},
8789
location_details: eventSettings?.location_details || {

0 commit comments

Comments
 (0)