: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
// Declaring as global variable for quick prototyping
adminUrl: ctf_settings.admin_url,
nonce: ctf_settings.nonce,
ajaxHandler: ctf_settings.ajax_handler,
model: ctf_settings.model,
feeds: ctf_settings.feeds,
links: ctf_settings.links,
sourcesList : ctf_settings.sources,
dialogBoxPopupScreen : ctf_settings.dialogBoxPopupScreen,
selectSourceScreen : ctf_settings.selectSourceScreen,
ctfRebrand : ctf_settings.ctfRebrand,
socialWallActivated: ctf_settings.socialWallActivated,
socialWallLinks: ctf_settings.socialWallLinks,
locales: ctf_settings.locales,
timezones: ctf_settings.timezones,
genericText: ctf_settings.genericText,
generalTab: ctf_settings.generalTab,
feedsTab: ctf_settings.feedsTab,
translationTab: ctf_settings.translationTab,
advancedTab: ctf_settings.advancedTab,
footerUpgradeUrl: ctf_settings.footerUpgradeUrl,
upgradeUrl: ctf_settings.upgradeUrl,
supportPageUrl: ctf_settings.supportPageUrl,
isDevSite: ctf_settings.isDevSite,
licenseKey: ctf_settings.licenseKey,
pluginItemName: ctf_settings.pluginItemName,
licenseStatus: ctf_settings.licenseStatus,
licenseErrorMsg: ctf_settings.licenseErrorMsg,
extensionsLicense: ctf_settings.extensionsLicense,
extensionsLicenseKey: ctf_settings.extensionsLicenseKey,
extensionFieldHasError: false,
cronNextCheck: ctf_settings.nextCheck,
sections: ["General", "Feeds", "Translation", "Advanced"],
loaderSVG: ctf_settings.loaderSVG,
checkmarkSVG: ctf_settings.checkmarkSVG,
uploadSVG: ctf_settings.uploadSVG,
exportSVG: ctf_settings.exportSVG,
reloadSVG: ctf_settings.reloadSVG,
tooltipHelpSvg: ctf_settings.tooltipHelpSvg,
cogSVG: ctf_settings.cogSVG,
deleteSVG: ctf_settings.deleteSVG,
svgIcons : ctf_settings.svgIcons,
accountDetails : ctf_settings.accountDetails,
newAccountData : ctf_settings.newAccountData,
appCredentials : ctf_settings.appCredentials,
connectAccountScreen : ctf_settings.connectAccountScreen,
appOAUTH : ctf_settings.appOAUTH,
testConnectionStatus: null,
recheckLicenseStatus: null,
optimizeCacheStatus: null,
persistentCacheStatus: null,
twittercardCacheStatus: null,
hasError: ctf_settings.hasError,
manualAccountResp : false,
customButtons : undefined
sourcePopupScreen : 'redirect_1',
sourcePopupType : 'creation',
instanceSourceActive : null,
connectAccountPopup : false,
connectAccountStep : 'step_1',
accountDetailsActive : false,
appDetailsActive : false,
newSourceData : ctf_settings.newSourceData ? ctf_settings.newSourceData : null,
sourceConnectionURLs : ctf_settings.sourceConnectionURLs,
returnedApiSourcesList : [],
type : 'success', // success, error, warning, message
selectedSourcesToConnect : [],
fullScreenLoader : false,
type : 'success', // success, error, warning, message
props: ["section", "index"],
<a class='tab' :id='section.toLowerCase().trim()' @click='emitWidth($el);changeComponent(index);activeTab(section)'>{{section}}</a>
let urlParams = new URLSearchParams(window.location.search);
let view = urlParams.get('view');
settings_data.currentView = view;
settings_data.currentTab = settings_data.sections[0];
settings_data.selected = "app-1";
emitWidth: function(el) {
settings_data.indicator_width = jQuery(el).outerWidth();
settings_data.indicator_pos = jQuery(el).position().left;
changeComponent: function(index) {
var prev = settings_data.current;
settings_data.forwards = false;
} else if (prev > index) {
settings_data.forwards = true;
settings_data.selected = "app-" + (index + 1);
settings_data.current = index;
activeTab: function(section) {
this.setView(section.toLowerCase().trim());
settings_data.currentTab = section;
setView: function(section) {
history.replaceState({}, null, settings_data.adminUrl + 'admin.php?page=ctf-settings&view=' + section);
var ctfSettings = new Vue({
this.$nextTick(function() {
let tabEl = document.querySelector('.tab');
settings_data.indicator_width = tabEl.offsetWidth;
settings_data.appLoaded = true;
// set the current view page on page load
let activeEl = document.querySelector('a.tab#' + settings_data.currentView);
// we have to uppercase the first letter
let currentView = settings_data.currentView.charAt(0).toUpperCase() + settings_data.currentView.slice(1);
let viewIndex = settings_data.sections.indexOf(currentView) + 1;
settings_data.indicator_width = activeEl.offsetWidth;
settings_data.indicator_pos = activeEl.offsetLeft;
settings_data.selected = "app-" + viewIndex;
settings_data.current = viewIndex;
settings_data.currentTab = currentView;
settings_data.appLoaded = true;
left: settings_data.indicator_pos + "px",
width: settings_data.indicator_width + "px",
chooseDirection: function() {
if (settings_data.forwards == true) {
activateLicense: function() {
if (this.licenseType === 'free') {
this.runOneClickUpgrade();
this.activateProLicense();
activateProLicense: function() {
this.pressedBtnName = 'ctf';
let data = new FormData();
data.append( 'action', 'ctf_activate_license' );
data.append( 'license_key', this.licenseKey );
data.append( 'nonce', this.nonce );
fetch(this.ajaxHandler, {
credentials: 'same-origin',
.then(response => response.json())
if ( data.success == false ) {
this.licenseStatus = 'inactive';
if ( data.success == true ) {
let licenseData = data.data.licenseData;
this.licenseStatus = data.data.licenseStatus;
this.pressedBtnName = null;
data.data.licenseStatus == 'inactive' ||
data.data.licenseStatus == 'invalid' ||
data.data.licenseStatus == 'expired'
if( licenseData.error ) {
this.licenseErrorMsg = licenseData.errorMsg
deactivateLicense: function() {
this.pressedBtnName = 'ctf';
let data = new FormData();
data.append( 'action', 'ctf_deactivate_license' );
data.append( 'nonce', this.nonce );
fetch(this.ajaxHandler, {
credentials: 'same-origin',
.then(response => response.json())
if ( data.success == true ) {
this.licenseStatus = data.data.licenseStatus ;
this.pressedBtnName = null;
licenseActiveAction: function(extension) {
extension = typeof extension !== 'undefined' ? extension : false;
if (this.licenseType === 'free') {
this.runOneClickUpgrade();
if (typeof extension !== 'undefined') {
this.deactivateExtensionLicense(extension);
this.deactivateLicense();
runOneClickUpgrade: function() {
this.pressedBtnName = 'ctf';
let data = new FormData();
data.append( 'action', 'ctf_maybe_upgrade_redirect' );
data.append( 'license_key', this.licenseKey );
data.append( 'nonce', this.nonce );
fetch(this.ajaxHandler, {
credentials: 'same-origin',
.then(response => response.json())
if ( data.success === false ) {
this.licenseStatus = 'invalid';
if( typeof data.data !== 'undefined' ) {
this.licenseErrorMsg = data.data.message
if ( data.success === true ) {
window.location.href = data.data.url
* Activate Extensions License
* @param {object} extension
activateExtensionLicense: function( extension ) {
let licenseKey = this.extensionsLicenseKey[extension.name];
this.extensionFieldHasError = false;
this.pressedBtnName = extension.name;
this.extensionFieldHasError = true;
let data = new FormData();
data.append( 'action', 'ctf_activate_extension_license' );
data.append( 'license_key', licenseKey );
data.append( 'extension_name', extension.name );
data.append( 'extension_item_name', extension.itemName );
data.append( 'nonce', this.nonce );
fetch(this.ajaxHandler, {
credentials: 'same-origin',
.then(response => response.json())
if ( data.success == true ) {
this.extensionFieldHasError = false;
this.pressedBtnName = null;
if ( data.data.licenseStatus == 'invalid' ) {
this.extensionFieldHasError = true;
this.notificationElement = {
text : this.genericText.invalidLicenseKey,
if ( data.data.licenseStatus == 'valid' ) {
this.notificationElement = {
text : this.genericText.licenseActivated,
extension.licenseStatus = data.data.licenseStatus;
extension.licenseKey = licenseKey;
this.notificationElement.shown = "hidden";
* Deactivate Extensions License
* @param {object} extension
deactivateExtensionLicense: function( extension ) {
let licenseKey = this.extensionsLicenseKey[extension.name];
this.extensionFieldHasError = false;
this.pressedBtnName = extension.name;
let data = new FormData();
data.append( 'action', 'ctf_deactivate_extension_license' );
data.append( 'extension_name', extension.name );
data.append( 'extension_item_name', extension.itemName );
data.append( 'nonce', this.nonce );
fetch(this.ajaxHandler, {
credentials: 'same-origin',
.then(response => response.json())
if ( data.success == true ) {
this.extensionFieldHasError = false;
this.pressedBtnName = null;
if ( data.data.licenseStatus == 'deactivated' ) {
this.notificationElement = {
text : this.genericText.licenseDeactivated,
extension.licenseStatus = data.data.licenseStatus;
extension.licenseKey = licenseKey;
this.notificationElement.shown = "hidden";
testConnection: function() {
this.testConnectionStatus = 'loading';
let data = new FormData();
data.append( 'action', 'ctf_test_connection' );
data.append( 'nonce', this.nonce );
fetch(this.ajaxHandler, {
credentials: 'same-origin',
.then(response => response.json())
if ( data.success == false ) {
this.testConnectionStatus = 'error';
if ( data.success == true ) {
this.testConnectionStatus = 'success';
this.testConnectionStatus = null;
recheckLicense: function( licenseKey, itemName, optionName = null ) {
this.recheckLicenseStatus = 'loading';
this.pressedBtnName = optionName;
let data = new FormData();
data.append( 'action', 'ctf_recheck_connection' );
data.append( 'license_key', licenseKey );
data.append( 'item_name', itemName );
data.append( 'option_name', optionName );
data.append( 'nonce', this.nonce );
fetch(this.ajaxHandler, {
credentials: 'same-origin',
.then(response => response.json())
if ( data.success == true ) {
if ( data.data.license == 'valid' ) {
this.recheckLicenseStatus = 'success';
if ( data.data.license == 'expired' ) {
this.recheckLicenseStatus = 'error';