Skip to content

Commit

Permalink
Merge pull request #78 from TheDMSGroup/ENG-651
Browse files Browse the repository at this point in the history
[ENG-651] Source and Client Stat tabs on Campaign Page
  • Loading branch information
heathdutton authored Nov 27, 2018
2 parents c21209d + a5887db commit 9cb902c
Show file tree
Hide file tree
Showing 12 changed files with 717 additions and 65 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ install:
script:

# Run PHPUnit including core tests to find potential BC breaks.
- bin/phpunit -d memory_limit=2048M --bootstrap vendor/autoload.php --configuration app/phpunit.xml.dist --fail-on-warning
- bin/phpunit -d memory_limit=2256M --bootstrap vendor/autoload.php --configuration app/phpunit.xml.dist --fail-on-warning

# Run PHPSTAN analysis for PHP 7+ only in the scope of this plugin.
- if [[ ${TRAVIS_PHP_VERSION:0:3} != "5.6" ]]; then ~/.composer/vendor/phpstan/phpstan-shim/phpstan.phar analyse plugins/$MAUTIC_PLUGIN; fi
Expand Down
156 changes: 156 additions & 0 deletions Assets/js/clientstats.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
Mautic.loadCampaignClientStatsTable = function (campaignId) {
var $clienttarget = mQuery('#clientstats-table');
if ($clienttarget.length) {
mQuery.ajax({
url: mauticAjaxUrl,
type: 'POST',
data: {
action: 'plugin:mauticContactLedger:clientStatsTab',
campaignId: campaignId
},
cache: true,
dataType: 'json',
success: function (response) {
var hideCols = [0];
var colSpan = 2;

mQuery('#clientstats-table').DataTable({
language: {
emptyTable: 'No results found for this date range and filters.'
},
data: response.rows,
autoFill: true,
columns: response.columns,
order: [[1, 'asc'], [2, 'asc']],
bLengthChange: false,
dom: '<<lBf>rtip>',
bAutoWidth: false,
buttons: [
'excelHtml5',
'csvHtml5'
],
columnDefs: [
{
render: function (data, type, row) {
return renderClientName(row);
},
targets: 1
},
{
render: function (data, type, row) {
return '$' + data;
},
targets: [Number(6), Number(7)]
},

{visible: false, targets: hideCols},
{width: '25%', targets: [1]}
],

footerCallback: function (row, data, start, end, display) {
if (data && data.length === 0 || typeof data[0] === 'undefined') {
return;
}
try {
// Add table footer if it doesnt
// exist
var container = mQuery('#clientstats-table');
var columns = data[0].length;
if (mQuery('tr.clientStatPageTotal').length === 0) {
var footer = mQuery('<tfoot></tfoot>');
var tr = mQuery('<tr class=\'clientStatPageTotal\' style=\'font-weight: 600; background: #fafafa;\'></tr>');
var tr2 = mQuery('<tr class=\'clientStatGrandTotal\' style=\'font-weight: 600; background: #fafafa;\'></tr>');
tr.append(mQuery('<td colspan="' + colSpan + '">Page totals</td>'));
tr2.append(mQuery('<td colspan="'+colSpan+'">Grand totals</td>'));
for (var i = 3; i < columns; i++) {
tr.append(mQuery('<td class=\'td-right\'></td>'));
tr2.append(mQuery('<td class=\'td-right\'></td>'));
}
footer.append(tr);
footer.append(tr2);
container.append(footer);
}

var api = this.api();

// Remove the formatting to get
// integer data for summation
var intVal = function (i) {
return typeof i === 'string' ? i.replace(/[\$,]/g, '') * 1 : typeof i === 'number' ? i : 0;
};

var total = mQuery('#' + container[0].id + ' thead th').length;
var footer = mQuery(container).find('tfoot tr:nth-child(1)');
var footer2 = mQuery(container).find('tfoot tr:nth-child(2)');

for (var i = 3; i <= total; i++) {
var pageSum = api
.column(i, {page: 'current'})
.data()
.reduce(function (a, b) {
return intVal(a) + intVal(b);
}, 0);
var sum = api
.column(i)
.data()
.reduce(function (a, b) {
return intVal(a) + intVal(b);
}, 0);
var title = mQuery(container).find('thead th:nth-child(' + (i) + ')').text();
footer.find('td:nth-child(' + (i -1) + ')').html(FormatFooter(title, pageSum, i));
footer2.find('td:nth-child(' + (i - 1) + ')').html(FormatFooter(title, sum, i));

}
}
catch (e) {
console.log(e);
}
} // FooterCallback
}); //.DataTables
mQuery('#clientstats-table_wrapper .dt-buttons').css({
float: 'right',
marginLeft: '10px'
});
mQuery('#clientstats-table').parent('div').css('overflow-x', 'scroll');
mQuery('#clientstats-table').css('min-width', '100%');
mQuery('#clientstats-container').addClass('table-done');

} //success
});//ajax
}

function renderClientName (row) {

if (row[1] !== '') {
return '<a href="'+mauticBaseUrl+'s/contactclient/view/' + row[0] + '" class="campaign-name-link" title="' + row[1] + '">' + row[1] + '</a>';
}
return row[1];
}

function FormatFooter (column, value, index) {
column = column.trim();
var numFormat = mQuery.fn.dataTable.render.number(',', '.', 0).display;
var curFormat = mQuery.fn.dataTable.render.number(',', '.', 2, '$').display;
var curPreciseFormat = mQuery.fn.dataTable.render.number(',', '.', 4, '$').display;
if (column === 'Margin') {
return ' - ';
}
if (column === 'Revenue' || column === 'Cost' || column === 'GM') {
return curFormat(value);
}
if (column === 'RPM') {
return curPreciseFormat(value);
}
if (column === 'RPU') {
return curPreciseFormat(value);
}
return numFormat(value);
}
}

