Bug 90854 - External URL type

git-svn-id: svn://svn.office.custis.ru/3rdparty/bugzilla.org/trunk@1474 6955db30-a419-402b-8a0d-67ecbb4d7f56
master
vfilippov 2011-12-19 13:11:45 +00:00
parent 777ddda9aa
commit d60a06ebad
14 changed files with 85 additions and 24 deletions

View File

@ -134,6 +134,7 @@ use constant REQUIRED_CREATE_FIELDS => qw(
our $CUSTOM_FIELD_VALIDATORS = {
FIELD_TYPE_UNKNOWN() => \&_check_default_field,
FIELD_TYPE_FREETEXT() => \&_check_freetext_field,
FIELD_TYPE_EXTURL() => \&_check_freetext_field,
FIELD_TYPE_SINGLE_SELECT() => \&_check_select_field,
FIELD_TYPE_MULTI_SELECT() => \&_check_multi_select_field,
FIELD_TYPE_TEXTAREA() => \&_check_default_field,

View File

@ -130,6 +130,7 @@ use Cwd qw(abs_path);
FIELD_TYPE_DATETIME
FIELD_TYPE_BUG_ID
FIELD_TYPE_BUG_URLS
FIELD_TYPE_EXTURL
FIELD_TYPE_NUMERIC
FIELD_TYPE__BOUNDARY
@ -377,18 +378,19 @@ use constant SENDMAIL_PATH => '/usr/lib:/usr/sbin:/usr/ucblib';
# we do more than we would do for a standard integer type (f.e. we might
# display a user picker).
use constant FIELD_TYPE_UNKNOWN => 0;
use constant FIELD_TYPE_FREETEXT => 1;
use constant FIELD_TYPE_UNKNOWN => 0;
use constant FIELD_TYPE_FREETEXT => 1;
use constant FIELD_TYPE_SINGLE_SELECT => 2;
use constant FIELD_TYPE_MULTI_SELECT => 3;
use constant FIELD_TYPE_TEXTAREA => 4;
use constant FIELD_TYPE_DATETIME => 5;
use constant FIELD_TYPE_BUG_ID => 6;
use constant FIELD_TYPE_TEXTAREA => 4;
use constant FIELD_TYPE_DATETIME => 5;
use constant FIELD_TYPE_BUG_ID => 6;
use constant FIELD_TYPE_BUG_URLS => 7;
use constant FIELD_TYPE_NUMERIC => 8;
use constant FIELD_TYPE_EXTURL => 9;
# Upper boundary for FIELD_TYPE_* values
use constant FIELD_TYPE__BOUNDARY => 8;
use constant FIELD_TYPE__BOUNDARY => 9;
use constant BUG_ID_ADD_TO_BLOCKED => 1;
use constant BUG_ID_ADD_TO_DEPENDSON => 2;

View File

@ -107,6 +107,7 @@ use constant DB_COLUMNS => qw(
delta_ts
has_activity
add_to_deps
url
);
use constant REQUIRED_CREATE_FIELDS => qw(name description);
@ -143,6 +144,7 @@ use constant UPDATE_COLUMNS => qw(
delta_ts
has_activity
add_to_deps
url
);
# How various field types translate into SQL data definitions.
@ -150,6 +152,7 @@ use constant SQL_DEFINITIONS => {
# Using commas because these are constants and they shouldn't
# be auto-quoted by the "=>" operator.
FIELD_TYPE_FREETEXT, { TYPE => 'varchar(255)' },
FIELD_TYPE_EXTURL, { TYPE => 'varchar(255)' },
FIELD_TYPE_SINGLE_SELECT, { TYPE => 'varchar(255)', NOTNULL => 1,
DEFAULT => "'---'" },
FIELD_TYPE_TEXTAREA, { TYPE => 'MEDIUMTEXT' },
@ -482,6 +485,8 @@ sub has_activity { $_[0]->{has_activity} }
sub add_to_deps { $_[0]->{add_to_deps} }
sub url { $_[0]->{url} }
sub legal_values
{
my $self = shift;
@ -716,6 +721,7 @@ sub set_sortkey { $_[0]->set('sortkey', $_[1]); }
sub set_in_new_bugmail { $_[0]->set('mailhead', $_[1]); }
sub set_buglist { $_[0]->set('buglist', $_[1]); }
sub set_add_to_deps { $_[0]->set('add_to_deps', $_[1]); }
sub set_url { $_[0]->set('url', $_[1]); }
sub set_visibility_field
{

View File

@ -66,6 +66,7 @@ $Bugzilla::messages->{en} = {
field_types => {
FIELD_TYPE_UNKNOWN() => 'Unknown Type',
FIELD_TYPE_FREETEXT() => 'Free Text',
FIELD_TYPE_EXTURL() => 'External URL',
FIELD_TYPE_SINGLE_SELECT() => 'Drop Down',
FIELD_TYPE_MULTI_SELECT() => 'Multiple-Selection Box',
FIELD_TYPE_TEXTAREA() => 'Large Text Box',

View File

@ -616,6 +616,8 @@ sub create {
# a full URL that may have characters that need encoding.
url_quote => \&Bugzilla::Util::url_quote,
url_quote_ns => \&Bugzilla::Util::url_quote_noslash,
# This filter is similar to url_quote but used a \ instead of a %
# as prefix. In addition it replaces a ' ' by a '_'.
css_class_quote => \&Bugzilla::Util::css_class_quote,

View File

@ -225,6 +225,16 @@ sub url_quote {
return $toencode;
}
# Same, but doesn't quote the forward slash "/"
sub url_quote_noslash
{
my ($toencode) = (@_);
utf8::encode($toencode) # The below regex works only on bytes
if Bugzilla->params->{utf8} && utf8::is_utf8($toencode);
$toencode =~ s!([^a-zA-Z0-9_\-\./])!uc sprintf("%%%02x",ord($1))!ego;
return $toencode;
}
sub css_class_quote {
my ($toencode) = (@_);
$toencode =~ s#[ /]#_#g;

View File

@ -59,6 +59,7 @@ elsif ($action eq 'new')
my $field = $vars->{field} = Bugzilla::Field->create({
name => scalar $cgi->param('name'),
url => scalar $cgi->param('url'),
description => scalar $cgi->param('desc'),
type => scalar $cgi->param('type'),
sortkey => scalar $cgi->param('sortkey'),
@ -107,6 +108,7 @@ elsif ($action eq 'update')
$field->set_sortkey($cgi->param('sortkey'));
$field->set_in_new_bugmail($cgi->param('new_bugmail'));
$field->set_obsolete($cgi->param('obsolete'));
$field->set_url($cgi->param('url'));
if ($field->custom)
{
# TODO enter_bug could be edited for non-custom fields, too.

View File

@ -111,6 +111,9 @@ sub db_schema_abstract_schema
# Bug 69325 - Настройка копирования / не копирования значения поля при клонировании бага
push @{$schema->{fielddefs}->{FIELDS}}, clone_bug => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 1};
# Bug 90854 - Тип поля "ссылка во внешнюю систему по ID"
push @{$schema->{fielddefs}->{FIELDS}}, url => {TYPE => 'VARCHAR(255)'};
# Bug 70605 - Кэширование зависимостей полей для поиска и формы бага на клиентской стороне
push @{$schema->{fielddefs}->{FIELDS}}, delta_ts => {TYPE => 'DATETIME'};
push @{$schema->{fielddefs}->{FIELDS}}, has_activity => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 0};
@ -368,6 +371,9 @@ sub install_update_fielddefs
# Bug 69325 - Настройка копирования / не копирования значения поля при клонировании бага
$dbh->bz_add_column('fielddefs', clone_bug => {TYPE => 'BOOLEAN', NOTNULL => 1, DEFAULT => 1});
# Bug 90854 - Тип поля "ссылка во внешнюю систему по ID"
$dbh->bz_add_column('fielddefs', url => {TYPE => 'VARCHAR(255)'});
# Bug 70605 - Кэширование зависимостей полей для поиска и формы бага на клиентской стороне
if (!$dbh->bz_column_info('fielddefs', 'delta_ts'))
{

View File

@ -185,16 +185,6 @@ sub quote_urls_custom_proto
## НЕ-хуки:
##
# url_quote, не экранирующий /
sub url_quote_slash
{
my ($toencode) = (@_);
utf8::encode($toencode) # The below regex works only on bytes
if Bugzilla->params->{utf8} && utf8::is_utf8($toencode);
$toencode =~ s!([^a-zA-Z0-9_\-\./])!uc sprintf("%%%02x",ord($1))!ego;
return $toencode;
}
# Кодирование anchor'а подзаголовка wiki-статьи
sub process_wiki_anchor
{
@ -214,7 +204,7 @@ sub process_wiki_url
$url = trim($url);
$url =~ s/\s+/_/gso;
# обычный url_quote нам не подходит, т.к. / не нужно переделывать в %2F
$url = url_quote_slash($url);
$url = url_quote_noslash($url);
return $base . $url . '#' . process_wiki_anchor($anchor);
}

View File

@ -273,7 +273,7 @@ if (Bugzilla->params->{usestatuswhiteboard})
push @{$vars->{freetext_fields}}, Bugzilla->get_field('status_whiteboard');
}
push @{$vars->{freetext_fields}},
Bugzilla->active_custom_fields({ type => [ FIELD_TYPE_TEXTAREA, FIELD_TYPE_FREETEXT ] });
Bugzilla->active_custom_fields({ type => [ FIELD_TYPE_TEXTAREA, FIELD_TYPE_FREETEXT, FIELD_TYPE_EXTURL ] });
if ($params->{format} && $params->{format} =~ /^report-(table|graph)$/)
{

View File

@ -40,6 +40,9 @@ function onChangeType(type_field) {
value_field.disabled = false;
else
value_field.disabled = true;
var u = type_field.value == [% constants.FIELD_TYPE_EXTURL %];
document.getElementById('url_title').style.display = u ? '' : 'none';
document.getElementById('url_field').style.display = u ? '' : 'none';
}
function onChangeVisibilityField() {

View File

@ -120,7 +120,16 @@
</tr>
<tr>
<td colspan="2">&nbsp;</td>
<th>
<label for="url" id="url_title" style="display: none">
URL template:<br />($1 = target ID)
</label>
</th>
<td>
<input id="url_field" name="url" type="text" size="40" value="" style="display: none" />
</td>
<th>
<label for="value_field_id">
Field that controls the values<br>

View File

@ -80,7 +80,7 @@
<td><input type="checkbox" id="obsolete" name="obsolete" value="1"
[%- " checked" IF field.obsolete %]></td>
</tr>
<tr>
<tr valign="top">
<th align="right"><label for="sortkey">Sortkey:</label></th>
<td>
<input type="text" id="sortkey" name="sortkey" size="6" maxlength="6"
@ -91,7 +91,7 @@
<th align="right">
<label for="visibility_field_id">Field only appears when:</label>
</th>
<td>
<td valign="top">
<select name="visibility_field_id" id="visibility_field_id"
onchange="onChangeVisibilityField()">
<option></option>
@ -168,10 +168,18 @@
</tr>
[% END %]
<tr>
<th>&nbsp;</th>
<td>&nbsp;</td>
[% IF field.type == constants.FIELD_TYPE_EXTURL %]
<tr valign="top">
<th>
<label for="url" id="url_title">
URL template:<br />($1 = target ID)
</label>
</th>
<td>
<input id="url_field" name="url" type="text" size="40" value="[% field.url | html %]" />
</td>
</tr>
[% END %]
</table>
<input type="hidden" name="action" value="update">
<input type="hidden" name="name" value="[% field.name FILTER html %]">

View File

@ -110,6 +110,27 @@
'[% field.name FILTER js %]',
"[% bug.${field.name} FILTER js %]");
</script>
[% CASE constants.FIELD_TYPE_EXTURL %]
<span id="[% field.name FILTER html %]_input_area">
<input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]"
[% IF tabindex %] tabindex="[% tabindex FILTER html %]"[% END %]
value="[% value FILTER html %]" size="30" />
</span>
[% IF bug.${field.name} %]
[% SET url_quoted = bug.${field.name} | url_quote_ns %]
<a href="[% field.url.replace('\$1', url_quoted) %]">[% bug.${field.name} | html %]</a>
[% END %]
<span id="[% field.name FILTER html %]_edit_container" class="edit_me bz_default_hidden">
(<a href="#" id="[% field.name FILTER html %]_edit_action" [% IF tabindex %] tabindex="[% tabindex FILTER html %]"[% END %]>edit</a>)
</span>
<script type="text/javascript">
hideEditableField('[% field.name FILTER js %]_edit_container',
'[% field.name FILTER js %]_input_area',
'[% field.name FILTER js %]_edit_action',
'[% field.name FILTER js %]',
"[% bug.${field.name} FILTER js %]");
</script>
[% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
constants.FIELD_TYPE_MULTI_SELECT ] %]
<select id="[% field.name FILTER html %]"