{{ dialogTitle() }}

@if (lookupsLoading()) {

Loading material options…

} @if (!lookupsLoading()) {
@if (serverError()) { }

Material

Base Material @for (base of materialBases(); track base.id) { {{ base.name }} } @if (form.get('materialBaseId')!.hasError('required') && form.get('materialBaseId')!.touched) { Base material is required } Finish Select a base material first @for (finish of filteredFinishes(); track finish.id) { {{ finish.name }} } @if (form.get('materialFinishId')!.hasError('required') && form.get('materialFinishId')!.touched) { Finish is required } @if (filteredFinishes().length === 0 && form.get('materialBaseId')!.value) { No finishes available for this material } Modifier (optional) None @for (modifier of filteredModifiers(); track modifier.id) { {{ modifier.name }} } @if (filteredModifiers().length === 0 && form.get('materialBaseId')!.value) { No modifiers available for this material }

Spool Details

Brand @if (form.get('brand')!.hasError('required') && form.get('brand')!.touched) { Brand is required } Serial Number @if (form.get('spoolSerial')!.hasError('required') && form.get('spoolSerial')!.touched) { Serial number is required }
Color Name @if (form.get('colorName')!.hasError('required') && form.get('colorName')!.touched) { Color name is required } Color Hex @if (form.get('colorHex')!.hasError('required') && form.get('colorHex')!.touched) { Color hex is required } @if (form.get('colorHex')!.hasError('pattern') && form.get('colorHex')!.touched) { Must be #RRGGBB format }

Weight & Dimensions

Diameter (mm) @if (form.get('filamentDiameterMm')!.hasError('required') && form.get('filamentDiameterMm')!.touched) { Diameter is required }
Total Weight (g) Full spool weight @if (form.get('weightTotalGrams')!.hasError('required') && form.get('weightTotalGrams')!.touched) { Total weight is required } Remaining Weight (g) Current remaining @if (form.get('weightRemainingGrams')!.hasError('required') && form.get('weightRemainingGrams')!.touched) { Remaining weight is required } @if (form.get('weightRemainingGrams')!.hasError('exceedsTotal')) { Cannot exceed total weight }

Purchase & Status

Price $ @if (form.get('purchasePrice')!.hasError('min') && form.get('purchasePrice')!.touched) { Price must be non-negative } Purchase Date
Spool is active and available for use
}