Agreed by the owner on 2026-10-13 (the local day, no "UTC" beside a
time); the zone is the container's TZ in .env and Settings only shows it,
his "Да" of 2026-10-17. Mockups c205106.
Every time the panel shows is formatted in time.Local and says no zone:
the logs' Time and the DMARC Received columns, a message's timeline,
Overview's "Updated", Health's certificate and renewal, the filter lists,
DMARC reports and windows, the auto limit's last recalculation. Stored
instants stay UTC. The days counted are the zone's: delivery_log_days and
sender_check_days key their rows by the local date, the sender check cuts
downtime at local midnights (byDay), the log filters' days run from local
midnight to local midnight. Notification mail and the test message write
the zone's abbreviation after a time - they are read away from the panel.
DMARC's one-day window label stays the reporter's (UTC) day.
Settings box 05, Time zone, read-only: the name (UTC without TZ), its
offset, and a TZ the image cannot load said to leave the times in UTC
(time/zoneinfo_unix.go, initLocal) rather than named. TZ is passed by the
compose file ("${TZ:-}"), in .env.example and the guide's table; tzdata is
named in the image (supervisor's python3.13 brings it today). Postfix
takes TZ through import_environment, so mail.log's stamps are the same
zone, which closes the trap the roadmap wrote down: the tailer has always
read them in time.Local.
Tests: a TestMain runs view, handlers, store and cmd/panel in UTC whatever
the machine's zone (as logtail's); TestSettingsShowsTheTimeZone,
TestTimesAreTheContainersZone, TestByDayInTheContainersZone, a Moscow day
in TestQueryInboundSpamFilters; envdoc's pattern takes two-letter names.
e2e time_zone_is_the_containers recreates the stand with
TZ=Europe/Moscow: date says MSK, Settings names the zone and UTC+03:00, a
test message's page gives its time and its mail.log lines in Moscow's.
go vet + go test (26 packages) and make e2e on the test server for this
tree.
Docs: guide (§ Settings, the TZ row, the days of Health and the logs),
architecture, schema-migrations, help (word for word with the mockup),
CHANGELOG [Unreleased] § Added, roadmap row done with the decision.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
155 lines
6.6 KiB
HTML
155 lines
6.6 KiB
HTML
{{/* The kit page (GET /server/components): every partial of components.html in
|
|
every state, filled from kit.go — the mockup components page rebuilt with
|
|
the real templates. Like any page it is thin: partial calls with structs,
|
|
Bulma layout classes, and the page utilities; the markup of a component is
|
|
written in components.html and nowhere else. */}}
|
|
{{define "content"}}
|
|
{{template "page_head" .Head}}
|
|
|
|
{{template "flash" .Flash}}
|
|
{{template "flash" .FlashError}}
|
|
|
|
{{template "box_open" .Layouts}}
|
|
{{template "body_open"}}
|
|
{{template "facts" .LayoutFacts}}
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
|
|
{{template "cards_open"}}
|
|
<div class="column is-6">
|
|
{{template "box_open" .Postmark}}
|
|
{{template "body_open"}}
|
|
<div class="buttons">{{range .Postmarks}}
|
|
{{template "postmark" .}}{{end}}
|
|
</div>
|
|
<p class="sp-muted">Only inside page_head, at most one per page, and only where the page has a verdict to give.</p>
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
|
|
{{template "box_open" .StatusTag}}
|
|
<div class="table-container"><table class="table is-fullwidth">
|
|
<thead><tr><th>Status</th><th>Tag</th><th>Bulma classes</th></tr></thead>
|
|
<tbody>{{range .StatusRows}}
|
|
<tr><td>{{.Words}}</td><td>{{template "tag" .Tag}}</td><td class="sp-mono sp-small">{{status_tag .Tag.Status}}</td></tr>{{end}}
|
|
<tr><td>a tag that opens a <code>sheet</code></td><td>{{template "sheet_tag" .Sheet}}</td><td class="sp-mono sp-small">button.tag + sp-sheet (popover)</td></tr>
|
|
</tbody>
|
|
</table></div>
|
|
{{template "box_close"}}
|
|
</div>
|
|
|
|
<div class="column is-6">
|
|
{{template "box_open" .BoxHead}}
|
|
{{template "body_open"}}
|
|
<p class="mb-2">The <i class="ti ti-help-circle"></i> after the end slot is <code>sp-help</code>: an optional link to the section's topic on the Help page. It replaces today's help drawer.</p>
|
|
<p>box_body — padded content. A <code>table</code> or a run of <code>sp-record</code> blocks sits directly in the box, without box_body.</p>
|
|
{{template "body_close"}}
|
|
{{template "box_foot" .BoxFoot}}
|
|
{{template "box_close"}}
|
|
|
|
{{template "box_open" .DangerZone}}
|
|
{{template "body_open"}}
|
|
<p>For destructive confirmations and the "delete" entry of a settings page. The number may be an icon when the box is not part of a sequence.</p>
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
|
|
{{template "box_open" .Credential}}
|
|
{{template "body_open"}}
|
|
<p>Only for a secret the panel will never show again.</p>
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
</div>
|
|
{{template "cards_close"}}
|
|
|
|
{{template "box_open" .HealthCard}}
|
|
{{template "health_cards" .HealthCards}}
|
|
{{template "box_close"}}
|
|
|
|
<div class="columns">
|
|
<div class="column is-7">
|
|
{{template "box_open" .DNSRecord}}
|
|
{{range .Records}}{{template "dns_record" .}}
|
|
{{end}}{{template "box_close"}}
|
|
|
|
{{template "box_open" .Tables}}
|
|
<div class="table-container"><table class="table is-fullwidth is-hoverable">
|
|
<thead><tr><th>Time</th><th>Name</th><th>sp-clip</th><th>Status</th><th></th></tr></thead>
|
|
<tbody>
|
|
<tr><td class="sp-mono sp-muted sp-nowrap sp-small">09-21 14:01:52</td><td><a href="#"><strong>the row's link</strong></a></td><td class="sp-clip">A long subject is clipped with an ellipsis instead of wrapping the row</td><td><span class="{{status_tag "sent"}}">sent</span></td><td class="sp-actions"><a href="#">Details</a>{{template "row_action" .RowAction}}</td></tr>
|
|
</tbody>
|
|
</table></div>
|
|
{{template "box_foot" .TablesFoot}}
|
|
{{template "box_close"}}
|
|
|
|
{{template "box_open" .LogPane}}
|
|
{{template "log_pane" .LogLines}}
|
|
{{template "box_close"}}
|
|
</div>
|
|
|
|
<div class="column is-5">
|
|
{{template "box_open" .Facts}}
|
|
{{template "body_open"}}
|
|
{{template "facts" .FactList}}
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
|
|
{{template "box_open" .Timeline}}
|
|
{{template "body_open"}}
|
|
{{template "timeline" .Steps}}
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
|
|
{{template "box_open" .EmptyState}}
|
|
{{template "empty_state" .Empty}}
|
|
{{template "box_close"}}
|
|
|
|
{{template "box_open" .ConfirmList}}
|
|
{{template "body_open"}}
|
|
{{template "confirm_list" .Confirm}}
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="columns">
|
|
<div class="column is-3">
|
|
{{template "side_menu" .SideMenu}}
|
|
</div>
|
|
<div class="column is-9">
|
|
{{template "box_open" .FormRows}}
|
|
{{template "body_open"}}
|
|
<div class="sp-form">
|
|
<div class="sp-row">
|
|
<div class="field"><label class="label">sp-row — a wide field</label><div class="control"><input class="input" value="host"></div></div>
|
|
<div class="field"><label class="label">and a short one</label><div class="control"><input class="input" value="25"></div></div>
|
|
</div>
|
|
<div class="sp-pair">
|
|
<div class="field"><label class="label">sp-pair — two equal fields</label><div class="control"><input class="input" type="password"></div></div>
|
|
<div class="field"><label class="label">Repeat</label><div class="control"><input class="input" type="password"></div><p class="help">Help text lives in Bulma's <code>help</code>.</p></div>
|
|
</div>
|
|
</div>
|
|
{{template "route" .Route}}
|
|
{{template "body_close"}}
|
|
{{template "help_topic" .HelpTopic}}
|
|
{{template "box_close"}}
|
|
</div>
|
|
</div>
|
|
|
|
{{template "box_open" .Shell}}
|
|
{{template "body_open"}}
|
|
{{template "facts" .ShellFacts}}
|
|
{{template "body_close"}}
|
|
{{template "box_close"}}
|
|
|
|
{{template "box_open" .TypeScale}}
|
|
<div class="table-container"><table class="table is-fullwidth">
|
|
<thead><tr><th>Size</th><th>Looks like</th><th>Used for</th></tr></thead>
|
|
<tbody>
|
|
<tr><td class="sp-mono sp-small">body · 16px</td><td>The quick brown fox, 203.0.113.25</td><td class="sp-muted">Text, table cells, inputs, selects, buttons, menus and their dropdowns</td></tr>
|
|
<tr><td class="sp-mono sp-small">--sp-fs-s · 14px</td><td class="sp-small">The quick brown fox, <span class="sp-mono">203.0.113.25</span></td><td class="sp-muted">Supporting text: labels, <code>help</code>, notes in a box head or foot, mono values (<code>sp-small</code>), logs, the footer</td></tr>
|
|
<tr><td class="sp-mono sp-small">--sp-fs-xs · 13px</td><td>{{template "kicker" .KickerSample}} <span class="tag is-light">tag</span></td><td class="sp-muted">Upper-case mono micro-labels (kicker, table head, <code>dt</code>, box title) and tags — nothing else</td></tr>
|
|
</tbody>
|
|
</table></div>
|
|
{{template "box_foot" .TypeScaleFoot}}
|
|
{{template "box_close"}}
|
|
{{end}}
|