feat: manage tenants and leases (#4)

This commit is contained in:
nessar committed 2026-08-17 14:18:14 +02:00
1 parent 26ab037084
commit 8603b98714
42 files changed
+3089 -18

No files matched your search

+95
View File
@@ -12,6 +12,10 @@ import { DashboardPage } from './components/dashboard-page/dashboard-page';
import { ApartmentsPage } from './components/apartments-page/apartments-page';
import { ApartmentSaveRequest } from './components/apartments-page/apartments-page';
import { SettingsPage } from './components/settings-page/settings-page';
import { Tenant, TenantService } from './services/tenant.service';
import { Lease, LeaseService } from './services/lease.service';
import { TenantsPage, TenantSaveRequest } from './components/tenants-page/tenants-page';
import { LeasesPage } from './components/leases-page/leases-page';
@Component({
selector: 'app-root',
@@ -21,6 +25,8 @@ import { SettingsPage } from './components/settings-page/settings-page';
WorkspaceNavigation,
DashboardPage,
ApartmentsPage,
TenantsPage,
LeasesPage,
SettingsPage,
],
templateUrl: './app.html',
@@ -33,6 +39,8 @@ export class App implements OnInit {
// Tab & CRUD States
readonly activeTab = signal<WorkspaceTab>('dashboard');
readonly apartments = signal<Apartment[]>([]);
readonly tenants = signal<Tenant[]>([]);
readonly leases = signal<Lease[]>([]);
private readonly _isLoggedIn = signal<boolean>(false);
private readonly _username = signal<string>('');
private readonly _email = signal<string>('');
@@ -40,6 +48,8 @@ export class App implements OnInit {
private readonly http = inject(HttpClient);
private readonly apartmentService = inject(ApartmentService);
private readonly tenantService = inject(TenantService);
private readonly leaseService = inject(LeaseService);
protected readonly themeService = inject(ThemeService);
readonly themePreference = this.themeService.preference;
@@ -47,6 +57,8 @@ export class App implements OnInit {
effect(() => {
if (this.isLoggedIn) {
this.loadApartments();
this.loadTenants();
this.loadLeases();
}
});
}
@@ -139,4 +151,87 @@ export class App implements OnInit {
});
}
}
loadTenants(): void {
this.tenantService.getTenants().subscribe({
next: (data) => this.tenants.set(data),
error: (err) => console.error('Error loading tenants', err),
});
}
saveTenant({ tenant, tenantId }: TenantSaveRequest): void {
const request = tenantId
? this.tenantService.updateTenant(tenantId, tenant)
: this.tenantService.createTenant(tenant);
request.subscribe({
next: () => this.loadTenants(),
error: (err) => console.error('Error saving tenant', err),
});
}
deleteTenant(id: string): void {
if (confirm('Êtes-vous sûr de vouloir supprimer ce locataire ?')) {
this.tenantService.deleteTenant(id).subscribe({
next: () => this.loadTenants(),
error: (err) => console.error('Error deleting tenant', err),
});
}
}
uploadTenantAttachment(request: { tenantId: string; file: File }): void {
this.tenantService.uploadAttachment(request.tenantId, request.file).subscribe({
next: () => this.loadTenants(),
error: (err) => console.error('Error uploading tenant attachment', err),
});
}
downloadTenantAttachment(request: {
tenantId: string;
attachment: { id: string; fileName: string };
}): void {
this.tenantService.downloadAttachment(request.tenantId, request.attachment.id).subscribe({
next: (blob) => this.saveBlob(blob, request.attachment.fileName),
error: (err) => console.error('Error downloading tenant attachment', err),
});
}
loadLeases(): void {
this.leaseService.getLeases().subscribe({
next: (data) => this.leases.set(data),
error: (err) => console.error('Error loading leases', err),
});
}
saveLease(lease: Lease): void {
this.leaseService.createLease(lease).subscribe({
next: () => this.loadLeases(),
error: (err) => console.error('Error saving lease', err),
});
}
deleteLease(id: string): void {
if (confirm('Êtes-vous sûr de vouloir supprimer ce bail ?')) {
this.leaseService.deleteLease(id).subscribe({
next: () => this.loadLeases(),
error: (err) => console.error('Error deleting lease', err),
});
}
}
downloadLeasePdf(lease: Lease): void {
if (!lease.id) return;
this.leaseService.downloadPdf(lease.id).subscribe({
next: (blob) => this.saveBlob(blob, `bail-${lease.id}.pdf`),
error: (err) => console.error('Error downloading lease PDF', err),
});
}
private saveBlob(blob: Blob, fileName: string): void {
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = fileName;
link.click();
URL.revokeObjectURL(url);
}
}