From c3ae74eb6d4f3f7ece6a082db1051e874fed5c69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konrad=20Wei=C3=9F?= Date: Tue, 14 Nov 2023 01:12:16 +0100 Subject: [PATCH 1/2] set athlete button in starts widget --- .../widget-starts-large/widget-starts-large.component.html | 2 ++ src/assets/i18n/de.json | 1 + src/assets/i18n/en.json | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/shared/widget/widgets/starts/widget-starts-large/widget-starts-large.component.html b/src/app/shared/widget/widgets/starts/widget-starts-large/widget-starts-large.component.html index e6ea127..94adb95 100644 --- a/src/app/shared/widget/widgets/starts/widget-starts-large/widget-starts-large.component.html +++ b/src/app/shared/widget/widgets/starts/widget-starts-large/widget-starts-large.component.html @@ -5,6 +5,8 @@ {{'WIDGET.STARTS.NO_OWN_ATHLETE' | translate}} +

+ {{'WIDGET.STARTS.SET_OWN_ATHLETE_BUTTON' | translate}}
{{'WIDGET.STARTS.NO_STARTS' | translate}} diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index a8437da..90bf54f 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -250,6 +250,7 @@ "STARTS": { "TITLE": "Nächste Starts", "NO_OWN_ATHLETE": "Wähle aus, welcher Sportler du bist, um dieses Widget nutzen zu können.", + "SET_OWN_ATHLETE_BUTTON": "Sportler setzen", "NO_STARTS": "Es wurden keine offenen Starts gefunden.", "SHOW_STARTS_BUTTON": "Alle Starts anzeigen" } diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 361dc90..a72a29d 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -245,7 +245,8 @@ }, "STARTS": { "TITLE": "Upcoming Starts", - "NO_OWN_ATHLETE": "Select what athlete you are in order to use this widget.", + "NO_OWN_ATHLETE": "Select which athlete you are in order to use this widget.", + "SET_OWN_ATHLETE_BUTTON": "Set Athlete", "NO_STARTS": "No starts could be found.", "SHOW_STARTS_BUTTON": "Show all starts" } From 8a603a282cc721c4057530dd40f6b3f3c9c33d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konrad=20Wei=C3=9F?= Date: Tue, 14 Nov 2023 13:15:08 +0100 Subject: [PATCH 2/2] add settings page; add settings for user athlete; settings link in starts widget; --- src/app/app-routing.module.ts | 3 +- src/app/content/account/account.module.ts | 10 ++- src/app/content/account/components/index.ts | 2 + .../settings-user-athlete.component.html | 25 +++++++ .../settings-user-athlete.component.scss | 0 .../settings-user-athlete.component.spec.ts | 29 ++++++++ .../settings-user-athlete.component.ts | 73 +++++++++++++++++++ .../settings-view.component.html | 1 + .../settings-view.component.scss | 0 .../settings-view.component.spec.ts | 31 ++++++++ .../settings-view/settings-view.component.ts | 25 +++++++ src/app/content/account/pages/index.ts | 1 + .../page-user-settings.component.html | 1 + .../page-user-settings.component.scss | 0 .../page-user-settings.component.spec.ts | 29 ++++++++ .../page-user-settings.component.ts | 10 +++ .../model/list/athlete-list-tile.model.ts | 4 - src/app/core/model/list/list-config.model.ts | 5 ++ src/app/core/model/list/list-tile.model.ts | 1 - .../list/user-athlete-list-tile.model.ts | 21 ++++++ src/app/core/service/api/user/user.service.ts | 4 + .../list/list-tile/list-tile.component.html | 22 +++++- .../list/list-tile/list-tile.component.ts | 35 ++++++++- .../list/list-view/list-view.component.html | 10 ++- .../list/list-view/list-view.component.ts | 8 ++ .../elements/spinner/spinner.component.html | 3 +- .../elements/spinner/spinner.component.scss | 8 +- .../elements/spinner/spinner.component.ts | 1 + .../header-buttons.component.html | 2 +- .../widget-starts-large.component.html | 2 +- src/assets/i18n/de.json | 8 ++ src/assets/i18n/en.json | 8 ++ src/material.scss | 5 ++ 33 files changed, 366 insertions(+), 21 deletions(-) create mode 100644 src/app/content/account/components/index.ts create mode 100644 src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.html create mode 100644 src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.scss create mode 100644 src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.spec.ts create mode 100644 src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.ts create mode 100644 src/app/content/account/components/settings-view/settings-view.component.html create mode 100644 src/app/content/account/components/settings-view/settings-view.component.scss create mode 100644 src/app/content/account/components/settings-view/settings-view.component.spec.ts create mode 100644 src/app/content/account/components/settings-view/settings-view.component.ts create mode 100644 src/app/content/account/pages/page-user-settings/page-user-settings.component.html create mode 100644 src/app/content/account/pages/page-user-settings/page-user-settings.component.scss create mode 100644 src/app/content/account/pages/page-user-settings/page-user-settings.component.spec.ts create mode 100644 src/app/content/account/pages/page-user-settings/page-user-settings.component.ts create mode 100644 src/app/core/model/list/list-config.model.ts create mode 100644 src/app/core/model/list/user-athlete-list-tile.model.ts diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index bf545a8..e6d1611 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -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"; @@ -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: '/' }, diff --git a/src/app/content/account/account.module.ts b/src/app/content/account/account.module.ts index 562cee5..33d4c5c 100644 --- a/src/app/content/account/account.module.ts +++ b/src/app/content/account/account.module.ts @@ -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, diff --git a/src/app/content/account/components/index.ts b/src/app/content/account/components/index.ts new file mode 100644 index 0000000..4fd0540 --- /dev/null +++ b/src/app/content/account/components/index.ts @@ -0,0 +1,2 @@ +export * from './settings-view/settings-view.component'; +export * from './user-profile-view/user-profile-view.component'; diff --git a/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.html b/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.html new file mode 100644 index 0000000..6570e96 --- /dev/null +++ b/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.html @@ -0,0 +1,25 @@ +

