Created
June 3, 2025 02:43
-
-
Save AmitHedgeloop/ae730a940d87d5bcdc77e04d427b96d5 to your computer and use it in GitHub Desktop.
meteor.js documets
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<template name="dailyForecast"> | |
<div class="main-section crt-trd-sec inherit-prop"> | |
<div class="main-container"> | |
<div class="row crt-trd-frm-blc"> | |
<div class="sidebar col-sm-3"> | |
<div> | |
{{> sidebar}} | |
</div> | |
</div> | |
<div class="sidebar-wrapper-fluid col-sm-9"> | |
<div> | |
<div class="col-md-9"> | |
<div class="trd-field search menu"> | |
{{> tabular table=TabularTables.stocks class="table table-striped table-bordered table-condensed" id="df"}} | |
</div> | |
</div> | |
<div class="col-md-3"> | |
<h3 class="m-t-10">Filter By</h3> | |
<label class="checkbox-button m-t-10"> | |
<input type="checkbox" name="stockListItem" id="pnl"> P&L | |
</label> | |
<label class="checkbox-button m-t-10"> | |
<input type="checkbox" name="stockListItem" id="prob"> Probability | |
</label> | |
<button class="create m-t-10" id="getForecast">Forecast</button> | |
</div> | |
</div> | |
</div> | |
<!-- <div class="heatmap-container clearfix"> | |
<h2>Market Heatmap Today</h2> | |
<div class="heatmap-buy heatmap-box p-20" title="Buy count"> | |
{{heatmap.buyCount}} | |
</div> | |
<div class="heatmap-sell heatmap-box p-20" title="Sell count"> | |
{{heatmap.sellCount}} | |
</div> | |
</div> --> | |
{{#if canSeeLabels}} | |
<div class="row"> | |
<button class="create m-t-10" style="float:right" id="delete"><i class="glyphicon glyphicon-trash"></i> Delete Forecast(s)</button> | |
</div> | |
{{#each transactions}} | |
<div class="col-md-12" style="padding-top:8px;"> | |
<div style="font-weight: bold;font-size: 18px;margin-bottom: 10px;"> | |
{{formatDate createdAt "DD-MM-YYYY HH:mm:ss" "DD MMM YYYY"}} | |
<!--"DD-MM-YYYY HH:mm:ss" "DD MMM YYYY"--> | |
</div> | |
<table class="table table-bordered table-responsive hidden-xs forecast-table"> | |
<thead> | |
<tr> | |
<td> | |
<input type="checkbox" id="{{_id}}" name="{{createdAt}}" class="deleteAll" value=""> | |
</td> | |
<td>Stock</td> | |
<td>P&L</td> | |
<td>Action by P&L</td> | |
<td>Probability</td> | |
<td>Action by Probability</td> | |
</tr> | |
</thead> | |
<tbody> | |
{{#each output}} | |
<tr> | |
<td> | |
<input type="checkbox" checked={{isSelected _id}} id={{_id}} name="{{../createdAt }}" class="delfore" value="{{name}}"> | |
</td> | |
<td>{{name}}</td> | |
<td>{{pnl}}</td> | |
<td>{{pnlA}}</td> | |
<td>{{prob}}</td> | |
<td>{{probA}}</td> | |
<!--<td style="width: 100px;"> | |
<span class="font-red c-p" id="deleteForecast">Delete</span> | |
</td>--> | |
</tr> | |
{{/each}} | |
</tbody> | |
</table> | |
<div class="visible-xs"> | |
<div class="row"> | |
{{#each output}} | |
<div class="col-xs-12 well"> | |
<div class="marg-t-30px"> | |
<div class="f-s-14px marg-t-5px"> | |
<input type="checkbox" id="{{_id}}" name="{{createdAt}}" value="{{name}}" class="delfore"> | |
</div> | |
<div class="col-xs-6 marg-t-30px"> | |
<div class="f-s-12px">Stock</div> | |
<div class="f-s-14px marg-t-5px f-green">{{name}}</div> | |
</div> | |
<div class="col-xs-6 marg-t-30px"> | |
<div class="f-s-12px">P&L</div> | |
<div class="f-s-14px marg-t-5px f-green">{{pnl}}</div> | |
</div> | |
<div class="col-xs-6 marg-t-30px"> | |
<div class="f-s-12px">Action by P&L</div> | |
<div class="f-s-14px marg-t-5px f-green">{{pnlA}}</div> | |
</div> | |
<div class="col-xs-6 marg-t-30px"> | |
<div class="f-s-12px">Probability</div> | |
<div class="f-s-14px marg-t-5px f-green">{{prob}}</div> | |
</div> | |
<div class="col-xs-6 marg-t-30px"> | |
<div class="f-s-12px">Action by Probability</div> | |
<div class="f-s-14px marg-t-5px f-green">{{probA}}</div> | |
</div> | |
</div> | |
</div> | |
{{/each}} | |
</div> | |
</div> | |
</div> | |
{{/each}} {{/if}} | |
</div> | |
</div> | |
</div> | |
</template> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import { Template } from "meteor/templating"; | |
import { ReactiveDict } from "meteor/reactive-dict"; | |
Template.dailyForecast.onCreated(function onCreated() { | |
const self = this; | |
// Session.set("forecast-type",self.creationLogic) | |
if (ReactiveDict._dictsToMigrate["discoverPageState"] === undefined) { | |
self.dataDict = new ReactiveDict("discoverPageState"); | |
//self.dataDict = new ReactiveDict(); | |
self.dataDict.set("canSeeLabels", false); | |
self.dataDict.set("selected-forecasts", []); | |
self.dataDict.set("selected-stocks", []); | |
self.dataDict.set("ids", []); | |
self.dataDict.set("pnlSelected", false); | |
self.dataDict.set("probSelected", false); | |
self.dataDict.set("forecast", []); | |
Tracker.autorun(function() { | |
FlowRouter.watchPathChange(); | |
Meteor.subscribe("forecastTxs"); | |
Meteor.subscribe("stocklistDaily"); | |
if (FlowRouter.getRouteName().indexOf("ml") > -1) { | |
self.isMl = true; | |
self.creationLogic = "ml"; | |
} | |
else { | |
self.isMl = false; | |
self.creationLogic = "ti"; | |
} | |
Meteor.call("getAccuracyAll",self.isMl,function(err,result){ | |
console.log(result) | |
Session.set("accuracyObj",result); | |
}); | |
Meteor.call("getHeatmap",self.isMl,function(err,result){ | |
console.log(result) | |
Session.set("heatmap",result); | |
}); | |
}); | |
} else { | |
if (self.isMl) { | |
window.location = "/mllab/daily-forecast"; | |
} else { | |
window.location = "/tilab/daily-forecast"; | |
} | |
} | |
}); | |
Template.dailyForecast.helpers({ | |
transactions() { | |
var t = Template.instance(); | |
FlowRouter.watchPathChange(); | |
console.log("rerun"); | |
const txns = ForecastTxns.find({creationLogic:t.creationLogic}, { sort: { createdAt: -1 } }).fetch(); | |
const out = []; | |
if (txns && txns.length > 0) { | |
var dates = []; | |
formattedData = {}; | |
txns.forEach(function(txn) { | |
var date = new Date(txn.createdAt); | |
var formatted = date.getDate()+"-"+date.getMonth()+"-"+date.getFullYear() | |
if(!formattedData[formatted]){ | |
formattedData[formatted] = []; | |
dates.push({formatted:formatted,actual:date.getTime()}); | |
} | |
formattedData[formatted].push(txn); | |
}); | |
console.log(formattedData); | |
dates.sort(function(a,b){ | |
return b.actual - a.actual; | |
}); | |
dates.forEach(function(date){ | |
var obj = {}; | |
obj.createdAt = new Date(date.actual); | |
obj.output = formattedData[date.formatted]; | |
out.push(obj); | |
}) | |
} | |
console.log(out); | |
return out; | |
}, | |
heatmap(){ | |
return Session.get("heatmap") | |
}, | |
isSelected(id){ | |
const t = Template.instance(); | |
var selectedForecasts = t.dataDict.get("selected-forecasts"); | |
return selectedForecasts && selectedForecasts.indexOf(id)>-1; | |
}, | |
canSeeLabels() { | |
const t = Template.instance(); | |
return t.dataDict.get("canSeeLabels") || ForecastTxns.find({}).count(); | |
}, | |
stocksList() { | |
const t = Template.instance(); | |
const search = t.dataDict.get("stock-search-value"); | |
if (search && search.trim()) { | |
return ClientStockList.find({ | |
CompanyName: { $regex: search, $options: "i" } | |
}); | |
} | |
return ClientStockList.find({}); | |
}, | |
forecasts() { | |
const t = Template.instance(); | |
const forecasts = t.dataDict.get("forecast") || []; | |
return forecasts; | |
} | |
}); | |
Template.dailyForecast.onRendered(function onRendered() { | |
if (!Meteor.user()._id) { | |
toastr.error( | |
"Please login with your account to see this page.", | |
"Error" | |
); | |
FlowRouter.go("/"); | |
} | |
if (!updated()) { | |
FlowRouter.go("/update"); | |
} | |
$("#df_filter.dataTables_filter input").addClass( | |
"form-control form-control-sm" | |
); | |
$(document).on("click", "#getForecast", function(e, t) { | |
$('input[type="checkbox"]').removeAttr("checked"); | |
}); | |
$(document).on("click", "#delete", function(e, t) { | |
$('input[type="checkbox"]').removeAttr("checked"); | |
}); | |
$(document).on("click", ".deleteAll", function(e, t) { | |
}); | |
$(document).on("click", "#selectAll", function(e, t) { | |
const checkboxes = document.getElementsByName("stockListItemVal1"); | |
for (var i = 0, n = checkboxes.length; i < n; i++) { | |
checkboxes[i].checked = e.currentTarget.checked; | |
$(checkboxes[i]).trigger("change"); | |
} | |
$(document).on("change", "#multipleStockOption", function(e, t) { | |
if (this.checked == false) { | |
$("#selectAll")[0].checked = false; | |
} | |
}); | |
}); | |
const table = $("#df").DataTable(); | |
$("#df_filter input").on("keyup", function(e, t) { | |
$('input[type="checkbox"]').removeAttr("checked"); | |
table.search($(this).val()).draw(); | |
}); | |
$(document).on("click", ".leaf", function(e, t) { | |
$('input[type="checkbox"]').removeAttr("checked"); | |
}); | |
if (!LoginAndVerified()) { | |
toastr.error("Please login to see this page.", "Error"); | |
FlowRouter.go("/"); | |
} | |
}); | |
Template.dailyForecast.events({ | |
"click #selectAll": function(e, t) { | |
t.dataDict.set("selected-stocks", []); | |
}, | |
'keyup input[type="search"]': function(e, t) { | |
t.dataDict.clear(); | |
}, | |
"click .leaf": function(e, t) { | |
t.dataDict.clear(); | |
const table = $("#df").DataTable(); | |
var key = e.currentTarget.id; | |
table.search(key).draw(); | |
}, | |
"click .deleteAll": function(e, t) { | |
const k = e.target.name; | |
if(e.target.checked){ | |
var ids = []; | |
const checkboxes = document.getElementsByName(k); | |
for (var i = 0, n = checkboxes.length; i < n; i++) { | |
ids.push(checkboxes[i].id) | |
} | |
t.dataDict.set("selected-forecasts",ids); | |
} | |
else { | |
t.dataDict.set("selected-forecasts",[]); | |
} | |
}, | |
"click #delete": function(e, t) { | |
var forecastIds = t.dataDict.get("selected-forecasts") || []; | |
////console.log(ids,fores.length); | |
if (forecastIds.length > 0) { | |
const res = confirm( | |
"Are you sure you want to delete the trade(s)?" | |
); | |
if (res) { | |
Meteor.call( | |
"deleteForecastTrade", | |
forecastIds, | |
(error, result) => { | |
if (error) { | |
toastr.error(error.reason); | |
t.dataDict.set("selected-forecasts",[]) | |
} else { | |
toastr.success( | |
/*forecastIds.length +*/ " Forecast(s) deleted" | |
); | |
t.dataDict.set("selected-forecasts",[]) | |
} | |
} | |
); | |
} else { | |
t.dataDict.set("selected-forecasts",[]) | |
} | |
} else { | |
/*else if(forecasts.length>54){ | |
for(var i=0;i<fores.length;i++){ | |
if(fores[i]=="on"){ | |
fores.slice(i,1); | |
} | |
} | |
}*/ | |
toastr.error("Choose trades to delete"); | |
t.dataDict.clear(); | |
} | |
}, | |
"click #pnl": (e, t) => { | |
if (e.currentTarget.checked) { | |
t.dataDict.set("pnlSelected", true); | |
} else { | |
t.dataDict.set("pnlSelected", false); | |
} | |
}, | |
"click #prob": (e, t) => { | |
if (e.currentTarget.checked) { | |
t.dataDict.set("probSelected", true); | |
} else { | |
t.dataDict.set("probSelected", false); | |
} | |
}, | |
"change #multipleStockOption": (e, t) => { | |
let stocks = t.dataDict.get("selected-stocks") || []; | |
////console.log(stocks); | |
const stock = e.currentTarget.value; | |
if (e.currentTarget.checked) { | |
stocks.push(stock); | |
} else { | |
const index = stocks.indexOf(stock); | |
stocks[index] = ""; | |
stocks.splice(index, 1); | |
} | |
t.dataDict.set("selected-stocks", stocks); | |
//console.log(stocks.length); | |
}, | |
"change .delfore": (e, t) => { | |
var id = e.currentTarget.id; | |
console.log(id); | |
// t.dataDict.set("ids", ids); | |
let fores = t.dataDict.get("selected-forecasts") || []; | |
const index = fores.indexOf(id); | |
if(index>-1){ | |
fores.splice(index, 1); | |
} | |
else { | |
fores.push(id); | |
} | |
t.dataDict.set("selected-forecasts", fores); | |
console.log(fores); | |
}, | |
"click #getForecast": (e, t) => { | |
//console.log('clicked'); | |
var n=new Date(); | |
console.log(n.toString(),n.getHours(),n.getMinutes(),n.getSeconds()); | |
var pnl = t.dataDict.get("pnlSelected"); | |
var prob = t.dataDict.get("probSelected"); | |
if (pnl == null) { | |
pnl = false; | |
2; | |
} | |
if (prob == null) { | |
prob = false; | |
} | |
//console.log(pnl,prob); | |
t.dataDict.set("forecast", []); | |
var stocks = t.dataDict.get("selected-stocks") || []; | |
if (stocks.length == 0) { | |
toastr.error("Please select at least one stock to get forecast."); | |
//console.log(pnl,prob,"b"); | |
t.dataDict.clear(); | |
return; | |
} else if (stocks.length > 180) { | |
//console.log("jfg"); | |
} | |
if (!pnl && !prob) { | |
toastr.error("Select one of the checkboxes to get forecast."); | |
t.dataDict.clear(); | |
//console.log(pnl,prob,"a"); | |
return; | |
} | |
var existingStocks = []; | |
var today = new Date() | |
today.setHours(0); | |
today.setMinutes(0); | |
today.setSeconds(0); | |
stocks.forEach(function(stock){ | |
var existing = ForecastTxns.findOne({ | |
stock:stock, | |
creationLogic:t.creationLogic, | |
createdAt:{ | |
$gt:today | |
} | |
}) | |
if(existing){ | |
existingStocks.push(stock); | |
console.log("exeists"); | |
} | |
}); | |
if(existingStocks.length>0){ | |
toastr.error("Error","You have already generated forecast for "+existingStocks.join()+". Please select other stocks and try again"); | |
t.dataDict.clear(); | |
return; | |
} | |
var factor = 1, multiple=1; | |
var check_assetClass= stocklistDaily.findOne({stock_name:stocks[0]}) | |
var assetClass=check_assetClass.type; | |
if(assetClass=="COMMODITIES"){ | |
console.log("fklh"); | |
multiple=5; | |
} | |
if(pnl && prob){ | |
factor = 2; | |
} | |
var amount = stocks.length * 118 * factor*multiple; | |
var conf = confirm(`Do you want to create ${stocks.length*factor} forecast(s) valued at Rs. ${amount}.00`); | |
if (conf) { | |
// var existingStocks = []; | |
t.dataDict.set("canSeeLabels", true); | |
if(existingStocks.length===0){ | |
Meteor.call( | |
"getForecast", | |
pnl, | |
prob, | |
stocks, | |
t.isMl, | |
(error, result) => { | |
if (error) { | |
toastr.error(error.reason); | |
t.dataDict.set("selected-stocks",[]); | |
} else { | |
if (result.code == 200) { | |
Session.set("random", Random.id()); | |
t.dataDict.set("forecast", result); | |
//console.log(result); | |
if (pnl == prob) { | |
toastr.success( | |
2 * stocks.length + " Forecast(s) created" | |
); | |
t.dataDict.set("selected-stocks",[]); | |
} else { | |
toastr.success( | |
stocks.length + " Forecast(s) created" | |
); | |
t.dataDict.set("selected-stocks",[]); | |
} | |
} | |
else if(result.code == 404){ | |
toastr.error("Please add money into your wallet."); | |
t.dataDict.set("selected-stocks",[]); | |
if (result.refillAmount) { | |
FlowRouter.go("/subscription"); | |
Session.set( | |
"requiredAmount", | |
result.refillAmount | |
); | |
} | |
} | |
else { | |
toastr.error(result.message); | |
// Session.set("requiredAmount", result.refillAmount); | |
t.dataDict.set("selected-stocks",[]); | |
// FlowRouter.go("/subscription"); | |
} | |
} | |
} | |
); | |
} | |
else { | |
toastr.error("Error","You have already generated forecast for "+existingStocks.join()+". Please select other stocks and try again"); | |
t.dataDict.set("selected-stocks",[]); | |
} | |
} else { | |
t.dataDict.clear(); | |
} | |
} | |
}); | |
Template.dailyForecast.onDestroyed(function onDestroyed(e, t) { | |
/* const self=this; | |
self.dataDict=new ReactiveDict(); | |
self.dataDict.clear();*/ | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment