monster_menus-9.0.x-dev/js/mm_search_replace.js
js/mm_search_replace.js
(function ($, Drupal, drupalSettings) {
$.fn.extend({
mySerialize: function() {
var s = [];
for (var i = 0; i < this.length; i++)
if (this[i].type === 'select-multiple')
s.push(this[i].name + '=' + encodeURIComponent(($(this[i]).val() || []).sort().join(',')));
else if (this[i].type === 'checkbox')
s.push(this[i].name + '=' + encodeURIComponent(this[i].checked + 0));
else
s.push(this[i].name + '=' + encodeURIComponent(this[i].value));
return s.join('&');
}
});
const MMSR_CONTENTS= '0';
const MMSR_PAGES= '1';
const MMSR_CONT_PAGES= '2';
const MMSR_GROUPS= '3';
const MMSR_CONTENTS_PANEL= 0;
const MMSR_PAGES_PANEL= 1;
const MMSR_GROUPS_PANEL= 2;
var MMSR_init_done, MMSR_last_recalc, MMSR_panels;
var MMSR_search_type = function (value) {
var where = $('#mmsr-where-list');
// don't use empty() here because it destroys event handlers
while (where[0].childNodes[0])
where[0].removeChild(where[0].childNodes[0]);
switch (value) {
case MMSR_CONTENTS:
where.append(MMSR_panels[MMSR_CONTENTS_PANEL]);
break;
case MMSR_CONT_PAGES:
where.append(MMSR_panels[MMSR_CONTENTS_PANEL]);
// no break
case MMSR_PAGES:
where.append(MMSR_panels[MMSR_PAGES_PANEL]);
break;
case MMSR_GROUPS:
where.append(MMSR_panels[MMSR_GROUPS_PANEL]);
}
};
var MMSR_where_changed = function () {
var widgets = $('form>div#search-' + this.value)
.clone(true, false)
.removeClass('hidden')
.show();
$('.subpanel-select', widgets)
.change(MMSR_subpanel_changed)
.each(MMSR_subpanel_changed);
var search_changed = function () {
this.selectedIndex === 1 ? $(this).parent().siblings().show() : $(this).parent().siblings().hide();
};
$("[name=search-archive-0]", widgets)
.change(search_changed)
.each(search_changed);
$('[name=mmsr-widgets]', this.parentNode.parentNode.nextSibling)
.empty()
.append(widgets)
.parent()
.show();
$(':input:visible,:input[name^=search-archive]', widgets)
.change(MMSR_recalculate);
var oldMMLists = $('.mm-list-hidden', $('form div#search-' + this.value));
$('.mm-list-hidden', widgets)
.each(function (i) {
this.mmList = oldMMLists[i].mmList;
});
for (var i in drupalSettings.MM.MMSR.fixups)
if (drupalSettings.MM.MMSR.fixups.hasOwnProperty(i))
$(i + ':not(.subpanel-inited)', widgets)
.addClass('subpanel-inited')
.each(drupalSettings.MM.MMSR.fixups[i]);
MMSR_recalculate();
};
var MMSR_plus_clicked = function () {
var tr = this.parentNode.parentNode;
var trcopy = $(tr)
.clone(true, true);
var from = $('[name=search-logic]', tr);
$('[name=search-logic]', trcopy)
.val(from.val())
.show();
var pop, trClass;
switch (tr.className) {
case 'mmsr-page-row':
pop = $('[name=search-page-wheres]', trcopy);
from = $('[name=search-page-wheres]', tr);
trClass = 'mmsr-page-row-widgets';
break;
case 'mmsr-cont-row':
pop = $('[name=search-node-wheres]', trcopy);
from = $('[name=search-node-wheres]', tr);
trClass = 'mmsr-cont-row-widgets';
break;
case 'mmsr-group-row':
pop = $('[name=search-group-wheres]', trcopy);
from = $('[name=search-group-wheres]', tr);
trClass = 'mmsr-group-row-widgets';
break;
}
pop
.val(from.val());
$(tr)
.next()
.after(trcopy)
.next()
.after('<tr class="' + trClass + '"><td id="mmsr-widgets" name="mmsr-widgets" colspan="2"></td></tr>');
$(pop)
.each(MMSR_where_changed);
$('[name=mmsr-minus]:hidden', tr.parentNode)
.show();
};
var MMSR_minus_clicked = function () {
var tr = this.parentNode.parentNode;
var parent = tr.parentNode;
$(tr)
.next()
.remove();
$(tr)
.remove();
if ($('[name=mmsr-minus]', parent).length === 1)
$('[name=mmsr-minus]:first:visible', parent)
.hide();
$('[name=search-logic]:first:visible', parent)
.hide();
MMSR_recalculate();
};
var MMSR_subpanel_changed = function () {
$('[name^=' + this.name + '-]', this.parentNode.parentNode)
.hide()
.each(function () {
$('input', this).addClass('mmsr-ignore');
}
);
$('[name=' + this.name + '-' + this.value + ']', this.parentNode.parentNode)
.show()
.each(function () {
$('input', this)
.removeClass('mmsr-ignore');
if (!$(this).hasClass('subpanel-inited')) {
for (var i in drupalSettings.MM.MMSR.fixups)
if (drupalSettings.MM.MMSR.fixups.hasOwnProperty(i))
$(i + ':not(.subpanel-inited)', this)
.addClass('subpanel-inited')
.each(drupalSettings.MM.MMSR.fixups[i]);
$(this)
.addClass('subpanel-inited');
}
}
);
MMSR_recalculate();
};
var MMSR_initialize = function (context) {
if (MMSR_init_done) return;
$('#rightcolumn')
.hide(); // hide the page's right column (admin menu)
$('#search-logic,#search-node-type,#search-node-wheres')
.change(MMSR_recalculate)
.parent()
.hide();
$('#edit-search-group-depth,#edit-search-page-depth')
.change(MMSR_recalculate);
$('#edit-search-type')
.change(
function () {
MMSR_search_type(this.value);
MMSR_recalculate();
}
);
$('.subpanel')
.hide();
$('#search-archive div:gt(0)')
.css('display', 'inline');
// run the fixup for "pages starting at"
var toFind = $('#search-page-catlist,#search-group-catlist'), n = 0;
for (var i in drupalSettings.MM.MMSR.fixups) {
if (drupalSettings.MM.MMSR.fixups.hasOwnProperty(i)) {
var test = $(i, context);
if (test.length) {
var test2 = test[0].parentNode.parentNode;
if (test2 === toFind[0] || test2 === toFind[1]) {
test.each(drupalSettings.MM.MMSR.fixups[i]);
if (++n === 2) break;
}
}
}
}
$('#search-page-wheres,#search-group-wheres')
.after('<div id="mmsr-where-list"></div>');
MMSR_panels = [
$('<table class="mmsr-cont-table"><tbody>'+
'<tr class="mmsr-cont-row-widgets"><td colspan="2"><label>' + Drupal.t('of type') + ':</label></td></tr>' +
'<tr class="mmsr-cont-row-widgets"><td colspan="2"></td></tr>' +
'<tr class="mmsr-cont-row-widgets"><td colspan="2"><label>' + Drupal.t('where') + ':</label></td></tr>' +
'<tr name="mmsr-cont-row" class="mmsr-cont-row"><td id="mmsr-where" name="mmsr-where" nowrap="true"></td><td name="mmsr-plus-minus" id="mmsr-plus-minus" width="0"></td></tr>' +
'<tr class="mmsr-cont-row-widgets"><td id="mmsr-widgets" name="mmsr-widgets" colspan="2"></td></tr>' +
'</tbody></table>'),
$('<table class="mmsr-page-table"><tbody>' +
'<tr class="mmsr-page-row-widgets"><td colspan="2"></td></tr>' +
'<tr class="mmsr-page-row-widgets"><td colspan="2"><label>' + Drupal.t('where') + ':</label></td></tr>' +
'<tr name="mmsr-page-row" class="mmsr-page-row"><td id="mmsr-where" name="mmsr-where" nowrap="true"></td><td name="mmsr-plus-minus" id="mmsr-plus-minus" width="0"></td></tr>' +
'<tr class="mmsr-page-row-widgets"><td id="mmsr-widgets" name="mmsr-widgets" colspan="2"></td></tr>' +
'</tbody></table>'),
$('<table class="mmsr-group-table"><tbody>' +
'<tr class="mmsr-group-row-widgets"><td colspan="2"></td></tr>' +
'<tr class="mmsr-group-row-widgets"><td colspan="2"><label>' + Drupal.t('where') + ':</label></td></tr>' +
'<tr name="mmsr-group-row" class="mmsr-group-row"><td id="mmsr-where" name="mmsr-where" nowrap="true"></td><td name="mmsr-plus-minus" id="mmsr-plus-minus" width="0"></td></tr>' +
'<tr class="mmsr-group-row-widgets"><td id="mmsr-widgets" name="mmsr-widgets" colspan="2"></td></tr>' +
'</tbody></table>')
];
// contents panel
$('tr:first td:first', MMSR_panels[MMSR_CONTENTS_PANEL])
.append($('#search-node-type'));
$('[name=mmsr-where]', MMSR_panels[MMSR_CONTENTS_PANEL])
.append($('#search-logic')
.clone()
.change(MMSR_recalculate));
$('[name=mmsr-where]', MMSR_panels[MMSR_CONTENTS_PANEL])
.append($('#search-node-wheres')
.clone()
.show()
.change(MMSR_where_changed)
);
$('[name=mmsr-plus-minus]', MMSR_panels[MMSR_CONTENTS_PANEL])
.append('<input type="button" name="mmsr-minus" value="-" title="' + Drupal.t('Delete this row') + '" style="display: none">')
.append('<input type="button" name="mmsr-plus" title="' + Drupal.t('Add a row') + '" value="+">');
$('[name=mmsr-plus]', MMSR_panels[MMSR_CONTENTS_PANEL])
.click(MMSR_plus_clicked);
$('[name=mmsr-minus]', MMSR_panels[MMSR_CONTENTS_PANEL])
.click(MMSR_minus_clicked);
// pages panel
$('tr:first td:first', MMSR_panels[MMSR_PAGES_PANEL])
.append($('#search-page-catlist'));
$('[name=mmsr-where]', MMSR_panels[MMSR_PAGES_PANEL])
.append($('#search-logic')
.clone()
.change(MMSR_recalculate));
$('[name=mmsr-where]', MMSR_panels[MMSR_PAGES_PANEL])
.append($('#search-page-wheres')
.clone()
.show()
.change(MMSR_where_changed)
);
$('[name=mmsr-plus-minus]', MMSR_panels[MMSR_PAGES_PANEL])
.append('<input type="button" name="mmsr-minus" value="-" title="' + Drupal.t('Delete this row') + '" style="display: none">')
.append('<input type="button" name="mmsr-plus" title="' + Drupal.t('Add a row') + '" value="+">');
$('[name=mmsr-plus]', MMSR_panels[MMSR_PAGES_PANEL])
.click(MMSR_plus_clicked);
$('[name=mmsr-minus]', MMSR_panels[MMSR_PAGES_PANEL])
.click(MMSR_minus_clicked);
// groups panel
$('tr:first td:first', MMSR_panels[MMSR_GROUPS_PANEL])
.append($('#search-group-catlist'));
$('[name=mmsr-where]', MMSR_panels[MMSR_GROUPS_PANEL])
.append($('#search-logic'));
$('[name=mmsr-where]', MMSR_panels[MMSR_GROUPS_PANEL])
.append($('#search-group-wheres')
.clone()
.show()
.change(MMSR_where_changed)
);
$('[name=mmsr-plus-minus]', MMSR_panels[MMSR_GROUPS_PANEL])
.append('<input type="button" name="mmsr-minus" value="-" title="' + Drupal.t('Delete this row') + '" style="display: none">')
.append('<input type="button" name="mmsr-plus" title="' + Drupal.t('Add a row') + '" value="+">');
$('[name=mmsr-plus]', MMSR_panels[MMSR_GROUPS_PANEL])
.click(MMSR_plus_clicked);
$('[name=mmsr-minus]', MMSR_panels[MMSR_GROUPS_PANEL])
.click(MMSR_minus_clicked);
$('#search-actions')
.before('<div id="mmsr-status" class="clearfix"><div id="mmsr-status-text"></div><div class="ajax-progress ajax-progress-throbber"><div class="throbber"> </div></div></div>')
.find('[name=action_type]')
.change(function () {
MMSR_recalculate_action(this);
});
$('<details id="mmsr-diagnostic" class="js-form-wrapper form-wrapper"><summary role="button" aria-controls="mmsr-diagnostic" aria-expanded="true" aria-pressed="true">' + Drupal.t('Query') + '</summary><div class="details-wrapper"><div id="mmsr-diagnostic-content"></div></div></details>')
.add('#search-actions')
.insertAfter('#mm-search-form');
$('<input type="button" id="mmsr-recalc" value="' + Drupal.t('Recalc') + '">')
.click(function () { MMSR_recalculate(true, {recalc: true}); })
.prependTo('#mmsr-status');
$('#mmsr-status #mmsr-status-text')
.before(
$('#edit-result')
.click(function () {
MMSR_serialize();
return true;
}))
.before(
$('#edit-reset')
.click(function () {
MMSR_init_done = false;
$('input[type=button][name=mmsr-minus]:gt(0)', MMSR_panels[MMSR_CONTENTS_PANEL])
.click();
$('input[type=button][name=mmsr-minus]:gt(0)', MMSR_panels[MMSR_PAGES_PANEL])
.click();
$('input[type=button][name=mmsr-minus]:gt(0)', MMSR_panels[MMSR_GROUPS_PANEL])
.click();
MMSR_import(drupalSettings.MM.MMSR.reset, document);
MMSR_init_done = true;
MMSR_recalculate();
return false;
}));
MMSR_import(drupalSettings.MM.MMSR.startup, document);
$("[name=search-page-cat]", MMSR_panels[MMSR_PAGES_PANEL])
.val(drupalSettings.MM.MMSR.startup['search-page-cat'])
.trigger('change');
$("[name=search-group-cat]", MMSR_panels[MMSR_GROUPS_PANEL])
.val(drupalSettings.MM.MMSR.startup['search-group-cat'])
.trigger('change');
Drupal.behaviors.mmListInit = {attach: function() {}};
MMSR_init_done = true;
MMSR_recalculate();
};
var MMSR_import = function (obj, where) {
var row, i;
if (typeof(obj) == 'object')
if (typeof(obj.length) == 'number') { // array
for (i in obj) {
if (obj.hasOwnProperty(i)) {
row = where;
if (i > 0) {
$('[name=mmsr-plus]:last', row)
.trigger('click');
row = row.nextSibling.nextSibling;
}
$(row)
.each(
function() {
MMSR_import_inner(obj[i], this)
});
}
}
}
else {
for (i in obj) {
if (obj.hasOwnProperty(i)) {
row = where;
if (row.tagName === 'TR' && i !== 'search-logic' && i !== 'search-node-wheres' && i !== 'search-page-wheres' && i !== 'search-group-wheres')
row = row.nextSibling;
$('[name="' + i + '"]:first', row)
.each(
function() {
MMSR_import_inner(obj[i], this);
});
}
}
}
};
var MMSR_import_inner = function (obji, where) {
if (typeof(obji) == 'object')
MMSR_import(obji, where);
else {
where.name.slice(-2) === '[]' ? $(where).val(obji.split(',')) : where.value = obji;
if (where.tagName === 'SELECT' || where.tagName === 'INPUT')
$(where).trigger('change');
}
};
var MMSR_serialize = function (always) {
if (MMSR_init_done) {
var data = $($.merge($.merge(jQuery.makeArray(
$("#edit-search-type,#mmsr-where-list table :input:not(:button):not(:submit):not([style='display: none']):not(.mmsr-ignore):not(.form-autocomplete[name$='-choose']):not([name=search-page-cat]):not([name=search-group-cat])")),
$("[name=search-page-cat]", MMSR_panels[MMSR_PAGES_PANEL])),
$("[name=search-group-cat]", MMSR_panels[MMSR_GROUPS_PANEL])))
.mySerialize();
if (always || data !== MMSR_last_recalc) {
$('#edit-data')
.val(data);
MMSR_last_recalc = data;
return data;
}
}
return false;
};
MMSR_recalculate = function (adding, add, qp) {
var data = MMSR_serialize(adding);
function showStatus(msg) {
$('#mmsr-status-text')
.html(msg)
.show()
.next()
.hide();
}
if (data) {
$('#mmsr-status-text')
.hide()
.next()
.show();
$.ajax({
type: 'POST',
accepts: {json: 'application/json', text_csv: 'text/csv'},
dataType: 'text',
data: adding ? $.extend({ data: data }, add) : { data: data },
url: drupalSettings.MM.MMSR.get_path + (qp || ''),
global: false,
success: function (resp, a, xhr) {
switch (xhr.getResponseHeader('Content-Type').match(/\w+\/\w+/)[0]) {
case 'text/csv':
var blob = new Blob([resp], { type: 'text/csv' });
window.location = window.URL.createObjectURL(blob);
showStatus(Drupal.t('File downloaded.'));
break;
case 'application/json':
var obj = JSON.parse(resp);
var actions = $('#search-actions');
if (obj.hasOwnProperty('action_result_js') && window.hasOwnProperty(obj.action_result_js)) {
window[obj.action_result_js](obj, actions);
}
if (obj.hasOwnProperty('action_result')) {
var div = actions.find(obj.action_result_div);
if (obj.action_result) {
div.empty().show().append($(obj.action_result)).next().hide().parent().show();
}
else {
div.parent().hide();
}
$('#mmsr-status-text')
.show()
.next()
.hide();
}
else {
showStatus(obj.result || Drupal.t('An error occurred.'));
$('#mmsr-diagnostic-content')
.html(obj.query || '');
if (obj.actions.toString()) {
var type = actions.find('[name=action_type]').empty();
$.each(obj.actions, function(k, v) {
$('<option />')
.attr({value: k, selected: k === obj.action_selected})
.html(v)
.appendTo(type);
});
$('#action-config')
.empty()
.append(obj.form);
if (obj.hasOwnProperty('jsInit') && window.hasOwnProperty(obj.jsInit)) {
window[obj.jsInit](obj, actions);
}
actions.show();
}
else {
actions.hide();
}
}
}
},
error: function () {
showStatus(Drupal.t('An error occurred.'));
$('#mmsr-diagnostic-content')
.html('');
}
});
}
};
MMSR_recalculate_action = function (that, qp) {
var add = {};
$("#search-actions form input:not(.form-submit),#search-actions form select,#search-actions form textarea")
.add(that)
.each(function () {
if (this.name && (this.type !== 'checkbox' || this.checked)) {
add[this.name] = this.value;
}
});
$('#mmsr-mp-status-text')
.hide()
.next()
.show();
MMSR_recalculate(true, add, qp);
}
var initCatlists = function (jsonobj, actions) {
$.each(jsonobj.drupalSettings.MM.mmListInit, function(key, instance) {
if (instance) {
// Clone parms so that changes at lower levels don't affect other instances.
instance.parms = jQuery.extend(true, {}, instance.parms);
instance.parms.isSearch = true; // prevent "required"
var obj = mmListGetObj(actions, instance);
if (obj && obj.addItem) {
delete jsonobj.drupalSettings.MM.mmListInit[key];
$.each(instance.add, function(key, list) {
list.unshift(false);
obj.addItem.apply(obj, list);
});
obj.enableOpts();
}
}
});
};
MMSR_init_action_pager = function (obj) {
$('#action-config .pager__items a, table th a')
.click(function () {
MMSR_recalculate_action(null, (new URL($(this).attr('href'), location)).search);
return false;
});
};
MMSR_init_action_modify_perms = function (jsonobj, actions) {
initCatlists(jsonobj, actions);
actions
.find('input,select').change(function() {
actions.find('#mmsr-mp-status-text,#mmsr-mp-status .ajax-progress,#edit-mp-result').hide();
})
.end()
.find('#edit-modify-mode').change(function () {
var val = $(this).val();
actions
.find('.form-item-modify-users-w,.form-item-modify-groups-w')
.toggle(val !== 'owner')
.end()
.find('.form-item-modify-mp-mode')
.toggle(val === 'add_ug')
.end()
.find('.form-item-modify-owner-userlist')
.toggle(val === 'owner');
})
.change();
};
MMSR_action_modify_perms_update = function (jsonobj, actions) {
actions.find('#edit-mp-result').toggle(!!jsonobj.mp_enable);
};
MMSR_init_action_clean_perms = function (jsonobj, actions) {
actions.find('#mmsr-mp-status-text,#mmsr-mp-status .ajax-progress,#edit-mp-result').hide();
};
MMSR_init_action_replace_text = function (jsonobj, actions) {
function testRegex() {
var desc = actions.find('#edit-from--description').hide();
if (actions.find('#edit-method').val() === 'regex') {
try {
new RegExp(actions.find('#edit-from').val());
}
catch (e) {
desc.text(Drupal.t('Syntax error in regular expression: @err', {'@err': e.message})).show();
}
}
}
actions
.find('input,select').change(function() {
actions.find('#mmsr-mp-status-text,#mmsr-mp-status .ajax-progress,#edit-mp-result').hide();
})
.end()
.find('#edit-method').change(function () {
var val = $(this).val();
actions.find('#edit-to--description').toggle(val === 'regex');
testRegex();
})
.change()
.end()
.find('#edit-from').change(testRegex);
};
MMSR_init_action_modify_pages = function (jsonobj, actions) {
initCatlists(jsonobj, actions);
actions
.find('input,select').change(function() {
actions.find('#mmsr-mp-status-text,#mmsr-mp-status .ajax-progress,#edit-mp-result').hide();
})
.end()
.find('#edit-modify-mode').change(function () {
actions
.find('#edit-repl-catlist')
.toggle($(this).val() === 'repl_pgs');
})
.change();
}
var MMSR_onchange_flags = function (obj, name) {
$('[name="' + name + '"]', obj.parentNode.parentNode).toggle(obj.value < 10);
return true;
};
var MMSR_onchange_node_types = function (obj) {
$('[name="allowed_node_types[]"]', obj.parentNode.parentNode).toggle(obj.value != 2 && obj.value != 5);
return true;
};
Drupal.behaviors.MMSR_initialize = {
attach: function() {
/*********** Fixup code for various custom element types ***********/
drupalSettings.MM.MMSR.fixups["[name^=\'others_\']"] = function () {
$(this).change(function () {
if (this.checked) {
$('.mm-list-hidden:not([name=owner])', this.parentNode.parentNode.parentNode).each(function() {
this.delAll();
});
}
});};
$.each(drupalSettings.MM.mmListInit, function(key, instance) {
drupalSettings.MM.MMSR.fixups['[name="mm_list_obj' + key + '"]'] = function() {
if (instance) {
// Clone parms so that changes at lower levels don't affect other instances.
instance.parms = jQuery.extend(true, {}, instance.parms);
var obj = mmListGetObj(this.parentNode.parentNode, instance);
if (obj && obj.addItem) {
$.each(instance.add, function(key, list) {
list.unshift(false);
obj.addItem.apply(obj, list);
});
obj.enableOpts();
$(obj.p.hiddenElt).change(function() { mmListImport(obj, this.value); });
}
}
};
});
Drupal.autocomplete.options.select = function(event, ui) {
event.target.value = ui.item.label;
return false;
};
drupalSettings.MM.MMSR.fixups['input.mmsr-autocomplete'] = function() {
$(this).addClass('form-autocomplete');
Drupal.behaviors.autocomplete.attach(this.parentNode);
};
MMSR_initialize();
}
};
$('input.form-autocomplete').addClass('mmsr-autocomplete').removeClass('form-autocomplete');
})(jQuery, Drupal, drupalSettings);
