Add separate parameters for "Period Worktime" column, remove usage of global variables
parent
c53339f1bf
commit
78dc6d4f6e
|
@ -1287,15 +1287,35 @@ sub init
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$Bugzilla::Search::interval_from = undef;
|
# Setup interval_time column
|
||||||
$Bugzilla::Search::interval_to = undef;
|
if ($self->{user}->is_timetracker)
|
||||||
$Bugzilla::Search::interval_who = undef;
|
{
|
||||||
|
my $override = $H->{period_from} || $H->{period_to} || $H->{period_who};
|
||||||
|
$self->{interval_from} = $override ? $H->{period_from} : $H->{chfieldfrom};
|
||||||
|
$self->{interval_to} = $override ? $H->{period_to} : $H->{chfieldto};
|
||||||
|
$self->{interval_who} = $override ? $H->{period_who} : $H->{chfieldwho};
|
||||||
|
for ($self->{interval_from}, $self->{interval_to})
|
||||||
|
{
|
||||||
|
$_ = $_ && $_ ne 'now' ? SqlifyDate($_) : undef;
|
||||||
|
}
|
||||||
|
for ($self->{interval_who})
|
||||||
|
{
|
||||||
|
$_ = $_ ? ($_ eq '%user%' ? $self->{user} : Bugzilla::User::match_name($_, 1)->[0]) : undef;
|
||||||
|
}
|
||||||
|
COLUMNS->{interval_time}->{name} =
|
||||||
|
"(SELECT COALESCE(SUM(ldtime.work_time),0) FROM longdescs ldtime".
|
||||||
|
" WHERE ldtime.bug_id=bugs.bug_id".
|
||||||
|
($self->{interval_from} ? " AND ldtime.bug_when >= ".$dbh->quote($self->{interval_from}) : '').
|
||||||
|
($self->{interval_to} ? " AND ldtime.bug_when <= ".$dbh->quote($self->{interval_to}) : '').
|
||||||
|
($self->{interval_who} ? " AND ldtime.who = ".$self->{interval_who}->id : '').
|
||||||
|
")";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add "only bugs changed between..."
|
||||||
my $chfieldfrom = trim(lc($H->{chfieldfrom} || ''));
|
my $chfieldfrom = trim(lc($H->{chfieldfrom} || ''));
|
||||||
my $chfieldto = trim(lc($H->{chfieldto} || ''));
|
my $chfieldto = trim(lc($H->{chfieldto} || ''));
|
||||||
$chfieldfrom = '' if $chfieldfrom eq 'now';
|
$chfieldfrom = '' if $chfieldfrom eq 'now';
|
||||||
$chfieldto = '' if $chfieldto eq 'now';
|
$chfieldto = '' if $chfieldto eq 'now';
|
||||||
|
|
||||||
if ($chfieldfrom ne '' || $chfieldto ne '')
|
if ($chfieldfrom ne '' || $chfieldto ne '')
|
||||||
{
|
{
|
||||||
my @chfield = map { COLUMN_ALIASES->{$_} || $_ } list $H->{chfield};
|
my @chfield = map { COLUMN_ALIASES->{$_} || $_ } list $H->{chfield};
|
||||||
|
@ -2058,7 +2078,6 @@ sub changed
|
||||||
$who = $who eq '%user%' ? $self->{user} : Bugzilla::User::match_name($who, 1)->[0];
|
$who = $who eq '%user%' ? $self->{user} : Bugzilla::User::match_name($who, 1)->[0];
|
||||||
if ($who)
|
if ($who)
|
||||||
{
|
{
|
||||||
$Bugzilla::Search::interval_who = $who;
|
|
||||||
$v->{who} = $who->login;
|
$v->{who} = $who->login;
|
||||||
$v->{who} =~ s/\@.*$//so if !Bugzilla->user->id;
|
$v->{who} =~ s/\@.*$//so if !Bugzilla->user->id;
|
||||||
$who = $who->id;
|
$who = $who->id;
|
||||||
|
@ -2075,17 +2094,7 @@ sub changed
|
||||||
# on the time interval and user specified in "changes" search area
|
# on the time interval and user specified in "changes" search area
|
||||||
my $c;
|
my $c;
|
||||||
my %f = map { $_ => 1 } @{$v->{fields}};
|
my %f = map { $_ => 1 } @{$v->{fields}};
|
||||||
if ($self->{user}->is_timetracker)
|
if (!$self->{user}->is_timetracker)
|
||||||
{
|
|
||||||
$Bugzilla::Search::interval_from = SqlifyDate($v->{after});
|
|
||||||
$Bugzilla::Search::interval_to = SqlifyDate($v->{before});
|
|
||||||
$c = $cond;
|
|
||||||
$c =~ s/ \./ldtime./gs;
|
|
||||||
COLUMNS->{interval_time}->{name} =
|
|
||||||
"(SELECT COALESCE(SUM(ldtime.work_time),0) FROM longdescs ldtime".
|
|
||||||
" WHERE ldtime.bug_id=bugs.bug_id AND $c)";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
# Non-timetrackers can't search on time tracking fields
|
# Non-timetrackers can't search on time tracking fields
|
||||||
delete $f{$_} for keys %{TIMETRACKING_FIELDS()};
|
delete $f{$_} for keys %{TIMETRACKING_FIELDS()};
|
||||||
|
@ -2532,9 +2541,9 @@ sub _work_time_equals_0
|
||||||
my $w = "$table.work_time != 0";
|
my $w = "$table.work_time != 0";
|
||||||
if ($self->{field} eq 'interval_time')
|
if ($self->{field} eq 'interval_time')
|
||||||
{
|
{
|
||||||
$w .= " AND $table.bug_when >= ".$dbh->quote($Bugzilla::Search::interval_from) if $Bugzilla::Search::interval_from;
|
$w .= " AND $table.bug_when >= ".$dbh->quote($self->{interval_from}) if $self->{interval_from};
|
||||||
$w .= " AND $table.bug_when <= ".$dbh->quote($Bugzilla::Search::interval_to) if $Bugzilla::Search::interval_to;
|
$w .= " AND $table.bug_when <= ".$dbh->quote($self->{interval_to}) if $self->{interval_to};
|
||||||
$w .= " AND $table.who = ".$Bugzilla::Search::interval_who->id if $Bugzilla::Search::interval_who;
|
$w .= " AND $table.who = ".$self->{interval_who}->id if $self->{interval_who};
|
||||||
}
|
}
|
||||||
$w .= " AND $table.isprivate = 0" if $self->{user}->is_insider;
|
$w .= " AND $table.isprivate = 0" if $self->{user}->is_insider;
|
||||||
$self->{term} = {
|
$self->{term} = {
|
||||||
|
|
|
@ -811,7 +811,7 @@ if ($superworktime)
|
||||||
# Must come after Bugzilla::Search::getSQL
|
# Must come after Bugzilla::Search::getSQL
|
||||||
if (Bugzilla->user->in_group('worktimeadmin'))
|
if (Bugzilla->user->in_group('worktimeadmin'))
|
||||||
{
|
{
|
||||||
my $d = $Bugzilla::Search::interval_to;
|
my $d = $search->{interval_to};
|
||||||
if ($d)
|
if ($d)
|
||||||
{
|
{
|
||||||
# Use DateTime instead of SQL functions to be more DBMS-independent
|
# Use DateTime instead of SQL functions to be more DBMS-independent
|
||||||
|
@ -824,7 +824,7 @@ if ($superworktime)
|
||||||
{
|
{
|
||||||
$d = POSIX::strftime("%Y-%m-%d", localtime);
|
$d = POSIX::strftime("%Y-%m-%d", localtime);
|
||||||
}
|
}
|
||||||
$vars->{worktime_user} = $ARGS->{worktime_user} || ($Bugzilla::Search::interval_who ? $Bugzilla::Search::interval_who->login : undef);
|
$vars->{worktime_user} = $ARGS->{worktime_user} || ($search->{interval_who} ? $search->{interval_who}->login : undef);
|
||||||
$vars->{worktime_date} = $ARGS->{worktime_date} || $d;
|
$vars->{worktime_date} = $ARGS->{worktime_date} || $d;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1078,8 +1078,8 @@ $vars->{caneditbugs} = 1;
|
||||||
$vars->{time_info} = $time_info;
|
$vars->{time_info} = $time_info;
|
||||||
|
|
||||||
$vars->{query_params} = { %$params }; # now used only in superworktime
|
$vars->{query_params} = { %$params }; # now used only in superworktime
|
||||||
$vars->{query_params}->{chfieldfrom} = $Bugzilla::Search::interval_from;
|
$vars->{query_params}->{chfieldfrom} = $search->{interval_from};
|
||||||
$vars->{query_params}->{chfieldto} = $Bugzilla::Search::interval_to;
|
$vars->{query_params}->{chfieldto} = $search->{interval_to};
|
||||||
|
|
||||||
if (!Bugzilla->user->in_group('editbugs'))
|
if (!Bugzilla->user->in_group('editbugs'))
|
||||||
{
|
{
|
||||||
|
|
|
@ -116,12 +116,14 @@ if ($ARGS->{rememberedquery})
|
||||||
{
|
{
|
||||||
my $params = http_decode_query($search->query);
|
my $params = http_decode_query($search->query);
|
||||||
$params->{columnlist} = join(",", @collist);
|
$params->{columnlist} = join(",", @collist);
|
||||||
|
$params->{$_} = $ARGS->{$_} for qw(period_from period_to period_who);
|
||||||
$search->set_query(http_build_query($params));
|
$search->set_query(http_build_query($params));
|
||||||
$search->update();
|
$search->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
my $params = http_decode_query($ARGS->{rememberedquery});
|
my $params = http_decode_query($ARGS->{rememberedquery});
|
||||||
$params->{columnlist} = join(",", @collist);
|
$params->{columnlist} = join(",", @collist);
|
||||||
|
$params->{$_} = $ARGS->{$_} for qw(period_from period_to period_who);
|
||||||
$vars->{redirect_url} = "buglist.cgi?".http_build_query($params);
|
$vars->{redirect_url} = "buglist.cgi?".http_build_query($params);
|
||||||
|
|
||||||
# If we're running on Microsoft IIS, $cgi->redirect discards
|
# If we're running on Microsoft IIS, $cgi->redirect discards
|
||||||
|
@ -138,7 +140,7 @@ if ($ARGS->{rememberedquery})
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
print Bugzilla->cgi->redirect($vars->{'redirect_url'});
|
print Bugzilla->cgi->redirect($vars->{redirect_url});
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,6 +172,14 @@ $vars->{collist} = \@collist;
|
||||||
$vars->{splitheader} = Bugzilla->cookies->{SPLITHEADER} ? 1 : 0;
|
$vars->{splitheader} = Bugzilla->cookies->{SPLITHEADER} ? 1 : 0;
|
||||||
$vars->{buffer} = http_build_query($ARGS);
|
$vars->{buffer} = http_build_query($ARGS);
|
||||||
|
|
||||||
|
$vars->{$_} = $ARGS->{$_} for qw(period_from period_to period_who);
|
||||||
|
if (!$vars->{period_from} && !$vars->{period_to} && !$vars->{period_who})
|
||||||
|
{
|
||||||
|
$vars->{period_from} = $ARGS->{chfieldfrom};
|
||||||
|
$vars->{period_to} = $ARGS->{chfieldto};
|
||||||
|
$vars->{period_who} = $ARGS->{chfieldwho};
|
||||||
|
}
|
||||||
|
|
||||||
my $search;
|
my $search;
|
||||||
if (defined $ARGS->{query_based_on})
|
if (defined $ARGS->{query_based_on})
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,6 +27,9 @@ function initChangeColumns()
|
||||||
switch_options(sel_select, av_select, false);
|
switch_options(sel_select, av_select, false);
|
||||||
sel_select.selectedIndex = -1;
|
sel_select.selectedIndex = -1;
|
||||||
updateView();
|
updateView();
|
||||||
|
Calendar.set('period_from');
|
||||||
|
Calendar.set('period_to');
|
||||||
|
new SimpleAutocomplete("period_who", userAutocomplete, { emptyText: 'No users found' });
|
||||||
}
|
}
|
||||||
|
|
||||||
function switch_options(from_box, to_box, selected)
|
function switch_options(from_box, to_box, selected)
|
||||||
|
|
|
@ -21,7 +21,8 @@
|
||||||
|
|
||||||
[% PROCESS global/header.html.tmpl
|
[% PROCESS global/header.html.tmpl
|
||||||
title = "Change Columns"
|
title = "Change Columns"
|
||||||
javascript_urls = "js/change-columns.js"
|
javascript_urls = [ "js/calendar.js", "js/change-columns.js" ]
|
||||||
|
style_urls = [ "skins/standard/calendar.css" ]
|
||||||
onload = "initChangeColumns()"
|
onload = "initChangeColumns()"
|
||||||
%]
|
%]
|
||||||
|
|
||||||
|
@ -106,11 +107,22 @@
|
||||||
value="[% saved_search.id FILTER html%]" />
|
value="[% saved_search.id FILTER html%]" />
|
||||||
<input type="checkbox" id="save_columns_for_search" checked="checked"
|
<input type="checkbox" id="save_columns_for_search" checked="checked"
|
||||||
name="save_columns_for_search" value="1" />
|
name="save_columns_for_search" value="1" />
|
||||||
<label for="save_columns_for_search">Save this column list only
|
<label for="save_columns_for_search">Save this column list
|
||||||
for search '[% saved_search.name FILTER html %]'</label>
|
for search '[% saved_search.name FILTER html %]'</label>
|
||||||
</p>
|
</p>
|
||||||
[% END %]
|
[% END %]
|
||||||
|
|
||||||
|
[% IF user.is_timetracker %]
|
||||||
|
<p>
|
||||||
|
In the "[% COLUMNS.interval_time.title | html %]" column, show working time for user:
|
||||||
|
<input name="period_who" id="period_who" size="30" value="[% period_who | html %]" />
|
||||||
|
between
|
||||||
|
<input name="period_from" id="period_from" size="10" value="[% period_from | html %]" />
|
||||||
|
and <input name="period_to" id="period_to" size="10" value="[% period_to | html %]" />
|
||||||
|
(YYYY-MM-DD or relative dates)
|
||||||
|
</p>
|
||||||
|
[% END %]
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<input type="submit" id="change" value="Change Columns" />
|
<input type="submit" id="change" value="Change Columns" />
|
||||||
</p>
|
</p>
|
||||||
|
|
|
@ -6,7 +6,8 @@
|
||||||
[% title = "Массовый ввод трудозатрат" %]
|
[% title = "Массовый ввод трудозатрат" %]
|
||||||
[% PROCESS global/header.html.tmpl
|
[% PROCESS global/header.html.tmpl
|
||||||
title = title
|
title = title
|
||||||
style_urls = [ "skins/standard/buglist.css" ]
|
javascript_urls = [ "js/calendar.js", "js/change-columns.js" ]
|
||||||
|
style_urls = [ "skins/standard/calendar.css", "skins/standard/buglist.css" ]
|
||||||
%]
|
%]
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
@ -53,12 +54,21 @@
|
||||||
|
|
||||||
[% hidden_inputs(HideIndex=2) %]
|
[% hidden_inputs(HideIndex=2) %]
|
||||||
|
|
||||||
Дата:
|
<p style="margin: 8px 0">
|
||||||
|
Баг изменён:
|
||||||
с <input type="text" name="chfieldfrom" id="chfieldfrom" value="[% query_params.chfieldfrom | html %]" onchange="check_who_enabled()" />
|
с <input type="text" name="chfieldfrom" id="chfieldfrom" value="[% query_params.chfieldfrom | html %]" onchange="check_who_enabled()" />
|
||||||
по <input type="text" name="chfieldto" id="chfieldto" value="[% query_params.chfieldto | html %]" onchange="check_who_enabled()" />
|
по <input type="text" name="chfieldto" id="chfieldto" value="[% query_params.chfieldto | html %]" onchange="check_who_enabled()" />
|
||||||
<span style="color: #aaa">(YYYY-MM-DD HH:MM:SS)</span>
|
<span style="color: #aaa">(YYYY-MM-DD HH:MM:SS)</span>
|
||||||
Пользователь: <input type="text" name="chfieldwho" id="chfieldwho" value="[% query_params.chfieldwho | html %]" />
|
пользователем: <input type="text" name="chfieldwho" id="chfieldwho" value="[% query_params.chfieldwho | html %]" />
|
||||||
|
</p>
|
||||||
|
<p style="margin: 0">
|
||||||
|
Period Worktime:
|
||||||
|
с <input type="text" name="period_from" id="period_from" value="[% query_params.period_from || query_params.period_to || query_params.period_who ? query_params.period_from : query_params.chfieldfrom | html %]" />
|
||||||
|
по <input type="text" name="period_to" id="period_to" value="[% query_params.period_from || query_params.period_to || query_params.period_who ? query_params.period_to : query_params.chfieldto | html %]" />
|
||||||
|
<span style="color: #aaa">(YYYY-MM-DD HH:MM:SS)</span>
|
||||||
|
пользователь: <input type="text" name="period_who" id="period_who" value="[% query_params.period_from || query_params.period_to || query_params.period_who ? query_params.period_who : query_params.chfieldwho | html %]" />
|
||||||
<input type="submit" value=" Показать трудозатраты " />
|
<input type="submit" value=" Показать трудозатраты " />
|
||||||
|
</p>
|
||||||
</form>
|
</form>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
|
@ -303,6 +313,12 @@ function do_dry_run(frm)
|
||||||
}
|
}
|
||||||
wt_user_blur();
|
wt_user_blur();
|
||||||
check_who_enabled();
|
check_who_enabled();
|
||||||
|
Calendar.set('chfieldfrom');
|
||||||
|
Calendar.set('chfieldto');
|
||||||
|
new SimpleAutocomplete("chfieldwho", userAutocomplete, { emptyText: 'No users found' });
|
||||||
|
Calendar.set('period_from');
|
||||||
|
Calendar.set('period_to');
|
||||||
|
new SimpleAutocomplete("period_who", userAutocomplete, { emptyText: 'No users found' });
|
||||||
//-->
|
//-->
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue