import { DatePipe, NgIf, DecimalPipe, JsonPipe } from '@angular/common'; import { HttpClient } from '@angular/common/http'; import { Component, OnInit, ViewChild } from '@angular/core'; import { UntypedFormGroup, UntypedFormBuilder, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatSort, MatSortModule } from '@angular/material/sort'; import { MatTableDataSource, MatTableModule } from '@angular/material/table'; import { ActivatedRoute, RouterLink } from '@angular/router'; import { Layer, LayerType } from 'src/app/models/layer.model'; import { Record } from 'src/app/models/record.model'; import { NotificationsService } from 'src/app/services/notifications.service'; import { environment } from 'src/environments/environment'; import { MatInputModule } from '@angular/material/input'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatGridListModule } from '@angular/material/grid-list'; import { MatButtonModule } from '@angular/material/button'; import { MatCardModule } from '@angular/material/card'; @Component({ selector: 'diunabi-layer-detail', templateUrl: './layer-detail.component.html', styleUrls: ['./layer-detail.component.scss'], standalone: true, imports: [FormsModule, ReactiveFormsModule, MatCardModule, MatButtonModule, MatGridListModule, MatFormFieldModule, MatInputModule, NgIf, MatTableModule, MatSortModule, DecimalPipe, JsonPipe, RouterLink], providers: [DatePipe] }) export class LayerDetailComponent implements OnInit { public form!: UntypedFormGroup; public document!: Layer; valueSum = 0; displayedColumns = environment.views.layers.recordColumns.split("|"); dataSource!: MatTableDataSource; LayerType = LayerType; @ViewChild(MatSort) sort!: MatSort; constructor( private fb$: UntypedFormBuilder, private http$: HttpClient, private route$: ActivatedRoute, private datePipe: DatePipe, private notifications$: NotificationsService ) { this.form = Layer.getForm(this.fb$); } async ngOnInit() { this.document = await this.load(); this.dataSource = new MatTableDataSource(this.document.records); this.dataSource.sort = this.sort; this.document.fillForm(this.form); this.form.disable(); this.document.created = `${this.datePipe.transform(this.document.createdAt?.toDate(), 'short')}, ${this.document.createdBy?.userName}`; this.document.modified = `${this.datePipe.transform(this.document.modifiedAt?.toDate(), 'short')}, ${this.document.modifiedBy?.userName}`; this.valueSum = this.document.records.map(t => t.value1 || 0).reduce((acc, value) => acc + value, 0); this.createColumns(); } private async load(): Promise { return await Layer.getById(this.route$.snapshot.paramMap.get('id') || "", this.http$); } createColumns() { this.displayedColumns = ['code']; for (let i = 1; i < 33; i++) { for (const record of this.document.records) { const propertyName = `value${i}` as keyof typeof record; if (record[propertyName] !== null) { this.displayedColumns.push(`value${i}`); break; } } } for (let i = 1; i < 6; i++) { for (const record of this.document.records) { const propertyName = `desc${i}` as keyof typeof record; if (record[propertyName] !== null) { this.displayedColumns.push(`desc${i}`); break; } } } } async export() { if (await Layer.exportToGoogleSheet(this.document.id || "", this.http$)) { this.notifications$.add({ text: "The file was saved on Google Drive", }); } else { this.notifications$.add({ text: "Save failed!", }); } } }