Edit File by line

Deprecated: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in /home/sportsfever/public_html/filemanger/function.php on line 93
/home/sportsfe.../httpdocs/clone/wp-conte.../plugins/advanced.../admin/assets/js
File: termination.js
// phpcs:disable Generic.WhiteSpace.ScopeIndent.IncorrectExact -- PHPCS can't handle es5 short functions
[0] Fix | Delete
function Advads_Termination( element ) {
[1] Fix | Delete
/**
[2] Fix | Delete
* Function to reset the changed nodes to default values.
[3] Fix | Delete
*
[4] Fix | Delete
* @constructor
[5] Fix | Delete
*/
[6] Fix | Delete
function FormValues() {
[7] Fix | Delete
this.addedNodes = [];
[8] Fix | Delete
this.removedNodes = [];
[9] Fix | Delete
};
[10] Fix | Delete
[11] Fix | Delete
let initialFormValues = new FormValues(),
[12] Fix | Delete
changedFormValues = new FormValues();
[13] Fix | Delete
[14] Fix | Delete
const blocklist = [
[15] Fix | Delete
'active_post_lock'
[16] Fix | Delete
];
[17] Fix | Delete
[18] Fix | Delete
this.observers = {
[19] Fix | Delete
list: [],
[20] Fix | Delete
[21] Fix | Delete
push: item => {
[22] Fix | Delete
this.observers.list.push( item );
[23] Fix | Delete
},
[24] Fix | Delete
[25] Fix | Delete
disconnect: () => {
[26] Fix | Delete
this.observers.list.forEach( observer => {
[27] Fix | Delete
observer.disconnect();
[28] Fix | Delete
} );
[29] Fix | Delete
this.observers.list = [];
[30] Fix | Delete
}
[31] Fix | Delete
};
[32] Fix | Delete
[33] Fix | Delete
/**
[34] Fix | Delete
* Set an initial form value.
[35] Fix | Delete
* Can be used e.g. when a field is updated after an AJAX call.
[36] Fix | Delete
*
[37] Fix | Delete
* @param {String} key The key of the value that should be changed in the initial form value array.
[38] Fix | Delete
* @param {Node} input The input field node.
[39] Fix | Delete
*
[40] Fix | Delete
* @returns {void}
[41] Fix | Delete
*/
[42] Fix | Delete
this.setInitialValue = ( key, input ) => {
[43] Fix | Delete
if ( ! input || ! input.value ) {
[44] Fix | Delete
return;
[45] Fix | Delete
}
[46] Fix | Delete
initialFormValues[key] = input.value;
[47] Fix | Delete
};
[48] Fix | Delete
[49] Fix | Delete
/**
[50] Fix | Delete
* Collect input values.
[51] Fix | Delete
* Checkboxes are true/false, unless they are part of a group.
[52] Fix | Delete
* Radio buttons have a boolean value on the saved value, only the checked one will be collected.
[53] Fix | Delete
*
[54] Fix | Delete
* @param {FormValues} object
[55] Fix | Delete
* @param {Node} input
[56] Fix | Delete
* @return {FormValues}
[57] Fix | Delete
*/
[58] Fix | Delete
const collectInputValue = function ( object, input ) {
[59] Fix | Delete
/**
[60] Fix | Delete
* Collect checkbox group values.
[61] Fix | Delete
* If there are multiple checkboxes with the same `nome` attribute, collect all values for this group.
[62] Fix | Delete
*
[63] Fix | Delete
* @param {NodeList} group Iterable of inputs with the same `name` attribute.
[64] Fix | Delete
* @return {FormValues}
[65] Fix | Delete
*/
[66] Fix | Delete
const collectCheckboxGroup = ( group ) => {
[67] Fix | Delete
[68] Fix | Delete
object[group[0].name] = [];
[69] Fix | Delete
group.forEach( input => {
[70] Fix | Delete
if ( input.checked ) {
[71] Fix | Delete
object[input.name].push( input.value );
[72] Fix | Delete
}
[73] Fix | Delete
} );
[74] Fix | Delete
[75] Fix | Delete
return object;
[76] Fix | Delete
};
[77] Fix | Delete
[78] Fix | Delete
if ( input.type === 'checkbox' ) {
[79] Fix | Delete
const checkboxGroup = element.querySelectorAll( '[name="' + input.name + '"]' );
[80] Fix | Delete
if ( checkboxGroup.length > 1 ) {
[81] Fix | Delete
return collectCheckboxGroup( checkboxGroup, input );
[82] Fix | Delete
}
[83] Fix | Delete
[84] Fix | Delete
object[input.name] = input.checked;
[85] Fix | Delete
[86] Fix | Delete
return object;
[87] Fix | Delete
}
[88] Fix | Delete
[89] Fix | Delete
// if a radio button is not checked, don't collect it.
[90] Fix | Delete
if ( input.type === 'radio' && ! input.checked ) {
[91] Fix | Delete
return object;
[92] Fix | Delete
}
[93] Fix | Delete
[94] Fix | Delete
object[input.name] = input.value;
[95] Fix | Delete
[96] Fix | Delete
return object;
[97] Fix | Delete
};
[98] Fix | Delete
[99] Fix | Delete
/**
[100] Fix | Delete
* Setup a mutationobserver to check for added and removed form fields.
[101] Fix | Delete
* This especially applies to conditions.
[102] Fix | Delete
*
[103] Fix | Delete
* @type {MutationObserver}
[104] Fix | Delete
*/
[105] Fix | Delete
const addedRemovedObserver = new MutationObserver( mutations => {
[106] Fix | Delete
for ( const mutation of mutations ) {
[107] Fix | Delete
for ( const removedNode of mutation.removedNodes ) {
[108] Fix | Delete
const nodes = document.createTreeWalker( removedNode, NodeFilter.SHOW_ELEMENT );
[109] Fix | Delete
while ( nodes.nextNode() ) {
[110] Fix | Delete
if ( nodes.currentNode.tagName === 'INPUT' || nodes.currentNode.tagName === 'SELECT' ) {
[111] Fix | Delete
const index = changedFormValues.addedNodes.indexOf( nodes.currentNode.name );
[112] Fix | Delete
if ( index > - 1 ) {
[113] Fix | Delete
changedFormValues.addedNodes.splice( index, 1 );
[114] Fix | Delete
} else {
[115] Fix | Delete
changedFormValues.removedNodes.push( nodes.currentNode.name );
[116] Fix | Delete
}
[117] Fix | Delete
}
[118] Fix | Delete
}
[119] Fix | Delete
}
[120] Fix | Delete
for ( const addedNode of mutation.addedNodes ) {
[121] Fix | Delete
if ( addedNode.nodeType === Node.TEXT_NODE ) {
[122] Fix | Delete
continue;
[123] Fix | Delete
}
[124] Fix | Delete
[125] Fix | Delete
const nodes = document.createTreeWalker( addedNode, NodeFilter.SHOW_ELEMENT );
[126] Fix | Delete
while ( nodes.nextNode() ) {
[127] Fix | Delete
if ( nodes.currentNode.tagName === 'INPUT' || nodes.currentNode.tagName === 'SELECT' ) {
[128] Fix | Delete
if ( nodes.currentNode.name === '' ) {
[129] Fix | Delete
continue;
[130] Fix | Delete
}
[131] Fix | Delete
changedFormValues.addedNodes.push( nodes.currentNode.name );
[132] Fix | Delete
}
[133] Fix | Delete
}
[134] Fix | Delete
}
[135] Fix | Delete
}
[136] Fix | Delete
} );
[137] Fix | Delete
[138] Fix | Delete
// attach the mutation observer to the passed element.
[139] Fix | Delete
addedRemovedObserver.observe( element, {childList: true, subtree: true} );
[140] Fix | Delete
this.observers.push( addedRemovedObserver );
[141] Fix | Delete
[142] Fix | Delete
/**
[143] Fix | Delete
* Check if there are inputs that have been changed and if their value is different.
[144] Fix | Delete
*
[145] Fix | Delete
* @param {Object} reference The initial values when the modal loaded, indexed by name attribute.
[146] Fix | Delete
* @param {Object} changed The input values that were changed, indexed by name.
[147] Fix | Delete
*
[148] Fix | Delete
* @return {boolean}
[149] Fix | Delete
*/
[150] Fix | Delete
this.hasChanged = ( reference, changed ) => {
[151] Fix | Delete
for ( const name in changed ) {
[152] Fix | Delete
if ( ! reference.hasOwnProperty( name ) || reference[name].toString() !== changed[name].toString() ) {
[153] Fix | Delete
return true;
[154] Fix | Delete
}
[155] Fix | Delete
}
[156] Fix | Delete
[157] Fix | Delete
return false;
[158] Fix | Delete
};
[159] Fix | Delete
[160] Fix | Delete
/**
[161] Fix | Delete
* If the modal is associated with a form and any values have changed, ask for confirmation to navigate away.
[162] Fix | Delete
* Returns true if the user agrees with termination, false otherwise.
[163] Fix | Delete
*
[164] Fix | Delete
* @param {boolean} reload Whether to reload the page on added and removed nodes (needed for the modal). Default false.
[165] Fix | Delete
*
[166] Fix | Delete
* @return {boolean}
[167] Fix | Delete
*/
[168] Fix | Delete
this.terminationNotice = ( reload = false ) => {
[169] Fix | Delete
if ( ! this.hasChanged( initialFormValues, changedFormValues ) ) {
[170] Fix | Delete
return true;
[171] Fix | Delete
}
[172] Fix | Delete
[173] Fix | Delete
// ask user for confirmation.
[174] Fix | Delete
if ( window.confirm( window.advadstxt.confirmation ) ) {
[175] Fix | Delete
// if we have added or removed nodes, we might need to reload the page.
[176] Fix | Delete
if ( changedFormValues.addedNodes.length || changedFormValues.removedNodes.length ) {
[177] Fix | Delete
if ( reload ) {
[178] Fix | Delete
window.location.reload();
[179] Fix | Delete
}
[180] Fix | Delete
return true;
[181] Fix | Delete
}
[182] Fix | Delete
[183] Fix | Delete
// otherwise, we'll replace the values with the previous values.
[184] Fix | Delete
for ( const name in changedFormValues ) {
[185] Fix | Delete
const input = element.querySelector( '[name="' + name + '"]' );
[186] Fix | Delete
if ( input === null ) {
[187] Fix | Delete
continue;
[188] Fix | Delete
}
[189] Fix | Delete
[190] Fix | Delete
if ( input.type === 'checkbox' ) {
[191] Fix | Delete
input.checked = initialFormValues[name];
[192] Fix | Delete
} else if ( input.type === 'radio' ) {
[193] Fix | Delete
let value = (initialFormValues[name] !== null && initialFormValues[name] !== undefined) ? initialFormValues[name] : input.value;
[194] Fix | Delete
element.querySelector( '[name="' + name + '"][value="' + value + '"]' ).checked = true;
[195] Fix | Delete
} else {
[196] Fix | Delete
input.value = initialFormValues[name];
[197] Fix | Delete
}
[198] Fix | Delete
}
[199] Fix | Delete
[200] Fix | Delete
return true;
[201] Fix | Delete
}
[202] Fix | Delete
[203] Fix | Delete
return false;
[204] Fix | Delete
};
[205] Fix | Delete
[206] Fix | Delete
/**
[207] Fix | Delete
* Collect inputs in this modal and save their initial and changed values (if any).
[208] Fix | Delete
*/
[209] Fix | Delete
this.collectValues = () => {
[210] Fix | Delete
const isDialog = element.tagName === 'DIALOG';
[211] Fix | Delete
[212] Fix | Delete
element.querySelectorAll( 'input, select, textarea' ).forEach( input => {
[213] Fix | Delete
if ( ! input.name.length || blocklist.includes( input.id ) || blocklist.includes( input.name ) ) {
[214] Fix | Delete
return;
[215] Fix | Delete
}
[216] Fix | Delete
[217] Fix | Delete
// if the element itself is not a dialog but the input is within a dialog, ignore it. This accounts for split forms, e.g. the placements page where some inputs are hidden in a modal dialog.
[218] Fix | Delete
if ( ! isDialog && input.closest( 'dialog' ) ) {
[219] Fix | Delete
return;
[220] Fix | Delete
}
[221] Fix | Delete
[222] Fix | Delete
initialFormValues = collectInputValue( initialFormValues, input );
[223] Fix | Delete
[224] Fix | Delete
// if the input is `hidden` no change event gets triggered. Use MutationObservers to check for changes in the value attribute.
[225] Fix | Delete
if ( input.type === 'hidden' ) {
[226] Fix | Delete
const hiddenObserver = new MutationObserver( function ( mutations, observer ) {
[227] Fix | Delete
mutations.forEach( mutation => {
[228] Fix | Delete
if ( mutation.attributeName === 'value' ) {
[229] Fix | Delete
mutation.target.dispatchEvent( new Event( 'input' ) );
[230] Fix | Delete
}
[231] Fix | Delete
} );
[232] Fix | Delete
} );
[233] Fix | Delete
hiddenObserver.observe( element, {
[234] Fix | Delete
attributes: true,
[235] Fix | Delete
subtree: true
[236] Fix | Delete
} );
[237] Fix | Delete
this.observers.push( hiddenObserver );
[238] Fix | Delete
}
[239] Fix | Delete
[240] Fix | Delete
input.addEventListener( 'input', event => {
[241] Fix | Delete
changedFormValues = collectInputValue( changedFormValues, input );
[242] Fix | Delete
} );
[243] Fix | Delete
} );
[244] Fix | Delete
};
[245] Fix | Delete
};
[246] Fix | Delete
[247] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function