2011-07-20 16:48:26 +04:00
|
|
|
/* Functions used to show/hide dependent bug fields and change their select options
|
|
|
|
* License: Dual-license GPL 3.0+ or MPL 1.1+
|
2014-03-31 18:43:20 +04:00
|
|
|
* Author(s): Vitaliy Filippov <vitalif@mail.ru>
|
2011-07-20 16:48:26 +04:00
|
|
|
*/
|
|
|
|
|
2014-03-31 18:43:20 +04:00
|
|
|
// This is set to window.onload event from fieldvaluecontrol.cgi
|
2011-02-02 16:16:11 +03:00
|
|
|
function initControlledFields()
|
|
|
|
{
|
2014-03-31 18:43:20 +04:00
|
|
|
// Initialise fields in correct order (from up-most controller fields)
|
|
|
|
var initialised = {};
|
|
|
|
var doInit = function(f)
|
|
|
|
{
|
|
|
|
if (f && !initialised[f])
|
|
|
|
{
|
|
|
|
initialised[f] = true;
|
|
|
|
doInit(show_fields[f].visibility_field);
|
|
|
|
doInit(show_fields[f].value_field);
|
|
|
|
initControllerField(f);
|
|
|
|
}
|
|
|
|
};
|
2011-02-02 16:16:11 +03:00
|
|
|
for (var i in show_fields)
|
2014-03-31 18:43:20 +04:00
|
|
|
{
|
|
|
|
doInit(i);
|
|
|
|
}
|
2011-02-02 16:16:11 +03:00
|
|
|
}
|
|
|
|
|
2014-03-31 18:43:20 +04:00
|
|
|
function initControllerField(i)
|
2011-02-02 16:16:11 +03:00
|
|
|
{
|
|
|
|
var f = document.getElementById(i);
|
2011-07-20 16:48:26 +04:00
|
|
|
if (f)
|
2013-07-03 18:39:59 +04:00
|
|
|
{
|
|
|
|
if (document.forms['Create'])
|
|
|
|
{
|
2014-03-31 18:43:20 +04:00
|
|
|
// Find current value of field f by its name
|
|
|
|
var control_id;
|
|
|
|
for (var i in show_fields[f.id]['legal'])
|
|
|
|
{
|
|
|
|
if (f.value == show_fields[f.id]['legal'][i][1])
|
|
|
|
{
|
|
|
|
control_id = show_fields[f.id]['legal'][i][0];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2013-07-03 18:39:59 +04:00
|
|
|
|
2014-03-31 18:43:20 +04:00
|
|
|
// Select default value in each controlled field
|
2013-07-03 18:39:59 +04:00
|
|
|
for (var controlled_id in show_fields[f.id]['values'])
|
|
|
|
{
|
2014-03-31 18:43:20 +04:00
|
|
|
var controlled = document.getElementById(controlled_id);
|
2013-07-03 18:39:59 +04:00
|
|
|
if (!controlled)
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
var vals = show_fields[f.id]['values'][controlled_id];
|
|
|
|
for (var value_id in vals)
|
|
|
|
{
|
|
|
|
if (!vals[value_id][control_id])
|
|
|
|
{
|
2014-03-27 16:09:23 +04:00
|
|
|
continue;
|
2013-07-03 18:39:59 +04:00
|
|
|
}
|
|
|
|
if (vals[value_id][control_id].is_default == 1)
|
|
|
|
{
|
|
|
|
document.getElementById('v' + value_id + '_' + controlled_id).selected = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-03-31 18:43:20 +04:00
|
|
|
handleControllerField(null, f);
|
2011-07-20 16:48:26 +04:00
|
|
|
addListener(f, 'change', handleControllerField_this);
|
2013-07-03 18:39:59 +04:00
|
|
|
}
|
2011-02-02 16:16:11 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
function getSelectedIds(sel)
|
|
|
|
{
|
|
|
|
var lm = sel.id.length+2;
|
|
|
|
var opt = {};
|
2014-03-31 18:43:20 +04:00
|
|
|
if (sel.type == 'hidden' && sel.name == 'product')
|
|
|
|
{
|
|
|
|
// product is a special case - it is preselected as hidden field on bug creation form
|
|
|
|
opt[product_id] = true;
|
|
|
|
return opt;
|
|
|
|
}
|
2011-02-02 16:16:11 +03:00
|
|
|
for (var i = 0; i < sel.options.length; i++)
|
|
|
|
{
|
|
|
|
if (sel.options[i].selected)
|
|
|
|
{
|
|
|
|
id = sel.options[i].id;
|
|
|
|
opt[id.substr(1, id.length-lm)] = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return opt;
|
|
|
|
}
|
|
|
|
|
2011-07-20 16:48:26 +04:00
|
|
|
function handleControllerField_this(e)
|
|
|
|
{
|
|
|
|
return handleControllerField(e, this);
|
|
|
|
}
|
|
|
|
|
2014-03-31 18:43:20 +04:00
|
|
|
// Turn on/off fields and values controlled by 'controller' argument
|
2011-02-02 16:16:11 +03:00
|
|
|
function handleControllerField(e, controller)
|
|
|
|
{
|
|
|
|
var vis, label_container, field_container, id;
|
|
|
|
var opt = getSelectedIds(controller);
|
2014-03-31 18:43:20 +04:00
|
|
|
// Show/hide fields
|
2011-02-02 16:16:11 +03:00
|
|
|
for (var controlled_id in show_fields[controller.id]['fields'])
|
|
|
|
{
|
|
|
|
vis = false;
|
|
|
|
for (var value in show_fields[controller.id]['fields'][controlled_id])
|
|
|
|
{
|
|
|
|
if (opt[value])
|
|
|
|
{
|
|
|
|
vis = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
label_container = document.getElementById('field_label_' + controlled_id);
|
|
|
|
field_container = document.getElementById('field_container_' + controlled_id);
|
|
|
|
if (vis)
|
|
|
|
{
|
2011-07-20 16:48:26 +04:00
|
|
|
removeClass(label_container, 'bz_hidden_field');
|
|
|
|
removeClass(field_container, 'bz_hidden_field');
|
2011-02-02 16:16:11 +03:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2011-07-20 16:48:26 +04:00
|
|
|
addClass(label_container, 'bz_hidden_field');
|
|
|
|
addClass(field_container, 'bz_hidden_field');
|
2011-02-02 16:16:11 +03:00
|
|
|
}
|
|
|
|
}
|
2014-03-31 18:43:20 +04:00
|
|
|
// Change select options
|
2011-02-02 16:16:11 +03:00
|
|
|
var item, controlled, copt, controlled_value;
|
|
|
|
for (var controlled_id in show_fields[controller.id]['values'])
|
|
|
|
{
|
|
|
|
controlled = document.getElementById(controlled_id);
|
|
|
|
copt = getSelectedIds(controlled);
|
|
|
|
bz_clearOptions(controlled);
|
|
|
|
for (var i in show_fields[controlled.id]['legal'])
|
|
|
|
{
|
|
|
|
controlled_value = show_fields[controlled.id]['legal'][i];
|
2012-11-02 16:54:16 +04:00
|
|
|
vis = true;
|
2011-02-02 16:16:11 +03:00
|
|
|
item = show_fields[controller.id]['values'][controlled_id][controlled_value[0]];
|
2012-11-02 16:54:16 +04:00
|
|
|
if (item)
|
2011-02-02 16:16:11 +03:00
|
|
|
{
|
|
|
|
for (var value in item)
|
|
|
|
{
|
2012-11-02 16:54:16 +04:00
|
|
|
vis = false;
|
2011-02-02 16:16:11 +03:00
|
|
|
if (opt[value])
|
|
|
|
{
|
|
|
|
vis = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (vis)
|
|
|
|
{
|
|
|
|
item = bz_createOptionInSelect(controlled, controlled_value[1], controlled_value[1]);
|
|
|
|
item.id = 'v'+controlled_value[0]+'_'+controlled_id;
|
|
|
|
if (copt[controlled_value[0]])
|
2014-03-31 18:43:20 +04:00
|
|
|
{
|
2011-02-02 16:16:11 +03:00
|
|
|
item.selected = true;
|
2014-03-31 18:43:20 +04:00
|
|
|
}
|
2011-02-02 16:16:11 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|