Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Improve] Add project module dialog #8555

Merged
merged 2 commits into from
Dec 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/ach.json
Original file line number Diff line number Diff line change
Expand Up @@ -3349,7 +3349,10 @@
"TIME_LOG_DELETED": "crwdns11014:0{{ name }}crwdnd11014:0{{ organization }}crwdne11014:0",
"TIME_LOGS_DELETED": "crwdns11016:0{{ organization }}crwdne11016:0",
"BUCKET_CREATED": "crwdns10996:0{{ bucket }}crwdnd10996:0{{ region }}crwdne10996:0",
"AUTHORIZED_TO_WORK": "crwdns11529:0{{ name }}crwdne11529:0"
"AUTHORIZED_TO_WORK": "crwdns11529:0{{ name }}crwdne11529:0",
"MODULE_CREATED": "Module neno kibalo niber.",
"MODULE_UPDATED": "Module neno me kicari maber.",
"MODULE_SAVE_ERROR": "Kwero module ma neno opire."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -3605,7 +3605,10 @@
"AUTHORIZED_TO_WORK": "{{ name }} مصرح له بالعمل",
"EMAIL_VERIFICATION_NOT_VALID": "عذراً، رابط التحقق هذا غير صالح.",
"EMAIL_VERIFICATION_VALID": "تهانينا! تم التحقق الآن من عنوان بريدك الإلكتروني.",
"SCREEN_CAPTURE_CHANGED": "تم تغيير حالة التقاط الشاشة لـ {{ name }}"
"SCREEN_CAPTURE_CHANGED": "تم تغيير حالة التقاط الشاشة لـ {{ name }}",
"MODULE_CREATED": "تم إنشاء الوحدة بنجاح!",
"MODULE_UPDATED": "تم تحديث الوحدة بنجاح!",
"MODULE_SAVE_ERROR": "فشل في حفظ الوحدة. حاول مرة أخرى."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/bg.json
Original file line number Diff line number Diff line change
Expand Up @@ -3656,7 +3656,10 @@
"TIME_LOG_DELETED": "Времевият запис за '{{ name }}' беше премахнат от '{{ organization }}'",
"TIME_LOGS_DELETED": "Времевите записи бяха премахнати от '{{ organization }}'",
"BUCKET_CREATED": "'{{ bucket }}' за '{{ region }}' беше успешно създаден",
"AUTHORIZED_TO_WORK": "{{ name }} има право да работи"
"AUTHORIZED_TO_WORK": "{{ name }} има право да работи",
"MODULE_CREATED": "Модулът е създаден успешно!",
"MODULE_UPDATED": "Модулът е актуализиран успешно!",
"MODULE_SAVE_ERROR": "Неуспешно записване на модула. Моля, опитайте отново."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -3603,7 +3603,10 @@
"AUTHORIZED_TO_WORK": "{{ name }} ist berechtigt zu arbeiten.",
"EMAIL_VERIFICATION_NOT_VALID": "Entschuldigung, dieser Bestätigungslink ist ungültig.",
"EMAIL_VERIFICATION_VALID": "Herzlichen Glückwunsch! Deine E-Mail ist jetzt verifiziert.",
"SCREEN_CAPTURE_CHANGED": "Bildschirmaufnahme-Status geändert für {{ name }}"
"SCREEN_CAPTURE_CHANGED": "Bildschirmaufnahme-Status geändert für {{ name }}",
"MODULE_CREATED": "Modul erfolgreich erstellt!",
"MODULE_UPDATED": "Modul erfolgreich aktualisiert!",
"MODULE_SAVE_ERROR": "Das Speichern des Moduls ist fehlgeschlagen. Bitte versuchen Sie es erneut."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -3734,7 +3734,10 @@
"AUTHORIZED_TO_WORK": "{{ name }} is authorized to work",
"EMAIL_VERIFICATION_NOT_VALID": "Sorry, this verification link is not valid.",
"EMAIL_VERIFICATION_VALID": "Congrats! Your email is now verified.",
"SCREEN_CAPTURE_CHANGED": "Screen capture status changed for {{ name }}"
"SCREEN_CAPTURE_CHANGED": "Screen capture status changed for {{ name }}",
"MODULE_CREATED": "Module created successfully!",
"MODULE_UPDATED": "Module updated successfully!",
"MODULE_SAVE_ERROR": "Failed to save the module. Please try again."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -3609,7 +3609,10 @@
"AUTHORIZED_TO_WORK": "{{ name }} está autorizado para trabajar.",
"EMAIL_VERIFICATION_NOT_VALID": "Disculpa, este enlace de verificación no es válido.",
"EMAIL_VERIFICATION_VALID": "¡Felicidades! Tu correo electrónico ahora está verificado.",
"SCREEN_CAPTURE_CHANGED": "Estado del capturador de pantalla cambiado para {{ name }}"
"SCREEN_CAPTURE_CHANGED": "Estado del capturador de pantalla cambiado para {{ name }}",
"MODULE_CREATED": "¡Módulo creado con éxito!",
"MODULE_UPDATED": "¡Módulo actualizado con éxito!",
"MODULE_SAVE_ERROR": "Error al guardar el módulo. Por favor, inténtelo de nuevo."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -3608,7 +3608,10 @@
"AUTHORIZED_TO_WORK": "{{ name }} est autorisé à travailler.",
"EMAIL_VERIFICATION_NOT_VALID": "Désolé, ce lien de vérification n'est pas valide.",
"EMAIL_VERIFICATION_VALID": "Félicitations ! Votre adresse e-mail est désormais vérifiée.",
"SCREEN_CAPTURE_CHANGED": "Statut de capture d'écran modifié pour {{ name }}."
"SCREEN_CAPTURE_CHANGED": "Statut de capture d'écran modifié pour {{ name }}.",
"MODULE_CREATED": "Module créé avec succès !",
"MODULE_UPDATED": "Module mis à jour avec succès !",
"MODULE_SAVE_ERROR": "Échec de l'enregistrement du module. Veuillez réessayer."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/he.json
Original file line number Diff line number Diff line change
Expand Up @@ -3620,7 +3620,10 @@
"TIME_LOG_DELETED": "Time log for '{{ name }}' removed from '{{ organization }}'",
"TIME_LOGS_DELETED": "Time logs removed from '{{ organization }}'",
"BUCKET_CREATED": "'{{ bucket }}' for '{{ region }}' has been created successfully",
"AUTHORIZED_TO_WORK": "{{ name }} is authorized to work"
"AUTHORIZED_TO_WORK": "{{ name }} is authorized to work",
"MODULE_CREATED": "המודול נוצר בהצלחה!",
"MODULE_UPDATED": "המודול עודכן בהצלחה!",
"MODULE_SAVE_ERROR": "שמירת המודול נכשלה. אנא נסה שוב."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -3607,7 +3607,10 @@
"AUTHORIZED_TO_WORK": "{{ name }} è autorizzato a lavorare",
"EMAIL_VERIFICATION_NOT_VALID": "Mi dispiace, questo link di verifica non è valido",
"EMAIL_VERIFICATION_VALID": "Congratulazioni! La tua email è ora verificata",
"SCREEN_CAPTURE_CHANGED": "Stato cattura schermo modificato per {{ name }}"
"SCREEN_CAPTURE_CHANGED": "Stato cattura schermo modificato per {{ name }}",
"MODULE_CREATED": "Modulo creato con successo!",
"MODULE_UPDATED": "Modulo aggiornato con successo!",
"MODULE_SAVE_ERROR": "Salvataggio del modulo non riuscito. Riprova."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -3607,7 +3607,10 @@
"AUTHORIZED_TO_WORK": "{{ name }} is gemachtigd om te werken",
"EMAIL_VERIFICATION_NOT_VALID": "Sorry, deze verificatielink is niet geldig.",
"EMAIL_VERIFICATION_VALID": "Gefeliciteerd! Uw e-mail is nu geverifieerd.",
"SCREEN_CAPTURE_CHANGED": "Schermopnamestatus gewijzigd voor {{ name }}"
"SCREEN_CAPTURE_CHANGED": "Schermopnamestatus gewijzigd voor {{ name }}",
"MODULE_CREATED": "Module succesvol aangemaakt!",
"MODULE_UPDATED": "Module succesvol bijgewerkt!",
"MODULE_SAVE_ERROR": "Het opslaan van de module is mislukt. Probeer het opnieuw."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/pl.json
Original file line number Diff line number Diff line change
Expand Up @@ -3607,7 +3607,10 @@
"AUTHORIZED_TO_WORK": "{{ name }} jest uprawniony do pracy",
"EMAIL_VERIFICATION_NOT_VALID": "Przepraszam, ten link weryfikacyjny jest nieważny",
"EMAIL_VERIFICATION_VALID": "Gratulacje! Twój email został teraz zweryfikowany",
"SCREEN_CAPTURE_CHANGED": "Zmieniono stan zrzutu ekranu dla {{ name }}"
"SCREEN_CAPTURE_CHANGED": "Zmieniono stan zrzutu ekranu dla {{ name }}",
"MODULE_CREATED": "Moduł został pomyślnie utworzony!",
"MODULE_UPDATED": "Moduł został pomyślnie zaktualizowany!",
"MODULE_SAVE_ERROR": "Nie udało się zapisać modułu. Spróbuj ponownie."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -3607,7 +3607,10 @@
"AUTHORIZED_TO_WORK": "{{ name }} está autorizado a trabalhar",
"EMAIL_VERIFICATION_NOT_VALID": "Desculpe, esse link de verificação não é válido.",
"EMAIL_VERIFICATION_VALID": "Parabéns! Seu email foi verificado com sucesso.",
"SCREEN_CAPTURE_CHANGED": "Status de captura de tela alterado para {{ name }}"
"SCREEN_CAPTURE_CHANGED": "Status de captura de tela alterado para {{ name }}",
"MODULE_CREATED": "Módulo criado com sucesso!",
"MODULE_UPDATED": "Módulo atualizado com sucesso!",
"MODULE_SAVE_ERROR": "Falha ao salvar o módulo. Por favor, tente novamente."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -3626,7 +3626,10 @@
"TIME_LOG_DELETED": "Журнал времени для '{{ name }}' ' удален из '{{ organization }}'",
"TIME_LOGS_DELETED": "Журналы времени удалены из '{{ organization }}'",
"BUCKET_CREATED": "'{{ bucket }}' для '{{ region }}' был успешно создан",
"AUTHORIZED_TO_WORK": "{{ name }} авторизован для работы"
"AUTHORIZED_TO_WORK": "{{ name }} авторизован для работы",
"MODULE_CREATED": "Модуль успешно создан!",
"MODULE_UPDATED": "Модуль успешно обновлен!",
"MODULE_SAVE_ERROR": "Не удалось сохранить модуль. Попробуйте еще раз."
}
},
"ACCEPT_INVITE": {
Expand Down
5 changes: 4 additions & 1 deletion packages/ui-core/i18n/assets/i18n/zh.json
Original file line number Diff line number Diff line change
Expand Up @@ -3607,7 +3607,10 @@
"AUTHORIZED_TO_WORK": "{{ name }} 被授权工作。",
"EMAIL_VERIFICATION_NOT_VALID": "对不起,该验证链接无效。",
"EMAIL_VERIFICATION_VALID": "恭喜!您的电子邮件已经验证成功。",
"SCREEN_CAPTURE_CHANGED": "屏幕截图状态已更改为{{ name }}。"
"SCREEN_CAPTURE_CHANGED": "屏幕截图状态已更改为{{ name }}。",
"MODULE_CREATED": "模块创建成功!",
"MODULE_UPDATED": "模块更新成功!",
"MODULE_SAVE_ERROR": "模块保存失败。请再试一次。"
}
},
"ACCEPT_INVITE": {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Component, Input, OnInit } from '@angular/core';
import { Component,Input, OnInit} from '@angular/core';
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
import { NbDialogRef } from '@nebular/theme';
import { TranslateService } from '@ngx-translate/core';
Expand Down Expand Up @@ -27,7 +27,8 @@ import {
Store,
OrganizationProjectModuleService,
SprintService,
TasksService
TasksService,
ToastrService
} from '@gauzy/ui-core/core';
import { richTextCKEditorConfig } from '../../../ckeditor.config';

