Update admin PWA events, branding, and packages
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-01-19 11:35:38 +01:00
parent 926bc7d070
commit fbff2afa3e
43 changed files with 6846 additions and 6323 deletions

View File

@@ -1,6 +1,7 @@
import React from 'react';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { render, screen } from '@testing-library/react';
import { render, screen, waitFor } from '@testing-library/react';
import { ADMIN_EVENTS_PATH } from '../../constants';
const fixtures = vi.hoisted(() => ({
event: {
@@ -41,6 +42,9 @@ const authState = {
status: 'authenticated',
user: { role: 'tenant_admin' },
};
const paramsState = {
slug: fixtures.event.slug as string | undefined,
};
const eventContext = {
events: [fixtures.event],
activeEvent: fixtures.event,
@@ -52,7 +56,7 @@ const eventContext = {
vi.mock('react-router-dom', () => ({
useNavigate: () => navigateMock,
useLocation: () => ({ search: '', pathname: '/event-admin/mobile/dashboard' }),
useParams: () => ({ slug: fixtures.event.slug }),
useParams: () => paramsState,
}));
vi.mock('react-i18next', () => ({
@@ -143,6 +147,13 @@ vi.mock('../components/Sheet', () => ({
vi.mock('../components/Primitives', () => ({
MobileCard: ({ children }: { children: React.ReactNode }) => <div>{children}</div>,
CTAButton: ({ label }: { label: string }) => <button type="button">{label}</button>,
KpiStrip: ({ items }: { items: Array<{ label: string; value: string | number }> }) => (
<div>
{items.map((item) => (
<span key={item.label}>{item.label}</span>
))}
</div>
),
KpiTile: ({ label, value }: { label: string; value: string | number }) => (
<div>
<span>{label}</span>
@@ -244,6 +255,7 @@ describe('MobileDashboardPage', () => {
eventContext.activeEvent = fixtures.event;
eventContext.hasEvents = true;
eventContext.hasMultipleEvents = false;
paramsState.slug = fixtures.event.slug;
fixtures.activePackage.package_type = 'reseller';
fixtures.activePackage.remaining_events = 3;
@@ -253,19 +265,27 @@ describe('MobileDashboardPage', () => {
window.sessionStorage.clear();
});
it('shows a tasks setup nudge and prompt when no tasks are assigned', () => {
it('redirects to the event selector when no event is active', async () => {
eventContext.activeEvent = null as unknown as typeof fixtures.event;
eventContext.events = [fixtures.event];
eventContext.hasEvents = true;
paramsState.slug = undefined;
render(<MobileDashboardPage />);
await waitFor(() => {
expect(navigateMock).toHaveBeenCalledWith(ADMIN_EVENTS_PATH, { replace: true });
});
});
it('shows the next-step CTA when tasks are missing', () => {
fixtures.event.tasks_count = 0;
fixtures.event.engagement_mode = 'tasks';
window.sessionStorage.setItem(`tasksDecisionPrompt:${fixtures.event.id}`, 'pending');
render(<MobileDashboardPage />);
expect(screen.getByText('Setup needed')).toBeInTheDocument();
expect(
screen.getByText(
'Your event is live with tasks enabled, but no tasks are assigned yet. Choose to add tasks now or disable tasks for this event.'
)
).toBeInTheDocument();
expect(screen.getByText('Aufgaben hinzufügen')).toBeInTheDocument();
});
it('does not redirect endcustomer packages without remaining event quota', () => {
@@ -282,21 +302,21 @@ describe('MobileDashboardPage', () => {
expect(navigateMock).not.toHaveBeenCalledWith('/event-admin/mobile/billing#packages', { replace: true });
});
it('shows package usage progress when a limit is available', () => {
it('shows the activity pulse strip', () => {
render(<MobileDashboardPage />);
expect(screen.getByText('2 of 5 events used')).toBeInTheDocument();
expect(screen.getByText('3 remaining')).toBeInTheDocument();
expect(screen.getAllByText('Photos').length).toBeGreaterThan(0);
expect(screen.getAllByText('Guests').length).toBeGreaterThan(0);
expect(screen.getAllByText('Pending').length).toBeGreaterThan(0);
});
it('hides admin-only shortcuts for members', () => {
it('shows shortcut sections for members', () => {
authState.user = { role: 'member' };
render(<MobileDashboardPage />);
expect(screen.getByText('Moderation & Live Show')).toBeInTheDocument();
expect(screen.queryByText('Event settings')).not.toBeInTheDocument();
expect(screen.queryByText('Live Show settings')).not.toBeInTheDocument();
expect(screen.getByText('Experience')).toBeInTheDocument();
expect(screen.getByText('Settings')).toBeInTheDocument();
authState.user = { role: 'tenant_admin' };
});