2018-04-10 21:13:34 -04:00
< template lang = "html" >
< div class = "ffz--experiments tw-pd-t-05" >
2018-04-11 17:05:31 -04:00
< div class = "tw-pd-b-1 tw-mg-b-1 tw-border-b" >
2018-04-28 17:56:03 -04:00
{ { t ( 'setting.experiments.about' , 'This feature allows you to override experiment values. Please note that, for most experiments, you may have to refresh the page for your changes to take effect.' ) } }
2018-04-10 21:13:34 -04:00
< / div >
2018-04-11 17:05:31 -04:00
< div class = "tw-mg-b-2 tw-flex tw-align-items-center" >
< div class = "tw-flex-grow-1" >
2018-04-28 17:56:03 -04:00
{ { t ( 'setting.experiments.unique-id' , 'Unique ID: %{id}' , { id : unique _id } ) } }
2018-04-11 17:05:31 -04:00
< / div >
< select
ref = "sort_select"
2018-06-29 19:45:33 -04:00
class = "tw-border-radius-medium tw-font-size-6 tw-select tw-pd-l-1 tw-pd-r-3 tw-pd-y-05 tw-mg-x-05"
2018-04-11 17:05:31 -04:00
@ change = "onSort"
>
2018-04-28 17:56:03 -04:00
< option : selected = "sort_by === 0" > { { t ( 'setting.experiments.sort-name' , 'Sort By: Name' ) } } < / option >
< option : selected = "sort_by === 1" > { { t ( 'setting.experiments.sort-rarity' , 'Sort By: Rarity' ) } } < / option >
2018-04-11 17:05:31 -04:00
< / select >
< / div >
2018-04-10 21:13:34 -04:00
< h3 class = "tw-mg-b-1" >
2018-04-28 17:56:03 -04:00
{ { t ( 'setting.experiments.ffz' , 'FrankerFaceZ Experiments' ) } }
2018-04-10 21:13:34 -04:00
< / h3 >
< div class = "ffz--experiment-list" >
< section
v - for = "({key, exp}) of sorted(ffz_data)"
: key = "key"
: data - key = "key"
>
< div class = "tw-elevation-1 tw-c-background tw-border tw-pd-y-05 tw-pd-x-1 tw-mg-y-05 tw-flex tw-flex-nowrap" >
< div class = "tw-flex-grow-1" >
< h4 > { { exp . name } } < / h4 >
< div v-if = "exp.description" class="description" >
{ { exp . description } }
< / div >
< / div >
< div class = "tw-flex tw-flex-shrink-0 tw-align-items-start" >
< select
: data - key = "key"
2018-06-29 19:45:33 -04:00
class = "tw-border-radius-medium tw-font-size-6 tw-select tw-pd-l-1 tw-pd-r-3 tw-pd-y-05 tw-mg-x-05"
2018-04-10 21:13:34 -04:00
@ change = "onChange($event)"
>
< option
v - for = "(i, idx) in exp.groups"
: key = "idx"
: selected = "i.value === exp.value"
>
2018-04-28 17:56:03 -04:00
{ { t ( 'setting.experiments.entry' , '%{value} (weight: %{weight})' , i ) } }
2018-04-10 21:13:34 -04:00
< / option >
< / select >
< button
: disabled = "exp.default"
: class = "{'tw-button--disabled': exp.default}"
class = "tw-mg-t-05 tw-button tw-button--text tw-tooltip-wrapper"
@ click = "reset(key)"
>
< span class = "tw-button__text ffz-i-cancel" / >
< span class = "tw-tooltip tw-tooltip--down tw-tooltip--align-right" >
{ { t ( 'setting.reset' , 'Reset to Default' ) } }
< / span >
< / button >
< / div >
< / div >
< / section >
< div v-if = "! Object.keys(ffz_data).length" >
2018-04-28 17:56:03 -04:00
{ { t ( 'setting.experiments.none' , 'There are no current experiments.' ) } }
2018-04-10 21:13:34 -04:00
< / div >
< / div >
< h3 class = "tw-mg-t-5 tw-mg-b-1" >
2018-04-28 17:56:03 -04:00
{ { t ( 'setting.experiments.twitch' , 'Twitch Experiments' ) } }
2018-04-10 21:13:34 -04:00
< / h3 >
< div class = "ffz--experiment-list" >
< section
v - for = "({key, exp}) of sorted(twitch_data)"
: key = "key"
: data - key = "key"
>
< div
: class = "{live: exp.in_use}"
class = "ffz--experiment-row tw-elevation-1 tw-c-background tw-border tw-pd-y-05 tw-pd-x-1 tw-mg-y-05 tw-flex"
>
< div class = "tw-flex tw-flex-shrink-0 tw-align-items-center tw-border-r tw-mg-r-1 tw-pd-r-1" >
< div v-if = "exp.in_use" class="ffz--profile__icon ffz-i-ok tw-tooltip-wrapper" >
< div class = "tw-tooltip tw-tooltip--down tw-tooltip--align-left" >
{ { t ( 'setting.experiments.active' , 'This experiment is active.' ) } }
< / div >
< / div >
< div v -else class = "ffz--profile__icon ffz-i-cancel tw-tooltip-wrapper" >
< div class = "tw-tooltip tw-tooltip--down tw-tooltip--align-left" >
{ { t ( 'setting.experiments.inactive' , 'This experiment is not active.' ) } }
< / div >
< / div >
< / div >
< div class = "tw-flex-grow-1" >
< h4 > { { exp . name } } < / h4 >
< div class = "description" >
{ { exp . remainder } }
< / div >
< / div >
< div class = "tw-flex tw-flex-shrink-0 tw-align-items-start" >
< select
: data - key = "key"
2018-06-29 19:45:33 -04:00
class = "tw-border-radius-medium tw-font-size-6 tw-select tw-pd-l-1 tw-pd-r-3 tw-pd-y-05 tw-mg-x-05"
2018-04-10 21:13:34 -04:00
@ change = "onTwitchChange($event)"
>
2018-04-11 17:05:31 -04:00
< option
v - if = "exp.in_use === false"
: selected = "exp.default"
>
2018-04-28 17:56:03 -04:00
{ { t ( 'setting.experiments.unset' , 'unset' ) } }
2018-04-11 17:05:31 -04:00
< / option >
2018-04-10 21:13:34 -04:00
< option
v - for = "(i, idx) in exp.groups"
: key = "idx"
: selected = "i.value === exp.value"
>
{ { i . value } } ( weight : { { i . weight } } )
< / option >
< / select >
< button
: disabled = "exp.default"
: class = "{'tw-button--disabled': exp.default}"
class = "tw-mg-t-05 tw-button tw-button--text tw-tooltip-wrapper"
@ click = "resetTwitch(key)"
>
< span class = "tw-button__text ffz-i-cancel" / >
< span class = "tw-tooltip tw-tooltip--down tw-tooltip--align-right" >
{ { t ( 'setting.reset' , 'Reset to Default' ) } }
< / span >
< / button >
< / div >
< / div >
< / section >
< div v-if = "! Object.keys(twitch_data).length" >
2018-04-28 17:56:03 -04:00
{ { t ( 'setting.experiments.none' , 'There are no current experiments.' ) } }
2018-04-10 21:13:34 -04:00
< / div >
< / div >
< / div >
< / template >
< script >
import { has } from 'utilities/object' ;
export default {
props : [ 'item' ] ,
data ( ) {
return {
2018-04-11 17:05:31 -04:00
sort _by : 1 ,
unique _id : this . item . unique _id ( ) ,
2018-04-10 21:13:34 -04:00
ffz _data : this . item . ffz _data ( ) ,
twitch _data : this . item . twitch _data ( )
}
} ,
created ( ) {
for ( const key in this . ffz _data )
if ( has ( this . ffz _data , key ) ) {
const exp = this . ffz _data [ key ] ;
this . $set ( exp , 'value' , this . item . getAssignment ( key ) ) ;
this . $set ( exp , 'default' , ! this . item . hasOverride ( key ) ) ;
2018-04-11 17:05:31 -04:00
exp . total = exp . groups . reduce ( ( a , b ) => a + b . weight , 0 ) ;
this . calculateRarity ( exp ) ;
2018-04-10 21:13:34 -04:00
}
for ( const key in this . twitch _data )
if ( has ( this . twitch _data , key ) ) {
const exp = this . twitch _data [ key ] ;
this . $set ( exp , 'value' , this . item . getTwitchAssignment ( key ) ) ;
this . $set ( exp , 'default' , ! this . item . hasTwitchOverride ( key ) ) ;
exp . in _use = this . item . usingTwitchExperiment ( key ) ;
exp . remainder = ` v: ${ exp . v } , t: ${ exp . t } ` ;
2018-04-11 17:05:31 -04:00
exp . total = exp . groups . reduce ( ( a , b ) => a + b . weight , 0 ) ;
this . calculateRarity ( exp ) ;
2018-04-10 21:13:34 -04:00
}
this . item . on ( ':changed' , this . valueChanged , this ) ;
this . item . on ( ':twitch-changed' , this . twitchValueChanged , this ) ;
} ,
beforeDestroy ( ) {
this . item . off ( ':changed' , this . valueChanged , this ) ;
this . item . off ( ':twitch-changed' , this . twitchValueChanged , this ) ;
} ,
methods : {
2018-04-11 17:05:31 -04:00
calculateRarity ( exp ) {
let rarity ;
for ( const group of exp . groups )
if ( group . value === exp . value ) {
rarity = group . weight / exp . total ;
break ;
}
this . $set ( exp , 'rarity' , rarity ) ;
} ,
2018-04-10 21:13:34 -04:00
sorted ( data ) {
const out = Object . entries ( data ) . map ( x => ( { key : x [ 0 ] , exp : x [ 1 ] } ) ) ;
out . sort ( ( a , b ) => {
const a _use = a . exp . in _use ,
b _use = b . exp . in _use ;
if ( a _use && ! b _use ) return - 1 ;
if ( ! a _use && b _use ) return 1 ;
2018-04-11 17:05:31 -04:00
if ( this . sort _by === 1 ) {
const a _r = a . exp . rarity ,
b _r = b . exp . rarity ;
if ( a _r < b _r ) return - 1 ;
if ( a _r > b _r ) return 1 ;
}
2018-04-10 21:13:34 -04:00
const a _n = a . exp . name . toLowerCase ( ) ,
b _n = b . exp . name . toLowerCase ( ) ;
if ( a _n < b _n ) return - 1 ;
if ( a _n > b _n ) return 1 ;
2018-04-11 17:05:31 -04:00
2018-04-10 21:13:34 -04:00
return 0 ;
} ) ;
return out ;
} ,
reset ( key ) {
this . item . deleteOverride ( key ) ;
const exp = this . ffz _data [ key ] ;
if ( exp )
exp . default = ! this . item . hasOverride ( key ) ;
} ,
resetTwitch ( key ) {
this . item . deleteTwitchOverride ( key ) ;
const exp = this . twitch _data [ key ] ;
if ( exp )
exp . default = ! this . item . hasTwitchOverride ( key ) ;
} ,
2018-04-11 17:05:31 -04:00
onSort ( ) {
this . sort _by = this . $refs . sort _select . selectedIndex ;
} ,
2018-04-10 21:13:34 -04:00
onChange ( event ) {
const el = event . target ,
idx = el . selectedIndex ,
key = el . dataset . key ;
const exp = this . ffz _data [ key ] ,
groups = exp && exp . groups ,
entry = groups && groups [ idx ] ;
if ( entry )
this . item . setOverride ( key , entry . value ) ;
} ,
onTwitchChange ( event ) {
const el = event . target ,
idx = el . selectedIndex ,
key = el . dataset . key ;
const exp = this . twitch _data [ key ] ,
2018-04-11 17:05:31 -04:00
offset = exp . in _use ? 0 : 1 ,
2018-04-10 21:13:34 -04:00
groups = exp && exp . groups ,
2018-04-11 17:05:31 -04:00
entry = groups && groups [ idx - offset ] ;
2018-04-10 21:13:34 -04:00
if ( entry )
this . item . setTwitchOverride ( key , entry . value ) ;
} ,
valueChanged ( key , value ) {
const exp = this . ffz _data [ key ] ;
if ( exp ) {
exp . value = value ;
exp . default = ! this . item . hasOverride ( key ) ;
2018-04-11 17:05:31 -04:00
this . calculateRarity ( exp ) ;
2018-04-10 21:13:34 -04:00
}
} ,
twitchValueChanged ( key , value ) {
const exp = this . twitch _data [ key ] ;
if ( exp ) {
exp . value = value ;
exp . default = ! this . item . hasTwitchOverride ( key ) ;
2018-04-11 17:05:31 -04:00
this . calculateRarity ( exp ) ;
2018-04-10 21:13:34 -04:00
}
}
}
}
< / script >