Skip to content

Commit

Permalink
Merge pull request #30 from SwimResults/develop
Browse files Browse the repository at this point in the history
`v1.0.4` User Athlete
  • Loading branch information
konrad2002 authored Nov 14, 2023
2 parents bebbab9 + 8a263fe commit a2d5ba1
Show file tree
Hide file tree
Showing 33 changed files with 370 additions and 21 deletions.
3 changes: 2 additions & 1 deletion src/app/app-routing.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {PageTeamComponent, PageTeamsEventComponent, PageTeamsGeneralComponent} f
import {PageStatsEventComponent, PageStatsGeneralComponent} from "./content/stats";
import {PageEventComponent, PageEventsComponent} from "./content/events";
import {AuthComponent} from "./content/auth/auth.component";
import {UserProfileComponent} from "./content/account";
import {PageUserSettingsComponent, UserProfileComponent} from "./content/account";
import {PageMeetingsComponent} from "./content/meetings";
import {LogoutComponent} from "./content/auth/logout/logout.component";
import {PageAdminEventComponent} from "./content/admin";
Expand All @@ -20,6 +20,7 @@ const routes: Routes = [
{ path: 'auth', component: AuthComponent },
{ path: 'auth/logout', component: LogoutComponent },
{ path: 'account/profile', component: UserProfileComponent },
{ path: 'account/settings', component: PageUserSettingsComponent },
{ path: 'dashboard', component: PageDashboardGeneralComponent },
{ path: 'calendar', component: CalendarComponent },
{ path: 'meetings', redirectTo: '/' },
Expand Down
10 changes: 7 additions & 3 deletions src/app/content/account/account.module.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { UserProfileComponent } from './pages';
import { UserProfileViewComponent } from './components/user-profile-view/user-profile-view.component';
import {PageUserSettingsComponent, UserProfileComponent} from './pages';
import { UserProfileViewComponent, SettingsViewComponent} from './components';
import {ElementsModule} from "../../shared/elements/elements.module";
import {CoreModule} from "../../core/core.module";
import {MatIconModule} from "@angular/material/icon";
import { SettingsUserAthleteComponent } from './components/settings-user-athlete/settings-user-athlete.component';



@NgModule({
declarations: [
UserProfileComponent,
UserProfileViewComponent
UserProfileViewComponent,
PageUserSettingsComponent,
SettingsViewComponent,
SettingsUserAthleteComponent
],
imports: [
CommonModule,
Expand Down
2 changes: 2 additions & 0 deletions src/app/content/account/components/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './settings-view/settings-view.component';
export * from './user-profile-view/user-profile-view.component';
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<h1>{{'USER.SETTINGS.USER_ATHLETE.TITLE' | translate}}</h1>
<p>{{'USER.SETTINGS.USER_ATHLETE.INFO_TEXT' | translate}}</p>

<ng-container *ngIf="user">
<ng-container *ngIf="listUserAthlete && userAthlete">
<h2>{{'USER.SETTINGS.USER_ATHLETE.THIS_IS_YOU_TITLE' | translate}}</h2>
<sr-list-view
[data]="listUserAthlete"
[useSearch]="false"
[config]="configUserAthlete"
></sr-list-view>
</ng-container>
<div *ngIf="!user.own_athlete_id">
<i>{{'USER.SETTINGS.USER_ATHLETE.NO_USER_SET' | translate}}</i>
</div>

<br><br>

<sr-list-view *ngIf="listAthletes"
[data]="listAthletes"
[fetching]="fetchingAthletes"
[config]="config"
(refreshData)="fetchAthletes($event)"
></sr-list-view>
</ng-container>
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { SettingsUserAthleteComponent } from './settings-user-athlete.component';
import {HttpClientTestingModule} from "@angular/common/http/testing";
import {TranslateModule} from "@ngx-translate/core";

describe('SettingsUserAthleteComponent', () => {
let component: SettingsUserAthleteComponent;
let fixture: ComponentFixture<SettingsUserAthleteComponent>;

beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ SettingsUserAthleteComponent ],
imports: [
HttpClientTestingModule,
TranslateModule.forRoot()
]
})
.compileComponents();

fixture = TestBed.createComponent(SettingsUserAthleteComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
import {Component, Input, OnInit} from '@angular/core';
import {IListTile} from "../../../../core/model/list/list-tile.model";
import {Athlete} from "../../../../core/model";
import {AthleteService, UserService} from "../../../../core/service/api";
import {RefreshListRequest} from "../../../../core/model/list/refresh-list-request.model";
import {FetchingModel} from "../../../../core/model/common/fetching.model";
import {ListConfig} from "../../../../core/model/list/list-config.model";
import {User} from "../../../../core/model/user/user.model";
import {UserAthleteListTile} from "../../../../core/model/list/user-athlete-list-tile.model";

@Component({
selector: 'sr-settings-user-athlete',
templateUrl: './settings-user-athlete.component.html',
styleUrls: ['./settings-user-athlete.component.scss']
})
export class SettingsUserAthleteComponent implements OnInit {
user?: User;

userAthlete?: Athlete;
listUserAthlete: IListTile[] = [];

athletes: Athlete[] = [];
listAthletes: IListTile[] = [];
fetchingAthletes: FetchingModel = {fetching: false};

config: ListConfig = {showSetUserAthleteButton: true, showUnsetUserAthleteButton: false, showMoreButton: true};
configUserAthlete: ListConfig = {showUnsetUserAthleteButton: true, showMoreButton: true, showSetUserAthleteButton: false};

constructor(
private athleteService: AthleteService,
private userService: UserService
) {
}

ngOnInit() {
this.fetchUser();
}

fetchUser() {
this.userService.getUser().subscribe(data => {
console.log("fetching athlete for user: " + data.keycloak_id);
this.user = data;
if (this.user && this.user.own_athlete_id) {
this.athleteService.getAthleteById(this.user.own_athlete_id).subscribe(data => {
this.userAthlete = data;
this.listUserAthlete = [];
this.listUserAthlete.push(new UserAthleteListTile(this.userAthlete));
})
}
});
}

fetchAthletes(request: RefreshListRequest) {
this.fetchingAthletes.fetching = true;
if (request.paging.offset == 0) {
this.athletes = [];
this.listAthletes = [];
this.fetchUser(); // update user on list update;
}
this.athleteService.getAthletes(request.paging).subscribe(data => {
this.appendAthletes(data);
this.fetchingAthletes.fetching = false;
})
}

appendAthletes(athletes: Athlete[]) {
if (!athletes) return;
this.athletes.concat(athletes);
athletes.forEach(athlete => {
this.listAthletes.push(new UserAthleteListTile(athlete));
})
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<sr-settings-user-athlete></sr-settings-user-athlete>
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { SettingsViewComponent } from './settings-view.component';
import {HttpClientTestingModule} from "@angular/common/http/testing";
import {TranslateModule} from "@ngx-translate/core";
import {AccountModule} from "../../account.module";

describe('SettingsViewComponent', () => {
let component: SettingsViewComponent;
let fixture: ComponentFixture<SettingsViewComponent>;

beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ SettingsViewComponent ],
imports: [
HttpClientTestingModule,
TranslateModule.forRoot(),
AccountModule
]
})
.compileComponents();

fixture = TestBed.createComponent(SettingsViewComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import {Component, OnInit} from '@angular/core';
import {User} from "../../../../core/model/user/user.model";
import {UserService} from "../../../../core/service/api";

@Component({
selector: 'sr-settings-view',
templateUrl: './settings-view.component.html',
styleUrls: ['./settings-view.component.scss']
})
export class SettingsViewComponent implements OnInit {
user?: User;

constructor(
private userService: UserService
) {
}

ngOnInit() {
this.fetchUser();
}

fetchUser() {
this.userService.getUser().subscribe(data => this.user = data);
}
}
1 change: 1 addition & 0 deletions src/app/content/account/pages/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from './user-profile/user-profile.component';
export * from './page-user-settings/page-user-settings.component';
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<sr-settings-view></sr-settings-view>
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';

import { PageUserSettingsComponent } from './page-user-settings.component';
import {AccountModule} from "../../account.module";
import {TranslateModule} from "@ngx-translate/core";

describe('PageUserSettingsComponent', () => {
let component: PageUserSettingsComponent;
let fixture: ComponentFixture<PageUserSettingsComponent>;

beforeEach(async () => {
await TestBed.configureTestingModule({
declarations: [ PageUserSettingsComponent ],
imports: [
AccountModule,
TranslateModule.forRoot()
]
})
.compileComponents();

fixture = TestBed.createComponent(PageUserSettingsComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});

it('should create', () => {
expect(component).toBeTruthy();
});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Component } from '@angular/core';

@Component({
selector: 'sr-page-user-settings',
templateUrl: './page-user-settings.component.html',
styleUrls: ['./page-user-settings.component.scss']
})
export class PageUserSettingsComponent {

}
4 changes: 0 additions & 4 deletions src/app/core/model/list/athlete-list-tile.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,4 @@ export class AthleteListTile implements IListTile {
this.nameLink = "" + athlete.alias[0] + "-" + athlete.year;
this.teamLink = "../team/@" + athlete.team.alias[0];
}




}
5 changes: 5 additions & 0 deletions src/app/core/model/list/list-config.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export class ListConfig {
showMoreButton: boolean = true;
showSetUserAthleteButton: boolean = false;
showUnsetUserAthleteButton: boolean = false;
}
1 change: 0 additions & 1 deletion src/app/core/model/list/list-tile.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,4 @@ export interface IListTile {
teamLink?: string;
country?: string;
entryType: "athlete" | "team" | undefined;

}
21 changes: 21 additions & 0 deletions src/app/core/model/list/user-athlete-list-tile.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import {IListTile} from "./list-tile.model";
import {Athlete} from "../athlete";

export class UserAthleteListTile implements IListTile {
id: string;
name: string;
nameLink?: string;
badge?: string;
team?: string;
teamLink?: string;
entryType: "athlete" = "athlete";

constructor(athlete: Athlete) {
this.id = athlete._id;
this.name = athlete.name;
this.badge = athlete.year;
this.team = athlete.team.name;
this.nameLink = "../../athlete/" + athlete.alias[0] + "-" + athlete.year;
this.teamLink = "../../team/@" + athlete.team.alias[0];
}
}
4 changes: 4 additions & 0 deletions src/app/core/service/api/user/user.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,8 @@ export class UserService extends BaseService {
public setFollowing(athlete_id: string, follow: boolean): Observable<User> {
return this.apiService.post(this.API_URL, "user/athlete", {athlete: athlete_id, follow: follow});
}

public setUserAthlete(athlete_id: string, set: boolean): Observable<User> {
return this.apiService.post(this.API_URL, "user/me", {athlete: athlete_id, set: set});
}
}
22 changes: 21 additions & 1 deletion src/app/shared/elements/list/list-tile/list-tile.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,33 @@
<span *ngIf="entry.country" class="country-flag" [title]="entry.country">
<img class="flag" src="https://flagsapi.com/{{flags.get(entry.country)}}/flat/24.png" alt="flag">
</span>
<button class="sr-btn-bar sr-btn-icon sr-btn sr-right" [matMenuTriggerFor]="contextMenu"><mat-icon>more_horiz</mat-icon></button>

<button *ngIf="config.showMoreButton" class="sr-btn-bar sr-btn-icon sr-btn sr-right" [matMenuTriggerFor]="contextMenu"><mat-icon>more_horiz</mat-icon></button>

<button
*ngIf="config.showSetUserAthleteButton"
(click)="onSetUserAthlete()"
class="sr-btn-bar sr-btn-icon sr-btn sr-right"
>
<sr-spinner *ngIf="fetchingSetUserAthlete.fetching" spinnerSize="btn" [style]="'material'" materialColor="first"></sr-spinner>
<mat-icon *ngIf="!fetchingSetUserAthlete.fetching">person_add</mat-icon>
</button>

<button
*ngIf="config.showUnsetUserAthleteButton"
(click)="onUnsetUserAthlete()"
class="sr-btn-bar sr-btn-icon sr-btn sr-right"
>
<sr-spinner *ngIf="fetchingSetUserAthlete.fetching" spinnerSize="btn" [style]="'material'" materialColor="first"></sr-spinner>
<mat-icon *ngIf="!fetchingSetUserAthlete.fetching">person_remove</mat-icon>
</button>


<!-- an hidden div is created to set the position of appearance of the menu-->
<div style="visibility: hidden; position: fixed;"
[style.left.px]="menuTopLeftPosition.x"
[style.top.px]="menuTopLeftPosition.y"
*ngIf="config.showMoreButton"
#contextMenuTrigger="matMenuTrigger" [matMenuTriggerFor]="contextMenu"></div>


Expand Down
Loading

0 comments on commit a2d5ba1

Please sign in to comment.