Skip to content

Commit

Permalink
Merge pull request #82 from Kleostro/refactor/tu-01-48/carriage-forms
Browse files Browse the repository at this point in the history
refactor(tu-01-48): carriage forms
  • Loading branch information
Kleostro authored Aug 19, 2024
2 parents 3075f94 + 7281082 commit f0946b3
Show file tree
Hide file tree
Showing 17 changed files with 102 additions and 30 deletions.
20 changes: 16 additions & 4 deletions src/app/admin/components/carriage/carriage.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,15 @@
<div class="right-seats-row">
@for (rightSeat of rightRow; track rightSeat) {
@if (i === seatsSchema.rightSeats.length - 1) {
<app-seat [numberSeat]="rightSeat" [classes]="['right', 'free-seat', 'first-seat']"></app-seat>
<app-seat
[numberSeat]="rightSeat"
[classes]="['right', 'free-seat', 'first-seat', isInteractive() ? 'interactive' : '']"
></app-seat>
} @else {
<app-seat [numberSeat]="rightSeat" [classes]="['right', 'free-seat']"></app-seat>
<app-seat
[numberSeat]="rightSeat"
[classes]="['right', 'free-seat', isInteractive() ? 'interactive' : '']"
></app-seat>
}
}
</div>
Expand All @@ -38,9 +44,15 @@
<div class="left-seats-row">
@for (leftSeat of leftRow; track leftSeat) {
@if (i === 0) {
<app-seat [numberSeat]="leftSeat" [classes]="['left', 'free-seat', 'first-seat']"></app-seat>
<app-seat
[numberSeat]="leftSeat"
[classes]="['left', 'free-seat', 'first-seat', isInteractive() ? 'interactive' : '']"
></app-seat>
} @else {
<app-seat [numberSeat]="leftSeat" [classes]="['left', 'free-seat']"></app-seat>
<app-seat
[numberSeat]="leftSeat"
[classes]="['left', 'free-seat', isInteractive() ? 'interactive' : '']"
></app-seat>
}
}
</div>
Expand Down
1 change: 1 addition & 0 deletions src/app/admin/components/carriage/carriage.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { SeatComponent } from '../seat/seat.component';
export class CarriageComponent {
public carriage = input<Carriage | null>(null);
public isEditable = input(false);
public isInteractive = input(true);
public seatsSchema = computed(() => createSeatsSchema(this.carriage()));
public modalService = inject(ModalService);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
@for (carriage of allCarriages(); track carriage) {
<app-carriage
[carriage]="carriage"
[isInteractive]="!routingService.isAdminCarriagesPage$$()"
[isEditable]="true"
(openEditModal)="handleOpenEditModal($event)"
></app-carriage>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ActivatedRoute } from '@angular/router';

import { of } from 'rxjs';

import { CarriagesListComponent } from './carriages-list.component';

Expand All @@ -9,6 +12,7 @@ describe('CarriagesListComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [CarriagesListComponent],
providers: [{ provide: ActivatedRoute, useValue: { queryParams: of({}) } }],
}).compileComponents();

fixture = TestBed.createComponent(CarriagesListComponent);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { ChangeDetectionStrategy, Component, inject, input, signal, TemplateRef, ViewChild } from '@angular/core';

import { Carriage } from '@/app/api/models/carriage';
import { RoutingService } from '@/app/core/services/routing/routing.service';
import { ModalService } from '@/app/shared/services/modal/modal.service';

