{{- /* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Commercial */ -}} {{- /* SPDX-FileCopyrightText: 2025-2026 Christian Galo */ -}} {{ pageTitle . }} - {{ deploymentName }} {{ template "shell_topbar.html" .Shell }}
{{ if .BodyTemplate }} {{ renderBody .BodyTemplate .BodyData }} {{ else }} {{ template "pageHeader" .LandingHeader }} {{ if .Setup.ShowBanner }}
Getting started. Finish setting up {{ deploymentName }}. Continue setup
{{ end }}
{{/* The placeholder says what to type, not the record classes it can find (design D4): people by name or email, organizations by name, an invoice by its exact number, and any keyed record (org, product, set, ladder) by its exact key. The no-match sentence (below, in operator_lookup_result.html) is what names the classes, generated from the resolver registry so it can never disagree with the code. */}} {{ template "form" .LookupForm }}
{{ template "operator_lookup_result.html" . }}
{{ template "sectionHeader" .GlanceHeader }} {{ if .Overview.Stats }}
{{ range .Overview.Stats }}
{{ if .Href }}
{{ template "readout" .Readout }}{{ template "chevronIcon" }}
{{ else }}
{{ template "readout" .Readout }}
{{ end }}
{{ end }}
{{ else }}
{{ template "emptyState" .CountsUnavailable }}
{{ end }}
{{ template "sectionHeader" .SystemHeader }}
{{ if .Overview.Integrations.Rows }}
    {{ range .Overview.Integrations.Rows }}
  • {{ if .LinkPath }}{{ .DisplayName }}{{ else }}{{ .DisplayName }}{{ end }} {{ template "statusBadge" .StatusBadge }} {{ with .StripeFacts }} {{ .ModeLabel }} {{ if .Available }}{{ .Queued }} queued, {{ .Attention }} need attention{{ else }}Queue health is unavailable.{{ end }} {{ end }}
  • {{ end }}
{{ else }}

No integrations registered.

{{ end }}
{{ template "sectionHeader" .ActivityHeader }} {{/* #activity-panel: scoped swap target for this list's pager, so paging never scrolls the page (ActivityNav.Target). */}}
{{ if eq (len .Activity) 0 }} {{ template "emptyState" .NoActivity }} {{ else }}
{{ range .Activity }} {{ end }}
Summary Event Organization Actor When
{{ if .Href }}{{ .Summary }}{{ else }}{{ .Summary }}{{ end }} {{ template "statusBadge" .KindBadge }} {{ if .OrgID }}{{ if .OrgName }}{{ .OrgName }}{{ else }}{{ .OrgID }}{{ end }}{{ end }} {{ if .PersonID }}{{ if .PersonName }}{{ .PersonName }}{{ else }}{{ .PersonID }}{{ end }} {{ else }}{{ end }} {{ .Timestamp }}
{{ template "listPager" .ActivityNav }} {{ end }}
{{ end }}
{{/* design D20, round 2 ("a success toast, not a banner"): a create-then-land page (?flash=created) pre-renders its confirmation into this shared toast, marked to auto-show on load; success-toast.js's init reads the marker (CSP-safe, no inline script), shows the toast, then removes the marker so it never re-fires on a later swap. */}}
{{ if .FlashSuccess }}{{ .FlashSuccess }}{{ else }}Done.{{ end }}
{{ template "shell_confirm_modal.html" . }}