let table;
// Configure the DataTable
$(document).ready(function() {
if (!folderViewEnabled) {
disableFolders();
}
table = $('#campaigns').DataTable({
language: dataTablesLanguage,
serverSide: true,
stateSave: true,
stateDuration: 0,
responsive: true,
dom: dataTablesTemplate,
stateLoadCallback: dataTableStateLoadCallback,
stateSaveCallback: dataTableStateSaveCallback,
filter: false,
searchDelay: 3000,
order: [[0, 'asc']],
ajax: {
url: campaignSearchURL,
data: function(d) {
$.extend(
d,
$('#campaigns').closest('.XiboGrid')
.find('.FilterDiv form').serializeObject(),
);
},
},
columns: [
{
data: 'campaign',
responsivePriority: 2,
render: dataTableSpacingPreformatted,
},
// Add fields only if campaign is enabled
...(adCampaignEnabled ? [
{
data: 'type',
responsivePriority: 2,
render: function(data, type) {
if (type !== 'display') {
return data;
} else if (data === 'list') {
return campaignPageTrans.list;
} else if (data === 'ad') {
return campaignPageTrans.ad;
}
return data;
},
},
{
data: 'startDt',
responsivePriority: 2,
render: dataTableDateFromUnix,
},
{
data: 'endDt',
responsivePriority: 2,
render: dataTableDateFromUnix,
},
] : []),
{data: 'numberLayouts', responsivePriority: 2},
// Add tags only if enabled
...(taggingEnabled ? [{
sortable: false,
responsivePriority: 2,
data: dataTableCreateTags,
}] : []),
{
data: 'totalDuration',
responsivePriority: 2,
render: dataTableTimeFromSeconds,
},
{
name: 'cyclePlaybackEnabled',
responsivePriority: 3,
data: function(data, type) {
if (type != 'display') {
return data.cyclePlaybackEnabled;
}
let icon = '';
if (data.cyclePlaybackEnabled == 1) {
icon = 'fa-check';
} else {
icon = 'fa-times';
}
return '';
},
},
{
name: 'playCount',
responsivePriority: 3,
data: function(data, type) {
if (type !== 'display') {
return data.playCount;
}
if (!data.playCount) {
return '';
} else {
return data.playCount;
}
},
},
// Add fields only if campaign is enabled
...(adCampaignEnabled ? [
{
data: 'targetType',
responsivePriority: 3,
render: function(data, type) {
if (data === 'plays') {
return campaignPageTrans.plays;
} else if (data === 'budget') {
return campaignPageTrans.budget;
} else if (data === 'imp') {
return campaignPageTrans.impressions;
}
return data;
},
},
{
data: 'target',
responsivePriority: 3,
},
{
data: 'plays',
responsivePriority: 6,
},
{
data: 'spend',
responsivePriority: 6,
},
{
data: 'impressions',
responsivePriority: 6,
},
] : []),
{
data: 'ref1',
responsivePriority: 10,
visible: false,
},
{
data: 'ref2',
responsivePriority: 10,
visible: false,
},
{
data: 'ref3',
responsivePriority: 10,
visible: false,
},
{
data: 'ref4',
responsivePriority: 10,
visible: false,
},
{
data: 'ref5',
responsivePriority: 10,
visible: false,
},
{
data: 'createdAt',
responsivePriority: 5,
render: dataTableDateFromIso,
visible: false,
},
{
data: 'modifiedAt',
responsivePriority: 5,
render: dataTableDateFromIso,
visible: false,
},
{
data: 'modifiedByName',
responsivePriority: 5,
visible: false,
},
{
orderable: false,
responsivePriority: 1,
data: dataTableButtonsColumn,
},
],
});
// Data Table events
table.on('draw', dataTableDraw);
table.on('draw',
{
form: $('#campaigns').closest('.XiboGrid')
.find('.FilterDiv form'),
}, dataTableCreateTagEvents);
table.on('processing.dt', dataTableProcessing);
dataTableAddButtons(
table,
$('#campaigns_wrapper').find('.dataTables_buttons'),
);
$('#refreshGrid').click(function() {
table.ajax.reload();
});
});
// Callback for the media form
// Fired when the media form opens
window.campaignAssignLayoutsFormOpen = function(dialog) {
// setup checkbox behaviour for cycle based playback
formHelpers.setupCheckboxInputFields(
$(dialog).find('form:not(.form-inline)'),
'input[name="cyclePlaybackEnabled"]',
'.cycle-based-playback',
'.no-cycle-based-playback',
);
// Layout element template
const layoutElementTemplate = templates.campaign.campaignAssignLayout;
const layoutAssignFilter = $(dialog).find('.layoutAssignFilterOptions');
// Change input id of the tags filter on Layout assignment tab.
layoutAssignFilter.find('input#tags').attr('id', 'tagsFilter');
// Assignment table
const $layoutAssignments = $('#layoutAssignments');
const $layoutAssignSortable = $('#LayoutAssignSortable');
// Update all the layout element positions
const updateSortablePositions = function() {
dialog.find('input[name="manageLayouts"]').val(1);
$layoutAssignSortable.find('li').each(function(idx, el) {
$(el).find('.layout-order').html(idx + 1);
});
};
// Populate layouts
const layoutsArray = $layoutAssignSortable.data('layouts');
for (layoutIndex = 0; layoutIndex < layoutsArray.length; layoutIndex++) {
const layout = layoutsArray[layoutIndex];
// Append to our layouts list
const newItem = layoutElementTemplate({
index: (layoutIndex + 1),
layoutId: layout.layoutId,
layoutName: layout.layout,
locked: layout.locked,
});
$(newItem).appendTo('#LayoutAssignSortable');
}
// Layout DataTable
const layoutTable = $layoutAssignments.DataTable({
language: dataTablesLanguage,
serverSide: true,
stateSave: true,
stateDuration: 0,
pageLength: 5,
lengthMenu: [5, 10, 25, 50],
stateLoadCallback: dataTableStateLoadCallback,
stateSaveCallback: dataTableStateSaveCallback,
searchDelay: 3000,
order: [[0, 'asc']],
filter: false,
ajax: {
url: layoutSearchURL + '?retired=0',
data: function(d) {
$.extend(d, $layoutAssignments.closest('.XiboGrid')
.find('.layoutAssignFilterOptions')
.find('input, select')
.serializeObject());
},
},
columns: [
{data: 'layoutId'},
{
data: 'layout',
render: dataTableSpacingPreformatted,
},
{
name: 'status',
data: function(data, type) {
if (type != 'display') {
return data.status;
}
let icon = '';
if (data.status == 1) {
icon = 'fa-check';
} else if (data.status == 2) {
icon = 'fa-exclamation';
} else if (data.status == 3) {
icon = 'fa-cogs';
} else {
icon = 'fa-times';
}
return '';
},
},
{
sortable: false,
data: function(data, type, row, meta) {
if (type !== 'display') {
return '';
}
// Create a click-able span
return '';
},
},
],
});
layoutTable.on(
'draw',
{
form: $layoutAssignments.closest('.XiboGrid').find('form'),
}, function(e, settings) {
dataTableDraw(e, settings);
dataTableCreateTagEvents(e, settings);
// Bind a click event to each table rows + button (span)
$layoutAssignments.find('.assignItem').on('click', function(ev) {
// Get the row that this is in.
const data = layoutTable.row($(ev.currentTarget).closest('tr')).data();
// Append to our layouts list
const newItem = layoutElementTemplate({
index: ($('#LayoutAssignSortable').find('li').length + 1),
layoutId: data.layoutId,
layoutName: data.layout,
locked: false,
});
$(newItem).appendTo('#LayoutAssignSortable');
dialog.find('input[name="manageLayouts"]').val(1);
});
});
layoutTable.on('processing.dt', dataTableProcessing);
// Make our little list sortable
$layoutAssignSortable.sortable({
cancel: '.ui-state-disabled',
update: function(event, ui) {
updateSortablePositions();
},
});
// Bind to the existing items in the list
$layoutAssignSortable.on('click', '.layout-remove', function(ev) {
$(ev.currentTarget).parent().remove();
updateSortablePositions();
});
// Bind the filter form
layoutAssignFilter.find('input, select').change(function() {
layoutTable.ajax.reload();
});
// Adjust the datatable width once we've activated the tab
$(dialog).find('.nav-tabs a').on('shown.bs.tab', function(event) {
if ($(event.target).attr('href') === '#tab-layouts') {
layoutAssignFilter.find('input, select').prop('disabled', false);
layoutTable.columns.adjust().draw();
}
});
};
window.campaignFormSubmit = function($form) {
// Process layouts to add
layoutAssignSubmit($form);
// disable inputs from layout assignment filter
// we do not want to submit them.
$('.layoutAssignFilterOptions').find('input, select').prop('disabled', true);
// Submit form
$form.submit();
};
function layoutAssignSubmit($form) {
if (parseInt($form.find('input[name="manageLayouts"]').val()) === 1) {
// Get the final sortable positions
const finalLayoutPositions = [];
$('#LayoutAssignSortable').find('li').each(function(key, el) {
finalLayoutPositions.push($(el).data('layoutId'));
});
// Build the array of layouts
for (let i = 0; i < finalLayoutPositions.length; i++) {
$('').attr({
type: 'hidden',
name: 'layoutIds[' + i + ']',
}).val(finalLayoutPositions[i]).appendTo($form.find('#assignLayouts'));
}
}
}
/**
* Called when the campaign add form is opened
* @param dialog
*/
window.campaignAddFormOpen = function(dialog) {
// setup checkbox behaviour for cycle based playback
formHelpers.setupCheckboxInputFields(
$(dialog).find('form'),
'input[name="cyclePlaybackEnabled"]',
'.cycle-based-playback',
'.no-cycle-based-playback',
);
const $type = $(dialog).find('select[name=type]');
const $cycleBased = $('input[name="cyclePlaybackEnabled"]');
$(dialog).find('.campaign-type-ad').toggle($type.val() === 'ad');
$type.on('change', function() {
$(dialog).find('.campaign-type-list').toggle($type.val() !== 'ad');
$(dialog).find('.campaign-type-ad').toggle($type.val() === 'ad');
$(dialog).find('.cycle-based-playback')
.toggle($cycleBased.is(':checked') && $type.val() !== 'ad');
$(dialog).find('.no-cycle-based-playback')
.toggle(!$cycleBased.is(':checked') && $type.val() !== 'ad');
});
};
/**
* Called when the campaign add form is submitted.
* @param xhr
* @param form
*/
window.campaignAddFormSubmitCallback = function(xhr, form) {
if (xhr.success) {
if (xhr.data.type === 'ad') {
// Navigate to the campaign builder
} else {
// Open the edit form.
XiboFormRender(
$(form).data('editFormUrl').replace(':id', xhr.data.campaignId),
);
}
}
};