Use same URI for both types of fieldvaluecontrol.cgi -- they're identical

hinted-selects
Vitaliy Filippov 2014-07-08 15:50:12 +04:00
parent c2c97c06af
commit fddf47e859
7 changed files with 42 additions and 60 deletions

View File

@ -981,17 +981,6 @@ sub fieldvaluecontrol
return $cache->{fieldvaluecontrol};
}
sub full_json_visibility
{
my $class = shift;
my $qv = {};
for ($class->get_fields({ is_select => 1, obsolete => 0 }))
{
$qv->{$_->name} = $_->json_visibility;
}
return $qv;
}
sub active_custom_fields
{
my $class = shift;

View File

@ -22,7 +22,7 @@ my $ctype = 'text/javascript'.(Bugzilla->params->{utf8} ? '; charset=utf-8' : ''
Bugzilla->cache_fields;
my $touched = datetime_from(Bugzilla->request_cache->{fields_delta_ts})->epoch;
my $user_tag = 'JS'.($args->{type}||'x').($user->id||0);
my $user_tag = 'JSmeta'.($user->id||0);
my ($req_tag) = ($ENV{HTTP_IF_NONE_MATCH} || '') =~ /(JS[a-z0-9_]{3,})/iso;
if ($ENV{HTTP_IF_MODIFIED_SINCE} && $user_tag eq $req_tag)
@ -49,23 +49,14 @@ Bugzilla->send_header(
-cache_control => 'private, no-cache, must-revalidate',
);
# FIXME Use same URI for both types, because they are basically identical
$args->{type} ||= '';
if ($args->{type} eq 'search')
my $json = {};
for (Bugzilla->get_fields({ is_select => 1, obsolete => 0 }))
{
my $json = bz_encode_json(Bugzilla->full_json_visibility);
print "var qfVisCached = '$user_tag-".time."';
var qfVisibility = $json;
addListener(window, 'load', initQueryformFields);
";
}
elsif ($args->{type} eq 'bug')
{
my $json = bz_encode_json(Bugzilla->full_json_visibility);
print "var show_fields_cached = '$user_tag-".time."';
var show_fields = $json;
addListener(window, 'load', initControlledFields);
";
$json->{$_->name} = $_->json_visibility;
}
$json = bz_encode_json($json);
print "var field_metadata_cached = '$user_tag-".time."';
var field_metadata = $json;
";
exit;

View File

@ -3,7 +3,8 @@
* Author(s): Vitaliy Filippov <vitalif@mail.ru>
*/
// This is set to window.onload event from fieldvaluecontrol.cgi
addListener(window, 'load', initControlledFields);
function initControlledFields()
{
// Initialise fields in correct order (starting with top-most controller fields)
@ -13,14 +14,14 @@ function initControlledFields()
if (f && !initialised[f])
{
initialised[f] = true;
doInit(show_fields[f].visibility_field);
doInit(show_fields[f].value_field);
doInit(show_fields[f].null_field);
doInit(show_fields[f].default_field);
doInit(field_metadata[f].visibility_field);
doInit(field_metadata[f].value_field);
doInit(field_metadata[f].null_field);
doInit(field_metadata[f].default_field);
initControllerField(f);
}
};
for (var i in show_fields)
for (var i in field_metadata)
{
doInit(i);
}
@ -31,10 +32,10 @@ function initControllerField(i)
var f = document.getElementById(i);
if (f)
{
if (document.forms['Create'] && show_fields[i].default_value)
if (document.forms['Create'] && field_metadata[i].default_value)
{
// Select global default value before selecting dependent ones
f._oldDefault = setFieldValue(f, show_fields[i].default_value);
f._oldDefault = setFieldValue(f, field_metadata[i].default_value);
}
handleControllerField(document.forms['Create'] ? null : 'INITIAL', f);
addListener(f, 'change', handleControllerField_this);
@ -131,9 +132,9 @@ function handleControllerField(e, controller)
var vis, field_container, id;
var opt = getSelectedIds(controller);
// Show/hide fields
for (var controlled_id in show_fields[controller.id]['fields'])
for (var controlled_id in field_metadata[controller.id]['fields'])
{
vis = checkValueVisibility(opt, show_fields[controller.id]['fields'][controlled_id]);
vis = checkValueVisibility(opt, field_metadata[controller.id]['fields'][controlled_id]);
for (var i in { row: 1, container: 1, label: 1 })
{
field_container = document.getElementById('field_' + i + '_' + controlled_id);
@ -148,21 +149,21 @@ function handleControllerField(e, controller)
return;
}
var item, controlled, copt, controlled_value;
for (var controlled_id in show_fields[controller.id]['values'])
for (var controlled_id in field_metadata[controller.id]['values'])
{
// It is more correct to match selected values on name, because a
// target_milestone/version/component with the same name may exist for a different product
controlled = document.getElementById(controlled_id);
copt = getSelectedNames(controlled);
bz_clearOptions(controlled);
if (show_fields[controlled.id].nullable && !controlled.multiple)
if (field_metadata[controlled.id].nullable && !controlled.multiple)
{
bz_createOptionInSelect(controlled, '---', '');
}
for (var i in show_fields[controlled.id]['legal'])
for (var i in field_metadata[controlled.id]['legal'])
{
controlled_value = show_fields[controlled.id]['legal'][i];
vis = checkValueVisibility(opt, show_fields[controller.id]['values'][controlled_id][controlled_value[0]]);
controlled_value = field_metadata[controlled.id]['legal'][i];
vis = checkValueVisibility(opt, field_metadata[controller.id]['values'][controlled_id][controlled_value[0]]);
if (vis)
{
item = bz_createOptionInSelect(controlled, controlled_value[1], controlled_value[1]);
@ -175,12 +176,12 @@ function handleControllerField(e, controller)
}
}
// Enable/disable NULL in single-select fields
for (var controlled_id in show_fields[controller.id]['null'])
for (var controlled_id in field_metadata[controller.id]['null'])
{
controlled = document.getElementById(controlled_id);
if (controlled && !controlled.multiple && show_fields[controlled.id] && show_fields[controlled.id].nullable)
if (controlled && !controlled.multiple && field_metadata[controlled.id] && field_metadata[controlled.id].nullable)
{
vis = checkValueVisibility(opt, show_fields[controller.id]['null'][controlled_id]);
vis = checkValueVisibility(opt, field_metadata[controller.id]['null'][controlled_id]);
item = controlled.options[0].value == '';
if (vis && !item)
{
@ -195,7 +196,7 @@ function handleControllerField(e, controller)
}
// Select default values in controlled fields
var v;
for (var controlled_id in show_fields[controller.id]['defaults'])
for (var controlled_id in field_metadata[controller.id]['defaults'])
{
controlled = document.getElementById(controlled_id);
if (!controlled)
@ -235,10 +236,10 @@ function handleControllerField(e, controller)
// else means we are on creation form, so also select
if (!diff)
{
v = show_fields[controller.id].default_value;
v = field_metadata[controller.id].default_value;
for (var i in opt)
{
v = show_fields[controller.id]['defaults'][controlled_id][i];
v = field_metadata[controller.id]['defaults'][controlled_id][i];
}
if (v)
{

View File

@ -6,10 +6,10 @@
JavaScript code to hide and show values of select fields on the query form.
I.e. hide dependent values when their controlling value is hidden.
This code uses client-side cached qfVisibility hash data generated by
fieldvaluecontrol.cgi?type=search.
This code uses client-side cached field_metadata hash data generated by
fieldvaluecontrol.cgi.
qfVisibility format: {
field_metadata format: {
// for each field:
field_name : {
// all legal values for the field:
@ -51,10 +51,11 @@ respecting this "list of active IDs".
var qfHandling = {};
// This is set to onload event from fieldvaluecontrol.cgi
addListener(window, 'load', initQueryformFields);
function initQueryformFields()
{
for (var i in qfVisibility)
for (var i in field_metadata)
{
if (!qfHandling[i])
{
@ -163,7 +164,7 @@ function handleQueryformField(event, controller)
var controlled, controlled_selected;
var vis, item, legal, name2id, name2id_order, valueVD;
qfHandling[controller.id] = true; // prevent double-action during init
var VD = qfVisibility[controller.id];
var VD = field_metadata[controller.id];
var visibility_selected = getQueryformSelectedIds(controller);
var ids = {};
for (var i in VD.fields)
@ -199,7 +200,7 @@ function handleQueryformField(event, controller)
// Loop over all legal values and remember currently
// visible IDs inside name2id preserving their original
// order using name2id_order
legal = qfVisibility[controlled_id].legal;
legal = field_metadata[controlled_id].legal;
name2id = {};
name2id_order = [];
if (qfCheckVisibility(VD.fields[controlled_id], visibility_selected))
@ -221,7 +222,7 @@ function handleQueryformField(event, controller)
}
}
// Create NULL option
if (name2id_order.length > 0 && qfVisibility[controlled_id].nullable)
if (name2id_order.length > 0 && field_metadata[controlled_id].nullable)
{
item = bz_createOptionInSelect(controlled, '---', '---');
if (controlled_selected['---'])

View File

@ -34,7 +34,7 @@
style_urls = [ 'skins/standard/create_attachment.css', 'skins/standard/calendar.css' ]
javascript_urls = [
"js/attachment.js", "js/bug.js", "js/enter_bug.js", "js/field.js", "js/calendar.js",
"js/TUI.js", "js/bug-visibility.js", "fieldvaluecontrol.cgi?type=bug&user=${Bugzilla.user.id}"
"js/TUI.js", "js/bug-visibility.js", "fieldvaluecontrol.cgi?user=${Bugzilla.user.id}"
]
%]

View File

@ -38,7 +38,7 @@
[% title = "$terms.Bug $bug.bug_id &ndash; $filtered_desc &ndash; $filtered_prodcomp &ndash; $filtered_stat" %]
[% header = "$terms.Bug&nbsp;$bug.bug_id" %]
[% header_addl_info = "Last modified: $filtered_timestamp" %]
[% javascript_urls = [ "js/field.js", "js/calendar.js", "js/bug-visibility.js?rev=1397", "fieldvaluecontrol.cgi?type=bug&user=${Bugzilla.user.id}" ] %]
[% javascript_urls = [ "js/field.js", "js/calendar.js", "js/bug-visibility.js?rev=1397", "fieldvaluecontrol.cgi?user=${Bugzilla.user.id}" ] %]
[% style_urls = [ "skins/standard/calendar.css", "skins/standard/show_bug.css", "skins/standard/comments.css" ] %]
[% doc_section = "bug_page.html" %]

View File

@ -24,7 +24,7 @@
<script type="text/javascript" src="js/query-visibility.js"></script>
<script type="text/javascript" src="js/field.js"></script>
<script type="text/javascript" src="fieldvaluecontrol.cgi?type=search&user=[% Bugzilla.user.id %]"></script>
<script type="text/javascript" src="fieldvaluecontrol.cgi?user=[% Bugzilla.user.id %]"></script>
<script type="text/javascript" src="js/query-form.js"></script>
[% SET checkwidths = [] %]