Conteúdo
- Criar o componente user
- Apresentar o problema de importação desnecessárias do angular
- Apresentar nb-card nebular
- Apresentar ng2-smart-table
- Apresentar o DevExpress Grid
- Implementar .ts, html e css
- Explicar o DatePipe do angular
- Testar a tela criada
- Explicar diferença *ngIf para [hidden]
Material de apoio
user.component.html
<nb-card>
<nb-card-header>
Cadastro de Usuário
</nb-card-header>
<nb-card-body>
<button style="margin-bottom: 1rem;" nbButton status="primary">Novo</button>
<!-- ng2-smart-table here -->
</nb-card-body>
</nb-card>
<ng-template #dialogUser let-data let-ref="dialogRef">
<nb-card style="width: 25em">
<nb-card-header>Cadastro de Usuário ()</nb-card-header>
<nb-card-body>
<form [formGroup]="formUser" autocomplete="off">
<div class="form-group">
<label for="name">Nome *</label>
<input class="form-control" id="name" formControlName="name">
</div>
<div class="form-group">
<label for="email">E-mail *</label>
<input id="email" type="email" class="form-control" formControlName="email">
</div>
<div class="form-group">
<label for="password">Senha *</label>
<input id="password" type="password" class="form-control" formControlName="password">
</div>
<div class="form-group">
<label for="creation">Data Criação</label>
<input id="creation" class="form-control" formControlName="creation"
[value]="formUser.get('creation').value">
</div>
</form>
</nb-card-body>
<nb-card-footer>
<button nbButton (click)="ref.close()">Cancelar</button>
<button class="btn-action-modal" nbButton status="primary">Salvar</button>
</nb-card-footer>
</nb-card>
</ng-template>
<ng-template #dialogDelete let-data let-ref="dialogRef">
<nb-card>
<nb-card-header>Excluir Usuário</nb-card-header>
<nb-card-body>
Tem certeza que deseja excluir o usuário <span style="font-weight: bold">{{ data }}</span>?
</nb-card-body>
<nb-card-footer>
<button nbButton (click)="ref.close()">Cancelar</button>
<button class="btn-action-modal" nbButton status="danger">Excluir</button>
</nb-card-footer>
</nb-card>
</ng-template>
user.component.ts
import {
Component, OnInit, TemplateRef, ViewChild,
} from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
import { NbDialogRef, NbDialogService, NbToastrService } from '@nebular/theme';
import { User } from 'app/models/user';
import { UserService } from 'app/services/user.service';
import { Ng2SmartTableComponent } from 'ng2-smart-table';
import { Row } from 'ng2-smart-table/lib/lib/data-set/row';
@Component({
selector: 'user',
styleUrls: ['user.component.scss'],
templateUrl: './user.component.html',
})
export class UserComponent implements OnInit {
@ViewChild('ng2TbUser') ng2TbUser: Ng2SmartTableComponent;
@ViewChild('dialogUser') dialogUser: TemplateRef<any>;
@ViewChild('dialogDelete') dialogDelete: TemplateRef<any>;
dialogRef: NbDialogRef<any>;
tbUserData: User[];
tbUserConfig: Object;
userSelected: User;
formUser = this.formBuilder.group({
_id: [null],
name: [null, Validators.required],
email: [null, [Validators.required, Validators.email]],
password: [null, Validators.required],
creation: { value: null, disabled: true },
});
constructor(private formBuilder: FormBuilder,
private dialogService: NbDialogService,
private toastrService: NbToastrService,
private userService: UserService) { }
ngOnInit(): void {
this.setConfigTbUser();
this.setDataTbUser();
}
private setConfigTbUser() {
this.tbUserConfig = {
mode: 'external',
actions: { columnTitle: 'Ações', add: false, position: 'right' },
edit: {
editButtonContent: '<span class="nb-edit" title="Editar"></span>',
},
delete: {
deleteButtonContent: '<span class="nb-trash" title="Excluir"></span>',
},
noDataMessage: 'Nenhum usuário cadastrado.',
columns: {
name: {
title: 'Nome',
},
email: {
title: 'E-mail',
},
},
};
}
private setDataTbUser() {
this.userService.list().subscribe((res) => {
this.tbUserData = res.body;
});
}
public openModalUser(event: Row) {
this.formUser.reset();
if (event) {
const user: User = event.getData();
this.userService.findById(user._id).subscribe((res) => {
this.formUser.patchValue(res.body);
});
}
this.dialogRef = this.dialogService.open(this.dialogUser);
}
public openModalExclusion(event: Row) {
this.userSelected = event.getData();
this.dialogRef = this.dialogService.open(this.dialogDelete, { context: this.userSelected.name });
}
public btnSave() {
if (this.formUser.invalid) return this.setFormInvalid();
if (this.isAdd()) this.addUser();
else this.editUser();
}
private setFormInvalid() {
this.toastrService.warning('Existem um ou mais campos obrigatórios que não foram preenchidos.', 'Atenção');
this.formUser.get('name').markAsTouched();
this.formUser.get('email').markAsTouched();
this.formUser.get('password').markAsTouched();
}
private isAdd(): boolean {
return !this.formUser.get('_id').value;
}
private addUser() {
this.userService.create(this.findFormAdd()).subscribe((res) => {
this.tbUserData.push(res.body);
this.ng2TbUser.source.refresh();
this.toastrService.success('Usuário criado com sucesso.', 'Sucesso');
this.dialogRef.close();
});
}
private findFormAdd() {
const usuario = this.formUser.value;
delete usuario._id;
return usuario;
}
private editUser() {
this.userService.edit(this.formUser.value).subscribe((res) => {
this.tbUserData = this.tbUserData.map((user: User) => {
if (user._id === this.formUser.value._id) return this.formUser.value;
return user;
});
this.toastrService.success('Usuário editado com sucesso.', 'Sucesso');
this.dialogRef.close();
});
}
public findOperation(): string {
return this.isAdd() ? 'Inclusão' : 'Edição';
}
public btnDelete() {
this.userService.delete(this.userSelected._id).subscribe((res) => {
this.tbUserData = this.tbUserData.filter(((user) => user._id !== this.userSelected._id));
this.toastrService.success('Usuário excluído com sucesso.', 'Sucesso');
this.dialogRef.close();
});
}
}
ng2-smart-table
<ng2-smart-table #ng2TbUser [settings]="tbUserConfig" [source]="tbUserData" (edit)="openModalUser($event)" (delete)="openModalExclusion($event)"> </ng2-smart-table>user.component.scss
.btn-action-modal {
float: right;
margin-left: 20px;
}
.ng-invalid {
&.ng-touched {
border-color: #f16666;
}
}
Referências
- O que acontece ao importar módulos desnecessários no angular?
- Nb-card
- Ng2-smart-table
- DevExpress: Overview
- DevExpress: Web API Service
- DevExpress: Custom Editors
- DevExpress: Record Grouping
- Date Pipe Angular
- Curso Angular #15: Ciclo de vida do Componente
- Lifecycle Angular
Código fonte
Ementa completa
Curso Full-Stack 100% JavaScript