Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
bugzilla
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ivan Ivlev
bugzilla
Commits
6f647ebd
Commit
6f647ebd
authored
Mar 18, 2020
by
Давид Добряков
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add productive_time field
parent
81974a9a
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
49 additions
and
1281 deletions
+49
-1281
.gitignore
.gitignore
+1
-0
Bug.pm
Bugzilla/Bug.pm
+8
-2
Comment.pm
Bugzilla/Comment.pm
+10
-0
Constants.pm
Bugzilla/Constants.pm
+1
-1
Field.pm
Bugzilla/Field.pm
+1
-0
DB.pm
Bugzilla/Install/DB.pm
+2
-0
DB.pm~
Bugzilla/Install/DB.pm~
+0
-0
Bug.pm
Bugzilla/WebService/Bug.pm
+1
-1
process_bug.cgi
process_bug.cgi
+4
-3
.show.html.tmpl.swp
template/ru/default/bug/activity/.show.html.tmpl.swp
+0
-0
comments.html.tmpl
template/ru/default/bug/comments.html.tmpl
+16
-1
edit.html.tmpl
template/ru/default/bug/edit.html.tmpl
+5
-5
edit.html.tmpl~
template/ru/default/bug/edit.html.tmpl~
+0
-1268
No files found.
.gitignore
View file @
6f647ebd
...
...
@@ -9,6 +9,7 @@
/data
/localconfig
/index.html
*.*~
/skins/contrib/Dusk/admin.css
/skins/contrib/Dusk/bug.css
Bugzilla/Bug.pm
View file @
6f647ebd
...
...
@@ -1074,6 +1074,11 @@ sub update {
LogActivityEntry
(
$self
->
id
,
"work_time"
,
""
,
$comment
->
work_time
,
$user
->
id
,
$delta_ts
);
}
if
(
$comment
->
productive_time
)
{
LogActivityEntry
(
$self
->
id
,
"productive_time"
,
""
,
$comment
->
productive_time
,
$user
->
id
,
$delta_ts
);
}
}
# Comment Privacy
...
...
@@ -2494,7 +2499,7 @@ sub set_all {
}
}
if
(
exists
$params
->
{
'comment'
}
or
exists
$params
->
{
'work_time'
})
{
if
(
exists
$params
->
{
'comment'
}
or
exists
$params
->
{
'work_time'
}
or
exists
$params
->
{
'productive_time'
}
)
{
# Add a comment as needed to each bug. This is done early because
# there are lots of things that want to check if we added a comment.
...
...
@@ -2502,7 +2507,8 @@ sub set_all {
$params
->
{
'comment'
}
->
{
'body'
},
{
isprivate
=>
$params
->
{
'comment'
}
->
{
'is_private'
},
work_time
=>
$params
->
{
'work_time'
}
work_time
=>
$params
->
{
'work_time'
},
productive_time
=>
$params
->
{
'productive_time'
}
}
);
}
...
...
Bugzilla/Comment.pm
View file @
6f647ebd
...
...
@@ -38,6 +38,7 @@ use constant DB_COLUMNS => qw(
who
bug_when
work_time
productive_time
thetext
isprivate
already_wrapped
...
...
@@ -64,6 +65,7 @@ use constant VALIDATORS => {
who
=>
\&
_check_who
,
bug_when
=>
\&
_check_bug_when
,
work_time
=>
\&
_check_work_time
,
productive_time
=>
\&
_check_work_time
,
thetext
=>
\&
_check_thetext
,
isprivate
=>
\&
_check_isprivate
,
extra_data
=>
\&
_check_extra_data
,
...
...
@@ -194,6 +196,14 @@ sub work_time {
return
0
if
$_
[
0
]
->
{
'work_time'
}
+
0
==
0
;
return
$_
[
0
]
->
{
'work_time'
};
}
sub
productive_time
{
# Work_time-like function
return
0
if
$_
[
0
]
->
{
'productive_time'
}
+
0
==
0
;
return
$_
[
0
]
->
{
'productive_time'
};
}
sub
type
{
return
$_
[
0
]
->
{
'type'
};
}
sub
extra_data
{
return
$_
[
0
]
->
{
'extra_data'
}
}
...
...
Bugzilla/Constants.pm
View file @
6f647ebd
...
...
@@ -433,7 +433,7 @@ use constant ABNORMAL_SELECTS =>
# The fields from fielddefs that are blocked from non-timetracking users.
# work_time is sometimes called actual_time.
use
constant
TIMETRACKING_FIELDS
=>
qw(estimated_time remaining_time work_time actual_time percentage_complete)
;
qw(estimated_time remaining_time work_time actual_time percentage_complete
productive_time
)
;
# The maximum number of days a token will remain valid.
use
constant
MAX_TOKEN_AGE
=>
3
;
...
...
Bugzilla/Field.pm
View file @
6f647ebd
...
...
@@ -365,6 +365,7 @@ use constant DEFAULT_FIELDS => (
{
name
=>
'requestees.login_name'
,
desc
=>
'Flag Requestee'
},
{
name
=>
'setters.login_name'
,
desc
=>
'Flag Setter'
},
{
name
=>
'work_time'
,
desc
=>
'Hours Worked'
,
buglist
=>
1
,
is_numeric
=>
1
},
{
name
=>
'productive_time'
,
desc
=>
'Productive hours worked'
,
buglist
=>
1
,
is_numeric
=>
1
},
{
name
=>
'percentage_complete'
,
desc
=>
'Percentage Complete'
,
...
...
Bugzilla/Install/DB.pm
View file @
6f647ebd
...
...
@@ -268,6 +268,8 @@ sub update_table_definitions {
$dbh
->
bz_add_column
(
"bugs"
,
"remaining_time"
,
{
TYPE
=>
'decimal(5,2)'
,
NOTNULL
=>
1
,
DEFAULT
=>
'0'
});
$dbh
->
bz_add_column
(
"bugs"
,
"deadline"
,
{
TYPE
=>
'DATETIME'
});
$dbh
->
bz_add_column
(
"longdescs"
,
"productive_time"
,
{
TYPE
=>
'decimal(5,2)'
,
NOTNULL
=>
1
,
DEFAULT
=>
'0'
});
_use_ip_instead_of_hostname_in_logincookies
();
...
...
Bugzilla/Install/DB.pm~
deleted
100644 → 0
View file @
81974a9a
This source diff could not be displayed because it is too large. You can
view the blob
instead.
Bugzilla/WebService/Bug.pm
View file @
6f647ebd
...
...
@@ -1003,7 +1003,7 @@ sub add_comment {
# Append comment
$bug
->
add_comment
(
$comment
,
{
isprivate
=>
$params
->
{
is_private
},
work_time
=>
$params
->
{
work_time
}});
{
isprivate
=>
$params
->
{
is_private
},
work_time
=>
$params
->
{
work_time
}
,
productive_time
=>
$params
->
{
productive_time
});
$bug
->
update
();
my
$new_comment_id
=
$bug
->
{
added_comments
}[
0
]
->
id
;
...
...
process_bug.cgi
View file @
6f647ebd
...
...
@@ -105,6 +105,8 @@ print $cgi->header() unless Bugzilla->usage_mode == USAGE_MODE_EMAIL;
# an individual bug.
my
$delta_ts
=
$cgi
->
param
(
'delta_ts'
)
||
''
;
my
$productive_time
=
$cgi
->
param
(
'productive_time'
)
||
''
;
if
(
$delta_ts
)
{
my
$delta_ts_z
=
datetime_from
(
$delta_ts
)
or
ThrowCodeError
(
'invalid_timestamp'
,
{
timestamp
=>
$delta_ts
});
...
...
@@ -206,7 +208,7 @@ my @set_fields = qw(op_sys rep_platform priority bug_severity
component target_milestone version
bug_file_loc status_whiteboard short_desc
deadline remaining_time estimated_time
work_time set_default_assignee set_default_qa_contact
work_time
productive_time
set_default_assignee set_default_qa_contact
cclist_accessible reporter_accessible
product confirm_product_change
bug_status resolution dup_id bug_ignored)
;
...
...
@@ -220,6 +222,7 @@ my %field_translation = (
set_default_assignee
=>
'reset_assigned_to'
,
set_default_qa_contact
=>
'reset_qa_contact'
,
confirm_product_change
=>
'product_change_confirmed'
,
productive_time
=>
'productive_time'
,
);
my
%
set_all_fields
=
(
other_bugs
=>
\
@bug_objects
);
...
...
@@ -232,7 +235,6 @@ foreach my $field_name (@set_fields) {
if
(
should_set
(
'keywords'
))
{
my
$action
=
$cgi
->
param
(
'keywordaction'
)
||
''
;
# Backward-compatibility for Bugzilla 3.x and older.
$action
=
'remove'
if
$action
eq
'delete'
;
$action
=
'set'
if
$action
eq
'makeexact'
;
...
...
@@ -358,7 +360,6 @@ if (defined $cgi->param('id')) {
my
(
$flags
,
$new_flags
)
=
Bugzilla::
Flag
->
extract_flags_from_cgi
(
$first_bug
,
undef
,
$vars
);
$first_bug
->
set_flags
(
$flags
,
$new_flags
);
# Tags can only be set to one bug at once.
if
(
should_set
(
'tag'
))
{
my
@new_tags
=
grep
{
trim
(
$_
)
}
split
(
/,/
,
$cgi
->
param
(
'tag'
));
...
...
template/ru/default/bug/activity/.show.html.tmpl.swp
deleted
100644 → 0
View file @
81974a9a
File deleted
template/ru/default/bug/comments.html.tmpl
View file @
6f647ebd
...
...
@@ -202,6 +202,8 @@
<br>
Отработанное время:
[% PROCESS formattimeunit time_unit=comment.work_time %]
Продуктивное время:
<span class="productive-time">[% PROCESS formattimeunit time_unit=comment.productive_time %]</span>
[% END %]
[% IF user.id && Param('comment_taggers_group') %]
...
...
@@ -222,7 +224,6 @@
</span>
</div>
[% END %]
[%# Don't indent the <pre> block, since then the spaces are displayed in the
# generated HTML
#%]
...
...
@@ -235,4 +236,18 @@
[% Hook.process('a_comment-end', 'bug/comments.html.tmpl') %]
</div>
[% END %]
<script type="text/javascript">
let productiveTimes = document.querySelectorAll('.productive-time');
// parse float and get sum
let sum = 0;
for (let i = 0; i < productiveTimes.length; i++) {
sum += parseFloat(productiveTimes[i].innerText);
}
// write in table:
document.querySelector('#productive_time_amount').innerHTML += sum;
</script>
[% END %]
template/ru/default/bug/edit.html.tmpl
View file @
6f647ebd
...
...
@@ -1091,15 +1091,15 @@
time_unit=(bug.actual_time + bug.remaining_time) %]
</td>
<td>
[% PROCESS formattimeunit time_unit=bug.actual_time %]
+
[% PROCESS formattimeunit time_unit=bug.actual_time %]
<input name="work_time" id="work_time"
value="0" size="3" maxlength="6"
onchange="adjustRemainingTime();">
onchange="adjustRemainingTime();"
hidden
>
</td>
<td>
[% PROCESS formattimeunit time_unit=bug.productive_time %]
<td
id="productive_time_amount"
>
[% PROCESS formattimeunit time_unit=bug.productive_time %]
<input name="productive_time" id="productive_time"
value="0" size="3" maxlength="6">
value="0" size="3" maxlength="6"
hidden
>
</td>
<td>
<input name="remaining_time" id="remaining_time"
...
...
template/ru/default/bug/edit.html.tmpl~
deleted
100644 → 0
View file @
81974a9a
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% PROCESS bug/time.html.tmpl %]
[% PROCESS etersoft/timersplash.html.tmpl %]
[% IF Param('comment_taggers_group') %]
[% IF user.can_tag_comments %]
<div id="bz_ctag_div" class="bz_default_hidden">
<a href="javascript:void(0)" onclick="YAHOO.bugzilla.commentTagging.hideInput()">x</a>
<div>
<input id="bz_ctag_add" size="10" placeholder="add tag"
maxlength="[% constants.MAX_COMMENT_TAG_LENGTH FILTER html %]">
<span id="bz_ctag_autocomp"></span>
</div>
</div>
<div id="bz_ctag_error" class="bz_default_hidden">
<a href="javascript:void(0)" onclick="YAHOO.bugzilla.commentTagging.hideError()">x</a>
<span id="bz_ctag_error_msg"></span>
</div>
[% END %]
[% IF user.id %]
<script type="text/javascript">
YAHOO.bugzilla.commentTagging.init([% user.can_tag_comments ? 'true' : 'false' %]);
YAHOO.bugzilla.commentTagging.min_len = [% constants.MIN_COMMENT_TAG_LENGTH FILTER js %];
YAHOO.bugzilla.commentTagging.max_len = [% constants.MAX_COMMENT_TAG_LENGTH FILTER js %];
YAHOO.bugzilla.commentTagging.label = 'Comment Tags:';
YAHOO.bugzilla.commentTagging.min_len_error =
'Comment tags must be at least
[%~ " " _ constants.MIN_COMMENT_TAG_LENGTH FILTER js %] characters.';
YAHOO.bugzilla.commentTagging.max_len_error =
'Comment tags cannot be longer than
[%~ " " _ constants.MAX_COMMENT_TAG_LENGTH FILTER js %] characters.';
</script>
[% END %]
[% END %]
<script type="text/javascript">
<!--
[% IF user.is_timetracker %]
var bz_remaining_time = [% bug.remaining_time %];
[% END %]
[% IF user.id %]
/* Index all classifications so we can keep track of the classification
* for the selected product, which could control field visibility.
*/
var all_classifications = new Array([% bug.choices.product.size %]);
[%- FOREACH product = bug.choices.product %]
all_classifications['[% product.name FILTER js %]'] = '
[%- product.classification.name FILTER js %]';
[%- END %]
[% END %]
//-->
</script>
<form name="changeform" id="changeform" method="post" action="process_bug.cgi">
<input type="hidden" name="delta_ts" value="[% bug.delta_ts %]">
<input type="hidden" name="id" value="[% bug.bug_id %]">
<input type="hidden" name="token" value="[% issue_hash_token([bug.id, bug.delta_ts]) FILTER html %]">
[% PROCESS section_title %]
<table class="edit_form">
<tr>
[%# 1st Column %]
<td id="bz_show_bug_column_1" class="bz_show_bug_column">
<table>
[%# *** ID, product, component, status, resolution, Hardware, and OS *** %]
[% PROCESS section_status %]
[% PROCESS section_spacer %]
[% PROCESS section_aliases %]
[% PROCESS section_spacer %]
[% PROCESS section_details1 %]
[% PROCESS section_spacer %]
[%# *** severity, priority, version, milestone, and deadline *** %]
[% PROCESS section_details2 %]
[%# *** assigned to and qa contact *** %]
[% PROCESS section_people %]
[% PROCESS section_spacer %]
[% PROCESS section_url_keyword_whiteboard %]
[% PROCESS section_spacer %]
[%# *** Dependencies and duplicates *** %]
[% PROCESS section_duplicates %]
[% PROCESS section_dependson_blocks %]
</table>
</td>
<td>
<div class="bz_column_spacer"> </div>
</td>
[%# 2nd Column %]
<td id="bz_show_bug_column_2" class="bz_show_bug_column">
<table>
[%# *** Reported and modified dates *** %]
[% PROCESS section_dates %]
[% PROCESS section_cclist %]
[% PROCESS section_bug_ignored %]
[% PROCESS section_spacer %]
[% PROCESS section_see_also %]
[% PROCESS section_customfields %]
[% PROCESS section_spacer %]
[% Hook.process("after_custom_fields") %]
[% PROCESS section_flags %]
</table>
</td>
</tr>
<tr>
<td colspan="3">
<hr id="bz_top_half_spacer">
</td>
</tr>
</table>
<table id="bz_big_form_parts">
<tr>
<td>
[% IF user.is_timetracker %]
[% PROCESS section_timetracking %]
[% END %]
[%# *** Attachments *** %]
[% PROCESS attachment/list.html.tmpl
attachments = bug.attachments
bugid = bug.bug_id
num_attachment_flag_types = bug.num_attachment_flag_types
show_attachment_flags = bug.show_attachment_flags
%]
[% IF user.settings.comment_box_position.value == 'before_comments' %]
[% PROCESS comment_box %]
[% END %]
</td>
<td>
[% PROCESS section_restrict_visibility %]
</td>
</tr></table>
[%# *** Additional Comments *** %]
<div id="comments">
[% PROCESS bug/comments.html.tmpl
comments = bug.comments
mode = user.id ? "edit" : "show"
%]
</div>
[% IF user.settings.comment_box_position.value == 'after_comments' %]
<hr>
[% PROCESS comment_box %]
[% END %]
</form>
[%############################################################################%]
[%# Block for the Title (alias and short desc) #%]
[%############################################################################%]
[% BLOCK section_title %]
[%# That's the main table, which contains all editable fields. %]
<div class="bz_short_desc_container edit_form">
[% PROCESS commit_button id="_top"%]
<a href="show_bug.cgi?id=[% bug.bug_id %]">
[%-# %]<b>[% terms.Bug %] [% bug.bug_id FILTER html %]</b>
[%-# %]</a> <span id="summary_container" class="bz_default_hidden">
[% IF bug.alias.size > 0 %]
(<span id="alias_nonedit_display">[% bug.alias.join(', ') FILTER html %]</span>)
[% END %]
- <span id="short_desc_nonedit_display">[% bug.short_desc FILTER quoteUrls(bug) %]</span>
[% can_edit_short_desc = bug.check_can_change_field('short_desc', 0, 1) %]
[% IF can_edit_short_desc %]
<small>(<a href="#" id="summary_edit_action">edit</a>)</small>
[% END %]
</span>
<!-- Etersoft -->
<a title="Создать копию текущей [% terms.bug_gen %] по основным параметрам"
href="enter_bug.cgi?product=[% bug.product %]&component=[% bug.component %]&blocked=[% bug_blocked_string %]&assigned_to=[% bug.assigned_to.email %]&cc=[% bug_cc_string %]&qa_contact=[% bug.qa_contact.email %]">Создать подобную</a>
<!-- Etersoft END -->
<div id="summary_input">
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.short_desc
editable = can_edit_short_desc
accesskey = "s"
tag_name = 'span'
%]
[% PROCESS input inputname => "short_desc" size => "80"
maxlength => 255 spellcheck => "true" no_td => 1 %]
</div>
</div>
<script type="text/javascript">
hideEditableField('summary_container',
'summary_input',
'summary_edit_action',
'short_desc',
'[% bug.short_desc FILTER js %]' );
</script>
[% END %]
[%############################################################################%]
[%# Block for the first table in the "Details" section #%]
[%############################################################################%]
[% BLOCK section_details1 %]
[%#############%]
[%# PRODUCT #%]
[%#############%]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.product, value = bug.product
override_legal_values = bug.choices.product
desc_url = "describecomponents.cgi"
editable = bug.check_can_change_field('product', 0, 1)
%]
</tr>
[%# Classification is here so that it can be used in value controllers
# and visibility controllers. It comes after product because
# it uses some javascript that depends on the existence of the
# product field.
#%]
<tr class="bz_default_hidden">
[% INCLUDE bug/field.html.tmpl
bug = bug field = bug_fields.classification
override_legal_values = bug.choices.classification
value = bug.classification
editable = bug.check_can_change_field('product', 0, 1) %]
</tr>
[%###############%]
[%# Component #%]
[%###############%]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.component, value = bug.component
override_legal_values = bug.choices.component
desc_url = "describecomponents.cgi?product=$bug.product"
editable = bug.check_can_change_field('component', 0, 1)
%]
</tr>
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.version
editable = bug.check_can_change_field('version', 0, 1) %]
[% PROCESS select selname => "version" %]
</tr>
[%############%]
[%# PLATFORM #%]
[%############%]
<tr>
[% can_edit_rep_platform = bug.check_can_change_field('rep_platform', 0, 1) %]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.rep_platform,
editable = can_edit_rep_platform,
accesskey = "h" %]
<td class="field_value">
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.rep_platform,
no_tds = 1, value = bug.rep_platform
editable = can_edit_rep_platform %]
[%+ INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.op_sys,
no_tds = 1, value = bug.op_sys
editable = bug.check_can_change_field('op_sys', 0, 1) %]
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for the status section #%]
[%############################################################################%]
[% BLOCK section_status %]
<tr>
<th class="field_label">
<a href="page.cgi?id=fields.html#bug_status">Состояние</a>:
</th>
<td id="bz_field_status">
<span id="static_bug_status">
[% display_value("bug_status", bug.bug_status) FILTER html %]
[% IF bug.resolution %]
[%+ display_value("resolution", bug.resolution) FILTER html %]
[% IF bug.dup_id %]
of [% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]
[% END %]
[% END %]
[% IF bug.user.canedit || bug.user.isreporter %]
(<a href="#add_comment"
onclick="window.setTimeout(function() { document.getElementById('bug_status').focus(); }, 10)">изменить</a>)
[% END %]
</span>
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for the second table in the "Details" section #%]
[%############################################################################%]
[% BLOCK section_details2 %]
[%###############################################################%]
[%# Importance (priority and severity) #%]
[%###############################################################%]
<tr>
<th class="field_label">
[% can_edit_priority = bug.check_can_change_field('priority', 0, 1) %]
<label [% IF can_edit_priority %]for="priority"[% END %] accesskey="i">
<a href="page.cgi?id=fields.html#importance"><u>В</u>ажность</a></label>:
</th>
<td>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.priority,
no_tds = 1, value = bug.priority
editable = can_edit_priority %]
[%+ INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.bug_severity,
no_tds = 1, value = bug.bug_severity
editable = bug.check_can_change_field('bug_severity', 0, 1) %]
[% Hook.process('after_importance', 'bug/edit.html.tmpl') %]
</td>
</tr>
[% IF Param("usetargetmilestone") && bug.target_milestone %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.target_milestone
editable = bug.check_can_change_field('target_milestone', 0, 1)
%]
[% PROCESS select selname = "target_milestone" %]
</tr>
[% END %]
[% IF Param("timetrackinggroup") && bug.deadline %]
<tr>
<th class="field_label">
<a href="page.cgi?id=fields.html#deadline">Срок</a>:
</th>
<td>[% bug.deadline FILTER html %]</td>
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for the table in the "People" section #%]
[%############################################################################%]
[% BLOCK section_people %]
<tr>
[% can_edit_assigned_to = bug.check_can_change_field("assigned_to", 0, 1) %]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.assigned_to
editable = can_edit_assigned_to
%]
<td>
[% IF can_edit_assigned_to %]
<div id="bz_assignee_edit_container" class="bz_default_hidden">
<span>
[% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
(<a href="#" id="bz_assignee_edit_action">изменить</a>)
[% IF bug.assigned_to.id != user.id %]
(<a title="Взять исполнение на себя"
href="#" id="bz_assignee_take_action">взять на себя</a>)
[% END %]
</span>
</div>
<div id="bz_assignee_input">
[% INCLUDE global/userselect.html.tmpl
id => "assigned_to"
name => "assigned_to"
value => bug.assigned_to.login
classes => ["bz_userfield"]
size => 30
%]
<br>
<input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1">
<label id="set_default_assignee_label" for="set_default_assignee">Reset Assignee to default</label>
</div>
<script type="text/javascript">
hideEditableField('bz_assignee_edit_container',
'bz_assignee_input',
'bz_assignee_edit_action',
'assigned_to',
'[% bug.assigned_to.login FILTER js %]' );
hideEditableField('bz_assignee_edit_container',
'bz_assignee_input',
'bz_assignee_take_action',
'assigned_to',
'[% bug.assigned_to.login FILTER js %]',
'[% user.login FILTER js %]' );
initDefaultCheckbox('assignee');
</script>
[% ELSE %]
[% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
[% END %]
</td>
</tr>
[% IF Param('useqacontact') %]
<tr>
[% can_edit_qa_contact = bug.check_can_change_field("qa_contact", 0, 1) %]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.qa_contact
editable = can_edit_qa_contact
accesskey = "q"
%]
<td>
[% IF can_edit_qa_contact %]
<div id="bz_qa_contact_edit_container" class="bz_default_hidden">
<span>
[% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
(<a href="#" id="bz_qa_contact_edit_action">изменить</a>)
[% IF bug.qa_contact.id != user.id %]
(<a title="Взять приемку на себя"
href="#" id="bz_qa_contact_take_action">взять на себя</a>)
[% END %]
</span>
</div>
<div id="bz_qa_contact_input">
[% INCLUDE global/userselect.html.tmpl
id => "qa_contact"
name => "qa_contact"
value => bug.qa_contact.login
size => 30
classes => ["bz_userfield"]
emptyok => 1
%]
<br>
<input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1">
<label for="set_default_qa_contact" id="set_default_qa_contact_label">Вернуть ответственному за приемку по умолчанию</label>
</div>
<script type="text/javascript">
hideEditableField('bz_qa_contact_edit_container',
'bz_qa_contact_input',
'bz_qa_contact_edit_action',
'qa_contact',
'[% bug.qa_contact.login FILTER js %]');
hideEditableField('bz_qa_contact_edit_container',
'bz_qa_contact_input',
'bz_qa_contact_take_action',
'qa_contact',
'[% bug.qa_contact.login FILTER js %]',
'[% user.login FILTER js %]');
initDefaultCheckbox('qa_contact');
</script>
[% ELSE %]
[% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
[% END %]
</td>
</tr>
[% END %]
<script type="text/javascript">
assignToDefaultOnChange(['product', 'component'],
'[% bug.component_obj.default_assignee.login FILTER js %]',
'[% bug.component_obj.default_qa_contact.login FILTER js %]');
</script>
[% END %]
[%############################################################################%]
[%# Block for URL Keyword and Whiteboard #%]
[%############################################################################%]
[% BLOCK section_url_keyword_whiteboard %]
<tr>
[% can_edit_bug_file_loc = bug.check_can_change_field("bug_file_loc", 0, 1) %]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.bug_file_loc
editable = can_edit_bug_file_loc
accesskey = "u"
%]
<td>
[% IF can_edit_bug_file_loc %]
<span id="bz_url_edit_container" class="bz_default_hidden">
[% IF is_safe_url(bug.bug_file_loc) %]
<a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
rel="noreferrer" title="[% bug.bug_file_loc FILTER html %]">
[% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a>
[% ELSE %]
[% bug.bug_file_loc FILTER html %]
[% END %]
(<a href="#" id="bz_url_edit_action">изменить</a>)</span>
[% END %]
<span id="bz_url_input_area">
[% url_output = INCLUDE input no_td = 1 inputname = "bug_file_loc" size = 40 %]
[% IF NOT bug.check_can_change_field("bug_file_loc", 0, 1)
AND is_safe_url(bug.bug_file_loc) %]
<a href="[% bug.bug_file_loc FILTER html %]"
rel="noreferrer">[% url_output FILTER none %]</a>
[% ELSE %]
[% url_output FILTER none %]
[% END %]
</span>
[% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
<script type="text/javascript">
hideEditableField('bz_url_edit_container',
'bz_url_input_area',
'bz_url_edit_action',
'bug_file_loc',
"[% bug.bug_file_loc FILTER js %]");
</script>
[% END %]
</td>
</tr>
[% IF Param('usestatuswhiteboard') %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.status_whiteboard
editable = bug.check_can_change_field("status_whiteboard", 0, 1)
accesskey = "w"
%]
[% INCLUDE input inputname = "status_whiteboard" size = 40 %]
</tr>
[% END %]
[% IF use_keywords %]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.keywords, value = bug.keywords
editable = bug.check_can_change_field("keywords", 0, 1),
desc_url = "describekeywords.cgi", possible_values = all_keywords
%]
</tr>
[% END %]
[% IF user.id %]
<tr>
[% INCLUDE bug/field.html.tmpl
bug = bug, field = bug_fields.tag, value = bug.tags.join(", "),
editable = 1, possible_values = user.tags.keys
%]
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Duplicates #%]
[%############################################################################%]
[% BLOCK section_duplicates %]
[% RETURN UNLESS bug.duplicates.size %]
<tr>
<th class="field_label">
<label>Duplicates ([% bug.duplicates.size %])</label>:
</th>
<td class="field_value">
<span id="duplicates">
[% FOREACH dupe = bug.duplicates %]
[% INCLUDE bug/link.html.tmpl bug = dupe, link_text = dupe.id, use_alias = 1 %][% " " %]
[% END %]
</span>
(<a href="buglist.cgi?bug_id=[% bug.duplicate_ids.join(",") FILTER html %]">
[%-%]показать как список [% terms.bug %]</a>)
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for Depends On / Blocks #%]
[%############################################################################%]
[% BLOCK section_dependson_blocks %]
<tr>
[% INCLUDE dependencies
field = bug_fields.dependson deps = bug.depends_on_obj %]
</tr>
<tr>
[% INCLUDE dependencies
field = bug_fields.blocked deps = bug.blocks_obj %]
</tr>
[% IF bug.dependson.size || bug.blocked.size %]
<tr>
<th> </th>
<td id="show_dependency_tree_or_graph">
Показать <a href="showdependencytree.cgi?id=[% bug.bug_id %]&hide_resolved=1">дерево</a>
[% IF Param('webdotbase') %]
/ <a href="showdependencygraph.cgi?id=[% bug.bug_id %]">диаграмму</a>
[% END %] зависимостей
</td>
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Restricting Visibility #%]
[%############################################################################%]
[% BLOCK section_restrict_visibility %]
[% RETURN UNLESS bug.groups.size %]
<div class="bz_group_visibility_section">
[% inallgroups = 1 %]
[% inagroup = 0 %]
[% emitted_description = 0 %]
[% FOREACH group = bug.groups %]
[% SET inallgroups = 0 IF NOT group.ingroup %]
[% SET inagroup = 1 IF group.ison %]
[% NEXT IF group.mandatory %]
[% IF NOT emitted_description %]
[% emitted_description = 1 %]
<div id="bz_restrict_group_visibility_help">
<b>Только пользователи, входящие
[%+ IF Param('or_groups') %]
хотя бы в одну из выбранных групп,
[% ELSE %]
во все выбранные группы,
[% END %]
могут просматривать эту [% terms.bug_acc %]:</b>
<p class="instructions">
Если не выбрана ни одна группа, то [% terms.bug %] доступна всем пользователям.
</p>
</div>
[% END %]
[% IF group.ingroup %]
<input type="hidden" name="defined_groups"
value="[% group.name FILTER html %]">
[% END %]
<input type="checkbox" value="[% group.name FILTER html %]"
name="groups" id="group_[% group.bit %]"
[% ' checked="checked"' IF group.ison %]
[% ' disabled="disabled"' IF NOT group.ingroup %]>
<label for="group_[% group.bit %]">
[%- group.description FILTER html_light %]</label>
<br>
[% END %]
[% IF emitted_description %]
[% IF NOT inallgroups %]
<p class="instructions">Только члены группы могут управлять видимостью
[% terms.abug %] для этой группы.</p>
[% END %]
[% END %]
[% IF inagroup %]
<div id="bz_enable_role_visibility_help">
<b>Пользователям выбранных ролей [% terms.bug %] видима всегда:</b>
</div>
<div id="bz_enable_role_visibility">
<div>
[% user_can_edit_accessible =
bug.check_can_change_field("reporter_accessible", 0, 1)
%]
[% IF user_can_edit_accessible %]
<input type="hidden" name="defined_reporter_accessible" value="1">
[% END %]
<input type="checkbox" value="1"
name="reporter_accessible" id="reporter_accessible"
[% " checked" IF bug.reporter_accessible %]
[% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
<label for="reporter_accessible">Инициатор</label>
</div>
<div>
[% user_can_edit_accessible =
bug.check_can_change_field("cclist_accessible", 0, 1)
%]
[% IF user_can_edit_accessible %]
<input type="hidden" name="defined_cclist_accessible" value="1">
[% END %]
<input type="checkbox" value="1"
name="cclist_accessible" id="cclist_accessible"
[% " checked" IF bug.cclist_accessible %]
[% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
<label for="cclist_accessible">Подписчики</label>
</div>
<p class="instructions">
Исполнитель
[% IF (Param('useqacontact')) %]
и ответственный за приемку
[% END %]
всегда имеют доступ к [% terms.abug %]. Данная настройка действует
если видимость [% terms.bug %] ограничена некоторой группой.
</p>
</div>
[% END %]
</div> [%# bz_group_visibility_section %]
[% END %]
[%############################################################################%]
[%# Block for Dates #%]
[%############################################################################%]
[% BLOCK section_dates %]
<tr>
<th class="field_label">
Зарегистрирована:
</th>
<td>
[% bug.creation_ts FILTER time("%Y-%m-%d %H:%M %Z") %] пользователем [% INCLUDE global/user.html.tmpl who = bug.reporter %]
</td>
</tr>
<tr>
<th class="field_label">
Изменена:
</th>
<td>
[% bug.delta_ts FILTER time("%Y-%m-%d %H:%M %Z") %]
(<a href="show_activity.cgi?id=[% bug.bug_id %]">[%# terms.Bug %]История изменений</a>)
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for CC LIST #%]
[%############################################################################%]
[% BLOCK section_cclist %]
<tr>
<th class="field_label">
<label [% IF user.id %]for="newcc"[% END %] accesskey="a">
Подписчики::
</label>
</th>
<td>
[% IF user.id %]
[% IF NOT bug.cc.contains(user.login) %]
<input type="checkbox" id="addselfcc" name="addselfcc"
[% " checked=\"checked\""
IF user.settings.state_addselfcc.value == 'always'
|| (!bug.user.has_any_role
&& user.settings.state_addselfcc.value == 'cc_unless_role') %]>
<label for="addselfcc">Добавить себя</label>
<br>
[% END %]
[% END %]
[% bug.cc.size FILTER html %]
[% IF bug.cc.size == 1 %]
пользователь
[% ELSE %]
пользователей
[% END %]
[% IF user.id %]
[% IF bug.cc.contains( user.email ) %]
(включая себя)
[% END %]
[% END %]
[% IF user.id || bug.cc.size %]
<span id="cc_edit_area_showhide_container" class="bz_default_hidden">
(<a href="#" id="cc_edit_area_showhide">[% IF user.id %]изменить[% ELSE %]показать[% END %]</a>)
</span>
[% END %]
<div id="cc_edit_area">
<br>
[% IF user.id %]
<div>
<div><label for="cc"><b>Подписать</b></label></div>
[% INCLUDE global/userselect.html.tmpl
id => "newcc"
name => "newcc"
value => ""
size => 30
classes => ["bz_userfield"]
multiple => 5
%]
</div>
[% END %]
[% IF bug.cc.size %]
<select id="cc" multiple="multiple" size="5" [% 'name="cc"' IF bug.user.canedit %]>
[% FOREACH c = bug.cc %]
<option value="[% c FILTER email FILTER html %]">
[% c FILTER email FILTER html %]</option>
[% END %]
</select>
[% IF user.id && !bug.user.canedit %]
<input type="hidden" name="cc" value="[% user.login FILTER email FILTER html %]">
[% END %]
[% IF user.id AND (bug.user.canedit OR bug.cc.contains(user.login)) %]
<br>
<input type="checkbox" id="removecc" name="removecc">
<label for="removecc">
[% IF bug.user.canedit %]
Отменить подписку выбранных пользователей
[% ELSE %]
Отменить мою подписку
[% END %]
</label>
<br>
[% END %]
[% END %]
</div>
[% IF user.id || bug.cc.size %]
<script type="text/javascript">
hideEditableField( 'cc_edit_area_showhide_container',
'cc_edit_area',
'cc_edit_area_showhide',
'',
'');
</script>
[% END %]
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for Bug Ignored #%]
[%############################################################################%]
[% BLOCK section_bug_ignored %]
[% IF user.id %]
<tr>
<th class="field_label">
<label for="bug_ignored" title="Ignore all email for this [% terms.bug %]">
Игнорировать [% terms.bug_acc %]:
</label>
</th>
<td>
<input type="hidden" name="defined_bug_ignored" value="1">
<span title="Вы по прежнему будете получать уведомления о запросах согласования по этой ошибке.">
<input type="checkbox" name="bug_ignored" id="bug_ignored" value="1"
[% ' checked="checked"' IF user.is_bug_ignored(bug.id) %]>
(не присылать мне уведомления по этой [% terms.bug_dat %])
</span>
</td>
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for See Also #%]
[%############################################################################%]
[% BLOCK section_see_also %]
[% IF Param('use_see_also') || bug.see_also.size %]
<tr>
[% INCLUDE bug/field.html.tmpl
field = bug_fields.see_also
value = bug.see_also
editable = bug.check_can_change_field('see_also', 0, 1)
%]
</tr>
[% END %]
[% END %]
[% BLOCK section_aliases %]
<tr>
[% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.alias %]
<td>
[% IF bug.alias.size %]
[% bug.alias.join(', ') FILTER html %]
[% ELSE %]
None
[% END %]
[% IF bug.check_can_change_field('alias', 0, 1) %]
<span id="alias_edit_area_showhide_container" class="bz_default_hidden">
(<a href="#" id="alias_edit_area_showhide">edit</a>)
</span>
<br>
<div id="alias_edit_area">
<div>
<label for="newalias" class="field_label">Add</label>
<br>
<input name="newalias" id="newalias" size="20">
</div>
[% IF bug.alias.size %]
<select id="alias" name="alias" multiple="multiple" size="5">
[% FOREACH a = bug.alias %]
<option value="[% a FILTER html %]">[% a FILTER html %]</option>
[% END %]
</select>
<br>
<input type="checkbox" id="removealias" name="removealias">
<label for="removealias">Remove selected aliases</label>
[% END %]
</div>
<script type="text/javascript">
hideEditableField( 'alias_edit_area_showhide_container',
'alias_edit_area',
'alias_edit_area_showhide',
'',
'');
</script>
[% END %]
</td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for FLAGS #%]
[%############################################################################%]
[% BLOCK section_flags %]
[%# *** Flags *** %]
[% show_bug_flags = 0 %]
[% bug_flags_set = 0 %]
[% show_more_flags = 0 %]
[% FOREACH type = bug.flag_types %]
[% IF type.flags.size || (user.id && type.is_active && user.can_request_flag(type)) %]
[% show_bug_flags = 1 %]
[% END %]
[% IF user.id && type.is_active && (!type.flags.size || type.is_multiplicable) %]
[% show_more_flags = 1 %]
[% END %]
[% IF type.flags.size %]
[% bug_flags_set = 1 %]
[% END %]
[% LAST IF show_bug_flags && show_more_flags && bug_flags_set %]
[% END %]
[% IF show_bug_flags %]
<tr>
<th class="field_label">
<label>Согласования:</label>
</th>
<td>
[% IF bug.flag_types.size %]
[% PROCESS "flag/list.html.tmpl" flag_no_header = 1
flag_types = bug.flag_types
any_flags_requesteeble = bug.any_flags_requesteeble %]
[% END %]
[% IF show_more_flags %]
<span id="bz_flags_more_container" class="bz_default_hidden">
[% IF !bug_flags_set %]<em>Ещё не установлены</em>[% END %]
(<a href="#" id="bz_flags_more_action">[% IF !bug_flags_set %]послать на[% ELSE %]добавить[% END %] согласование</a>)
</span>
<script type="text/javascript">
YAHOO.util.Dom.removeClass('bz_flags_more_container', 'bz_default_hidden');
var table = YAHOO.util.Dom.get("flags");
var rows = YAHOO.util.Dom.getElementsByClassName('bz_flag_type', 'tbody', table);
for (var i = 0; i < rows.length; i++) {
YAHOO.util.Dom.addClass(rows[i], 'bz_default_hidden');
}
YAHOO.util.Event.addListener('bz_flags_more_action', 'click', function (e) {
YAHOO.util.Dom.addClass('bz_flags_more_container', 'bz_default_hidden');
for (var i = 0; i < rows.length; i++) {
YAHOO.util.Dom.removeClass(rows[i], 'bz_default_hidden');
}
YAHOO.util.Event.preventDefault(e);
});
</script>
[% END %]
</td>
</tr>
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Custom Fields #%]
[%############################################################################%]
[% BLOCK section_customfields %]
[%# *** Custom Fields *** %]
[% USE Bugzilla %]
[% FOREACH field = Bugzilla.active_custom_fields %]
<tr>
[%# Use PROCESS instead of INCLUDE, because extra_field_item is defined
# in the template and must be returned back. INCLUDE cannot do that. %]
[% PROCESS bug/field.html.tmpl value = bug.${field.name}
editable = bug.check_can_change_field(field.name, 0, 1) %]
</tr>
[% IF extra_field_item %]
<tr>
<th class="field_label">[% extra_field_item.header FILTER none %]</th>
<td>[% extra_field_item.data FILTER none %]</td>
</tr>
[% END %]
[% END %]
[% END %]
[%############################################################################%]
[%# Block for Section Spacer #%]
[%############################################################################%]
[% BLOCK section_spacer %]
<tr>
<td colspan="2" class="bz_section_spacer"></td>
</tr>
[% END %]
[%############################################################################%]
[%# Block for dependencies #%]
[%############################################################################%]
[% BLOCK dependencies %]
[% INCLUDE "bug/field-label.html.tmpl" %]
<td>
<span id="[% field.name FILTER html %]_input_area">
[% IF bug.check_can_change_field(field.name, 0, 1) %]
<input name="[% field.name FILTER html %]"
id="[% field.name FILTER html %]" class="text_input"
value="[% bug.${field.name}.join(', ') FILTER html %]">
[% END %]
</span>
[% FOREACH dep_bug = deps %]
[% INCLUDE bug/link.html.tmpl bug = dep_bug, link_text = dep_bug.id, use_alias = 1 %][% " " %]
[% END %]
[% IF bug.check_can_change_field(field.name, 0, 1) %]
<span id="[% field.name FILTER html %]_edit_container"
class="edit_me bz_default_hidden">
(<a href="#" id="[% field.name FILTER html %]_edit_action">изменить</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}.join(', ') FILTER js %]');
</script>
[% END %]
</td>
[% END %]
[%############################################################################%]
[%# Block for Time Tracking Group #%]
[%############################################################################%]
[% BLOCK section_timetracking %]
<table class="bz_time_tracking_table">
<tr>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.estimated_time, editable = 1
%]
<th>
Текущая оценка:
</th>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.work_time, editable = 1
%]
<th>
Продуктивное время:
</th>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.remaining_time, editable = 1
%]
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.percentage_complete
%]
<th>
Отклонение:
</th>
[% INCLUDE "bug/field-label.html.tmpl"
field = bug_fields.deadline, editable = 1
%]
</tr>
<tr>
<td>
<input name="estimated_time" id="estimated_time"
value="[% PROCESS formattimeunit
time_unit=bug.estimated_time %]"
size="6" maxlength="6">
</td>
<td>
[% PROCESS formattimeunit
time_unit=(bug.actual_time + bug.remaining_time) %]
</td>
<td>
[% PROCESS formattimeunit time_unit=bug.actual_time %] +
<input name="work_time" id="work_time"
value="0" size="3" maxlength="6"
onchange="adjustRemainingTime();">
</td>
<td>
<input name="productive_time" id="productive_time"
value="0" size="3" maxlength="6">
</td>
<td>
<input name="remaining_time" id="remaining_time"
value="[% PROCESS formattimeunit
time_unit=bug.remaining_time %]"
size="6" maxlength="6" onchange="updateRemainingTime();">
</td>
<td>
[% PROCESS calculatepercentage act=bug.actual_time
rem=bug.remaining_time %]
</td>
<td>
[% PROCESS formattimeunit time_unit=bug.estimated_time - (bug.actual_time + bug.remaining_time) %]
</td>
<td>
[% INCLUDE bug/field.html.tmpl
field = bug_fields.deadline, value = bug.deadline, no_tds = 1
editable = bug.check_can_change_field('deadline', 0, 1) %]
</td>
</tr>
<tr>
<td colspan="7" class="bz_summarize_time">
<a href="summarize_time.cgi?id=[% bug.bug_id %]&do_depends=1">
Анализ трудозатрат (с учетом зависимостей [% terms.bugs_gen %],
блокирующих эту [% terms.bug_acc %])</a>
</td>
</tr>
</table>
[% END %]
[%############################################################################%]
[%# Block for the Additional Comments box #%]
[%############################################################################%]
[% BLOCK comment_box %]
<div id="add_comment" class="bz_section_additional_comments">
[% IF user.id %]
<label for="comment" accesskey="c"><b>Дополнительные
<u>К</u>омментарии</b></label>:
[% IF user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %]
<input type="checkbox" name="comment_is_private" value="1"
id="newcommentprivacy"
onClick="updateCommentTagControl(this, 'comment')">
<label for="newcommentprivacy">
Сделать комментарий конфиденциальным (только для членов группы
<strong>[% Param('insidergroup') FILTER html %]</strong>)
</label>
[% END %]
<!-- This table keeps the submit button aligned with the box. -->
<table><tr><td>
[% IF bug.check_can_change_field('longdesc', 0, 1) %]
[% INCLUDE bug/comment.html.tmpl
minrows = 10
maxrows = 25
cols = constants.COMMENT_COLS
%]
[% IF user.is_insider %]
<script>
updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment');
</script>
[% END %]
[% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %]
[% ELSE %]
Вам не разрешено добавлять дополнительные комментарии в эту [% terms.bug %].
[% END %]
<br>
[% PROCESS commit_button id=""%]
[% Hook.process("after_comment_commit_button", 'bug/edit.html.tmpl') %]
<table id="bug_status_bottom" class="status">
<tr>
<th class="field_label">
<a href="page.cgi?id=fields.html#bug_status">Состояние</a>:
</th>
<td>
[% PROCESS bug/knob.html.tmpl %]
</td>
</tr>
</table>
</td></tr></table>
[%# For logged-out users %]
[% ELSE %]
<table>
<tr>
<td>
<fieldset>
<legend>Внимание</legend>
Вы должны
<a href="show_bug.cgi?id=
[%- bug.bug_id %]&GoAheadAndLogIn=1">войти в систему</a>
для добавления комментариев и внесения изменений в эту [% terms.bug %].
</fieldset>
</td>
</tr>
</table>
[% END %]
</div>
[% END %]
[%############################################################################%]
[%# Block for SELECT fields #%]
[%############################################################################%]
[% BLOCK select %]
<td>
[% IF bug.check_can_change_field(selname, 0, 1)
AND bug.choices.${selname}.size > 1 %]
<input type="hidden" id="[% selname %]_dirty">
<select id="[% selname %]" name="[% selname %]">
[% FOREACH x = bug.choices.${selname} %]
<option value="[% x.name FILTER html %]"
[% " selected" IF x.name == bug.${selname} %]>
[%- x.name FILTER html %]
</option>
[% END %]
</select>
[% ELSE %]
[% bug.${selname} FILTER html %]
[% END %]
</td>
[% END %]
[%############################################################################%]
[%# Block for INPUT fields #%]
[%############################################################################%]
[% BLOCK input %]
[% IF no_td != 1 %]
<td[% " colspan=\"$colspan\"" IF colspan %]>
[% END %]
[% val = value ? value : bug.$inputname %]
[% IF bug.check_can_change_field(inputname, 0, 1) %]
<input id="[% inputname %]" name="[% inputname %]" class="text_input"
value="[% val FILTER html %]"[% " size=\"$size\"" IF size %]
[% " maxlength=\"$maxlength\"" IF maxlength %]
[% " spellcheck=\"$spellcheck\"" IF spellcheck %]>
[% ELSE %]
[% IF size && val.length > size %]
<span title="[% val FILTER html %]">
[% val FILTER truncate(size) FILTER html %]
</span>
[% ELSE %]
[% val FILTER html %]
[% END %]
[% END %]
[% IF no_td != 1 %]
</td>
[% END %]
[% no_td = 0 %]
[% maxlength = 0 %]
[% colspan = 0 %]
[% size = 0 %]
[% value = undef %]
[% spellcheck = undef %]
[% END %]
[% BLOCK commit_button %]
[% IF user.id %]
<div class="knob-buttons">
<input type="submit" value="Сохранить"
id="commit[% id FILTER css_class_quote %]">
</div>
[% END %]
[% END %]
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment