{
  "$schema": "https://uipkge.dev/schema/registry-item.json",
  "name": "backorder-split-shipment-manager",
  "title": "Backorder Split Shipment Manager",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-angular/blocks/backorder-split-shipment-manager/backorder-split-shipment-manager.component.ts",
      "content": "import { Component, Input, signal, ChangeDetectionStrategy } from '@angular/core'\nimport { ArrowRightLeft, CheckCircle2, Clock, LucideAngularModule, Send, Split, Truck } from 'lucide-angular'\nimport { cn } from '@/lib/utils'\nimport { UiBadgeComponent, type BadgeVariant } from '@/ui/badge/badge.component'\nimport { UiButtonComponent } from '@/ui/button/button.component'\nimport {\n  UiCardComponent,\n  UiCardContentComponent,\n  UiCardDescriptionComponent,\n  UiCardHeaderComponent,\n  UiCardTitleComponent,\n} from '@/ui/card/card.component'\nimport {\n  UiTableBodyComponent,\n  UiTableCellComponent,\n  UiTableComponent,\n  UiTableHeadComponent,\n  UiTableHeaderComponent,\n  UiTableRowComponent,\n} from '@/ui/table/table.component'\n\nexport interface ShipmentItem {\n  id: string\n  sku: string\n  name: string\n  qty: number\n  unitPrice: number\n  originHub: string\n  status: 'ready' | 'backordered' | 'dispatched'\n  restockEta?: string\n}\n\nexport interface SplitPackage {\n  packageId: string\n  carrier: string\n  trackingNumber?: string\n  status: 'ready_to_ship' | 'awaiting_inventory' | 'dispatched'\n  items: ShipmentItem[]\n}\n\nexport interface BackorderSplitShipmentProps {\n  orderId?: string\n  customerName?: string\n  customerTier?: string\n  className?: string\n}\n\n/**\n * Angular port of the React BackorderSplitShipmentManager block: an order summary card\n * (fulfillment rule, ready and backordered value) above one card per split package, each\n * with its carrier, a dispatch / re-route action and a line-item table. Dispatching a\n * ready package marks it and its items as dispatched. Edit the sample packages below.\n */\n@Component({\n  changeDetection: ChangeDetectionStrategy.Eager,\n  selector: 'ui-backorder-split-shipment-manager, [ui-backorder-split-shipment-manager]',\n  standalone: true,\n  host: {\n    '[attr.data-slot]': '\"backorder-split-shipment-manager\"',\n    '[class]': 'hostClass',\n  },\n  imports: [\n    LucideAngularModule,\n    UiBadgeComponent,\n    UiButtonComponent,\n    UiCardComponent,\n    UiCardContentComponent,\n    UiCardDescriptionComponent,\n    UiCardHeaderComponent,\n    UiCardTitleComponent,\n    UiTableBodyComponent,\n    UiTableCellComponent,\n    UiTableComponent,\n    UiTableHeadComponent,\n    UiTableHeaderComponent,\n    UiTableRowComponent,\n  ],\n  template: `\n    <!-- Header Summary Card -->\n    <div ui-card>\n      <div ui-card-header class=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n        <div class=\"space-y-1\">\n          <div class=\"flex items-center gap-2\">\n            <span class=\"text-foreground font-mono text-sm font-semibold\">{{ orderId }}</span>\n            <span ui-badge variant=\"outline\">{{ customerTier }}</span>\n            <span ui-badge variant=\"secondary\" class=\"gap-1\">\n              <lucide-icon [img]=\"Split\" class=\"text-foreground size-3\" />\n              Split Fulfillment (2 Shipments)\n            </span>\n          </div>\n          <h3 ui-card-title class=\"text-xl\">Split Shipment &amp; Backorder Triage</h3>\n          <p ui-card-description>\n            Account: <strong class=\"text-foreground font-medium\">{{ customerName }}</strong> · Multi-Node Routing\n          </p>\n        </div>\n\n        <div class=\"flex items-center gap-2\">\n          <button ui-button variant=\"outline\" size=\"sm\" class=\"gap-1.5\">\n            <lucide-icon [img]=\"Clock\" class=\"size-3.5\" />\n            Hold Entire Order\n          </button>\n          <button ui-button variant=\"default\" size=\"sm\" class=\"gap-1.5\">\n            <lucide-icon [img]=\"Send\" class=\"size-3.5\" />\n            Release Ready Packages\n          </button>\n        </div>\n      </div>\n\n      <div ui-card-content class=\"border-border grid grid-cols-1 gap-4 border-t pt-4 sm:grid-cols-3\">\n        <!-- Fulfillment Policy -->\n        <div class=\"border-border space-y-1 rounded-lg border p-3\">\n          <div class=\"text-muted-foreground text-xs font-medium\">FULFILLMENT RULE</div>\n          <div class=\"text-foreground text-sm font-semibold\">Partial Dispatch Allowed (Speed Priority)</div>\n          <div class=\"text-muted-foreground text-xs\">Ship available items immediately without backorder delay.</div>\n        </div>\n\n        <!-- In-Stock Value -->\n        <div class=\"border-border space-y-1 rounded-lg border p-3\">\n          <div class=\"text-muted-foreground text-xs font-medium\">READY SHIPMENT VALUE</div>\n          <div class=\"text-foreground font-mono text-xl font-semibold\">$630.00 USD</div>\n          <div class=\"text-muted-foreground text-xs\">6 units allocated from East Coast Hub.</div>\n        </div>\n\n        <!-- Backordered Value -->\n        <div class=\"border-border space-y-1 rounded-lg border p-3\">\n          <div class=\"text-muted-foreground text-xs font-medium\">BACKORDERED VALUE</div>\n          <div class=\"text-foreground font-mono text-xl font-semibold\">$420.00 USD</div>\n          <div class=\"text-muted-foreground text-xs\">1 unit waiting on PO-2026-881 inbound dock.</div>\n        </div>\n      </div>\n    </div>\n\n    <!-- Split Packages Breakdown -->\n    <div class=\"space-y-4\">\n      @for (pkg of packages(); track pkg.packageId) {\n        <div ui-card>\n          <div ui-card-header class=\"flex flex-col gap-3 pb-3 sm:flex-row sm:items-center sm:justify-between\">\n            <div class=\"space-y-1\">\n              <div class=\"flex items-center gap-2\">\n                <span class=\"text-foreground font-semibold\">{{ pkg.packageId }}</span>\n                <span ui-badge [variant]=\"statusVariant(pkg.status)\" class=\"capitalize\">{{\n                  statusLabel(pkg.status)\n                }}</span>\n              </div>\n              <!-- React renders the tracking span with no space after the carrier (JSX strips the newline). -->\n              <div class=\"text-muted-foreground font-mono text-xs\">\n                Carrier: {{ pkg.carrier }}@if (pkg.trackingNumber) {\n                  <span>· Tracking: {{ pkg.trackingNumber }}</span>\n                }\n              </div>\n            </div>\n\n            <div class=\"flex items-center gap-2\">\n              @if (pkg.status === 'ready_to_ship') {\n                <button ui-button size=\"sm\" variant=\"default\" class=\"gap-1.5\" (click)=\"dispatchPackage(pkg.packageId)\">\n                  <lucide-icon [img]=\"Truck\" class=\"size-3.5\" />\n                  Dispatch Package Now\n                </button>\n              }\n              @if (pkg.status === 'awaiting_inventory') {\n                <button ui-button size=\"sm\" variant=\"outline\" class=\"gap-1.5\">\n                  <lucide-icon [img]=\"ArrowRightLeft\" class=\"size-3.5\" />\n                  Re-route to 3PL\n                </button>\n              }\n              @if (pkg.status === 'dispatched') {\n                <span ui-badge variant=\"outline\" class=\"text-xs\">Dispatched</span>\n              }\n            </div>\n          </div>\n\n          <div ui-card-content class=\"p-0\">\n            <div ui-table>\n              <thead ui-table-header>\n                <tr ui-table-row>\n                  <th ui-table-head class=\"w-[300px]\">SKU &amp; Description</th>\n                  <th ui-table-head>Fulfillment Origin</th>\n                  <th ui-table-head class=\"text-right\">Qty</th>\n                  <th ui-table-head class=\"text-right\">Unit Price</th>\n                  <th ui-table-head class=\"text-right\">Line Total</th>\n                  <th ui-table-head>Inventory Status / ETA</th>\n                </tr>\n              </thead>\n              <tbody ui-table-body>\n                @for (item of pkg.items; track item.id) {\n                  <tr ui-table-row>\n                    <td ui-table-cell>\n                      <div class=\"text-foreground font-medium\">{{ item.name }}</div>\n                      <div class=\"text-muted-foreground font-mono text-xs\">{{ item.sku }}</div>\n                    </td>\n\n                    <td ui-table-cell>\n                      <span class=\"bg-muted text-foreground rounded px-2 py-0.5 font-mono text-xs font-medium\">{{\n                        item.originHub\n                      }}</span>\n                    </td>\n\n                    <td ui-table-cell class=\"text-right font-mono text-sm\">{{ item.qty }}</td>\n\n                    <td ui-table-cell class=\"text-muted-foreground text-right font-mono text-sm\">\n                      {{ money(item.unitPrice) }}\n                    </td>\n\n                    <td ui-table-cell class=\"text-right font-mono text-sm font-medium\">\n                      {{ money(item.qty * item.unitPrice) }}\n                    </td>\n\n                    <td ui-table-cell>\n                      @if (item.status === 'ready') {\n                        <div class=\"text-foreground flex items-center gap-1.5 text-xs\">\n                          <lucide-icon [img]=\"CheckCircle2\" class=\"size-3.5\" />\n                          <span>Allocated &amp; Packed</span>\n                        </div>\n                      }\n                      @if (item.status === 'dispatched') {\n                        <div class=\"text-foreground flex items-center gap-1.5 text-xs\">\n                          <lucide-icon [img]=\"Truck\" class=\"size-3.5\" />\n                          <span>In Transit</span>\n                        </div>\n                      }\n                      @if (item.status === 'backordered') {\n                        <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n                          <lucide-icon [img]=\"Clock\" class=\"size-3.5\" />\n                          <span>{{ item.restockEta }}</span>\n                        </div>\n                      }\n                    </td>\n                  </tr>\n                }\n              </tbody>\n            </div>\n          </div>\n        </div>\n      }\n    </div>\n  `,\n})\nexport class UiBackorderSplitShipmentManagerComponent {\n  @Input() orderId = 'ORD-SPLIT-9921'\n  @Input() customerName = 'Aero Dynamics Corp'\n  @Input() customerTier = 'Enterprise VIP · Net-30'\n  @Input('class') className?: string\n\n  protected readonly ArrowRightLeft = ArrowRightLeft\n  protected readonly CheckCircle2 = CheckCircle2\n  protected readonly Clock = Clock\n  protected readonly Send = Send\n  protected readonly Split = Split\n  protected readonly Truck = Truck\n\n  readonly packages = signal<SplitPackage[]>([\n    {\n      packageId: 'PKG-A (In Stock · WH-East)',\n      carrier: 'FedEx Priority Overnight',\n      trackingNumber: 'FX-8891-4401-US',\n      status: 'ready_to_ship',\n      items: [\n        {\n          id: 'pkg-1-1',\n          sku: 'SKU-SERVO-01',\n          name: 'Precision Micro Servo Motor 12V',\n          qty: 4,\n          unitPrice: 125,\n          originHub: 'wh-east-01',\n          status: 'ready',\n        },\n        {\n          id: 'pkg-1-2',\n          sku: 'SKU-FLANGE-99',\n          name: 'Anodized Billet Flange Mount 45mm',\n          qty: 2,\n          unitPrice: 65,\n          originHub: 'wh-east-01',\n          status: 'ready',\n        },\n      ],\n    },\n    {\n      packageId: 'PKG-B (Backordered · Sourcing WH-West)',\n      carrier: 'UPS Standard Ground',\n      status: 'awaiting_inventory',\n      items: [\n        {\n          id: 'pkg-2-1',\n          sku: 'SKU-CTRL-BOARD',\n          name: 'Industrial Embedded Controller Rev 3.2',\n          qty: 1,\n          unitPrice: 420,\n          originHub: 'wh-west-02',\n          status: 'backordered',\n          restockEta: 'Inbound PO arrives in 2 business days',\n        },\n      ],\n    },\n  ])\n\n  get hostClass(): string {\n    return cn('block w-full space-y-6', this.className)\n  }\n\n  dispatchPackage(pkgId: string): void {\n    this.packages.update((prev) =>\n      prev.map((pkg) =>\n        pkg.packageId === pkgId\n          ? {\n              ...pkg,\n              status: 'dispatched' as const,\n              items: pkg.items.map((i) => ({ ...i, status: 'dispatched' as const })),\n            }\n          : pkg,\n      ),\n    )\n  }\n\n  protected statusVariant(status: SplitPackage['status']): BadgeVariant {\n    return status === 'dispatched' ? 'default' : status === 'ready_to_ship' ? 'secondary' : 'outline'\n  }\n\n  protected statusLabel(status: SplitPackage['status']): string {\n    return status.replace(/_/g, ' ')\n  }\n\n  protected money(value: number): string {\n    return `$${value.toFixed(2)}`\n  }\n}\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/backorder-split-shipment-manager/backorder-split-shipment-manager.component.ts"
    },
    {
      "path": "packages/registry-angular/blocks/backorder-split-shipment-manager/index.ts",
      "content": "export { UiBackorderSplitShipmentManagerComponent } from './backorder-split-shipment-manager.component'\nexport type {\n  ShipmentItem,\n  SplitPackage,\n  BackorderSplitShipmentProps,\n} from './backorder-split-shipment-manager.component'\n",
      "type": "registry:block",
      "target": "~/src/app/components/blocks/backorder-split-shipment-manager/index.ts"
    }
  ],
  "dependencies": [
    "lucide-angular"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/angular/card.json",
    "https://uipkge.dev/r/angular/button.json",
    "https://uipkge.dev/r/angular/badge.json",
    "https://uipkge.dev/r/angular/table.json"
  ],
  "description": "Order fulfillment split shipment manager with stock triage, backorder tracking, and multi-node dispatch controls.",
  "categories": [
    "dashboard",
    "data-display"
  ]
}