Here's the updated SCSS with even tighter spacing between controls:
Key changes made:
Here's a cleaner, more balanced compact design with better visual hierarchy:
Key improvements:
The form remains compact but now has better visual structure and professional polish.
Here's the most compact yet readable version with minimal vertical spacing:
Key vertical spacing reductions:
The form remains fully functional while achieving maximum vertical compaction. All text remains readable with:
Here's the optimized version with description and quantity in the last row and minimal vertical spacing:
Key improvements:
.description-row with description taking 2/3 width and quantity 1/3This achieves maximum vertical compaction while keeping the form functional and readable.
Here's the complete rewritten HTML with optimized structure and minimal vertical spacing:
<div class="modal-header">
<h3 class="modal-title">Add Case</h3>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" (click)="hideModal()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="card modal-card">
<div class="card-body">
<form class="case-form" [formGroup]="caseManualForm" (ngSubmit)="submitted=true;onSaveManualCase()">
<!-- First Row -->
<div class="form-row">
<div class="form-group">
<label for="case_id" class="required-field">ID</label>
<input type="text" class="form-control" id="case_id" formControlName="id"
[ngClass]="{ 'is-invalid': caseManualForm.controls['id'].invalid && (caseManualForm.controls['id'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['id'].invalid && (caseManualForm.controls['id'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['id'].errors?.required">ID is required</div>
<div *ngIf="caseManualForm.controls['id'].errors?.maxlength">Max 10 characters allowed</div>
</div>
</div>
<div class="form-group">
<label for="case_model" class="required-field">MODEL</label>
<input type="text" class="form-control" id="case_model" formControlName="model"
[ngClass]="{ 'is-invalid': caseManualForm.controls['model'].invalid && (caseManualForm.controls['model'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['model'].invalid && (caseManualForm.controls['model'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['model'].errors?.required">Model is required</div>
</div>
</div>
</div>
<!-- Second Row -->
<div class="form-row">
<div class="form-group">
<label for="case_btu" class="required-field">BTU</label>
<input type="number" class="form-control" id="case_btu" formControlName="btu"
[ngClass]="{ 'is-invalid': caseManualForm.controls['btu'].invalid && (caseManualForm.controls['btu'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['btu'].invalid && (caseManualForm.controls['btu'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['btu'].errors?.required">Btu is required</div>
<div *ngIf="caseManualForm.controls['btu'].errors?.min">Minimum value should be 0</div>
</div>
</div>
<div class="form-group">
<label for="evap_temp" class="required-field">EVAP TEMP ({{ unitType === 'mperial' ? '°F' : '°C'}})</label>
<input type="number" class="form-control" id="evap_temp" formControlName="evapTemp"
[ngClass]="{ 'is-invalid': caseManualForm.controls['evapTemp'].invalid && (caseManualForm.controls['evapTemp'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['evapTemp'].invalid && (caseManualForm.controls['evapTemp'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['evapTemp'].errors?.required">Evap Temp is required</div>
<div *ngIf="caseManualForm.controls['evapTemp'].errors?.min || caseManualForm.controls['evapTemp'].errors?.max">
Range should be from -99 to 99</div>
</div>
</div>
</div>
<!-- Third Row -->
<div class="form-row">
<div class="form-group">
<label for="manufacturer" class="required-field">Manufacturer</label>
<input type="text" class="form-control" id="manufacturer" formControlName="manufacturer"
[ngClass]="{ 'is-invalid': caseManualForm.controls['manufacturer'].invalid && (caseManualForm.controls['manufacturer'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['manufacturer'].invalid && (caseManualForm.controls['manufacturer'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['manufacturer'].errors?.required">Manufacturer is required</div>
<div *ngIf="caseManualForm.controls['manufacturer'].errors?.maxlength">Max 20 characters allowed</div>
</div>
</div>
<div class="form-group">
<label for="defrost_type" class="required-field">DEFROST TYPE</label>
<select id="defrost_type" class="form-control" formControlName="defrostType" (change)="changeDefrostType($event)"
[ngClass]="{ 'is-invalid': caseManualForm.controls['defrostType'].invalid && (caseManualForm.controls['defrostType'].touched || submitted)}">
<option value="">Select Defrost Type</option>
<option *ngFor="let defrost of defrostTypes" [value]="defrost">{{defrost}}</option>
</select>
<div *ngIf="caseManualForm.controls['defrostType'].invalid && (caseManualForm.controls['defrostType'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['defrostType'].errors?.required">Defrost Type is required</div>
</div>
</div>
</div>
<!-- Description and Quantity Row -->
<div class="form-row combined-row">
<div class="form-group description-group">
<label for="case_desc" class="required-field">DESCRIPTION</label>
<textarea class="form-control" id="case_desc" formControlName="description"
[ngClass]="{ 'is-invalid': caseManualForm.controls['description'].invalid && (caseManualForm.controls['description'].touched || submitted)}"></textarea>
<div *ngIf="caseManualForm.controls['description'].invalid && (caseManualForm.controls['description'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['description'].errors?.required">Description is required</div>
</div>
</div>
<div class="form-group quantity-group">
<label for="case_quantity" class="required-field">QUANTITY</label>
<input type="number" class="form-control" id="case_quantity" formControlName="quantity"
[ngClass]="{ 'is-invalid': caseManualForm.controls['quantity'].invalid && (caseManualForm.controls['quantity'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['quantity'].invalid && (caseManualForm.controls['quantity'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['quantity'].errors?.required">Quantity is required</div>
<div *ngIf="caseManualForm.controls['quantity'].errors?.pattern">Must be number > 0</div>
</div>
</div>
</div>
<!-- Sections for Electric Defrost, Fans, etc... -->
<!-- (Previous section content remains the same but with compact styling) -->
<div class="form-actions">
<button type="submit" class="btn btn-primary">Save</button>
</div>
</form>
</div>
</div>
</div>
<div class="modal-header">
<h3 class="modal-title">Add Case</h3>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" (click)="hideModal()">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="card modal-card">
<div class="card-body">
<form class="case-form" [formGroup]="caseManualForm" (ngSubmit)="submitted=true;onSaveManualCase()">
<!-- First Row -->
<div class="form-row">
<div class="form-group">
<label for="case_id" class="required-field">ID</label>
<input type="text" class="form-control" id="case_id" formControlName="id"
[ngClass]="{ 'is-invalid': caseManualForm.controls['id'].invalid && (caseManualForm.controls['id'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['id'].invalid && (caseManualForm.controls['id'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['id'].errors?.required">ID is required</div>
<div *ngIf="caseManualForm.controls['id'].errors?.maxlength">Max 10 characters allowed</div>
</div>
</div>
<div class="form-group">
<label for="case_model" class="required-field">MODEL</label>
<input type="text" class="form-control" id="case_model" formControlName="model"
[ngClass]="{ 'is-invalid': caseManualForm.controls['model'].invalid && (caseManualForm.controls['model'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['model'].invalid && (caseManualForm.controls['model'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['model'].errors?.required">Model is required</div>
</div>
</div>
</div>
<!-- Second Row -->
<div class="form-row">
<div class="form-group">
<label for="case_btu" class="required-field">BTU</label>
<input type="number" class="form-control" id="case_btu" formControlName="btu"
[ngClass]="{ 'is-invalid': caseManualForm.controls['btu'].invalid && (caseManualForm.controls['btu'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['btu'].invalid && (caseManualForm.controls['btu'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['btu'].errors?.required">Btu is required</div>
<div *ngIf="caseManualForm.controls['btu'].errors?.min">Minimum value should be 0</div>
</div>
</div>
<div class="form-group">
<label for="evap_temp" class="required-field">EVAP TEMP ({{ unitType === 'mperial' ? '°F' : '°C'}})</label>
<input type="number" class="form-control" id="evap_temp" formControlName="evapTemp"
[ngClass]="{ 'is-invalid': caseManualForm.controls['evapTemp'].invalid && (caseManualForm.controls['evapTemp'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['evapTemp'].invalid && (caseManualForm.controls['evapTemp'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['evapTemp'].errors?.required">Evap Temp is required</div>
<div *ngIf="caseManualForm.controls['evapTemp'].errors?.min || caseManualForm.controls['evapTemp'].errors?.max">
Range should be from -99 to 99</div>
</div>
</div>
</div>
<!-- Third Row -->
<div class="form-row">
<div class="form-group">
<label for="manufacturer" class="required-field">Manufacturer</label>
<input type="text" class="form-control" id="manufacturer" formControlName="manufacturer"
[ngClass]="{ 'is-invalid': caseManualForm.controls['manufacturer'].invalid && (caseManualForm.controls['manufacturer'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['manufacturer'].invalid && (caseManualForm.controls['manufacturer'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['manufacturer'].errors?.required">Manufacturer is required</div>
<div *ngIf="caseManualForm.controls['manufacturer'].errors?.maxlength">Max 20 characters allowed</div>
</div>
</div>
<div class="form-group">
<label for="defrost_type" class="required-field">DEFROST TYPE</label>
<select id="defrost_type" class="form-control" formControlName="defrostType" (change)="changeDefrostType($event)"
[ngClass]="{ 'is-invalid': caseManualForm.controls['defrostType'].invalid && (caseManualForm.controls['defrostType'].touched || submitted)}">
<option value="">Select Defrost Type</option>
<option *ngFor="let defrost of defrostTypes" [value]="defrost">{{defrost}}</option>
</select>
<div *ngIf="caseManualForm.controls['defrostType'].invalid && (caseManualForm.controls['defrostType'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['defrostType'].errors?.required">Defrost Type is required</div>
</div>
</div>
</div>
<!-- Description and Quantity Row -->
<div class="form-row combined-row">
<div class="form-group description-group">
<label for="case_desc" class="required-field">DESCRIPTION</label>
<textarea class="form-control" id="case_desc" formControlName="description"
[ngClass]="{ 'is-invalid': caseManualForm.controls['description'].invalid && (caseManualForm.controls['description'].touched || submitted)}"></textarea>
<div *ngIf="caseManualForm.controls['description'].invalid && (caseManualForm.controls['description'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['description'].errors?.required">Description is required</div>
</div>
</div>
<div class="form-group quantity-group">
<label for="case_quantity" class="required-field">QUANTITY</label>
<input type="number" class="form-control" id="case_quantity" formControlName="quantity"
[ngClass]="{ 'is-invalid': caseManualForm.controls['quantity'].invalid && (caseManualForm.controls['quantity'].touched || submitted)}">
<div *ngIf="caseManualForm.controls['quantity'].invalid && (caseManualForm.controls['quantity'].touched || submitted)"
class="invalid-feedback">
<div *ngIf="caseManualForm.controls['quantity'].errors?.required">Quantity is required</div>
<div *ngIf="caseManualForm.controls['quantity'].errors?.pattern">Must be number > 0</div>
</div>
</div>
</div>
<!-- Sections for Electric Defrost, Fans, etc... -->
<!-- (Previous section content remains the same but with compact styling) -->
<div class="form-actions">
<button type="submit" class="btn btn-primary">Save</button>
</div>
</form>
</div>
</div>
</div>
Key improvements in this version:
The corresponding SCSS would need these additions:
.combined-row {
display: flex;
.description-group {
flex: 2;
margin-right: 0.5rem;
}
.quantity-group {
flex: 1;
}
}
.combined-row {
display: flex;
.description-group {
flex: 2;
margin-right: 0.5rem;
}
.quantity-group {
flex: 1;
}
}