Adopt shared WebUI structural primitives

This commit is contained in:
2026-08-18 13:17:28 +02:00
parent f9385519f3
commit 35671dec73
4 changed files with 10 additions and 32 deletions
@@ -355,7 +355,7 @@ export function CalendarEventDialog({
<input value={location} onChange={(item) => setLocation(item.target.value)} maxLength={500} disabled={saving || !canWrite} /> <input value={location} onChange={(item) => setLocation(item.target.value)} maxLength={500} disabled={saving || !canWrite} />
</label> </label>
<ToggleSwitch label="i18n:govoplan-calendar.whole_day.951c82d1" checked={allDay} disabled={saving || !canWrite} onChange={handleAllDayChange} /> <ToggleSwitch label="i18n:govoplan-calendar.whole_day.951c82d1" checked={allDay} disabled={saving || !canWrite} onChange={handleAllDayChange} />
<div className="calendar-dialog-date-row"> <FormGrid columns={2} gap="compact" collapseAt="narrow">
<label> <label>
<span>i18n:govoplan-calendar.start_date.ff99f5b5</span> <span>i18n:govoplan-calendar.start_date.ff99f5b5</span>
<DateField value={startDate} onChange={handleStartDateChange} required disabled={saving || !canWrite} /> <DateField value={startDate} onChange={handleStartDateChange} required disabled={saving || !canWrite} />
@@ -364,9 +364,9 @@ export function CalendarEventDialog({
<span>i18n:govoplan-calendar.start_time.88d8206d</span> <span>i18n:govoplan-calendar.start_time.88d8206d</span>
<TimeField value={startTime} onChange={handleStartTimeChange} disabled={saving || !canWrite || allDay} /> <TimeField value={startTime} onChange={handleStartTimeChange} disabled={saving || !canWrite || allDay} />
</label> </label>
</div> </FormGrid>
{!allDay && {!allDay &&
<div className="calendar-dialog-date-row"> <FormGrid columns={2} gap="compact" collapseAt="narrow">
<label> <label>
<span>i18n:govoplan-calendar.end_mode.5a06de37</span> <span>i18n:govoplan-calendar.end_mode.5a06de37</span>
<select value={endMode} onChange={(item) => setEndMode(item.target.value as CalendarEventEndMode)} disabled={saving || !canWrite}> <select value={endMode} onChange={(item) => setEndMode(item.target.value as CalendarEventEndMode)} disabled={saving || !canWrite}>
@@ -380,10 +380,10 @@ export function CalendarEventDialog({
<input type="number" min={1} step={60} value={durationSeconds} onChange={(item) => setDurationSeconds(item.target.value)} required disabled={saving || !canWrite} /> <input type="number" min={1} step={60} value={durationSeconds} onChange={(item) => setDurationSeconds(item.target.value)} required disabled={saving || !canWrite} />
</label> </label>
} }
</div> </FormGrid>
} }
{(allDay || endMode === "end") && {(allDay || endMode === "end") &&
<div className="calendar-dialog-date-row"> <FormGrid columns={2} gap="compact" collapseAt="narrow">
<label> <label>
<span>i18n:govoplan-calendar.end_date.89d10cd6</span> <span>i18n:govoplan-calendar.end_date.89d10cd6</span>
<DateField value={endDate} min={startDate} onChange={setEndDate} required disabled={saving || !canWrite} /> <DateField value={endDate} min={startDate} onChange={setEndDate} required disabled={saving || !canWrite} />
@@ -392,7 +392,7 @@ export function CalendarEventDialog({
<span>i18n:govoplan-calendar.end_time.cd7800da</span> <span>i18n:govoplan-calendar.end_time.cd7800da</span>
<TimeField value={endTime} min={!allDay && startDate === endDate ? startTime : undefined} onChange={setEndTime} disabled={saving || !canWrite || allDay} /> <TimeField value={endTime} min={!allDay && startDate === endDate ? startTime : undefined} onChange={setEndTime} disabled={saving || !canWrite || allDay} />
</label> </label>
</div> </FormGrid>
} }
<details className="calendar-advanced-settings calendar-vevent-details"> <details className="calendar-advanced-settings calendar-vevent-details">
<summary>i18n:govoplan-calendar.vevent.9cf5be75</summary> <summary>i18n:govoplan-calendar.vevent.9cf5be75</summary>
@@ -1,6 +1,7 @@
import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { RefreshCw, XCircle } from "lucide-react"; import { RefreshCw, XCircle } from "lucide-react";
import { import {
ActionToolbar,
Button, Button,
Dialog, Dialog,
DismissibleAlert, DismissibleAlert,
@@ -120,13 +121,13 @@ export function CalendarMigrationDialog({
)} )}
{batch && ( {batch && (
<> <>
<div className="calendar-migration-heading"> <ActionToolbar surface="section-header" className="calendar-migration-heading">
<div> <div>
<strong>{phaseLabel(batch.phase)}</strong> <strong>{phaseLabel(batch.phase)}</strong>
<span>Updated {dateTimeLabel(new Date(batch.updated_at))}</span> <span>Updated {dateTimeLabel(new Date(batch.updated_at))}</span>
</div> </div>
<StatusBadge status={batch.status} label={statusLabel(batch.status)} /> <StatusBadge status={batch.status} label={statusLabel(batch.status)} />
</div> </ActionToolbar>
<progress value={progress} max={100} aria-label="Remote move progress" /> <progress value={progress} max={100} aria-label="Remote move progress" />
<dl className="calendar-migration-summary"> <dl className="calendar-migration-summary">
<div><dt>Events</dt><dd>{batch.total_events}</dd></div> <div><dt>Events</dt><dd>{batch.total_events}</dd></div>
@@ -113,7 +113,7 @@ export function CalendarOutboxDialog({
<p className="calendar-outbox-calendar-name">{calendar.name}</p> <p className="calendar-outbox-calendar-name">{calendar.name}</p>
<DocumentationHelpLink reference={CALENDAR_RECOVERY_DOCUMENTATION} /> <DocumentationHelpLink reference={CALENDAR_RECOVERY_DOCUMENTATION} />
{error && <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert>} {error && <DismissibleAlert tone="danger" resetKey={error}>{error}</DismissibleAlert>}
<ActionToolbar className="calendar-outbox-toolbar"> <ActionToolbar justify="between" className="calendar-outbox-toolbar">
<SegmentedControl<OutboxFilter> <SegmentedControl<OutboxFilter>
value={filter} value={filter}
ariaLabel="i18n:govoplan-calendar.outbox_filter.8305af40" ariaLabel="i18n:govoplan-calendar.outbox_filter.8305af40"
-23
View File
@@ -895,13 +895,6 @@
cursor: not-allowed; cursor: not-allowed;
} }
.calendar-dialog-row,
.calendar-dialog-date-row {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
}
.calendar-dialog-name-color-row { .calendar-dialog-name-color-row {
display: grid; display: grid;
grid-template-columns: minmax(0, 1fr) 142px; grid-template-columns: minmax(0, 1fr) 142px;
@@ -1117,13 +1110,6 @@
font-weight: 700; font-weight: 700;
} }
.calendar-outbox-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.calendar-outbox-summary { .calendar-outbox-summary {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -1208,13 +1194,6 @@
min-height: 240px; min-height: 240px;
} }
.calendar-migration-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.calendar-migration-heading > div { .calendar-migration-heading > div {
display: grid; display: grid;
gap: 3px; gap: 3px;
@@ -1504,8 +1483,6 @@
max-width: none; max-width: none;
} }
.calendar-dialog-row,
.calendar-dialog-date-row,
.calendar-dialog-name-color-row, .calendar-dialog-name-color-row,
.calendar-sync-status-panel dl { .calendar-sync-status-panel dl {
grid-template-columns: 1fr; grid-template-columns: 1fr;