Skip to content

Commit b4a0a34

Browse files
committed
fix(event): corrige erro de duplicação
1 parent 89d841b commit b4a0a34

File tree

11 files changed

+147
-97
lines changed

11 files changed

+147
-97
lines changed

devmx.code-workspace

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"editorCursor.foreground": "#1A84FF",
1212
"editor.lineHighlightBackground": "#242424",
1313
"editorLineNumber.foreground": "#00A656",
14-
"editor.selectionBackground": "#FB8700",
14+
"editor.selectionBackground": "#fbd10050",
1515
"editor.selectionHighlightBackground": "#2A2A2A70",
1616
"editor.wordHighlightBackground": "#2A2A2A70",
1717
"editor.wordHighlightStrongBackground": "#3A3A3A70",

packages/event/data-access/src/lib/application/event.facade.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { createClientProvider, EntityFacade } from '@devmx/shared-data-access';
22
import { EditableEvent, Event } from '@devmx/shared-api-interfaces';
33
import { toEventPage, toEventSchema } from '../mappers';
4-
import { filter, map } from 'rxjs';
4+
import { filter, map, take, tap } from 'rxjs';
55
import {
66
FindEventsUseCase,
77
DeleteEventUseCase,
@@ -52,11 +52,19 @@ export class EventFacade extends EntityFacade<Event> {
5252
}
5353

5454
create(data: EditableEvent) {
55-
this.onCreate(this.createEventUseCase.execute(data));
55+
const request$ = this.createEventUseCase.execute(data);
56+
57+
const onCreate = (selected: Event) => this.setState({ selected });
58+
59+
return request$.pipe(take(1), tap(onCreate));
5660
}
5761

5862
update(data: EditableEvent) {
59-
this.onUpdate(this.updateEventUseCase.execute(data));
63+
const request$ = this.updateEventUseCase.execute(data);
64+
65+
const onUpdate = (selected: Event) => this.setState({ selected });
66+
67+
return request$.pipe(take(1), tap(onUpdate));
6068
}
6169

6270
delete(id: string) {

packages/event/feature-admin/src/lib/containers/event/event-form/event-form.component.html

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
matInput
66
formControlName="title"
77
placeholder="Ex.: 10º Meetup Maringá Agile"
8+
autofocus
89
/>
910
<mat-error>Obrigatório</mat-error>
1011
</mat-form-field>
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,38 @@
1-
<form id="event" [formGroup]="form">
2-
<mat-tab-group mat-stretch-tabs dynamicHeight class="event-tab">
3-
<mat-tab label="Evento">
4-
<section class="event-tab-content">
5-
<devmx-admin-event-form />
6-
</section>
7-
</mat-tab>
8-
<mat-tab label="Detalhes">
9-
<section class="event-tab-content">
10-
<devmx-markdown-toolbar>
11-
<devmx-markdown-editor
12-
label="Descreva o evento"
13-
hint="Compatível com markdown do Github"
14-
formControlName="description"
15-
[minRows]="20"
16-
[maxRows]="40"
17-
/>
18-
<devmx-markdown-view [content]="form.value.description ?? ''" />
19-
</devmx-markdown-toolbar>
20-
</section>
21-
</mat-tab>
22-
<mat-tab label="Organizadores">
23-
<section class="event-tab-content">
24-
<devmx-admin-event-leaders />
1+
<form id="event" [formGroup]="form" (submit)="onSubmit()">
2+
<section class="event-tab-content">
3+
<devmx-admin-event-form />
4+
</section>
255

26-
<button type="button" mat-button (click)="selectLeaders()">
27-
Adicionar outras pessoas
28-
</button>
29-
</section>
30-
</mat-tab>
31-
<mat-tab label="Apresentações">
32-
<section class="event-tab-content">
33-
<devmx-admin-event-presentations />
6+
<section class="event-tab-content">
7+
<devmx-markdown-toolbar>
8+
<devmx-markdown-editor
9+
label="Descreva o evento"
10+
hint="Compatível com markdown do Github"
11+
formControlName="description"
12+
[minRows]="20"
13+
[maxRows]="40"
14+
/>
15+
<devmx-markdown-view [content]="form.value.description ?? ''" />
16+
</devmx-markdown-toolbar>
17+
</section>
3418

35-
<button type="button" mat-button (click)="selectPresentations()">
36-
Procure por conteúdos
37-
</button>
38-
</section>
39-
</mat-tab>
40-
</mat-tab-group>
19+
<section class="event-tab-content">
20+
<devmx-admin-event-leaders />
21+
22+
<button type="button" mat-button (click)="selectLeaders()">
23+
Adicionar outras pessoas
24+
</button>
25+
</section>
26+
<section class="event-tab-content">
27+
<devmx-admin-event-presentations />
28+
29+
<button type="button" mat-button (click)="selectPresentations()">
30+
Procure por conteúdos
31+
</button>
32+
</section>
4133

4234
<footer class="event-footer">
43-
<devmx-auto-save-button (clicked)="onSubmit()" />
35+
<devmx-auto-save-button [saving]="saving()" (autoSave)="onSubmit()" />
4436
<!-- <button mat-flat-button>Salvar</button> -->
4537
</footer>
4638
</form>

packages/event/feature-admin/src/lib/containers/event/event.container.ts

+27-9
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,23 @@ import { AutoSaveButtonComponent } from '@devmx/shared-ui-global/button';
44
import { EventFormComponent } from './event-form/event-form.component';
55
import { SelectPresentation } from '@devmx/presentation-ui-shared';
66
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7-
import { EditableEvent } from '@devmx/shared-api-interfaces';
87
import { MatButtonModule } from '@angular/material/button';
98
import { MessageService } from '@devmx/shared-ui-global';
9+
import { ActivatedRoute, Router } from '@angular/router';
1010
import { EventFacade } from '@devmx/event-data-access';
1111
import { MatCardModule } from '@angular/material/card';
1212
import { MatTabsModule } from '@angular/material/tabs';
1313
import { SelectUser } from '@devmx/account-ui-shared';
1414
import { ReactiveFormsModule } from '@angular/forms';
15-
import { ActivatedRoute } from '@angular/router';
15+
import { Event } from '@devmx/shared-api-interfaces';
1616
import { EventForm } from '../../forms';
1717
import { take } from 'rxjs';
1818
import {
1919
inject,
2020
Component,
2121
ChangeDetectorRef,
2222
ChangeDetectionStrategy,
23+
signal,
2324
} from '@angular/core';
2425
import {
2526
MarkdownViewComponent,
@@ -47,6 +48,8 @@ import {
4748
],
4849
})
4950
export class EventContainer {
51+
router = inject(Router);
52+
5053
route = inject(ActivatedRoute);
5154

5255
cdr = inject(ChangeDetectorRef);
@@ -61,6 +64,8 @@ export class EventContainer {
6164

6265
selectUser = inject(SelectUser);
6366

67+
saving = signal(false);
68+
6469
form = new EventForm();
6570

6671
constructor() {
@@ -110,14 +115,27 @@ export class EventContainer {
110115

111116
onSubmit() {
112117
if (this.form.valid) {
113-
const value = this.form.getRawValue();
114-
if (value.id) this.eventFacade.update(value as EditableEvent);
115-
else this.eventFacade.create(value as EditableEvent);
118+
this.saving.set(true);
116119

117-
const message = `Armazenando informações`;
118-
return this.messageService.open({ message });
119-
}
120+
const value = this.form.getRawValue() as Event;
120121

121-
return this.form.markAllAsTouched();
122+
if (value.id) {
123+
this.eventFacade.update(value).subscribe(this.#onCompleteRequest);
124+
} else {
125+
this.eventFacade.create(value).subscribe(this.#onCompleteRequest);
126+
}
127+
} else {
128+
this.form.markAllAsTouched();
129+
}
122130
}
131+
132+
#onCompleteRequest = (event?: Event) => {
133+
this.saving.set(false);
134+
const message = `Armazenando informações`;
135+
this.messageService.open({ message });
136+
137+
if (event && event.id) {
138+
this.router.navigate(['..', event.id], { relativeTo: this.route });
139+
}
140+
};
123141
}

packages/event/feature-admin/src/lib/containers/my-events/my-events.container.scss

+2
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@
3535
}
3636

3737
.no-events-yet {
38+
flex: 1;
3839
display: flex;
3940
flex-direction: column;
4041
align-items: center;
42+
justify-content: center;
4143

4244
h2,
4345
h3 {

packages/event/feature-admin/src/lib/event-feature-admin.routes.ts

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export const eventFeatureAdminRoutes: Route[] = [
2525
breadcrumb: 'Novo',
2626
},
2727
title: 'Novo evento',
28+
component: EventContainer,
2829
},
2930
{
3031
path: 'meus-eventos/:id',

packages/event/feature-admin/src/lib/forms/event.ts

+46-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { TypedForm, FormOption } from '@devmx/shared-ui-global/forms';
2-
import { FormControl, FormGroup, Validators } from '@angular/forms';
2+
import {
3+
FormControl,
4+
FormGroup,
5+
ValidationErrors,
6+
Validators,
7+
} from '@angular/forms';
38
import { EventPresentationsForm } from './event-presentation';
49
import { DURATION_TIMES } from '@devmx/shared-util-data';
510
import { EventLeadersForm } from './event-leader';
@@ -25,6 +30,10 @@ export class EventForm extends FormGroup<TypedForm<EditableEvent>> {
2530
static date = addDays(new Date(), 10);
2631

2732
constructor() {
33+
EventForm.date.setHours(19);
34+
EventForm.date.setMinutes(0);
35+
EventForm.date.setSeconds(0);
36+
2837
super({
2938
id: new FormControl('', {
3039
nonNullable: true,
@@ -41,13 +50,13 @@ export class EventForm extends FormGroup<TypedForm<EditableEvent>> {
4150
updateOn: 'blur',
4251
}),
4352

44-
time: new FormControl('', {
45-
nonNullable: true,
46-
validators: [Validators.required],
47-
}),
53+
// time: new FormControl('', {
54+
// nonNullable: true
55+
// }),
4856

4957
duration: new FormControl('2h', {
5058
nonNullable: true,
59+
validators: [Validators.required],
5160
}),
5261

5362
maxAttendees: new FormControl(0, {
@@ -56,6 +65,7 @@ export class EventForm extends FormGroup<TypedForm<EditableEvent>> {
5665

5766
description: new FormControl('', {
5867
nonNullable: true,
68+
validators: [Validators.required],
5969
}),
6070

6171
presentations: new EventPresentationsForm(),
@@ -64,6 +74,7 @@ export class EventForm extends FormGroup<TypedForm<EditableEvent>> {
6474

6575
format: new FormControl('', {
6676
nonNullable: true,
77+
validators: [Validators.required],
6778
}),
6879

6980
address: new FormControl('', {
@@ -115,19 +126,43 @@ export class EventForm extends FormGroup<TypedForm<EditableEvent>> {
115126
}
116127

117128
onFormatChange(format = '') {
129+
if (!this.controls.address || !this.controls.link) return;
130+
118131
if (format === 'in-person') {
119-
this.controls.address?.enable();
120-
this.controls.link?.disable();
132+
this.controls.address.enable();
133+
this.controls.address.addValidators(Validators.required);
134+
135+
this.controls.link.disable();
136+
this.controls.link.removeValidators(Validators.required);
121137
}
122138

123139
if (format === 'online') {
124-
this.controls.address?.disable();
125-
this.controls.link?.enable();
140+
this.controls.address.disable();
141+
this.controls.address.removeValidators(Validators.required);
142+
143+
this.controls.link.enable();
144+
this.controls.address.addValidators(Validators.required);
126145
}
127146

128147
if (format === 'mixed') {
129-
this.controls.link?.enable();
130-
this.controls.address?.enable();
148+
this.controls.link.enable();
149+
this.controls.link.addValidators(Validators.required);
150+
151+
this.controls.address.enable();
152+
this.controls.address.addValidators(Validators.required);
131153
}
154+
155+
this.updateValueAndValidity({ onlySelf: true });
156+
}
157+
158+
getErrors() {
159+
const errors = {} as Record<string, ValidationErrors | null>;
160+
161+
for (const key in this.controls) {
162+
const k = key as keyof TypedForm<EditableEvent>;
163+
errors[key] = this.controls[k]?.errors ?? null;
164+
}
165+
166+
return errors;
132167
}
133168
}

packages/event/resource/src/lib/controllers/events.ts

+1
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export class EventsController {
4545

4646
@Post()
4747
@ApiBearerAuth()
48+
@ApiOkResponse({ type: EventDto })
4849
async create(@User('id') owner: string, @Body() data: CreateEventDto) {
4950
try {
5051
return await this.eventsFacade.create({ ...data, owner });

0 commit comments

Comments
 (0)