/**
* This object will handle all the Template Library functionalities
*
* @class lexisnexis.component.templateLibrary
*/
jQuery.namespace('lexisnexis.component');
lexisnexis.component.templateLibrary = lexisnexis.component.Table.extend({
data : {
searchFieldId : "#tl-name" ,
serachAddedDate : "#tl-addedDate" ,
serachToDate : "#tl-toDate" ,
defaultSortColumn : "Date Added" ,
defaultSecondarySortColumn : "Template Name" ,
previousVal: '',
delay : (function(){
var timer = 0;
return function(callback, ms){
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})()
},
/**
*
* @method ready
*/
ready : function() {
var cs = this;
try {
$('#tl-name').val("");
$('#tl-addedDate').val("");
$('#tl-toDate').val("");
cs.enableSearchOnTable( [
{
id : 'tl-addedDate',
type : 'dateRangeStart',
limit : 10,
validate : true,
table : cs.data.table
},
{
id : 'tl-toDate',
type : 'dateRangeEnd',
limit : 10,
validate : true,
table : cs.data.table,
startDateId : 'tl-addedDate',
errorMsg : "The 'to' date is before the 'added' date."
}
] );
cs.setupDateFields();
cs.registerSearch();
cs.setupViewBy();
cs.initializeTable();
cs.registerDownLoadAction();
} catch (err) {
LN.debug("error "+err);
}
},
/**
* search event handler
*
* @method registerSearch
*/
registerSearch: function() {
var cs = this;
$(cs.data.searchFieldId).on('keyup', function(e) {
var isValidSearch=true;
if (!isValidateSearch(e,cs.data.searchFieldId, false)) {
isValidSearch= false;
cs.data.previousVal = $(cs.data.searchFieldId).val();
}
cs.data.delay(function(){
if(isValidSearch && isValidTextLength(cs,$(cs.data.searchFieldId).val(),3)){
$(cs.data.tableId).DataTable().ajax.reload(function(data){
cs.noDataCleanup(data.iTotalDisplayRecords);
});
}
}, 1000 );
});
},
/**
* @method setupMaxlengthForIE9
* sets maximum length allowed for template for IE9 browser
*/
setupMaxlengthForIE9 : function() {
var cs = this;
cs.data.browser = LN.getNavigatorData();
if (cs.data.browser.is_ie9) {
var $templatesName = $("#myTemplatesName");
$templatesName.off("keyup keydown");
$templatesName.on("keyup keydown", cs.handleIe9KeyEvents);
}
},
handleIe9KeyEvents : function() {
var cs = this;
var value = $(cs).val();
var left = 60 - value.length;
if(left < 0) {
$(cs).val( value.slice(0, left) );
left = 0;
}
},
/**
* @method setupViewBy
*/
setupViewBy : function() {
var cs = this, txt = '', idx = -1;
var $viewBy = $('#btn-viewby');
var caret = $viewBy.html();
idx = caret.indexOf("<span");
if (idx > -1) {
caret = caret.substring(idx);
}
$('#mostRecent').on('click',function() {
txt = $(this).find('span').html();
$viewBy.html(txt+caret);
cs.data.defaultSortColumn="dateShared";
cs.data.viewByClicked = "mostRecent";
$(cs.data.table).dataTable().fnDestroy();
cs.initializeTable();
$("#mostPopular").removeClass('active');
$("#mostRecent").addClass('active');
});
$('#mostPopular').on('click',function() {
txt = $(this).find('span').html();
$viewBy.html(txt+caret);
cs.data.defaultSortColumn="downloads";
cs.data.viewByClicked = "mostPopular";
$("#mostRecent").removeClass('active');
$("#mostPopular").addClass('active');
$(cs.data.table).dataTable().fnDestroy();
cs.initializeTable();
});
},
/**
* initializes the dataTable
* @method initializeTable
*/
initializeTable : function() {
var cs = this;
LN.debug("initializeTable called");
var prevColumnNamesArray=cs.getCurrentColumnNamesArray();
$(cs.data.tableId).dataTable().fnDestroy();
cs.data.table = $(cs.data.tableId).dataTable({
"dom": '<>rt<"bottom"ilp>',
"scrollY" : "400px",
"sScrollX" : "100%",
"sScrollXInner" : "100%",
"scrollCollapse" : true,
"bAutoWidth" : false,
"bFilter" : false,
"iTotalRecords" : "dataTableModel.iTotalRecords",
"iDisplayLength" : 100,
"processing" : false,
"serverSide" : true,
"bResponsive" : false,
"ordering" : true,
"bDeferRender" : true,
"ajax" : {
"cache" : false,
"url" : 'getTemplateLibraryDetails',
"method" : "POST",
"dataType" : "json",
"data" : function(d) {
var columnNamesArray = cs.getCurrentColumnNamesArray();
LN.debug("data called");
return $.extend({}, d, {
"columnNames" : columnNamesArray.length > 0 ? columnNamesArray : prevColumnNamesArray ,
"templateName" : $('#tl-name').val() ,
"addedDate" : $('#tl-addedDate').val(),
"toDate" : $('#tl-toDate').val()
});
},
'beforeSend': function(xhr) {
cs.data.currentScrollLeft = $(cs.data.tableId).parent().scrollLeft();
xhr.setRequestHeader('X-TransactionID', LN.TRANSACTION_ID);
$('#tl-name').attr('disabled', 'disabled');
$('#tl-addedDate').attr('disabled', 'disabled');
$('#tl-toDate').attr('disabled', 'disabled');
cs.handleBeforeAjax(cs);
},
'complete' : function(obj) {
$.fn.DataTable.ext.pager.numbers_length = 5;
cs.handleAfterComplete(cs);
cs.addGotoPageComponentPPM("ln_template_library_list","templateLibraryTable_gotobtn","templateLibraryTableId_gototxt");
//$(".dataTables_info").css({"text-align":"left", "padding-left":"10px"});
cs.registerFilterCriteriaEvents();
cs.registerAddEvents();
cs.registerRemoveEvents();
$('#tl-name').removeAttr('disabled');
$('#tl-addedDate').removeAttr('disabled');
$('#tl-toDate').removeAttr('disabled');
cs.data.table.fnAdjustColumnSizing(false);
$(cs.data.tableId).parent().scrollLeft(cs.data.currentScrollLeft);
if (typeof cs.data.viewByClicked != 'undefined') {
var $tableScroll = $(cs.data.tableId).closest('div.dataTables_scroll');
var $tableHead = $tableScroll.find('div.dataTables_scrollHead table thead');
if ( cs.data.viewByClicked === "mostRecent") {
$tableHead.find('th[id=Date_Added]').removeClass("sort_2nd sorting").addClass("sorting_desc");
}
$tableHead.find('th[id=Template_Name]').removeClass("sort_2nd sorting").addClass("sort_2nd sorting_asc");
cs.data.dateSharedClicked = null;
}
cs.data.url = cs.getURL();
}
},
"order" : [
[prevColumnNamesArray.indexOf(cs.data.defaultSortColumn),"desc" ],
[prevColumnNamesArray.indexOf(cs.data.defaultSecondarySortColumn),"asc" ]
],
"columnDefs" : [
{
"sClass":"ln-text-align-left",
"width" : "30%",
"targets": 'Template_Name',
"render" : function(data, type, row) {
return ['<span class="templateName">',
data,
'</span><br/><span class="ln-downloadsColor">',
numeral(row[6]).format('(0,0)'), //Downloads
' Downloads</span> | <a href="" onclick="return false;" class="a-filterCriteria" data-idVal="',
row[4], //Add
'">Filter Criteria</a>'
].join('');
}
},
{
"sClass":"ln-text-align-left",
"width" : "30%",
"targets" : 'Description'
},
{
"width" : "10%",
"targets" :'Date_Added'
},
{
"sClass":"ln-text-align-left",
"width" : "16%",
"targets" :'Author'
},
{
"width" : "7%",
"targets" : 'Add' ,
"orderable": false,
"render" : function(data, type, row) {
var html = "";
if (data && data !== "") {
html = ["<span class='fa fa-download fa-lg' data-idVal='", data, "' data-templateName='", row[0], "' ></span>"].join('');
}
return html;
}
},
{
"width" : "7%",
"targets" : 'Remove',
"orderable": false ,
"render" : function(data, type, row) {
var html = "";
if (data && data !== "") {
html = ["<span class='fa fa-close fa-lg' data-idVal='", data, "'></span>"].join('');
}
return html;
}
},
{
"sClass":"ln-display-none",
"targets" : ['downloads' , 'dateShared' ]
}
],
"fnPreDrawCallback" : function(oSettings) {
if (oSettings.aaSorting[0] && oSettings.aaSorting[0][0] !== prevColumnNamesArray.indexOf(cs.data.defaultSortColumn) ) {
cs.data.manualsort = true;
}
return cs.handlePreDrawCallback(oSettings, cs);
},
"fnDrawCallback" : function(oSettings) {
cs.handleDrawCallback(oSettings, cs);
},
// Function called for dataTables
"fnInitComplete" : function(oSettings, json) {
cs.handleInitComplete(oSettings, cs);
}
});
cs.data.table.on( 'column-sizing.dt', function ( e, settings, details ) {
//cs.adjustFixedColumnRowHeights(cs);
});
},
/**
* This Method will generate the Active Filter Summary
* @method registerFilterCriteriaEvents
*/
registerFilterCriteriaEvents : function() {
var $filterElem = $('table tr td a.a-filterCriteria');
$filterElem.on('click',function(e) {
e.preventDefault();
var templateId = $(this).attr('data-idVal') ;
var cs = this;
$.ajax({
cache : false,
'data':{
"templateId" : templateId
},
'url' : LN.getContextPath() + "/getTemplateLibraryActiveFilterSummary",
'method' : 'post',
beforeSend : function(xhr) {
$("#activeFiltersModal").html("");
},
'success' : function(data, textStatus, jqXHR) {
try {
LN.debug(data);
$( 'div#moreFiltersDialog' ).modal('show');
$("#activeFiltersModal").html(data);
} catch (err) {
// growl the error
LN.debug("Error in getting the Active Filter message: "+ err);
}
}
});
})
},
registerRemoveEvents : function() {
var cs = this;
var $removeElem = $('table tr td span.fa-close');
$removeElem.on('click',function(e) {
var $this = $(this);
var templateId = $this.attr('data-idVal');
e.preventDefault();
var dataSet = $(cs.data.dataSetId).val();
$.ajax({
cache : false,
method : "POST",
dataType : "json",
url : "removeTemplateFromLibrary" ,
data : {
'templateId' : templateId
},
beforeSend : function(xhr) {
cs.data.currentScrollLeft = $(cs.data.tableId).parent().scrollLeft();
xhr.setRequestHeader('X-TransactionID', LN.TRANSACTION_ID);
$('#tl-name').attr('disabled', 'disabled');
$('#tl-addedDate').attr('disabled', 'disabled');
$('#tl-toDate').attr('disabled', 'disabled');
cs.handleBeforeAjax(cs);
}
})
.complete(function(data) {
$('#tl-name').removeAttr('disabled');
$('#tl-addedDate').removeAttr('disabled');
$('#tl-toDate').removeAttr('disabled');
if (typeof data.success != 'undefined') {
$.growl({
title: "",
message: "The removing of template from library was successful."
});
$(cs.data.table).dataTable().fnDestroy();
cs.initializeTable();
} else {
$.growl({
title: "",
message: "An error occurred while removing the template."
});
}
});
});
},
setupDateFields : function(){
var cs = this,
$addedDate = $('#tl-addedDate'),
$toDate = $('#tl-toDate'),
$addedDatePicker = $('#tl-addedDatePicker'),
$toDatePicker = $('#tl-toDatePicker');
// Clear any residual error messages.
$('#errorMessage').text('');
$addedDate.val("");
$toDate.val("");
// Keep the datetimepicker logic after the input field's associated with the date pickers are populated.
// This is necessary to set up the date pickers properly with respect to the popup calendars initial dates.
$addedDatePicker.datetimepicker({
//Decided to not force a max date on this field to allow for a better user experience.
//The date picker behaves very assertive when enforcing the max date when set. It corrects
//the date by reestablishing the original date prior to the typing that made it exceed the max.
//This behavior is not acceptable. However, there is logic that determines whether to enable
//or disable the SAVE button that will take care of the max date issue. This line was commented out:
//maxDate : moment(currentDate.setMonth(currentDate.getMonth() + 12)),
format : 'MM/DD/YYYY',
useCurrent : false
});
$toDatePicker.datetimepicker({
format : 'MM/DD/YYYY',
useCurrent : false
});
$addedDatePicker.on("dp.change",function (e) {
if (e.date == null) {
return false;
}
e.date.hours(0);
e.date.minutes(0);
e.date.seconds(0);
e.date.milliseconds(0);
$toDatePicker.data("DateTimePicker").minDate(e.date);
if ($addedDate.attr('data-currentDate') === ""+cs.parseDate($addedDate.val())) {
$addedDate.removeClass('disableKeyUpEvent').addClass('disableKeyUpEvent');
}
}).on("dp.hide",function (e) {
$(e.currentTarget).find('input').keyup();
}).on("dp.show",function (e) {
var elem = $(e.currentTarget).find('input');
if(elem.val() != ''){
var value = cs.parseDate(elem.val());
$addedDate.attr('data-currentDate',cs.parseDate($addedDate.val()));
$(e.currentTarget).data('DateTimePicker').date(moment(value));
}
});
$toDatePicker.on("dp.change",function (e) {
if (e.date == null) {
return false;
}
var addedDate = cs.parseDate($addedDate.val());
e.date.hours(0);
e.date.minutes(0);
e.date.seconds(0);
e.date.milliseconds(0);
if(addedDate !=null ) {
if(e.date.isBefore(addedDate)) {
$toDatePicker.data("DateTimePicker").minDate(e.date);
} else {
$toDatePicker.data("DateTimePicker").minDate(addedDate);
}
}
if ($toDate.attr('data-currentDate') === ""+cs.parseDate($toDate.val())) {
$toDate.removeClass('disableKeyUpEvent').addClass('disableKeyUpEvent');
}
}).on("dp.hide",function (e) {
$(e.currentTarget).find('input').keyup();
}).on("dp.show",function (e) {
var elem = $(e.currentTarget).find('input');
if(elem.val() != ''){
var value = cs.parseDate(elem.val());
$toDate.attr('data-currentDate',cs.parseDate($toDate.val()));
$(e.currentTarget).data('DateTimePicker').date(moment(value));
}
});
$('#tl-addedDate-error').hide();
$('#tl-toDate-error').hide();
// Fire keyup events to allow validation of the programmatically set dates.
// $('#tl-addedDate').keyup();
// $('#tl-toDate').keyup();
},
getJSONDate : function(dateString){
var dateArgs = dateString.match(/\d{1,4}/g),
year = dateArgs[2],
month = parseInt(dateArgs[0]) - 1,
day = dateArgs[1],
hour = 2,
minutes = 0;
var d = new Date(year,month,day,hour,minutes);
d.setFullYear(year);
return d.toJSON();
},
getDateAsString : function(dateObj){
var date = dateObj != null ? dateObj : new Date();
var month = date.getMonth()+1;
var mPad = month < 10 ? '0' : '';
var day = date.getDate();
var dPad = day < 10 ? '0' : '';
return [mPad,month,'/',dPad,day,'/',date.getFullYear()].join('');
},
parseJSONDate : function(value) {
if (typeof value === 'string') {
var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)\+(\d{4})$/.exec(value);
if (a) {
var dt = new Date(Date.UTC(a[1], a[2] - 1, a[3], a[4], a[5], a[6]));
dt.setFullYear(a[1]);
return dt;
}
}
return value;
},
parseDate : function(dateObj){
var cs = this;
var date = dateObj != null ? dateObj : cs.getDateAsString(new Date());
var pattern = /^([0]?[1-9]|[1][0-2])[/]([0]?[1-9]|[1|2][0-9]|[3][0|1])[/]([0-9]{1,4})$/;
var found = date.match(pattern);
var value = null;
if (found != null) {
value = new Date();
value.setFullYear(found[3]);
value.setMonth(found[1]-1);
value.setDate(found[2]);
value.setHours(0);
value.setMinutes(0);
value.setSeconds(0);
value.setMilliseconds(0);
}
return value;
},
registerAddEvents : function() {
var cs = this;
var $addElem = $('span.fa-download');
$addElem.on('click',function(e) {
e.preventDefault();
LN.debug( "templateName ..."+ templateId) ;
var templateId= $(this).attr("data-idval") ;
var templateName= $(this).attr("data-templateName") ;
var dataSetId = $("#ln_topmenu_dataset").attr("datasetkey") ;
$.ajax({
url: LN.getContextPath()+'/validateSubClientPermissions',
data: { templateId: templateId,
dataSetId: dataSetId
},
async: false,
method : 'post',
cache:true,
dataType : "json",
success: function(data){
$("#templateId").val(templateId);
$("#templateName").val(templateName);
$('#addToMyTemplatesModal').modal({
backdrop : 'static',
keyboard: 'false'
});
if(data) {
$("#ln-errorMsgSaveTemp").html("This template will be modified to match your sub-client permissions.");
}
}
});
});
},
registerDownLoadAction : function() {
var cs = this;
$("#addToMyTemplatesSave").on("click", function(e) {
if(cs.validateDownLoad(cs)){
cs.saveTemplateFromLibrary();
$(".ln-errorMsgTemplateLibrary").html("");
}
});
$("#addToMyTemplatesCancel,#addToMyTemplatesCross").on("click", function(e) {
cs.clearAddToTemplateModal() ;
});
},
clearAddToTemplateModal : function () {
$('#templateName').val("");
$('#ln-errorMsgSaveTemp').html("");
$("#addToMyTemplatesModal .error").html("");
$("#addToMyTemplatesModal").removeClass("error");
$("#addToMyTemplatesModal").modal('hide');
},
validateDownLoad: function(cs) {
var name = $('#templateName').val();
if (!isValidateSearch(this.event,'#templateName', false)) {
return false ;
}
if(name.trim()=="") {
$("#ln-errorMsgSaveTemp").html("Template name cannot be empty.");
return false;
} else {
return true;
}
},
saveTemplateFromLibrary : function(isPermissionChanged) {
var cs = this;
var templateId = $('#templateId').val()
var templateName = $('#templateName').val();
var dataSetId = $("#ln_topmenu_dataset").attr("datasetkey") ;
$.ajax({
cache : false,
method : "POST",
dataType : "json",
url : "addTemplateFromLibrary",
data : {
"templateName" : templateName ,
"templateId" : templateId ,
"dataSetId": dataSetId
},
beforeSend : function(xhr) {
xhr.setRequestHeader('X-TransactionID', LN.TRANSACTION_ID);
}
})
.done(function(data, textStatus, jqXHR) {
LN.debug("Inserted Template into My Templates");
if(data && typeof data.error != "undefined"){
$('#ln-errorMsgSaveTemp').html(data.error);
} else {
$.growl({
title: "",
message: ['Template "'+templateName+'" was added to your My Templates page.', ""].join()
});
$(cs.data.table).dataTable().fnDestroy();
cs.initializeTable();
cs.clearAddToTemplateModal();
}
})
.error(function(jqXHR, textStatus, errorThrown) {
LN.debug("Add to My Templates Insertion Failed");
});
},
/**
* @class templateLibrary
* @method enableSearchOnTable
* @description Searches the table by reloading the table with the ajax.<br>
* Currently, if validation is enabled then basic validation for name fields will be done.<br>
* Can be modified further to support almost all validations<br>
*/
enableSearchOnTable : function(obj) {
var cs = this;
var errorFlag = false;
cs.data.searchFields = obj;
if (typeof obj != 'undefined' && obj.length > 0) {
$("#"+obj[0].id).closest('form').validate( {
focusInvalid : true,
errorPlacement : function(error, element) {
var $elem = $(element), targetElem = element,
errorId = $elem.attr('data-idVal');
if (typeof errorId != 'undefined') {
var $eElement = $('#'+errorId);
element = $eElement.length > 0 ? $eElement[0] : element;
}
error.insertAfter(element);
},
errorElement : 'div'
} );
}
$.validator.addMethod("dateValidator", function(value, element) {
var pattern = /^([0]?[1-9]|[1][0-2])[/]([0]?[1-9]|[1|2][0-9]|[3][0|1])[/]([0-9]{4})$/;
$("#errorMessage").text('');
return value === "" || pattern.test(value);
}, "Please enter date using the format MM/DD/YYYY.");
$.each(obj, function(index, searchBox) {
var that = searchBox;
var $that = $('#' + that.id);
if (typeof searchBox.type !== 'undefined') {
if (searchBox.type === 'dateRangeStart') {
$.validator.addMethod("dateRangeStartValidator", function(value, element) {
if(value == null){
return false;
} else if (value === "") {
return true;
}
var currentDate = new Date();
var enteredDate = cs.parseDate(value);
return(enteredDate <= currentDate);
}, "Please enter a date not to exceed today's date.");
if(that.validate) {
$that.rules( 'add', {
required : false,
maxlength : 10,
dateValidator : true,
dateRangeStartValidator : true
} );
}
} else if (searchBox.type === 'dateRangeEnd') {
var errorMsg = "The end date is before the start date.";
if (typeof searchBox.errorMsg !== 'undefined') {
errorMsg = searchBox.errorMsg;
}
$.validator.addMethod("dateRangeEndValidator", function(value, element) {
if(value == null){
return false;
} else if (value === "") {
return true;
}
var enteredDate = cs.parseDate(value);
var startDate = cs.parseDate($('#'+searchBox.startDateId).val());
return !(enteredDate < startDate);
}, errorMsg);
if(that.validate) {
$that.rules( 'add', {
required : false,
maxlength : 10,
dateValidator : true,
dateRangeEndValidator : true
} );
}
} else if (searchBox.type === 'nospecialcharForName') {
if(that.validate) {
$that.rules( 'add', {
required : false,
nospecialchar : true,
nonumber : true
} );
}
}
} else {
if(that.validate) {
$that.rules( 'add', {
required : false,
nospecialchar : true
} );
}
}
$that.on('keyup', function(e) {
//DE1988 - The Available box in the filter gets refreshed for key down events Starts
if(!LN.isFnKeyPressed(e)){
return false;
}
//DE1988 - The Available box in the filter gets refreshed for key down events Ends
cs.data.initialize = false;
var keycode = e.keyCode;
var enteredValue = this.value === $(this).attr('placeholder') ? '' : this.value;
if(that.validate) {
if(!$(this).closest('form').valid()) {
return false;
}
}
var $target = $("#"+e.currentTarget.id);
if ($target.hasClass('disableKeyUpEvent')) {
$target.removeClass('disableKeyUpEvent');
return false;
}
cs.data.searchDone = enteredValue.length == 0 ? false : true;
cs.data.ajaxreload = true;
if ( that.limit ) {
if ( enteredValue.length >= that.limit || ( (enteredValue.length == that.limit - 1 || enteredValue.length == 0) && ( keycode == 8 || keycode == 46 ) ) ) {
cs.data.delay(function(){
cs.data.table.fnReloadAjax(LN.getContextPath()+'/getTemplateLibraryDetails');
}, 1000 );
}
}
});
});
}
});// end class