CluPilotCloud/resources/views/livewire/admin/mail-pace.blade.php

94 lines
5.0 KiB
PHP

<div class="space-y-6">
<header class="animate-rise">
<p class="lbl">{{ __('mail_pace.eyebrow') }}</p>
<h1 class="mt-[7px] text-[23px] font-bold leading-[1.12] tracking-[-0.03em] text-ink min-[901px]:text-[30px]">
{{ __('mail_pace.title') }}
</h1>
<p class="mt-2 max-w-[76ch] text-sm leading-relaxed text-muted">{{ __('mail_pace.subtitle') }}</p>
</header>
{{-- Der Notschalter, ganz oben und in einem eigenen Panel: das ist der
Griff, den jemand im Ernstfall zuerst sucht, nicht der letzte von
mehreren. Kein Bestätigungsmodal (R23 verlangt eines nur dort, wo ein
Vorgang Folgen hat, die man nicht zurückdrehen kann) dieser Schalter
ist umkehrbar, derselbe Klick legt ihn zurück, genau wie
Admin\Plans::toggleSales(). --}}
<x-ui.panel class="animate-rise [animation-delay:20ms]">
<div class="px-6 py-4">
<x-ui.switch name="pace_enabled" wire:click="togglePace" :checked="$enabled"
:label="__('mail_pace.enabled')"
:hint="__('mail_pace.enabled_hint')"
:on="__('mail_pace.enabled_on')"
:off="__('mail_pace.enabled_off')" />
</div>
</x-ui.panel>
{{-- Die drei Spuren: Name, Takt, was gerade wartet. --}}
<form wire:submit="savePace" class="animate-rise [animation-delay:40ms]">
<h2 class="text-md font-bold tracking-[-0.01em] text-ink">{{ __('mail_pace.lanes_title') }}</h2>
<p class="mt-1 max-w-[70ch] text-sm leading-relaxed text-muted">{{ __('mail_pace.lanes_sub') }}</p>
<x-ui.panel class="mt-4">
@foreach ($lanes as $lane)
<x-ui.row :label="__('mail_pace.lane.'.$lane['key'])" :for="$lane['throttled'] ? $lane['countField'] : null">
<div class="flex flex-wrap items-end gap-3">
<span class="font-mono text-xs text-muted">{{ $lane['key'] }}</span>
@if ($lane['throttled'])
<div class="w-24">
<x-ui.input :name="$lane['countField']" type="number" min="1"
wire:model="{{ $lane['countField'] }}"
:label="__('mail_pace.count')" />
</div>
<div class="w-28">
<x-ui.input :name="$lane['minutesField']" type="number" min="1"
wire:model="{{ $lane['minutesField'] }}"
:label="__('mail_pace.minutes')" />
</div>
@else
<x-ui.badge status="info">{{ __('mail_pace.unthrottled') }}</x-ui.badge>
@endif
<x-ui.badge status="info">{{ __('mail_pace.waiting', ['count' => $lane['waiting']]) }}</x-ui.badge>
</div>
{{-- Kein eigenes @error hier: x-ui.input zeigt die Meldung
zum jeweiligen Feld schon selbst unter sich an. --}}
</x-ui.row>
@endforeach
</x-ui.panel>
<div class="mt-4 flex justify-end">
<x-ui.button variant="primary" type="submit">{{ __('mail_pace.save') }}</x-ui.button>
</div>
</form>
{{-- Die Zuordnung: welche Mailklasse in welcher Spur fährt. Ein <select>
pro Zeile, R20's ausdrückliche Ausnahme — dieselbe Zeile, kein
Höhensprung. Gesperrte Klassen zeigen ein Schloss statt der Auswahl:
der Server lehnt sie ohnehin ab (Task 1, MailLane::assign()), das
Schloss ist nur die Höflichkeit davor. --}}
<section class="animate-rise [animation-delay:60ms]">
<h2 class="text-md font-bold tracking-[-0.01em] text-ink">{{ __('mail_pace.assignments_title') }}</h2>
<p class="mt-1 max-w-[70ch] text-sm leading-relaxed text-muted">{{ __('mail_pace.assignments_sub') }}</p>
<x-ui.panel class="mt-4">
@foreach ($assignments as $class => $lane)
<x-ui.row :label="class_basename($class)">
@if (\App\Services\Mail\MailLane::isLocked($class))
<span class="inline-flex items-center gap-1.5 text-sm text-muted">
<x-ui.icon name="lock" class="size-4" />{{ __('mail_pace.locked_hint') }}
</span>
@else
<select wire:change="move('{{ $class }}', $event.target.value)"
class="w-48 rounded-md border border-line-strong bg-surface px-3 py-2 text-sm text-body">
@foreach ($laneOptions as $option)
<option value="{{ $option }}" @selected($lane === $option)>{{ __('mail_pace.lane.'.$option) }}</option>
@endforeach
</select>
@endif
</x-ui.row>
@endforeach
</x-ui.panel>
</section>
</div>