Expand Down Expand Up @@ -96,7 +97,8 @@ export class AddProjectModuleDialogComponent extends TranslationBaseComponent im
private organizationTeamsService: OrganizationTeamsService,
private organizationProjectModuleService: OrganizationProjectModuleService,
private organizationSprintService: SprintService,
private readonly tasksService: TasksService
private readonly tasksService: TasksService,
private readonly toastrService: ToastrService
) {
super(translateService);
}
Expand All @@ -116,27 +118,46 @@ export class AddProjectModuleDialogComponent extends TranslationBaseComponent im
* Populates form fields with data from an existing project module.
* @param module - The selected project module data.
*/
private populateForm(module: IOrganizationProjectModule) {
private populateForm(module: IOrganizationProjectModule): void {
if (!module) return;

const {
name,
description,
status,
startDate,
endDate,
isFavorite,
projectId,
parentId,
managerId,
members = [],
organizationSprints,
teams = [],
tasks = []
} = module;

this.form.patchValue({
name: module.name,
description: module.description,
status: module.status,
startDate: module.startDate,
endDate: module.endDate,
isFavorite: module.isFavorite,
projectId: module.projectId,
parentId: module.parentId,
managerId: module.managerId,
members: (module.members || [])?.map((m) => m.id),
organizationSprints: module.organizationSprints,
teams: (module.teams || [])?.map((t) => t.id),
tasks: (module.tasks || [])?.map((task) => task.id)
name,
description,
status,
startDate,
endDate,
isFavorite,
projectId,
parentId,
managerId,
members: members.map((m) => m.id),
organizationSprints,
teams: teams.map((t) => t.id),
tasks: tasks.map((task) => task.id),
});
this.selectedMembers = module.members?.map((m) => m.id);
this.selectedTeams = module.teams?.map((t) => t.id);

this.selectedMembers = members.map((m) => m.id);
this.selectedTeams = teams.map((t) => t.id);
}


/**
* Validates and saves the form data to create or update the project module.
*/
Expand All @@ -149,39 +170,69 @@ export class AddProjectModuleDialogComponent extends TranslationBaseComponent im
* Creates a new project module or updates the existing module based on form data.
*/
private async createOrUpdateModule() {
const organizationId = this.organization.id;

this.form.get('members').setValue(
(this.selectedMembers || []).map((id) => this.employees.find((e) => e.id === id)).filter((e) => !!e) // Only valid employees
);
try {
// Update form fields with valid members, teams, and tasks
this.updateFormFields();

// Prepare form values
const formValue = {
...this.form.value,
organizationId: this.organization.id,
organization: this.organization
};

let module: IOrganizationProjectModule;

// Determine if we are creating or updating a module
if (this.createModule) {
module = await firstValueFrom(this.organizationProjectModuleService.create(formValue));
this.toastrService.success(
this.translateService.instant('TOASTR.MESSAGE.MODULE_CREATED'),
this.translateService.instant('TOASTR.TITLE.SUCCESS')
);
} else {
module = await firstValueFrom(
this.organizationProjectModuleService.update(this.projectModule.id, formValue)
);
this.toastrService.success(
this.translateService.instant('TOASTR.MESSAGE.MODULE_UPDATED'),
this.translateService.instant('TOASTR.TITLE.SUCCESS')
);
}

this.form.get('teams').setValue(
(this.selectedTeams || []).map((id) => this.teams.find((e) => e.id === id)).filter((e) => !!e) // Only valid teams
);
// Close the dialog and return the created/updated module
this.dialogRef.close(module);
} catch (error) {
// Display an error toast
this.toastrService.danger(
this.translateService.instant('TOASTR.MESSAGE.MODULE_SAVE_ERROR'),
this.translateService.instant('TOASTR.TITLE.ERROR')
);
console.error('Failed to save module:', error);
}
}

this.form.get('tasks').setValue(
(this.form.get('tasks').value || []).map((id) => this.tasks.find((e) => e.id === id)).filter((e) => !!e) // Only valid teams
);
/**
* Updates form fields with valid members, teams, and tasks.
*/
private updateFormFields() {
this.form
.get('members')
.setValue(
(this.selectedMembers || []).map((id: ID) => this.employees.find((e) => e.id === id)).filter(Boolean)
);

const formValue = { ...this.form.value, organizationId, organization: this.organization };
this.form
.get('teams')
.setValue((this.selectedTeams || []).map((id: ID) => this.teams.find((t) => t.id === id)).filter(Boolean));

if (this.createModule) {
try {
const module = await firstValueFrom(this.organizationProjectModuleService.create(formValue));
this.dialogRef.close(module);
} catch (error) {
console.error('Failed to create module:', error);
}
} else {
try {
const module = await firstValueFrom(
this.organizationProjectModuleService.update(this.projectModule.id, { ...formValue })
);
this.dialogRef.close(module);
} catch (error) {
console.error('Failed to update module:', error);
}
}
this.form
.get('tasks')
.setValue(
(this.form.get('tasks').value || [])
.map((id: ID) => this.tasks.find((t) => t.id === id))
.filter(Boolean)
);
}

/**
Expand Down
Loading