384 lines
16 KiB
JavaScript
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);
|
|
|