// project-edit-dialog.component.ts (TÜMÜ) - Template inline olarak
import { Component, Inject, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormBuilder, FormGroup, Validators, ReactiveFormsModule, FormArray } from '@angular/forms';
import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatSelectModule } from '@angular/material/select';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatChipsModule } from '@angular/material/chips';
import { MatDividerModule } from '@angular/material/divider';
import { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';
import { ApiService } from '../../services/api.service';
export interface ProjectDialogData {
mode: 'create' | 'edit';
project?: any;
}
@Component({
selector: 'app-project-edit-dialog',
standalone: true,
imports: [
CommonModule,
ReactiveFormsModule,
MatDialogModule,
MatFormFieldModule,
MatInputModule,
MatSelectModule,
MatCheckboxModule,
MatButtonModule,
MatIconModule,
MatChipsModule,
MatDividerModule,
MatSnackBarModule
],
template: `
{{ data.mode === 'create' ? 'Create New Project' : 'Edit Project' }}
`,
styleUrls: ['./project-edit-dialog.component.scss']
})
export default class ProjectEditDialogComponent implements OnInit {
form!: FormGroup;
saving = false;
projectIcons = ['folder', 'work', 'shopping_cart', 'school', 'local_hospital', 'restaurant', 'home', 'business'];
languages = [
{ code: 'tr', name: 'Turkish' },
{ code: 'en', name: 'English' },
{ code: 'de', name: 'German' },
{ code: 'fr', name: 'French' },
{ code: 'es', name: 'Spanish' }
];
timezones = [
'Europe/Istanbul',
'Europe/London',
'Europe/Berlin',
'America/New_York',
'America/Los_Angeles',
'Asia/Tokyo'
];
constructor(
private fb: FormBuilder,
private apiService: ApiService,
private snackBar: MatSnackBar,
public dialogRef: MatDialogRef,
@Inject(MAT_DIALOG_DATA) public data: ProjectDialogData
) {}
ngOnInit() {
this.initializeForm();
if (this.data.mode === 'edit' && this.data.project) {
this.form.patchValue({
name: this.data.project.name,
caption: this.data.project.caption || '',
icon: this.data.project.icon || 'folder',
description: this.data.project.description || '',
defaultLanguage: this.data.project.default_language || 'tr',
supportedLanguages: this.data.project.supported_languages || ['tr'],
timezone: this.data.project.timezone || 'Europe/Istanbul',
region: this.data.project.region || 'tr-TR'
});
// Rebuild test users form array
const testUsersArray = this.form.get('testUsers') as FormArray;
testUsersArray.clear();
(this.data.project.test_users || []).forEach((phoneNumber: string) => {
testUsersArray.push(this.fb.control(phoneNumber, Validators.required));
});
}
}
initializeForm() {
this.form = this.fb.group({
name: ['', [Validators.required, Validators.pattern(/^[a-z0-9_]+$/)]],
caption: ['', Validators.required],
icon: ['folder'],
description: [''],
defaultLanguage: ['tr'],
supportedLanguages: [['tr']],
timezone: ['Europe/Istanbul'],
region: ['tr-TR']
// testUsers kaldırıldı
});
}
async save() {
if (this.form.invalid) {
this.form.markAllAsTouched();
return;
}
this.saving = true;
try {
const formValue = this.form.value;
// Base project data
const baseProjectData = {
name: formValue.name,
caption: formValue.caption,
icon: formValue.icon,
description: formValue.description,
default_language: formValue.defaultLanguage,
supported_languages: formValue.supportedLanguages,
timezone: formValue.timezone,
region: formValue.region
};
let result;
if (this.data.mode === 'create') {
result = await this.apiService.createProject(baseProjectData).toPromise();
this.showMessage('Project created successfully!', false);
} else {
// Edit mode için ek alanlarla birlikte gönder
const updateProjectData = {
...baseProjectData,
id: this.data.project.id,
last_update_date: this.data.project.last_update_date
};
result = await this.apiService.updateProject(this.data.project.id, updateProjectData).toPromise();
this.showMessage('Project updated successfully!', false);
}
this.dialogRef.close(result);
} catch (error: any) {
if (error.status === 409) {
this.showMessage('This record was modified by another user. Please reload and try again.', true);
} else {
this.showMessage(error.error?.detail || 'Operation failed', true);
}
} finally {
this.saving = false;
}
}
private showMessage(message: string, isError: boolean) {
this.snackBar.open(message, 'Close', {
duration: isError ? 5000 : 3000,
panelClass: isError ? 'error-snackbar' : 'success-snackbar'
});
}
close() {
this.dialogRef.close();
}
}