import { CarriageComponent } from '../carriage/carriage.component';
Expand All @@ -15,6 +16,7 @@ import { UpdateCarriageFormComponent } from '../update-carriage-form/update-carr
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CarriagesListComponent {
public routingService = inject(RoutingService);
public modalService = inject(ModalService);
public allCarriages = input<Carriage[]>([]);
public editCarriage = signal<Carriage | null>(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<label for="leftSeats"> Left seats count:</label>
<p-inputNumber inputId="leftSeats" formControlName="leftSeats" />
</div>

<button
pButton
pRipple
Expand All @@ -28,6 +29,6 @@
</div>

@if (newCarriage(); as newCarriage) {
<app-carriage [carriage]="newCarriage"></app-carriage>
<app-carriage [isInteractive]="false" [carriage]="newCarriage"></app-carriage>
}
</form>
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
.controls {
display: flex;
gap: 0.5rem;
justify-content: center;
margin: 1rem 0;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { ModalService } from '@/app/shared/services/modal/modal.service';
import { USER_MESSAGE } from '@/app/shared/services/userMessage/constants/user-messages';
import { UserMessageService } from '@/app/shared/services/userMessage/user-message.service';

import INITIAL_CARRIAGE from '../../constants/initial-carriage';
import { CarriageComponent } from '../carriage/carriage.component';

@Component({
Expand All @@ -33,13 +34,15 @@ import { CarriageComponent } from '../carriage/carriage.component';
})
export class CreateCarriageFormComponent implements OnInit, OnDestroy {
private fb = inject(FormBuilder);
private cdr = inject(ChangeDetectorRef);
private modalService = inject(ModalService);
private userMessageService = inject(UserMessageService);
private carriageService = inject(CarriageService);
public newCarriage = signal<Carriage>({ name: '', rows: 0, leftSeats: 0, rightSeats: 0, code: '' });
public isCreated = signal(false);
private cdr = inject(ChangeDetectorRef);

private subsciption = new Subscription();

public newCarriage = signal<Carriage>(INITIAL_CARRIAGE);
public isCreated = signal(false);
public carriageForm = this.fb.nonNullable.group({
name: ['', [Validators.required.bind(this)]],
rows: [0, [Validators.required.bind(this), Validators.min(1)]],
Expand All @@ -59,8 +62,6 @@ export class CreateCarriageFormComponent implements OnInit, OnDestroy {
this.newCarriage.set({ ...currentCarriage });
this.cdr.detectChanges();
}

this.cdr.detectChanges();
}

public submit(): void {
Expand All @@ -75,9 +76,17 @@ export class CreateCarriageFormComponent implements OnInit, OnDestroy {

if (this.carriageForm.valid) {
this.isCreated.set(true);
this.carriageService.createCarriage(updatedCarriage).subscribe({
next: () => this.submitSuccessHandler(),
});
this.subsciption.add(
this.carriageService.hasCarriageNameInCarriages(updatedCarriage.name).subscribe((hasCarriage) => {
if (!hasCarriage) {
this.carriageService.createCarriage(updatedCarriage).subscribe({
next: () => this.submitSuccessHandler(),
});
} else {
this.submitErrorHandler();
}
}),
);
}
}

Expand All @@ -90,6 +99,11 @@ export class CreateCarriageFormComponent implements OnInit, OnDestroy {
this.userMessageService.showSuccessMessage(USER_MESSAGE.CARRIAGE_CREATED_SUCCESSFULLY);
}

private submitErrorHandler(): void {
this.isCreated.set(false);
this.userMessageService.showErrorMessage(USER_MESSAGE.CARRIAGE_ALREADY_EXISTS);
}

public ngOnInit(): void {
this.subsciption.add(
this.carriageForm.valueChanges
Expand Down
26 changes: 17 additions & 9 deletions src/app/admin/components/seat/seat.component.scss
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
@import 'mixins';

.seat {
cursor: pointer;
pointer-events: none;
cursor: auto;
user-select: none;

position: relative;
Expand All @@ -15,6 +16,7 @@
height: 2.2rem;
margin-bottom: 0.5rem;

filter: grayscale(0.8);
border-radius: 0.5rem;

transition:
Expand All @@ -31,14 +33,6 @@
border: $two solid #ddd;
border-radius: $offset-xxs;
}

@include hover {
filter: brightness(0.9);
}

&:active {
scale: 0.9;
}
}

.left {
Expand Down Expand Up @@ -155,3 +149,17 @@
color: $black-100;
background-color: #f7e40b;
}

.interactive {
pointer-events: all;
cursor: pointer;
filter: grayscale(0);

@include hover {
filter: grayscale(0) brightness(0.9);
}

&:active {
scale: 0.9;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@
</div>

@if (currentCarriage(); as currentCarriage) {
<app-carriage [carriage]="currentCarriage"></app-carriage>
<app-carriage [isInteractive]="false" [carriage]="currentCarriage"></app-carriage>
}
</form>
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
.controls {
display: flex;
gap: 0.5rem;
justify-content: center;
margin: 1rem 0;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,16 @@ import { CarriageComponent } from '../carriage/carriage.component';
})
export class UpdateCarriageFormComponent implements OnInit, OnDestroy {
private fb = inject(FormBuilder);
private cdr = inject(ChangeDetectorRef);
private modalService = inject(ModalService);
private userMessageService = inject(UserMessageService);
private carriageService = inject(CarriageService);
private cdr = inject(ChangeDetectorRef);

public carriage = input<Carriage | null>(null);

private subsciption = new Subscription();
public currentCarriage = signal<Carriage | null>(null);
public isUpdating = signal(false);
private subsciption = new Subscription();
public carriageForm = this.fb.nonNullable.group({
rows: [0, [Validators.required.bind(this), Validators.min(1)]],
leftSeats: [0, [Validators.required.bind(this), Validators.min(1)]],
Expand Down Expand Up @@ -77,9 +79,11 @@ export class UpdateCarriageFormComponent implements OnInit, OnDestroy {

if (this.carriageForm.valid) {
this.isUpdating.set(true);
this.carriageService.updateCarriage(updatedCarriage).subscribe({
next: () => this.submitSuccessHandler(),
});
this.subsciption.add(
this.carriageService.updateCarriage(updatedCarriage).subscribe({
next: () => this.submitSuccessHandler(),
}),
);
}
}

Expand Down
11 changes: 11 additions & 0 deletions src/app/admin/constants/initial-carriage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Carriage } from '@/app/api/models/carriage';

const INITIAL_CARRIAGE: Carriage = {
name: '',
rows: 0,
leftSeats: 0,
rightSeats: 0,
code: '',
};

export default INITIAL_CARRIAGE;
5 changes: 4 additions & 1 deletion src/app/admin/pages/carriages/carriages.component.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import { provideHttpClient } from '@angular/common/http';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ActivatedRoute } from '@angular/router';

import { of } from 'rxjs';

import { CarriagesComponent } from './carriages.component';

Expand All @@ -10,7 +13,7 @@ describe('CarriagesComponent', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [CarriagesComponent],
providers: [provideHttpClient()],
providers: [provideHttpClient(), { provide: ActivatedRoute, useValue: { queryParams: of({}) } }],
}).compileComponents();

fixture = TestBed.createComponent(CarriagesComponent);
Expand Down
8 changes: 7 additions & 1 deletion src/app/api/carriagesService/carriage.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { HttpClient } from '@angular/common/http';
import { inject, Injectable } from '@angular/core';

import { BehaviorSubject, Observable } from 'rxjs';
import { BehaviorSubject, map, Observable } from 'rxjs';

import { Carriage, Code } from '../models/carriage';

Expand All @@ -21,6 +21,12 @@ export class CarriageService {
return this.httpClient.post<Code>(this.CARRIAGE_ENDPOINT, carriage);
}

public hasCarriageNameInCarriages(name: string): Observable<boolean> {
return this.httpClient
.get<Carriage[]>(this.CARRIAGE_ENDPOINT)
.pipe(map((carriages) => carriages.some((carriage) => carriage.name.toLowerCase() === name.toLowerCase())));
}

public updateCarriage(carriage: Carriage): Observable<Code> {
return this.httpClient.put<Code>(`${this.CARRIAGE_ENDPOINT}/${carriage.code}`, carriage);
}
Expand Down
2 changes: 2 additions & 0 deletions src/app/core/services/routing/routing.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export class RoutingService {

public queryParams$$ = signal<Record<string, string>>({});
public isAdminPage$$ = signal<boolean>(false);
public isAdminCarriagesPage$$ = signal<boolean>(false);

constructor() {
this.activatedRoute.queryParams.subscribe((params) => {
Expand All @@ -24,6 +25,7 @@ export class RoutingService {

this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
this.isAdminPage$$.set(this.router.url.startsWith(APP_ROUTE.ADMIN));
this.isAdminCarriagesPage$$.set(this.router.url.startsWith(`${APP_ROUTE.ADMIN}/carriages`));
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ export const USER_MESSAGE = {
STATION_EXISTS: 'Station already exists in this city!',
CARRIAGE_CREATED_SUCCESSFULLY: 'Carriage created successfully!',
CARRIAGE_UPDATED_SUCCESSFULLY: 'Carriage updated successfully!',
CARRIAGE_ALREADY_EXISTS: 'Carriage already exists in this name!',
};

0 comments on commit f0946b3

Please sign in to comment.