SKE-69 SKE-70 home component
This commit is contained in:
parent
77b0c99296
commit
7cf0245b43
@ -25,8 +25,8 @@ import { CompetitionCreateComponent } from '@app/competition-create/competition-
|
|||||||
{ path: 'tenants', component: TenantsComponent, data: { permission: 'Pages.Tenants' }, canActivate: [AppRouteGuard] },
|
{ path: 'tenants', component: TenantsComponent, data: { permission: 'Pages.Tenants' }, canActivate: [AppRouteGuard] },
|
||||||
{ path: 'about', component: AboutComponent },
|
{ path: 'about', component: AboutComponent },
|
||||||
{ path: 'categories-list', component: CategoriesListComponent, canActivate: [AppRouteGuard] },
|
{ path: 'categories-list', component: CategoriesListComponent, canActivate: [AppRouteGuard] },
|
||||||
{ path: 'categories-list/:id', component: CompetitionsListComponent, canActivate: [AppRouteGuard] },
|
{ path: 'categories-list/:categoryId', component: CompetitionsListComponent, canActivate: [AppRouteGuard] },
|
||||||
{ path: 'categories-list/:id/competitions/:id', component: CompetitionDetailComponent, canActivate: [AppRouteGuard] },
|
{ path: 'categories-list/:categoryId/competitions/:competitionId', component: CompetitionDetailComponent, canActivate: [AppRouteGuard] },
|
||||||
{ path: 'competition-create', component: CompetitionCreateComponent, data: { permission: 'Pages.Create.Competition' }, canActivate: [AppRouteGuard] },
|
{ path: 'competition-create', component: CompetitionCreateComponent, data: { permission: 'Pages.Create.Competition' }, canActivate: [AppRouteGuard] },
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ export class CompetitionDetailComponent extends AppComponentBase implements OnIn
|
|||||||
|
|
||||||
this.routeSubscription = this.route.params
|
this.routeSubscription = this.route.params
|
||||||
.subscribe(params => {
|
.subscribe(params => {
|
||||||
this.competitionId = +params['id'];
|
this.competitionId = +params['competitionId'];
|
||||||
this.getCompetition();
|
this.getCompetition();
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ export class CompetitionsListComponent extends AppComponentBase implements OnIni
|
|||||||
private getCompetitions(): void {
|
private getCompetitions(): void {
|
||||||
this.paramSubscription = this.route.params
|
this.paramSubscription = this.route.params
|
||||||
.pipe(mergeMap(params => {
|
.pipe(mergeMap(params => {
|
||||||
this.categoryId = +params['id'];
|
this.categoryId = +params['categoryId'];
|
||||||
this.setBusy(this.competitionsListAreaId);
|
this.setBusy(this.competitionsListAreaId);
|
||||||
const competitionListStream = this._competitionCategoryService
|
const competitionListStream = this._competitionCategoryService
|
||||||
.getAllCompetitionsForCategory(this.categoryId)
|
.getAllCompetitionsForCategory(this.categoryId)
|
||||||
@ -72,7 +72,6 @@ export class CompetitionsListComponent extends AppComponentBase implements OnIni
|
|||||||
|
|
||||||
public goToDetail(competition: CompetitionDto): void {
|
public goToDetail(competition: CompetitionDto): void {
|
||||||
const route: string = this.router.url + `/competitions/${competition.id}`;
|
const route: string = this.router.url + `/competitions/${competition.id}`;
|
||||||
//const route: string = `app/competitions/${competition.id}`;
|
|
||||||
this.router.navigate([route]);
|
this.router.navigate([route]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,3 +1,42 @@
|
|||||||
h2 {
|
h2 {
|
||||||
color: #771111;
|
color: #771111;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-item {
|
||||||
|
background-color: #DED4F4;
|
||||||
|
width: 450px;
|
||||||
|
margin: 10px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 20px;
|
||||||
|
border-radius: 5px;
|
||||||
|
border: 1px solid gray;
|
||||||
|
border-left: 10px #739CB9 solid;
|
||||||
|
color: darkblue;
|
||||||
|
text-shadow: 0px 0px 1px #ab93ab;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-item:hover {
|
||||||
|
box-shadow: 0px 0px 10px #2196F3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.organizer {
|
||||||
|
font-size: 14px;
|
||||||
|
color: #f44336;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.bottom-flex {
|
||||||
|
color: white;
|
||||||
|
background-color: #2196F3;
|
||||||
}
|
}
|
@ -4,4 +4,19 @@
|
|||||||
<h2 class="text-center font-weight-normal">MOJE KONKURSY</h2>
|
<h2 class="text-center font-weight-normal">MOJE KONKURSY</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="flex-container">
|
||||||
|
<div class="flex-item" (click)="goToDetail(competition)" *ngFor="let competition of myCompetitionsList">
|
||||||
|
<p><u>{{ competition.name }}</u></p>
|
||||||
|
<div class="organizer">Organizowany przez: {{ competition.creatorName }}</div>
|
||||||
|
|
||||||
|
<div class="bottom-flex">
|
||||||
|
<p>Czas trwania: {{ competition.startDate | date:"dd/MM/yyyy" }} - {{ competition.endDate | date:"dd/MM/yyyy" }}</p>
|
||||||
|
<p>Przedział klasowy: {{ competition.minClass }}-{{ competition.maxClass }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div *ngIf="myCompetitionsList?.length === 0">
|
||||||
|
Brak konkursów
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
@ -1,21 +1,55 @@
|
|||||||
import { Component, Injector, OnInit } from '@angular/core';
|
import { Component, Injector, OnInit, OnDestroy } from '@angular/core';
|
||||||
import { AppComponentBase } from '@shared/app-component-base';
|
import { AppComponentBase } from '@shared/app-component-base';
|
||||||
import { appModuleAnimation } from '@shared/animations/routerTransition';
|
import { appModuleAnimation } from '@shared/animations/routerTransition';
|
||||||
|
import { CompetitionServiceProxy, CompetitionDto } from '@shared/service-proxies/service-proxies';
|
||||||
|
import { List } from 'lodash';
|
||||||
|
import { Subscription } from 'rxjs/Rx';
|
||||||
|
import { finalize } from 'rxjs/operators';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
templateUrl: './home.component.html',
|
templateUrl: './home.component.html',
|
||||||
styleUrls: ['./home.component.css'],
|
styleUrls: ['./home.component.css'],
|
||||||
animations: [appModuleAnimation()]
|
animations: [appModuleAnimation()]
|
||||||
})
|
})
|
||||||
export class HomeComponent extends AppComponentBase implements OnInit {
|
export class HomeComponent extends AppComponentBase implements OnInit, OnDestroy {
|
||||||
|
|
||||||
|
public myCompetitionsList: List<CompetitionDto> = [];
|
||||||
|
public homeAreaId: string = 'home-area';
|
||||||
|
|
||||||
|
private myCompetitionsListSubscription: Subscription;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
injector: Injector
|
injector: Injector,
|
||||||
|
private _competitionService: CompetitionServiceProxy,
|
||||||
|
private router: Router
|
||||||
) {
|
) {
|
||||||
super(injector);
|
super(injector);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ngOnInit(): void {
|
public ngOnInit(): void {
|
||||||
|
this.getCompetitionsForUser();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ngOnDestroy(): void {
|
||||||
|
if (this.myCompetitionsListSubscription) {
|
||||||
|
this.myCompetitionsListSubscription.unsubscribe();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private getCompetitionsForUser(): void {
|
||||||
|
this.setBusy(this.homeAreaId);
|
||||||
|
|
||||||
|
this.myCompetitionsListSubscription = this._competitionService.getAllCompetitionsForUser()
|
||||||
|
.pipe(finalize(() => { this.clearBusy(this.homeAreaId); }))
|
||||||
|
.subscribe((result: List<CompetitionDto>) => {
|
||||||
|
this.myCompetitionsList = result;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public goToDetail(competition: CompetitionDto): void {
|
||||||
|
const route: string = `app/categories-list/${competition.categoryId}/competitions/${competition.id}`;
|
||||||
|
this.router.navigate([route]);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -274,6 +274,62 @@ export class CompetitionServiceProxy {
|
|||||||
return _observableOf<number>(<any>null);
|
return _observableOf<number>(<any>null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Success
|
||||||
|
*/
|
||||||
|
getAllCompetitionsForUser(): Observable<CompetitionDto[]> {
|
||||||
|
let url_ = this.baseUrl + "/api/services/app/Competition/GetAllCompetitionsForUser";
|
||||||
|
url_ = url_.replace(/[?&]$/, "");
|
||||||
|
|
||||||
|
let options_ : any = {
|
||||||
|
observe: "response",
|
||||||
|
responseType: "blob",
|
||||||
|
headers: new HttpHeaders({
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
"Accept": "application/json"
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_ : any) => {
|
||||||
|
return this.processGetAllCompetitionsForUser(response_);
|
||||||
|
})).pipe(_observableCatch((response_: any) => {
|
||||||
|
if (response_ instanceof HttpResponseBase) {
|
||||||
|
try {
|
||||||
|
return this.processGetAllCompetitionsForUser(<any>response_);
|
||||||
|
} catch (e) {
|
||||||
|
return <Observable<CompetitionDto[]>><any>_observableThrow(e);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
return <Observable<CompetitionDto[]>><any>_observableThrow(response_);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected processGetAllCompetitionsForUser(response: HttpResponseBase): Observable<CompetitionDto[]> {
|
||||||
|
const status = response.status;
|
||||||
|
const responseBlob =
|
||||||
|
response instanceof HttpResponse ? response.body :
|
||||||
|
(<any>response).error instanceof Blob ? (<any>response).error : undefined;
|
||||||
|
|
||||||
|
let _headers: any = {}; if (response.headers) { for (let key of response.headers.keys()) { _headers[key] = response.headers.get(key); }};
|
||||||
|
if (status === 200) {
|
||||||
|
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
||||||
|
let result200: any = null;
|
||||||
|
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
||||||
|
if (resultData200 && resultData200.constructor === Array) {
|
||||||
|
result200 = [];
|
||||||
|
for (let item of resultData200)
|
||||||
|
result200.push(CompetitionDto.fromJS(item));
|
||||||
|
}
|
||||||
|
return _observableOf(result200);
|
||||||
|
}));
|
||||||
|
} else if (status !== 200 && status !== 204) {
|
||||||
|
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
||||||
|
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
return _observableOf<CompetitionDto[]>(<any>null);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @competitionId (optional)
|
* @competitionId (optional)
|
||||||
* @return Success
|
* @return Success
|
||||||
@ -2420,6 +2476,7 @@ export class CompetitionDto implements ICompetitionDto {
|
|||||||
maxClass: number | undefined;
|
maxClass: number | undefined;
|
||||||
creationTime: moment.Moment | undefined;
|
creationTime: moment.Moment | undefined;
|
||||||
creatorName: string | undefined;
|
creatorName: string | undefined;
|
||||||
|
categoryId: number | undefined;
|
||||||
questions: QuestionDto[] | undefined;
|
questions: QuestionDto[] | undefined;
|
||||||
id: number | undefined;
|
id: number | undefined;
|
||||||
|
|
||||||
@ -2443,6 +2500,7 @@ export class CompetitionDto implements ICompetitionDto {
|
|||||||
this.maxClass = data["maxClass"];
|
this.maxClass = data["maxClass"];
|
||||||
this.creationTime = data["creationTime"] ? moment(data["creationTime"].toString()) : <any>undefined;
|
this.creationTime = data["creationTime"] ? moment(data["creationTime"].toString()) : <any>undefined;
|
||||||
this.creatorName = data["creatorName"];
|
this.creatorName = data["creatorName"];
|
||||||
|
this.categoryId = data["categoryId"];
|
||||||
if (data["questions"] && data["questions"].constructor === Array) {
|
if (data["questions"] && data["questions"].constructor === Array) {
|
||||||
this.questions = [];
|
this.questions = [];
|
||||||
for (let item of data["questions"])
|
for (let item of data["questions"])
|
||||||
@ -2470,6 +2528,7 @@ export class CompetitionDto implements ICompetitionDto {
|
|||||||
data["maxClass"] = this.maxClass;
|
data["maxClass"] = this.maxClass;
|
||||||
data["creationTime"] = this.creationTime ? this.creationTime.toISOString() : <any>undefined;
|
data["creationTime"] = this.creationTime ? this.creationTime.toISOString() : <any>undefined;
|
||||||
data["creatorName"] = this.creatorName;
|
data["creatorName"] = this.creatorName;
|
||||||
|
data["categoryId"] = this.categoryId;
|
||||||
if (this.questions && this.questions.constructor === Array) {
|
if (this.questions && this.questions.constructor === Array) {
|
||||||
data["questions"] = [];
|
data["questions"] = [];
|
||||||
for (let item of this.questions)
|
for (let item of this.questions)
|
||||||
@ -2497,6 +2556,7 @@ export interface ICompetitionDto {
|
|||||||
maxClass: number | undefined;
|
maxClass: number | undefined;
|
||||||
creationTime: moment.Moment | undefined;
|
creationTime: moment.Moment | undefined;
|
||||||
creatorName: string | undefined;
|
creatorName: string | undefined;
|
||||||
|
categoryId: number | undefined;
|
||||||
questions: QuestionDto[] | undefined;
|
questions: QuestionDto[] | undefined;
|
||||||
id: number | undefined;
|
id: number | undefined;
|
||||||
}
|
}
|
||||||
|
@ -104,6 +104,40 @@ namespace SystemKonkursow.Competition.CompetitionCategory
|
|||||||
return newCompetitionId;
|
return newCompetitionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[AbpAuthorize]
|
||||||
|
public async Task<List<CompetitionDto>> GetAllCompetitionsForUser()
|
||||||
|
{
|
||||||
|
var user = await GetCurrentUserAsync();
|
||||||
|
|
||||||
|
var isParticipant = await _userManager.IsParticipantUserAsync(user);
|
||||||
|
|
||||||
|
if (isParticipant)
|
||||||
|
{
|
||||||
|
var participantCompetitions = await _rankingPositionRepository.GetAll()
|
||||||
|
.Include(t => t.Competition).ThenInclude(x => x.Creator)
|
||||||
|
.Include(t => t.Competition).ThenInclude(x => x.CompetitionCategories)
|
||||||
|
.Where(t => t.UserId == user.Id).ToListAsync();
|
||||||
|
|
||||||
|
var mappedObjects = ObjectMapper.Map<List<CompetitionDto>>(participantCompetitions
|
||||||
|
.OrderBy(t => t.Competition.Name));
|
||||||
|
|
||||||
|
return mappedObjects;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var organizerCompetitions = await _competitionRepository.GetAll()
|
||||||
|
.Include(t => t.Creator)
|
||||||
|
.Include(t => t.CompetitionCategories)
|
||||||
|
.Where(t => t.CreatorUserId == user.Id).ToListAsync();
|
||||||
|
|
||||||
|
var mappedObjects = ObjectMapper.Map<List<CompetitionDto>>(organizerCompetitions
|
||||||
|
.OrderBy(t => t.Name));
|
||||||
|
|
||||||
|
return mappedObjects;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
[AbpAuthorize]
|
[AbpAuthorize]
|
||||||
public CompetitionDto GetCompetition(int competitionId)
|
public CompetitionDto GetCompetition(int competitionId)
|
||||||
{
|
{
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace SystemKonkursow.Competition.CompetitionCategory.Dto
|
namespace SystemKonkursow.Competition.CompetitionCategory.Dto
|
||||||
{
|
{
|
||||||
@ -21,12 +22,27 @@ namespace SystemKonkursow.Competition.CompetitionCategory.Dto
|
|||||||
CreateMap<CreateCompetitionDto, Domain.Competition>();
|
CreateMap<CreateCompetitionDto, Domain.Competition>();
|
||||||
|
|
||||||
CreateMap<Domain.Competition, CompetitionDto>()
|
CreateMap<Domain.Competition, CompetitionDto>()
|
||||||
.ForMember(dest => dest.CreatorName, opt => opt.MapFrom(src => src.Creator.UserName));
|
.ForMember(dest => dest.CreatorName, opt => opt.MapFrom(src => src.Creator.UserName))
|
||||||
|
.ForMember(dest => dest.CategoryId, opt => opt.MapFrom(src => src.CompetitionCategories.FirstOrDefault().CategoryId));
|
||||||
|
|
||||||
CreateMap<CreateRankingPositionDto, Domain.RankingPosition>();
|
CreateMap<CreateRankingPositionDto, Domain.RankingPosition>();
|
||||||
|
|
||||||
CreateMap<Domain.RankingPosition, RankingPositionDto>()
|
CreateMap<Domain.RankingPosition, RankingPositionDto>()
|
||||||
.ForMember(dest => dest.ParticipantName, opt => opt.MapFrom(src => src.User.UserName));
|
.ForMember(dest => dest.ParticipantName, opt => opt.MapFrom(src => src.User.UserName));
|
||||||
|
|
||||||
|
CreateMap<Domain.RankingPosition, CompetitionDto>()
|
||||||
|
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.CompetitionId))
|
||||||
|
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Competition.Name))
|
||||||
|
.ForMember(dest => dest.StartDate, opt => opt.MapFrom(src => src.Competition.StartDate))
|
||||||
|
.ForMember(dest => dest.EndDate, opt => opt.MapFrom(src => src.Competition.EndDate))
|
||||||
|
.ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Competition.Description))
|
||||||
|
.ForMember(dest => dest.Prize, opt => opt.MapFrom(src => src.Competition.Prize))
|
||||||
|
.ForMember(dest => dest.MinClass, opt => opt.MapFrom(src => src.Competition.MinClass))
|
||||||
|
.ForMember(dest => dest.MaxClass, opt => opt.MapFrom(src => src.Competition.MaxClass))
|
||||||
|
.ForMember(dest => dest.CreationTime, opt => opt.MapFrom(src => src.Competition.CreationTime))
|
||||||
|
.ForMember(dest => dest.CreatorName, opt => opt.MapFrom(src => src.Competition.Creator.UserName))
|
||||||
|
.ForMember(dest => dest.CategoryId, opt => opt.MapFrom(src => src.Competition.CompetitionCategories.FirstOrDefault().CategoryId));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,8 @@ namespace SystemKonkursow.Competition.CompetitionCategory.Dto
|
|||||||
|
|
||||||
public string CreatorName { get; set; }
|
public string CreatorName { get; set; }
|
||||||
|
|
||||||
|
public int CategoryId { get; set; }
|
||||||
|
|
||||||
public List<QuestionDto> Questions { get; set; }
|
public List<QuestionDto> Questions { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,8 @@ namespace SystemKonkursow.Domain
|
|||||||
[ForeignKey(nameof(CreatorUserId))]
|
[ForeignKey(nameof(CreatorUserId))]
|
||||||
public virtual User Creator { get; set; }
|
public virtual User Creator { get; set; }
|
||||||
|
|
||||||
|
public virtual List<CompetitionCategory> CompetitionCategories { get; set; }
|
||||||
|
|
||||||
public virtual List<Question> Questions { get; set; }
|
public virtual List<Question> Questions { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user