{{'USER.SETTINGS.USER_ATHLETE.TITLE' | translate}}

+

{{'USER.SETTINGS.USER_ATHLETE.INFO_TEXT' | translate}}

+ + + +

{{'USER.SETTINGS.USER_ATHLETE.THIS_IS_YOU_TITLE' | translate}}

+ +
+
+ {{'USER.SETTINGS.USER_ATHLETE.NO_USER_SET' | translate}} +
+ +

+ + +
diff --git a/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.scss b/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.spec.ts b/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.spec.ts new file mode 100644 index 0000000..0d279c1 --- /dev/null +++ b/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.spec.ts @@ -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; + + 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(); + }); +}); diff --git a/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.ts b/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.ts new file mode 100644 index 0000000..5bfe73a --- /dev/null +++ b/src/app/content/account/components/settings-user-athlete/settings-user-athlete.component.ts @@ -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)); + }) + } +} diff --git a/src/app/content/account/components/settings-view/settings-view.component.html b/src/app/content/account/components/settings-view/settings-view.component.html new file mode 100644 index 0000000..2ab59e6 --- /dev/null +++ b/src/app/content/account/components/settings-view/settings-view.component.html @@ -0,0 +1 @@ + diff --git a/src/app/content/account/components/settings-view/settings-view.component.scss b/src/app/content/account/components/settings-view/settings-view.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/content/account/components/settings-view/settings-view.component.spec.ts b/src/app/content/account/components/settings-view/settings-view.component.spec.ts new file mode 100644 index 0000000..0445736 --- /dev/null +++ b/src/app/content/account/components/settings-view/settings-view.component.spec.ts @@ -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; + + 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(); + }); +}); diff --git a/src/app/content/account/components/settings-view/settings-view.component.ts b/src/app/content/account/components/settings-view/settings-view.component.ts new file mode 100644 index 0000000..6771df8 --- /dev/null +++ b/src/app/content/account/components/settings-view/settings-view.component.ts @@ -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); + } +} diff --git a/src/app/content/account/pages/index.ts b/src/app/content/account/pages/index.ts index 9591f77..d3b9cff 100644 --- a/src/app/content/account/pages/index.ts +++ b/src/app/content/account/pages/index.ts @@ -1 +1,2 @@ export * from './user-profile/user-profile.component'; +export * from './page-user-settings/page-user-settings.component'; diff --git a/src/app/content/account/pages/page-user-settings/page-user-settings.component.html b/src/app/content/account/pages/page-user-settings/page-user-settings.component.html new file mode 100644 index 0000000..3bb758d --- /dev/null +++ b/src/app/content/account/pages/page-user-settings/page-user-settings.component.html @@ -0,0 +1 @@ + diff --git a/src/app/content/account/pages/page-user-settings/page-user-settings.component.scss b/src/app/content/account/pages/page-user-settings/page-user-settings.component.scss new file mode 100644 index 0000000..e69de29 diff --git a/src/app/content/account/pages/page-user-settings/page-user-settings.component.spec.ts b/src/app/content/account/pages/page-user-settings/page-user-settings.component.spec.ts new file mode 100644 index 0000000..e7af78c --- /dev/null +++ b/src/app/content/account/pages/page-user-settings/page-user-settings.component.spec.ts @@ -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; + + 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(); + }); +}); diff --git a/src/app/content/account/pages/page-user-settings/page-user-settings.component.ts b/src/app/content/account/pages/page-user-settings/page-user-settings.component.ts new file mode 100644 index 0000000..f5e84ea --- /dev/null +++ b/src/app/content/account/pages/page-user-settings/page-user-settings.component.ts @@ -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 { + +} diff --git a/src/app/core/model/list/athlete-list-tile.model.ts b/src/app/core/model/list/athlete-list-tile.model.ts index 9356de2..4334798 100644 --- a/src/app/core/model/list/athlete-list-tile.model.ts +++ b/src/app/core/model/list/athlete-list-tile.model.ts @@ -18,8 +18,4 @@ export class AthleteListTile implements IListTile { this.nameLink = "" + athlete.alias[0] + "-" + athlete.year; this.teamLink = "../team/@" + athlete.team.alias[0]; } - - - - } diff --git a/src/app/core/model/list/list-config.model.ts b/src/app/core/model/list/list-config.model.ts new file mode 100644 index 0000000..4a301d9 --- /dev/null +++ b/src/app/core/model/list/list-config.model.ts @@ -0,0 +1,5 @@ +export class ListConfig { + showMoreButton: boolean = true; + showSetUserAthleteButton: boolean = false; + showUnsetUserAthleteButton: boolean = false; +} diff --git a/src/app/core/model/list/list-tile.model.ts b/src/app/core/model/list/list-tile.model.ts index 22d6c8e..dc3e81d 100644 --- a/src/app/core/model/list/list-tile.model.ts +++ b/src/app/core/model/list/list-tile.model.ts @@ -7,5 +7,4 @@ export interface IListTile { teamLink?: string; country?: string; entryType: "athlete" | "team" | undefined; - } diff --git a/src/app/core/model/list/user-athlete-list-tile.model.ts b/src/app/core/model/list/user-athlete-list-tile.model.ts new file mode 100644 index 0000000..02e7f8e --- /dev/null +++ b/src/app/core/model/list/user-athlete-list-tile.model.ts @@ -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]; + } +} diff --git a/src/app/core/service/api/user/user.service.ts b/src/app/core/service/api/user/user.service.ts index da9496d..a8d9267 100644 --- a/src/app/core/service/api/user/user.service.ts +++ b/src/app/core/service/api/user/user.service.ts @@ -23,4 +23,8 @@ export class UserService extends BaseService { public setFollowing(athlete_id: string, follow: boolean): Observable { return this.apiService.post(this.API_URL, "user/athlete", {athlete: athlete_id, follow: follow}); } + + public setUserAthlete(athlete_id: string, set: boolean): Observable { + return this.apiService.post(this.API_URL, "user/me", {athlete: athlete_id, set: set}); + } } diff --git a/src/app/shared/elements/list/list-tile/list-tile.component.html b/src/app/shared/elements/list/list-tile/list-tile.component.html index d5d4b07..faa408a 100644 --- a/src/app/shared/elements/list/list-tile/list-tile.component.html +++ b/src/app/shared/elements/list/list-tile/list-tile.component.html @@ -16,13 +16,33 @@ flag - + + + + + +
diff --git a/src/app/shared/elements/list/list-tile/list-tile.component.ts b/src/app/shared/elements/list/list-tile/list-tile.component.ts index bcc706f..195c76e 100644 --- a/src/app/shared/elements/list/list-tile/list-tile.component.ts +++ b/src/app/shared/elements/list/list-tile/list-tile.component.ts @@ -1,7 +1,10 @@ -import {Component, Input, ViewChild} from '@angular/core'; +import {Component, EventEmitter, Input, Output, ViewChild} from '@angular/core'; import {IListTile} from "../../../../core/model/list/list-tile.model"; import {MatMenuTrigger} from "@angular/material/menu"; import {countryFlags} from "../../../../core/constant/countryflags.constant"; +import {ListConfig} from "../../../../core/model/list/list-config.model"; +import {UserService} from "../../../../core/service/api"; +import {FetchingModel} from "../../../../core/model/common/fetching.model"; @Component({ selector: 'sr-list-tile', @@ -10,14 +13,23 @@ import {countryFlags} from "../../../../core/constant/countryflags.constant"; }) export class ListTileComponent { @Input() entry!: IListTile; + @Input() config!: ListConfig; + @Output() refreshRequired: EventEmitter = new EventEmitter(); flags: Map = countryFlags; + fetchingSetUserAthlete: FetchingModel = {fetching: false} as FetchingModel; + // we create an object that contains coordinates menuTopLeftPosition = {x: 0, y: 0} // reference to the MatMenuTrigger in the DOM @ViewChild("contextMenuTrigger") contextMenuTrigger: MatMenuTrigger = {} as MatMenuTrigger; + constructor( + private userService: UserService + ) { + } + onRightClick(event: MouseEvent) { event.preventDefault(); @@ -26,4 +38,25 @@ export class ListTileComponent { this.contextMenuTrigger.openMenu(); } + + onSetUserAthlete() { + this.fetchingSetUserAthlete.fetching = true; + this.userService.setUserAthlete(this.entry.id, true).subscribe({ + next: (_ => { + this.fetchingSetUserAthlete.fetching = false; + this.refreshRequired.emit(); + }), + error: (_ => this.fetchingSetUserAthlete.fetching = false) + }); + } + + onUnsetUserAthlete() { + this.userService.setUserAthlete(this.entry.id, false).subscribe({ + next: (_ => { + this.fetchingSetUserAthlete.fetching = false; + this.refreshRequired.emit(); + }), + error: (_ => this.fetchingSetUserAthlete.fetching = false) + }); + } } diff --git a/src/app/shared/elements/list/list-view/list-view.component.html b/src/app/shared/elements/list/list-view/list-view.component.html index c978faa..7e0073b 100644 --- a/src/app/shared/elements/list/list-view/list-view.component.html +++ b/src/app/shared/elements/list/list-view/list-view.component.html @@ -6,7 +6,15 @@
- +
{{'COMMON.LIST.NO_ENTRIES_MESSAGE' | translate}} diff --git a/src/app/shared/elements/list/list-view/list-view.component.ts b/src/app/shared/elements/list/list-view/list-view.component.ts index 679a118..8c91a8f 100644 --- a/src/app/shared/elements/list/list-view/list-view.component.ts +++ b/src/app/shared/elements/list/list-view/list-view.component.ts @@ -4,6 +4,7 @@ import {RefreshListRequest} from "../../../../core/model/list/refresh-list-reque import {PagingRequest} from "../../../../core/model/common/paging-request.model"; import {FetchingModel} from "../../../../core/model/common/fetching.model"; import {ListFilterRequest} from "../../../../core/model/list/list-filter-request.model"; +import {ListConfig} from "../../../../core/model/list/list-config.model"; @Component({ selector: 'sr-list-view', @@ -14,6 +15,7 @@ export class ListViewComponent implements OnInit { @Input() data!: IListTile[]; @Input() useSearch: boolean = true; @Input() fetching: FetchingModel = {fetching: false}; + @Input() config: ListConfig = {showMoreButton: true, showSetUserAthleteButton: false, showUnsetUserAthleteButton: false} @Output() refreshData: EventEmitter = new EventEmitter(); limit: number = 30; @@ -34,6 +36,12 @@ export class ListViewComponent implements OnInit { } } + reload() { + this.data = []; + this.lastOffset = -1 + this.refresh(); + } + refresh() { if (this.data && this.data.length && this.lastOffset == this.data.length) { this.showFetchingSpinner = false; diff --git a/src/app/shared/elements/spinner/spinner.component.html b/src/app/shared/elements/spinner/spinner.component.html index 7db6d92..aa06b6b 100644 --- a/src/app/shared/elements/spinner/spinner.component.html +++ b/src/app/shared/elements/spinner/spinner.component.html @@ -1,6 +1,7 @@
- + + diff --git a/src/app/shared/elements/spinner/spinner.component.scss b/src/app/shared/elements/spinner/spinner.component.scss index f8197f6..87bcb46 100644 --- a/src/app/shared/elements/spinner/spinner.component.scss +++ b/src/app/shared/elements/spinner/spinner.component.scss @@ -1,3 +1,5 @@ +@import "../../../../colors"; + .spinner { width: 120px; text-align: center; @@ -19,12 +21,6 @@ margin-top: -4px; } - &.spinner-size-btn { - .mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle, .mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic { - stroke: white !important; - } - } - .mat-spinner { display: inline-block; vertical-align: middle; diff --git a/src/app/shared/elements/spinner/spinner.component.ts b/src/app/shared/elements/spinner/spinner.component.ts index 95c3837..e01e6da 100644 --- a/src/app/shared/elements/spinner/spinner.component.ts +++ b/src/app/shared/elements/spinner/spinner.component.ts @@ -8,4 +8,5 @@ import {Component, Input} from '@angular/core'; export class SpinnerComponent { @Input() style: "material" | "swim clock" = "swim clock"; @Input() spinnerSize: "large" | "text" | "btn" | "widget" = "large"; + @Input() materialColor: "btn" | "first" = "btn"; } diff --git a/src/app/shared/layout/header/header-buttons/header-buttons.component.html b/src/app/shared/layout/header/header-buttons/header-buttons.component.html index 67c50f4..2cf085b 100644 --- a/src/app/shared/layout/header/header-buttons/header-buttons.component.html +++ b/src/app/shared/layout/header/header-buttons/header-buttons.component.html @@ -51,7 +51,7 @@ person {{'HEADER.MENU.ACCOUNT.PROFILE_BUTTON_TEXT' | translate}} - diff --git a/src/app/shared/widget/widgets/starts/widget-starts-large/widget-starts-large.component.html b/src/app/shared/widget/widgets/starts/widget-starts-large/widget-starts-large.component.html index 94adb95..55fb9bd 100644 --- a/src/app/shared/widget/widgets/starts/widget-starts-large/widget-starts-large.component.html +++ b/src/app/shared/widget/widgets/starts/widget-starts-large/widget-starts-large.component.html @@ -6,7 +6,7 @@ {{'WIDGET.STARTS.NO_OWN_ATHLETE' | translate}}

- {{'WIDGET.STARTS.SET_OWN_ATHLETE_BUTTON' | translate}} + {{'WIDGET.STARTS.SET_OWN_ATHLETE_BUTTON' | translate}}
{{'WIDGET.STARTS.NO_STARTS' | translate}} diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 90bf54f..3646ad0 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -225,6 +225,14 @@ "ACTION_BUTTON_TITLE": "Aktionen", "DELETE_USER_BUTTON_TEXT": "Account löschen", "CHANGE_DATA_BUTTON_TEXT": "Benutzerdaten ändern" + }, + "SETTINGS": { + "USER_ATHLETE": { + "INFO_TEXT": "Wenn du selbst ein Schwimmer bist, kannst du hier Auswählen, bei welchem Sportler es sich um dich handelt. Dies wird verwendet, um dir beispielweise in Widgets deine nächsten Starts anzuzeigen.", + "TITLE": "Der Sportler zu deinem Account", + "THIS_IS_YOU_TITLE": "Das bist du:", + "NO_USER_SET": "Dein Account ist aktuell keinem Sportler zugeordnet." + } } }, "WIDGET": { diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index a72a29d..46fa0ca 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -221,6 +221,14 @@ "ACTION_BUTTON_TITLE": "Actions", "DELETE_USER_BUTTON_TEXT": "Delete Account", "CHANGE_DATA_BUTTON_TEXT": "Change User Data" + }, + "SETTINGS": { + "USER_ATHLETE": { + "INFO_TEXT": "Users who are athletes themselves can use this settings to define which athlete their account belongs to. This information is used for example to show you upcoming starts in a widget and other things.", + "TITLE": "Your Accounts Athlete", + "THIS_IS_YOU_TITLE": "That's You:", + "NO_USER_SET": "Your account is currently not assigned to any athlete." + } } }, "WIDGET": { diff --git a/src/material.scss b/src/material.scss index fd8cb0b..c8a1fc5 100644 --- a/src/material.scss +++ b/src/material.scss @@ -67,6 +67,11 @@ display: none; } +.mat-spinner-size-btn.mat-mdc-progress-spinner.mat-spinner-color-first .mdc-circular-progress__determinate-circle, +.mat-spinner-size-btn.mat-mdc-progress-spinner.mat-spinner-color-first .mdc-circular-progress__indeterminate-circle-graphic { + stroke: $color-sr-first !important; +} + .mat-spinner-size-btn.mat-mdc-progress-spinner .mdc-circular-progress__determinate-circle, .mat-spinner-size-btn.mat-mdc-progress-spinner .mdc-circular-progress__indeterminate-circle-graphic { stroke: white !important;