mQuery(document).ready(function () {
if (!mQuery('#clientstats-container').hasClass('table-done')) {
Mautic.loadCampaignClientStatsTable(campaignId);
}
});

153 changes: 153 additions & 0 deletions Assets/js/sourcestats.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
Mautic.loadCampaignSourceStatsTable = function (campaignId) {
var $sourcetarget = mQuery('#sourcestats-table');
if ($sourcetarget.length) {
mQuery.ajax({
url: mauticAjaxUrl,
type: 'POST',
data: {
action: 'plugin:mauticContactLedger:sourceStatsTab',
campaignId: campaignId
},
cache: true,
dataType: 'json',
success: function (response) {
var hideCols = [0];
var colSpan = 2;

mQuery('#sourcestats-table').DataTable({
language: {
emptyTable: 'No results found for this date range and filters.'
},
data: response.rows,
autoFill: true,
columns: response.columns,
order: [[1, 'asc'], [2, 'asc']],
bLengthChange: false,
dom: '<<lBf>rtip>',
bAutoWidth: false,
buttons: [
'excelHtml5',
'csvHtml5'
],
columnDefs: [
{
render: function (data, type, row) {
return rendersourceName(row);
},
targets: 1
},
{
render: function (data, type, row) {
return '$' + data;
},
targets: [Number(6), Number(7)]
},

{visible: false, targets: hideCols},
{width: '25%', targets: [1]}
],

footerCallback: function (row, data, start, end, display) {
if (data && data.length === 0 || typeof data[0] === 'undefined') {
return;
}
try {
// Add table footer if it doesnt
// exist
var container = mQuery('#sourcestats-table');
var columns = data[0].length;
if (mQuery('tr.sourceStatPageTotal').length === 0) {
var footer = mQuery('<tfoot></tfoot>');
var tr = mQuery('<tr class=\'sourceStatPageTotal\' style=\'font-weight: 600; background: #fafafa;\'></tr>');
var tr2 = mQuery('<tr class=\'sourceStatGrandTotal\' style=\'font-weight: 600; background: #fafafa;\'></tr>');
tr.append(mQuery('<td colspan="' + colSpan + '">Page totals</td>'));
tr2.append(mQuery('<td colspan="'+colSpan+'">Grand totals</td>'));
for (var i = 3; i < columns; i++) {
tr.append(mQuery('<td class=\'td-right\'></td>'));
tr2.append(mQuery('<td class=\'td-right\'></td>'));
}
footer.append(tr);
footer.append(tr2);
container.append(footer);
}

var api = this.api();

// Remove the formatting to get
// integer data for summation
var intVal = function (i) {
return typeof i === 'string' ? i.replace(/[\$,]/g, '') * 1 : typeof i === 'number' ? i : 0;
};

var total = mQuery('#' + container[0].id + ' thead th').length;
var footer = mQuery(container).find('tfoot tr:nth-child(1)');
var footer2 = mQuery(container).find('tfoot tr:nth-child(2)');

for (var i = 3; i <= total; i++) {
var pageSum = api
.column(i, {page: 'current'})
.data()
.reduce(function (a, b) {
return intVal(a) + intVal(b);
}, 0);
var sum = api
.column(i)
.data()
.reduce(function (a, b) {
return intVal(a) + intVal(b);
}, 0);
var title = mQuery(container).find('thead th:nth-child(' + (i) + ')').text();
footer.find('td:nth-child(' + (i -1) + ')').html(FormatFooter(title, pageSum, i));
footer2.find('td:nth-child(' + (i - 1) + ')').html(FormatFooter(title, sum, i));

}
}
catch (e) {
console.log(e);
}
} // FooterCallback
}); //.DataTables
mQuery('#sourcestats-table_wrapper .dt-buttons').css({
float: 'right',
marginLeft: '10px'
});
mQuery('#sourcestats-table').parent('div').css('overflow-x', 'scroll');
mQuery('#sourcestats-table').css('min-width', '100%');
mQuery('#sourcestats-container').addClass('table-done');

} //success
});//ajax
}

function rendersourceName (row) {

if (row[1] !== '') {
return '<a href="'+mauticBaseUrl+'s/contactsource/view/' + row[0] + '" class="campaign-name-link" title="' + row[1] + '">' + row[1] + '</a>';
}
return row[1];
}

function FormatFooter (column, value, index) {
column = column.trim();
var numFormat = mQuery.fn.dataTable.render.number(',', '.', 0).display;
var curFormat = mQuery.fn.dataTable.render.number(',', '.', 2, '$').display;
var curPreciseFormat = mQuery.fn.dataTable.render.number(',', '.', 4, '$').display;
if (column === 'Margin') {
return ' - ';
}
if (column === 'Revenue' || column === 'Cost' || column === 'GM') {
return curFormat(value);
}
if (column === 'eCPM') {
return curPreciseFormat(value);
}
return numFormat(value);
}
}

