File: //home/arjun/projects/buyercall_forms/buyercall/buyercall/templates/layouts/backend_reports.jinja2
{% extends 'layouts/backend_base.jinja2' %}
{% block header %}
{% if current_supervisor_user.is_authenticated %}
<div data-notify="container"
class="alert switch-back-bar col-xs-11 col-sm-10 col-md-10 col-lg-8 alert-warning alert-with-icon" data-notify-position="top-center"
role="alert">
<i class="material-icons" data-notify="icon">error</i>
<span data-notify="message">
Hi <strong>{{ current_supervisor_user.firstname | default(current_user.first_name|default('') + ' ' +
current_user.last_name|default('')) }}</strong>,
you are logged in as
<strong>{{ current_user.firstname }} {{current_user.lastname }}
</strong>
</span>
<a href="{{ url_for('user.switch_back') }}">
<button type="button" class="switch-back-button btn btn-light-blue" aria-hidden="true">
Switch back
</button>
</a>
</div>
{% endif %}
<nav class="navbar navbar-transparent navbar-absolute {% if current_supervisor_user.is_authenticated %} navbar-custom-position {% endif %}">
<div class="container-fluid">
<div class="navbar-minimize">
<button id="minimizeSidebar" class="btn btn-round btn-light-blue btn-fill btn-just-icon">
<i class="material-icons visible-on-sidebar-regular">more_vert</i>
<i class="material-icons visible-on-sidebar-mini">view_list</i>
</button>
</div>
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#"> {% block heading %}{% endblock %} </a>
</div>
</div>
</nav>
{% endblock %}
{% block footer %}
<footer class="footer">
<div class="container-fluid">
<nav class="pull-left">
<ul>
<!-- <li>
<a href="{{ url_for('page.faq') }}">
FAQ
</a>
</li> -->
<li>
<li><a href="{{ url_for('issue.support') }}">
Support
</a>
</li>
<li>
<a href="{{ url_for('page.privacy') }}">
Privacy Policy
</a>
</li>
<li>
<a href="{{ url_for('page.terms') }}">
Terms of Service
</a>
</li>
</ul>
</nav>
<p class="copyright pull-right">
Copyright © 2022 {{ current_user.partnership.name }}. All rights reserved.
</p>
</div>
</footer>
{% endblock %}
{% block notifications %}
{{ flash.render() }}
{{ billing.card_expiring_warning() }}
{{ billing.subscription_expiring_warning() }}
{{ billing.subscription_expiring_error() }}
{% endblock %}
{% block scripts %}
<!-- Load and execute javascript code used for leads page -->
{% endblock %}
{% block pagescripts %}
<script>
// The weekly call performance line chart
new Chartist.Line('#listInterestReportChart', {
labels: ['Mon', 'Tue', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun'],
series: [
[{meta: 'reports', value: 12},
{meta: 'reports', value: 9},
{meta: 'reports', value: 14},
{meta: 'reports', value: 8},
{meta: 'reports', value: 9},
{meta: 'reports', value: 11},
{meta: 'reports', value: 14}]
]
}, {
fullWidth: true,
chartPadding: {
right: 40
}
});
// The daily sales report email
new Chartist.Line('#listDailySalesReport', {
labels: ['Mon', 'Tue', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun'],
series: [
[{meta: 'reports', value: 4},
{meta: 'reports', value: 12},
{meta: 'reports', value: 6},
{meta: 'reports', value: 8},
{meta: 'reports', value: 9},
{meta: 'reports', value: 21},
{meta: 'reports', value: 17}]
]
}, {
fullWidth: true,
chartPadding: {
right: 40
}
});
// Credit service provider accounts report
new Chartist.Line('#CreditServiceProviderReportChart', {
labels: ['Mon', 'Tue', 'Wed', 'Thurs', 'Fri', 'Sat', 'Sun'],
series: [
[{meta: 'reports', value: 12},
{meta: 'reports', value: 9},
{meta: 'reports', value: 3},
{meta: 'reports', value: 10},
{meta: 'reports', value: 15},
{meta: 'reports', value: 29},
{meta: 'reports', value: 21}]
]
}, {
fullWidth: true,
chartPadding: {
right: 40
}
});
</script>
<script>
window.setTimeout(function() { $('#flash-messages').hide('slow') }, 10000);
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
};
function iterateDots(){
var el = document.getElementById("dots");
var dotsStr = el.innerHTML;
var dotsLen = dotsStr.length;
var maxDots = 3;
el.innerHTML = (dotsLen < maxDots ? dotsStr + '.' : '');
};
dotInterval = null;
function startDots(func, time) {
dotInterval = setInterval(func, time);
}
function stopDots() {
clearInterval(dotInterval);
}
</script>
<script>
const taskPDF = (btn, doPoll, report) => {
document.getElementById("pdfDownload").addEventListener("click", (event) => {
event.preventDefault()
event.stopImmediatePropagation()
if(event.target.tagName.toLowerCase() === 'a'){
event.target.href;
}
fetch(event.target.href, {
method: "GET",
})
.then(response => response.json())
.then(data => {
report(null)
const poll = () => {
fetch(`/reports/credit_service_provider_report/pdf/result/${data["result_id"]}`)
.then(response => response.json())
.then(data => {
report(data)
if (!data["ready"]) {
setTimeout(poll, 500)
} else if (!data["successful"]) {
console.error(btn, data)
}
})
}
if (doPoll) {
poll()
}
})
}, true);
}
taskPDF("pdf", true, data => {
data === null
const dlP = document.getElementById("dlMsg");
const el = document.getElementById("pdf-result");
const btnLink = document.getElementById('pdfDownload');
const dots = document.getElementById('dots');
startDots("iterateDots()", 800);
if (data === null) {
dlP.style.display = 'block';
btnLink.style.display = 'none';
dots.style.display = 'inline-block';
el.style.display = 'inline-block';
el.style.color = '#3C4858';
el.innerText = "Initiate report build"
} else if (!data["ready"]) {
el.style.color = '#3C4858';
el.innerText = "Busy generating report"
} else if (!data["successful"]) {
stopDots();
el.style.color = '#dc3545';
el.innerText = "There was an issue generating the report. Please contact support."
} else {
stopDots();
el.style.color = '#3C4858';
dots.style.display = 'none';
el.innerText = "Report build complete. The report will open in a new tab."
fetch(`/reports/open_pdf/result/`, {
headers: {'X-CSRFToken': document.querySelector("meta[name='csrf-token']").getAttribute("content")},
method: "POST",
body: data["value"]
}).then((response) => response.blob()).then(data => window.open(URL.createObjectURL(data)))
sleep(5000).then(() => {
btnLink.style.display = 'block';
dlP.style.display = 'none';
el.style.display = 'none';
});
}
})
</script>
{% endblock %}