2020-02-27 21:37:10 -06:00
let createMasterFilterFrame = ( ) => {
2020-04-29 22:56:37 -05:00
let me = window . myMasterFilter = document . createElement ( "div" ) ;
me . setAttribute ( "id" , "frmMasterFilter" ) ;
me . className = "container-fluid "
window . document . getElementById ( 'app' ) . append ( me ) ;
2020-04-30 18:21:20 -05:00
2020-04-29 22:56:37 -05:00
me . innerHTML = `
2020-02-27 21:37:10 -06:00
< div id = 'datePicker' > < / d i v >
2020-04-25 14:18:07 -05:00
< div class = "dropdown" id = "grpSymbol" >
2020-04-25 20:56:09 -05:00
< button class = "btn btn-primary dropdown-toggle ddMnuBtn" type = "button" id = "ddMnuBtnSymbol" data - toggle = "dropdown" aria - haspopup = "true" aria - expanded = "false" >
2020-04-25 14:18:07 -05:00
Symbol
< / b u t t o n >
< div class = "dropdown-menu" aria - labelledby = "ddMnuBtnSymbol" id = 'lbSymbol' >
2020-04-25 21:05:36 -05:00
< a class = "dropdown-item" href = "#" > Not Yet Loaded ... < / a >
2020-04-25 14:18:07 -05:00
< / d i v >
< / d i v >
2020-02-27 21:37:10 -06:00
2020-04-25 14:18:07 -05:00
< div class = "dropdown" id = "grpTime" >
2020-04-25 20:56:09 -05:00
< button class = "btn btn-primary dropdown-toggle ddMnuBtn" type = "button" id = "ddMnuBtnTime" data - toggle = "dropdown" aria - haspopup = "true" aria - expanded = "false" >
2020-04-25 14:18:07 -05:00
Time
< / b u t t o n >
< div class = "dropdown-menu" aria - labelledby = "ddMnuBtnTime" id = 'lbTime' >
2020-04-25 21:05:36 -05:00
< a class = "dropdown-item" href = "#" > Select Date first . < / a >
2020-04-25 14:18:07 -05:00
< / d i v >
< / d i v >
< h1 id = 'tbSymbol' > SELECT SYMBOL ! < / h 1 >
2020-04-24 21:00:37 -05:00
< h2 id = 'tbUnderlyingPrice' > < / h 2 >
2020-04-25 14:18:07 -05:00
< h2 id = 'tbSelectedTime' > < / h 2 >
2020-05-08 14:10:08 -05:00
< div id = 'spinner-optionChain' class = 'spinner' >
< h1 > * < / h 1 >
2020-05-08 13:50:58 -05:00
< / d i v >
2020-05-08 14:10:08 -05:00
< div id = 'spinner-symbol' class = 'spinner' >
< h1 > * < / h 1 >
< / d i v >
< div id = 'spinner-time' class = 'spinner' >
< h1 > * < / h 1 >
< / d i v >
< div id = 'spinner-date' class = 'spinner' >
< h1 > * < / h 1 >
< / d i v >
` ;
2020-05-08 13:50:58 -05:00
2020-04-29 22:56:37 -05:00
let _filterContext = { } ; // TODO: This is bad, grown design - should be replaced with a proper object oriented structure and observer pattern.
Object . defineProperty ( me , "selectedDate" , {
get : _ => { return ( _filterContext . theDate ) ; }
} )
Object . defineProperty ( me , "selectedTime" , {
get : _ => { return ( _filterContext . selectedTime ) ; }
} )
2020-04-29 23:05:27 -05:00
Object . defineProperty ( me , "selectedSymbol" , {
get : _ => { return ( _filterContext . theSymbol ) ; }
} )
2020-04-29 22:56:37 -05:00
me . beforeShowDay = ( theDate ) => {
let isoDate = theDate . toISOString ( ) . substr ( 0 , 10 ) ;
//console.log("BeforeShow",isoDate,theDate);
let isDateFound = false ;
for ( let i = 0 ; i < _filterContext . availableDates . length ; i ++ ) {
if ( _filterContext . availableDates [ i ] . Date === theDate . toISOString ( ) . substr ( 0 , 10 ) ) {
isDateFound = true ;
break ;
} ;
}
if ( ! isDateFound ) {
return { enabled : false , tooltip : "No data" } ;
}
}
me . fetchSymbols = ( ) => {
2020-05-08 14:10:08 -05:00
$ ( "#spinner-symbol" ) . show ( ) ;
2020-04-29 22:56:37 -05:00
$ . get ( {
url : "/getSymbols"
} ) . done ( response => {
let allSymbols = response ;
console . log ( allSymbols ) ;
2020-04-30 18:21:20 -05:00
let aAllSymbols = [ ] ;
for ( let i = 0 ; i < allSymbols . length ; i ++ ) {
aAllSymbols . push ( me . toFriendlyName ( allSymbols [ i ] . Symbol ) ) ;
}
aAllSymbols = aAllSymbols . sort ( ) ;
me . refreshSymbolList ( aAllSymbols ) ;
2020-05-08 14:10:08 -05:00
$ ( "#spinner-symbol" ) . hide ( ) ;
2020-04-29 22:56:37 -05:00
} ) ;
}
me . getCurrentSymbol = ( ) => {
return ( _filterContext . theSymbol ) ;
}
me . symbolChanged = ( newSymbol ) => {
2020-09-24 20:01:33 -05:00
localStorage [ "defaults" ] = JSON . stringify ( { Symbol : newSymbol } ) ;
2020-04-30 18:21:20 -05:00
newSymbol = me . toBrokerName ( newSymbol ) ;
2020-04-29 22:56:37 -05:00
console . log ( "symbolChanged" , newSymbol ) ;
_filterContext . theSymbol = newSymbol
document . title = me . getCurrentSymbol ( ) ;
2020-04-30 18:21:20 -05:00
$ ( "#tbSymbol" ) . text ( me . toFriendlyName ( me . getCurrentSymbol ( ) ) ) ;
2020-04-29 22:56:37 -05:00
me . getAvailDatesForSymbol ( me . getCurrentSymbol ( ) ) . done ( _ => {
$ ( "#datePicker" ) . datepicker ( 'destroy' ) ;
$ ( "#datePicker" ) . datepicker ( { beforeShowDay : me . beforeShowDay } ) ;
if ( document . getElementById ( "datePicker" ) . hasHandler !== true ) { // work around multiple binding of the eventhandler - it seems that destroy doesn't remove the old handler....
$ ( "#datePicker" ) . datepicker ( ) . on ( 'changeDate' , ( e ) => {
if ( e . date !== undefined ) {
console . log ( "DatePicker changed date" , e . date ) ;
_filterContext . theDate = e . date . toISOString ( ) . substr ( 0 , 10 ) ;
me . showTimesForDay ( _filterContext . theDate ) ;
}
} ) ;
document . getElementById ( "datePicker" ) . hasHandler = true ;
}
if ( _filterContext . theDate === undefined ) {
console . log ( "no date in contest, setting date to the last in chain." ) ;
_filterContext . theDate = _filterContext . availableDates [ _filterContext . availableDates . length - 1 ] . Date ;
}
currentTZDate = new Date ( Date . parse ( _filterContext . theDate ) + new Date ( ) . getTimezoneOffset ( ) * 60000 ) ;
console . log ( "setting datepicker date to " , _filterContext . theDate , currentTZDate ) ;
$ ( "#datePicker" ) . datepicker ( 'setDate' , currentTZDate ) ;
} ) ;
}
me . timeChanged = ( newTime ) => {
2020-06-06 11:20:54 -05:00
if ( ( _filterContext . selectedTime !== newTime ) || ( _filterContext . theDateOfTime !== _filterContext . theDate ) ) {
2020-04-29 22:56:37 -05:00
_filterContext . selectedTime = newTime ;
2020-06-06 11:20:54 -05:00
_filterContext . theDateOfTime = _filterContext . theDate ;
2020-04-29 22:56:37 -05:00
$ ( "#tbSelectedTime" ) . text ( newTime ) ;
console . log ( "Time changed" , newTime ) ;
2020-04-25 20:56:09 -05:00
}
2020-04-29 22:56:37 -05:00
me . requestOptionChain ( ) ;
}
2020-04-25 20:56:09 -05:00
2020-04-29 22:56:37 -05:00
me . requestOptionChain = ( ) => {
2020-05-08 14:10:08 -05:00
$ ( "#spinner-optionChain" ) . show ( ) ;
2020-04-29 22:56:37 -05:00
$ . ajax ( {
url : "/getOptionChain?Date=" + _filterContext . theDate + "&Symbol=" + _filterContext . theSymbol + "&Time=" + _filterContext . selectedTime
} ) . done ( response => {
dta = JSON . parse ( response [ 0 ] . Data ) ;
//console.log("received",dta);
displayOptionChain ( ) ;
$ ( "#tbUnderlyingPrice" ) . text ( dta . underlyingPrice . toLocaleString ( 'en' , { minimumFractionDigits : 2 , maximumFractionDigits : 2 } ) ) ;
2020-05-08 14:10:08 -05:00
$ ( "#spinner-optionChain" ) . hide ( ) ;
2020-04-29 22:56:37 -05:00
} ) ;
}
me . showTimesForDay = ( ) => {
2020-05-08 14:10:08 -05:00
$ ( "#spinner-time" ) . show ( ) ;
2020-04-29 22:56:37 -05:00
return $ . ajax ( {
url : "/getTimes?Date=" + _filterContext . theDate + "&Symbol=" + _filterContext . theSymbol
} ) . done ( response => {
let availableTimes = response ;
//console.log(availableTimes);
let lbTime = $ ( "#lbTime" ) ;
lbTime . empty ( ) ;
allTimes = availableTimes ;
2020-06-06 11:20:54 -05:00
let presetTime = undefined ;
2020-04-29 22:56:37 -05:00
for ( let i = 0 ; i < allTimes . length ; i ++ ) {
theTime = allTimes [ i ] . Time ;
2020-06-06 11:20:54 -05:00
if ( presetTime === undefined ) { // emergency fallback, if nothing else fits fall back to first time seen.
presetTime = theTime ;
}
if ( _filterContext . selectedTime !== undefined ) { // try to stay at the same time
if ( _filterContext . selectedTime . substring ( 0 , 4 ) >= theTime . substring ( 0 , 4 ) ) {
presetTime = theTime ;
2020-04-29 22:56:37 -05:00
}
} else {
2020-06-06 11:20:54 -05:00
if ( i == 4 ) { // this is usually upon open - initializing the selected time...
2020-04-29 22:56:37 -05:00
// select the 4th time in the day... that's usually around 9:30
2020-06-06 11:20:54 -05:00
presetTime = theTime ;
2020-04-29 22:56:37 -05:00
}
2020-04-25 20:56:09 -05:00
}
2020-04-29 22:56:37 -05:00
//lbTime.append($(`<option ${selectedFlag}>${theTime}</option>`))
lbTime . append ( $ ( ` <button onclick="myMasterFilter.timeChanged(' ${ theTime } ');" class="dropdown-item" type="button"> ${ theTime . substring ( 0 , 5 ) } </button> ` ) )
2020-04-25 20:56:09 -05:00
}
2020-06-06 11:20:54 -05:00
me . timeChanged ( presetTime ) ;
2020-04-29 22:56:37 -05:00
$ ( "#lbTime" ) . change ( ) ;
2020-05-08 14:10:08 -05:00
$ ( "#spinner-time" ) . hide ( ) ;
2020-04-29 22:56:37 -05:00
} ) ;
}
me . getAvailDatesForSymbol = ( theSymbol ) => {
2020-05-08 14:10:08 -05:00
$ ( "#spinner-date" ) . show ( ) ;
2020-04-29 22:56:37 -05:00
return $ . ajax ( {
url : "/getDates?Symbol=" + theSymbol
} ) . done ( response => {
let availableDates = response ;
//console.log(availableDates);
_filterContext . availableDates = availableDates ;
2020-05-08 14:10:08 -05:00
$ ( "#spinner-date" ) . hide ( ) ;
2020-04-29 22:56:37 -05:00
} ) ;
}
2020-04-30 18:21:20 -05:00
2020-06-10 14:29:15 -05:00
me . toFriendlyName = ( symbol ) => { // not really required anymore because I replace the name on DB now.
2020-04-30 18:21:20 -05:00
let symbolDisplayName = symbol ;
2020-06-10 14:29:15 -05:00
/ * i f ( s y m b o l D i s p l a y N a m e = = = " $ X S P . X " ) {
2020-04-30 18:21:20 -05:00
symbolDisplayName = "XSP" ;
2020-06-10 14:29:15 -05:00
} * /
2020-04-30 18:21:20 -05:00
return ( symbolDisplayName ) ;
}
2020-06-10 14:29:15 -05:00
me . toBrokerName = ( symbol ) => { // not really required anymore because I replace the name on DB now.
2020-04-30 18:21:20 -05:00
let symbolBrokerName = symbol ;
2020-06-10 14:29:15 -05:00
/ * i f ( s y m b o l B r o k e r N a m e = = = " X S P " ) {
2020-04-30 18:21:20 -05:00
symbolBrokerName = "$XSP.X" ;
2020-06-10 14:29:15 -05:00
} * /
2020-04-30 18:21:20 -05:00
return ( symbolBrokerName ) ;
}
2020-04-29 22:56:37 -05:00
me . refreshSymbolList = ( allSymbols ) => {
let lbSymbol = $ ( "#lbSymbol" ) ;
lbSymbol . empty ( ) ;
for ( let i = 0 ; i < allSymbols . length ; i ++ ) {
2020-04-30 18:21:20 -05:00
theSymbol = allSymbols [ i ] ;
2020-04-29 22:56:37 -05:00
console . log ( theSymbol ) ;
2020-04-30 18:21:20 -05:00
let symbolDisplayName = me . toFriendlyName ( theSymbol ) ;
lbSymbol . append ( $ ( ` <button onclick="myMasterFilter.symbolChanged(' ${ theSymbol } ');" class="dropdown-item" type="button"> ${ symbolDisplayName } </button> ` ) )
2020-04-29 22:56:37 -05:00
}
}
2020-04-25 14:18:07 -05:00
2020-04-29 22:56:37 -05:00
me . fetchSymbols ( ) ;
return true ;
2020-04-24 00:58:12 -05:00
}