{{- /* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Commercial */ -}} {{- /* SPDX-FileCopyrightText: 2025-2026 Christian Galo */ -}} {{/* operator_product_prices.html The composite's Prices section: the record table, with Add price as a closed panel opened from the section header's own tertiary action (design D20), rendering the declaration operator.product.price.add (form-library); the dense form is already its own box (design D10), so nothing wraps it here. Trial days carries no control: trial_period_days is stored but not yet honored anywhere in the billing chain (checkout sets no trial), so collecting it would promise a trial members never get (finding #1; FA-6 stops CreatePrice parsing it). The page title is the composite's. Kinds and states render through statusBadge; the Deactivate control confirms through the shared modal (page-anatomy "Destructive actions confirm through the shared modal on every surface"). */}} {{ if .Error }} {{ end }} {{/* design D20 sub-record panels: Add price opens from the Prices section header's own tertiary action, closed by default. */}} {{ template "sectionHeader" .PricesHeader }}
{{ template "form" .PriceForm }}
{{ if not .Error }} {{ if eq (len .Prices) 0 }} {{ template "emptyState" .Empty }} {{ else }}
{{ range .Prices }} {{ end }}
Amount Default Type Interval Trial period Active Stripe sync Stripe price Created Actions
{{ .UnitAmount }} {{ if .IsDefault }} {{ template "statusBadge" .DefaultBadge }} {{ else }} {{ end }} {{ template "statusBadge" .TypeBadge }} {{ if .RecurringInterval }} {{ .RecurringInterval }} {{ else }} {{ end }} {{ if .TrialPeriodDays }} {{ .TrialPeriodDays }} days not yet honored {{ template "helpIcon" (helpIcon "Trial period" "Trial periods are stored but not yet applied at checkout.") }} {{ else }} {{ end }} {{ template "statusBadge" .StateBadge }} {{ template "statusBadge" .SyncBadge }} {{ if .StripePriceID }} {{ $url := stripeEntityURL "prices" .StripePriceID }} {{ if $url }} {{ .StripePriceID }} {{ else }} {{ .StripePriceID }} {{ end }} {{ else }} {{ end }} {{ .CreatedAt }} {{/* Per-row price verbs. Sync registers this specific price with Stripe (product-idempotent server-side); Make default moves the members-are-offered marker; Deactivate retires a non-default price through the shared modal. The default price can be neither demoted directly nor deactivated; promote another price instead. */}} {{ if and $.StripeConfigured (eq .StripeSyncStatus "not_mapped") }} {{ end }} {{ if not .IsDefault }} {{ end }}
{{ end }} {{ end }}