periodicjs.ext.asyncadmin
Version:
An authentication extension for periodicjs that uses passport to authenticate user sessions.
1,537 lines (1,419 loc) • 52 kB
JavaScript
'use strict';
var debounce = require('debounce');
var ajaxlinks,
// ajaxFormies = {},
// summernotes,
summernoteContentEditors = {},
pluralize = require('pluralize'),
capitalize = require('capitalize'),
moment = require('moment'),
Pushie = require('pushie'),
Bindie = require('bindie'),
Formie = require('formie'),
forbject = require('forbject'),
querystring = require('querystring'),
Stylie = require('stylie'),
platterjs = require('platterjs'),
io = require('socket.io-client'),
socket,
asyncAdminPushie,
ejs = require('ejs'),
content_attribute_template,
content_attribute_HTML,
content_attribute_content_html,
async = require('async'),
classie = require('classie'),
CodeMirror = require('codemirror'),
StylieNotification = require('stylie.notifications'),
StylieModals = require('stylie.modals'),
StylieTabs = require('stylie.tabs'),
StylieDatalist = require('./datalist'),
StylieMedialist = require('./medialist'),
StylieFilterlist = require('./filterlist'),
StylieTagManager = require('./tagman'),
StylieSortlist = require('./sortlist'),
StylieTextEditor = require('./stylieeditor'),
data_tables = require('../../controller/data_tables'),
AdminModal,
open_modal_buttons,
asyncHTMLWrapper,
asyncHTMLContentContainer,
asyncContentSelector = '#ts-asyncadmin-content-container',
asyncAdminContentElement,
adminConsoleElement,
adminConsoleElementContent,
adminConsoleSpanContainer,
codeMirrorJSEditorsElements,
admin_command_inputElement,
admin_command_submit_buttonElement,
admin_command_submitForm,
codeMirrors = {},
flashMessageArray = [],
asyncFlashFunctions = [],
request = require('superagent'),
session_timeout_interval,
timeoutWarning,
isClearingConsole = false,
mtpms,
search_result_template,
adminButtonElement,
servermodalElement,
mobile_nav_menu,
mobile_nav_menu_overlay,
menuTriggerElement,
search_menu_content,
search_menu_input,
nav_header,
consolePlatter,
preloaderElement,
confirmDeleteYes,
datalistelements,
medialistelements,
filterlistelements,
tagmanagerelements,
sortlistelements,
confirmdelete_modal_element,
alreadyAttachedAppResponse = false,
adminCommandListIndex = 0,
adminCommandList = [],
AdminFormies = {},
AdminTagManagers = {},
StylieDataLists = {},
StylieTab = {};
require('../../node_modules/codemirror/addon/edit/matchbrackets');
require('../../node_modules/codemirror/addon/hint/css-hint');
require('../../node_modules/codemirror/addon/hint/html-hint');
require('../../node_modules/codemirror/addon/hint/javascript-hint');
require('../../node_modules/codemirror/addon/hint/show-hint');
require('../../node_modules/codemirror/addon/lint/css-lint');
require('../../node_modules/codemirror/addon/lint/javascript-lint');
// require('../../node_modules/codemirror/addon/lint/json-lint');
require('../../node_modules/codemirror/addon/lint/lint');
// require('../../node_modules/codemirror/addon/lint/html-lint');
require('../../node_modules/codemirror/addon/comment/comment');
require('../../node_modules/codemirror/addon/comment/continuecomment');
require('../../node_modules/codemirror/addon/fold/foldcode');
require('../../node_modules/codemirror/addon/fold/comment-fold');
require('../../node_modules/codemirror/addon/fold/indent-fold');
require('../../node_modules/codemirror/addon/fold/brace-fold');
require('../../node_modules/codemirror/addon/fold/foldgutter');
require('../../node_modules/codemirror/mode/css/css');
require('../../node_modules/codemirror/mode/htmlembedded/htmlembedded');
require('../../node_modules/codemirror/mode/htmlmixed/htmlmixed');
require('../../node_modules/codemirror/mode/javascript/javascript');
window.StylieModals = StylieModals;
// window.ajaxFormies = ajaxFormies;
window.Formie = Formie;
window.Bindie = Bindie;
window.Stylie = Stylie;
window.classie = classie;
var openModalButtonListener = function (e) {
e.preventDefault();
// console.log(e.target);
// console.log(e.target.getAttribute('data-tsmodal-id'));
AdminModal.show(e.target.getAttribute('data-tsmodal-id'));
return false;
};
var preventDefaultClick = function (e) {
e.preventDefault();
return;
};
var initFlashMessage = function () {
window.showFlashNotifications({
flash_messages: window.periodic_flash_messages,
ttl: 7000,
wrapper: document.querySelector('.ts-pushmenu-scroller-inner')
});
};
var showPreloader = function (element) {
var plElement = element || preloaderElement;
classie.remove(plElement, 'hide');
classie.remove(plElement, 'hide-preloading');
};
window.showPreloader = showPreloader;
var endPreloader = function (element) {
var plElement = element || preloaderElement;
classie.add(plElement, 'hide-preloading');
var t = setTimeout(function () {
clearTimeout(t);
classie.add(plElement, 'hide');
}, 400);
};
window.endPreloader = endPreloader;
var initSummernote = function () {
var summernotes = document.querySelectorAll('.ts-summernote');
try {
if (typeof summernotes !== 'undefined' && summernotes.length > 0) {
for (var x = 0; x < summernotes.length; x++) {
summernoteContentEditors[summernotes[x].getAttribute('id')] = new StylieTextEditor({
element: summernotes[x]
}).init();
}
}
window.summernoteContentEditors = summernoteContentEditors;
}
catch (e) {
console.error(e);
window.showErrorNotificaton({
message: e.message
});
}
};
var initModalWindows = function () {
open_modal_buttons = document.querySelectorAll('.ts-open-modal');
if (open_modal_buttons.length > 0) {
// open_modal_buttons
AdminModal = new StylieModals({});
AdminModal.on('showModal', function () {
classie.add(document.body, 'ts-modal-showing');
});
AdminModal.on('hideModal', function () {
classie.remove(document.body, 'ts-modal-showing');
});
window.AdminModal = AdminModal;
}
for (var q = 0; q < open_modal_buttons.length; q++) {
open_modal_buttons[q].addEventListener('click', openModalButtonListener, false);
}
};
var initCodemirrors = function () {
codeMirrorJSEditorsElements = document.querySelectorAll('.codemirroreditor');
for (var cm = 0; cm < codeMirrorJSEditorsElements.length; cm++) {
// console.log('codeMirrorJSEditorsElements[cm]', codeMirrorJSEditorsElements[cm]);
codeMirrors[codeMirrorJSEditorsElements[cm].id] = CodeMirror.fromTextArea(
codeMirrorJSEditorsElements[cm], {
lineNumbers: true,
lineWrapping: true,
matchBrackets: true,
autoCloseBrackets: true,
mode: (codeMirrorJSEditorsElements[cm].getAttribute('data-htmlonly')) ? 'text/html' : 'application/json',
indentUnit: 2,
indentWithTabs: true,
'overflow-y': 'hidden',
'overflow-x': 'auto',
lint: true,
gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter'],
foldGutter: true,
readOnly: (codeMirrorJSEditorsElements[cm].getAttribute('readonly')) ? 'nocursor' : false
}
);
}
if (window.StylieTab && window.StylieTab['refresh-tabs']) {
window.StylieTab['refresh-tabs'].on('tabsShowIndex', function ( /*idex*/ ) {
if (window.codeMirrors && window.codeMirrors['genericdoc-codemirror']) {
window.codeMirrors['genericdoc-codemirror'].refresh();
}
});
}
// window.CodeMirror = CodeMirror;
window.codeMirrors = codeMirrors;
};
var initDatalists = function () {
datalistelements = document.querySelectorAll('.ts-datalist-tagged');
for (var q = 0; q < datalistelements.length; q++) {
StylieDataLists[datalistelements[q].id] = new StylieDatalist({
element: datalistelements[q]
});
}
};
var initMedialists = function () {
medialistelements = document.querySelectorAll('.ts-medialist-tagged');
for (var q = 0; q < medialistelements.length; q++) {
StylieDataLists[medialistelements[q].id] = new StylieMedialist({
element: medialistelements[q]
});
}
};
var initFilterlists = function () {
tagmanagerelements = document.querySelectorAll('.asyncadmin-ts-tagmanager');
for (var p = 0; p < tagmanagerelements.length; p++) {
AdminTagManagers[tagmanagerelements[p].id] = new StylieTagManager({
element: tagmanagerelements[p],
filterkeys: tagmanagerelements[p].getAttribute('data-filterkeys')
});
}
filterlistelements = document.querySelectorAll('.asyncadmin-ts-filterlist');
for (var q = 0; q < filterlistelements.length; q++) {
StylieDataLists[filterlistelements[q].id] = new StylieFilterlist({
element: filterlistelements[q],
filterkeys: filterlistelements[q].getAttribute('data-filterkeys')
});
}
sortlistelements = document.querySelectorAll('.asyncadmin-ts-sortlist');
for (var r = 0; r < sortlistelements.length; r++) {
StylieDataLists[sortlistelements[r].id] = new StylieSortlist({
element: sortlistelements[r],
sortkeys: sortlistelements[r].getAttribute('data-sortkeys')
});
}
window.AdminTagManagers = AdminTagManagers;
};
var logToAdminConsole = function (data) {
var logInfoElement = document.createElement('div'),
adminMessageLevel = document.createElement('span'),
adminMessageMessage = document.createElement('span'),
adminMessageMeta = document.createElement('pre'),
acp = document.querySelector('#adminConsole_pltr-pane-wrapper'),
acc = document.querySelector('#ts-admin-console-content'),
acwc = window.consolePlatter.config(),
loglevel = data.level || 'log';
classie.add(adminMessageMeta, 'ts-sans-serif');
adminMessageLevel.innerHTML = moment().format('dddd, MMMM Do YYYY, HH:mm:ss ') + ' - (' + loglevel + ') : ';
if (typeof data === 'string') {
adminMessageMessage.innerHTML = data;
adminMessageMeta.innerHTML = JSON.stringify({}, null, ' ');
}
else {
adminMessageMessage.innerHTML = data.msg;
adminMessageMeta.innerHTML = JSON.stringify(data.meta, null, ' ');
}
logInfoElement.appendChild(adminMessageLevel);
logInfoElement.appendChild(adminMessageMessage);
if (data.meta) {
logInfoElement.appendChild(adminMessageMeta);
}
adminConsoleElementContent.appendChild(logInfoElement);
acp.scrollTop = acp.scrollHeight;
if (acwc.windowObjectReference && acwc.windowObjectReference.scrollTo && typeof acwc.windowObjectReference.scrollTo === 'function' && acwc.windowObjectReference.document.querySelector('#ts-admin-console-content')) {
acwc.windowObjectReference.scrollTo(0, acwc.windowObjectReference.document.querySelector('#ts-admin-console-content').scrollHeight);
}
if (acc && acc.childNodes && acc.childNodes.length > 30) {
//console.log('isClearingConsole', isClearingConsole);
isClearingConsole = true;
for (var x = 0; x < (acc.childNodes.length - 30); x++) {
acc.removeChild(acc.childNodes[x]);
}
var t = setTimeout(function () {
isClearingConsole = false;
//console.log('setTimeout isClearingConsole', isClearingConsole);
clearTimeout(t);
}, 5000);
}
};
var handleUncaughtError = function (e, errorMessageTitle) {
console.error(e);
endPreloader();
logToAdminConsole({
msg: (errorMessageTitle) ? errorMessageTitle : 'uncaught error',
level: 'log',
meta: e
});
window.showErrorNotificaton({
message: e.message
});
};
window.handleUncaughtError = handleUncaughtError;
var defaultLoadAjaxPageFormie = function (formElement) {
var ajaxForbject = new forbject(formElement, {
autorefresh: true,
addelementsonrefresh: false,
});
return ajaxForbject;
};
var defaultAjaxFormie = function (formElement) {
var _csrfToken = formElement.querySelector('input[name="_csrf"]') || document.querySelector('input[name="_csrf"]');
var shownotification = true;
var showpreloader = true;
// console.log('formElement', formElement);
if (formElement.getAttribute('data-donotnotify') && formElement.getAttribute('data-donotnotify') === 'do-not-notify') {
shownotification = false;
}
if (formElement.getAttribute('data-donotpreload') && formElement.getAttribute('data-donotpreload') === 'do-not-preload') {
showpreloader = false;
}
return new Formie({
ajaxformselector: '#' + formElement.getAttribute('id'),
// headers: {'customheader':'customvalue'},
postdata: {
'_csrf': _csrfToken.value,
format: 'json'
},
queryparameters: {
'_csrf': _csrfToken.value,
format: 'json'
},
beforesubmitcallback: function (beforeEvent, formElement) {
var beforesubmitFunctionString = formElement.getAttribute('data-beforesubmitfunction'),
beforefn = window[beforesubmitFunctionString],
summernoteTextAreas = formElement.querySelectorAll('textarea.ts-summernote'),
codemirrorTextAreas = formElement.querySelectorAll('textarea.codemirroreditor');
// is object a function?
if (typeof beforefn === 'function') {
beforefn(beforeEvent, formElement);
}
if (showpreloader) {
window.showPreloader();
}
for (var s = 0; s < summernoteTextAreas.length; s++) {
summernoteTextAreas[s].innerHTML = summernoteContentEditors[summernoteTextAreas[s].getAttribute('id')].options.codemirror.getValue();
// summernoteTextAreas[s].innerHTML = $('#' + summernoteTextAreas[s].getAttribute('id')).code();
}
for (var r = 0; r < codemirrorTextAreas.length; r++) {
codemirrorTextAreas[r].innerHTML = codeMirrors[codemirrorTextAreas[r].id].getValue();
codeMirrors[codemirrorTextAreas[r].id].save();
}
},
successcallback: function (response) {
if (showpreloader) {
window.endPreloader();
}
if (shownotification && response.body && response.body.result && response.body.result === 'error') {
window.showStylieNotification({
message: response.body.data.error.message || response.body.data.error,
type: 'error'
});
}
else {
if (shownotification) {
window.showStylieNotification({
message: 'Saved'
});
}
logToAdminConsole({
msg: 'ajax response',
meta: response
});
var successsubmitFunctionString = formElement.getAttribute('data-successsubmitfunction'),
successfn = window[successsubmitFunctionString];
// is object a function?
if (typeof successfn === 'function') {
successfn(response);
}
if (formElement.getAttribute('data-successredirect-href')) {
var successredirecthref = formElement.getAttribute('data-successredirect-href');
loadAjaxPage({
datahref: successredirecthref,
pushState: true
});
}
}
},
errorcallback: function (error, response) {
console.log('error', error);
console.log('response.response', response.response);
try {
var errormessage, jsonmessage;
if (response.body && response.body.error && response.body.error.message) {
errormessage = response.body.error.message;
}
else if (response.body && response.body.result && response.body.result === 'error') {
console.log('response.body', response.body);
errormessage = response.body.data.error.message || response.body.data.error;
}
else {
jsonmessage = JSON.parse(response.response);
errormessage = (jsonmessage && jsonmessage.data) ? jsonmessage.data.error : JSON.stringify(jsonmessage);
}
if (shownotification) {
window.showErrorNotificaton({
message: errormessage
});
}
}
catch (e) {
console.log('e', e);
if (error.message) {
window.showErrorNotificaton({
message: error.message
});
}
else {
window.showErrorNotificaton({
message: error
});
}
}
if (showpreloader) {
window.endPreloader();
}
logToAdminConsole({
msg: error,
meta: response
});
var errorsubmitFunctionString = formElement.getAttribute('data-errorsubmitfunction'),
errorfn = window[errorsubmitFunctionString];
// is object a function?
if (typeof errorfn === 'function') {
errorfn(error, response);
}
}
});
};
var initAjaxFormies = function () {
var ajaxForm;
var ajaxforms = document.querySelectorAll('.async-admin-ajax-forms');
var ajaxPageforms = document.querySelectorAll('.async-admin-ajax-page-forms');
var ct_attr_selector = document.querySelector('#ct-attr-template');
var outputEventListener = function (eventname) {
return function (formObjectData) {
loadAjaxPage({
datahref: window.location.origin + window.location.pathname + '?' + querystring.stringify(formObjectData),
pushState: true,
eventname: eventname
});
// console.log('on eventname[' + eventname + '] formObject', formObjectData);
};
};
if (ct_attr_selector) {
content_attribute_template = ct_attr_selector.innerHTML;
content_attribute_content_html = document.querySelector('#doc-ct-attr');
}
AdminFormies = {};
// console.log('ajaxforms', ajaxforms);
try {
if (ajaxforms && ajaxforms.length > 0) {
for (var x = 0; x < ajaxforms.length; x++) {
ajaxForm = ajaxforms[x];
//ajaxFormies[ajaxForm.getAttribute('name')] =
AdminFormies[ajaxForm.id] = defaultAjaxFormie(ajaxForm);
}
}
if (ajaxPageforms && ajaxPageforms.length > 0) {
for (var y = 0; y < ajaxPageforms.length; y++) {
ajaxForm = ajaxPageforms[y];
//ajaxFormies[ajaxForm.getAttribute('name')] =
AdminFormies[ajaxForm.id] = defaultLoadAjaxPageFormie(ajaxForm);
AdminFormies[ajaxForm.id].on('refresh', outputEventListener('refresh'));
}
}
window.AdminFormies = AdminFormies;
}
catch (e) {
handleUncaughtError(e);
}
};
var defaultTab = function (tabElement) {
try {
return new StylieTabs(tabElement);
}
catch (e) {
throw e;
}
};
var initTabs = function () {
var stylieTab;
var stylietabs = document.querySelectorAll('.ts-tabs'),
tabMap;
//console.log('stylietabs', stylietabs);
try {
var handleSettingsTabChange = function (currentTab) {
// console.log('currentTab', currentTab);
window.location.hash = tabMap[currentTab];
};
if (stylietabs && stylietabs.length > 0) {
for (var x = 0; x < stylietabs.length; x++) {
stylieTab = stylietabs[x];
//stylieTabies[stylieTab.getAttribute('name')] =
StylieTab[stylieTab.id] = defaultTab(stylieTab);
}
}
if (StylieTab['refresh-tabs']) {
tabMap = {
'0': 'basic',
'1': 'advanced'
};
StylieTab['refresh-tabs'].on('tabsShowIndex', handleSettingsTabChange);
if (window.location.hash) {
for (var y in tabMap) {
if (window.location.hash.replace('#', '') === tabMap[y]) {
StylieTab['refresh-tabs'].showTab(y);
}
}
}
}
window.StylieTab = StylieTab;
}
catch (e) {
console.log(e);
window.showErrorNotificaton({
message: e.message
});
}
};
var isMobileNavOpen = function () {
return classie.has(mobile_nav_menu, 'fadeOutLeft') || classie.has(mobile_nav_menu, 'initialState');
};
// var isSearchNavOpen = function () {
// return classie.has(search_menu_content, 'fadeOutUp') || classie.has(search_menu_content, 'initialState');
// };
var controlSearchNav = function () {
classie.remove(search_menu_content, 'initialState');
classie.remove(search_menu_content, 'fadeOutUp');
classie.add(search_menu_content, 'fadeInDown');
};
var closeSearchNav = function () {
setTimeout(function () {
classie.add(search_menu_content, 'fadeOutUp');
classie.remove(search_menu_content, 'fadeInDown');
}, 200);
};
var closeMobileNav = function () {
classie.add(mobile_nav_menu_overlay, 'hide');
classie.add(mobile_nav_menu, 'fadeOutLeft');
classie.remove(mobile_nav_menu, 'fadeInLeft');
};
var controlMobileNav = function () {
closeSearchNav();
if (isMobileNavOpen()) {
classie.remove(mobile_nav_menu, 'initialState');
classie.add(mobile_nav_menu, 'fadeInLeft');
classie.remove(mobile_nav_menu, 'fadeOutLeft');
classie.remove(mobile_nav_menu_overlay, 'hide');
}
else {
closeMobileNav();
}
};
var search_menu_callback = function () {
try {
search_menu_content.innerHTML = 'Searching...';
var searchhtml = ''; //,
// update_main_div;
request
.get('/p-admin/content/search')
.set('x-csrf-token', document.querySelector('input[name=_csrf]').value)
.set('Accept', 'application/json')
.withCredentials()
.query({
format: 'json',
_csrf: document.querySelector('input[name=_csrf]').value,
'searchall-input': this.value
})
.end(function (err, responsedata) {
responsedata.body.moment = moment;
responsedata.body.capitalize = capitalize;
responsedata.body.pluralize = pluralize;
responsedata.body.data_tables = data_tables;
searchhtml = ejs.render(search_result_template, responsedata.body);
search_menu_content.innerHTML = searchhtml;
// update_main_div = document.querySelector('#ts-main-div');
// update_main_div.addEventListener('click', function () {
// console.log('searchhtml', 'clicking');
// }, false);
// update_main_div.addEventListener('click', async_admin_ajax_link_handler, false);
//
});
}
catch (e) {
handleUncaughtError(e, 'ajax page error');
}
// console.log(data);
};
var initAdminSearch = function () {
search_menu_input = document.querySelector('#searchall-input');
search_menu_content = document.querySelector('#ts-search-content');
if (document.querySelector('#searchall-input')) {
document.querySelector('#searchall-input').addEventListener('keydown', debounce(search_menu_callback, 200), false);
// search_menu_input.addEventListener('change', debounce(search_menu_callback, 200), false);
document.querySelector('#searchall-input').addEventListener('focus', controlSearchNav, false);
document.querySelector('#searchall-input').addEventListener('blur', function () {
setTimeout(closeSearchNav, 400);
}, false);
}
};
var confirmDeleteDialog = function (e) {
var eTarget = e.target,
posturl = eTarget.getAttribute('data-href'),
deleteredirecthref = eTarget.getAttribute('data-deleted-redirect-href'),
successfunction = eTarget.getAttribute('data-successfunction'),
beforefunction = eTarget.getAttribute('data-beforefunction'),
ajaxmethod = eTarget.getAttribute('data-ajax-method'),
deleteDialogTitle = eTarget.getAttribute('data-title') || eTarget.getAttribute('title') || 'Please Confirm',
donotnotify = eTarget.getAttribute('data-donotnotify');
e.preventDefault();
confirmDeleteYes.setAttribute('data-href', '#');
confirmDeleteYes.setAttribute('data-href', posturl);
if (ajaxmethod) {
confirmDeleteYes.setAttribute('data-ajax-method', ajaxmethod);
}
if (deleteredirecthref) {
confirmDeleteYes.setAttribute('data-deleted-redirect-href', deleteredirecthref);
}
if (successfunction) {
confirmDeleteYes.setAttribute('data-successfunction', successfunction);
}
if (beforefunction) {
confirmDeleteYes.setAttribute('data-beforefunction', beforefunction);
}
if (donotnotify) {
confirmDeleteYes.setAttribute('data-donotnotify', donotnotify);
}
confirmdelete_modal_element.querySelector('#confirm-dialog-delete-title').innerHTML = deleteDialogTitle;
AdminModal.show('confirmdelete-modal');
};
var deleteContentSubmit = function (e) {
var eTarget = e.target,
posturl = eTarget.getAttribute('data-href'),
postmethod = eTarget.getAttribute('data-ajax-method'),
ajaxrequest;
if (eTarget.getAttribute('data-beforefunction')) {
var beforeFunctionString = eTarget.getAttribute('data-beforefunction'),
beforefn = window[beforeFunctionString];
// is object a function?
if (typeof beforefn === 'function') {
beforefn();
}
}
if (postmethod === 'get') {
ajaxrequest = request.get(posturl);
}
else if (postmethod === 'put') {
ajaxrequest = request.put(posturl);
}
else if (postmethod === 'delete' || postmethod === 'del') {
ajaxrequest = request.del(posturl);
}
else {
ajaxrequest = request.post(posturl);
}
ajaxrequest
.set('x-csrf-token', document.querySelector('input[name=_csrf]').value)
.set('Accept', 'application/json')
.query({
format: 'json'
})
.withCredentials()
.end(handle_ajax_button_response(e));
};
var submitAjaxButton = function (e) {
var eTarget = e.target,
posturl = eTarget.getAttribute('data-href'),
postmethod = eTarget.getAttribute('data-ajax-method'),
ajaxrequest;
showPreloader();
if (postmethod === 'post') {
ajaxrequest = request.post(posturl);
}
else if (postmethod === 'put') {
ajaxrequest = request.put(posturl);
}
else if (postmethod === 'delete' || postmethod === 'del') {
ajaxrequest = request.del(posturl);
}
else {
ajaxrequest = request.get(posturl);
}
// ajaxrequest = (postmethod === 'post') ? request.post(posturl) : request.get(posturl);
if (eTarget.getAttribute('data-beforefunction')) {
var beforeFunctionString = eTarget.getAttribute('data-beforefunction'),
beforefn = window[beforeFunctionString];
// is object a function?
if (typeof beforefn === 'function') {
beforefn();
}
}
ajaxrequest
.set('x-csrf-token', document.querySelector('input[name=_csrf]').value)
.set('Accept', 'application/json')
.query({
format: 'json'
})
.withCredentials()
.end(handle_ajax_button_response(e));
};
var initAjaxDeleteButtonListeners = function () {
var deleteButtons = document.querySelectorAll('.ts-dialog-delete');
if (confirmDeleteYes) {
confirmDeleteYes.addEventListener('click', deleteContentSubmit, false);
}
for (var x in deleteButtons) {
if (typeof deleteButtons[x] === 'object') {
deleteButtons[x].addEventListener('click', confirmDeleteDialog, false);
}
}
};
var initAjaxSubmitButtonListeners = function () {
var ajaxButtons = document.querySelectorAll('.ts-ajax-button');
for (var x in ajaxButtons) {
if (typeof ajaxButtons[x] === 'object') {
ajaxButtons[x].addEventListener('click', submitAjaxButton, false);
}
}
};
window.initAjaxSubmitButtonListeners = initAjaxSubmitButtonListeners;
var loadAjaxPage = function (options, asyncCB) {
var asyncCallback = options.callback || asyncCB || false;
var setPageEvents = function () {
initFlashMessage();
initSummernote();
initAjaxFormies();
initTabs();
initModalWindows();
initCodemirrors();
initAjaxDeleteButtonListeners();
initAjaxSubmitButtonListeners();
initDatalists();
initMedialists();
initFilterlists();
initAjaxLinkEventListeners();
initAdminSearch();
};
// window.console.clear();
closeSearchNav();
closeMobileNav();
try {
var htmlDivElement = document.createElement('div'),
newPageTitle,
newPageContent,
newJavascripts;
showPreloader();
// if (window.$ && window.$('.ts-summernote')) {
// // console.log('window.$(.ts-summernote)', window.$('.ts-summernote'));
// // console.log('window.$(.ts-summernote).summernote({})', window.$('.ts-summernote').summernote({}));
// // window.$('.ts-summernote').summernote({}).destroy();
// }
request
.get(options.datahref)
.withCredentials()
.set('Accept', 'text/html')
.withCredentials()
.end(function (error, res) {
startSessionTimeoutCountner();
// console.log('error', error);
// console.log('res', res);
if (error) {
window.showErrorNotificaton({
message: error.message
});
if (asyncCallback) {
asyncCallback(error);
}
endPreloader();
}
else if (res.error) {
endPreloader();
window.showErrorNotificaton({
message: 'Status [' + res.error.status + ']: ' + res.error.message
});
if (asyncCallback) {
asyncCallback(res.error);
}
endPreloader();
}
else {
if (asyncCallback) {
asyncCallback(null, res.text);
endPreloader();
setPageEvents();
}
else {
window.document.body.scrollTop = 0;
try {
htmlDivElement.innerHTML = res.text;
newPageContent = htmlDivElement.querySelector('#ts-asyncadmin-content-wrapper');
newPageTitle = htmlDivElement.querySelector('#menu-header-stylie').innerHTML;
asyncHTMLWrapper.removeChild(document.querySelector(asyncContentSelector));
document.querySelector('#menu-header-stylie').innerHTML = newPageTitle;
asyncHTMLWrapper.innerHTML = newPageContent.innerHTML;
// console.log('htmlDivElement title', );
window.document.title = htmlDivElement.querySelector('title').innerHTML;
newJavascripts = htmlDivElement.querySelectorAll('script');
for (var j = 0; j < newJavascripts.length; j++) {
if (!newJavascripts[j].src.match('/extensions/periodicjs.ext.asyncadmin/js/asyncadmin.min.js')) {
var newJSScript = document.createElement('script');
if (newJavascripts[j].src) {
newJSScript.src = newJavascripts[j].src;
}
if (newJavascripts[j].id) {
newJSScript.id = newJavascripts[j].id;
}
if (newJavascripts[j].type) {
newJSScript.type = newJavascripts[j].type;
}
// newJSScript.class = newJavascripts[j].class;
newJSScript.innerHTML = newJavascripts[j].innerHTML;
asyncHTMLWrapper.appendChild(newJSScript);
}
}
if (options.pushState) {
// console.log('options.datahref', options.datahref);
asyncAdminPushie.pushHistory({
data: {
datahref: options.datahref
},
title: 'Title:' + options.datahref,
href: options.datahref
});
}
endPreloader();
setPageEvents();
}
catch (ajaxPageError) {
handleUncaughtError(ajaxPageError);
}
}
}
});
}
catch (e) {
handleUncaughtError(e, 'ajax page error');
}
};
var handle_ajax_button_response = function (e) {
var eTarget = e.target;
return function (error, res) {
endPreloader();
if (res && res.body && res.body.result === 'error') {
window.showStylieNotification({
message: res.body.data.error,
ttl: 7000,
type: 'error', // notice, warning, error or success
});
}
else if (res && res.clientError) {
window.showStylieNotification({
message: res.status + ': ' + res.text,
ttl: 7000,
type: 'error', // notice, warning, error or success
});
}
else if (error) {
window.showStylieNotification({
message: error.message,
ttl: 7000,
type: 'error', // notice, warning, error or success
});
}
else {
// console.log('!eTarget.getAttribute(data-donotnotify)', !eTarget.getAttribute('data-donotnotify'));
if (eTarget.getAttribute('data-donotnotify') !== 'do-not-notify') {
var successmessage = 'deleted successfully';
if (classie.has(eTarget, 'ts-dialog-delete')) {
successmessage = 'deleted successfully';
}
else if (res.body.message) {
successmessage = res.body.message;
}
else if (res.body.data && res.body.data.message) {
successmessage = res.body.data.message;
}
else {
successmessage = 'submitted successfully';
}
window.showStylieNotification({
message: successmessage,
ttl: 7000,
type: 'warn', // notice, warning, error or success
});
}
if (eTarget.getAttribute('data-successfunction')) {
var successFunctionString = eTarget.getAttribute('data-successfunction'),
successfn = window[successFunctionString];
// is object a function?
if (typeof successfn === 'function') {
successfn(res.body.data);
}
}
else if (eTarget.getAttribute('data-deleted-redirect-href')) {
var deleteredirecthref = eTarget.getAttribute('data-deleted-redirect-href');
loadAjaxPage({
datahref: deleteredirecthref,
pushState: true
});
}
else if (eTarget.getAttribute('data-redirect-href')) {
var deleteredirecthref = eTarget.getAttribute('data-redirect-href');
loadAjaxPage({
datahref: deleteredirecthref,
pushState: true
});
}
}
};
};
var async_admin_ajax_link_handler = function (e) {
// console.log('async_admin_ajax_link_handler e.target', e.target);
var etarget = e.target,
etargethref = etarget.href || etarget.getAttribute('data-ajax-href');
if (classie.has(etarget, 'async-admin-ajax-link')) {
e.preventDefault();
// console.log('etargethref', etargethref);
loadAjaxPage({
datahref: etargethref,
pushState: true
});
// StyliePushMenu._resetMenu();
return false;
}
if (classie.has(etarget, 'async-admin-ajax-modal')) {
e.preventDefault();
// console.log('etargethref', etargethref);
loadAjaxPage({
datahref: etargethref,
pushState: false
}, function (err, ajaxhtml) {
servermodalElement.querySelector('#servermodal-content').innerHTML = ajaxhtml;
AdminModal.show('servermodal-modal');
});
// StyliePushMenu._resetMenu();
return false;
}
if (classie.has(etarget, 'ts-open-admin-console')) {
e.preventDefault();
showAdminConsoleElementClick();
acecClickHandler(e);
}
};
var statecallback = function (data) {
// console.log('data', data);
if (data && data.datahref) {
loadAjaxPage({
datahref: data.datahref,
pushState: false
});
}
};
var pushstatecallback = function ( /*data*/ ) {
// console.log('data', data);
};
var adminConsoleWindowResizeEventHandler = function ( /*e*/ ) {
//console.log(e);
};
var addStyleSheetToChildWindow = function () {
var childWindowReference = consolePlatter.config().windowObjectReference;
var acwc = window.consolePlatter.config();
var t = setTimeout(function () {
var newstylesheet = document.createElement('link');
newstylesheet.setAttribute('type', 'text/css');
newstylesheet.setAttribute('href', window.location.origin + '/stylesheets/default/periodic.css');
newstylesheet.setAttribute('rel', 'stylesheet');
var newstylesheet2 = document.createElement('link');
newstylesheet2.setAttribute('type', 'text/css');
newstylesheet2.setAttribute('href', window.location.origin + '/extensions/periodicjs.ext.asyncadmin/stylesheets/asyncadmin.css');
newstylesheet2.setAttribute('rel', 'stylesheet');
childWindowReference.document.getElementsByTagName('head')[0].appendChild(newstylesheet);
childWindowReference.document.getElementsByTagName('head')[0].appendChild(newstylesheet2);
classie.add(childWindowReference.document.querySelector('html'), 'ts');
childWindowReference.document.querySelector('body').setAttribute('id', 'admin-console-body');
adminConsoleWindowResizeEventHandler();
if (acwc.windowObjectReference && acwc.windowObjectReference.scrollTo && typeof acwc.windowObjectReference.scrollTo === 'function' && acwc.windowObjectReference.document.querySelector('#ts-admin-console-content')) {
acwc.windowObjectReference.scrollTo(0, acwc.windowObjectReference.document.querySelector('#ts-admin-console-content').scrollHeight);
}
clearTimeout(t);
}, 200);
childWindowReference.window.addEventListener('resize', adminConsoleWindowResizeEventHandler, false);
};
var refresh_session_check = function () {
try {
request
.get('/healthcheck')
.set('Accept', 'application/json')
.withCredentials()
.end(function (error, res) {
if (error) {
window.showErrorNotificaton({
message: error.message
});
}
else if (res.error) {
endPreloader();
window.showErrorNotificaton({
message: 'Status [' + res.error.status + ']: ' + res.error.message
});
}
else {
clearInterval(session_timeout_interval);
startSessionTimeoutCountner();
}
});
}
catch (ajaxPageError) {
handleUncaughtError(ajaxPageError);
}
};
var asyncAdminContentElementClick = function (e) {
var etarget = e.target; //,
// etargethref = etarget.href || etarget.getAttribute('data-ajax-href');
if (!classie.has(etarget, 'ts-open-admin-console')) {
consolePlatter.hidePlatterPane();
}
if (classie.has(etarget, 'ts-continue-session-button')) {
refresh_session_check();
}
// if (classie.has(etarget, 'async-admin-ajax-link')) {
// e.preventDefault();
// // console.log('etargethref', etargethref);
// loadAjaxPage({
// datahref: etargethref,
// pushState: true
// });
// return false;
// }
};
var showAdminConsoleElementClick = function () {
var acp = document.querySelector('#adminConsole_pltr-pane-wrapper');
window.consolePlatter.showPlatterPane();
acp.scrollTop = acp.scrollHeight;
document.querySelector('#admin_command_input').focus();
};
var navOverlayClickHandler = function () {
closeMobileNav();
closeSearchNav();
};
var initAjaxLinkEventListeners = function () {
window.addEventListener('click', async_admin_ajax_link_handler, false);
};
var initEventListeners = function () {
menuTriggerElement.addEventListener('click', controlMobileNav, false);
asyncAdminContentElement.addEventListener('click', asyncAdminContentElementClick, false);
adminButtonElement.addEventListener('click', showAdminConsoleElementClick, false);
mobile_nav_menu_overlay.addEventListener('click', navOverlayClickHandler, false);
};
var initServerSocketCallback = function () {
socket.on('server_callback', function (data) {
var functionName = data.functionName,
serverCallbackFn = window[functionName];
if (typeof serverCallbackFn === 'function') {
serverCallbackFn(data.functionData);
}
});
};
var submit_admin_command = function () {
// console.log('this', this);
// console.log('this.value', this.value);
// console.log('admin_command_inputElement.value', admin_command_inputElement.value);
if (admin_command_inputElement.value) {
adminCommandList.unshift(admin_command_inputElement.value);
adminCommandListIndex = 0;
if (adminCommandList.length > 10) {
adminCommandList.splice(9, (adminCommandList.length - 10));
}
}
var data = admin_command_inputElement.value;
var nt = document.createElement('span');
nt.innerHTML = data;
classie.add(nt, 'ts-text-divider-text-color');
adminConsoleElementContent.lastChild.appendChild(nt);
socket.emit('stdin', data);
admin_command_inputElement.value = '';
};
var admin_input_key_shorcut = function (e) {
var movedir = false;
if (e.keyCode === 38 || e.keyCode === 40) {
admin_command_inputElement.value = adminCommandList[adminCommandListIndex];
}
switch (e.keyCode) {
case 38:
movedir = 'up';
adminCommandListIndex = (adminCommandListIndex < adminCommandList.length - 1) ? adminCommandListIndex + 1 : 0;
break;
case 40:
movedir = 'down';
adminCommandListIndex = (adminCommandListIndex > 0) ? adminCommandListIndex - 1 : (adminCommandList.length - 1);
break;
}
};
var acecClickHandler = function (e) {
var eventTarget = e.target;
if (eventTarget.getAttribute('data-prefill-admin-input')) {
admin_command_inputElement.value = eventTarget.getAttribute('data-prefill-admin-input');
if (document.querySelector('#admin_command_input')) {
document.querySelector('#admin_command_input').focus();
}
}
};
var adminConsolePlatterConfig = function () {
// console.log('window.admin_user.apikey', window.admin_user.apikey);
socket = io();
window.adminSocket = socket;
// socket = io(window.location.hostname + ':' + window.socketIoPort);
// Whenever the server emits 'user joined', log it in the chat body
socket.on('log', function (data) {
logToAdminConsole(data);
});
socket.on('connect', function () {
logToAdminConsole('connected socket in client');
socket.emit('createrepl', window.admin_user);
});
socket.on('disconnect', function () {
logToAdminConsole('disconnected socket');
});
socket.on('reconnect', function () {
logToAdminConsole('reconnected socket');
});
socket.on('error', function () {
logToAdminConsole('socket error');
});
socket.on('stdout', function (data) {
logToAdminConsole(data);
});
consolePlatter = new platterjs({
idSelector: 'adminConsole',
title: ' ',
platterContentElement: adminConsoleElement,
openWindowHTML: ' <span class="_pltr-open-window"><img src="/extensions/periodicjs.ext.asyncadmin/img/icons/new_window.svg" style="height:0.8em;" alt="new window" class="_pltr-open-window"/></span>'
});
consolePlatter.init(function (data) {
// console.log('consolePlatter init data', data);
var spanSeparator = document.createElement('span');
adminConsoleSpanContainer = document.querySelector('#admin-console-span-container');
// spanSeparator.innerHTML = ' | ';
adminConsoleSpanContainer.appendChild(adminButtonElement);
adminConsoleSpanContainer.appendChild(data.element);
adminConsoleSpanContainer.appendChild(spanSeparator);
classie.add(adminConsoleSpanContainer, 'animated-medium');
window.adminConsoleSpanContainer = adminConsoleSpanContainer;
});
consolePlatter.on('openedPlatterWindow', function ( /*data*/ ) {
// console.log('openedPlatterWindow data', data);
addStyleSheetToChildWindow();
consolePlatter.hidePlatterPane();
consolePlatter.config().windowObjectReference.document.querySelector('#admin_command_input').focus();
});
admin_command_submitForm.addEventListener('submit', submit_admin_command, false);
admin_command_inputElement.addEventListener('keyup', admin_input_key_shorcut, false);
admin_command_submit_buttonElement.addEventListener('click', submit_admin_command, false);
adminConsoleElementContent.addEventListener('click', acecClickHandler, false);
window.consolePlatter = consolePlatter;
initServerSocketCallback();
};
var startSessionCountdown = function () {
var secondsLeft = 120;
var countdownelement = document.querySelector('#ts-timeout-counter');
session_timeout_interval = setInterval(function () {
if (secondsLeft === 0) {
clearInterval(session_timeout_interval);
window.adminRefresh();
window.showErrorNotificaton({
message: 'Your session has expired due to inactivity'
});
}
else {
secondsLeft--;
if (countdownelement) {
countdownelement.innerHTML = secondsLeft;
}
}
}, 1000);
};
window.timeoutWarning = timeoutWarning;
window.session_timeout_interval = session_timeout_interval;
var startSessionTimeoutCountner = function () {
clearTimeout(timeoutWarning);
clearInterval(session_timeout_interval);
var session_ttl = window.session_ttl;
var sessionTimeout = (session_ttl && session_ttl > 120) ? session_ttl : 120;
var timeoutdelay = (sessionTimeout - 119) * 1000;
var secondsLeft = 120;
timeoutWarning = setTimeout(function () {
window.showServerModal('<div id="servermodal-content"><div class="ts-bg-accent-color ts-text-text-primary-color ts-padding-sm "><span>Logout Warning</span></div>' +
'Your session is about to expire, do you wish to continue?' +
'<div class="ts-text-center">' +
' <span class="ts-button ts-continue-session-button ts-modal-close">Continue (<span id="ts-timeout-counter">' + secondsLeft + '</span>)</span> ' +
' <a href="/auth/logout" class="ts-button ts-button-divider-text-color">Log out</i></a>' +
'</div>' +
'</div>');
// session_timeout_interval
startSessionCountdown();
clearTimeout(timeoutWarning);
}, timeoutdelay);
// console.log('timeoutdelay', timeoutdelay);
};
window.startSessionTimeoutCountner = startSessionTimeoutCountner;
window.showDefaultDataResponseModal = function (ajaxFormResponse) {
// console.log(ajaxFormResponse.body.data);
// seedcustomstatusoutputel.innerHTML = JSON.stringify(ajaxFormResponse.body.data, null, 2);
var predata = document.createElement('pre'),
h5element = document.createElement('h5'),
hrelement = document.createElement('hr');
h5element.innerHTML = 'Server Data Response';
predata.innerHTML = JSON.stringify(ajaxFormResponse, null, 2);
predata.setAttribute('class', 'ts-text-xs ts-overflow-auto');
predata.setAttribute('style', 'max-height:30em;');
window.servermodalElement.querySelector('#servermodal-content').innerHTML = '';
window.servermodalElement.querySelector('#servermodal-content').appendChild(h5element);
window.servermodalElement.querySelector('#servermodal-content').appendChild(hrelement);
window.servermodalElement.querySelector('#servermodal-content').appendChild(predata);
AdminModal.show('servermodal-modal');
};
window.showServerModal = function (data) {
servermodalElement.querySelector('#servermodal-content').innerHTML = data;
AdminModal.show('servermodal-modal');
};
window.showServerNotification = function (data) {
window.showStylieNotification(data);
};
window.getAsyncCallback = function (functiondata) {
return function (asyncCB) {
window.shownStylieNotification = new StylieNotification({
message: functiondata.message,
ttl: functiondata.ttl,
wrapper: functiondata.wrapper,
layout: 'growl',
effect: 'jelly',
type: functiondata.type, // notice, warning, error or success
onClose: function () {
asyncCB(null, 'shown notification');
}
}).show();
};
};
window.showFlashNotifications = function (options) {
if (options.flash_messages) {
for (var x in options.flash_messages) {
if (options.flash_messages[x]) {
for (var y in options.flash_messages[x]) {
flashMessageArray.push({
type: x,
message: options.flash_messages[x][y]
});
asyncFlashFunctions.push(window.getAsyncCallback({
type: x,
ttl: options.ttl,
message: options.flash_messages[x][y],
wrapper: options.wrapper
}));
}
}
}
if (asyncFlashFunctions.length > 0) {
async.series(asyncFlashFunctions, function (err /*,result*/ ) {
if (err) {
console.error(err);
}
else if (options.callback) {
options.callback();
}
flashMessageArray = [];
asyncFlashFunctions = [];
// else {
// console.log(result);
// }
});
}
}
};
window.showErrorNotificaton = function (options) {
options.layout = 'growl';
options.effect = 'jelly';
options.ttl = false;
options.type = 'error';
window.showStylieNotification(options);
};
window.showStylieNotification = function (options) {
window.StylieNotificationObject = new StylieNotification({
message: options.message,
ttl: (typeof options.ttl === 'boolean') ? options.ttl : 7000,
wrapper: options.wrapper || document.querySelector('main'),
layout: options.layout || 'growl',
effect: options.effect || 'jelly',
type: options.type, // notice, warning, error or success
onClose: options.onClose || function () {}
});
window.shownStylieNotification = window.StylieNotificationObject.show();
};
window.showStylieAlert = function (options) {
var sendOSAlert = function (options) {
var osAlert;
try {
var notificationDiv = document.createElement('div');
notificationDiv.innerHTML = options.message;
osAlert = new window.Notification('New ' + window.periodic.name + ' alert', {
body: notificationDiv.textContent,
icon: '/favicon.png',
});
}
catch (e) {
console.warn('OS/Browser does not support Notifications', osAlert);
}
return osAlert;
};
window.shownStylieNotification = new StylieNotification({
message: options.message,
ttl: (typeof options.ttl === 'boolean') ? options.ttl : 7000,
wrapper: options.wrapper || document.querySelector('main'),
layout: options.layout || 'growl',
effect: options.effect || 'slide',
type: options.type, // notice, warning, error or success
onClose: options.onClose || function () {}
}).show();
if (window.Notification) {
if (window.Notification.permission !== 'granted') {
window.Notification.requestPermission(function (permission) {
if (permission === 'granted') {
sendOSAlert(options);
}
});
}
else {
sendOSAlert(options);
}
}
};
window.refresh_content_attributes_media = function (data) {
var genericdoc = data.body.data.doc,
medialistcheckbox_elements = document.querySelectorAll('.medialistcheckbox');
var contenttype_elements = document.querySelectorAll('input[name="contenttypes"][checked]');
// console.log('genericdoc', genericdoc);
if (content_attribute_template) {
// console.log('content_attribute_template', content_attribute_template);
content_attribute_HTML = ejs.render(content_attribute_template, {
genericdoc: genericdoc
});
// console.log('content_attribute_HTML', content_attribute_HTML);
content_attribute_content_html.innerHTML = content_attribute_HTML;
}
if (contenttype_elements && genericdoc.contenttypes && contenttype_elements.length !== genericdoc.contenttypes.length) {
window.adminRefresh();
}
else if (medialistcheckbox_elements && genericdoc.assets && medialistcheckbox_elements.length !== genericdoc.assets.length) {
console.log('document.querySelectorAll(.medialistcheckbox).length', document.querySelectorAll('.medialistcheckbox').length);
console.log('genericdoc.assets.length', genericdoc.assets.length);
// console.log('do a window refresh');
window.adminRefresh();
}
};
window.adminRefresh = function () {
loadAjaxPage({
datahref: window.location.href
});
};
window.restartAppResponse = function ( /*ajaxFormResponse*/ ) {
// window.adminRefresh();
var t;
if (alreadyAttachedAppResponse === false) {
window.adminSocket.on('disconnect', function () {
t = setTimeout(function () {
window.StylieNotificationObject.dismiss();
}, 500);
// window.StylieNotificationObject.dismiss();
window.showStylieAlert({
message: 'Shutting down application and restarting Periodic. (' + new Date() + ')'
});
window.showPreloader();
});
window.adminSocket.on('connect', function () {
window.StylieNotificationObject.dismiss();
window.showStylieAlert({
message: 'Periodic application restarted.(' + new Date() + ')'
});
clearTimeout(t);
window.adminRefresh();
});
alreadyAttachedAppResponse = true;
}
};
window.notifyAdminButton = function () {
if (classie.has(adminConsoleSpanContainer, 'tada')) {
classie.remove(adminConsoleSpanContainer, 'tada');
setTimeout(function () {
classie.add(adminConsoleSpanContainer, 'tada');
}, 500);
}
else {
classie.add(adminConsoleSpanContainer, 'tada');
}
};
var initElementSelectors = function () {
adminConsoleElement = document.querySelector('#ts-admin-console');
adminConsoleElementContent = document.querySelector('#ts-admin-console-content');
asyncHTMLWrapper = document.querySelector('#ts-asyncadmin-content-wrapper');
asyncHTMLContentContainer = document.querySelector(asyncContentSelector);
mobile_nav_menu = document.getElementById('ts-nav-menu');
menuTriggerElement = document.getElementById('trigger');
nav_header = document.querySelector('#nav-header');
mtpms = document.querySelector('main.ts-pushmenu-scroller');
ajaxlinks = document.querySelectorAll('.async-admin-ajax-link');
admin_command_inputElement = document.querySelector('#admin_command_input');
admin_command_submit_buttonElement = document.querySelector('#admin_command_submit_button');
admin_command_submitForm = document.querySelector('#admin