{{- /* 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 }}
| 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 }} |