visual polish and bugfixes. auto-refreshing

This commit is contained in:
peter
2020-02-09 02:50:06 +01:00
parent e828a29db6
commit 18f3b32e3c
20 changed files with 996 additions and 754 deletions
+3 -3
View File
@@ -14269,9 +14269,9 @@
"integrity": "sha512-ZYzRkETgBrdEGzL5JSKimvjI2CX7ioyZCkX2BpcfyjqI+079W0wHAyj5W4rIZMcDSOHgLZtgz1IdDi/vU77KEQ=="
},
"rpclibrary": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/rpclibrary/-/rpclibrary-1.6.2.tgz",
"integrity": "sha512-lQTU4XkB9CSHz7YgtAcpVfyR5XrmTRX4P4eQjK6DDUjqKSFvJb5ChXjHnt1BcaNWbJ2VqmhCNVbcoyunJ2u7Rg==",
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/rpclibrary/-/rpclibrary-1.7.1.tgz",
"integrity": "sha512-Ibo3qfURnQgZAq0eA2o+L9+PWaloJ4PHZs4ak42LL9fRgdWZXn33HAtowV0K2HVckbvrBvFqj/+PWTrWWBSOeg==",
"requires": {
"bsock": "^0.1.9",
"http": "0.0.0",
+1 -1
View File
@@ -69,7 +69,7 @@
"normalize.css": "6.0.0",
"pace-js": "1.0.2",
"roboto-fontface": "0.8.0",
"rpclibrary": "^1.6.2",
"rpclibrary": "^1.7.1",
"rxjs": "6.5.2",
"rxjs-compat": "6.3.0",
"socicon": "3.0.5",
@@ -1,213 +1,172 @@
<nb-card class="col-12 col-xl-9">
<nb-card-body>
<nb-tabset>
<nb-tab tabTitle="Info">
<h1>
<img [src]="'../../../../assets/images/'+(raid.tier || 'null').toLowerCase()+'.png'" style="height: 100px" />
{{raid.title}}
</h1>
<p>
{{raid.signupcount}} / {{raid.size}} signups
</p>
<p>
{{raid.description}}
</p>
<div *ngIf="canSignup">
<div *ngIf="isSignedup">
<div class="row">
<div class="col-12 col-xl-6">
<nb-card [size]="giant">
<nb-card-body>
<nb-tabset>
<nb-tab tabTitle="Info">
<h1>
<img [src]="'../../../../assets/images/'+(raid.tier || 'null').toLowerCase()+'.png'"
style="height: 100px" />
{{raid.title}}
</h1>
<p>
You are signed as: {{mySignup.charactername}} ({{mySignup.race}} {{mySignup.specname}} {{mySignup.class}})<br />
Status: {{mySignup.status}}
{{raid.signupcount}} / {{raid.size}} signups
</p>
<button
(click)="setLate(true)"
*ngIf="mySignup.status !== 'Late'"
nbButton
outline
status="warning"
size="medium">
<nb-icon icon="clock-outline"></nb-icon> Late
</button>
<button
(click)="setLate(false)"
*ngIf="mySignup.status === 'Late'"
nbButton
outline
status="success"
size="medium">
<nb-icon icon="checkmark-outline"></nb-icon> On Time
</button>
<button
(click)="unsign()"
nbButton
outline
status="danger"
size="medium">
<nb-icon icon="close"></nb-icon>unsign
</button>
</div>
<div *ngIf="!isSignedup">
<button
(click)="signup()"
nbButton
outline
status="success"
size="medium">
<nb-icon icon="person-done-outline"></nb-icon> sign up
</button>
</div>
</div>
</nb-tab>
<nb-tab tabTitle="Signups"
[badgeText]="raid.signupcount"
badgePosition="top right"
[badgeStatus]="raid.signupcount<40?'warning':'success'">
<div class="row">
<nb-card
class="col-12 col-md-6"
*ngIf="raid.tanks.length > 0">
<nb-card-header>Tanks ({{raid.tanks.length}})</nb-card-header>
<nb-card-body>
<div *ngFor="let participant of raid.tanks">
<button
(click)="setBench(participant)"
*ngIf="manageRaid"
nbButton
outline
status="warning"
size="tiny">
B
<p>
{{raid.description}}
</p>
<div *ngIf="canSignup">
<div *ngIf="isSignedup">
<p>
You are signed as: {{mySignup.charactername}} ({{mySignup.race}}
{{mySignup.specname}}
{{mySignup.class}})<br />
Status: {{mySignup.status}}
</p>
<button (click)="setLate(true)" *ngIf="mySignup.status !== 'Late'" nbButton outline
status="warning" size="medium">
<nb-icon icon="clock-outline"></nb-icon> Late
</button>
<button
(click)="adminUnsign(participant)"
*ngIf="manageRaid"
nbButton
outline
status="danger"
size="tiny">
X
<button (click)="setLate(false)" *ngIf="mySignup.status === 'Late'" nbButton outline
status="success" size="medium">
<nb-icon icon="checkmark-outline"></nb-icon> On Time
</button>
<button (click)="unsign()" nbButton outline status="danger" size="medium">
<nb-icon icon="close"></nb-icon>unsign
</button>
<a [ngStyle]="{'color': participant.color}" style="text-transform: capitalize;"
[routerLink]="'/frontcraft/character/'+participant.charactername">
<img style="width:20px; height:20px" [src]="'../../../../assets/images/'+participant.race.toLowerCase()+'_xs.gif'" />
<img style="width:20px; height:20px" [src]="'../../../../assets/images/'+participant.class.toLowerCase()+'.png'" />
{{ participant.charactername }}
</a>
</div>
</nb-card-body>
</nb-card>
<nb-card
class="col-12 col-md-6"
*ngIf="raid.tanks.length > 0">
<nb-card-header>Healers ({{raid.healers.length}})</nb-card-header>
<nb-card-body>
<div *ngFor="let participant of raid.healers">
<button
(click)="setBench(participant)"
*ngIf="manageRaid"
nbButton
outline
status="warning"
size="tiny">
B
<div *ngIf="!isSignedup">
<button (click)="signup()" nbButton outline status="success" size="medium">
<nb-icon icon="person-done-outline"></nb-icon> sign up
</button>
<button
(click)="adminUnsign(participant)"
*ngIf="manageRaid"
nbButton
outline
status="danger"
size="tiny">
X
</button>
<a [ngStyle]="{'color': participant.color}" style="text-transform: capitalize;"
[routerLink]="'/frontcraft/character/'+participant.charactername">
<img style="width:20px; height:20px" [src]="'../../../../assets/images/'+participant.race.toLowerCase()+'_xs.gif'" />
<img style="width:20px; height:20px" [src]="'../../../../assets/images/'+participant.class.toLowerCase()+'.png'" />
{{ participant.charactername }}
</a>
</div>
</nb-card-body>
</nb-card>
<ng-container *ngFor="let group of raid.participants | keyvalue">
<nb-card
class="col-12 col-md-6 col-xl-4"
*ngIf="group.value.length > 0">
<nb-card-header>{{group.key}} ({{group.value.length}})</nb-card-header>
<nb-card-body>
<div *ngFor="let participant of group.value">
<button
(click)="setBench(participant)"
*ngIf="manageRaid"
nbButton
outline
status="warning"
size="tiny">
B
</button>
<button
(click)="adminUnsign(participant)"
*ngIf="manageRaid"
nbButton
outline
status="danger"
size="tiny">
X
</button>
<a [ngStyle]="{'color': participant.color}" style="text-transform: capitalize;"
[routerLink]="'/frontcraft/character/'+participant.charactername">
<img style="width:20px; height:20px" [src]="'../../../../assets/images/'+participant.race.toLowerCase()+'_xs.gif'" />
<img style="width:20px; height:20px" [src]="'../../../../assets/images/'+participant.class.toLowerCase()+'.png'" />
{{ participant.charactername }}
</a>
</div>
</nb-card-body>
</nb-card>
</ng-container>
</div>
</nb-tab>
<nb-tab tabTitle="Items" *ngIf="isSignedup && isTier">
<shop [tier]="raid.tier" (onSelect)="itemSelect($event)"></shop>
</nb-tab>
<nb-tab tabTitle="Reserves" *ngIf="isTier">
<input type="text" nbInput [(ngModel)]="search" (change)="changeSearch()" placeholder="Search" fullWidth="true">
<nb-list>
<nb-list-item *ngFor="let item of displayedtokens | keyvalue">
<a [ngStyle]="{'color':item.value[0].quality=='Epic'?'#a335ee':'#ff8000'}"
target="_blank"
[href]="item.value[0].url">
<img style="min-width: 25px; width: 2.25vw; max-width: 50px"
[src]="'https://wow.zamimg.com/images/wow/icons/large/'+item.value[0].iconname+'.jpg'" />
&nbsp;
{{item.key}}
</a><br />
<div class="row">
<div *ngFor="let token of item.value" class="col-12 col-md-6 col-xl-4">
[ {{token.level}} ]
<span style="text-transform: capitalize;" [ngStyle]="{'color':token.level>=10?'#ff8000':token.level>=8?'#a335ee':token.level>=6?'#0070dd':token.level>=4?'#1eff00':token.level>=2?'#ffffff':'#9d9d9d'}">
{{token.charactername}}
</span><br />
</div>
</div>
</nb-list-item>
</nb-list>
</nb-tab>
<nb-tab tabTitle="Admin" *ngIf="manageRaid">
<button
(click)="startRaid(raid)"
nbButton
outline
status="success"
size="medium">
start
</button>
</nb-tab>
</nb-tabset>
</nb-card-body>
</nb-card>
</nb-tab>
<nb-tab tabTitle="Signups" [badgeText]="raid.signupcount" badgePosition="top right"
[badgeStatus]="raid.signupcount<40?'warning':'success'">
<div class="row">
<nb-card class="col-12 col-md-6" *ngIf="raid.tanks.length > 0">
<nb-card-header>Tanks ({{raid.tanks.length}})</nb-card-header>
<nb-card-body>
<div *ngFor="let participant of raid.tanks">
<button (click)="setBench(participant)" *ngIf="manageRaid" nbButton outline
status="warning" size="tiny">
B
</button>
<button (click)="adminUnsign(participant)" *ngIf="manageRaid" nbButton outline
status="danger" size="tiny">
X
</button>
<a [ngStyle]="{'color': participant.color}" style="text-transform: capitalize;"
[routerLink]="'/frontcraft/character/'+participant.charactername">
<img style="width:20px; height:20px"
[src]="'../../../../assets/images/'+participant.race.toLowerCase()+'_xs.gif'" />
<img style="width:20px; height:20px"
[src]="'../../../../assets/images/'+participant.class.toLowerCase()+'.png'" />
{{ participant.charactername }}
</a>
</div>
</nb-card-body>
</nb-card>
<nb-card class="col-12 col-md-6" *ngIf="raid.tanks.length > 0">
<nb-card-header>Healers ({{raid.healers.length}})</nb-card-header>
<nb-card-body>
<div *ngFor="let participant of raid.healers">
<button (click)="setBench(participant)" *ngIf="manageRaid" nbButton outline
status="warning" size="tiny">
B
</button>
<button (click)="adminUnsign(participant)" *ngIf="manageRaid" nbButton outline
status="danger" size="tiny">
X
</button>
<a [ngStyle]="{'color': participant.color}" style="text-transform: capitalize;"
[routerLink]="'/frontcraft/character/'+participant.charactername">
<img style="width:20px; height:20px"
[src]="'../../../../assets/images/'+participant.race.toLowerCase()+'_xs.gif'" />
<img style="width:20px; height:20px"
[src]="'../../../../assets/images/'+participant.class.toLowerCase()+'.png'" />
{{ participant.charactername }}
</a>
</div>
</nb-card-body>
</nb-card>
<ng-container *ngFor="let group of raid.participants | keyvalue">
<nb-card class="col-12 col-md-6 col-xl-4" *ngIf="group.value.length > 0">
<nb-card-header>{{group.key}} ({{group.value.length}})</nb-card-header>
<nb-card-body>
<div *ngFor="let participant of group.value">
<button (click)="setBench(participant)" *ngIf="manageRaid" nbButton outline
status="warning" size="tiny">
B
</button>
<button (click)="adminUnsign(participant)" *ngIf="manageRaid" nbButton
outline status="danger" size="tiny">
X
</button>
<a [ngStyle]="{'color': participant.color}"
style="text-transform: capitalize;"
[routerLink]="'/frontcraft/character/'+participant.charactername">
<img style="width:20px; height:20px"
[src]="'../../../../assets/images/'+participant.race.toLowerCase()+'_xs.gif'" />
<img style="width:20px; height:20px"
[src]="'../../../../assets/images/'+participant.class.toLowerCase()+'.png'" />
{{ participant.charactername }}
</a>
</div>
</nb-card-body>
</nb-card>
</ng-container>
</div>
</nb-tab>
<nb-tab tabTitle="Admin" *ngIf="manageRaid">
<button (click)="startRaid(raid)" nbButton outline status="success" size="medium">
start
</button>
</nb-tab>
</nb-tabset>
</nb-card-body>
</nb-card>
</div>
<div class="col-12 col-xl-6">
<nb-card *ngIf="isTier">
<nb-card-body>
<nb-tabset>
<nb-tab tabTitle="Reserves">
<input type="text" nbInput [(ngModel)]="search" (change)="changeSearch()" placeholder="Search"
fullWidth="true">
<nb-list>
<nb-list-item *ngFor="let item of displayedtokens | keyvalue">
<a [ngStyle]="{'color':item.value[0].quality=='Epic'?'#a335ee':'#ff8000'}"
target="_blank" [href]="item.value[0].url">
<img style="min-width: 25px; width: 2.25vw; max-width: 50px"
[src]="'https://wow.zamimg.com/images/wow/icons/large/'+item.value[0].iconname+'.jpg'" />
&nbsp;
{{item.key}}
</a><br />
<div class="row">
<div *ngFor="let token of item.value" class="col-12 col-md-6 col-xl-4">
[ {{token.level}} ]
<span style="text-transform: capitalize;"
[ngStyle]="{'color':token.level>=10?'#ff8000':token.level>=8?'#a335ee':token.level>=6?'#0070dd':token.level>=4?'#1eff00':token.level>=2?'#ffffff':'#9d9d9d'}">
{{token.charactername}}
</span><br />
</div>
</div>
</nb-list-item>
</nb-list>
</nb-tab>
<nb-tab tabTitle="Items" *ngIf="isSignedup">
<shop [tier]="raid.tier" (onSelect)="itemSelect($event)"></shop>
</nb-tab>
</nb-tabset>
</nb-card-body>
</nb-card>
</div>
</div>
@@ -1,5 +1,5 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Component, OnInit, OnDestroy } from '@angular/core';
import { ActivatedRoute, Router, NavigationStart } from '@angular/router';
import { ApiService as ApiService } from '../../services/login-api';
import { RaidData, Raid, Signup, Character, Spec, Item, SRToken } from '../../../../../../backend/Types/Types';
import { NbWindowService, NbToastrService, NbDialogService } from '@nebular/theme';
@@ -12,7 +12,7 @@ import { allItems } from '../../../../../../backend/Types/Items';
selector: 'raid',
templateUrl: './raid.component.html',
})
export class FrontcraftRaidComponent implements OnInit{
export class FrontcraftRaidComponent implements OnInit, OnDestroy{
canSignup = false
isSignedup = false
@@ -41,6 +41,7 @@ export class FrontcraftRaidComponent implements OnInit{
tokens = {}
displayedtokens = {}
search = ""
uuid
constructor(
private api: ApiService,
@@ -50,6 +51,16 @@ export class FrontcraftRaidComponent implements OnInit{
private toast: NbToastrService
){
window['r'] = this
router.events.subscribe(event => {
if (event instanceof NavigationStart) {
this.ngOnDestroy()
}
})
}
ngOnDestroy = () => {
if(this.uuid)
this.api.get('PubSub').unsubscribe(this.uuid)
}
async ngOnInit(){
@@ -60,9 +71,16 @@ export class FrontcraftRaidComponent implements OnInit{
if(signupFeature){
this.canSignup = true
}
this.refresh()
await this.refresh()
const res = await this.api.get('PubSub').subscribe(""+this.raid.id!, (data: RaidData) => {
this.display(data)
})
this.uuid = res.uuid
}
itemSelect = async(item) => {
this.dialogService.open(FrontcraftBuyTokenComponent, {
context: {
@@ -71,7 +89,7 @@ export class FrontcraftRaidComponent implements OnInit{
tier: this.raid.tier,
characterName: this.mySignup.charactername
}
}).onClose.subscribe(() => this.refresh())
})
}
signup = async () => {
@@ -84,9 +102,7 @@ export class FrontcraftRaidComponent implements OnInit{
context: {
raid: this.raid,
}
}).onClose.subscribe(()=>{
this.refresh()
});
})
}
async archiveRaid(raid:Raid){
@@ -110,7 +126,6 @@ export class FrontcraftRaidComponent implements OnInit{
id: this.mySignup.characterid,
}, this.raid)
this.toast.show('Success', 'Unsigned', { status: 'success' })
this.refresh()
}
setLate = async (value:boolean) => {
@@ -123,7 +138,6 @@ export class FrontcraftRaidComponent implements OnInit{
id: this.mySignup.characterid,
}, this.raid, value)
this.toast.show('Signup', 'Success', { status: 'success' })
this.refresh()
}
adminUnsign = async() => {
@@ -133,7 +147,6 @@ export class FrontcraftRaidComponent implements OnInit{
...this.mySignup,
id: this.mySignup.characterid,
}, this.raid)
this.refresh()
}
refresh = async () => {
@@ -143,6 +156,11 @@ export class FrontcraftRaidComponent implements OnInit{
const raiddata = await raidManager.getRaidData(<any>{
id: param
})
this.display(raiddata)
}
display = async (raiddata:RaidData) => {
this.isTier = allItems[raiddata.tier] != null
this.raid = raiddata
@@ -16,24 +16,31 @@
class="raidlist"
style="cursor: pointer;">
<div class="row">
<div class="col-2">
<img [src]="'../../../../assets/images/'+(raid.tier || 'null').toLowerCase()+'.png'" style="height: 75px" />
</div>
<img [src]="'../../../../assets/images/'+(raid.tier || 'null').toLowerCase()+'.png'"
style="object-fit: contain"
class="col-1 col-s-3" />
<div class="col-2 vcenter">
{{raid.title}}
</div>
<div class="col-2 vcenter">
<nb-icon icon="checkmark-circle"></nb-icon> {{raid.signupcount}} / {{raid.size}}<br>
</div>
<div class="col-2 vcenter">
<nb-icon icon="clock-outline"></nb-icon> {{raid.start | date : 'HH:mm'}}
</div>
<div class="col-4 vcenter">
<nb-icon icon="calendar-outline"></nb-icon> {{raid.start | date : 'EEEE MMMM d'}}
<div class="col-11 col-s-9" >
<div class="row">
<div class="col-12" style="padding-top: 5px">
<h4>
{{raid.title}}
</h4>
</div>
</div>
<div class="row" style="padding-top: 5px; padding-bottom: 5px; color:darkgray">
<div class="col-6 col-md-3">
<nb-icon icon="checkmark-circle"></nb-icon> {{raid.signupcount}} / {{raid.size}}<br>
</div>
<div class="col-6 col-md-3">
<nb-icon icon="clock-outline"></nb-icon> {{raid.start | date : 'HH:mm'}}
</div>
<div class="col-12 col-md-6">
<nb-icon icon="calendar-outline"></nb-icon> {{raid.start | date : 'EEE MMM d'}}
</div>
</div>
</div>
</div>
</nb-list-item>
@@ -10,7 +10,14 @@
background-color: #293259;
}
.vcenter {
height: 75px;
padding-top: 30px;
.raid {
height: 75px
}
.row {
margin: -0.5rem;
}
h4 {
font-weight: normal
}
@@ -1,30 +1,48 @@
import { Component, OnInit } from '@angular/core';
import { Component, OnInit, OnDestroy } from '@angular/core';
import { ApiService } from '../../services/login-api';
import { NbWindowService, NbDialogService } from '@nebular/theme';
import { FrontcraftCreateRaidsComponent } from './createraid.compontent';
import { Router, NavigationStart } from '@angular/router';
@Component({
selector: 'raids',
templateUrl: 'raids.component.html',
styleUrls: ['raids.component.scss'],
})
export class FrontcraftRaidsComponent implements OnInit{
export class FrontcraftRaidsComponent implements OnInit, OnDestroy{
manageRaid
raids = []
oldraids = []
pageSize = 10;
uuid
constructor(
private api: ApiService,
private router: Router,
private dialogService: NbDialogService
) {
this.manageRaid = this.api.get('manageRaid')
router.events.subscribe(event => {
if (event instanceof NavigationStart) {
this.ngOnDestroy()
}
})
}
ngOnInit(): void {
ngOnDestroy = () => {
console.log("boom");
if(this.uuid)
this.api.get('PubSub').unsubscribe(this.uuid)
}
async ngOnInit() {
const res = await this.api.get('PubSub').subscribe("raids", () => {
this.refresh()
})
this.uuid = res.uuid
this.refresh()
}
@@ -46,9 +64,7 @@ export class FrontcraftRaidsComponent implements OnInit{
context: {
templates: this.oldraids
}
}).onClose.subscribe(()=>{
this.refresh()
});
})
}
}
@@ -2,18 +2,69 @@
<nb-card-body>
<nb-tabset>
<nb-tab tabTitle="Info">
Smart text here
<h3>How it works</h3>
<ul>
<li>
Everyone starts out with 1 soft reserve right per raid tier (you can see them in your user profile)
</li>
<li>
The tiers are: MC+Ony, BWL, ZG, AQ20, AQ40, Naxx
</li>
<li>
You gain 1 reserve right for a raid you attend. 2 if you were benched. Rights are granted on raid start.
</li>
<li>
When you sign up to a raid you can spend your reserve rights
</li>
<li>
Every week you can re-reserve the same item to build a streak on it
</li>
<!--
<li>
Steaks are color coded. If this means anything will be decided by guild culture:
<span style="color: #ff8000">[+ 10]</span>
<span style="color: #a335ee">[9. 8]</span>
<span style="color: #0070dd">[7, 6]</span>
<span style="color: #1eff00">[5, 4]</span>
<span style="color: #ffffff">[3, 2]</span>
<span style="color: #9d9d9d">[1]</span>
</li>
-->
</ul>
<br />
<h3>Specifics about streaks</h3>
<ul>
<li>
Some classes and races get an initial boost to specific reserves. The list is on the second tab.
</li>
<li>
Switching the selected item destroys previous streaks. (Streaks must be continued without switchup)
</li>
<li>
If you have more than 1 softreserve you can reserve multiple different items. You may only continue one streak the following raid.
</li>
<li>
If you have more than 1 softreserve you can reserve the same item several times to increase its streak.
</li>
<li>
The softreserve counter, Reserves, and Streaks are tiers-specific and only count within their tier.
</li>
<li>
Canceling the signup refunds active reserves and continued streaks. Destroyed streaks cannot be recovered.
</li>
</ul>
</nb-tab>
<nb-tab tabTitle="priorities">
<nb-list>
<nb-list-item *ngFor="let item of rules | keyvalue">
<wowhead [item]="item.value[0]"></wowhead><br>
<span *ngFor="let rule of item.value" [nbPopover]="templateRef" nbPopoverTrigger="hover">
<ng-template #templateRef>
<span style="color:white">{{rule.description}}</span>
</ng-template>
<span *ngIf="rule.modifier>0">+</span>{{rule.modifier}} {{rule.race}} <span [ngStyle]="{'color':rule.color}">{{rule.specname}} {{rule.class}}</span> <br />
</span>
<div class="row" *ngFor="let rule of item.value">
<div class="col-4">
<span *ngIf="rule.modifier>0">+</span>{{rule.modifier}} {{rule.race}} <span [ngStyle]="{'color':rule.color}">{{rule.specname}} {{rule.class}}</span>
</div>
<div class="col-8" style="color:white"> ({{rule.description}})</div>
<br />
</div>
</nb-list-item>
</nb-list>
</nb-tab>