Skip to content

Instantly share code, notes, and snippets.

@AmitHedgeloop
Created June 3, 2025 02:43
Show Gist options
  • Save AmitHedgeloop/ae730a940d87d5bcdc77e04d427b96d5 to your computer and use it in GitHub Desktop.
Save AmitHedgeloop/ae730a940d87d5bcdc77e04d427b96d5 to your computer and use it in GitHub Desktop.
meteor.js documets
<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>&nbsp;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>
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();*/
});
<template name="sidebar" >
<aside class="main-sidebar" data-toggle='control-sidebar' id="controlSidebar" style="height: 280px; overflow-y: scroll!important; ">
<div class="">
<div class="panel-group" id="accordion" style="font:black!important;" >
<div class="panel panel-default">
<!--<div class="panel-heading">
<h4 class="panel-header" style="text-font:blue;">
<a href="#" aria-expanded="false"><i class="glyphicon glyphicon-thumbs-up"></i>&nbsp;Daily Forecast
</a>
</h4>
</div>-->
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="false"><span class="glyphicon glyphicon-tower">
</span>&nbsp;&nbsp;Equities</a>
</h4>
</div>
<div id="collapseOne" class="panel-collapse collapse in">
<div class="panel-body">
<div class="panel-group" id="accordion11">
<div class="active panel">
<a data-toggle="collapse" data-parent="#accordion11" href="#collapseOneOne">
Asia&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa fa-angle-left pull-down"></i>
</a>
<div id="collapseOneOne" class="panel-collapse collapse">
<div class="panel-body"><a href="#" id="NSE_50" class="active leaf">NSE 50</a></div>
<div class="panel-body"><a href="#" id="NSE" class="active leaf">NSE</a></div>
</div>
</div>
<div class="panel">
<a data-toggle="collapse" data-parent="#accordion12" href="#collapseOneTwo">
Europe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa fa-angle-left pull-down"></i>
</a>
<div id="collapseOneTwo" class="panel-collapse collapse">
<div class="panel-body"><a href="#" id="CAC" class="active leaf">CAC</a></div>
<div class="panel-body"><a href="#" id="DAX" class="active leaf">DAX</a></div>
<div class="panel-body"><a href="#" id="FTSE" class="active leaf">FTSE</a></div>
</div>
</div>
<div class="active panel">
<a data-toggle="collapse" data-parent="#accordion13" href="#collapseOneThree">
America&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa fa-angle-left pull-down"></i>
</a>
<div id="collapseOneThree" class="panel-collapse collapse">
<div class="panel-body"><a href="#" class="active leaf" id="NASDAQ">NASDAQ</a></div>
<div class="panel-body"><a href="#" class="active leaf" id="S&P">S&P</a></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false"><span class="glyphicon glyphicon-grain">
</span>Commodities</a>
</h4>
</div>
<div id="collapseTwo" class="panel-collapse collapse">
<div class="panel-body">
<div class="panel-group" id="accordion21">
<div class="active panel">
<a data-toggle="collapse" data-parent="#accordion21" href="#collapseTwoOne">
Asia&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa fa-angle-left pull-down"></i>
</a>
<div id="collapseTwoOne" class="panel-collapse collapse">
<div class="panel-body"><a href="#" class="active leaf" id="MCX">India</a></div>
</div>
</div>
<div class="active panel">
<a data-toggle="collapse" data-parent="#accordion22" href="#collapseTwoTwo">
America&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i class="fa fa-angle-left pull-down"></i>
</a>
<div id="collapseTwoTwo" class="panel-collapse collapse">
<div class="panel-body"><a href="#" class="active leaf" id="NYMEX">USA</a></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<a data-toggle="collapse" data-parent="#accordion" href="#collapseThree" aria-expanded="false"><span class="glyphicon glyphicon-usd">
</span>Currencies</a>
</h4>
</div>
<div id="collapseThree" class="panel-collapse collapse">
<div class="panel-body">
<div class="panel-group" id="accordion31">
<div class="active panel">
<a data-toggle="collapse" data-parent="#accordion31" href="#collapseThreeOne">GBP&nbsp;&nbsp;&nbsp;<i class="fa fa-angle-left pull-down"></i></a>
<div id="collapseThreeOne" class="panel-collapse collapse">
<div class="panel-body"><a href="#" class="active leaf" id="GBPINR">GBPINR</a></div>
<!-- <div class="panel-body"><a href="#" class="active leaf" id="GBPUSD">GBPUSD</a></div> -->
<!-- <div class="panel-body"><a href="#" class="active leaf" id="GBPEUR">GBPEUR</a></div> -->
</div>
</div>
<div class="active panel">
<a data-toggle="collapse" data-parent="#accordion32" href="#collapseThreeTwo">USD&nbsp;&nbsp;&nbsp;<i class="fa fa-angle-left pull-down"></i></a>
<div id="collapseThreeTwo" class="panel-collapse collapse">
<div class="panel-body"><a href="#" class="active leaf" id="USDINR">USDINR</a></div>
</div>
</div>
<div class="active panel">
<a data-toggle="collapse" data-parent="#accordion33" href="#collapseThreeThree">EUR&nbsp;&nbsp;&nbsp;<i class="fa fa-angle-left pull-down"></i></a>
<div id="collapseThreeThree" class="panel-collapse collapse">
<!-- <div class="panel-body"><a href="#" class="active leaf" id="EURUSD">EURUSD</a></div> -->
<div class="panel-body"><a href="#" class="active leaf" id="EURINR">EURINR</a></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="visible-xs">
<div class="main sidebar">
<div class="container">
<div class="sidebar-header">
<button type="button" class="sidebar-toggle" data-toggle="control-sidebar" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="">Equity</a>
<li><a href="NSE">NSE</a></li>
<li><a href="CAC">CAC</a></li>
<li><a href="DAX">DAX</a></li>
<li><a href="FTSE">FTSE</a></li>
<li><a href="S&P">S&P</a></li>
<li><a href="NASDAQ">NASDAQ</a></li>
</li>
<li><a href="/create-portfolio">Create Trade</a></li>
<li><a href="/daily-forecast">Daily Forecast</a></li>
<li><a href="/glossary">Glossary</a></li>
<li><a href="/my-account">My Account</a></li>
<li><a href="#" id="logout">Log Out</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</div>
</div>
</div>
</div>
</aside>
</template>
import { Template } from 'meteor/templating';
import { ReactiveDict } from 'meteor/reactive-dict';
Template.sidebar.onRendered(function onRendered(){
//$('ul').on('expanded.tree', handleExpandedEvent)
});
Template.sidebar.events({
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment