%# BEGIN BPS TAGGED BLOCK {{{
-%#
+%#
%# COPYRIGHT:
-%#
-%# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC
-%# <jesse@bestpractical.com>
-%#
+%#
+%# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC
+%# <sales@bestpractical.com>
+%#
%# (Except where explicitly superseded by other copyright notices)
-%#
-%#
+%#
+%#
%# LICENSE:
-%#
+%#
%# This work is made available to you under the terms of Version 2 of
%# the GNU General Public License. A copy of that license should have
%# been provided with this software, but in any event can be snarfed
%# from www.gnu.org.
-%#
+%#
%# This work is distributed in the hope that it will be useful, but
%# WITHOUT ANY WARRANTY; without even the implied warranty of
%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
%# General Public License for more details.
-%#
+%#
%# You should have received a copy of the GNU General Public License
%# along with this program; if not, write to the Free Software
%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
%# 02110-1301 or visit their web page on the internet at
%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
-%#
-%#
+%#
+%#
%# CONTRIBUTION SUBMISSION POLICY:
-%#
+%#
%# (The following paragraph is not intended to limit the rights granted
%# to you to modify and distribute this software under the terms of
%# the GNU General Public License and is only of importance to you if
%# you choose to contribute your changes and enhancements to the
%# community by submitting them to Best Practical Solutions, LLC.)
-%#
+%#
%# By intentionally submitting any modifications, corrections or
%# derivatives to this work, or any other work intended for use with
%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
%# royalty-free, perpetual, license to use, copy, create derivative
%# works based on those contributions, and sublicense and distribute
%# those contributions and any derivatives thereof.
-%#
+%#
%# END BPS TAGGED BLOCK }}}
<%args>
$Ticket => undef
$id => undef
$ShowCompleted => 0
$Edit => 0
+$ShowSave => 1
</%args>
<%init>
$Ticket = LoadTicket($id) if ($id);
+my $resolve_status = $Ticket->LifecycleObj->ReminderStatusOnResolve;
-my $request_args = $m->request_args();
-
-my $reminder_collection = $Ticket->Reminders->Collection;
-
-if ( $request_args->{'update-reminders'} ) {
- while ( my $reminder = $reminder_collection->Next ) {
- if ( $reminder->Status ne 'resolved' && $request_args->{ 'Complete-Reminder-' . $reminder->id } ) {
- $Ticket->Reminders->Resolve($reminder);
- }
- elsif ( $reminder->Status eq 'resolved' && !$request_args->{ 'Complete-Reminder-' . $reminder->id } ) {
- $Ticket->Reminders->Open($reminder);
- }
-
- if ( exists( $request_args->{ 'Reminder-Subject-' . $reminder->id } ) && ( $reminder->Subject ne $request_args->{ 'Reminder-Subject-' . $reminder->id } )) {
- $reminder->SetSubject( $request_args->{ 'Reminder-Subject-' . $reminder->id } ) ;
- }
-
- if ( exists( $request_args->{ 'Reminder-Owner-' . $reminder->id } ) && ( $reminder->Owner != $request_args->{ 'Reminder-Owner-' . $reminder->id } )) {
- $reminder->SetOwner( $request_args->{ 'Reminder-Owner-' . $reminder->id } , "Force" ) ;
- }
-
- if ( exists( $request_args->{ 'Reminder-Due-' . $reminder->id } ) && ( $reminder->DueObj->Date ne $request_args->{ 'Reminder-Due-' . $reminder->id } )) {
- $reminder->SetDue( $request_args->{ 'Reminder-Due-' . $reminder->id } ) ;
- }
- }
-}
-
-if ( $request_args->{'NewReminder-Subject'} ) {
- my $due_obj = RT::Date->new( $session{'CurrentUser'} );
- my $date = Time::ParseDate::parsedate(
- $request_args->{'NewReminder-Due'},
- UK => RT->Config->Get('DateDayBeforeMonth'),
- PREFER_PAST => 0,
- PREFER_FUTURE => 1
- );
- $due_obj->Set( Value => $date, Format => 'unix' );
- my ( $add_id, $msg, $txnid ) = $Ticket->Reminders->Add(
-
- Subject => $request_args->{'NewReminder-Subject'},
- Owner => $request_args->{'NewReminder-Owner'},
- Due => $due_obj->ISO
- );
+my $count_reminders = RT::Reminders->new($session{'CurrentUser'});
+$count_reminders->Ticket($Ticket->id);
+my $count_tickets = $count_reminders->Collection;
+if (!$ShowCompleted) {
+ # XXX: don't break encapsulation if we can avoid it
+ $count_tickets->FromSQL(q{Type = "reminder" AND RefersTo = "} . $Ticket->id . qq{" AND Status != "$resolve_status" });
}
+my $has_reminders = $count_tickets->Count;
# We've made changes, let's reload our search
-
-$reminder_collection = $Ticket->Reminders->Collection;
+my $reminder_collection = $count_reminders->Collection;
</%init>
<input type="hidden" class="hidden" name="id" value="<% $Ticket->id %>" />
<input type="hidden" class="hidden" name="update-reminders" value="1" />
-<div>
-% while (my $reminder = $reminder_collection->Next) {
-% if ($reminder->Status eq 'resolved' && !$ShowCompleted) {
-<input type="hidden" class="hidden" name="Complete-Reminder-<% $reminder->id %>" value="1" />
-% } elsif ($Edit) {
-<& SELF:EditEntry, Reminder => $reminder, Ticket => $Ticket &>
+% my $editable = 0;
+% if ($has_reminders) {
+<table border="0" cellpadding="1" cellspacing="0" class="collection-as-table"<% $Edit ? ' style="width: auto;"' : '' |n %>>
+<tr>
+% if ( $Edit ) {
+<th class="collection-as-table" colspan="5"><&|/l&>Reminders</&></th>
+% } else {
+<th class="collection-as-table"></th>
+<th class="collection-as-table"><&|/l&>Reminder</&></th>
+<th class="collection-as-table"><&|/l&>Due</&></th>
+<th class="collection-as-table"><&|/l&>Owner</&></th>
+% }
+</tr>
+% my $i = 0;
+% while ( my $reminder = $reminder_collection->Next ) {
+% $i++;
+% if ( $reminder->Status eq $resolve_status && !$ShowCompleted ) {
+<tr class="hidden"><td><input type="hidden" class="hidden" name="Complete-Reminder-<% $reminder->id %>" value="1" /></td></tr>
+% $i++;
+% }
+% else {
+% $editable = 1 if !$editable && $reminder->CurrentUserHasRight( 'ModifyTicket' );
+% if ($Edit) {
+<& SELF:EditEntry, Reminder => $reminder, Ticket => $Ticket, Index => $i &>
% } else {
-<& SELF:ShowEntry, Reminder => $reminder, Ticket => $Ticket &>
+<& SELF:ShowEntry, Reminder => $reminder, Ticket => $Ticket, Index => $i &>
% }
% }
-% if ($reminder_collection->Count) {
-<i><&|/l&>(Check box to delete)</&></i><br /><br />
% }
-</div>
-<div>
+</table>
+% if ( $editable ) {
+<i><&|/l&>(Check box to complete)</&></i><br /><br />
+% }
+% } else {
+
+%# we must always include resolved reminders due to the browser
+%# checkbox-with-false-value issue
+% while ( my $reminder = $reminder_collection->Next ) {
+% if ( $reminder->Status eq $resolve_status && !$ShowCompleted ) {
+<input type="hidden" class="hidden" name="Complete-Reminder-<% $reminder->id %>" value="1" />
+% }
+% }
+% }
+
+% if (lc $Ticket->Status ne "deleted" and $Ticket->QueueObj->CurrentUserHasRight('CreateTicket') and $Ticket->CurrentUserHasRight('ModifyTicket') ) {
<&|/l&>New reminder:</&>
<& SELF:NewReminder, Ticket => $Ticket &>
+% $editable = 1;
+% }
+
+% if ( $editable && $ShowSave ) {
+<div align="right"><input type="submit" class="button" value="<&|/l&>Save</&>" /></div>
+% }
<%method NewReminder>
<%args>
$Ticket
</%args>
<table>
-<tr class="input-row">
-<td class="label"><label class="horizontal" for="NewReminder-Subject" ><&|/l&>Subject</&>:</label></td>
-<td class="value">
-<input type="text" size="15" name="NewReminder-Subject" id="NewReminder-Subject" />
-</td>
+<tr>
+<td class="label"><&|/l&>Subject</&>:</td>
+<td class="entry" colspan="3"><input type="text" size="50" name="NewReminder-Subject" id="NewReminder-Subject" /></td>
</tr>
-<tr class="input-row">
-<td class="label">
-<label class="horizontal" for="NewReminder-Owner" ><&|/l&>Owner</&>:</label></td><td class="value">
-<& /Elements/SelectOwner, Name => 'NewReminder-Owner', QueueObj => $Ticket->QueueObj, Default=>$session{'CurrentUser'}->id, DefaultValue => 0 &>
-</td>
+<tr>
+<td class="label"><&|/l&>Owner</&>:</td>
+<td class="entry"><& /Elements/SelectOwner, Name => 'NewReminder-Owner', QueueObj => $Ticket->QueueObj, Default=>$session{'CurrentUser'}->id, DefaultValue => 0 &></td>
</tr>
-<tr class="input-row">
-<td class="label"><label class="horizontal" for="NewReminder-Due" ><&|/l&>Due</&>:</label></td>
-<td class="value">
-<& /Elements/SelectDate, Name => "NewReminder-Due", Default => "" &>
-</td>
+<tr>
+<td class="label"><&|/l&>Due</&>:</td>
+<td class="entry"><& /Elements/SelectDate, Name => "NewReminder-Due", Default => "" &></td>
</tr>
</table>
</%method>
<%args>
$Reminder
$Ticket
+$Index
</%args>
-<input
- type="checkbox"
- name="Complete-Reminder-<%$Reminder->id%>"
- <% $Reminder->Status eq 'resolved' ? 'checked="checked"' : '' %>
-/>
- <input type="text" size="15" name="Reminder-Subject-<% $Reminder->id %>" value="<%$Reminder->Subject%>" /> •
- <& /Elements/SelectOwner, Name => 'Reminder-Owner-'.$Reminder->id, Queue => $Ticket->QueueObj, Default => $Reminder->Owner, DefaultValue => 0 &>
- <& /Elements/SelectDate, Name => 'Reminder-Due-'.$Reminder->id, Default => $Reminder->DueObj->Date &>
- (<%$Reminder->DueObj->Unix>0 ? $Reminder->DueObj->AgeAsString : '' %>)<br />
+<tr class="<% $Index%2 ? 'oddline' : 'evenline' %>" id="reminder-<% $Reminder->id %>">
+<td class="entry">
+% unless ( $Reminder->CurrentUserHasRight('ModifyTicket') ) {
+<input name="Complete-Reminder-<% $Reminder->id %>" type="hidden"
+value=<% $Reminder->Status eq $Reminder->LifecycleObj->ReminderStatusOnResolve ? 1 : 0 %> />
+% }
+
+<input type="checkbox" value="1" name="Complete-Reminder-<% $Reminder->id %>" <% $Reminder->Status eq $Reminder->LifecycleObj->ReminderStatusOnResolve ? 'checked="checked"' : '' |n %>
+% unless ( $Reminder->CurrentUserHasRight('ModifyTicket') ) {
+disabled="disabled"
+% }
+/></td>
+<td class="label"><&|/l&>Subject</&>:</td>
+<td class="entry" colspan="3">
+<input type="text" size="50" name="Reminder-Subject-<% $Reminder->id %>" value="<% $Reminder->Subject %>"
+% unless ( $Reminder->CurrentUserHasRight('ModifyTicket') ) {
+readonly="readonly"
+% }
+/>
+</td>
+</tr>
+<tr class="<% $Index%2 ? 'oddline' : 'evenline' %>">
+<td class="entry"> </td>
+<td class="label"><&|/l&>Owner</&>:</td>
+<td class="entry"><& /Elements/SelectOwner, Name => 'Reminder-Owner-'.$Reminder->id, QueueObj => $Ticket->QueueObj, Default => $Reminder->Owner, DefaultValue => 0 &></td>
+<td class="label"><&|/l&>Due</&>:</td>
+<td class="entry">
+% if ( $Reminder->CurrentUserHasRight('ModifyTicket') ) {
+<& /Elements/SelectDate, Name => 'Reminder-Due-'.$Reminder->id &>
+% }
+(<% $Reminder->DueObj->AsString %>)
+</td>
+</tr>
</%method>
<%method ShowEntry>
<%args>
$Reminder
$Ticket
+$Index
</%args>
-<input
- type="checkbox"
- name="Complete-Reminder-<%$Reminder->id%>"
- <% $Reminder->Status eq 'resolved' ? 'checked="checked"' : '' %>
-/>
- <%$Reminder->Subject%> •
- <%$Reminder->OwnerObj->Name%>
- <%$Reminder->DueObj->Unix>0 ? "• ". $Reminder->DueObj->AgeAsString : '' |n%><br />
+% my $dueobj = $Reminder->DueObj;
+% my $overdue = $dueobj->IsSet && $dueobj->Diff < 0 ? 1 : 0;
+<tr class="<% $Index%2 ? 'oddline' : 'evenline' %>" id="reminder-<% $Reminder->id %>">
+
+<td class="collection-as-table">
+% unless ( $Reminder->CurrentUserHasRight('ModifyTicket') ) {
+<input name="Complete-Reminder-<% $Reminder->id %>" type="hidden"
+value=<% $Reminder->Status eq $Reminder->LifecycleObj->ReminderStatusOnResolve ? 1 : 0 %> />
+% }
+<input type="checkbox" value="1" id="Complete-Reminder-<% $Reminder->id %>" name="Complete-Reminder-<% $Reminder->id %>" <% $Reminder->Status eq $Reminder->LifecycleObj->ReminderStatusOnResolve ? 'checked="checked"' : '' |n %>
+% unless ( $Reminder->CurrentUserHasRight('ModifyTicket') ) {
+disabled="disabled"
+% }
+/></td>
+<td class="collection-as-table"><label for="Complete-Reminder-<% $Reminder->id %>"><% $Reminder->Subject %></label></td>
+<td class="collection-as-table"><% $overdue ? '<span class="overdue">' : '' |n %><% $dueobj->AgeAsString || loc('Not set') %><% $overdue ? '</span>' : '' |n %></td>
+<td class="collection-as-table"><& /Elements/ShowUser, User => $Reminder->OwnerObj &></td>
+</tr>
</%method>