res.ui.config.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.apache.felix.webconsole Show documentation
Show all versions of org.apache.felix.webconsole Show documentation
Web Based Management Console for OSGi Frameworks. See
http://felix.apache.org/site/apache-felix-web-console.html for more
information on this bundle.
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// tables container - will get hidden, when no config service available
var configContent = false;
// config table list
var configTable = false;
var configBody = false;
var configRow = false;
// factories table list
var factoryBody = false;
var factoryRow = false;
// editor dialog
var editor = false;
var editorMessage = false;
// json support
var jsonSupport = false;
function configure(pid, create) {
var uri = pluginRoot + '/' + pid;
// we have to add a cache killer for IE8
var postUri = uri + '?post=true&';
if ( create ) {
postUri += param.create + '=1&';
}
postUri = postUri + 'ts='+new Date().getMilliseconds();
$.get(postUri, null, displayConfigForm, 'json');
}
function showjson(pid) {
var ref = pluginRoot;
ref = ref.substring(0, ref.lastIndexOf('/')) + "/osgi-installer-config-printer?format=JSON&pid=" + pid;
window.location = ref;
}
function displayConfigForm(obj) {
var parent = document.getElementById('editorTable');
clearChildren( parent )
var trEl = tr( );
parent.appendChild( trEl );
var tdEl = td( "noPaddingLeft", { colSpan: "2" } );
trEl.appendChild( tdEl );
var formEl = createElement( "form", null, {
id : "editorForm",
method: "POST",
action: pluginRoot + "/" + obj.pid
});
tdEl.appendChild( formEl );
var inputEl = createElement( "input", null, {
type: "hidden",
name: param.apply,
value: "true"
});
formEl.appendChild( inputEl );
// add the factory PID as a hidden form field if present
if (obj.factoryPid)
{
inputEl = createElement( "input", null, {
type: "hidden",
name: "factoryPid",
value: obj.factoryPid
});
formEl.appendChild( inputEl );
}
// add the PID filter as a hidden form field if present
if (obj[ param.pidFilter ])
{
inputEl = createElement( "input", null, {
type: "hidden",
name: param.pidFilter,
value: obj.pidFilter
});
formEl.appendChild( inputEl );
}
inputEl = createElement( "input", null, {
type: "hidden",
name: "action",
value: "ajaxConfigManager"
});
formEl.appendChild( inputEl );
inputEl = createElement( "input", null, {
type: "hidden",
name: "$location",
id: "lochidden"
});
formEl.appendChild( inputEl );
var tableEl = createElement( "table", null, {
border: 0,
width: "100%"
});
formEl.appendChild( tableEl );
var bodyEl = createElement( "tbody" );
tableEl.appendChild( bodyEl );
if (obj.description)
{
trEl = tr( );
tdEl = td( "configDescription", { colSpan: "3" } );
addText( tdEl, obj.description );
trEl.appendChild( tdEl );
bodyEl.appendChild( trEl );
}
if (obj.properties)
{
printForm(bodyEl, obj.properties, obj.additionalProperties);
}
printConfigurationInfo(parent, obj);
if ( obj.service_location && obj.bundle_location && obj.service_location != obj.bundle_location) {
editorMessage.removeClass('ui-helper-hidden').text(i18n.err_bind.msgFormat(obj.pid, obj.bundle_location, obj.service_location));
} else editorMessage.addClass('ui-helper-hidden');
// ugly workaround for IE6 and IE7 - these browsers don't show correctly the dialog
var ua = navigator.userAgent;
if (ua.indexOf('MSIE 6') != -1 || ua.indexOf('MSIE 7') != -1) $(parent).html(parent.innerHTML);
initStaticWidgets(editor
.attr('__pid', obj.pid)
.attr('__location', obj.bundleLocation?obj.bundleLocation:'')
.dialog('option', 'title', obj.title)
.dialog('open'));
// Resize all the textareas based on their content
autosize.update($('textarea'));
}
function escapeHtml(str) {
var div = document.createElement('div');
div.appendChild(document.createTextNode(str));
return div.innerHTML;
}
/* Element */ function addDefaultValue( /* Element */ element ) {
if (element) {
element.appendChild(
createElement('span', 'default_value ui-state-highlight1 ui-icon ui-icon-alert iconMarginTop', {
title : i18n.dflt_value
})
);
}
return element;
}
function printForm( /* Element */ parent, /* Object */ properties, additionalProperties ) {
var propList;
if ( additionalProperties != undefined ) {
propList = additionalProperties;
}
for (var prop in properties)
{
var attr = properties[prop];
// create optionality element
var optElement = false;
if (attr.optional) {
var elAttributes = {
type: "checkbox",
name: "opt" + prop,
title: i18n.opt_value
};
if (attr.is_set) {
elAttributes['checked'] = 'checked';
}
optElement = createElement( "input", "optionality", elAttributes);
} else {
optElement = text( "" );
}
// create the raw
var trEl = tr( null, null, [
td( null, null, [ optElement ] ),
td( "minWidthCell", null, [ text( attr.name ) ] )
]);
parent.appendChild( trEl );
var tdEl = td( "paddedCell", { style: { width: "99%" } } );
trEl.appendChild( tdEl );
if (attr.value != undefined)
{
// check is required to also handle empty strings, 0 and false
var inputName = (prop == "action" || prop == "propertylist" || prop == "apply" || prop == "delete") ? '$' + prop : prop;
var inputEl = createInput( inputName, attr.value, attr.type, '99%' );
tdEl.appendChild( inputEl );
tdEl.appendChild( createElement( "br" ) );
}
else if (typeof(attr.type) == 'object')
{
// assume attr.values and multiselect
createMultiSelect( tdEl, prop, attr.values, attr.type, '99%' );
tdEl.appendChild( createElement( "br" ) );
}
else if (attr.values.length == 0)
{
tdEl.appendChild( createAddButton( prop) );
}
else
{
tdEl.appendChild( createAddButton( prop) );
for (var i=0;i" + escapeHtml(conf.nameHint) + "");
} else {
nms.after(conf.id);
}
tr.attr('fpid', conf.name);
} else {
var name = escapeHtml(conf.name) + '' + conf.id + '';
nms.addClass('ui-helper-hidden').parent().html(name);
}
tr.find('td:eq(1)').click(function() { // name & edit
configure(conf.id);
});
tr.find('td:eq(2)').html(conf.bundle ? '' + conf.bundle_name + '' : '-'); // binding
// buttons
tr.find('li:eq(0)').click(function() { // edit
configure(conf.id);
});
if (conf.bundle) {
tr.find('li:eq(1)').click(function() { // unbind
unbindConfig(conf.id, conf.bundle_name);
}).removeClass('ui-state-disabled');
}
if ( conf.has_config ) {
tr.find('li:eq(2)').click(function() { // delete
deleteConfig(conf.id, conf.bundle_name);
}).removeClass('ui-state-disabled');
if ( jsonSupport ) {
tr.find('li:eq(3)').click(function() { // json
showjson(conf.id);
}).show();
}
}
}
function addFactoryConfig(conf) {
var tr = factoryRow.clone().appendTo(configTable).attr('fpid', conf.name);
tr.find('td:eq(1)').text(conf.name).click(function() { // name & edit
configure(conf.id, true);
});
// buttons
tr.find('li:eq(0)').click(function() { // edit
configure(conf.id, true);
});
}
function treetableExtraction(node) {
var td = $(node);
var text = td.text();
if (!text) return text;
// current sort order
var desc = $(this)[0].sortList[0][1];
var row = td.parent();
var fpid = row.attr('fpid');
// factory row
if ( row.hasClass('fpid') && fpid) return fpid + (desc==1?1:0) + text;
// bundle or name row
if ( fpid ) return fpid + desc + text;
return mixedLinksExtraction(node);
};
function navigateAfterConfigurationClose() {
if(configurationReferer) {
window.location = configurationReferer;
return true;
}
return false;
}
$(document).ready(function() {
configContent = $('#configContent');
// config table list
configTable = $('#configTable');
configBody = configTable.find('tbody');
configRow = configBody.find('tr:eq(0)').clone();
factoryRow = configBody.find('tr:eq(1)').clone();
// setup button - cannot inline in dialog option because of i18n
var _buttons = {};
_buttons[i18n.abort] = function() {
$(this).dialog('close');
}
_buttons[i18n.reset] = function() {
var form = document.getElementById('editorForm');
if (form) form.reset();
}
_buttons[i18n.del] = function() {
if (deleteConfig($(this).attr('__pid'), $(this).attr('__location'))) {
$(this).dialog('close');
}
}
_buttons[i18n.unbind_btn] = function() {
unbindConfig($(this).attr('__pid'), $(this).attr('__location'));
}
_buttons[i18n.save] = function() {
if ( $("#locinput").val() === i18n.unbound ) {
$("#lochidden").val("");
} else {
$("#lochidden").val($("#locinput").val());
}
// get all the configuration properties names
var propListElement = $(this).find('form').find('[name=propertylist]');
var propListArray = propListElement.val().split(',');
// removes the properties, that are unchecked
$(this).find('form').find('input.optionality:not(:checked)').each( function(idx, el) {
var name = $(el).attr('name').substring(3); // name - 'opt'
var index = propListArray.indexOf(name);
if (index >= 0) {
propListArray.splice(index, 1);
}
});
propListElement.val(propListArray.join(','));
$.ajax({
type : 'POST',
url : pluginRoot + '/' + $(this).attr('__pid'),
data : $(this).find('form').serialize(),
success : function () {
// reload on success - prevents AJAX errors - see FELIX-3116
if(!navigateAfterConfigurationClose()) document.location.href = pluginRoot;
},
async : false
})
.fail(function () {
$(this).dialog('close');
});
}
// prepare editor, but don't open yet!
editor = $('#editor').dialog({
autoOpen : false,
modal : true,
width : '90%',
closeText: i18n.abort,
buttons : _buttons,
close : function( event, ui ) { navigateAfterConfigurationClose(); }
});
editorMessage = editor.find('p');
jsonSupport = configData.jsonsupport;
// display the configuration data
var line = configData.status ? i18n.stat_ok : i18n.stat_missing;
line = line + " " + (configData.metatype ? i18n.metatype_ok : i18n.metatype_missing);
if ( configData.noconfigs ) {
line = line + " " + i18n.noconfigs;
}
$(".statline").html(line);
if (configData.status) {
var hasData = false;
configBody.empty();
var factories = {};
for(var i in configData.pids) {
hasData = true;
var c = configData.pids[i];
if (c.fpid) {
if (!factories[c.fpid]) factories[c.fpid] = new Array();
factories[c.fpid].push(c);
} else {
addConfig(c);
}
}
for(var i in configData.fpids) {
hasData = true;
addFactoryConfig(configData.fpids[i]);
var fpid = configData.fpids[i].id;
var confs = factories[ fpid ];
if (confs) {
for (var j in confs) {
addConfig(confs[j]);
}
delete factories[ fpid ];
}
}
for(var fpid in factories) {
var flist = factories[fpid];
for(var i in flist) {
delete flist[i].fpid; // render as regular config
addConfig(flist[i]);
}
}
initStaticWidgets(configTable);
// init tablesorter
if ( hasData ) {
configTable.tablesorter({
headers: {
0: { sorter: false },
3: { sorter: false }
},
sortList: [[1,1]],
textExtraction: treetableExtraction
}).bind('sortStart', function() { // clear cache, otherwise extraction will not work
var table = $(this).trigger('update');
}).find('th:eq(1)').click();
}
} else {
configContent.addClass('ui-helper-hidden');
}
if(selectedPid) {
if(factoryCreate) configure(selectedPid, true);
else configure(selectedPid);
}
});