@@ -2,131 +2,90 @@ import '@fontsource/jost';
22import loadData from "./loadData" ;
33import { groupBy } from "./ArrayUtils" ;
44import { Category , Item } from './Models'
5- import { appendChild , createElement } from "./HtmlUtils" ;
5+ import { as } from "./HtmlUtils" ;
66import { combineLatest , concat , fromEvent , map , Observable , of , tap } from "rxjs" ;
7- import { add , asCrates , calculateItemQueueCost , Cost , ZERO_COST } from "./Cost" ;
8- import { getSavedSelectedItemName , setSavedSelectedItemName } from "./LocalStorage" ;
7+ import { add , asCrates , calculateItemQueueCost , Cost } from "./Cost" ;
8+ import { getPlayerFaction , getSavedSelectedItemName , setSavedSelectedItemName } from "./LocalStorage" ;
99
10- const items = loadData ( ) . filter ( value => value . faction . indexOf ( "colonial" ) > 0 )
10+ const items = loadData ( )
1111
1212const itemsByCategory = groupBy ( items , item => item . itemCategory )
1313
14- const costObservables : Record < Category , Observable < Cost > | undefined > = {
15- heavy_ammunition : undefined ,
16- heavy_arms : undefined ,
17- shipables : undefined ,
18- small_arms : undefined ,
19- supplies : undefined ,
20- uniforms : undefined ,
21- vehicles : undefined
22- }
23-
24- const mpfSelectionTable = document . getElementById ( "mpf-selection" )
25-
26- const headRow = mpfSelectionTable . getElementsByTagName ( "tr" ) . item ( 0 )
27-
28- for ( const costKey in ZERO_COST ) {
29- appendChild ( headRow , "th" , ( th ) => {
30- th . innerText = costKey
31- } )
32- }
14+ const costObservables = new Map < Category , Observable < Cost > > ( )
3315
34- for ( const [ category , items ] of Object . entries ( itemsByCategory ) ) {
35- const selectedItemName = getSavedSelectedItemName ( category as Category )
36-
37- appendChild ( mpfSelectionTable , "tr" , tr => {
38- appendChild ( tr , "td" , ( td ) => {
39- td . innerText = capitalize ( category )
40- } )
16+ Array . from ( document . getElementsByClassName ( "queue-select" ) )
17+ . map ( select => select as HTMLSelectElement )
18+ . map ( select => {
19+ const category : Category = select . getAttribute ( "data-category" ) as Category
4120
42- appendChild ( tr , "td" , ( td ) => {
43- appendChild ( td , "select" , ( select ) => {
44- let option = makeOption ( "" ) ;
45- option . selected = selectedItemName === ""
21+ const selectedItemName = getSavedSelectedItemName ( category )
4622
47- select . append ( option )
48- items . sort ( ( a , b ) => a . itemName > b . itemName ? 1 : - 1 ) . forEach ( item => {
49- let option = makeOption ( item . itemName ) ;
50- option . selected = selectedItemName === item . itemName
23+ Array . from ( select . children )
24+ . map ( option => option as HTMLOptionElement )
25+ . forEach ( option => {
26+ option . selected = option . value === selectedItemName
27+ } )
5128
52- select . append ( option )
53- } )
29+ costObservables [ category ] = concat (
30+ of ( calculateItemQueueCost ( getItem ( category , getSavedSelectedItemName ( category as Category ) ) ) ) ,
31+ fromEvent ( select , "change" )
32+ . pipe ( tap ( ( ) => setSavedSelectedItemName ( category as Category , select . value ) ) )
33+ . pipe ( map ( ( ) => getItem ( category , select . value ) ) )
34+ . pipe ( map ( ( item ) => calculateItemQueueCost ( item ) ) ) )
35+ } )
5436
55- costObservables [ category ] = concat (
56- of ( calculateItemQueueCost ( getItem ( category , getSavedSelectedItemName ( category as Category ) ) ) ) ,
57- fromEvent ( select , "change" )
58- . pipe ( tap ( ( ) => setSavedSelectedItemName ( category as Category , select . value ) ) )
59- . pipe ( map ( ( ) => getItem ( category , select . value ) ) )
60- . pipe ( map ( ( item ) => calculateItemQueueCost ( item ) ) ) )
37+ Array . from ( document . getElementsByClassName ( "cost-cell" ) )
38+ . map ( td => td as HTMLTableCellElement )
39+ . forEach ( td => {
40+ const category = td . getAttribute ( "data-category" )
41+ const resource = td . getAttribute ( "data-resource" )
6142
62- } )
43+ costObservables [ category ] . subscribe ( cost => {
44+ td . innerText = cost [ resource ]
6345 } )
64-
65- for ( const costKey in ZERO_COST ) {
66- appendChild ( tr , "td" , ( td ) => {
67- td . id = `${ category } -cost-${ costKey } `
68- td . innerText = "0"
69-
70- costObservables [ category ] . subscribe ( cost => {
71- td . innerText = cost [ costKey ] . toString ( )
72- } )
73- } )
74- }
7546 } )
76- }
7747
7848const totalCostObservable = combineLatest ( Object . values ( costObservables ) as Observable < Cost > [ ] )
7949 . pipe ( map ( value => value . reduce ( ( acc , curr ) => add ( acc , curr ) ) ) )
8050
8151const totalCrateCostObservable = totalCostObservable . pipe ( map ( asCrates ) )
8252
83- appendChild ( mpfSelectionTable , "tr" , tr => {
84- appendChild ( tr , "td" )
85- appendChild ( tr , "td" , td => {
86- td . innerText = "Total"
53+ Array . from ( document . getElementsByClassName ( "total-cost-cell" ) )
54+ . map ( td => td as HTMLTableCellElement )
55+ . forEach ( td => {
56+ const resource = td . getAttribute ( "data-resource" )
57+
58+ totalCostObservable . subscribe ( cost => {
59+ td . innerText = cost [ resource ]
60+ } )
8761 } )
88- for ( const costKey in ZERO_COST ) {
89- appendChild ( tr , "td" , ( td ) => {
90- td . id = `total-cost-${ costKey } `
91- td . innerText = "0"
9262
93- totalCostObservable . subscribe ( totalCost => {
94- td . innerText = totalCost [ costKey ]
95- } )
63+ Array . from ( document . getElementsByClassName ( "total-crate-cell" ) )
64+ . map ( td => td as HTMLTableCellElement )
65+ . forEach ( td => {
66+ const resource = td . getAttribute ( "data-resource" )
9667
68+ totalCrateCostObservable . subscribe ( cost => {
69+ td . innerText = cost [ resource ]
9770 } )
98- }
99- } )
100-
101- appendChild ( mpfSelectionTable , "tr" , tr => {
102- appendChild ( tr , "td" )
103- appendChild ( tr , "td" , td => {
104- td . innerText = "Crates"
10571 } )
106- for ( const costKey in ZERO_COST ) {
107- appendChild ( tr , "td" , ( td ) => {
108- td . id = `total-cost-crates-${ costKey } `
109- td . innerText = "0"
11072
111- totalCrateCostObservable . subscribe ( totalCost => {
112- td . innerText = totalCost [ costKey ]
113- } )
114- } )
115- }
73+ const playerFaction = getPlayerFaction ( )
74+
75+ Array . from ( document . getElementsByClassName ( "item-option" ) ) . map ( as < HTMLOptionElement > ) . forEach ( option => {
76+ const factions = option . dataset [ "faction" ] . split ( "," ) . map ( faction => faction . trim ( ) )
77+
78+ option . hidden = ! factions . includes ( playerFaction )
11679} )
11780
11881function getItem ( category : string , itemName : string ) : Item | undefined {
82+ if ( itemName === "" ) return undefined
83+
11984 const items = itemsByCategory [ category ] as Item [ ]
120- return items . find ( item => item . itemName === itemName )
121- }
85+ const item = items . find ( item => item . itemName === itemName ) ;
12286
123- function makeOption ( label : string ) {
124- return createElement ( "option" , ( option ) => {
125- option . label = label
126- option . value = label
127- } )
87+ if ( item == undefined ) {
88+ console . warn ( `No item named ${ itemName } found in category ${ category } ` )
89+ }
90+ return item
12891}
129-
130- function capitalize ( value : string ) : string {
131- return value . split ( "_" ) . map ( ( it ) => it . charAt ( 0 ) . toUpperCase ( ) + it . substring ( 1 ) ) . join ( " " )
132- }
0 commit comments