{{- /* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Commercial */ -}} {{- /* SPDX-FileCopyrightText: 2025-2026 Christian Galo */ -}} {{/* operator_plan_ladder_tiers.html The composite's Add tier and Tiers sections, titled by sectionHeader outside their boxes. Add tier is a closed panel opened from the section header (design D20 "Create flows: a closed panel, then land on the record"), rendering the declaration operator.plan-ladder.tier.add (form-library); the dense form is already its own box (design D10), so nothing wraps it here. The tier rows drag-to-reorder (SortableJS); drops render a server-side preview and nothing is saved until the operator commits, so the pending panels render the preview declarations operator.plan-ladder.tier.reorder.commit and .remove.commit (design D10's preview idiom; finding FA-13). Product names cross-link to their products (chrome-conventions: cross-refs link identifiers). */}} {{ if .Error }} {{ end }} {{ template "sectionHeader" .TiersHeader }}
{{ if gt (len .AvailableProducts) 0 }} {{ template "form" .TierForm }} {{/* Page prose, not a field hint: it explains the drag-to-reorder gesture on the table below, not the product control itself. */}}

New tiers are added at the highest rank; drag rows below to set the order.

{{ else }}

No plan products are available to add. Every published product is already a tier on this ladder, or no products are published yet.

{{ end }}
{{ if eq (len .Tiers) 0 }} {{ template "emptyState" .NoTiers }} {{ else }} {{ $pending := .Pending }} {{ $removal := .RemovalPending }} {{ $rows := .Tiers }}{{ if $pending }}{{ $rows = $pending.Order }}{{ end }} {{ if gt (len $rows) 1 }}

Drag a row by its handle (⣿) to reorder tiers; dropping shows a preview, and nothing is saved until you commit. Rank 0 is the base tier, listed first below; when a ladder is an org type's default plan, its rank-0 tier is what new organizations of that type start on.

{{ else }}

Rank 0 is the base tier; when a ladder is an org type's default plan, its rank-0 tier is what new organizations of that type start on.

{{ end }} {{/* design D8 / plan-ladder-management "The tiers table reads as a record table": the tier's product name is the primary column (row header), with a styled header row (table-record, lane A). */}}
{{ range $rows }} {{ end }}
Product Rank Active positions Actions
{{/* operator-topology-overview "One ladder has no handle" applies the same way to tier rows: a handle to reorder among siblings means nothing with only one tier. */}} {{ if gt (len $rows) 1 }} {{ end }} {{ .ProductName }} {{ if eq .Rank 0 }}{{ range $.DefaultBadges }} {{ template "statusBadge" . }}{{ end }}{{ end }} {{ if $pending }}{{ template "statusBadge" .PendingRankBadge }}{{ else }}{{ template "statusBadge" .RankBadge }}{{ end }} {{ if .HasActiveAttachments }}{{ .ActiveAttachmentCount }}{{ else }}0{{ end }} {{ if or $pending $removal }} {{/* A pending reorder or removal preview owns the table: no verb until it is committed or discarded, and the pending panel below the table says so, so the cell is empty rather than a marker with a hover title (chrome-conventions "A verb-less row leaves its Actions cell empty"; design D23 keeps tooltips for disabled controls only). */}} {{ else if .HasActiveAttachments }} {{ else }} {{ end }}
{{ with .Pending }} {{ template "form" .Form }} {{ end }} {{ with .RemovalPending }} {{ template "form" .Form }} {{ end }} {{ end }}