Bug 90854 - External URL type
git-svn-id: svn://svn.office.custis.ru/3rdparty/bugzilla.org/trunk@1474 6955db30-a419-402b-8a0d-67ecbb4d7f56master
parent
777ddda9aa
commit
d60a06ebad
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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'))
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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)$/)
|
||||
{
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -120,7 +120,16 @@
|
|||
</tr>
|
||||
|
||||
<tr>
|
||||
<td colspan="2"> </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>
|
||||
|
|
|
@ -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> </th>
|
||||
<td> </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 %]">
|
||||
|
|
|
@ -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 %]"
|
||||
|
|
Loading…
Reference in New Issue