mQuery(document).ready(function () {
if (!mQuery('#sourcestats-container').hasClass('table-done')) {
Mautic.loadCampaignSourceStatsTable(campaignId);
}
});

16 changes: 9 additions & 7 deletions Config/config.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,6 @@
'@mautic.contactledger.subscriber.context_create',
],
],
'mautic.contactledger.subscriber.customcontent' => [
'class' => 'MauticPlugin\MauticContactLedgerBundle\EventListener\CustomContentSubscriber',
'arguments' => [
'@mautic.contactledger.model.ledgerentry',
'@mautic.dashboard.model.dashboard',
],
],
'mautic.contactledger.dashboard.subscriber' => [
'class' => 'MauticPlugin\MauticContactLedgerBundle\EventListener\DashboardSubscriber',
'arguments' => [
Expand All @@ -66,6 +59,15 @@
'doctrine.orm.entity_manager',
],
],
'mautic.contactledger.customcontent.subscriber' => [
'class' => 'MauticPlugin\MauticContactLedgerBundle\EventListener\CustomContentSubscriber',
'arguments' => [
'doctrine.orm.entity_manager',
'@mautic.contactledger.model.ledgerentry',
'@mautic.dashboard.model.dashboard',
'session',
],
],
],
'models' => [
'mautic.contactledger.model.ledgerentry' => [
Expand Down
Loading

0 comments on commit 9cb902c

Please sign in to comment.