autocomit
This commit is contained in:
+83
-4
@@ -1,11 +1,90 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { Router, ActivatedRoute } from '@angular/router';
|
||||
import { ApplicationService } from '../application.service';
|
||||
import { Application, ApplicationStatus } from '../../../shared/models/application.model';
|
||||
|
||||
@Component({
|
||||
selector: 'app-application-detail',
|
||||
standalone: true,
|
||||
imports: [CommonModule],
|
||||
template: `<div class="container"><h1>Application Detail</h1><p class="info-message">ℹ️ Coming in Story 2</p></div>`,
|
||||
styles: [`.container { max-width: 1200px; margin: 2rem auto; padding: 2rem; } .info-message { background: #e3f2fd; padding: 1rem; border-radius: 4px; }`]
|
||||
templateUrl: './application-detail.component.html',
|
||||
styleUrls: ['./application-detail.component.scss']
|
||||
})
|
||||
export class ApplicationDetailComponent {}
|
||||
export class ApplicationDetailComponent implements OnInit {
|
||||
application?: Application;
|
||||
loading = false;
|
||||
error = '';
|
||||
|
||||
constructor(
|
||||
private applicationService: ApplicationService,
|
||||
private router: Router,
|
||||
private route: ActivatedRoute
|
||||
) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
const id = this.route.snapshot.paramMap.get('id');
|
||||
if (id) {
|
||||
this.loadApplication(id);
|
||||
}
|
||||
}
|
||||
|
||||
loadApplication(id: string): void {
|
||||
this.loading = true;
|
||||
this.applicationService.getApplication(id).subscribe({
|
||||
next: (app) => {
|
||||
this.application = app;
|
||||
this.loading = false;
|
||||
},
|
||||
error: (err) => {
|
||||
this.error = 'Failed to load application';
|
||||
this.loading = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
edit(): void {
|
||||
if (this.application) {
|
||||
this.router.navigate(['/applications', this.application.id, 'edit']);
|
||||
}
|
||||
}
|
||||
|
||||
delete(): void {
|
||||
if (this.application && confirm('Are you sure you want to delete this application?')) {
|
||||
this.applicationService.deleteApplication(this.application.id).subscribe({
|
||||
next: () => {
|
||||
this.router.navigate(['/applications']);
|
||||
},
|
||||
error: (err) => {
|
||||
this.error = 'Failed to delete application';
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
back(): void {
|
||||
this.router.navigate(['/applications']);
|
||||
}
|
||||
|
||||
getStatusDisplay(status: ApplicationStatus): string {
|
||||
const displays: Record<ApplicationStatus, string> = {
|
||||
[ApplicationStatus.IDEA]: 'Idea',
|
||||
[ApplicationStatus.IN_DEVELOPMENT]: 'In Development',
|
||||
[ApplicationStatus.IN_SERVICE]: 'In Service',
|
||||
[ApplicationStatus.MAINTENANCE]: 'Maintenance',
|
||||
[ApplicationStatus.DECOMMISSIONED]: 'Decommissioned'
|
||||
};
|
||||
return displays[status] || status;
|
||||
}
|
||||
|
||||
getStatusClass(status: ApplicationStatus): string {
|
||||
const classes: Record<ApplicationStatus, string> = {
|
||||
[ApplicationStatus.IDEA]: 'status-idea',
|
||||
[ApplicationStatus.IN_DEVELOPMENT]: 'status-in-development',
|
||||
[ApplicationStatus.IN_SERVICE]: 'status-in-service',
|
||||
[ApplicationStatus.MAINTENANCE]: 'status-maintenance',
|
||||
[ApplicationStatus.DECOMMISSIONED]: 'status-decommissioned'
|
||||
};
|
||||
return classes[status] || '';
|
||||
}
|
||||
}
|
||||
|
||||
+147
-5
@@ -1,11 +1,153 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';
|
||||
import { Router, ActivatedRoute } from '@angular/router';
|
||||
import { ApplicationService } from '../application.service';
|
||||
import { BusinessUnitService } from '../../business-units/business-unit.service';
|
||||
import { ApplicationStatus } from '../../../shared/models/application.model';
|
||||
import { BusinessUnit } from '../../../shared/models/business-unit.model';
|
||||
import { Page } from '../../../shared/models/environment.model';
|
||||
|
||||
@Component({
|
||||
selector: 'app-application-form',
|
||||
standalone: true,
|
||||
imports: [CommonModule],
|
||||
template: `<div class="container"><h1>Application Form</h1><p class="info-message">ℹ️ Coming in Story 2</p></div>`,
|
||||
styles: [`.container { max-width: 1200px; margin: 2rem auto; padding: 2rem; } .info-message { background: #e3f2fd; padding: 1rem; border-radius: 4px; }`]
|
||||
imports: [CommonModule, ReactiveFormsModule],
|
||||
templateUrl: './application-form.component.html',
|
||||
styleUrls: ['./application-form.component.scss']
|
||||
})
|
||||
export class ApplicationFormComponent {}
|
||||
export class ApplicationFormComponent implements OnInit {
|
||||
form: FormGroup;
|
||||
loading = false;
|
||||
error = '';
|
||||
isEditMode = false;
|
||||
applicationId?: string;
|
||||
|
||||
businessUnits: BusinessUnit[] = [];
|
||||
statusOptions = Object.values(ApplicationStatus);
|
||||
|
||||
constructor(
|
||||
private fb: FormBuilder,
|
||||
private applicationService: ApplicationService,
|
||||
private businessUnitService: BusinessUnitService,
|
||||
private router: Router,
|
||||
private route: ActivatedRoute
|
||||
) {
|
||||
this.form = this.fb.group({
|
||||
name: ['', [Validators.required, Validators.maxLength(255)]],
|
||||
description: [''],
|
||||
status: [ApplicationStatus.IDEA, [Validators.required]],
|
||||
businessUnitId: ['', [Validators.required]],
|
||||
endOfSupportDate: [''],
|
||||
endOfLifeDate: ['']
|
||||
});
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.applicationId = this.route.snapshot.paramMap.get('id') || undefined;
|
||||
this.isEditMode = !!this.applicationId;
|
||||
|
||||
this.loadBusinessUnits();
|
||||
|
||||
if (this.isEditMode && this.applicationId) {
|
||||
this.loadApplication(this.applicationId);
|
||||
}
|
||||
}
|
||||
|
||||
loadBusinessUnits(): void {
|
||||
this.businessUnitService.getBusinessUnits(0, 100).subscribe({
|
||||
next: (data: Page<BusinessUnit>) => {
|
||||
this.businessUnits = data.content;
|
||||
},
|
||||
error: (err) => {
|
||||
this.error = 'Failed to load business units';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
loadApplication(id: string): void {
|
||||
this.loading = true;
|
||||
this.applicationService.getApplication(id).subscribe({
|
||||
next: (app) => {
|
||||
this.form.patchValue({
|
||||
name: app.name,
|
||||
description: app.description,
|
||||
status: app.status,
|
||||
businessUnitId: app.businessUnit.id,
|
||||
endOfSupportDate: app.endOfSupportDate ? this.formatDateForInput(app.endOfSupportDate) : '',
|
||||
endOfLifeDate: app.endOfLifeDate ? this.formatDateForInput(app.endOfLifeDate) : ''
|
||||
});
|
||||
this.loading = false;
|
||||
},
|
||||
error: (err) => {
|
||||
this.error = 'Failed to load application';
|
||||
this.loading = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
formatDateForInput(date: Date): string {
|
||||
const d = new Date(date);
|
||||
const year = d.getFullYear();
|
||||
const month = String(d.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(d.getDate()).padStart(2, '0');
|
||||
return `${year}-${month}-${day}`;
|
||||
}
|
||||
|
||||
onSubmit(): void {
|
||||
if (this.form.valid) {
|
||||
const endOfSupport = this.form.value.endOfSupportDate;
|
||||
const endOfLife = this.form.value.endOfLifeDate;
|
||||
|
||||
if (endOfSupport && endOfLife) {
|
||||
const supportDate = new Date(endOfSupport);
|
||||
const lifeDate = new Date(endOfLife);
|
||||
|
||||
if (supportDate > lifeDate) {
|
||||
this.error = 'End of support date must be before end of life date';
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
this.loading = true;
|
||||
this.error = '';
|
||||
|
||||
const formData = { ...this.form.value };
|
||||
|
||||
if (!formData.endOfSupportDate) {
|
||||
formData.endOfSupportDate = null;
|
||||
}
|
||||
if (!formData.endOfLifeDate) {
|
||||
formData.endOfLifeDate = null;
|
||||
}
|
||||
|
||||
const request$ = this.isEditMode && this.applicationId
|
||||
? this.applicationService.updateApplication(this.applicationId, formData)
|
||||
: this.applicationService.createApplication(formData);
|
||||
|
||||
request$.subscribe({
|
||||
next: () => {
|
||||
this.router.navigate(['/applications']);
|
||||
},
|
||||
error: (err) => {
|
||||
this.error = err.error?.message || 'Failed to save application';
|
||||
this.loading = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
cancel(): void {
|
||||
this.router.navigate(['/applications']);
|
||||
}
|
||||
|
||||
getStatusDisplay(status: ApplicationStatus): string {
|
||||
const displays: Record<ApplicationStatus, string> = {
|
||||
[ApplicationStatus.IDEA]: 'Idea',
|
||||
[ApplicationStatus.IN_DEVELOPMENT]: 'In Development',
|
||||
[ApplicationStatus.IN_SERVICE]: 'In Service',
|
||||
[ApplicationStatus.MAINTENANCE]: 'Maintenance',
|
||||
[ApplicationStatus.DECOMMISSIONED]: 'Decommissioned'
|
||||
};
|
||||
return displays[status] || status;
|
||||
}
|
||||
}
|
||||
|
||||
+175
-16
@@ -1,22 +1,181 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { Router } from '@angular/router';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import { debounceTime, distinctUntilChanged, Subject } from 'rxjs';
|
||||
import { ApplicationService } from '../application.service';
|
||||
import { BusinessUnitService } from '../../business-units/business-unit.service';
|
||||
import { Application, ApplicationStatus } from '../../../shared/models/application.model';
|
||||
import { BusinessUnit } from '../../../shared/models/business-unit.model';
|
||||
import { Page } from '../../../shared/models/environment.model';
|
||||
|
||||
@Component({
|
||||
selector: 'app-application-list',
|
||||
standalone: true,
|
||||
imports: [CommonModule],
|
||||
template: `
|
||||
<div class="container">
|
||||
<h1>Applications</h1>
|
||||
<p class="info-message">
|
||||
ℹ️ Application management will be implemented in Story 2.
|
||||
</p>
|
||||
<p>Coming soon: Create and manage applications, track lifecycle status, and link to business units.</p>
|
||||
</div>
|
||||
`,
|
||||
styles: [`
|
||||
.container { max-width: 1200px; margin: 2rem auto; padding: 2rem; }
|
||||
.info-message { background: #e3f2fd; padding: 1rem; border-radius: 4px; border-left: 4px solid #2196f3; }
|
||||
`]
|
||||
imports: [CommonModule, FormsModule],
|
||||
templateUrl: './application-list.component.html',
|
||||
styleUrls: ['./application-list.component.scss']
|
||||
})
|
||||
export class ApplicationListComponent {}
|
||||
export class ApplicationListComponent implements OnInit {
|
||||
applications: Application[] = [];
|
||||
businessUnits: BusinessUnit[] = [];
|
||||
loading = false;
|
||||
error = '';
|
||||
|
||||
page = 0;
|
||||
size = 20;
|
||||
totalElements = 0;
|
||||
totalPages = 0;
|
||||
|
||||
searchQuery = '';
|
||||
selectedStatus = '';
|
||||
selectedBusinessUnitId = '';
|
||||
|
||||
statusOptions = Object.values(ApplicationStatus);
|
||||
|
||||
private searchSubject = new Subject<string>();
|
||||
|
||||
constructor(
|
||||
private applicationService: ApplicationService,
|
||||
private businessUnitService: BusinessUnitService,
|
||||
private router: Router
|
||||
) {
|
||||
this.searchSubject.pipe(
|
||||
debounceTime(300),
|
||||
distinctUntilChanged()
|
||||
).subscribe(() => {
|
||||
this.page = 0;
|
||||
this.loadApplications();
|
||||
});
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.loadBusinessUnits();
|
||||
this.loadApplications();
|
||||
}
|
||||
|
||||
loadBusinessUnits(): void {
|
||||
this.businessUnitService.getBusinessUnits(0, 100).subscribe({
|
||||
next: (data: Page<BusinessUnit>) => {
|
||||
this.businessUnits = data.content;
|
||||
},
|
||||
error: (err) => {
|
||||
console.error('Failed to load business units', err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
loadApplications(): void {
|
||||
this.loading = true;
|
||||
const filters: any = {};
|
||||
|
||||
if (this.selectedStatus) {
|
||||
filters.status = this.selectedStatus;
|
||||
}
|
||||
if (this.selectedBusinessUnitId) {
|
||||
filters.businessUnitId = this.selectedBusinessUnitId;
|
||||
}
|
||||
if (this.searchQuery && this.searchQuery.trim() !== '') {
|
||||
filters.name = this.searchQuery.trim();
|
||||
}
|
||||
|
||||
this.applicationService.getApplications(filters, this.page, this.size).subscribe({
|
||||
next: (data: Page<Application>) => {
|
||||
this.applications = data.content;
|
||||
this.totalElements = data.totalElements;
|
||||
this.totalPages = data.totalPages;
|
||||
this.loading = false;
|
||||
},
|
||||
error: (err) => {
|
||||
this.error = 'Failed to load applications';
|
||||
this.loading = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
onSearchChange(query: string): void {
|
||||
this.searchQuery = query;
|
||||
this.searchSubject.next(query);
|
||||
}
|
||||
|
||||
onFilterChange(): void {
|
||||
this.page = 0;
|
||||
this.loadApplications();
|
||||
}
|
||||
|
||||
createNew(): void {
|
||||
this.router.navigate(['/applications/new']);
|
||||
}
|
||||
|
||||
viewDetails(id: string): void {
|
||||
this.router.navigate(['/applications', id]);
|
||||
}
|
||||
|
||||
edit(id: string): void {
|
||||
this.router.navigate(['/applications', id, 'edit']);
|
||||
}
|
||||
|
||||
changeStatus(id: string, newStatus: string): void {
|
||||
if (!newStatus || newStatus === 'Change Status') {
|
||||
return;
|
||||
}
|
||||
|
||||
this.applicationService.updateStatus(id, newStatus as ApplicationStatus).subscribe({
|
||||
next: () => {
|
||||
this.loadApplications();
|
||||
},
|
||||
error: (err) => {
|
||||
this.error = 'Failed to update status';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
delete(id: string): void {
|
||||
if (confirm('Are you sure you want to delete this application?')) {
|
||||
this.applicationService.deleteApplication(id).subscribe({
|
||||
next: () => {
|
||||
this.loadApplications();
|
||||
},
|
||||
error: (err) => {
|
||||
this.error = 'Failed to delete application';
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
nextPage(): void {
|
||||
if (this.page < this.totalPages - 1) {
|
||||
this.page++;
|
||||
this.loadApplications();
|
||||
}
|
||||
}
|
||||
|
||||
previousPage(): void {
|
||||
if (this.page > 0) {
|
||||
this.page--;
|
||||
this.loadApplications();
|
||||
}
|
||||
}
|
||||
|
||||
getStatusDisplay(status: ApplicationStatus): string {
|
||||
const displays: Record<ApplicationStatus, string> = {
|
||||
[ApplicationStatus.IDEA]: 'Idea',
|
||||
[ApplicationStatus.IN_DEVELOPMENT]: 'In Development',
|
||||
[ApplicationStatus.IN_SERVICE]: 'In Service',
|
||||
[ApplicationStatus.MAINTENANCE]: 'Maintenance',
|
||||
[ApplicationStatus.DECOMMISSIONED]: 'Decommissioned'
|
||||
};
|
||||
return displays[status] || status;
|
||||
}
|
||||
|
||||
getStatusClass(status: ApplicationStatus): string {
|
||||
const classes: Record<ApplicationStatus, string> = {
|
||||
[ApplicationStatus.IDEA]: 'status-idea',
|
||||
[ApplicationStatus.IN_DEVELOPMENT]: 'status-in-development',
|
||||
[ApplicationStatus.IN_SERVICE]: 'status-in-service',
|
||||
[ApplicationStatus.MAINTENANCE]: 'status-maintenance',
|
||||
[ApplicationStatus.DECOMMISSIONED]: 'status-decommissioned'
|
||||
};
|
||||
return classes[status] || '';
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user