diff options
Diffstat (limited to 'rt/webrt/Ticket')
32 files changed, 1866 insertions, 0 deletions
diff --git a/rt/webrt/Ticket/Attachment/dhandler b/rt/webrt/Ticket/Attachment/dhandler new file mode 100644 index 000000000..0d646cc0b --- /dev/null +++ b/rt/webrt/Ticket/Attachment/dhandler @@ -0,0 +1,27 @@ +<%perl> + my ($ticket, $trans,$attach, $filename); + my $arg = $m->dhandler_arg; # get rest of path + if ($arg =~ '^(\d+)/(\d+)') { + $trans = $1; + $attach = $2; + } + else { + Abort("Corrupted attachment URL."); + } + my $AttachmentObj = new RT::Attachment($session{'CurrentUser'}); + $AttachmentObj->Load($attach) || Abort("Attachment '$attach' could not be loaded"); + + + unless ($AttachmentObj->id) { + Abort("Bad attachment id. Couldn't find attachment '$attach'\n"); + } + unless ($AttachmentObj->TransactionId() == $trans ) { + Abort("Bad transaction number for attachment. $trans should be".$AttachmentObj->TransactionId() ."\n"); + + } + my $content_type = $AttachmentObj->ContentType || 'text/plain'; + SetContentType($content_type); + $m->out($AttachmentObj->Content); + $m->abort; +</%perl> + diff --git a/rt/webrt/Ticket/Create.html b/rt/webrt/Ticket/Create.html new file mode 100755 index 000000000..2c61de03a --- /dev/null +++ b/rt/webrt/Ticket/Create.html @@ -0,0 +1,199 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Attic/Create.html,v 1.1 2002-08-12 06:17:09 ivan Exp $ +%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com> + +<& /Elements/Header, Title => "Create a new ticket" &> +<& /Elements/Tabs, current_toptab => "Ticket/Create.html" &> +<FORM ACTION="Display.html" METHOD="POST" ENCTYPE="multipart/form-data"> +<INPUT TYPE=HIDDEN Name="id" VALUE="new"> +<A NAME="top"> + + +[<a class="currenttab">Show basics</a>] [<A HREF="#detail">Show details</a>] +<BR> +<& /Elements/TitleBoxStart, contentbg => "#cccccc", title => "Create a new ticket"&> +<div align=right><input type=submit value="Create"></div> +<TABLE border=0 cellpadding=0 cellspacing=0> +<TR><TD>Queue</TD> +<TD><% $QueueObj->Name %> +<INPUT TYPE=HIDDEN NAME=Queue Value="<%$QueueObj->Name%>"> +</TD> +<TD>Status: +</TD> +<TD> +<& /Elements/SelectStatus, Name => "Status", Default=> 'new' &> +</TD> +<TD> +Owner: +</TD> +<TD> +<& /Elements/SelectOwner, Name => "ValueOfOwner", QueueObj => $QueueObj &> +</TD> +</TR> +<TR> +<TD> +Requestors: +</TD> +<TD COLSPAN=5> +<INPUT Name="Requestors" Value="<%$session{CurrentUser}->EmailAddress%>" SIZE=40> +</TD> +</TR> +<TR> +<TD> +Cc: +</TD> +<TD COLSPAN=5> + <INPUT NAME="Cc" SIZE=40> +</TD> +</TR> +<TR> +<TD> +Admin Cc: +</TD> +<TD COLSPAN=5> + <INPUT NAME="AdminCc" SIZE=40> +</TD> +</TR> +<TR> +<TD> +Subject: +</TD> +<TD COLSPAN=5> +<INPUT Name="Subject" SIZE=60 MAXSIZE=100 value=""> +</TD> +</TR> +<TR> +<TD> +Attach file: +</TD> +<TD COLSPAN=5> +<INPUT TYPE=FILE NAME="Attach"> +</TD> +</TR> +<TR> +<TD COLSPAN=6> +Describe the issue below:<br> +<& /Elements/MessageBox, QuoteTransaction => $QuoteTransaction &> + +<BR> +</TD> +</TR> +<TR> +<TD ALIGN=RIGHT COLSPAN=2> +</TD> +</TR> +</TABLE> +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit, Label => "Create"&> + +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> + +<A NAME="detail"> + [<A HREF="#top">Show basics</a>] [<a class="currenttab">Show details</a>] +<BR> +<TABLE WIDTH="100%" BORDER=0> +<TR> +<TD WIDTH="50%" VALIGN=TOP> + + <& /Elements/TitleBoxStart, title => 'The Basics', + title_class=> 'inverse', + color => "#993333" &> +<TABLE BORDER=0> +<TR><TD ALIGN=RIGHT>Priority:</TD><TD><input size=3 name="InitialPriority" value="<%$QueueObj->InitialPriority%>"></TD></TR> +<TR><TD ALIGN=RIGHT>Final Priority:</TD><TD><input size=3 name="FinalPriority" value="<%$QueueObj->FinalPriority%>"></TD></TR> +<TR><TD ALIGN=RIGHT>Time Worked:</TD><TD><input size=3 name="TimeWorked"></TD></TR> +<TR><TD ALIGN=RIGHT>Time Left:</TD><TD><input size=3 name="TimeLeft"></TD></TR> +</TABLE> +<& /Elements/TitleBoxEnd &> +<BR> +<BR> + + + <& /Elements/TitleBoxStart, + title_class=> 'inverse', + title => "Keyword Selections", color => "#993300" + &> +<TABLE BORDER=0> +% while ( my $KeywordSelect = $KeywordSelects->Next ) { +% my $Descendents = $KeywordSelect->KeywordObj->Descendents; + <TR><TD ALIGN=RIGHT> + <% $KeywordSelect->Name %></TD><TD> + <INPUT TYPE="hidden" NAME="KeywordSelectMagic<% $KeywordSelect->id %>" VALUE="1"> + <SELECT NAME="KeywordSelect-<% $KeywordSelect->id %>" + <% $KeywordSelect->Single ? "" : " MULTIPLE " %> SIZE=5> +%# +%# All of this cruft is so we have a 'no keyword' selector for single +%# keywords that's only selected when there's no value. +% +% foreach my $kid ( keys %{$Descendents} ) { + <OPTION VALUE="<% $kid %>"><% $Descendents->{$kid} %></OPTION> +% } +% if ( $KeywordSelect->Single) { +<OPTION VALUE="" SELECTED>(empty)</OPTION> +% } + </SELECT> + </TD></TR> +% } + +</TABLE> +<& /Elements/TitleBoxEnd &> + +</TD> + +<TD VALIGN="TOP"> +<& /Elements/TitleBoxStart, title => "Dates", + title_class=> 'inverse', + color => "#663366" &> + +<TABLE BORDER=0> +<TR><TD ALIGN=RIGHT>Starts:</TD><TD><input size=10 name="Starts"></TD></TR> +<TR><TD ALIGN=RIGHT>Due:</TD><TD><input size=10 name="Due"></TD></TR> +</TABLE> +<& /Elements/TitleBoxEnd &> +<BR> +<& /Elements/TitleBoxStart, title => 'Relationships', + title_class=> 'inverse', + titleright => '', color=> "#336633" &> + +<i>(Enter ticket ids or URLs, seperated with spaces)</i> +<TABLE BORDER=0> +<TR><TD ALIGN=RIGHT>Depends on</TD><TD><input size=10 name="new-DependsOn"></TD></TR> +<TR><TD ALIGN=RIGHT>Depended on by</TD><TD><input size=10 name="DependsOn-new"></TD></TR> +<TR><TD ALIGN=RIGHT>Parents</TD><TD><input size=10 name="new-MemberOf"></TD></TR> +<TR><TD ALIGN=RIGHT>Children</TD><TD><input size=10 name="MemberOf-new"></TD></TR> +<TR><TD ALIGN=RIGHT>Refers to</TD><TD><input size=10 name="new-RefersTo"></TD></TR> +<TR><TD ALIGN=RIGHT>Referred to by</TD><TD><input size=10 name="RefersTo-new"></TD></TR> + + +</TABLE> +<& /Elements/TitleBoxEnd &> +<BR> + +</TD> +</TR> +</TABLE> +<& /Elements/Submit, Label => "Create"&> +</FORM> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> +<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR> + +<%INIT> +my $QueueObj = new RT::Queue($session{'CurrentUser'}); +$QueueObj->Load($Queue) || Abort("Queue could not be loaded."); +my $KeywordSelects = $QueueObj->KeywordSelects; + +</%INIT> + +<%ARGS> +$DependsOn => undef +$DependedOnBy => undef +$MemberOf => undef +$QuoteTransaction => undef +$Queue => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Display.html b/rt/webrt/Ticket/Display.html new file mode 100755 index 000000000..cb0dc2501 --- /dev/null +++ b/rt/webrt/Ticket/Display.html @@ -0,0 +1,152 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Attic/Display.html,v 1.1 2002-08-12 06:17:09 ivan Exp $ +%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com> + +<& /Elements/Header, Title => "Ticket #".$Ticket->Id ." ".$Ticket->Subject &> +<& /Ticket/Elements/Tabs, Ticket => $Ticket, current_tab => 'Ticket/Display.html?id='.$Ticket->id &> + +<& /Elements/ListActions, actions => \@Actions &> + +<& /Ticket/Elements/ShowSummary, Ticket => $Ticket &> + + +<BR> +<& /Ticket/Elements/ShowHistory , + Ticket => $Ticket, + Collapsed => $ARGS{'Collapsed'}, + ShowHeaders => $ARGS{'ShowHeaders'} &> + + +<%ARGS> +$id => undef +$Create => undef +$ShowHeaders => undef +$Collapsed => undef +</%ARGS> + +<%INIT> + + + my ($linkid, $message, $tid, $Ticket, @Actions); + +$Ticket = new RT::Ticket($session{'CurrentUser'}); + +unless ($id) { + Abort('No ticket specified'); +} + +if ($ARGS{'id'} eq 'new') { + # {{{ Create a new ticket + + my $Queue = new RT::Queue($session{'CurrentUser'}); + unless ($Queue->Load($ARGS{'Queue'})) { + Abort('Queue not found'); + } + + unless ($Queue->CurrentUserHasRight('CreateTicket')) { + Abort('You have no permission to create tickets in that queue.'); + } + + my $due = new RT::Date($session{'CurrentUser'}); + $due->Set(Format => 'unknown', Value => $ARGS{'Due'}); + my $starts = new RT::Date($session{'CurrentUser'}); + $starts->Set(Format => 'unknown', Value => $ARGS{'Starts'}); + + + my @Requestors = split(/,/,$ARGS{'Requestors'}); + my @Cc = split(/,/,$ARGS{'Cc'}); + my @AdminCc = split(/,/,$ARGS{'AdminCc'}); + + my $MIMEObj = MakeMIMEEntity( Subject => $ARGS{'Subject'}, + From => $ARGS{'From'}, + Cc => $ARGS{'Cc'}, + Body => $ARGS{'Content'}, + AttachmentFieldName => 'Attach'); + + + my %create_args = ( + Queue=>$ARGS{Queue}, + Owner=>$ARGS{ValueOfOwner}, + InitialPriority=> $ARGS{InitialPriority}, + FinalPriority=> $ARGS{FinalPriority}, + TimeLeft => $ARGS{TimeLeft}, + TimeWorked => $ARGS{TimeWorked}, + Requestor=> \@Requestors, + Cc => \@Cc, + AdminCc => \@AdminCc, + Subject=>$ARGS{Subject}, + Status=>$ARGS{Status}, + Due => $due->ISO, + Starts => $starts->ISO, + MIMEObj => $MIMEObj + ); + + + # we need to get any KeywordSelect-<integer> fields into %create_args.. + grep { $_ =~ /^KeywordSelect-/ && {$create_args{$_} = $ARGS{$_}}} %ARGS; + + my ($id, $Trans, $ErrMsg)= $Ticket->Create(%create_args); + unless ($id && $Trans) { + Abort($ErrMsg); + } + my @linktypes = qw( DependsOn MemberOf RefersTo ); + + foreach my $linktype (@linktypes) { + foreach my $luri (split (/ /,$ARGS{"new-$linktype"})) { + $luri =~ s/\s*$//; # Strip trailing whitespace + my ($val, $msg) = $Ticket->AddLink( Target => $luri, + Type => $linktype); + push @Actions, $msg; + } + + foreach my $luri (split (/ /,$ARGS{"$linktype-new"})) { + my ($val, $msg) = $Ticket->AddLink( Base => $luri, + Type => $linktype); + + push @Actions, $msg; + } + } + # don't try to change queue to the current queue + delete $ARGS{'Queue'}; + + push(@Actions, $ErrMsg); + unless ($Ticket->CurrentUserHasRight('ShowTicket')) { + Abort("No permission to view newly created ticket #".$Ticket->id."."); + } + # }}} +} + +else { + $Ticket = LoadTicket($ARGS{'id'}); + unless ($Ticket->CurrentUserHasRight('ShowTicket')) { + Abort("No permission to view ticket"); + } + + +if (defined $ARGS{'Action'}) { + if ($ARGS{'Action'} =~ /^(Steal|Kill|Take|SetTold)$/) { + my $action = $1; + my ($res, $msg)=$Ticket->$action(); + push(@Actions, $msg); + } +} + $ARGS{'UpdateContent'} =~ s/\r\n/\n/g; + + if ($ARGS{'UpdateContent'} && + $ARGS{'UpdateContent'} ne '' && + $ARGS{'UpdateContent'} ne "-- \n" . + $session{'CurrentUser'}->UserObj->Signature + ) { + ProcessUpdateMessage(ARGSRef=>\%ARGS, + Actions=>\@Actions, + TicketObj=>$Ticket); + } +#Process status updates +my @BasicActions = ProcessTicketBasics(ARGSRef => \%ARGS, TicketObj=>$Ticket); + +push (@Actions, @BasicActions); +} +</%INIT> + + + + diff --git a/rt/webrt/Ticket/Elements/AddWatchers b/rt/webrt/Ticket/Elements/AddWatchers new file mode 100755 index 000000000..053cff122 --- /dev/null +++ b/rt/webrt/Ticket/Elements/AddWatchers @@ -0,0 +1,54 @@ +<BR> +<%$msg%><br> + +Add new watchers:<br> + +<table> +% if ($Users) { +<tr><td> +Type +</td><td> +Username +</td></tr> +% while (my $u = $Users->Next ) { +<tr><td><&/Elements/SelectWatcherType, Name => "WatcherTypeUser".$u->Id &></td><td><%$u->Name%> (<%$u->RealName%>)</td></tr> +% } +% } + +<tr><td> +Type +</td><td> +Email +</td></tr> +<tr><td> +<&/Elements/SelectWatcherType, Name => "WatcherTypeEmail1" &> +</td><td> +<input name="WatcherAddressEmail1" size=15> +</td></tr> +<tr><td> +<&/Elements/SelectWatcherType, Name => "WatcherTypeEmail2" &> +</td><td> +<input name="WatcherAddressEmail2" size=15> +</td></tr> +<tr><td> +<&/Elements/SelectWatcherType, Name => "WatcherTypeEmail3" &> +</td><td> +<input name="WatcherAddressEmail3" size=15> +</td></tr> +</table> + +<%INIT> +my ($msg, $Users); +if ($UserString) { + $Users = new RT::Users($session{'CurrentUser'}); + $Users->Limit(FIELD => $UserField, + VALUE => $UserString, + OPERATOR => $UserOp); + } +</%INIT> + +<%ARGS> +$UserField => 'Name' +$UserOp => '=' +$UserString => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/EditBasics b/rt/webrt/Ticket/Elements/EditBasics new file mode 100755 index 000000000..12142879e --- /dev/null +++ b/rt/webrt/Ticket/Elements/EditBasics @@ -0,0 +1,62 @@ +<TABLE> +<TR> +<TD COLSPAN=6> + Subject<BR> + <input name=Subject value="<%$TicketObj->Subject|h%>" SIZE=50> +</TD> +</TR> +<TR> +<TD> +<& /Elements/ShadedBox, + title => 'Status', + content => $SelectStatus +&> +</TD> +<TD> + +<& /Elements/ShadedBox, + title => 'Time Worked', + content => "<input name=TimeWorked value=\"".$TicketObj->TimeWorked."\" SIZE=5>" +&> + +</TD> +<TD> +<& /Elements/ShadedBox, + title => 'Time Left', + content => "<input name=TimeLeft value=\"".$TicketObj->TimeLeft."\" SIZE=5>" +&> +</TD> +<TD> +<& /Elements/ShadedBox, + title => 'Priority', + content => "<input name=Priority value=\"".$TicketObj->Priority."\" SIZE=3>" +&> + +</TD> +<TD> +<& /Elements/ShadedBox, + title => 'Final Priority', + content => "<input name=FinalPriority value=\"".$TicketObj->FinalPriority."\" SIZE=3>" +&> + + +</TD> +<TD> +<& /Elements/ShadedBox, + title => 'Queue', + content => "$SelectQueue" + &> +</TD> +</TR> +</TABLE> + +<%INIT> +#It's hard to do this inline, so we'll preload the html of the selectstatus in here. +my $SelectStatus = $m->scomp("/Elements/SelectStatus", Name => 'Status', Default=> $TicketObj->Status); +my $SelectQueue = $m->scomp("/Elements/SelectQueue", Name => 'Queue', Default =>$TicketObj->QueueObj->Id); + +</%INIT> +<%ARGS> + +$TicketObj => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/EditDates b/rt/webrt/Ticket/Elements/EditDates new file mode 100755 index 000000000..f04130bde --- /dev/null +++ b/rt/webrt/Ticket/Elements/EditDates @@ -0,0 +1,46 @@ +<TABLE> +<TR> +<TD> +Starts: +</TD> +<TD> +<& /Elements/SelectDate, menu_prefix => 'Starts', current => 0 &> + (<% $TicketObj->StartsObj->AsString %>) +</TD> +</TR> +<TR> +<TD> +Started: +</TD> +<TD> +<& /Elements/SelectDate, menu_prefix => 'Started', current => 0 &> (<%$TicketObj->StartedObj->AsString %>) + + + +</TD> +</TR> + +<TR> +<TD> +Last Contact: +</TD> +<TD> +<& /Elements/SelectDate, menu_prefix => 'Told', current => 0 &> (<% $TicketObj->ToldObj->AsString %>) + +</TD> +</TR> +<TR> +<TD> +Due: +</TD> +<TD> + +<& /Elements/SelectDate, menu_prefix => 'Due', current => 0 &> (<% $TicketObj->DueObj->AsString %>) +</TD> +</TR> + +</TABLE> +<%ARGS> +$TicketObj => undef +</%ARGS> + diff --git a/rt/webrt/Ticket/Elements/EditKeywordSelects b/rt/webrt/Ticket/Elements/EditKeywordSelects new file mode 100644 index 000000000..34ade9f25 --- /dev/null +++ b/rt/webrt/Ticket/Elements/EditKeywordSelects @@ -0,0 +1,45 @@ + +<TABLE> + <TR> +% while ( my $KeywordSelect = $KeywordSelects->Next ) { +% my $CurrentKeywords = $TicketObj->KeywordsObj($KeywordSelect->id); +% my $Descendents = $KeywordSelect->KeywordObj->Descendents; + <TD VALIGN=TOP> + <% $KeywordSelect->Name %> + <BR> + <INPUT TYPE="hidden" NAME="KeywordSelectMagic<% $KeywordSelect->id %>" VALUE="1"> + <SELECT NAME="KeywordSelect<% $KeywordSelect->id %>" + <% $KeywordSelect->Single ? "" : " MULTIPLE " %> SIZE=5> +%# +%# +%# All of this cruft is so we have a 'no keyword' selector for single +%# keywords that's only selected when there's no value. +% +% my $selected_keywords = 0; +% foreach my $kid ( keys %{$Descendents} ) { +% my $selected = 0; +% if ($CurrentKeywords->HasEntry($kid)) { $selected_keywords++; $selected=1;} + <OPTION VALUE="<% $kid %>" + <% $selected && 'SELECTED'%>> + <% $Descendents->{$kid} %> + </OPTION> +% } +% if ( $KeywordSelect->Single) { +<OPTION VALUE="" <% ($selected_keywords == 0) && 'SELECTED' %> >(empty)</OPTION> +% } + </SELECT> + </TD> +% } + </TR> + +</TABLE> + + +<%INIT> +my $KeywordSelects = $TicketObj->QueueObj->KeywordSelects; +</%INIT> + +<%ARGS> +$TicketObj => undef +</%ARGS> + diff --git a/rt/webrt/Ticket/Elements/EditLinks b/rt/webrt/Ticket/Elements/EditLinks new file mode 100755 index 000000000..b0296fce1 --- /dev/null +++ b/rt/webrt/Ticket/Elements/EditLinks @@ -0,0 +1,109 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Elements/Attic/EditLinks,v 1.1 2002-08-12 06:17:09 ivan Exp $ +%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com> + + +<TABLE> +<TR> +<TD VALIGN=TOP> +<h3>New Relationships</h3> +<i>Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces.</i><br> +<TABLE> +<TR><TD>Merge into:</TD><TD><input name="<%$Ticket->Id%>-MergeInto"> <i>(only one ticket)</i></TD></TR> +<TR><TD>Depends on:</TD><TD><input name="<%$Ticket->Id%>-DependsOn"></TD></TR> +<TR><TD>Depended on by:</TD><TD><input name="DependsOn-<%$Ticket->Id%>"></TD></TR> +<TR><TD>Parents:</TD><TD><input name="<%$Ticket->Id%>-MemberOf"></TD></TR> +<TR><TD>Children:</TD><TD> <input name="MemberOf-<%$Ticket->Id%>"></TD></TR> +<TR><TD>Refers to:</TD><TD><input name="<%$Ticket->Id%>-RefersTo"></TD></TR> +<TR><TD>Referred to by:</TD><TD> <input name="RefersTo-<%$Ticket->Id%>"></TD></TR> +</TABLE> +</TD> +<TD VALIGN=TOP WIDTH=50%> +<h3>Current Relationships</h3> +<i>(Check boxes to delete)</i><br> + +Depends on:<BR> +<UL> +% while (my $link = $Ticket->DependsOn->Next) { +% my $member = $link->TargetObj; +<LI> +<INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>"> +<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> +[<%$member->Status%>] + +% } +</UL> + +Depended on by:<BR> +<UL> +% while (my $link = $Ticket->DependedOnBy->Next) { +% my $member = $link->BaseObj; +<LI> +<INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-"> +<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> +[<%$member->Status%>] +% } +</UL> + +Parents:<BR> +<UL> +% while (my $link = $Ticket->MemberOf->Next) { +% my $member = $link->TargetObj; +<LI> +<INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>"> +<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> +[<%$member->Status%>] + +% } +</UL> + +Children:<BR> +<UL> +% while (my $link = $Ticket->Members->Next) { +<LI> +<INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-"> +% my $member = $link->BaseObj; +<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> +[<%$member->Status%>] +% } +</UL> + + +Refers to:<BR> +<UL> +% while (my $link = $Ticket->RefersTo->Next) { +<LI> +<INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>"> +% if ($link->TargetIsLocal) { +% my $member = $link->TargetObj; + +<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br> +% } else { +<A HREF="<%$link->TargetAsHREF%>"><%$link->Target%></A> +% } +%} +</UL> + +Referred to by:<BR> +<UL> +% while (my $link = $Ticket->ReferredToBy->Next) { +<LI> +<INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-"> +% if ($link->BaseIsLocal) { +% my $member = $link->BaseObj; +<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br> +% } else { +<A HREF="<%$link->BaseAsHREF%>"><%$link->Base%></A> +%} +% } +</UL> + + +</TD> +</TR> +</TABLE> + + + +<%ARGS> +$Ticket => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/EditPeople b/rt/webrt/Ticket/Elements/EditPeople new file mode 100755 index 000000000..4f69af970 --- /dev/null +++ b/rt/webrt/Ticket/Elements/EditPeople @@ -0,0 +1,37 @@ + +<TABLE> +<TR> +<TD VALIGN=TOP> + +<h3>New watchers</h3> +Find people whose<BR> +<& /Elements/SelectUsers &> +<input type=submit name="OnlySearchForPeople" value="Go!"> + +<& AddWatchers, Ticket => $Ticket, UserString => $UserString, + UserOp => $UserOp, UserField => $UserField &> +</TD><TD VALIGN=TOP> +<h3>Owner</h3> +Owner: <& /Elements/SelectOwner, Name => 'Owner', QueueObj => $Ticket->QueueObj, TicketObj => $Ticket, Default => $Ticket->OwnerObj->Id &> +<h3>Current watchers</h3> +(Check box to delete)<br> + +Requestors: +<& EditWatchers, TicketObj => $Ticket, Type => 'requestors' &> + +Cc: +<& EditWatchers, TicketObj => $Ticket, Type => 'cc' &> + +Administrative Cc: +<& EditWatchers, TicketObj => $Ticket, Type => 'admincc' &> + +</TD> +</TR> +</TABLE> + +<%ARGS> +$UserField => undef +$UserOp => undef +$UserString => undef +$Ticket => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/EditWatchers b/rt/webrt/Ticket/Elements/EditWatchers new file mode 100755 index 000000000..00185e8f9 --- /dev/null +++ b/rt/webrt/Ticket/Elements/EditWatchers @@ -0,0 +1,46 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Elements/Attic/EditWatchers,v 1.1 2002-08-12 06:17:09 ivan Exp $ +%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com> + +<ul> + +%# Print out a placeholder if there are none. +%if ($watchers->Count == 0 ) { +<li><i>none</i> +% } + + +%while (my $watcher=$watchers->Next) { +<li> +<INPUT TYPE=CHECKBOX NAME="DelWatcher<%$watcher->id%>" UNCHECKED> +%#If there's a principal backing this user, lets give a link to their +%# account +%if ($watcher->IsUser) { +<a href="<%$RT::WebPath%>/Admin/Users/Modify.html?id=<%$watcher->OwnerObj->id%>"> +<%$watcher->OwnerObj->RealName%></a>: +%} else { +Email address: +%} +<i><%$watcher->Email%></i> +%} +</ul> +<%INIT> +my ($watchers, $watcher, $set); +if ($Type =~ /^request/i) { + $watchers = $TicketObj->Requestors; + } +elsif ($Type =~ /^admin/i) { + $watchers = $TicketObj->AdminCc; + } +elsif ($Type =~ /^cc/i) { + $watchers = $TicketObj->Cc; + } +else { $watchers = $TicketObj->Watchers; + } +</%INIT> +<%ARGS> +$TicketObj => undef +$Type => undef +</%ARGS> + + + diff --git a/rt/webrt/Ticket/Elements/ShowBasics b/rt/webrt/Ticket/Elements/ShowBasics new file mode 100755 index 000000000..97c84c9d0 --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowBasics @@ -0,0 +1,29 @@ + <TABLE WIDTH="100%"> + <TR> + <TD VALIGN=TOP WIDTH="20%"> + <& /Elements/ShadedBox, title => 'Id' , content => $Ticket->Id &> + </TD> + <TD VALIGN=TOP WIDTH="20%"> <& /Elements/ShadedBox, title => 'Status' , content => $Ticket->Status &> + </TD> + <TD VALIGN=TOP WIDTH="20%"> + <& /Elements/ShadedBox, title => 'Worked' , content => $TimeWorked ." min" &> + </TD> + <TD VALIGN=TOP WIDTH="20%"> + <& /Elements/ShadedBox, title => 'Priority', content=> $Ticket->Priority."/".$Ticket->FinalPriority &> + </TD> + <TD VALIGN=TOP WIDTH="20%"> + <& /Elements/ShadedBox, title => 'Queue', content=> $Ticket->QueueObj->Name &> + </TD> + + + </TR> + </TABLE> +<%INIT> +my $TimeWorked = $Ticket->TimeWorked; +if ($Ticket->TimeLeft > 0 ) { + $TimeWorked = $Ticket->TimeWorked."/".$Ticket->TimeLeft; +} +</%INIT> +<%ARGS> +$Ticket => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ShowDates b/rt/webrt/Ticket/Elements/ShowDates new file mode 100755 index 000000000..e17e31355 --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowDates @@ -0,0 +1,54 @@ +<TABLE> +<TR> +<TD> +Created: +</TD> +<TD> +<% $Ticket->CreatedObj->AsString %> +</TD> +</TR> +<TR> +<TD> +Starts: +</TD> +<TD> +<% $Ticket->StartsObj->AsString %> <BR> +</TD> +</TR> +<TR> +<TD> +Started: +</TD> +<TD> +<% $Ticket->StartedObj->AsString %> +</TD> +</TR> + +<TR> +<TD> +<a href="Display.html?id=<%$Ticket->id%>&Action=SetTold">Last Contact</a>: +</TD> +<TD> +<% $Ticket->ToldObj->AsString %> +</TD> +</TR> +<TR> +<TD> +Due: +</TD> +<TD><% $Ticket->DueObj->AsString %> +</TD> +</TR> +<TR> +<TD> +Updated: +</TD> +<TD> +<A HREF="#lasttrans"> +<% $Ticket->LastUpdated ? ($Ticket->LastUpdatedAsString ." by ".$Ticket->LastUpdatedByObj->Name) : "Never" | h %></a> +</TD> +</TR> +</TABLE> +<%ARGS> +$Ticket => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ShowDependencies b/rt/webrt/Ticket/Elements/ShowDependencies new file mode 100755 index 000000000..488652f83 --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowDependencies @@ -0,0 +1,18 @@ +Depends on:<BR> +% while (my $Link = $Ticket->DependsOn->Next) { +% my $member = $Link->TargetObj; +<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> +[<%$member->Status%>] + <br> +% } +Depended on by:<BR> +% while (my $Link = $Ticket->DependedOnBy->Next) { +% my $member = $Link->TargetObj; +<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> +[<%$member->Status%>] + <br> +% } + +<%ARGS> +$Ticket => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ShowHistory b/rt/webrt/Ticket/Elements/ShowHistory new file mode 100755 index 000000000..155eaaabd --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowHistory @@ -0,0 +1,43 @@ +<TABLE BORDER=0 width="100%"> +<TR> +<TD ALIGN=LEFT> +% if ($ShowTitle) { +<font size=+3>History</font> +% } + </TD> +<TD align=right><font size=-1>Display mode: +% if ($ShowHeaders == $Ticket->Id) { +[<A HREF="<%$URIFile%>?id=<%$Ticket->id%>">Brief headers</a>] +<b>[Full headers]</b> +% } else { +<b>[Brief headers]</b> +[<A HREF="<%$URIFile%>?ShowHeaders=<%$Ticket->Id%>&id=<%$Ticket->id%>">Full headers</a>] +% } +</font> +</TD> +</TR> +</TABLE> + +<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=2 BORDER=0> +% while (my $Transaction = $Transactions->Next) { +% $i++; +% if ($Transactions->IsLast) { + <a name="lasttrans"></a> +% } + <& ShowTransaction, Ticket => $Ticket, Transaction => $Transaction, ShowHeaders => $ShowHeaders, Collapsed => $Collapsed, RowNum => $i &> +% } +</TABLE> +<%INIT> + +my $Transactions = $Ticket->Transactions; +my $i; + + +</%INIT> +<%ARGS> +$URIFile => 'Display.html' +$Ticket => undef +$ShowHeaders => undef +$Collapsed => undef +$ShowTitle => 1 +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ShowKeywordSelects b/rt/webrt/Ticket/Elements/ShowKeywordSelects new file mode 100644 index 000000000..4f8a1786b --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowKeywordSelects @@ -0,0 +1,26 @@ +<TABLE> +% while ( my $KeywordSelect = $KeywordSelects->Next ) { + <TR> + <TD VALIGN=TOP> + <% $KeywordSelect->Name %><BR> + </TD> + <TD VALIGN=TOP> + <UL> +% my $Keywords = $Ticket->KeywordsObj($KeywordSelect->Id); +% while (my $Keyword = $Keywords->Next) { + <li><% $Keyword->KeywordObj->RelativePath($KeywordSelect->KeywordObj) |n %></li> + +% } + </ul> + </TD> + </TR> +% } +</TABLE> + +<%INIT> +my $KeywordSelects = $Ticket->QueueObj->KeywordSelects; +</%INIT> + +<%ARGS> +$Ticket => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ShowLinks b/rt/webrt/Ticket/Elements/ShowLinks new file mode 100755 index 000000000..49795959e --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowLinks @@ -0,0 +1,61 @@ +Depends on:<BR> +<UL> +% while (my $Link = $Ticket->DependsOn->Next) { +% my $member = $Link->TargetObj; +<LI><a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> +[<%$member->Status%>] + +% } +</UL> + +Depended on by:<BR> +<UL> +% while (my $Link = $Ticket->DependedOnBy->Next) { +% my $member = $Link->BaseObj; +<LI><a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> +[<%$member->Status%>] +% } +</UL> +Parents:<BR> +<UL> +% while (my $Link = $Ticket->MemberOf->Next) { +% my $member = $Link->TargetObj; +<LI><a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> +[<%$member->Status%>] + +% } +</UL> + +Children:<BR> +<& /Ticket/Elements/ShowMembers, Ticket => $Ticket &> +<BR> +Refers to:<BR> +<UL> +% while (my $Link = $Ticket->RefersTo->Next) { +<LI> +% if ($Link->TargetIsLocal) { +% my $member = $Link->TargetObj; + +<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br> +% } else { +<A HREF="<%$Link->TargetAsHREF%>"><%$Link->Target%></A> +% } +%} +</UL> + +Referred to by:<BR> +<UL> +% while (my $Link = $Ticket->ReferredToBy->Next) { +<LI> +% if ($Link->BaseIsLocal) { +% my $member = $Link->BaseObj; +<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br> +% } else { +<A HREF="<%$Link->BaseAsHREF%>"><%$Link->Base%></A> +%} +% } +</UL> + +<%ARGS> +$Ticket => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ShowMemberOf b/rt/webrt/Ticket/Elements/ShowMemberOf new file mode 100755 index 000000000..df5dc92b0 --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowMemberOf @@ -0,0 +1,12 @@ +<UL> +% my $memberof = $Ticket->MemberOf; +% while (my $member_of = $memberof->Next) { +<LI><a href="/Ticket/Display.html?id=<%$member_of->Id%>"><%$member_of->Id%></a>: <%$member_of->Subject%> [<%$member_of->Status%>] +% } +</UL> + +<%INIT> +</%INIT> +<%ARGS> +$Ticket => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ShowMembers b/rt/webrt/Ticket/Elements/ShowMembers new file mode 100755 index 000000000..0a6f12377 --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowMembers @@ -0,0 +1,22 @@ +% if ($members->Count) { +<UL> +% while (my $link = $members->Next) { +% my $member= $link->BaseObj; +<LI><a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: <%$member->Subject%> [<%$member->Status%>]<br> +% if ($depth < 8) { +<&/Ticket/Elements/ShowMembers, Ticket => $member, depth => ($depth+1) &> +% } +% } +</UL> +% } + +<%INIT> + +my $members = $Ticket->Members; + +</%INIT> + +<%ARGS> +$Ticket => undef +$depth => 1 +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ShowPeople b/rt/webrt/Ticket/Elements/ShowPeople new file mode 100755 index 000000000..ff35f484d --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowPeople @@ -0,0 +1,12 @@ +Owner<BR> + <B><%$Ticket->OwnerObj->Name%></B><BR> +Requestors<BR> + <B><%$Ticket->RequestorsAsString%></B><BR> +Cc<BR> + <B><%$Ticket->CcAsString%></B><BR> +AdminCc<BR> + <B><%$Ticket->AdminCcAsString%></B> +<%ARGS> +$Ticket => undef +</%ARGS> + diff --git a/rt/webrt/Ticket/Elements/ShowReferences b/rt/webrt/Ticket/Elements/ShowReferences new file mode 100755 index 000000000..37e2fdece --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowReferences @@ -0,0 +1,27 @@ +<UL> +% while (my $Link = $Ticket->RefersTo->Next) { +<LI> +% if ($Link->TargetIsLocal) { +% my $member = $Link->TargetObj; + +<a href="/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br> +% } else { +<A HREF="<%$Link->TargetAsHREF%>"><%$Link->Target%></A> +% } +%} + + + +% while (my $Link = $Ticket->ReferredToBy->Next) { +<LI> +% if ($Link->BaseIsLocal) { +% my $member = $Link->BaseObj; +<a href="/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br> +% } else { +<A HREF="<%$Link->BaseAsHREF%>"><%$Link->Base%></A> +%} +% } +</UL> +<%ARGS> +$Ticket => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ShowRequestor b/rt/webrt/Ticket/Elements/ShowRequestor new file mode 100644 index 000000000..fcbe71df1 --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowRequestor @@ -0,0 +1,35 @@ +<%PERL> +my $people = $Ticket->Requestors; +while (my $requestor=$people->Next) { +if (($requestor->Owner ) && (my $user=$requestor->OwnerObj)) { +my $name=$user->RealName || $user->EmailAddress; +my $tickets = new RT::Tickets($session{'CurrentUser'}); +$tickets->LimitRequestor(VALUE => $user->EmailAddress); +$tickets->LimitStatus( VALUE => 'open'); +$tickets->LimitStatus( VALUE => 'new'); +$tickets->RowsPerPage(25); +$tickets->OrderBy(FIELD => 'Priority', + ORDER => 'DESC'); +</%PERL> + +% unless ($user->Privileged) { +<& /Elements/TitleBoxStart, + title => "<a class='inverse' href=\"$RT::WebPath/Admin/Users/Modify.html?id=".$user->id."\">More about $name</a>" &> + +Comments about this user:<BR> +<B><% ($user->Comments || "No comment entered about this user") %></B><BR> + +This user's 25 highest priority tickets:<BR> +<UL> +%while (my $w=$tickets->Next) { +<LI><%$w->Id%>: <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$w->id%>"><%$w->Subject%></a> (<%$w->Status%>) +%} +</UL> +<& /Elements/TitleBoxEnd &> + +% } +% } +%} +<%ARGS> +$Ticket=>undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ShowSummary b/rt/webrt/Ticket/Elements/ShowSummary new file mode 100755 index 000000000..b80ceb4fd --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowSummary @@ -0,0 +1,61 @@ + <TABLE WIDTH="100%" > + <TR> + <TD VALIGN=TOP > + <& /Elements/TitleBoxStart, title => 'The Basics', + title_href =>"$RT::WebPath/Ticket/Modify.html?id=".$Ticket->Id, + title_class=> 'inverse', + color => "#993333" &> + <& /Ticket/Elements/ShowBasics, Ticket => $Ticket &> + <& /Elements/TitleBoxEnd &> + + <BR> + + <& /Elements/TitleBoxStart, + title_href =>"$RT::WebPath/Ticket/Modify.html?id=".$Ticket->Id, + title_class=> 'inverse', + title => "Keyword Selections", color => "#993300" + &> + <& /Ticket/Elements/ShowKeywordSelects, Ticket => $Ticket &> + <& /Elements/TitleBoxEnd &> + + + + <BR> + <& /Elements/TitleBoxStart, title => 'Relationships', + title_href => "$RT::WebPath/Ticket/ModifyLinks.html?id=".$Ticket->Id, + title_class=> 'inverse', + titleright => '', color=> "#336633" &> + <& /Ticket/Elements/ShowLinks, Ticket => $Ticket &> + <& /Elements/TitleBoxEnd &> + </TD> + <BR> + <TD VALIGN=TOP > + + <& /Elements/TitleBoxStart, title => "Dates", + title_href =>"$RT::WebPath/Ticket/ModifyDates.html?id=".$Ticket->Id, + title_class=> 'inverse', + color => "#663366" &> + <& /Ticket/Elements/ShowDates, Ticket => $Ticket &> + <& /Elements/TitleBoxEnd &> + <BR> + <& /Elements/TitleBoxStart, title => 'People', + title_href =>"$RT::WebPath/Ticket/ModifyPeople.html?id=".$Ticket->Id, + title_class=> 'inverse', + color => "#333399" &> + <& /Ticket/Elements/ShowPeople, Ticket => $Ticket &> + <& /Elements/TitleBoxEnd &> + <BR> + + <& /Ticket/Elements/ShowRequestor, Ticket => $Ticket &> + + + </TD> + </TR> + </TABLE> +<%ARGS> +$Ticket => undef +</%ARGS> + + + + diff --git a/rt/webrt/Ticket/Elements/ShowTransaction b/rt/webrt/Ticket/Elements/ShowTransaction new file mode 100755 index 000000000..a0da008b3 --- /dev/null +++ b/rt/webrt/Ticket/Elements/ShowTransaction @@ -0,0 +1,162 @@ +<TR bgcolor="<%$rowbgcolor%>"> +<TD bgcolor="<%$bgcolor%>"><A NAME="#<%$Transaction->Id%>"></A>  </TD> +<TD>  </TD> +<TD><font size=-2><% $transdate|n %></font> </TD> +<TD ALIGN="LEFT"><b><%$Transaction->CreatorObj->Name%> - <%$TicketString%> <%$Transaction->BriefDescription%> + +</b></TD> +<TD><%$TimeTaken%> </TD> +<TD ALIGN="RIGHT"><font size=-1><%$titlebar_commands|n%></font></TD> +</TR> +<%PERL> + +unless ($Collapsed) { + $attachments->GotoFirstItem; + while (my $message=$attachments->Next) { + #we don't want to show any empty transactions, unless they have kids + next unless (length $message->Content || $message->Children->Count); + my ($headers, $content); + + </%PERL> + + +<%PERL> + if ($message->Parent == 0) { + if ($ShowHeaders == $Ticket->Id) { + $headers = $message->Headers; + } else { + $headers = $message->NiceHeaders; + } + chomp $headers; + $headers .= "\n\n" if ($headers); + } + # 13456 is a random # of about the biggest size we want to see inline text + my $MAX_INLINE_BODY = 13456; + if ($message->ContentType =~ m{^(text/plain|message|text$)}i && + length($message->Content)< $MAX_INLINE_BODY ) { + + $content = $message->Content; + + my $wrapper = new Text::Wrapper (columns=>85); + $content = $wrapper->wrap($content); + $content =~ s/&/&/g; + $content =~ s/</</g; + $content =~ s/>/>/g; + $content =~ s!((?:http|https|ftp|mailto):\S*?)([\s"']|>|\.[\n])!<A HREF=\"$1\" TARGET=new>$1</A>$2!g; + + + } + else { + $content = " "; + } + +</%PERL> +<TR BGCOLOR="<%$rowbgcolor%>"> + <TD BGCOLOR="<%$bgcolor%>"> </TD> + <TD>  </TD> + <TD COLSPAN=3 VALIGN=TOP> + <PRE> +<%$headers%><%$content|n%> +</PRE> + </TD> + <TD VALIGN=TOP ALIGN=RIGHT> + +% if ($message->Parent == 0 ) { +<BR> +% } +<%PERL> +my $size = length($message->Content()); + +if ($size) { + if ($size > 1024) { + $size = int($size/102.4)/10 . "k"; + } + else { + $size = $size ."b"; + } +</%PERL> +<font size=-1><A HREF="Attachment/<%$Transaction->Id%>/<%$message->Id%>/<%$message->Filename%>">Download <%$message->Filename|| '(untitled)'%></a> <% $size %></font> +% } +</TD> +</TR> +% } +% } + + + +<%ARGS> +$Ticket => undef +$Transaction => undef +$ShowHeaders => undef +$Collapsed => undef +$ShowTitleBarCommands => 1 +$RowNum => 1 +</%ARGS> + +<%INIT> + + +my ($TimeTaken, $TicketString, $bgcolor, $rowbgcolor); + +my $transdate = $Transaction->CreatedAsString(); +$transdate =~ s/\s/ /g; + +if ($RowNum % 2) { + $rowbgcolor="#cccccc"; +} else { + $rowbgcolor="#ffffff"; +} + +if ($Transaction->Type =~ /^(Create|Correspond|Comment$)/) { + if ($Transaction->IsInbound) { + $bgcolor="#336699"; + } + else { + $bgcolor="#339999"; + } +} elsif (($Transaction->Field =~ /^Owner$/) or + ($Transaction->Type =~ /^(AddWatcher|DelWatcher)$/)) { + $bgcolor="#333399"; + +} elsif ($Transaction->Type =~ /^(AddLink|DeleteLink)$/) { + $bgcolor="#336633"; +} elsif ($Transaction->Type =~ /^(Status|Set|Keyword|Told)$/) { + if ($Transaction->Field =~ /^(Told|Starts|Started|Due)$/) { + $bgcolor="#663366"; + } + else { + $bgcolor="#993333"; + } +} +else { + $bgcolor="#cccccc"; +} + +if ($Ticket->Id != $Transaction->Ticket) { + $TicketString = "Ticket ".$Transaction->Ticket .": "; +} + +if ($Transaction->TimeTaken > 0) { + $TimeTaken = $Transaction->TimeTaken." min" +} +my $attachments = $Transaction->Attachments; + +my $titlebar_commands=' '; + +# If the transaction has anything attached to it at all +if ($Transaction->Message->First && $ShowTitleBarCommands) { + if ($Transaction->TicketObj->CurrentUserHasRight('ReplyToTicket')) { + $titlebar_commands .= + "[<a href=\"Update.html?id=". + $Transaction->Ticket . "&QuoteTransaction=".$Transaction->Id. + "&Action=Respond\">Reply</a>] "; + } + if ($Transaction->TicketObj->CurrentUserHasRight('CommentOnTicket')) { + $titlebar_commands .= + "[<a href=\"Update.html?id=".$Transaction->Ticket. + "&QuoteTransaction=".$Transaction->Id. + "&Action=Comment\">Comment</a>]"; + } +} + +</%INIT> diff --git a/rt/webrt/Ticket/Elements/Tabs b/rt/webrt/Ticket/Elements/Tabs new file mode 100755 index 000000000..8cce197de --- /dev/null +++ b/rt/webrt/Ticket/Elements/Tabs @@ -0,0 +1,126 @@ +<& /Elements/Tabs, tabs => $tabs, actions => $actions, current_tab => $current_tab, tabs_scalar => $tabs_scalar &> +<%INIT> + + my $id = $Ticket->id(); + my $tabs_scalar = ''; + my $tabs = { + A => { title => 'Display', + path => "Ticket/Display.html?id=".$id, + }, + + Ab => { title => 'History', + path => "Ticket/History.html?id=".$id, + }, + B => { title => 'Basics', + path => "Ticket/Modify.html?id=".$id, + }, + + C => { title => 'Dates', + path => "Ticket/ModifyDates.html?id=".$id, + }, + + D => { title => 'People', + path => "Ticket/ModifyPeople.html?id=".$id, + }, + E => { title => 'Links', + path => "Ticket/ModifyLinks.html?id=".$id, + }, + F => { title => 'Jumbo', + path => "Ticket/ModifyAll.html?id=".$id, + }, + + }; + +my $actions; +if ($Ticket->CurrentUserHasRight('ModifyTicket') or + $Ticket->CurrentUserHasRight('CommentOnTicket')) { + $actions->{'Comment'} = + { + title => 'Comment', + path => "Ticket/Update.html?Action=Comment&id=".$id, + } + }; + +if ($Ticket->CurrentUserHasRight('ModifyTicket') or + $Ticket->CurrentUserHasRight('ReplyToTicket')) { + $actions->{'Reply'} = + { + title => 'Reply', + path => "Ticket/Update.html?Action=Respond&id=".$id, + } + }; + +if ($Ticket->CurrentUserHasRight('OwnTicket')) { + if ($Ticket->OwnerObj->id == $RT::Nobody->id) { + $actions->{'Take'} = + { + path => "Ticket/Display.html?Action=Take&id=".$id, + title => 'Take' + }; + } + elsif ( $Ticket->OwnerObj->id != $session{CurrentUser}->id) { + $actions->{'Steal'} = + { + path => "Ticket/Display.html?Action=Steal&id=".$id, + title => 'Steal' + }; + } +} + +if ($Ticket->CurrentUserHasRight('ModifyTicket')) { + if ($Ticket->Status ne 'resolved') { + $actions->{'Resolve'} = + { + + path => "Ticket/Update.html?Action=Comment&DefaultStatus=resolved&id=".$id, + title => 'Resolve' + }; + } + if ($Ticket->Status ne 'open') { + $actions->{'Open'} = + { + path => "Ticket/Display.html?Status=open&id=". $id, + title => 'Open' + }; + } +} + + + + +if (defined $session{'tickets'}) { + my $items = $session{'tickets'}->ItemsArrayRef(); + my @indexs = grep(($items->[$_]->id == $Ticket->Id), 0 .. $#{$items}); + + if ($items->[0]) { + + if ($items->[$indexs[0]]->id == $Ticket->Id) { + # Don't display prev links if we're on the first ticket + if ( $items->[0]->id != $Ticket->id ) { + $tabs_scalar .= '[<A HREF="Display.html?id='. + $items->[0]->id. + '"><< First</a>] '; + $tabs_scalar .= '[<A HREF="Display.html?id='. + $items->[$indexs[0]-1]->id. + '">< Prev</a>] '; + } + # Don't display next links if we're on the last ticket + if ( $Ticket->id != $items->[-1]->id ) { + $tabs_scalar .= '[<A HREF="Display.html?id='. + $items->[$indexs[0]+1]->id. + '">Next ></a>] '; + $tabs_scalar .= '[<A HREF="Display.html?id='. + $items->[-1]->id. + '">Last >></a>]'; + } + $tabs_scalar .= "<BR><BR>"; + } + } +} +</%INIT> + + +<%ARGS> +$Ticket => undef +$current_tab => undef +</%ARGS> diff --git a/rt/webrt/Ticket/Elements/ToolBar b/rt/webrt/Ticket/Elements/ToolBar new file mode 100755 index 000000000..108e2f784 --- /dev/null +++ b/rt/webrt/Ticket/Elements/ToolBar @@ -0,0 +1,3 @@ +<%ARGS> +$Ticket => undef +</%ARGS> diff --git a/rt/webrt/Ticket/History.html b/rt/webrt/Ticket/History.html new file mode 100755 index 000000000..e0a5fe15a --- /dev/null +++ b/rt/webrt/Ticket/History.html @@ -0,0 +1,30 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Attic/History.html,v 1.1 2002-08-12 06:17:09 ivan Exp $ +%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com> + +<& /Elements/Header, Title => "Ticket History #".$Ticket->Id ." ".$Ticket->Subject &> +<& /Ticket/Elements/Tabs, Ticket => $Ticket, current_tab => 'Ticket/History.html?id='.$Ticket->id &> + +<BR> + +<& /Ticket/Elements/ShowHistory , Ticket => $Ticket, ShowHeaders => $ARGS{'ShowHeaders'}, URIFile => 'History.html' &> + + +<%ARGS> +$id => undef +</%ARGS> + +<%INIT> + + + +my $Ticket = LoadTicket ($id); + +unless ($Ticket->CurrentUserHasRight('ShowTicket')) { + Abort("No permission to view ticket"); +} + +</%INIT> + + + + diff --git a/rt/webrt/Ticket/Modify.html b/rt/webrt/Ticket/Modify.html new file mode 100755 index 000000000..7a8a79216 --- /dev/null +++ b/rt/webrt/Ticket/Modify.html @@ -0,0 +1,39 @@ +<& /Elements/Header, Title => 'Modify ticket #'.$TicketObj->Id &> +<& /Ticket/Elements/Tabs, Ticket => $TicketObj, current_tab => "Ticket/Modify.html?id=".$TicketObj->Id &> + +<& /Elements/ListActions, actions => \@results &> +<FORM METHOD=POST ACTION="Modify.html"> +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$TicketObj->Id%>"> + +<& /Elements/TitleBoxStart, title => 'Modify ticket #'.$TicketObj->Id, + color=> "#993333", width => "100%" &> +<& Elements/EditBasics, TicketObj => $TicketObj &> +<& /Elements/TitleBoxEnd &> + +<& /Elements/TitleBoxStart, title => 'Keywords', color =>"#993333"&> +<& Elements/EditKeywordSelects, TicketObj=>$TicketObj &> +<& /Elements/TitleBoxEnd &> + +<& /Elements/Submit, Label => 'Save Changes', Caption => "If you've updated anything above, be sure to", color => "#993333" &> +</form> +<%INIT> + +my $TicketObj = LoadTicket($id); + +my @results = ProcessTicketBasics(TicketObj => $TicketObj, ARGSRef => \%ARGS); +my @okresults = ProcessTicketObjectKeywords(TicketObj => $TicketObj, ARGSRef => \%ARGS); + +push (@results, @okresults); + +# TODO: display the results, even if we can't display the ticket + +unless ($TicketObj->CurrentUserHasRight('ShowTicket')) { + Abort("No permission to view ticket"); +} + +</%INIT> + + +<%ARGS> +$id => undef +</%ARGS> diff --git a/rt/webrt/Ticket/ModifyAll.html b/rt/webrt/Ticket/ModifyAll.html new file mode 100755 index 000000000..ad913739d --- /dev/null +++ b/rt/webrt/Ticket/ModifyAll.html @@ -0,0 +1,124 @@ +<& /Elements/Header, Title => "Ticket #".$Ticket->Id ." Jumbo update: ".$Ticket->Subject &> +<& /Ticket/Elements/Tabs, Ticket => $Ticket , current_tab => "Ticket/ModifyAll.html?id=".$Ticket->Id &> + +<& /Elements/ListActions, actions => \@results &> + +<FORM METHOD=POST ACTION="ModifyAll.html" ENCTYPE="multipart/form-data"> +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>"> + + +<& /Elements/TitleBoxStart, title => 'Modify ticket #'.$Ticket->Id, color=> "#993333", width => "100%" &> +<& Elements/EditBasics, TicketObj => $Ticket &> +<& /Elements/TitleBoxEnd &> + +<BR> + +<& /Elements/TitleBoxStart, title => 'Dates', width => "100%", color => "#663366" &> +<& Elements/EditDates, TicketObj => $Ticket &> +<& /Elements/TitleBoxEnd &> + +<BR> + +<& /Elements/TitleBoxStart, title => 'Keywords', color =>"#993333"&> +<& Elements/EditKeywordSelects, TicketObj=>$Ticket &> +<& /Elements/TitleBoxEnd &> + +<BR> + +<& /Elements/TitleBoxStart, title => 'People',width => "100%", color=> "#333399" &> +<& Elements/EditPeople, Ticket => $Ticket, UserField => $UserField, UserString => $UserString, UserOp => $UserOp &> +<& /Elements/TitleBoxEnd &> + +<BR> + +<& /Elements/TitleBoxStart, title => 'Relationships', color => "#336633"&> +<& Elements/EditLinks, Ticket => $Ticket &> +<& /Elements/TitleBoxEnd &> + +<BR> + +<& /Elements/TitleBoxStart, title => 'Update ticket' &> +<hr> +Update Type: <select name="UpdateType"> +% if ($CanComment) { + <option value="private" >Comments (Not sent to requestors)</option> +% } +% if ($CanRespond) { + <option value="response">Response to requestors</option> +% } +</select> +<br> + +Subject: <input name="UpdateSubject" size=60 value=""> <br> +Attach: <input name="UpdateAttachment" type=file> <br> +<& /Elements/MessageBox, Name=>"UpdateContent", QuoteTransaction=>$ARGS{QuoteTransaction} &> +<& /Elements/TitleBoxEnd &> + + +<& /Elements/Submit, Label => 'Save Changes', Caption => "If you've updated anything above, be sure to", color => "#333399" &> +</form> + +<%INIT> + + + +my $Ticket = LoadTicket($id); + +my $CanRespond = 0; +my $CanComment = 0; + + +$CanRespond = 1 if ( $Ticket->CurrentUserHasRight('ReplyToTicket') or + $Ticket->CurrentUserHasRight('ModifyTicket') ); + +$CanComment = 1 if ( $Ticket->CurrentUserHasRight('CommentOnTicket') or + $Ticket->CurrentUserHasRight('ModifyTicket') ); + + +my (@wresults, @results, @okresults, @dresults, @lresults); + +unless ($OnlySearchForPeople) { + @wresults = ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS); + @results = ProcessTicketBasics( TicketObj => $Ticket, ARGSRef => \%ARGS); + @okresults = ProcessTicketObjectKeywords(TicketObj => $Ticket, ARGSRef => \%ARGS); + + @dresults = ProcessTicketDates( TicketObj => $Ticket, ARGSRef => \%ARGS); + @lresults = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS); + + $ARGS{'UpdateContent'} =~ s/\r\n/\n/g; + + if ($ARGS{'UpdateContent'} && + $ARGS{'UpdateContent'} ne '' && + $ARGS{'UpdateContent'} ne "-- \n" . + $session{'CurrentUser'}->UserObj->Signature + ) { + ProcessUpdateMessage(TicketObj => $Ticket, + ARGSRef=>\%ARGS, + Actions=>\@results); + } +} +push @results, @wresults; +push @results, @dresults; +push @results, @lresults; +push @results, @okresults; + +# If they've gone and moved the ticket to somewhere they can't see, etc... +# TODO: display the results, even if we can't display the ticket. + +unless ($Ticket->CurrentUserHasRight('ShowTicket')) { + Abort("No permission to view ticket"); +} + + +</%INIT> + + + +<%ARGS> +$OnlySearchForPeople => undef +$UserField => undef +$UserOp => undef +$UserString => undef +$id => undef +</%ARGS> + diff --git a/rt/webrt/Ticket/ModifyDates.html b/rt/webrt/Ticket/ModifyDates.html new file mode 100755 index 000000000..b2ecb68fb --- /dev/null +++ b/rt/webrt/Ticket/ModifyDates.html @@ -0,0 +1,26 @@ +<& /Elements/Header, Title => 'Modify dates for #'. $TicketObj->Id &> +<& /Ticket/Elements/Tabs, Ticket => $TicketObj, current_tab => "Ticket/ModifyDates.html?id=".$TicketObj->Id &> + +<& /Elements/ListActions, actions => \@results &> + +<FORM METHOD=POST ACTION="ModifyDates.html"> +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$TicketObj->Id%>"> +<& /Elements/TitleBoxStart, title => 'Modify dates for ticket #'.$TicketObj->Id, width => "100%", color => "#663366" &> + +<& Elements/EditDates, TicketObj => $TicketObj &> +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit, color => "#663366" &> +</form> + + +<%INIT> + +my $TicketObj = LoadTicket($id); +my @results = ProcessTicketDates( TicketObj => $TicketObj, ARGSRef => \%ARGS); + +</%INIT> + + +<%ARGS> +$id => undef +</%ARGS> diff --git a/rt/webrt/Ticket/ModifyLinks.html b/rt/webrt/Ticket/ModifyLinks.html new file mode 100755 index 000000000..14c939d43 --- /dev/null +++ b/rt/webrt/Ticket/ModifyLinks.html @@ -0,0 +1,31 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Attic/ModifyLinks.html,v 1.1 2002-08-12 06:17:09 ivan Exp $ +%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com> + +<& /Elements/Header, Title => "Link ticket ".$Ticket->Id &> +<& /Ticket/Elements/Tabs, Ticket => $Ticket, current_tab => "Ticket/ModifyLinks.html?id=".$Ticket->Id &> + +<& /Elements/ListActions, actions => \@results &> + +<form action="ModifyLinks.html" method="post"> +<input type="hidden" name="id" value="<%$Ticket->id%>"> + +<& /Elements/TitleBoxStart, title => 'Edit Relationships', color => "#336633"&> +<& Elements/EditLinks, Ticket => $Ticket &> +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit, color => "#336633", Caption=> 'Save changes' &> +</form> + + + + +<%INIT> + +my $Ticket = LoadTicket($id); +my @results = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS); + +</%INIT> + + +<%ARGS> +$id => undef +</%ARGS> diff --git a/rt/webrt/Ticket/ModifyPeople.html b/rt/webrt/Ticket/ModifyPeople.html new file mode 100755 index 000000000..fecf09192 --- /dev/null +++ b/rt/webrt/Ticket/ModifyPeople.html @@ -0,0 +1,38 @@ +<& /Elements/Header, Title => 'Modify people related to ticket # ' . $Ticket->id &> +<& /Ticket/Elements/Tabs, Ticket => $Ticket , current_tab => "Ticket/ModifyPeople.html?id=".$Ticket->Id &> + +<& /Elements/ListActions, actions => \@results &> + +<FORM METHOD=POST ACTION="ModifyPeople.html"> +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>"> +<& /Elements/TitleBoxStart, title => 'Modify people related to ticket #'.$Ticket->Id, width => "100%", color=> "#333399" &> +<& Elements/EditPeople, Ticket => $Ticket, UserField => $UserField, UserString => $UserString, UserOp => $UserOp &> +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit, Label => 'Save Changes', Caption => "If you've updated anything above, be sure to", color => "#333399" &> +</form> + +<%INIT> + +my (@results, @wresults); + +my $Ticket = LoadTicket($id); + +# if we're trying to search for watchers and nothing else +unless ($OnlySearchForPeople) { + @results = ProcessTicketBasics( TicketObj => $Ticket, ARGSRef => \%ARGS); + @wresults = ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS); +} + +push @results, @wresults; +</%INIT> + + + +<%ARGS> +$OnlySearchForPeople => undef +$UserField => undef +$UserOp => undef +$UserString => undef +$id => undef +</%ARGS> + diff --git a/rt/webrt/Ticket/Update.html b/rt/webrt/Ticket/Update.html new file mode 100755 index 000000000..be2266663 --- /dev/null +++ b/rt/webrt/Ticket/Update.html @@ -0,0 +1,110 @@ +<& /Elements/Header, Title=> $title &> +<& /Ticket/Elements/Tabs, Ticket => $Ticket &> +<& /Elements/TitleBoxStart, title => "Update ticket" &> + +<FORM ACTION="Display.html" NAME="TicketUpdate" + METHOD=POST enctype="multipart/form-data"> + +<TABLE> +<TR><TD> +<a href="ModifyPeople.html?id=<%$Ticket->Id%>">Ticket watchers</A></TD><TD align=right> +Requestor: +</TD><TD> +<b><% $Ticket->RequestorsAsString %></b> +</TD></TR> +<TR><TD> </TD><TD align=right> +Cc: +</TD><TD> +<b><% $Ticket->CcAsString %></b> +</TD></TR> +<TR><TD> </TD><TD align=right> +AdminCc: +</TD><TD> +<b><% $Ticket->AdminCcAsString %></b> +</TD></TR> +</TR> +</TABLE> +<hr> + +<TABLE BORDER=0> + +<tr><td align=right>Status:</td> +<td> +<& /Elements/SelectStatus, Name=>"Status", Default => $DefaultStatus &> +Owner: +<& /Elements/SelectOwner, Name=>"Owner", Default => $Ticket->OwnerObj->Id(), QueueObj => $Ticket->QueueObj, TicketObj => $Ticket &> +Worked: <input size=4 name="UpdateTimeWorked"> minutes</td></tr> +<tr><td align=right>Update Type:</td> +<td><select name="UpdateType"> +% if ($CanComment) { + <option value="private" <%$CommentDefault%>>Comments (Not sent to requestors)</option> +% } +% if ($CanRespond) { + <option value="response" <%$ResponseDefault%>>Response to requestors</option> +% } +</select> +</td></tr> +<tr><td align=right>Subject:</td><td> <input name="UpdateSubject" size=60 value="<%$Ticket->Subject()%>"></td></tr> +<tr><td align=right>Cc:</td><td> <input name="UpdateCc" size=60><BR> +<i><font size=-2>(Sends a carbon-copy of this update to a comma-delimited list +of email addresses. Does <b>not</b> change who will receive future updates.)</font></i> +</td></tr> +<tr><td align=right>Bcc:</td><td> <input name="UpdateBcc" size=60><BR> +<i><font size=-2>(Sends a blind carbon-copy of this update to a comma-delimited list +of email addresses. Does <b>not</b> change who will receive future updates.)</font></i> +</td></tr> +<tr><td align=right>Attach:</td><td><input name="UpdateAttachment" type="file"></td></tr> +</table> +<& /Elements/MessageBox, Name=>"UpdateContent", QuoteTransaction=>$ARGS{QuoteTransaction} &> + <INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>"><br> + + + + +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit &> + </FORM> + + + +<%INIT> + +my $CanRespond = 0; +my $CanComment = 0; +my $title; + +my $Ticket = LoadTicket($id); + + +if ($DefaultStatus eq 'resolved') { + $title = "Resolve"; +} else { + $title = "Update"; +} + +$title .= " ticket #" . $Ticket->id . " (" .$Ticket->Subject.")"; + +# Things needed in the template - we'll do the processing here, just +# for the convinience: +my $CommentDefault=$Action eq "Comment" ? "SELECTED" : ""; +my $ResponseDefault=$Action eq "Respond" ? "SELECTED" : ""; + +$DefaultStatus = $Ticket->Status() unless ($DefaultStatus); + +$CanRespond = 1 if ( $Ticket->CurrentUserHasRight('ReplyToTicket') or + $Ticket->CurrentUserHasRight('ModifyTicket') ); + +$CanComment = 1 if ( $Ticket->CurrentUserHasRight('CommentOnTicket') or + $Ticket->CurrentUserHasRight('ModifyTicket') ); + + + + + +</%INIT> + +<%ARGS> +$id => undef +$Action => undef +$DefaultStatus => undef +</%ARGS> |