This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
plone.formwidget.querystring/plone/formwidget/querystring/querywidget.js

384 lines
16 KiB
JavaScript

(function ($) {
// Define querywidget namespace if it doesn't exist
if (typeof($.querywidget) === "undefined") {
$.querywidget = {
config: {},
initialized: false
};
}
// Create a select menu
$.querywidget.createSelect = function (values, selectedvalue, className, name) {
// Create select
var select = $(document.createElement('select'))
.addClass(className)
.attr('name', name);
$.each(values, function (i, val) {
if ((typeof(val.enabled) === "undefined") || (val.enabled)) {
var option = $(document.createElement('option'))
.attr('value', i)
.html(val.title);
if (i === selectedvalue) {
option.attr('selected', 'selected');
}
if (typeof(val.group) !== "undefined") {
var optgroup = select.find("optgroup[label=" + val.group + "]");
if (optgroup.length === 0) {
optgroup = $(document.createElement('optgroup'))
.attr('label', val.group);
optgroup.append(option);
select.append(optgroup);
} else {
optgroup.append(option);
}
} else {
select.append(option);
}
}
});
return select;
};
// Create a queryindex select menu
$.querywidget.createQueryIndex = function (value, fname) {
return $.querywidget.createSelect($.querywidget.config.indexes,
value,
'queryindex',
fname + '.i:records');
};
// Create a queryoperator select menu
$.querywidget.createQueryOperator = function (index, value, fname) {
return $.querywidget.createSelect($.querywidget.config.indexes[index].operators,
value,
'queryoperator',
fname + '.o:records');
};
$.querywidget.createWidget = function (type, index, fname) {
switch (type) {
case 'StringWidget':
return $(document.createElement('input'))
.attr({
'autocomplete': 'off',
'type': 'text',
'name': fname + '.v:records'
})
.addClass('querywidget queryvalue stringWidget');
case 'DateWidget':
return $(document.createElement('input'))
.attr({
'autocomplete': 'off',
'type': 'text',
'name': fname + '.v:records'
})
.addClass('querywidget queryvalue dateWidget');
case 'DateRangeWidget':
return $(document.createElement('div'))
.addClass('querywidget dateRangeWidget')
.append($(document.createElement('input'))
.attr({
'autocomplete': 'off',
'type': 'text',
'name': fname + '.v:records:list'
})
.addClass('queryvalue')
)
.append($(document.createElement('span'))
.html(' and ')
)
.append($(document.createElement('input'))
.attr({
'autocomplete': 'off',
'type': 'text',
'name': fname + '.v:records:list'
})
.addClass('queryvalue')
);
case 'ReferenceWidget':
return $(document.createElement('dl'))
.addClass('querywidget referenceWidget')
.append($(document.createElement('dt'))
.html('Select...')
.addClass('hiddenStructure')
)
.append($(document.createElement('dd'))
.append($(document.createElement('input'))
.attr({
'autocomplete': 'off',
'type': 'text',
'name': fname + '.v:records'
})
.addClass('queryvalue')
)
);
case 'RelativePathWidget':
return $(document.createElement('input'))
.attr({
'autocomplete': 'off',
'type': 'text',
'name': fname + '.v:records'
})
.addClass('querywidget queryvalue relativePathWidget');
case 'MultipleSelectionWidget':
var dl = $(document.createElement('dl'))
.addClass('querywidget multipleSelectionWidget')
.append($(document.createElement('dt'))
.append($(document.createElement('span'))
.addClass('arrowDownAlternative')
.html('▼')
)
.append($(document.createElement('span'))
.html('Select...')
.addClass('multipleSelectionWidgetTitle')
)
);
var dd = $(document.createElement('dd')).addClass('hiddenStructure widgetPulldownMenu');
$.each($.querywidget.config.indexes[index].values, function (i, val) {
dd.append($(document.createElement('label'))
.append($(document.createElement('input'))
.attr({
'type': 'checkbox',
'name': fname + '.v:records:list',
'value': i
})
)
.append($(document.createElement('span'))
.html(val.title)
)
);
});
dl.append(dd);
return dl;
default:
return $(document.createElement('div'))
.html(' ')
.addClass('querywidget queryvalue emptyWidget');
}
};
$.querywidget.getCurrentWidget = function (node) {
var classes = node.attr('class').split(' ');
for (var i in classes) {
if (classes[i].indexOf('Widget') !== -1) {
var classname = classes[i];
return classname.slice(0,1).toUpperCase() + classname.slice(1);
}
}
};
$.querywidget.updateSearch = function () {
var query = portal_url + "/@@querybuilder_html_results?";
var querylist = [];
var items = $('.ArchetypesQueryWidget .queryindex');
if (!items.length) {
return;
}
items.each(function () {
var results = $(this).parents('.criteria').children('.queryresults');
var index = $(this).val();
var operator = $(this).parents('.criteria').children('.queryoperator').val();
var widget = $.querywidget.config.indexes[index].operators[operator].widget;
querylist.push('query.i:records=' + index);
querylist.push('query.o:records=' + operator);
switch (widget) {
case 'DateRangeWidget':
var querywidget = $(this).parents('.criteria').find('.querywidget');
querylist.push('query.v:records:list=' + $(querywidget.children('input')[0]).val());
querylist.push('query.v:records:list=' + $(querywidget.children('input')[1]).val());
break;
case 'MultipleSelectionWidget':
var querywidget = $(this).parents('.criteria').find('.querywidget');
querywidget.find('input:checked').each(function () {
querylist.push('query.v:records:list=' + $(this).val());
});
break;
default:
querylist.push('query.v:records=' + $(this).parents('.criteria').find('.queryvalue').val());
break;
}
$.get(portal_url + '/@@querybuildernumberofresults?' + querylist.join('&'),
{},
function (data) { results.html(data); });
});
query += querylist.join('&');
query += '&sort_on=' + $('#sort_on').val();
if ($('#sort_order:checked').length > 0) {
query += '&sort_order=reverse';
}
$.get(query, {}, function (data) { $('.ArchetypesQueryWidget .previewresults').html(data); });
};
// Enhance for javascript browsers
$(document).ready(function () {
// Init
$.querywidget.init();
// Remove the hidden sort_on and sort_reversed z3c.form fields because
// they are hard-coded in the view. Read the values from these hidden
// fields and set the values of the hard-coded fields accordingly.
var sort_on = $('#form-widgets-sort_on').val();
var sort_reversed = $('#form-widgets-sort_reversed-0');
$('#formfield-form-widgets-sort_on').remove();
$('#formfield-form-widgets-sort_reversed').remove();
$('#sort_on').val(sort_on);
if (sort_reversed.attr('value') === 'selected') {
$('#sort_order').attr('checked', true);
} else {
$('#sort_order').attr('checked', false);
}
});
// Init widget
$.querywidget.init = function () {
// Check if already initialized
if ($.querywidget.initialized === true) {
// Return nothing done
return false;
}
// Set initialized
$.querywidget.initialized = true;
// Get configuration
$.getJSON(portal_url + '/@@querybuilderjsonconfig', function (data) {
$.querywidget.config = data;
// Find querywidgets
$(".ArchetypesQueryWidget").each(function () {
// Get object
var obj = $(this);
var fname = obj.attr('data-fieldname');
// Hide controls used for non-javascript only
obj.find(".addIndexButton").hide();
obj.find(".multipleSelectionWidget dt").removeClass('hiddenStructure');
obj.find(".multipleSelectionWidget dd").addClass('hiddenStructure widgetPulldownMenu');
$('div.queryindex').each(function () {
$(this).before(
$(document.createElement('div'))
.addClass('queryresults discreet')
.html('')
);
$(this).replaceWith($.querywidget.createQueryIndex($(this).children('input').val(), fname));
});
$('div.queryoperator').each(function () {
$(this).replaceWith($.querywidget.createQueryOperator($(this).parents('.criteria').children('.queryindex').val(),
$(this).children('input').val(), fname));
});
$.querywidget.updateSearch();
});
});
$('.multipleSelectionWidget dt').live('click', function () {
if ($(this).parent().children('dd').hasClass('hiddenStructure')) {
$(this).parent().children('dd').removeClass('hiddenStructure');
} else {
$(this).parent().children('dd').addClass('hiddenStructure');
}
});
$('.queryindex').live('change', function () {
var fname = $(this).closest('.ArchetypesQueryWidget').attr('data-fieldname');
var index = $(this).find(':selected')[0].value;
$(this).parents(".criteria").children('.queryoperator')
.replaceWith($.querywidget.createQueryOperator(index, '', fname));
var operatorvalue = $(this).parents('.criteria').children('.queryoperator').val();
var widget = $.querywidget.config.indexes[index].operators[operatorvalue].widget;
var querywidget = $(this).parent(".criteria").children('.querywidget');
if ((widget !== $.querywidget.getCurrentWidget(querywidget)) || (widget === 'MultipleSelectionWidget')) {
querywidget.replaceWith($.querywidget.createWidget(widget, index, fname));
}
$.querywidget.updateSearch();
});
$('.queryoperator').live('change', function () {
var fname = $(this).closest('.ArchetypesQueryWidget').attr('data-fieldname');
var index = $(this).parents('.criteria').children('.queryindex').val();
var operatorvalue = $(this).children(':selected')[0].value;
var widget = $.querywidget.config.indexes[index].operators[operatorvalue].widget;
var querywidget = $(this).parent().children('.querywidget');
if (widget !== $.querywidget.getCurrentWidget(querywidget)) {
querywidget.replaceWith($.querywidget.createWidget(widget, index, fname));
}
$.querywidget.updateSearch();
});
$('#sort_on,#sort_order').live('change', function () {
$.querywidget.updateSearch();
});
$('.multipleSelectionWidget input').live('change', function () {
var widget = $(this).parents('.multipleSelectionWidget');
var selected_values = [];
widget.find('input:checked').each(function () {
selected_values.push($(this).parent().children('span').html());
});
widget.find('.multipleSelectionWidgetTitle')
.attr('title', selected_values.join(', '))
.html(selected_values.join(', '));
$.querywidget.updateSearch();
});
$('.queryvalue').live('keyup', function () {
$.querywidget.updateSearch();
});
$('.queryvalue').live('keydown', function (e) {
if (e.keyCode === 13) {
return false;
}
});
$('.addIndex').live('change', function () {
var fname = $(this).closest('.ArchetypesQueryWidget').attr('data-fieldname');
var index = $(this).find(':selected')[0].value;
var criteria = $(this).parents('.criteria');
var newcriteria = $(document.createElement('div'))
.addClass('criteria');
newcriteria.append(
$(document.createElement('div'))
.addClass('queryresults discreet')
.html('')
);
newcriteria.append($.querywidget.createQueryIndex(index, fname));
var operator = $.querywidget.createQueryOperator(index, '', fname);
newcriteria.append(operator);
var operatorvalue = $(operator.children()[0]).attr('value');
newcriteria.append($.querywidget.createWidget($.querywidget.config.indexes[index].operators[operatorvalue].widget, index, fname));
newcriteria.append(
// How will we translate these values?
$(document.createElement('input'))
.attr({
'value': 'Remove line',
'type': 'submit',
'name': 'removecriteria'
})
.addClass('removecriteria discreet')
);
criteria.before(newcriteria);
$(this).val('');
$.querywidget.updateSearch();
});
$('.removecriteria').live('click', function () {
$(this).parents('.criteria').remove();
$.querywidget.updateSearch();
return false;
});
};
})(jQuery);