Browse Source

WIP refactor to handle multiple sets

master
Dan 2 years ago
parent
commit
632790992f
  1. 5
      src/app/app.component.ts
  2. 6
      src/app/components/top-bar/top-bar.component.html
  3. 20
      src/app/models/card.model.ts
  4. 34
      src/app/models/setInfo.model.ts
  5. 71
      src/app/services/card.service.ts
  6. 11
      src/app/services/googleSheets.service.ts
  7. 27
      src/app/services/set.service.ts
  8. 46
      src/assets/sets.json

5
src/app/app.component.ts

@ -12,6 +12,7 @@ import { CardInfo } from './models/card.model';
import { CardDisplayComponent } from "./components/card-display/card-display.component";
import { MatTabsModule } from '@angular/material/tabs';
import { SetService } from './services/set.service';
@Component({
selector: 'app-root',
@ -25,6 +26,7 @@ export class AppComponent {
constructor(
private sheets: googleSheetService,
private setService: SetService,
private httpClient: HttpClient,
@Inject(DOCUMENT) private document: Document
)
@ -42,7 +44,7 @@ export class AppComponent {
this.windowScrolled = window.scrollY !== 0;
});
this.httpClient.get<Array<SetInfo>>("assets/sets.json").subscribe(data => {
this.setService.loadSetInfo("assets/sets.json").subscribe(data => {
this.sets = data;
if(this.sets != undefined)
@ -50,6 +52,7 @@ export class AppComponent {
this.selectedSet = this.sets[0]
this.sheets.getSet(this.sets[0]).subscribe( values => {
let bob = values as any;
this.selectedSet.total = bob.values.length;
this.cards = this.convertToCardInfo(this.selectedSet, bob.values as Array<Object>);
})
}

6
src/app/components/top-bar/top-bar.component.html

@ -2,12 +2,12 @@
@if(sets)
{
<mat-form-field>
<mat-select [(value)]="selected">
<mat-select [(value)]="selected.name">
@for(set of sets; track set) {
<mat-option value="{{set.name}}">{{set.name}}</mat-option>
<mat-option value="{{set}}">{{set.name}}</mat-option>
}
</mat-select>
</mat-form-field>
</mat-form-field>
}
<span class="spacer"></span>
<button mat-icon-button [matMenuTriggerFor]="menu" aria-label="Example icon-button with a menu">

20
src/app/models/card.model.ts

@ -1,11 +1,11 @@
export interface CardInfo {
setCode: string;
setNumber: number;
hyperspaceSetNumber: number;
standardQuantity: number;
foilQuantity: number;
hyperspaceQuantity: number;
hyperspaceFoilQuantity: number;
isLeader: boolean;
isBase: boolean;
export class CardInfo {
setCode!: string;
setNumber!: number;
hyperspaceSetNumber: number = -1;
standardQuantity!: number;
foilQuantity!: number;
hyperspaceQuantity!: number;
hyperspaceFoilQuantity!: number;
isLeader!: boolean;
isBase!: boolean;
}

34
src/app/models/setInfo.model.ts

@ -1,10 +1,26 @@
export interface SetInfo {
name: string;
code: string;
total: number;
leaders: number;
bases: number;
showcaseStart: number,
numShowcase: number,
noHypers: Array<number>;
export class SetInfo {
name!: string;
code!: string;
total!: number;
leaders!: number;
bases!: number;
showcaseStart!: number;
numShowcase!: number;
noHypers!: Array<number>;
sheetName!: string;
sheetRange!: Array<string>;
typesColumn!: string;
isPromo!: boolean;
getQueryRange() : string
{
return this.sheetRange[0] + ':' + this.sheetName[1];
}
getQueryRangeIncTypes() : string
{
let bottom_right = this.typesColumn + this.sheetRange[1].slice(1);
return this.sheetRange[0] + ':' + bottom_right;
}
}

71
src/app/services/card.service.ts

@ -0,0 +1,71 @@
import { Injectable } from '@angular/core';
import { SetInfo } from '../models/setInfo.model';
import { CardInfo } from '../models/card.model';
@Injectable({
providedIn: 'root',
})
export class CardService {
convertToCardInfo(set: SetInfo, data : Array<Object>) : Array<CardInfo> {
let cards = new Array<CardInfo>;
let hypercount = 0;
for (let index in data)
{
let item = data[index] as Array<Object>
let info = {} as CardInfo;
if(set.isPromo)
{
info = this.convertPromoCard(set, item, hypercount);
if(info.hyperspaceSetNumber != -1)
{
hypercount = hypercount + 1;
}
}
else
{
info = this.convertStandardCard(set, item, hypercount);
}
cards.push(info);
}
return cards;
}
convertStandardCard(set: SetInfo, data : Array<Object>, hypercount: number) : CardInfo {
let info = {} as CardInfo;
info.setNumber = parseInt(data[0].toString());
if(set.noHypers.includes(info.setNumber) == false)
{
info.hyperspaceSetNumber = set.total + hypercount + 1;
}
// The types are included in the last cell.
let typesString = data[data.length-1] as string;
let types = typesString.split(/\s*,\s*/);
info.setCode = set.code;
info.isLeader = "Leader" in types;
info.isBase = "Base" in types;
info.standardQuantity = data[1] ? parseInt(data[1].toString()) : 0;
info.foilQuantity = data[2] ? parseInt(data[2].toString()) as number : 0;
info.hyperspaceQuantity = data[3] ? parseInt(data[3].toString()) as number : 0;
info.hyperspaceFoilQuantity = data[4] ? parseInt(data[4].toString()) as number : 0;
return info;
}
convertPromoCard(set: SetInfo, data : Array<Object>, hypercount: number) : CardInfo {
let info = {} as CardInfo;
info.setNumber = parseInt(data[0].toString());
return info;
}
}

11
src/app/services/googleSheets.service.ts

@ -10,23 +10,16 @@ export class googleSheetService {
private apiKey = 'AIzaSyDvrmj8CBbOI3V5ySyd-kor2zp-FEFuzmE';
private spreadsheetId = '1nPfXMqYkDJonpDUoZgSXkVpH_qtdl_EWeci1H4N-GTk';
private range = 'SoRQuery!A1:B2';
private baseUrl = `https://sheets.googleapis.com/v4/spreadsheets/${this.spreadsheetId}/values/`;
private startOffset = 4;
constructor(
private http: HttpClient
) {}
get()
{
const url = `${this.baseUrl}${this.range}?key=${this.apiKey}`;
return this.http.get(url);
}
getSet(setToFetch: SetInfo)
{
const url = `${this.baseUrl}${setToFetch.name}!A${this.startOffset}:E${this.startOffset+setToFetch.total}?key=${this.apiKey}`;
let bottom_right = setToFetch.typesColumn + setToFetch.sheetRange[1].slice(1);
const url = `${this.baseUrl}${setToFetch.sheetName}!${setToFetch.sheetRange[0]}:${bottom_right}?key=${this.apiKey}`;
return this.http.get(url);
}
}

27
src/app/services/set.service.ts

@ -0,0 +1,27 @@
import { Injectable } from '@angular/core';
import { SetInfo } from '../models/setInfo.model';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class SetService {
sets!: Array<SetInfo>;
selectedSet!: SetInfo;
constructor(
private httpClient: HttpClient
)
{}
loadSetInfo(path: string) : Observable<Array<SetInfo>>
{
let ret = this.httpClient.get<Array<SetInfo>>(path);
ret.subscribe( data => {
this.sets = data;
})
return ret;
}
}

46
src/assets/sets.json

@ -1,6 +1,10 @@
[
{
"name": "Spark of Rebellion",
"sheetName": "Spark of Rebellion",
"sheetRange": ["A4", "E271"],
"typesColumn" : "Q",
"isPromo": false,
"code": "SOR",
"total": 268,
"leaders": 18,
@ -8,5 +12,47 @@
"showcaseStart": 253,
"numShowcase": 18,
"noHypers" : [5, 10, 238, 236, 189, 53, 226, 84, 136, 233]
},
{
"name": "Event Exclusive",
"sheetName": "Promo Cards",
"sheetRange": ["A4", "D5"],
"typesColumn" : "N",
"isPromo": true,
"code": "SOR",
"total": 2,
"leaders": 2,
"bases": 0,
"showcaseStart": -1,
"numShowcase": 0,
"noHypers" : [1,2]
},
{
"name": "Pre-Release Set 1",
"sheetName": "Promo Cards",
"sheetRange": ["A6", "D7"],
"typesColumn" : "N",
"isPromo": true,
"code": "SOR",
"total": 2,
"leaders": 2,
"bases": 0,
"showcaseStart": -1,
"numShowcase": 0,
"noHypers" : [1,2]
},
{
"name": "OP Promo Set 1",
"sheetName": "Promo Cards",
"sheetRange": ["A11", "D32"],
"typesColumn" : "N",
"isPromo": true,
"code": "SOR",
"total": 2,
"leaders": 2,
"bases": 0,
"showcaseStart": -1,
"numShowcase": 0,
"noHypers" : [1,2]
}
]

Loading…
Cancel
Save