diff options
Diffstat (limited to 'rt/webrt')
161 files changed, 7462 insertions, 0 deletions
diff --git a/rt/webrt/Admin/Elements/CreateQueueCalled b/rt/webrt/Admin/Elements/CreateQueueCalled new file mode 100755 index 000000000..aeed6e786 --- /dev/null +++ b/rt/webrt/Admin/Elements/CreateQueueCalled @@ -0,0 +1,3 @@ +<FORM METHOD=get ACTION="<% $RT::WebPath %>/Admin/Queues/Create.html"> +Create a queue called <INPUT NAME="Name" size=10><input type=submit> +</form> diff --git a/rt/webrt/Admin/Elements/CreateUserCalled b/rt/webrt/Admin/Elements/CreateUserCalled new file mode 100755 index 000000000..7e4bb7554 --- /dev/null +++ b/rt/webrt/Admin/Elements/CreateUserCalled @@ -0,0 +1,3 @@ +<FORM METHOD=get ACTION="<%$RT::WebPath%>/Admin/Users/Create.html"> +New user called <INPUT NAME="Name" size=10><input type=submit value="Create"> +</form> diff --git a/rt/webrt/Admin/Elements/EditUserComments b/rt/webrt/Admin/Elements/EditUserComments new file mode 100755 index 000000000..1ac7e187f --- /dev/null +++ b/rt/webrt/Admin/Elements/EditUserComments @@ -0,0 +1,9 @@ +<& /Elements/Header, Title => "Comments about $name" &> +These comments aren't generally visible to the user:<br> +<input type="hidden" name="id" value="<%$id%>"> +<TEXTAREA COLS=60 ROWS=15 WRAP=SOFT NAME="Comments"><% $UserObj->Comments %></TEXTAREA> +</FORM> + +<%ARGS> +$UserObj => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/GrantQueueRightsTo b/rt/webrt/Admin/Elements/GrantQueueRightsTo new file mode 100755 index 000000000..3850a18f2 --- /dev/null +++ b/rt/webrt/Admin/Elements/GrantQueueRightsTo @@ -0,0 +1,30 @@ +<BR> + +% if ($msg) { +<%$msg%> +% } elsif ($Users) { +<ul> +% while (my $u = $Users->Next ) { +<li> <%$u->Name%> (<%$u->RealName%>) <& SelectQueueRights, Name => "GrantTo".$u->id &> +% } +</ul> +% } + +<%INIT> +my ($msg, $Users); +if (!$ARGS{'UserString'}) { +$msg = "No users selected."; + } +else { + $Users = new RT::Users($session{'CurrentUser'}); + $Users->Limit(FIELD => $ARGS{'UserField'}, + VALUE => $ARGS{'UserString'}, + OPERATOR => $ARGS{'UserOp'}); + } +</%INIT> + +<%ARGS> +$UserField => 'Name' +$UserOp => '=' +$UserString => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/GroupTabs b/rt/webrt/Admin/Elements/GroupTabs new file mode 100755 index 000000000..261bef1e2 --- /dev/null +++ b/rt/webrt/Admin/Elements/GroupTabs @@ -0,0 +1,18 @@ +<& /Admin/Elements/Tabs, subtabs => $subtabs, current_tab => 'Admin/Groups/' &> +<hr> +<%INIT> +my $subtabs = { + Basics => { title => 'Basics', + path => "Admin/Groups/Modify.html?id=". $GroupObj->id + } + }; + +unless ($GroupObj->Pseudo) { +$subtabs->{'Members'} = { title => 'Members', + path => "Admin/Groups/Members.html?id=".$GroupObj->id }; +} +</%INIT> + +<%ARGS> +$GroupObj => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/Header b/rt/webrt/Admin/Elements/Header new file mode 100755 index 000000000..95acdac7e --- /dev/null +++ b/rt/webrt/Admin/Elements/Header @@ -0,0 +1,5 @@ +<& /Elements/Header, Title => $Title &> + +<%ARGS> +$Title => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/ListGlobalKeywordSelects b/rt/webrt/Admin/Elements/ListGlobalKeywordSelects new file mode 100644 index 000000000..b24d68989 --- /dev/null +++ b/rt/webrt/Admin/Elements/ListGlobalKeywordSelects @@ -0,0 +1,15 @@ +% while (my $KeywordSelect = $KeywordSelects->Next()) { + +<%$KeywordSelect->Name %>: +<% $KeywordSelect->Single ? 'Single' : 'Multiple' %> +children of +<% $KeywordSelect->KeywordObj->Path %> +% if ($KeywordSelect->Depth) { + up to <%$KeywordSelect->Depth%> levels deep +% } +<BR> +%} +<%INIT> +my $KeywordSelects = RT::KeywordSelects->new($session{'CurrentUser'}); +$KeywordSelects->LimitToGlobals(); +</%INIT> diff --git a/rt/webrt/Admin/Elements/ListGlobalScrips b/rt/webrt/Admin/Elements/ListGlobalScrips new file mode 100755 index 000000000..2f044bf52 --- /dev/null +++ b/rt/webrt/Admin/Elements/ListGlobalScrips @@ -0,0 +1,10 @@ +% while (my $scrip = $Scrips->Next ) { +<% $scrip->ConditionObj->Name %> +<% $scrip->ActionObj->Name %> +with template <% $scrip->TemplateObj->Name %> +<BR> +% } +<%init> +my $Scrips = new RT::Scrips ($session{'CurrentUser'}); +$Scrips->LimitToGlobal(); +</%INIT> diff --git a/rt/webrt/Admin/Elements/ModifyKeyword b/rt/webrt/Admin/Elements/ModifyKeyword new file mode 100644 index 000000000..4b01c3692 --- /dev/null +++ b/rt/webrt/Admin/Elements/ModifyKeyword @@ -0,0 +1,95 @@ +<FORM METHOD="get" ACTION="<%$RT::WebPath%>/Admin/Keywords/Modify.html"> +[<%$title |n %>]<BR> + +<INPUT TYPE="hidden" NAME="id" VALUE="<% $id %>"> +Keyword <INPUT NAME="Name" VALUE="<% $Keyword->Name %>"><BR> + +Parent <SELECT NAME="Parent"> + <OPTION VALUE=""<% defined($Keyword->Parent) ? '' : ' SELECTED' %>>-</OPTION> +%while ( $parent = $parents->Next ) { + <OPTION VALUE="<% $parent->id %>"<% defined($Keyword->Parent) && $parent->id == $Keyword->Parent ? ' SELECTED' : '' %>><% $parent->Name %></OPTION> +%} +</SELECT> + + +Kids <FONT SIZE="-2">(separate by +<INPUT TYPE="radio" NAME="delim" VALUE="n"<% $delim eq 'n' ? ' CHECKED' : '' %>> +line or +<INPUT TYPE="radio" NAME="delim" VALUE="s"<% $delim eq 's' ? ' CHECKED' : '' %>> +whitespace)</FONT><BR> + +<TEXTAREA NAME="Kids" ROWS=4><% $kidstring %></TEXTAREA> +<BR> + +<& /Elements/Submit, Label => $submit &> +</FORM> + +<%INIT> + +my $Keyword = new RT::Keyword($session{CurrentUser}); +my ($title, $submit, %kids, $kid); + +if ( $Create ) { + $title = "Create a new Keyword"; + $submit = "Create"; + $id = "new"; + %kids = (); + $Parent = ''; #silence +} elsif ( $id eq 'new' ) { + $id = $Keyword->Create( Name => $Name, Parent => $Parent ) + or Abort("can't create keyword Name=>$Name, Parent=>$Parent"); +} else { + $Keyword->Load($id) || Abort("Can't load keyword id $id"); + #foreach my $field ( grep eval "defined(\$$_)", qw( Name Parent )) { + # eval "\$Keyword->Set(\$field=>\$$field); #sigh + #} + $Keyword->SetName($Name) if defined($Name); + $Keyword->SetParent($Parent) if defined($Parent); +} + +$title = "Modify the Keyword <B>". $Keyword->Name. "</B>"; +$submit = "Modify"; + +my $kids = new RT::Keywords($session{CurrentUser}); +$kids->Limit( FIELD => 'Parent', VALUE => $id, OPERATOR => '=' ); +$kids{$kid->Name} = $kid while $kid = $kids->Next; + +if ( defined($Kids) ) { + my %newkids; + if ( $delim eq 'n' ) { + %newkids = map { $_=>1 } split(/\n/, $Kids); + } elsif ( $delim eq 's' ) { + %newkids = map { $_=>1 } split(' ', $Kids); + } else { + Abort("'$delim' isn't a valid keyword delimiter."); + } + foreach ( grep { ! defined($newkids{$_}) } keys %kids ) { + $kids{$_}->Delete; + delete $kids{$_}; + } + foreach ( grep { ! defined($kids{$_}) } keys %newkids ) { + $kids{$_} = new RT::Keyword($session{CurrentUser}); + $kids{$_}->Create( Name => $_, Parent => $id ) + or Abort("can't create keyword Name=>$_, Parent=>$id"); + } + +} + + +my $parent; +my $parents = new RT::Keywords($session{CurrentUser}); +$parents->UnLimit; + +$delim = ( grep /\s/, keys %kids ) ? 'n' : 's'; +my $kidstring = join("\n", keys %kids); + +</%INIT> + +<%ARGS> +$id => undef +$Create => undef +$Name => undef +$Parent => undef +$Kids => undef +$delim => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/ModifyKeywordSelect b/rt/webrt/Admin/Elements/ModifyKeywordSelect new file mode 100644 index 000000000..470e62929 --- /dev/null +++ b/rt/webrt/Admin/Elements/ModifyKeywordSelect @@ -0,0 +1,120 @@ + <FORM NAME="ModifyKeywordSelect" METHOD=POST ACTION="<%$RT::WebPath%>/Admin/KeywordSelects/Modify.html"> + + [<%$title |n %>] + <BR> + + <INPUT TYPE="hidden" NAME="id" VALUE="<% $id %>"> + Keyword + <SELECT NAME="Parent"> + +%while ( $parent = $parents->Next ) { + + <OPTION VALUE="<% $parent->id %>" <% defined($KeywordSelect->Parent) && $parent->id == $KeywordSelect->Parent ? ' SELECTED' : '' %>><% $parent->Name %></OPTION> + +% } + + </SELECT> + <BR> + Object + <SELECT NAME="ObjectType"> + <OPTION SELECTED>Ticket</OPTION> + </SELECT> + <BR> + +<SCRIPT> +function addOption(text, value, defaultselected, selected) { + var option = new Option(text, value, defaultselected, selected ) + var length = document.ModifyKeywordSelect.ObjectValue.length; + document.ModifyKeywordSelect.ObjectValue.options[length] = option +} +function ChangeObjectValue(what) { + Value = what.options[what.selectedIndex].value + if ( Value == "(none)" ) { + document.ModifyKeywordSelect.ObjectValue.options.length = 0 + addOption("(n/a)", "", false, false) + } + if ( Value == "Queue" ) { + document.ModifyKeywordSelect.ObjectValue.options.length = 0 +%foreach $queue ( keys %queues ) { + addOption("<% $queues{$queue} %>", "<% $queue %>", false, <% $queue == $KeywordSelect->ObjectValue ? 'true' : 'false' %> ) +%} + } +} +</SCRIPT> + + Limit to <SELECT NAME="ObjectField" onChange="ChangeObjectValue(this)"> + <OPTION VALUE="" <% $KeywordSelect->ObjectField ? '' : ' SELECTED' %>>(none)</OPTION> + <OPTION VALUE="Queue" <% $KeywordSelect->ObjectField eq 'Queue' ? ' SELECTED' : '' %>>Queue</OPTION> + </SELECT> + <SELECT NAME="ObjectValue"> + <OPTION VALUE="<% $KeywordSelect->ObjectValue %>"> + <% $KeywordSelect->ObjectField ? $queues{$KeywordSelect->ObjectValue} : "(n/a)" %></OPTION> + </SELECT><BR> + <INPUT TYPE="hidden" NAME="SingleMagic" VALUE="1"> + <INPUT TYPE="checkbox" NAME="Single" VALUE="1" <% $KeywordSelect->Single ? ' CHECKED' : '' %>>Allow single selection only<BR> + Limit to <INPUT TYPE="text" NAME="Generations" SIZE="2" VALUE="<% $KeywordSelect->Generations %>"> generations (0 = no limit)<BR> + <& /Elements/Submit, Label => $submit &> + +</FORM> + +<%INIT> + + +my $KeywordSelect = new RT::KeywordSelect($session{CurrentUser}); + +my($title, $submit); + +if ( $Create ) { + $title = "Create a new KeywordSelect"; + $submit = "Create"; + $id = "new"; +} else { + if ( $id eq 'new' ) { + $id = $KeywordSelect->Create ( + Parent => $Parent, + ObjectType => $ObjectType, + ObjectField => $ObjectField, + ObjectValue => $ObjectValue, + Single => $Single, + Generations => $Generations, + ) or Abort "can't create KeywordSelect"; + } else { + $KeywordSelect->Load($id) || Abort("Can't load keyword id $id"); + #false laziness + $KeywordSelect->SetParent($Parent) if defined($Parent); + $KeywordSelect->SetObjectType($ObjectType) if defined($ObjectType); + $KeywordSelect->SetObjectField($ObjectField) if defined($ObjectField); + $KeywordSelect->SetObjectValue($ObjectValue) if defined($ObjectValue); + $KeywordSelect->SetSingle($Single) if defined($SingleMagic); + $KeywordSelect->SetGenerations($Generations) if defined($Generations); + } + $title = "Modify the KeywordSelect <B>". $KeywordSelect->KeywordObj->Name. "</B>"; + $submit = "Modify"; + +} + + my $parents = new RT::Keywords($session{CurrentUser}); + $parents->UnLimit; + my $parent; + +my $queues = new RT::Queues($session{CurrentUser}); +$queues->UnLimit; + +my %queues; +my $queue; +$queues{$queue->id} = $queue->Name while $queue = $queues->Next; + +</%INIT> + +<%ARGS> +$id => undef +$Create => undef +$Parent => undef +$ObjectType => undef +$ObjectField => undef +$ObjectValue => undef +$Single => undef +$SingleMagic => undef +$Generations => undef +</%ARGS> + diff --git a/rt/webrt/Admin/Elements/ModifyQueue b/rt/webrt/Admin/Elements/ModifyQueue new file mode 100755 index 000000000..a641c81af --- /dev/null +++ b/rt/webrt/Admin/Elements/ModifyQueue @@ -0,0 +1,56 @@ + +<& /Elements/TitleBoxStart, title => 'Editing Configuration for queue '.$QueueObj->Id &> + +<FORM ACTION="<%$RT::WebPath%>/Admin/Queues/Modify.html" METHOD=POST> +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$QueueObj->Id%>"> +<TABLE> +<TR><TD ALIGN=RIGHT> +Queue Name: +</TD> +<TD><INPUT name="Name" value="<%$QueueObj->Name%>"></TD> +</TR><TR> +<TD ALIGN=RIGHT> +Description:</TD><TD COLSPAN=3><INPUT name="Description" value="<%$QueueObj->Description%>" size=60></TD></TR> +<TR> +<TD ALIGN=RIGHT> +Correspondence Address: +</TD><TD> +<INPUT name="CorrespondAddress" value="<%$QueueObj->CorrespondAddress%>"> +</TD> +<TD ALIGN=RIGHT> + +Comment Address: </TD><TD> +<INPUT NAME="CommentAddress" value="<%$QueueObj->CommentAddress%>"> +</TD> +</TR><TR> + +<TD ALIGN=RIGHT> +Priority starts at: +</TD><TD><INPUT NAME="InitialPriority" value="<%$QueueObj->InitialPriority %>"> +</TD> +<TD ALIGN=RIGHT> +Over time, priority moves toward: +</TD><TD><INPUT NAME="FinalPriority" value="<%$QueueObj->FinalPriority %>"> +</TD> +</TR> +<TR> +<TD ALIGN=RIGHT> +Requests should be due in: +</TD><TD> +<INPUT NAME="DefaultDueIn" VALUE="<%$QueueObj->DefaultDueIn%>"> days. +</TD> +</TR> +</TABLE> +<& /Elements/Submit &> +</form> +<& /Elements/TitleBoxEnd &> + +<%INIT> + +</%INIT> + +<%ARGS> + + +$QueueObj => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/ModifyTemplate b/rt/webrt/Admin/Elements/ModifyTemplate new file mode 100755 index 000000000..6e4f8a379 --- /dev/null +++ b/rt/webrt/Admin/Elements/ModifyTemplate @@ -0,0 +1,78 @@ + +<& /Elements/TitleBoxStart, title => 'Editing Configuration for user '.$UserObj->Name &> + +<FORM ACTION="<%$RT::WebPath%>/Admin/ModifyUser.html" METHOD=POST> +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$UserObj->Id%>"> + +Name: <input name="Name" value="<%$UserObj->Name%>"> +<BR> +New Password: <input type=password name="Pass1"><BR> +Retype Password: <input type=password name="Pass2"><BR> + +Comments: <TEXTAREA name="Comments" COLS=20 ROWS=5> +<%$UserObj->Comments%></TEXTAREA> + +<BR> +Signature: <TEXTAREA COLS=80 ROWS=5 name="Signature"> +<%$UserObj->Signature%>"></TEXTAREA> +<BR> +EmailAddress: <input name="EmailAddress" value="<%$UserObj->EmailAddress%>"> +<BR> +FreeformContactInfo: <input name="FreeformContactInfo" value="<%$UserObj->FreeformContactInfo%>"> +<BR> +Organization: <input name="Organization" value="<%$UserObj->Organization%>"> +<BR> +RealName: <input name="RealName" value="<%$UserObj->RealName%>"> +<BR> +NickName: <input name="NickName" value="<%$UserObj->NickName%>"> +<BR> +Lang: <input name="Lang" value="<%$UserObj->Lang%>"> +<BR> +EmailEncoding: <input name="EmailEncoding" value="<%$UserObj->EmailEncoding%>"> +<BR> +WebEncoding: <input name="WebEncoding" value="<%$UserObj->WebEncoding%>"> +<BR> +ExternalContactInfoId: <input name="ExternalContactInfoId" value="<%$UserObj->ExternalContactInfoId%>"> +<BR> +ContactInfoSystem: <input name="ContactInfoSystem" value="<%$UserObj->ContactInfoSystem%>"> +<BR> +Gecos: <input name="Gecos" value="<%$UserObj->Gecos%>"> +<BR> +ExternalAuthId: <input name="ExternalAuthId" value="<%$UserObj->ExternalAuthId%>"> +<BR> +AuthSystem: <input name="AuthSystem" value="<%$UserObj->AuthSystem%>"> +<BR> +HomePhone: <input name="HomePhone" value="<%$UserObj->HomePhone%>"> +<BR> +WorkPhone: <input name="WorkPhone" value="<%$UserObj->WorkPhone%>"> +<BR> +MobilePhone: <input name="MobilePhone" value="<%$UserObj->MobilePhone%>"> +<BR> +PagerPhone: <input name="PagerPhone" value="<%$UserObj->PagerPhone%>"> +<BR> +Address1: <input name="Address1" value="<%$UserObj->Address1%>"> +<BR> +Address2: <input name="Address2" value="<%$UserObj->Address2%>"> +<BR> +City: <input name="City" value="<%$UserObj->City%>"> +<BR> +State: <input name="State" value="<%$UserObj->State%>"> +<BR> +Zip: <input name="Zip" value="<%$UserObj->Zip%>"> +<BR> +Country: <input name="Country" value="<%$UserObj->Country%>"> +<BR> + +<input type=submit> +</form> +<& /Elements/TitleBoxEnd &> + +<%INIT> + +</%INIT> + +<%ARGS> + + +$UserObj => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/ModifyUser b/rt/webrt/Admin/Elements/ModifyUser new file mode 100755 index 000000000..53aa027c0 --- /dev/null +++ b/rt/webrt/Admin/Elements/ModifyUser @@ -0,0 +1,77 @@ + +<& /Elements/TitleBoxStart, title => 'Editing Configuration for user '.$UserObj->Name &> + +<FORM ACTION="<%$RT::WebPath%>/Admin/Users/Modify.html" METHOD=POST> +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$UserObj->Id%>"> + +Name: <input name="Name" value="<%$UserObj->Name%>"> +<BR> +New Password: <input type=password name="Pass1"><BR> +Retype Password: <input type=password name="Pass2"><BR> + +Comments: <TEXTAREA name="Comments" COLS=80 ROWS=5 WRAP=VIRTUAL> +<%$UserObj->Comments%></TEXTAREA> + +<BR> +Signature: <TEXTAREA COLS=80 ROWS=5 name="Signature" WRAP=HARD> +<%$UserObj->Signature%></TEXTAREA> +<BR> +EmailAddress: <input name="EmailAddress" value="<%$UserObj->EmailAddress%>"> +<BR> +FreeformContactInfo: <input name="FreeformContactInfo" value="<%$UserObj->FreeformContactInfo%>"> +<BR> +Organization: <input name="Organization" value="<%$UserObj->Organization%>"> +<BR> +RealName: <input name="RealName" value="<%$UserObj->RealName%>"> +<BR> +NickName: <input name="NickName" value="<%$UserObj->NickName%>"> +<BR> +Lang: <input name="Lang" value="<%$UserObj->Lang%>"> +<BR> +EmailEncoding: <input name="EmailEncoding" value="<%$UserObj->EmailEncoding%>"> +<BR> +WebEncoding: <input name="WebEncoding" value="<%$UserObj->WebEncoding%>"> +<BR> +ExternalContactInfoId: <input name="ExternalContactInfoId" value="<%$UserObj->ExternalContactInfoId%>"> +<BR> +ContactInfoSystem: <input name="ContactInfoSystem" value="<%$UserObj->ContactInfoSystem%>"> +<BR> +Gecos: <input name="Gecos" value="<%$UserObj->Gecos%>"> +<BR> +ExternalAuthId: <input name="ExternalAuthId" value="<%$UserObj->ExternalAuthId%>"> +<BR> +AuthSystem: <input name="AuthSystem" value="<%$UserObj->AuthSystem%>"> +<BR> +HomePhone: <input name="HomePhone" value="<%$UserObj->HomePhone%>"> +<BR> +WorkPhone: <input name="WorkPhone" value="<%$UserObj->WorkPhone%>"> +<BR> +MobilePhone: <input name="MobilePhone" value="<%$UserObj->MobilePhone%>"> +<BR> +PagerPhone: <input name="PagerPhone" value="<%$UserObj->PagerPhone%>"> +<BR> +Address1: <input name="Address1" value="<%$UserObj->Address1%>"> +<BR> +Address2: <input name="Address2" value="<%$UserObj->Address2%>"> +<BR> +City: <input name="City" value="<%$UserObj->City%>"> +<BR> +State: <input name="State" value="<%$UserObj->State%>"> +<BR> +Zip: <input name="Zip" value="<%$UserObj->Zip%>"> +<BR> +Country: <input name="Country" value="<%$UserObj->Country%>"> +<BR> +<& /Elements/Submit &> +</form> +<& /Elements/TitleBoxEnd &> + +<%INIT> + +</%INIT> + +<%ARGS> + + +$UserObj => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/QueueRightsForUser b/rt/webrt/Admin/Elements/QueueRightsForUser new file mode 100644 index 000000000..e62a124ce --- /dev/null +++ b/rt/webrt/Admin/Elements/QueueRightsForUser @@ -0,0 +1,17 @@ +<UL> +%while(my $ACE = $ACL->Next) { + +<LI><checkbox name="delete_ace_<%$ACE->id%>"> <%$ACE->RightName%> (<%$ACE->UserObj->RealName%>) + +%} +</UL> + +<%INIT> +my $ACL = new RT::ACL($session{'CurrentUser'}); +$ACL->LimitToQueue($QueueObj->id); +$ACL->LimitPrincipalToUser($PrincipalId); +</%INIT> +<%ARGS> +$PrincipalId => undef +$QueueObj => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/QueueTabs b/rt/webrt/Admin/Elements/QueueTabs new file mode 100755 index 000000000..b7da7e007 --- /dev/null +++ b/rt/webrt/Admin/Elements/QueueTabs @@ -0,0 +1,36 @@ +<& /Admin/Elements/Tabs, subtabs => $subtabs, current_tab => 'Admin/Queues/' &> +<hr> +<%INIT> + my $subtabs = { + A => { title => 'Basics', + path => "Admin/Queues/Modify.html?id=".$id, + }, + B => { title => 'Watchers', + path => "Admin/Queues/People.html?id=".$id, + }, + + C => { title => 'Scrips', + path => "Admin/Queues/Scrips.html?id=".$id, + }, + D => { title => 'Templates', + path => "Admin/Queues/Templates.html?id=".$id, + }, + E => { title => 'Keyword Selections', + path => "Admin/Queues/Keywords.html?id=".$id, + }, + F => { title => 'Group Rights', + path => "Admin/Queues/GroupRights.html?id=".$id, + }, + G => { title => 'User Rights', + path => "Admin/Queues/UserRights.html?id=".$id, + }, + + + +}; +</%INIT> + + +<%ARGS> +$id => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectKeywordSelect b/rt/webrt/Admin/Elements/SelectKeywordSelect new file mode 100644 index 000000000..f5a8d77cd --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectKeywordSelect @@ -0,0 +1,22 @@ +<input size=10 name="<%$NamePrefix%>-Name" value="<% $KeywordSelect->Name %>">: +<& /Admin/Elements/SelectSingleOrMultiple, + Name => $NamePrefix.'-Single', + Default => $KeywordSelect->Single &> + +children of +<& /Elements/SelectKeyword, Root => '0', + Name => $NamePrefix.'-Keyword', + Default => $KeywordSelect->KeywordObj->Id &> + up to <input name="<%$NamePrefix%>-Depth" size=2 value="<%$KeywordSelect->Depth%>"> levels deep. +<%INIT> +unless ($NamePrefix) { + $NamePrefix = $KeywordSelect->Id; +} +$NamePrefix = "KeywordSelect-$NamePrefix"; + +</%INIT> + +<%ARGS> +$KeywordSelect => undef +$NamePrefix => undef +</%ARGS>
\ No newline at end of file diff --git a/rt/webrt/Admin/Elements/SelectModifyGroup b/rt/webrt/Admin/Elements/SelectModifyGroup new file mode 100644 index 000000000..45d437f41 --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectModifyGroup @@ -0,0 +1,10 @@ +%while ( $Group = $Groups->Next) { +<A HREF="Modify.html?id=<%$Group->id%>"><%$Group->id%>: <%$Group->Name%></a><BR> +%} +<%INIT> +my ($Group); +my $Groups = new RT::Groups($session{'CurrentUser'}); +$Groups->UnLimit; +</%INIT> +<%ARGS> +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectModifyKeyword b/rt/webrt/Admin/Elements/SelectModifyKeyword new file mode 100644 index 000000000..6af223229 --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectModifyKeyword @@ -0,0 +1,13 @@ +%while ( $keyword = $keywords->Next ) { +<A HREF="/Admin/Keywords/Modify.html?id=<%$keyword->id%>"><%$keyword->id%>: <%$keyword->Name%></a><BR> +%} + +<%INIT> + +use RT::Keywords; + +my $keyword; +my $keywords = new RT::Keywords $session{CurrentUser}; +$keywords->UnLimit; +</%INIT> + diff --git a/rt/webrt/Admin/Elements/SelectModifyKeywordSelect b/rt/webrt/Admin/Elements/SelectModifyKeywordSelect new file mode 100644 index 000000000..c91eb6cfe --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectModifyKeywordSelect @@ -0,0 +1,13 @@ +%while ( $keywordselect = $keywordselects->Next ) { +<A HREF="/Admin/KeywordSelects/Modify.html?id=<%$keywordselect->id%>"><%$keywordselect->id%>: ( <%$keywordselect->Parent%>: <%$keywordselect->KeywordObj->Name%> )</a><BR> +%} + +<%INIT> + +use RT::KeywordSelects; + +my $keywordselect; +my $keywordselects = new RT::KeywordSelects $session{CurrentUser}; +$keywordselects->UnLimit; +</%INIT> + diff --git a/rt/webrt/Admin/Elements/SelectModifyQueue b/rt/webrt/Admin/Elements/SelectModifyQueue new file mode 100755 index 000000000..1c6cd7d5e --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectModifyQueue @@ -0,0 +1,10 @@ +%while ( $queue = $queues->Next) { +<A HREF="Modify.html?id=<%$queue->id%>"><%$queue->id%>: <%$queue->Name%></a><BR> +%} +<%INIT> +my ($queue); +my $queues = new RT::Queues($session{'CurrentUser'}); +$queues->UnLimit; +</%INIT> +<%ARGS> +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectModifyUser b/rt/webrt/Admin/Elements/SelectModifyUser new file mode 100755 index 000000000..da49212e4 --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectModifyUser @@ -0,0 +1,26 @@ +%while ( $user = $users->Next) { +<A HREF="Modify.html?id=<%$user->id%>"><%$user->id%>: <%$user->Name%></a><BR> +%} +<%INIT> +my ($user); +my $users = new RT::Users($session{'CurrentUser'}); +$users->Limit(FIELD => 'id', + VALUE => $RT::SystemUser->id, + OPERATOR => '!=' ); + +if (defined $IdLike) { +$users->Limit(FIELD => 'Name', + VALUE => $IdLike, + OPERATOR => 'LIKE' ); +} +if (defined $EmailLike) { +$users->Limit(FIELD => 'EmailAddress', + VALUE => $EmailLike, + OPERATOR => 'LIKE'); + +} +</%INIT> +<%ARGS> +$IdLike => undef +$EmailLike => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectQueueRights b/rt/webrt/Admin/Elements/SelectQueueRights new file mode 100755 index 000000000..6861d40c6 --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectQueueRights @@ -0,0 +1,29 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Admin/Elements/Attic/SelectQueueRights,v 1.1 2002-08-12 06:17:08 ivan Exp $ + +<SELECT NAME ="<%$Name%>"> +<OPTION VALUE="">-</OPTION> +%foreach $right (@rights) { +<OPTION VALUE="<%$right%>" <%($Default eq $right) && 'SELECTED'%>><%$right%></OPTION> +% } +</SELECT> +<%ONCE> + +use RT::ACE; +my $ACE = new RT::ACE($session{'CurrentUser'}); +my %QueueRights = $ACE->QueueRights; +my %TicketRights = $ACE->TicketRights; + +my ($key, $right, @rights); + +foreach $key (sort keys %QueueRights) { +push (@rights, $QueueRights{$key} . " ($key)"); +} +foreach $key (sort keys %TicketRights) { +push (@rights, $TicketRights{$key} . " ($key)"); +} +</%ONCE> +<%ARGS> +$Name => undef +$Default => undef + +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectRights b/rt/webrt/Admin/Elements/SelectRights new file mode 100644 index 000000000..0ac774985 --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectRights @@ -0,0 +1,58 @@ +<INPUT TYPE=HIDDEN NAME="CheckACL" VALUE="<%$ACLDesc%>"> + <TABLE BORDER=0> +<TR> +<TD valign=top> +<h3>New rights</h3> +<SELECT SIZE=5 MULTIPLE NAME="GrantACE-<%$ACLDesc%>"> +% foreach $right (sort keys %Rights) { + <OPTION VALUE="<%$right%>" + ><%$right%></OPTION> +% } +<OPTION VALUE="" SELECTED>(no value)</OPTION> +</SELECT> +</TD> +<TD valign=top> +<h3>Current rights</h3> +<i>(Check box to revoke right)</i> <BR> +% while (my $right = $ACLObj->Next()) { +% if ($right->RightName) { +<input type=checkbox value="<%$right->Id%>" name="RevokeACE"> <%$right->RightName%><br> +% } +% } +</TD> +</TR> +</TABLE> +<%INIT> + my ($right, $ACLDesc, $AppliesTo, %Rights); + + + my $ACLObj = new RT::ACL($session{'CurrentUser'}); + my $ACE = new RT::ACE($session{'CurrentUser'}); + + if ($Scope eq 'Queue') { + $AppliesTo = $QueueObj->Id; + $ACLObj->LimitToQueue($AppliesTo); + %Rights = $ACE->QueueRights(); + } + elsif ($Scope eq 'System') { + $AppliesTo = 0; + $ACLObj->LimitToSystem(); + %Rights = ( $ACE->SystemRights , $ACE->QueueRights()); + } + + if ($PrincipalType eq 'Group') { + $ACLObj->LimitPrincipalToGroup($PrincipalObj->Id); + } + elsif ($PrincipalType eq 'User') { + $ACLObj->LimitPrincipalToUser($PrincipalObj->Id); + } + + $ACLDesc = "$PrincipalType-".$PrincipalObj->Id."-$Scope-$AppliesTo"; +</%INIT> + +<%ARGS> +$PrincipalType => undef +$PrincipalObj => undef +$Scope => undef +$QueueObj => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectScrip b/rt/webrt/Admin/Elements/SelectScrip new file mode 100755 index 000000000..4ae15d8c3 --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectScrip @@ -0,0 +1,25 @@ +<SELECT NAME=<%$Name%>> +<OPTION VALUE="" +<% $Default eq undef && 'SELECTED' %> +>-</OPTION> +%while (my $Scrip = $Scrips->Next) { +<OPTION VALUE=<%$Scrip->Id%> +<% $Scrip->Id == $Default && 'SELECTED' %> +><%$Scrip->Name%> +</OPTION> +%} +</SELECT> + +<%INIT> +my $Scrips = RT::Scrips->new($session{'CurrentUser'}); +$Scrips->UnLimit; + + + +</%INIT> +<%ARGS> + +$Default => undef +$Name => 'Scrip' + +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectScripAction b/rt/webrt/Admin/Elements/SelectScripAction new file mode 100644 index 000000000..08a173493 --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectScripAction @@ -0,0 +1,25 @@ +<SELECT NAME=<%$Name%>> +<OPTION VALUE="" +<% $Default eq undef && 'SELECTED' %> +>-</OPTION> +%while (my $ScripAction = $ScripActions->Next) { +<OPTION VALUE=<%$ScripAction->Id%> +<% $ScripAction->Id == $Default && 'SELECTED' %> +><%$ScripAction->Name%> +</OPTION> +%} +</SELECT> + +<%INIT> +my $ScripActions = RT::ScripActions->new($session{'CurrentUser'}); +$ScripActions->UnLimit; + + + +</%INIT> +<%ARGS> + +$Default => undef +$Name => 'ScripAction' + +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectScripCondition b/rt/webrt/Admin/Elements/SelectScripCondition new file mode 100644 index 000000000..434f0c4ae --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectScripCondition @@ -0,0 +1,25 @@ +<SELECT NAME=<%$Name%>> +<OPTION VALUE="" +<% $Default eq undef && 'SELECTED' %> +>-</OPTION> +%while (my $ScripCondition = $ScripConditions->Next) { +<OPTION VALUE=<%$ScripCondition->Id%> +<% $ScripCondition->Id == $Default && 'SELECTED' %> +><%$ScripCondition->Name%> +</OPTION> +%} +</SELECT> + +<%INIT> +my $ScripConditions = RT::ScripConditions->new($session{'CurrentUser'}); +$ScripConditions->UnLimit; + + + +</%INIT> +<%ARGS> + +$Default => undef +$Name => 'ScripCondition' + +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectSingleOrMultiple b/rt/webrt/Admin/Elements/SelectSingleOrMultiple new file mode 100644 index 000000000..307b0211c --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectSingleOrMultiple @@ -0,0 +1,20 @@ + <select name="<%$Name%>"> + <option value="1" <%$SingleDefault%>>Single</option> + <option value="0" <%$MultipleDefault%>>Multiple</option> + </select> + + +<%INIT> +my ($SingleDefault, $MultipleDefault); +if ($Default == 1) { + $SingleDefault = "SELECTED"; +} +elsif ($Default == 0 ) { + $MultipleDefault = "SELECTED"; +} + +</%INIT> +<%ARGS> +$Name => 'Single' +$Default => 1 +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectTemplate b/rt/webrt/Admin/Elements/SelectTemplate new file mode 100755 index 000000000..76550dc4e --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectTemplate @@ -0,0 +1,37 @@ +<SELECT NAME=<%$Name%>> +<OPTION VALUE="" +<% $Default eq 'none' && 'SELECTED' %> +>-</OPTION> +%while (my $Template = $PrimaryTemplates->Next) { +<OPTION VALUE=<%$Template->Id%> +<% ($Template->Id == $Default) && 'SELECTED' %> +><%$Template->Name%> +</OPTION> +%} +%while (my $Template = $OtherTemplates->Next) { +<OPTION VALUE=<%$Template->Id%> +<% ($Template->Id == $Default) && 'SELECTED'%> +>Global template: <%$Template->Name%> +</OPTION> +%} +</SELECT> + +<%INIT> + + +my $PrimaryTemplates = RT::Templates->new($session{'CurrentUser'}); +if ($DefaultQueue != 0) { +$PrimaryTemplates->LimitToQueue($DefaultQueue); +} + +my $OtherTemplates = RT::Templates->new($session{'CurrentUser'}); +$OtherTemplates->LimitToGlobal($DefaultQueue); + +</%INIT> +<%ARGS> + +$Default => 'none' +$DefaultQueue => undef +$Name => 'Template' + +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SelectUsers b/rt/webrt/Admin/Elements/SelectUsers new file mode 100644 index 000000000..af51c60f9 --- /dev/null +++ b/rt/webrt/Admin/Elements/SelectUsers @@ -0,0 +1,17 @@ +<SELECT MULTIPLE NAME="<%$Name%>" SIZE=10> +%while (my $user = $users->Next) { +<OPTION VALUE="<%$user->id%>"><%$user->Name%> +%} +</SELECT> + +<%INIT> +my $users = new RT::Users($session{'CurrentUser'}); + +$users->Limit(FIELD => 'id', VALUE => $RT::SystemUser->id, OPERATOR => '!=' ); +$users->Limit(FIELD => 'id', VALUE => $RT::Nobody->id, OPERATOR => '!=' ); +$users->LimitToPrivileged(); + +</%INIT> +<%ARGS> +$Name => 'Users' +</%ARGS> diff --git a/rt/webrt/Admin/Elements/SystemTabs b/rt/webrt/Admin/Elements/SystemTabs new file mode 100755 index 000000000..f8b23128b --- /dev/null +++ b/rt/webrt/Admin/Elements/SystemTabs @@ -0,0 +1,31 @@ +<& /Admin/Elements/Tabs, subtabs => $subtabs, current_tab => 'Admin/Global/', current_subtab => $current_subtab &> +<hr> +<%INIT> + my $subtabs = { + + A => { title => 'Scrips', + path => 'Admin/Global/Scrips.html', + }, + Ba => { title => 'Keyword Selections', + path => 'Admin/Global/Keywords.html', + }, + + B => { title => 'Templates', + path => 'Admin/Global/Templates.html', + }, + C => { title => 'Group Rights', + path => 'Admin/Global/GroupRights.html', + }, + D => { title => 'User Rights', + path => 'Admin/Global/UserRights.html', + } + + +}; +</%INIT> + + +<%ARGS> +$id => undef +$current_subtab => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/Tabs b/rt/webrt/Admin/Elements/Tabs new file mode 100755 index 000000000..ee6d82b58 --- /dev/null +++ b/rt/webrt/Admin/Elements/Tabs @@ -0,0 +1,31 @@ +<& /Elements/Tabs, tabs => $tabs, subtabs => $subtabs, current_toptab => 'Admin/', current_tab => $current_tab, current_subtab => $current_subtab&> + +<hr> + +<%INIT> + my $tabs = { Users => { title => 'Users', + path => 'Admin/Users/', + }, + Groups => { title => 'Groups', + path => 'Admin/Groups/', + }, + Queues => { title => 'Queues', + path => 'Admin/Queues/', + }, + System => { 'title' => 'Global', + path => 'Admin/Global/', + }, + Keywords => { title => 'Keywords', + path => 'Admin/Keywords/', + }, + + + }; +</%INIT> + + +<%ARGS> +$subtabs => undef +$current_tab => undef +$current_subtab => undef +</%ARGS> diff --git a/rt/webrt/Admin/Elements/UserTabs b/rt/webrt/Admin/Elements/UserTabs new file mode 100755 index 000000000..bbf17314d --- /dev/null +++ b/rt/webrt/Admin/Elements/UserTabs @@ -0,0 +1,21 @@ +<& /Admin/Elements/Tabs, subtabs => $subtabs, + current_tab => 'Admin/Users/', + current_subtab => $current_subtab &> +<hr> +<%INIT> +my $subtabs = { + Queues => { title => 'Basics', + path => "Admin/Users/Modify.html?id=".$id + }, +# Scrips => { title => 'Rights', +# path => "Admin/Users/Rights.html?id=".$id +# } + + }; +</%INIT> + + +<%ARGS> +$id => undef +$current_subtab => undef +</%ARGS> diff --git a/rt/webrt/Admin/Global/GroupRights.html b/rt/webrt/Admin/Global/GroupRights.html new file mode 100755 index 000000000..26b7e1fe2 --- /dev/null +++ b/rt/webrt/Admin/Global/GroupRights.html @@ -0,0 +1,78 @@ +<& /Admin/Elements/Header, Title => 'Modify System ACLS' &> +<& /Admin/Elements/SystemTabs &> + +<& /Elements/ListActions, actions => \@results &> + <FORM METHOD=POST action="GroupRights.html"> + + + +<h2>Modify global rights for groups</h2> + +<TABLE> +<TR><TD>Pseudogroups</TD></TR> +% while (my $GroupObj = $PseudoGroups->Next()) { + + <TR ALIGN=RIGHT> + <TD VALIGN=TOP> + <% $GroupObj->Name %> + </TD> + <TD> + <& /Admin/Elements/SelectRights, PrincipalObj => $GroupObj, + PrincipalType => 'Group', + Scope => 'System' &> + </TD> + </TR> + +% } + +<TR><TD>Groups</TD></TR> + +% while (my $GroupObj = $Groups->Next()) { + + <TR ALIGN=RIGHT> + <TD VALIGN=TOP> + <% $GroupObj->Name %> + </TD> + <TD> + <& /Admin/Elements/SelectRights, PrincipalObj => $GroupObj, + PrincipalType => 'Group', + Scope => 'System' &> + </TD> + </TR> + +% } + + </TABLE> + <& /Elements/Submit, Caption => "Be sure to save your changes", Reset => 1 &> + </FORM> + + <%INIT> + + #Update the acls. + my @results = ProcessACLChanges(\@CheckACL, \%ARGS); + + + # {{{ do basic initialization. + + + + # Find out which groups we want to display ACL selects for. + my $Groups = new RT::Groups($session{'CurrentUser'}); + #TODO: limit this to non-pseudogroups + $Groups->LimitToReal(); + + + my $PseudoGroups = new RT::Groups($session{'CurrentUser'}); + #TODO: limit this to non-pseudogroups + $PseudoGroups->LimitToPseudo; + + # }}} + + + + + </%INIT> + +<%ARGS> +@CheckACL => undef +</%ARGS> diff --git a/rt/webrt/Admin/Global/Keywords.html b/rt/webrt/Admin/Global/Keywords.html new file mode 100644 index 000000000..bf7bbd266 --- /dev/null +++ b/rt/webrt/Admin/Global/Keywords.html @@ -0,0 +1,97 @@ +<& /Admin/Elements/Header, Title => 'Edit keywords' &> +<& /Admin/Elements/SystemTabs &> +<& /Elements/ListActions, actions => \@actions &> + +<& /Elements/TitleBoxStart, title => $description &> + + <FORM METHOD=POST ACTION="Keywords.html"> + +% if ($KeywordSelects->Count > 0 ) { +<TABLE> +<TR><TD>Delete</TD></TR> +% while (my $keywordselect = $KeywordSelects->Next ) { +<TR> + <TD><INPUT TYPE="CHECKBOX" NAME="KeywordSelect-<%$keywordselect->Id%>-Delete"></TD> + <TD><& /Admin/Elements/SelectKeywordSelect, KeywordSelect => $keywordselect &></TD> +</TR> +% } +</TABLE> +% } + +Add a global keyword selection: +%my $ks = new RT::KeywordSelect($session{'CurrentUser'}); +<ul> +<li><& /Admin/Elements/SelectKeywordSelect, KeywordSelect => $ks, NamePrefix => 'new' &></li> +</ul> + +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit &> +</FORM> + + + +<%init> +my (@actions); + +my $description = "Modify global Keyword selections"; + +my $KeywordSelects = new RT::KeywordSelects ($session{'CurrentUser'}); + +unless ($KeywordSelects->LimitToGlobals()) { + Abort("Couldn't load KeywordSelects."); +} + + +# {{{ if we're trying to create a new keyword select + +if ($ARGS{'KeywordSelect-new-Name'}) { + my $NewKeywordSelect = new RT::KeywordSelect($session{'CurrentUser'}); + + my ($retval, $msg) = $NewKeywordSelect->Create ( Keyword => $ARGS{'KeywordSelect-new-Keyword'}, + ObjectField => 'Queue', + ObjectType => 'Ticket', + ObjectValue => 0, + Name => $ARGS{'KeywordSelect-new-Name'}, + Single => $ARGS{'KeywordSelect-new-Single'}, + Depth => $ARGS{'KeywordSelect-new-Depth'} + ); + push (@actions, $msg); +} +# }}} + +# {{{ if we're trying to delete the keywordselect +foreach my $key (keys %ARGS) { + if ($key =~ /^KeywordSelect-(\d+)-Delete$/) { + my $id = $1; + my $keywordselect = new RT::KeywordSelect($session{'CurrentUser'}); + $keywordselect->Load($id) || push @actions, "Couldn't load keywordSelect"; + my ($val, $msg) = $keywordselect->SetDisabled(1); + if ($val) { + push @actions, 'KeywordSelect disabled.'; + } + else { + push @actions, $msg; + } + } +} +# }}} +# {{{ if we're modifying keyword selects +my @fields = qw(Name Keyword Single Depth); + +while (my $ks = $KeywordSelects->Next) { + foreach my $field (@fields) { + if (defined ($ARGS{"KeywordSelect-".$ks->Id."-".$field}) && + ($ARGS{"KeywordSelect-".$ks->Id."-".$field} ne $ks->$field())) { + + my $method = "Set$field"; + my ($val, $msg) = $ks->$method($ARGS{"KeywordSelect-".$ks->Id."-".$field}); + push @actions, "Keyword Select ". $ks->Name."/$field:".$msg; + } + } +} +# }}} + +</%init> + +<%ARGS> +</%ARGS> diff --git a/rt/webrt/Admin/Global/Scrips.html b/rt/webrt/Admin/Global/Scrips.html new file mode 100755 index 000000000..e55f8b3de --- /dev/null +++ b/rt/webrt/Admin/Global/Scrips.html @@ -0,0 +1,95 @@ +<& /Admin/Elements/Header, Title => 'Edit scrips' &> +<& /Admin/Elements/SystemTabs &> + +<& /Elements/ListActions, actions => \@actions &> + +<& /Elements/TitleBoxStart, title => "Modify global scrips" &> + + <FORM METHOD=POST ACTION="Scrips.html"> + +% if ($Scrips->Count > 0 ) { +<TABLE> +<TR> +<TD>Delete +</TD> +<TD> +</TR> + +% while (my $scrip = $Scrips->Next ) { +<TR> +<TD> +<INPUT TYPE="CHECKBOX" NAME="DeleteScrip-<%$scrip->Id%>"> +</TD> +<TD> +<% $scrip->ConditionObj->Name %> +<% $scrip->ActionObj->Name %> +with template <% $scrip->TemplateObj->Name %> +</TD> +</TR> +% } + +</TABLE> + +% } +Add a scrip which will apply to all queues: +<ul> +<li>Condition: <& /Admin/Elements/SelectScripCondition, Name => 'NewScripCondition' &> + Action: <& /Admin/Elements/SelectScripAction, Name => 'NewScripAction' &> + Template: <& /Admin/Elements/SelectTemplate, Name => 'NewScripTemplate' &> + +</ul> + +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit &> +</FORM> +<%init> +my (@actions, $description); + +my $Scrips = new RT::Scrips ($session{'CurrentUser'}); +$Scrips->LimitToGlobal(); + + + + +if ($NewScripAction and $NewScripCondition) { + my $NewScrip = new RT::Scrip($session{'CurrentUser'}); + + my ($retval, $msg) = $NewScrip->Create ( ScripAction => $NewScripAction, + ScripCondition => $NewScripCondition, + Stage => 'TransactionCreate', + Queue => 0, + Template => $NewScripTemplate); + if (defined $retval) { + push @actions, $msg; + } + else { + push @actions, $msg; + } +} + +# {{{ deal with modifying and deleting existing scrips +my ($key ); +foreach $key (keys %ARGS) { + # {{{ if we're trying to delete the scrip + if ($key =~ /^DeleteScrip-(\d+)/) { + my $id = $1; + my $scrip = new RT::Scrip($session{'CurrentUser'}); + $scrip->Load($id); + my ($retval, $msg) = $scrip->Delete; + if ($retval) { + push @actions, "Scrip deleted"; + } + else { + push @actions, $msg; + } + } + # }}} +} +# }}} +</%init> + +<%ARGS> +$NewScripCondition => undef +$NewScripAction => undef +$NewScripTemplate => undef +</%ARGS> diff --git a/rt/webrt/Admin/Global/Template.html b/rt/webrt/Admin/Global/Template.html new file mode 100755 index 000000000..856d2ee8f --- /dev/null +++ b/rt/webrt/Admin/Global/Template.html @@ -0,0 +1,66 @@ +<& /Admin/Elements/Header, title => "Modify template ".$TemplateObj->id&> +<& /Admin/Elements/SystemTabs &> +<& /Elements/ListActions, actions => \@results &> + +<& /Elements/TitleBoxStart, title => $title &> + +<FORM METHOD=POST ACTION="Template.html"> +%if ($create ) { +<INPUT TYPE=HIDDEN NAME=template VALUE="new"> +% } else { +<INPUT TYPE=HIDDEN NAME=template VALUE="<%$TemplateObj->Id%>"> +% } + +%# hang onto the queue id +<INPUT TYPE=HIDDEN name="Queue" value="<%$Queue%>"> + + +Name: <input name="Name" VALUE="<%$TemplateObj->Name%>" SIZE=20><BR> +Description: <input name="Description" VALUE="<%$TemplateObj->Description%>" SIZE=80><BR> + +<TEXTAREA NAME=Content ROWS=25 COLS=80 WRAP=SOFT> +<%$TemplateObj->Content%></TEXTAREA> + +<& /Elements/TitleBoxEnd&> +<&/Elements/Submit&> +</FORM> + + + +<%INIT> + +my $TemplateObj = new RT::Template($session{'CurrentUser'}); +my ($title, @results); + +if ($create) { + $title = "Create a template"; +} + +else { + if ($template eq 'new') { + my ($val, $msg) = $TemplateObj->Create(Queue => $Queue, Name => $Name); + Abort("Could not create template: $msg") unless ($val); + push @results, $msg; + $title = 'Created template ' . $TemplateObj->Name(); + } + else { + $TemplateObj->Load($template) || Abort('No Template'); + $title = 'Editing template ' . $TemplateObj->Name(); + } + + +} +if ($TemplateObj->Id()) { + my @attribs = qw( Description Content Queue Name); + my @aresults = UpdateRecordObject( AttributesRef => \@attribs, + Object => $TemplateObj, + ARGSRef => \%ARGS); + push @results, @aresults; +} +</%INIT> +<%ARGS> +$Queue => undef +$template => undef +$create => undef +$Name => undef +</%ARGS> diff --git a/rt/webrt/Admin/Global/Templates.html b/rt/webrt/Admin/Global/Templates.html new file mode 100755 index 000000000..cf388e521 --- /dev/null +++ b/rt/webrt/Admin/Global/Templates.html @@ -0,0 +1,24 @@ +<& /Admin/Elements/Header, Title => 'Edit system templates' &> +<& /Admin/Elements/SystemTabs &> + +<& /Elements/TitleBoxStart, title => 'Edit system templates' &> +<UL> +<LI><A href="Template.html?create=1&Queue=0">Create a new template</A><BR><BR> + + +%while (my $TemplateObj = $Templates->Next) { + +<LI><A HREF="Template.html?template=<%$TemplateObj->id()%>"><%$TemplateObj->id()%>/<%$TemplateObj->Name%>: <%$TemplateObj->Description%></a><BR> + +%} + +<& /Elements/TitleBoxEnd &> +<%INIT> + +my $Templates = RT::Templates->new($session{'CurrentUser'}); +$Templates->LimitToGlobal(); + +</%INIT> +<%ARGS> +$id => undef +</%ARGS> diff --git a/rt/webrt/Admin/Global/UserRights.html b/rt/webrt/Admin/Global/UserRights.html new file mode 100755 index 000000000..351f4b8c6 --- /dev/null +++ b/rt/webrt/Admin/Global/UserRights.html @@ -0,0 +1,42 @@ +<& /Admin/Elements/Header, Title => 'Modify System ACLS' &> +<& /Admin/Elements/SystemTabs &> + +<& /Elements/ListActions, actions => \@results &> + <FORM METHOD=POST action="UserRights.html"> + + +<h2>Modify global rights for users</h2> +<TABLE> +% while (my $UserObj = $Users->Next()) { + <TR ALIGN=RIGHT> + <TD VALIGN=TOP> + <A HREF="<%$RT::WebPath%>/Admin/Users/Modify.html?id=<%$UserObj->id%>"><% $UserObj->Name %></A> + </TD> + <TD> + <& /Admin/Elements/SelectRights, PrincipalObj => $UserObj, + PrincipalType => 'User', + Scope => 'System' &> + + </TD> + </TR> + +% } + </TABLE> + + <& /Elements/Submit, Caption => "Be sure to save your changes", Reset => 1 &> + </FORM> + +<%INIT> + + my @results = ProcessACLChanges(\@CheckACL, \%ARGS); + + # Find out which users we want to display ACL selects for + my $Users = new RT::Users($session{'CurrentUser'}); + + $Users->LimitToPrivileged(); + +</%INIT> + +<%ARGS> +@CheckACL => undef +</%ARGS> diff --git a/rt/webrt/Admin/Global/index.html b/rt/webrt/Admin/Global/index.html new file mode 100755 index 000000000..5907ed1e8 --- /dev/null +++ b/rt/webrt/Admin/Global/index.html @@ -0,0 +1,2 @@ +<& /Admin/Elements/Header, Title => 'Admin/Global configuration' &> +<& /Admin/Elements/SystemTabs &> diff --git a/rt/webrt/Admin/Groups/Members.html b/rt/webrt/Admin/Groups/Members.html new file mode 100644 index 000000000..4b0e0d04f --- /dev/null +++ b/rt/webrt/Admin/Groups/Members.html @@ -0,0 +1,76 @@ +<& /Admin/Elements/Header, Title => "RT/Admin/Edit the group ". $Group->Name &> +<& /Admin/Elements/GroupTabs, GroupObj => $Group &> +<& /Elements/ListActions, actions => \@results &> + + +<& /Elements/TitleBoxStart, title => 'Editing membership for group '.$Group->Name &> + +<FORM ACTION="<%$RT::WebPath%>/Admin/Groups/Members.html" METHOD=POST> +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Group->Id%>"> +<TABLE WIDTH="100%"> +<TR> +<TD> +Add members +</TD> +<TD> +Current members +</TD> +</TR> + +<TR> +<TD VALIGN=TOP> +<& /Admin/Elements/SelectUsers, Name => "AddMembers" &> +</TD> +<TD VALIGN=TOP> +% if ($Group->MembersObj->Count == 0 ) { +<i>(No members)</i> +% } else { +(Check box to delete group member) +<UL> +% while (my $member = $Group->MembersObj->Next()) { +<LI><INPUT TYPE=CHECKBOX Name="DeleteMember-<%$member->UserObj->id%>"> +<%$member->UserObj->Name%> (<%$member->UserObj->RealName%>) +% } +% } +</UL> +</TD> +</TR> +</TABLE> +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit &> +</form> + + +<%INIT> + +my $Group = new RT::Group($session{'CurrentUser'}); +$Group->Load($id) || Abort('Could not load group'); + +my (@results); + +my $key; +foreach $key (keys %ARGS) { + +if ($key =~ /^DeleteMember-(\d+)$/) { + my $id = $1; + my ($val,$msg) = $Group->DeleteMember($id); + push (@results, $msg); +} +} + +# Make sure AddMembers is always an array +my @AddMembers = (ref $AddMembers eq 'ARRAY') ? @{$AddMembers} : ($AddMembers); + +foreach my $member (@AddMembers) { + next unless ($member); + my ($val, $msg) = $Group->AddMember($member); + push (@results, $msg); +} + + +</%INIT> + +<%ARGS> +$AddMembers => undef +$id => undef +</%ARGS> diff --git a/rt/webrt/Admin/Groups/Modify.html b/rt/webrt/Admin/Groups/Modify.html new file mode 100644 index 000000000..7104a6937 --- /dev/null +++ b/rt/webrt/Admin/Groups/Modify.html @@ -0,0 +1,83 @@ +<& /Admin/Elements/Header, Title => $title &> + +<& /Admin/Elements/GroupTabs, GroupObj => $Group &> +<& /Elements/ListActions, actions => \@results &> + + +<& /Elements/TitleBoxStart, title => $title &> + +<FORM ACTION="<%$RT::WebPath%>/Admin/Groups/Modify.html" METHOD=POST> + +%unless ($Group->Id) { +<INPUT TYPE=HIDDEN NAME=id VALUE="new"> +% } else { +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Group->Id%>"> +% } +<TABLE> +<TR><TD ALIGN=RIGHT> +Name: +</TD> +<TD><INPUT name="Name" value="<%$Group->Name%>"></TD> +</TR><TR> +<TD ALIGN=RIGHT> +Description:</TD><TD COLSPAN=3><INPUT name="Description" value="<%$Group->Description%>" size=60></TD></TR> +</TABLE> +<& /Elements/TitleBoxEnd &> + +<& /Elements/Submit &> +</form> +<%INIT> + +my ($title); +my (@results); + +my $Group = new RT::Group($session{'CurrentUser'}); + +if ($Create) { + $title = "Create a new group"; +} + +else { + + if ($id eq 'new' ) { + + $Group->Create(Name => "$Name") || Abort ("Group could not be created."); + $id = $Group->Id; + } + else { + $Group->Load($id) || Abort('Could not load group'); + } + + + if ($id) { + $title = "Modify the group ". $Group->Name; + + } + + # If the create failed + else { + $title = "Create a new group"; + $Create = 1; + } + +} + +if ($id) { + + my @fields = qw(Description Name ); + my @fieldresults = UpdateRecordObject ( AttributesRef => \@fields, + Object => $Group, + ARGSRef => \%ARGS ); + push (@results,@fieldresults); +} + + +</%INIT> + + +<%ARGS> +$Create => undef +$Name => undef +$Description => undef +$id => undef +</%ARGS> diff --git a/rt/webrt/Admin/Groups/Rights.html b/rt/webrt/Admin/Groups/Rights.html new file mode 100644 index 000000000..5c842a301 --- /dev/null +++ b/rt/webrt/Admin/Groups/Rights.html @@ -0,0 +1 @@ +Not yet implemented.... diff --git a/rt/webrt/Admin/Groups/index.html b/rt/webrt/Admin/Groups/index.html new file mode 100644 index 000000000..d419e7f73 --- /dev/null +++ b/rt/webrt/Admin/Groups/index.html @@ -0,0 +1,33 @@ + +<& /Admin/Elements/Header, Title => 'Admin/Groups' &> +<& /Admin/Elements/Tabs, current_tab => 'Admin/Groups/' &> + +<& /Elements/TitleBoxStart, title => 'Select a group' &> + +Pseudogroups:<BR> +<UL> +%while ( $Group = $PseudoGroups->Next) { +<LI><A HREF="Modify.html?id=<%$Group->id%>"><%$Group->Name%></a><BR> +%} + +</UL> + +Groups:<BR> +<UL> +<LI><A HREF="Modify.html?Create=1">Create a new group</A><BR><BR></LI> +%while ( $Group = $Groups->Next) { +<LI><A HREF="Modify.html?id=<%$Group->id%>"><%$Group->Name%></a><BR> +%} +</UL> + +<& /Elements/TitleBoxEnd &> +<%INIT> +my ($Group); +my $PseudoGroups = new RT::Groups($session{'CurrentUser'}); +$PseudoGroups->LimitToPseudo; +my $Groups = new RT::Groups($session{'CurrentUser'}); +$Groups->LimitToReal; + +</%INIT> +<%ARGS> +</%ARGS> diff --git a/rt/webrt/Admin/KeywordSelects/Modify.html b/rt/webrt/Admin/KeywordSelects/Modify.html new file mode 100644 index 000000000..e753c6622 --- /dev/null +++ b/rt/webrt/Admin/KeywordSelects/Modify.html @@ -0,0 +1,17 @@ +<& /Admin/Elements/Header, Title => 'Admin KeywordSelects' &> +<& /Admin/Elements/Tabs &> + +<& /Admin/Elements/ModifyKeywordSelect, Create=>$Create, id=>$id, Parent=>$Parent, ObjectType=>$ObjectType, ObjectField=>$ObjectField, ObjectValue=>$ObjectValue, Single=>$Single, SingleMagic=>$SingleMagic, Generations=>$Generations &> + +<%ARGS> +$Create => undef +$id => undef +$Parent => undef +$ObjectType => undef +$ObjectField => undef +$ObjectValue => undef +$Single => undef +$SingleMagic => undef +$Generations => undef +</%ARGS> + diff --git a/rt/webrt/Admin/KeywordSelects/index.html b/rt/webrt/Admin/KeywordSelects/index.html new file mode 100644 index 000000000..ba3da9f0c --- /dev/null +++ b/rt/webrt/Admin/KeywordSelects/index.html @@ -0,0 +1,137 @@ +<& /Admin/Elements/Header, Title => 'Admin KeywordSelects' &> +<& /Admin/Elements/Tabs, current_tab => 'Admin/KeywordSelects/' &> + +A <B>KeywordSelect</B> is a link between a <B>Keyword</B> and a object +(currently just <B>Tickets</B>), titled by the <I>Name</I> field of the Keyword such that: +<ul> +<li>Object display will contain a field, titled with the <I>Name</I> field of +the <B>Keyword</B> and showing any descendent keywords. +<li>Object creation for this field will contain a field, titled with the +<I>Name</I> field of the <B>Keyword</B> and containing the descendents of +the <B>Keyword</B> as choices. +<li>Searches for this object type will contain a selection field titled with +the <I>Name</I> field of the <B>Keyword</B> and containing the descendents +of the <B>Keyword</B> as choices. +<TABLE WIDTH=100%> + + + + <TD VALIGN=TOP> + <h2>Create KeywordSelect</h2> + <FORM NAME="ModifyKeywordSelect" METHOD="POST" ACTION="<%$RT::WebPath%>/Admin/KeywordSelects/Modify.html"> + [<%$title |n %>] + <BR> + + <INPUT TYPE="hidden" NAME="id" VALUE="<% $id %>"> + Keyword + <SELECT NAME="Parent"> + +%while ( $parent = $parents->Next ) { + + <OPTION VALUE="<% $parent->id %>" <% defined($KeywordSelect->Parent) && $parent->id == $KeywordSelect->Parent ? ' SELECTED' : '' %>><% $parent->Name %></OPTION> + +% } + + </SELECT> + <BR> + Object + <SELECT NAME="ObjectType"> + <OPTION SELECTED>Ticket</OPTION> + </SELECT> + <BR> + +%foreach $queue ( keys %queues ) { + addOption("<% $queues{$queue} %>", "<% $queue %>", false, <% $queue == $KeywordSelect->ObjectValue ? 'true' : 'false' %> ) +%} + } +} +</SCRIPT> + + Limit to <SELECT NAME="ObjectField" onChange="ChangeObjectValue(this)"> + <OPTION VALUE="" <% $KeywordSelect->ObjectField ? '' : ' SELECTED' %>>(none)</OPTION> + <OPTION VALUE="Queue" <% $KeywordSelect->ObjectField eq 'Queue' ? ' SELECTED' : '' %>>Queue</OPTION> + </SELECT> + <SELECT NAME="ObjectValue"> + <OPTION VALUE="<% $KeywordSelect->ObjectValue %>"> + <% $KeywordSelect->ObjectField ? $queues{$KeywordSelect->ObjectValue} : "(n/a)" %></OPTION> + </SELECT><BR> + <INPUT TYPE="hidden" NAME="SingleMagic" VALUE="1"> + <INPUT TYPE="checkbox" NAME="Single" VALUE="1" <% $KeywordSelect->Single ? ' CHECKED' : '' %>>Allow single selection only<BR> + Limit to <INPUT TYPE="text" NAME="Generations" SIZE="2" VALUE="<% $KeywordSelect->Generations %>"> generations (0 = no limit)<BR> + <& /Elements/Submit, Label => $submit &> + +</FORM> + +<%INIT> + + +my $KeywordSelect = new RT::KeywordSelect($session{CurrentUser}); + +my($title, $submit); + +if ( $Create ) { + $title = "Create a new KeywordSelect"; + $submit = "Create"; + $id = "new"; +} else { + if ( $id eq 'new' ) { + $id = $KeywordSelect->Create ( + Parent => $Parent, + ObjectType => $ObjectType, + ObjectField => $ObjectField, + ObjectValue => $ObjectValue, + Single => $Single, + Generations => $Generations, + ) or Abort "can't create KeywordSelect"; + } else { + $KeywordSelect->Load($id) || Abort("Can't load keyword id $id"); + #false laziness + $KeywordSelect->SetParent($Parent) if defined($Parent); + $KeywordSelect->SetObjectType($ObjectType) if defined($ObjectType); + $KeywordSelect->SetObjectField($ObjectField) if defined($ObjectField); + $KeywordSelect->SetObjectValue($ObjectValue) if defined($ObjectValue); + $KeywordSelect->SetSingle($Single) if defined($SingleMagic); + $KeywordSelect->SetGenerations($Generations) if defined($Generations); + } + $title = "Modify the KeywordSelect <B>". $KeywordSelect->KeywordObj->Name. "</B>"; + $submit = "Modify"; + +} + + my $parents = new RT::Keywords($session{CurrentUser}); + $parents->UnLimit; + my $parent; + +my $queues = new RT::Queues($session{CurrentUser}); +$queues->UnLimit; + +my %queues; +my $queue; +$queues{$queue->id} = $queue->Name while $queue = $queues->Next; + +</%INIT> + +<%ARGS> +$id => undef +$Create => undef +$Parent => undef +$ObjectType => undef +$ObjectField => undef +$ObjectValue => undef +$Single => undef +$SingleMagic => undef +$Generations => undef +</%ARGS> + + + <& /Admin/Elements/ModifyKeywordSelect, 'Create'=>'1' &> + </TD> + + <TD VALIGN=TOP> + <H2>Modify KeywordSelect</H2> + + <& /Admin/Elements/SelectModifyKeywordSelect &> + </TD> +</TR> + +</TABLE> diff --git a/rt/webrt/Admin/Keywords/Modify.html b/rt/webrt/Admin/Keywords/Modify.html new file mode 100644 index 000000000..bb7e2db8c --- /dev/null +++ b/rt/webrt/Admin/Keywords/Modify.html @@ -0,0 +1,96 @@ +<& /Admin/Elements/Header, Title => $title &> +<& /Admin/Elements/Tabs &> + + +<& /Elements/TitleBoxStart, title => %$title &> +<FORM METHOD="POST" ACTION="<%$RT::WebPath%>/Admin/Keywords/Modify.html"> +<INPUT TYPE="hidden" NAME="id" VALUE="<% $id %>"> +Keyword <INPUT NAME="Name" VALUE="<% $Keyword->Name %>"><BR> + +Parent <SELECT NAME="Parent"> + <OPTION VALUE=""<% defined($Keyword->Parent) ? '' : ' SELECTED' %>>-</OPTION> +%while ( $parent = $parents->Next ) { + <OPTION VALUE="<% $parent->id %>"<% defined($Keyword->Parent) && $parent->id == $Keyword->Parent ? ' SELECTED' : '' %>><% $parent->Name %></OPTION> +%} +</SELECT> + + +New children of this keyword. one per line. +<TEXTAREA NAME="Kids" ROWS=4><% $kidstring %></TEXTAREA> +<BR> + +<& /Elements/Submit, Label => $submit &> +</FORM> +<& /Elements/TitleBoxEnd &> + +<%INIT> + +my $Keyword = new RT::Keyword($session{CurrentUser}); +my ($title, $submit, %kids, $kid); + +if ( $Create ) { + $title = "Create a new Keyword"; + $submit = "Create"; + $id = "new"; + %kids = (); + $Parent = ''; #silence +} +else { + if ( $id eq 'new' ) { + $id = $Keyword->Create( Name => $Name, Parent => $Parent ) + or Abort("can't create keyword Name=>$Name, Parent=>$Parent"); + } else { + $Keyword->Load($id) || Abort("Can't load keyword id $id"); + + #foreach my $field ( grep eval "defined(\$$_)", qw( Name Parent )) { + # eval "\$Keyword->Set(\$field=>\$$field); #sigh + #} + + $Keyword->SetName($Name) if defined($Name); + $Keyword->SetParent($Parent) if defined($Parent); + } + + $title = "Modify the Keyword <B>". $Keyword->Name. "</B>"; + $submit = "Modify"; +} + + +my $kids = $Keyword->Children(new RT::Keywords($session{CurrentUser})); + +$kids{$kid->Name} = $kid while $kid = $kids->Next; + +if ( defined($Kids) ) { + my %newkids; + + %newkids = map { $_=>1 } split(/\r/, $Kids); + + } + foreach ( grep { ! defined($newkids{$_}) } keys %kids ) { + $kids{$_}->Delete; + delete $kids{$_}; + } + foreach ( grep { ! defined($kids{$_}) } keys %newkids ) { + $kids{$_} = new RT::Keyword($session{CurrentUser}); + $kids{$_}->Create( Name => $_, Parent => $id ) + or Abort("can't create keyword Name=>$_, Parent=>$id"); + } + +} + + +my $parent; +my $parents = new RT::Keywords($session{CurrentUser}); +$parents->UnLimit; + +my $kidstring = join("\r", keys %kids); + +</%INIT> + +<%ARGS> +$id => undef +$Create => undef +$Name => undef +$Parent => undef +$Kids => undef + +</%ARGS> diff --git a/rt/webrt/Admin/Keywords/index.html b/rt/webrt/Admin/Keywords/index.html new file mode 100644 index 000000000..12814ec03 --- /dev/null +++ b/rt/webrt/Admin/Keywords/index.html @@ -0,0 +1,110 @@ +<& /Elements/Header, Title => 'Admin/Keywords' &> +<& /Admin/Elements/Tabs, current_tab => 'Admin/Keywords/' &> + +<& /Elements/ListActions, actions => \@Actions &> + +<& /Elements/TitleBoxStart, title => 'Keywords' &> +<a href="<%$RT::WebPath%>/Admin/Keywords/?RootId=<%$Root->Parent%>"><%$Root->Path%></a> +<UL> +<FORM METHOD=POST ACTION="index.html"> +<input type=hidden name=RootId value="<%$RootId%>"> + + +% while (my $key = $Keywords->Next) { + <LI> +% if ($Edit == $key->id) { + <input name="KeyName-<%$key->id%>" value="<%$key->Name%>"> + <input type=submit value="Update"> + <input type=submit name="Disable-<%$key->id%>" value="Disable"> +% } else { + <A HREF="?RootId=<%$key->id%>"><%$key->Name%></A> +% if ($key->Disabled) { + <input type=submit name="Enable-<%$key->id%>" value="Enable"> +% } else { + [<a href="?Edit=<%$key->id%>&RootId=<%$Root->Id%>">edit</a>] +% } +% } + + + </LI> +% } + <LI> + <input name="KeyName-New"> <input type=submit value="Add"> +</UL> +<BR> + <input type="checkbox" name="ShowDisabled"> Include disabled items in listing. + <input type=submit value="Go!"> + +</FORM> + +<& /Elements/TitleBoxEnd &> +<%INIT> +my (@Actions); + +if ($ARGS{'KeyName-New'}) { + my $NewKey = new RT::Keyword($session{'CurrentUser'}); + my ($val, $msg) = $NewKey->Create( Parent => $RootId, Name => $ARGS{'KeyName-New'}); + push (@Actions, $msg); +} + +my $arg; +foreach $arg (keys %ARGS) { + if ($arg =~ /^Disable-(\d*)$/) { + my $id = $1; + my $keyword = new RT::Keyword($session{'CurrentUser'}); + $keyword->Load($id); + my ($val, $msg) = $keyword->SetDisabled(1); + push (@Actions, $msg); + + + } + elsif ($arg =~ /^Enable-(\d*)$/) { + my $id = $1; + my $keyword = new RT::Keyword($session{'CurrentUser'}); + $keyword->Load($id); + my ($val, $msg) = $keyword->SetDisabled(0); + push (@Actions, $msg); + } + elsif ($arg =~ /^KeyName-(\d*)$/) { + my $id = $1; + my $keyword = new RT::Keyword ($session{'CurrentUser'}); + $keyword->Load($id); + if ($keyword->Name() ne $ARGS{"$arg"}) { + my ($val, $msg) = $keyword->SetName($ARGS{"$arg"}); + push (@Actions, $msg); + } + if (($ARGS{"KeyParent-$id"}) && + ($keyword->Parent ne $ARGS{"KeyParent-$id"})) { + my ($val, $msg) = $keyword->SetParent($ARGS{"KeyParent-$id"}); + push (@Actions, $msg); + } + } +} + + +my $Root = new RT::Keyword($session{'CurrentUser'}); +my $Keywords; +#If we have a root load it. +if ($RootId != 0) { + $Root->Load($RootId); + $Keywords = $Root->Children(); + +} +else { + $Keywords = new RT::Keywords($session{'CurrentUser'}); + $Keywords->LimitToParent(0); +} + +if ($ShowDisabled) { + $Keywords->{'find_disabled_rows'} = 1; +} + + + + +</%INIT> +<%ARGS> +$RootId => 0 +$Edit => undef +$ShowDisabled => 0 +</%ARGS> diff --git a/rt/webrt/Admin/Queues/Create.html b/rt/webrt/Admin/Queues/Create.html new file mode 100755 index 000000000..b39d6590c --- /dev/null +++ b/rt/webrt/Admin/Queues/Create.html @@ -0,0 +1,13 @@ +<& /Admin/Elements/Header, Title => 'Create a queue' &> + <h1>Create a queue</h1> + +<& /Admin/Elements/ModifyQueue, QueueObj => $QueueObj &> + +<%INIT> +my $QueueObj = new RT::Queue($session{'CurrentUser'}); +$QueueObj->Create(Name => "$Name"); +</%INIT> + +<%ARGS> +$Name => undef +</%ARGS> diff --git a/rt/webrt/Admin/Queues/GroupRights.html b/rt/webrt/Admin/Queues/GroupRights.html new file mode 100755 index 000000000..a2c669083 --- /dev/null +++ b/rt/webrt/Admin/Queues/GroupRights.html @@ -0,0 +1,103 @@ +<& /Admin/Elements/Header, Title => 'Modify group rights for queue '. $QueueObj->Name &> +<& /Admin/Elements/QueueTabs, id => $id &> +<& /Elements/ListActions, actions => \@results &> + + <FORM METHOD=POST ACTION="GroupRights.html"> + <INPUT TYPE=HIDDEN NAME=id VALUE="<% $QueueObj->id %>"> + + + +<& /Elements/TitleBoxStart, title => 'Modify group rights for queue '.$QueueObj->Name &> + +<TABLE> +<TR><TD>Pseudogroups</TD></TR> +% while (my $GroupObj = $PseudoGroups->Next()) { + + <TR ALIGN=RIGHT> + <TD VALIGN=TOP> + <% $GroupObj->Name %> + </TD> + <TD> + <& /Admin/Elements/SelectRights, PrincipalObj => $GroupObj, + PrincipalType => 'Group', + QueueObj => $QueueObj, + Scope => 'Queue' &> + + </TD> + </TR> + +% } + +<TR><TD>Groups</TD></TR> + +% while (my $GroupObj = $Groups->Next()) { + + <TR ALIGN=RIGHT> + <TD VALIGN=TOP> + <% $GroupObj->Name %> + </TD> + <TD> + <& /Admin/Elements/SelectRights, PrincipalObj => $GroupObj, + PrincipalType => 'Group', + QueueObj => $QueueObj, + Scope => 'Queue' &> + + </TD> + </TR> + +% } + + </TABLE> + + <& /Elements/TitleBoxEnd &> + <& /Elements/Submit, Caption => "Be sure to save your changes", Reset => 1 &> + </FORM> + +<%INIT> + +#Update the acls. +my @results = ProcessACLChanges(\@CheckACL, \%ARGS); + +# {{{ Deal with setting up the display of current rights. + +# {{{ do basic initialization. + +#Define vars used in html above +my ($GroupObj); + +my ($right); + + +if (!defined $id) { + Abort("No Queue defined"); +} + +my $QueueObj = new RT::Queue($session{'CurrentUser'}); +$QueueObj->Load($id) || + Abort("Couldn't load queue $id"); + + # Find out which groups we want to display ACL selects for. + my $Groups = new RT::Groups($session{'CurrentUser'}); + #TODO: limit this to non-pseudogroups + $Groups->LimitToReal(); + + + my $PseudoGroups = new RT::Groups($session{'CurrentUser'}); + #TODO: limit this to non-pseudogroups + $PseudoGroups->LimitToPseudo; + + +# }}} + + + # }}} + +</%INIT> + +<%ARGS> +$id => undef +$UserString => undef +$UserOp => undef +$UserField => undef +@CheckACL => undef +</%ARGS> diff --git a/rt/webrt/Admin/Queues/Keywords.html b/rt/webrt/Admin/Queues/Keywords.html new file mode 100644 index 000000000..7809805c5 --- /dev/null +++ b/rt/webrt/Admin/Queues/Keywords.html @@ -0,0 +1,114 @@ +<& /Admin/Elements/Header, Title => 'Edit keywords' &> +<& /Admin/Elements/QueueTabs, id => $QueueObj->Id &> + +<& /Elements/ListActions, actions => \@actions &> + +<& /Elements/TitleBoxStart, title => $description &> + +<h2>Global Keyword Selections</h2> +<& /Admin/Elements/ListGlobalKeywordSelects &> +<BR> + + <FORM METHOD=POST ACTION="Keywords.html"> + <INPUT TYPE=HIDDEN NAME=id VALUE="<%$id%>"> + +% if ($KeywordSelects->Count > 0 ) { + + +<h2>Queue Keyword Selections</h2> +<TABLE> +<TR><TD>Delete</TD></TR> +% while (my $keywordselect = $KeywordSelects->Next ) { +<TR> + <TD><INPUT TYPE="CHECKBOX" NAME="KeywordSelect-<%$keywordselect->Id%>-Delete"></TD> + <TD><& /Admin/Elements/SelectKeywordSelect, KeywordSelect => $keywordselect &></TD> +</TR> +% } +</TABLE> +% } + +Add a keyword selection to this queue: +%my $ks = new RT::KeywordSelect($session{'CurrentUser'}); +<ul> +<li><& /Admin/Elements/SelectKeywordSelect, KeywordSelect => $ks, NamePrefix => 'new' &></li> +</ul> + +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit &> + +</FORM> +<%init> +my (@actions); + + + +my $KeywordSelects = new RT::KeywordSelects ($session{'CurrentUser'}); +unless ($id =~ /^\d+$/) { + Abort("$id isn't a valid Queue id."); +} + +unless ($KeywordSelects->LimitToQueue($id)) { + Abort("Couldn't load KeywordSelects."); +} + +my $QueueObj = new RT::Queue($session{'CurrentUser'}); +$QueueObj->Load($id); + +my $description = "Modify Keyword selections for queue '". $QueueObj->Name ."'"; + + + +# {{{ if we're trying to create a new keyword select + +if ($ARGS{'KeywordSelect-new-Name'}) { + my $NewKeywordSelect = new RT::KeywordSelect($session{'CurrentUser'}); + + my ($retval, $msg) = $NewKeywordSelect->Create ( Keyword => $ARGS{'KeywordSelect-new-Keyword'}, + ObjectField => 'Queue', + ObjectType => 'Ticket', + ObjectValue => $QueueObj->Id, + Name => $ARGS{'KeywordSelect-new-Name'}, + Single => $ARGS{'KeywordSelect-new-Single'}, + Depth => $ARGS{'KeywordSelect-new-Depth'} + ); + push (@actions, $msg); +} +# }}} +# {{{ if we're trying to delete the keywordselect +foreach my $key (keys %ARGS) { + if ($key =~ /^KeywordSelect-(\d+)-Delete$/) { + my $id = $1; + my $keywordselect = new RT::KeywordSelect($session{'CurrentUser'}); + $keywordselect->Load($id) || push @actions, "Couldn't load keywordSelect"; + my ($val, $msg) = $keywordselect->SetDisabled(1); + if ($val) { + push @actions, 'KeywordSelect disabled.'; + } + else { + push @actions, $msg; + } + } +} +# }}} +# {{{ if we're modifying keyword selects +my @fields = qw(Name Keyword Single Depth); + +while (my $ks = $KeywordSelects->Next) { + foreach my $field (@fields) { + if (defined ($ARGS{"KeywordSelect-".$ks->Id."-".$field}) && + ($ARGS{"KeywordSelect-".$ks->Id."-".$field} ne $ks->$field())) { + + my $method = "Set$field"; + my ($val, $msg) = $ks->$method($ARGS{"KeywordSelect-".$ks->Id."-".$field}); + push @actions, "Keyword Select ". $ks->Name."/$field:".$msg; + } + } +} +# }}} + +</%init> + +<%ARGS> +$id => undef #some identifier that a Queue could + +</%ARGS> diff --git a/rt/webrt/Admin/Queues/Modify.html b/rt/webrt/Admin/Queues/Modify.html new file mode 100755 index 000000000..7a200df92 --- /dev/null +++ b/rt/webrt/Admin/Queues/Modify.html @@ -0,0 +1,137 @@ +<& /Admin/Elements/Header, Title => 'Admin/Queue/Basics' &> +<& /Admin/Elements/QueueTabs, id => $QueueObj->id &> +<& /Elements/ListActions, actions => \@results &> + + + +<& /Elements/TitleBoxStart, title => $title &> + + +<FORM ACTION="<%$RT::WebPath%>/Admin/Queues/Modify.html" METHOD=POST> +%if ($Create ) { +<INPUT TYPE=HIDDEN NAME=id VALUE="new"> +% } else { +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$QueueObj->Id%>"> +% } + +<TABLE> +<TR><TD ALIGN=RIGHT> +Queue Name: +</TD> +<TD><INPUT name="Name" value="<%$QueueObj->Name%>"></TD> +</TR><TR> +<TD ALIGN=RIGHT> +Description:</TD><TD COLSPAN=3><INPUT name="Description" value="<%$QueueObj->Description%>" size=60></TD></TR> +<TR> +<TD ALIGN=RIGHT> +Correspondence Address: +</TD><TD> +<INPUT name="CorrespondAddress" value="<%$QueueObj->CorrespondAddress%>"> +<BR><font size="-1"><i>(If left blank, will default to <%$RT::CorrespondAddress%></i></font> +</TD> +<TD ALIGN=RIGHT> + +Comment Address: </TD><TD> +<INPUT NAME="CommentAddress" value="<%$QueueObj->CommentAddress%>"> +<BR><font size="-1"><i>(If left blank, will default to <%$RT::CommentAddress%></i></font> +</TD> +</TR><TR> + +<TD ALIGN=RIGHT> +Priority starts at: +</TD><TD><INPUT NAME="InitialPriority" value="<%$QueueObj->InitialPriority %>"> +</TD> +<TD ALIGN=RIGHT> +Over time, priority moves toward: +</TD><TD><INPUT NAME="FinalPriority" value="<%$QueueObj->FinalPriority %>"> +</TD> +</TR> +<TR> +<TD ALIGN=RIGHT> +Requests should be due in: +</TD><TD> +<INPUT NAME="DefaultDueIn" VALUE="<%$QueueObj->DefaultDueIn%>"> days. +</TD> +</TR> +<TR> +<TD> +</TD> +<TD COLSPAN=4><INPUT TYPE=HIDDEN NAME="SetEnabled" VALUE="1"> +<INPUT TYPE=CHECKBOX NAME="Enabled" VALUE="1" <%$EnabledChecked%>> Enabled (Unchecking this box disables this queue)<BR> +</TD> +</TR> + +</TABLE> +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit &> +</form> + + + +<%INIT> + +my $QueueObj = new RT::Queue($session{'CurrentUser'}); +my ($title, @results, $Disabled, $EnabledChecked); + +if ($Create) { + $title = "Create a queue"; +} + +else { + if ($id eq 'new') { + my ($val, $msg) = $QueueObj->Create(Name => $Name); + if ($val == 0 ) { + Abort("Could not create queue: $msg"); + } + else { + push @results, $msg; + } + } + else { + $QueueObj->Load($id) || $QueueObj->Load($Name) || Abort("Couldn't load queue '$Name'"); + } + $title = 'Editing Configuration for queue '.$QueueObj->Name; + +} +if ($QueueObj->Id()) { +my @attribs= qw(Description CorrespondAddress CommentAddress Name + InitialPriority FinalPriority DefaultDueIn); + + @results = UpdateRecordObject( AttributesRef => \@attribs, + Object => $QueueObj, + ARGSRef => \%ARGS); + +} + +#we're asking about enabled on the web page but really care about disabled. +if ($Enabled == 1) { + $Disabled = 0; +} +else { + $Disabled = 1; +} +if ( ($SetEnabled) and ( $Disabled != $QueueObj->Disabled) ) { + my ($code, $msg) = $QueueObj->SetDisabled($Disabled); + push @results, 'Enabled status '. $msg; +} + +unless ($QueueObj->Disabled()) { + $EnabledChecked ="CHECKED"; +} +</%INIT> + + +<%ARGS> +$id => undef +$result => undef +$Name => undef +$Create => undef +$Description => undef +$CorrespondAddress => undef +$CommentAddress => undef +$InitialPriority => undef +$FinalPriority => undef +$DefaultDueIn => undef +$SetEnabled => undef +$Enabled => undef +</%ARGS> diff --git a/rt/webrt/Admin/Queues/People.html b/rt/webrt/Admin/Queues/People.html new file mode 100755 index 000000000..b495400ed --- /dev/null +++ b/rt/webrt/Admin/Queues/People.html @@ -0,0 +1,161 @@ +<& /Elements/Header, Title => 'Modify people related to queue ' . $QueueObj->Name &> +<& /Admin/Elements/QueueTabs, id => $id &> + +<& /Elements/ListActions, actions => \@results &> + + +<FORM METHOD=POST ACTION="People.html"> +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$QueueObj->Id%>"> +<& /Elements/TitleBoxStart, title => 'Modify watchers for queue \''.$QueueObj->Name ."'", width => "100%" &> + +<TABLE WIDTH=100%> +<TR> +<TD VALIGN=TOP > + +<h3>Current watchers</h3> +<i>(Check box to delete)</i><br><BR> + + +Cc: + +<ul> + +%# Print out a placeholder if there are none. +%if ($cc->Count == 0 ) { +<li><i>none</i> +% } + +%while (my $watcher=$cc->Next) { +<li> +<INPUT TYPE=CHECKBOX NAME="DelWatcher<%$watcher->id%>" UNCHECKED> +%# 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> + + +Administrative Cc: +<UL> +%# Print out a placeholder if there are none. +%if ($admincc->Count == 0 ) { +<li><i>none</i> +% } + +%while (my $watcher=$admincc->Next) { +<li><INPUT TYPE=CHECKBOX NAME="DelWatcher<%$watcher->id%>" UNCHECKED> +%# 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> +</TD> + +<TD VALIGN=TOP> +<h3>New watchers</h3> +Find people whose<BR> +<& /Elements/SelectUsers &> + +<BR> +Add new watchers:<br> + +% if ($msg) { +<i><%$msg%></i> +% } elsif ($Users) { +<ul> +% while (my $u = $Users->Next ) { +<li><&/Elements/SelectWatcherType, Scope=>'queue', Name => "WatcherTypeUser".$u->Id &> <%$u->Name%> +(<%$u->RealName%>) +% } +</ul> +% } + +</TD> +</TR> +</TABLE> + + + + + +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit, Label => 'Save Changes', Caption => "If you've updated anything above, be sure to" &> +</form> + +<%INIT> + +my ($field, @results, $User, $Users, $watcher, $key, $msg); +# {{{ Load the queue +#If we get handed two ids, mason will make them an array. bleck. +# We want teh first one. Just because there's no other sensible way +# to deal + + + +my $QueueObj = new RT::Queue($session{'CurrentUser'}); +$QueueObj->Load($id) || Abort("Couldn't load queue '$id'"); +# }}} + +# {{{ Delete deletable watchers + +foreach $key (keys %ARGS) { + if (($key =~ /^DelWatcher(\d*)$/) and + ($ARGS{$key})) { + $RT::Logger->debug("Deleting watcher $1\n"); + my ($code, $msg) = $QueueObj->DeleteWatcher($1); + + push @results, $msg; + } +} +# }}} + +# {{{ Add new watchers +foreach $key (keys %ARGS) { + #They're in this order because otherwise $1 gets clobbered :/ + if ( ($ARGS{$key} =~ /^(AdminCc|Cc)$/) and + ($key =~ /^WatcherTypeUser(\d*)$/) ) { + $RT::Logger->debug("Adding a watcher $1 to ".$ARGS{$key}."\n"); + my ($code, $msg) = + $QueueObj->AddWatcher(Type => $ARGS{$key}, + Owner => $1); + push @results, $msg; + } +} + +# }}} + + + +my $admincc = $QueueObj->AdminCc; +my $cc = $QueueObj->Cc; + + +if (!$ARGS{'UserString'}) { +$msg = "No users selected."; + } +else { + $Users = new RT::Users($session{'CurrentUser'}); + $Users->Limit(FIELD => $ARGS{'UserField'}, + VALUE => $ARGS{'UserString'}, + OPERATOR => $ARGS{'UserOp'}); + } +</%INIT> + +<%ARGS> +$UserField => 'Name' +$UserOp => '=' +$UserString => undef +$Type => undef +$id => undef +</%ARGS> + diff --git a/rt/webrt/Admin/Queues/Scrips.html b/rt/webrt/Admin/Queues/Scrips.html new file mode 100755 index 000000000..95b8c4378 --- /dev/null +++ b/rt/webrt/Admin/Queues/Scrips.html @@ -0,0 +1,111 @@ +<& /Admin/Elements/Header, Title => 'Edit scrips' &> +<& /Admin/Elements/QueueTabs, id => $QueueObj->Id &> + +<& /Elements/ListActions, actions => \@actions &> + +<& /Elements/TitleBoxStart, title => $description &> + +<h2>Global Scrips</h2> +<& /Admin/Elements/ListGlobalScrips &> +<BR> + <FORM METHOD=POST ACTION="Scrips.html"> + <INPUT TYPE=HIDDEN NAME=id VALUE=<%$id%>> +<h2>Queue Scrips</h2> +% if ($Scrips->Count > 0 ) { +<TABLE> +<TR> +<TD>Delete +</TD> +<TD> +</TR> +% while (my $scrip = $Scrips->Next ) { +<TR> +<TD> +<INPUT TYPE="CHECKBOX" NAME="DeleteScrip-<%$scrip->Id%>"> +</TD> +<TD> +<% $scrip->ConditionObj->Name %> +<% $scrip->ActionObj->Name %> with template +<% $scrip->TemplateObj->Name %> +</TD> +</TR> +% } +</TABLE> +% } +<BR> +<h2>Add a scrip to this queue</h2> +Condition: <& /Admin/Elements/SelectScripCondition, Name => 'NewScripCondition' &> + Action: <& /Admin/Elements/SelectScripAction, Name => 'NewScripAction' &> + Template: <& /Admin/Elements/SelectTemplate, Name => 'NewScripTemplate', DefaultQueue => $id &> + +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit &> +</FORM> +<%init> +my (@actions, $description); + +my $Scrips = new RT::Scrips ($session{'CurrentUser'}); +unless ($id =~ /^\d+$/) { + Abort("$id isn't a valid Queue id."); +} + +unless ($Scrips->LimitToQueue($id)) { + Abort("Couldn't load Scrips."); + } + +my $QueueObj = new RT::Queue($session{'CurrentUser'}); +$QueueObj->Load($id); + +if ($QueueObj->id) { + $description = "Modify scrips for queue '". $QueueObj->Name ."'"; +} +else { + $description = "Modify global scrips"; +} + + +if ($NewScripAction and $NewScripCondition) { + my $NewScrip = new RT::Scrip($session{'CurrentUser'}); + + my ($retval, $msg) = $NewScrip->Create ( ScripAction => $NewScripAction, + ScripCondition => $NewScripCondition, + Stage => 'TransactionCreate', + Queue => $id, + Template => $NewScripTemplate); + if (defined $retval) { + push @actions, $msg; + } + else { + push @actions, $msg; + } +} + +# {{{ deal with modifying and deleting existing scrips +my ($key ); +foreach $key (keys %ARGS) { + # {{{ if we're trying to delete the scrip + if ($key =~ /^DeleteScrip-(\d+)/) { + my $id = $1; + my $scrip = new RT::Scrip($session{'CurrentUser'}); + $scrip->Load($id); + my ($retval, $msg) = $scrip->Delete; + if ($retval) { + push @actions, 'Scrip deleted'; + } + else { + push @actions, $msg; + } + } + # }}} + + +} +# }}} +</%init> + +<%ARGS> +$NewScripCondition => undef +$NewScripAction => undef +$NewScripTemplate => undef +$id => undef #some identifier that a Queue could +</%ARGS> diff --git a/rt/webrt/Admin/Queues/Template.html b/rt/webrt/Admin/Queues/Template.html new file mode 100755 index 000000000..61ee418a6 --- /dev/null +++ b/rt/webrt/Admin/Queues/Template.html @@ -0,0 +1,68 @@ +<& /Admin/Elements/Header, title => "Modify template ".$TemplateObj->id&> +<& /Admin/Elements/QueueTabs, id => $Queue &> +<& /Elements/ListActions, actions => \@results &> + +<& /Elements/TitleBoxStart, title => $title &> + +<FORM METHOD=POST ACTION="Template.html"> +%if ($create ) { +<INPUT TYPE=HIDDEN NAME=template VALUE="new"> +% } else { +<INPUT TYPE=HIDDEN NAME=template VALUE="<%$TemplateObj->Id%>"> +% } + +%# hang onto the queue id +<INPUT TYPE=HIDDEN name="Queue" value="<%$Queue%>"> + + +Name: <input name="Name" VALUE="<%$TemplateObj->Name%>" SIZE=20><BR> +Description: <input name="Description" VALUE="<%$TemplateObj->Description%>" SIZE=80><BR> + +<TEXTAREA NAME=Content ROWS=25 COLS=80 WRAP=SOFT> +<%$TemplateObj->Content%></TEXTAREA> + +<& /Elements/TitleBoxEnd&> +<&/Elements/Submit&> +</FORM> + + + +<%INIT> + +my $TemplateObj = new RT::Template($session{'CurrentUser'}); +my ($title, @results); + +if ($create) { + $title = "Create a template"; +} + +else { + if ($template eq 'new') { + my ($val, $msg) = $TemplateObj->Create(Queue => $Queue, Name => $Name); + Abort("Could not create template: $msg") unless ($val); + push @results, $msg; + $title = 'Created template ' . $TemplateObj->Name(); + } + else { + $TemplateObj->Load($template) || Abort('No Template'); + $title = 'Editing template ' . $TemplateObj->Name(); + } + + +} +if ($TemplateObj->Id()) { + $Queue = $TemplateObj->Queue; + + my @attribs = qw( Description Content Queue Name); + my @aresults = UpdateRecordObject( AttributesRef => \@attribs, + Object => $TemplateObj, + ARGSRef => \%ARGS); + push @results, @aresults; +} +</%INIT> +<%ARGS> +$Queue => undef +$template => undef +$create => undef +$Name => undef +</%ARGS> diff --git a/rt/webrt/Admin/Queues/Templates.html b/rt/webrt/Admin/Queues/Templates.html new file mode 100755 index 000000000..218d41dc9 --- /dev/null +++ b/rt/webrt/Admin/Queues/Templates.html @@ -0,0 +1,24 @@ +<& /Admin/Elements/Header, Title => 'Edit templates for '.$Queue->Name &> +<& /Admin/Elements/QueueTabs, id => $Queue->id &> + +<& /Elements/TitleBoxStart, title => 'Edit templates for '.$Queue->Name &> +<UL> +<LI><A href="Template.html?create=1&Queue=<%$Queue->id%>">Create a new template</A><BR><BR> + +%while (my $TemplateObj = $Templates->Next) { + +<LI><A HREF="Template.html?Queue=<%$id%>&template=<%$TemplateObj->id()%>"><%$TemplateObj->id()%>/<%$TemplateObj->Name%>: <%$TemplateObj->Description%></a><BR> + +%} + +<& /Elements/TitleBoxEnd &> +<%INIT> + +my $Queue = new RT::Queue($session{'CurrentUser'}); +$Queue->Load($id); +my $Templates = $Queue->Templates; + +</%INIT> +<%ARGS> +$id => undef +</%ARGS> diff --git a/rt/webrt/Admin/Queues/UserRights.html b/rt/webrt/Admin/Queues/UserRights.html new file mode 100755 index 000000000..75d9cb282 --- /dev/null +++ b/rt/webrt/Admin/Queues/UserRights.html @@ -0,0 +1,72 @@ +<& /Admin/Elements/Header, Title => 'Modify user rights for queue '. $QueueObj->Name &> +<& /Admin/Elements/QueueTabs, id => $id &> +<& /Elements/ListActions, actions => \@results &> + + <FORM METHOD=POST ACTION="UserRights.html"> + <INPUT TYPE=HIDDEN NAME=id VALUE="<% $QueueObj->id %>"> + +<& /Elements/TitleBoxStart, title => 'Modify user rights for queue '.$QueueObj->Name &> + +<TABLE> + +% while (my $UserObj = $Users->Next()) { + <TR ALIGN=RIGHT> + <TD VALIGN=TOP> + <% $UserObj->Name %> + </TD> + <TD> + <& /Admin/Elements/SelectRights, PrincipalObj => $UserObj, + PrincipalType => 'User', + Scope => 'Queue', + QueueObj => $QueueObj &> + </TD> + </TR> +% } + </TABLE> + + <& /Elements/TitleBoxEnd &> + <& /Elements/Submit, Caption => "Be sure to save your changes", Reset => 1 &> + + </FORM> + +<%INIT> + + #Update the acls. + my @results = ProcessACLChanges(\@CheckACL, \%ARGS); + +# {{{ Deal with setting up the display of current rights. + +# {{{ do basic initialization. + +#Define vars used in html above +my ($GroupObj); + +my ($right); + + +if (!defined $id) { + Abort("No Queue defined"); +} + +my $QueueObj = new RT::Queue($session{'CurrentUser'}); +$QueueObj->Load($id) || + Abort("Couldn't load queue $id"); + +# Find out which users we want to display ACL selects for +my $Users = new RT::Users($session{'CurrentUser'}); +$Users->LimitToPrivileged(); + +# }}} + + +# }}} + +</%INIT> + +<%ARGS> +$id => undef +$UserString => undef +$UserOp => undef +$UserField => undef +@CheckACL => undef +</%ARGS> diff --git a/rt/webrt/Admin/Queues/index.html b/rt/webrt/Admin/Queues/index.html new file mode 100755 index 000000000..52dfb73c8 --- /dev/null +++ b/rt/webrt/Admin/Queues/index.html @@ -0,0 +1,52 @@ +<& /Admin/Elements/Header, Title => 'Admin queues' &> +<& /Admin/Elements/Tabs, current_tab => 'Admin/Queues/' &> + + +<& /Elements/TitleBoxStart, title => 'Select a queue' &> + +<TABLE> +<TR> +<TD VALIGN=TOP> + +<FORM METHOD=POST ACTION="<% $RT::WebPath %>/Admin/Queues/"> + +<input type="checkbox" name="FindDisabledQueues"> Include disabled queues in listing. +<BR> +<div align=right><input type=submit value="Go!"></div> +</FORM> +</TD> +<TD VALIGN=TOP> +<UL> +% if ($session{'CurrentUser'}->HasSystemRight('AdminQueue')) { +<LI><A HREF="<%$RT::WebPath%>/Admin/Queues/Modify.html?Create=1">Create a new queue</A><BR><BR></LI> +</UL> +% } + +<%$caption%><BR> +<UL> +%if ($queues->Count == 0) { +<LI> <i>No queues matching search criteria found.</i> +% } +%while ( $queue = $queues->Next) { +<LI><A HREF="Modify.html?id=<%$queue->id%>"><%$queue->Name%></a></LI> +%} + +</UL> +</TD> +</TR> +</TABLE> +<& /Elements/TitleBoxEnd &> + +<%INIT> +my ($queue, $caption); +my $queues = new RT::Queues($session{'CurrentUser'}); +$queues->UnLimit(); + +if ($FindDisabledQueues) { + $queues->{'find_disabled_rows'} = 1; +} + +</%INIT> +<%ARGS> +$FindDisabledQueues => 0 +</%ARGS> diff --git a/rt/webrt/Admin/Users/Modify.html b/rt/webrt/Admin/Users/Modify.html new file mode 100755 index 000000000..b6daed49b --- /dev/null +++ b/rt/webrt/Admin/Users/Modify.html @@ -0,0 +1,259 @@ +<& /Admin/Elements/Header, Title => $title &> +<& /Admin/Elements/UserTabs, id => $id, current_subtab => '/Admin/Elements/Modify.html?id='.$id &> + +<& /Elements/ListActions, actions => \@results &> + +<FORM ACTION="<%$RT::WebPath%>/Admin/Users/Modify.html" METHOD=POST> +%if ($Create) { +<INPUT TYPE=HIDDEN NAME=id VALUE="new"> +% } else { +<INPUT TYPE=HIDDEN NAME=id VALUE="<%$UserObj->Id%>"> +% } + +<TABLE WIDTH=100% BORDER=0> +<TR> + +<TD VALIGN=TOP ROWSPAN=2> +<& /Elements/TitleBoxStart, title => 'Identity' &> + +Username: <input name="Name" value="<%$UserObj->Name%>"> <b>(required)</b> <BR> +Email: <input name="EmailAddress" value="<%$UserObj->EmailAddress%>"><BR> +Real Name: <input name="RealName" value="<%$UserObj->RealName%>"> <BR> +Nickname: <input name="NickName" value="<%$UserObj->NickName%>"> +<BR> +Unix login: <input name="Gecos" value="<%$UserObj->Gecos%>"> +<BR> +Extra info: <textarea name="FreeformContactInfo" cols=20 rows=5><%$UserObj->FreeformContactInfo%></TEXTAREA> +<& /Elements/TitleBoxEnd &> +</TD> +<TD VALIGN=TOP> +<& /Elements/TitleBoxStart, title => 'Access control' &> +<INPUT TYPE=HIDDEN NAME="SetEnabled" VALUE="1"> +<INPUT TYPE=CHECKBOX NAME="Enabled" VALUE="1" <%$EnabledChecked%>> +Let this user access RT<BR> + + +<INPUT TYPE=HIDDEN NAME="SetPrivileged" VALUE="1"> +<INPUT TYPE=CHECKBOX NAME="Privileged" VALUE="1" <%$PrivilegedChecked%>> Let this user be granted rights<BR> + +% unless ($RT::WebExternalAuth) { +<TABLE> +<TR> +<TD ALIGN=RIGHT> +New Password: +</TD> +<TD ALIGN=LEFT> +<input type=password name="Pass1"> +</TD> +</TR> +<TR><TD ALIGN=RIGHT> +Retype Password: +</TD> +<TD> +<input type=password name="Pass2"> +</TD> +</TR> +</TABLE> +% } +<& /Elements/TitleBoxEnd &> +</TD> +<TR> + +<TD VALIGN=TOP> +<& /Elements/TitleBoxStart, title => 'Location' &> +Organization: <input name="Organization" value="<%$UserObj->Organization%>"> +<BR> +Address1: <input name="Address1" value="<%$UserObj->Address1%>"> +<BR> +Address2: <input name="Address2" value="<%$UserObj->Address2%>"> +<BR> +City: <input name="City" value="<%$UserObj->City%>" size=14> + +State: <input name="State" value="<%$UserObj->State%>" size=3> + +Zip: <input name="Zip" value="<%$UserObj->Zip%>" size=9> +<BR> +Country: <input name="Country" value="<%$UserObj->Country%>"> +<BR> + + +<& /Elements/TitleBoxEnd &> +</TD> +</TR> +<TR> +<TD COLSPAN=2 VALIGN=TOP> + + +<& /Elements/TitleBoxStart, title => 'Phone numbers' &> +Home: <input name="HomePhone" value="<%$UserObj->HomePhone%>" size=13> + +Work: <input name="WorkPhone" value="<%$UserObj->WorkPhone%>" size=13> + +Mobile: <input name="MobilePhone" value="<%$UserObj->MobilePhone%>" size=13> + +Pager: <input name="PagerPhone" value="<%$UserObj->PagerPhone%>" size=13> +<& /Elements/TitleBoxEnd &> +<BR> +<& /Elements/TitleBoxStart, title => 'Comments about this user' &> +<TEXTAREA name="Comments" COLS=80 ROWS=5 WRAP=VIRTUAL><%$UserObj->Comments%></TEXTAREA> +<& /Elements/TitleBoxEnd &> + + +%if ($UserObj->Privileged) { +<BR> +<& /Elements/TitleBoxStart, title => 'Signature' &> +<TEXTAREA COLS=80 ROWS=5 name="Signature" WRAP=HARD> +<%$UserObj->Signature%></TEXTAREA> +<& /Elements/TitleBoxEnd &> +% } + +</TD> + +</TR> +</TABLE> + + +<& /Elements/Submit &> +</form> + + +<%INIT> + +my $UserObj = new RT::User($session{'CurrentUser'}); +my ($title, $PrivilegedChecked, $EnabledChecked, $Disabled, $result, @results); + +my ($val, $msg); + +if ($Create) { + $title = "Create a new user"; +} +else { + + if ($id eq 'new') { + ($val, $msg) = $UserObj->Create( Name => $Name, + EmailAddress => $ARGS{'EmailAddress'} + ); + if ($val) { + push @results, $msg; + } else { + push @results, 'User could not be created: '. $msg; + } + + } + else { + $UserObj->Load($id) || $UserObj->Load($Name) || Abort("Couldn't load user '$Name'"); + $val = $UserObj->Id(); + } + + if ($val) { + $title = "Modify the user ". $UserObj->Name; + } + + # If the create failed + else { + $title = "Create a new user"; + $Create = 1; + } + + + +} + + + + +# If we have a user to modify, lets try. +if ($UserObj->Id) { + + my @fields = qw(Name Comments Signature EmailAddress FreeformContactInfo + Organization RealName NickName Lang EmailEncoding WebEncoding + ExternalContactInfoId ContactInfoSystem Gecos ExternalAuthId + AuthSystem HomePhone WorkPhone MobilePhone PagerPhone Address1 + Address2 City State Zip Country + ); + + my @fieldresults = UpdateRecordObject ( AttributesRef => \@fields, + Object => $UserObj, + ARGSRef => \%ARGS ); + push (@results,@fieldresults); + + +# {{{ Deal with special fields: Privileged, Enabled and Password +if ( ($SetPrivileged) and ( $Privileged != $UserObj->Privileged) ) { +my ($code, $msg) = $UserObj->SetPrivileged($Privileged); + push @results, 'Privileged status: '. $msg; +} + +#we're asking about enabled on the web page but really care about disabled. +if ($Enabled == 1) { + $Disabled = 0; +} +else { + $Disabled = 1; +} +if ( ($SetEnabled) and ( $Disabled != $UserObj->Disabled) ) { + my ($code, $msg) = $UserObj->SetDisabled($Disabled); + push @results, 'Enabled status '. $msg; +} + + +#TODO: make this report errors properly +if ((defined $Pass1) and ($Pass1 ne '') and ($Pass1 eq $Pass2) and (!$UserObj->IsPassword($Pass1))) { + my ($code, $msg); + ($code, $msg) = $UserObj->SetPassword($Pass1); + push @results, 'Password: '. $msg; +} + +# }}} +} + + +# {{{ Do some setup for the ui +unless ($UserObj->Disabled()) { + $EnabledChecked ="CHECKED"; +} + +if ($UserObj->Privileged()) { + $PrivilegedChecked = "CHECKED"; +} + +# }}} +</%INIT> + + +<%ARGS> +$id => undef +$Name => undef +$Comments => undef +$Signature => undef +$EmailAddress => undef +$FreeformContactInfo => undef +$Organization => undef +$RealName => undef +$NickName => undef +$Privileged => undef +$SetPrivileged => undef +$Enabled => undef +$SetEnabled => undef +$Lang => undef +$EmailEncoding => undef +$WebEncoding => undef +$ExternalContactInfoId => undef +$ContactInfoSystem => undef +$Gecos => undef +$ExternalAuthId => undef +$AuthSystem => undef +$HomePhone => undef +$WorkPhone => undef +$MobilePhone => undef +$PagerPhone => undef +$Address1 => undef +$Address2 => undef +$City => undef +$State => undef +$Zip => undef +$Country => undef +$Pass1 => undef +$Pass2=> undef +$Create=> undef +</%ARGS> diff --git a/rt/webrt/Admin/Users/Prefs.html b/rt/webrt/Admin/Users/Prefs.html new file mode 100755 index 000000000..4a9fc5cdf --- /dev/null +++ b/rt/webrt/Admin/Users/Prefs.html @@ -0,0 +1,97 @@ +<& /Elements/Header, Title=>"User view" &> + +<& /Elements/ViewUser, User=>$u &> + +%if ($session{CurrentUser} && ($session{CurrentUser}->Id == $id)) { + <& /Elements/TitleBoxStart, title => 'Signature' &> +<form method=post> +<input type="hidden" name="id" value=<%$id%>> +<TEXTAREA COLS=72 ROWS=4 WRAP=HARD NAME="Signature"><% $u->Signature %></TEXTAREA><br><br> +<input type="submit" value="Update signature"> +</form> + <& /Elements/TitleBoxEnd &> + <form method=post> + Open tickets (from listing) in another window: <input type="checkbox" name="NewWindowOption" <%exists $session{NewWindowOption} && "CHECKED"%>><br> + Open tickets (from listing) in a new window: <input type="checkbox" name="AlwaysNewWindowOption" <%exists $session{AlwaysNewWindowOption} && "CHECKED"%>><br> + <input type="submit" name="NewWindowSetting" value="New window setting"> + </form> +%} + + <& /Elements/TitleBoxStart, title => 'Email' &> +<form method=post> +<input type="hidden" name="id" value="<%$id%>"> +<input name="Email" value="<% $u->EmailAddress %>"><input type="submit" value="Update email"> +</form> + <& /Elements/TitleBoxEnd &> + <& /Elements/TitleBoxStart, title => 'Real Name' &> +<form method=post> +<input type="hidden" name="id" value="<%$id%>"> +<input name="RealName" value="<% $u->RealName %>"><input type="submit" value="Update name"> +</form> + <& /Elements/TitleBoxEnd &> + + <& /Elements/TitleBoxStart, title => 'User ID' &> +<form method=post> +<input type="hidden" name="id" value="<%$id%>"> +<input name="Name" value="<% $u->Name %>"><input type="submit" value="Update ID"> +</form> + <& /Elements/TitleBoxEnd &> + +%# TODO: alternative email addresses + merging users + +<%ARGS> +$id => $session{CurrentUser} ? $session{CurrentUser}->Id : 0 +$Signature => undef +$Email => undef +$RealName => undef +$Name => undef +</%ARGS> + +<%INIT> +require RT::User; +my $u=RT::User->new($session{CurrentUser}); +$u->Load($id) || die "Couldn't load that user ($id)"; +if ($Signature) { +my ($val, $msg)=$u->SetSignature($Signature); +$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg); +} + +if ($Email) { +my ($val, $msg)=$u->SetEmailAddress($Email); +$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg); +} + +if ($RealName) { +my ($val, $msg)=$u->SetRealName($RealName); +$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg); +} + +if ($Name) { +my ($val, $msg)=$u->SetName($Name); +$RT::Logger->log(level=>($val ? 'info' : 'error'), message=>$msg); +} + +if ($ARGS{NewWindowSetting}) { +if ($ARGS{NewWindowOption}) { +$session{NewWindowOption}=1; +} else { +delete $session{NewWindowOption}; +} +if ($ARGS{AlwaysNewWindowOption}) { +$session{NewWindowOption}=1; +$session{AlwaysNewWindowOption}=1; +} else { +delete $session{AlwaysNewWindowOption}; +} +} + +</%INIT> + + + + + + + + + diff --git a/rt/webrt/Admin/Users/Rights.html b/rt/webrt/Admin/Users/Rights.html new file mode 100644 index 000000000..3b94f9157 --- /dev/null +++ b/rt/webrt/Admin/Users/Rights.html @@ -0,0 +1 @@ +Placeholder diff --git a/rt/webrt/Admin/Users/index.html b/rt/webrt/Admin/Users/index.html new file mode 100755 index 000000000..383513710 --- /dev/null +++ b/rt/webrt/Admin/Users/index.html @@ -0,0 +1,71 @@ +<& /Admin/Elements/Header, Title => 'Admin users' &> +<& /Admin/Elements/Tabs, current_tab => 'Admin/Users/' &> + + +<& /Elements/TitleBoxStart, title => 'Select a user' &> + +<TABLE> +<TR> +<TD VALIGN=TOP> + +<FORM METHOD=POST ACTION="<% $RT::WebPath %>/Admin/Users/"> + +Find people whose <& /Elements/SelectUsers &><BR> +<input type="checkbox" name="FindDisabledUsers"> Include disabled users in search. +<BR> +<div align=right><input type=submit value="Go!"></div> +</FORM> +</TD> +<TD VALIGN=TOP> +<UL> +% if ($session{'CurrentUser'}->HasSystemRight('AdminUsers')) { +<LI><A HREF="<%$RT::WebPath%>/Admin/Users/Modify.html?Create=1">Create a new user</A><BR><BR></LI> +</UL> +% } + +<%$caption%><BR> +<UL> +%if ($users->Count == 0) { +<LI> <i>No users matching search criteria found.</i> +% } +%while ( $user = $users->Next) { +<LI><A HREF="Modify.html?id=<%$user->id%>"><%$user->Name || '(no name listed)'%></a></LI> +%} + +</UL> +</TD> +</TR> +</TABLE> +<& /Elements/TitleBoxEnd &> + +<%INIT> +my ($user, $caption); +my $users = new RT::Users($session{'CurrentUser'}); + +if ($FindDisabledUsers) { + $users->{'find_disabled_rows'} = 1; +} + +unless (defined $UserString) { + $users->LimitToPrivileged(); + $caption = "Privileged users"; +} +else { + $caption = "Users matching search criteria"; + + if ($UserString) { + $users->Limit( FIELD => $UserField, + OPERATOR => $UserOp, + VALUE => $UserString); + +} +} +</%INIT> +<%ARGS> +$UserString => undef +$UserOp => '=' +$UserField => 'Name' +$IdLike => undef +$EmailLike => undef +$FindDisabledUsers => 0 +</%ARGS> diff --git a/rt/webrt/Admin/index.html b/rt/webrt/Admin/index.html new file mode 100755 index 000000000..1ed973f7e --- /dev/null +++ b/rt/webrt/Admin/index.html @@ -0,0 +1,4 @@ + <& /Admin/Elements/Header, Title => 'RT Administration' &> +<& /Admin/Elements/Tabs &> + + diff --git a/rt/webrt/Elements/Checkbox b/rt/webrt/Elements/Checkbox new file mode 100755 index 000000000..964c482ba --- /dev/null +++ b/rt/webrt/Elements/Checkbox @@ -0,0 +1,17 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/Checkbox,v 1.1 2002-08-12 06:17:08 ivan Exp $ +<INPUT TYPE="Checkbox" NAME ="<%$Name%>" <%$IsChecked%>> + +<%ARGS> +$Name => undef +$Default => undef +$True => undef +$False => undef +$IsChecked => undef +</%ARGS> + +<%INIT> +$IsChecked = + ($Default && $Default =~ /checked/i) + ? " CHECKED " : ""; +1; +</%INIT> diff --git a/rt/webrt/Elements/CreateTicket b/rt/webrt/Elements/CreateTicket new file mode 100644 index 000000000..1270f6ebe --- /dev/null +++ b/rt/webrt/Elements/CreateTicket @@ -0,0 +1 @@ +<FORM ACTION="<% $RT::WebPath%>/Ticket/Create.html"><input type=submit value="New ticket in"> <& /Elements/SelectNewTicketQueue &></FORM> diff --git a/rt/webrt/Elements/CustomHomepageHeader b/rt/webrt/Elements/CustomHomepageHeader new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/rt/webrt/Elements/CustomHomepageHeader diff --git a/rt/webrt/Elements/Error b/rt/webrt/Elements/Error new file mode 100755 index 000000000..ec2cf511f --- /dev/null +++ b/rt/webrt/Elements/Error @@ -0,0 +1,23 @@ +<& /Elements/Header, Code => $Code, Why => $Why &> +<& /Elements/Tabs &> +<& /Elements/TitleBoxStart, title => $Title &> +<%$Why%> +<br> +<font size=-1> +<%$Details%> +</font> +<& /Elements/TitleBoxEnd &> +</body> +</HTML> + + +<%args> +$Code => undef +$Details => undef +$Title => "RT Error" +$Why => "the calling component did not specify why" +</%args> + +<%INIT> +$RT::Logger->error("WebRT: $Why ($Details)"); +</%INIT> diff --git a/rt/webrt/Elements/Footer b/rt/webrt/Elements/Footer new file mode 100755 index 000000000..776c219bb --- /dev/null +++ b/rt/webrt/Elements/Footer @@ -0,0 +1,10 @@ +% if ($Debug) { +<HR> +<b>Time to display: <%time - $m->{'rt_base_time'} %></b> +% } +</BODY> +</HTML> + +<%ARGS> +$Debug => 0 +</%ARGS> diff --git a/rt/webrt/Elements/GotoTicket b/rt/webrt/Elements/GotoTicket new file mode 100644 index 000000000..21d2bcdf8 --- /dev/null +++ b/rt/webrt/Elements/GotoTicket @@ -0,0 +1 @@ +<FORM ACTION="<%$RT::WebPath%>/Ticket/Display.html"><input type=submit value="Goto ticket"> <input size=5 name=id></FORM> diff --git a/rt/webrt/Elements/Header b/rt/webrt/Elements/Header new file mode 100755 index 000000000..471331be2 --- /dev/null +++ b/rt/webrt/Elements/Header @@ -0,0 +1,61 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<HTML> +<HEAD> +<TITLE><%$Title%></TITLE> +<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE"> + +%# TODO this gets called from error. but I have no idea what it might +%# be used for. can we whack it? -jesse +% if ($Code) { +<META HTTP-EQUIV VALUE="<%$Code%> <%$Why%>"> +% } +% if ($Refresh > 0) { +<META HTTP-EQUIV="REFRESH" CONTENT="<%$Refresh%>"> +% } + +<link rel="stylesheet" href="<%$RT::WebPath%>/NoAuth/webrt.css" type="text/css"> +</HEAD> +<BODY BGCOLOR="<%$BgColor%>"> +% if ($ShowBar) { +<TABLE BORDER=0 WIDTH=100% CELLSPACING=0 BGCOLOR="#993333"> +<TR VALIGN=TOP> +<TD><IMG SRC="<%$RT::LogoURL%>" alt="RT"></TD> +<TD VALIGN=CENTER ALIGN=LEFT> +<font size=+2 color="#ffffff"> +<B> +<%$Title%> +</B> +</font> +</TD> +<TD ALIGN=RIGHT> +<font color="#ffffff"> +% if ($session{'CurrentUser'}) { +Signed in as <b><%$session{'CurrentUser'}->Name%></b>.<BR> +% if ($session{'CurrentUser'}->HasSystemRight('ModifySelf')) { +[<A class='inverse' HREF="<%$RT::WebPath%>/User/Prefs.html" >Preferences</A>] +% } +% unless ($RT::WebExternalAuth) { +[<A class='inverse' HREF="<%$RT::WebPath%>/NoAuth/Logout.html">Logout</a>] +% } +% } else { +Not logged in. +% } +</font> +</TD> +</TR> +</TABLE> + +<BR> +% } +<%ARGS> +$Title => 'WebRT' +$Code => undef +$Refresh => undef +$Why => undef +$BgColor => '#ffffff' +$ShowBar => 1 +</%ARGS> +<%INIT> +$Title = "RT/$RT::rtname: ".$Title; +</%INIT> + diff --git a/rt/webrt/Elements/ListActions b/rt/webrt/Elements/ListActions new file mode 100755 index 000000000..3fc9b0ba5 --- /dev/null +++ b/rt/webrt/Elements/ListActions @@ -0,0 +1,14 @@ +% if (@actions ) { +<& /Elements/TitleBoxStart, title => 'Results' &> +<UL> +% foreach my $action (@actions) { +% next unless ($action); +<LI><%$action%></LI> +% } +</UL> +<& /Elements/TitleBoxEnd &> +<BR> +% } +<%ARGS> +@actions => undef +</%ARGS> diff --git a/rt/webrt/Elements/Login b/rt/webrt/Elements/Login new file mode 100755 index 000000000..27ec98281 --- /dev/null +++ b/rt/webrt/Elements/Login @@ -0,0 +1,69 @@ +<& /Elements/Header, Title=>"Login" , &> + +<DIV ALIGN=CENTER> +% if ($Error) { +<& /Elements/TitleBoxStart, title => 'Error' &> +<% $Error %> +<& /Elements/TitleBoxEnd &> +% } +<BR> +<& /Elements/TitleBoxStart, width=> "40%", titleright => "RT $RT::VERSION for $RT::rtname", title => 'Login' , +contentbg=>"#cccccc" &> + + +% unless ($RT::WebExternalAuth) { +<FORM METHOD=POST > +<TABLE BORDER=0 WIDTH=100%> +<TR ALIGN=RIGHT> +<TD ALIGN=RIGHT>Username:</TD><TD ALIGN=LEFT><input name=user value="<%$user%>"></TD></TR> +<TR><TD ALIGN=RIGHT>Password:</TD><TD ALIGN=LEFT><input type=password name=pass></TD></TR> +<TR><TD colspan=2 align=right> +<input type=submit Value="Login"> +</TD></TR> +</TABLE> +<&/Elements/TitleBoxEnd&> +% # From mason 1.0.1 forward, this doesn't work. in fact, it breaks things. +% if (0) { +% # The code below iterates through everything in the passed in arguments +% # Preserving all the old parameters +% # This would be easier, except mason is 'smart' and calls multiple values +% # arrays rather than multiple hash keys +% my $key; my $val; +% foreach $key (keys %ARGS) { +% if (($key ne 'user') and ($key ne 'pass')) { +% if (ref($ARGS{$key}) =~ /ARRAY/) { +% foreach $val (@{$ARGS{$key}}) { +<input type=hidden name="<%$key %>" value="<% $val %>"> +% } +% } +% else { +<input type="hidden" name="<% $key %>" value="<% $ARGS{$key} %>"> +% } +% } +%} +% } +</FORM> +% } +</DIV> + +<BR> +<!-- TODO: not yet implemented +If you've forgotten your username or password, RT can <A +href="/NoAuth/Reminder.html">send you a reminder</a>. +--> +<BR> +<HR> +RT is © Copyright 1996-2002 Jesse Vincent <jesse@bestpractical.com>. It is +distributed under <a href="http://www.gnu.org/copyleft/gpl.html">Version 2 of the GNU General Public License.</a> + + +<%ARGS> +$user => "" +$pass => undef +$goto => undef +$Error => undef +</%ARGS> + +<%INIT> +SetContentType('text/html'); +</%INIT> diff --git a/rt/webrt/Elements/MessageBox b/rt/webrt/Elements/MessageBox new file mode 100644 index 000000000..aa081a380 --- /dev/null +++ b/rt/webrt/Elements/MessageBox @@ -0,0 +1,30 @@ +<TEXTAREA COLS=<%$Width%> ROWS=15 WRAP=HARD NAME="<%$Name%>"><% $Default %><%$message%><%$signature%></TEXTAREA> +<%INIT> + +my ($message); + +if ($MessageURI) { + my $code; + ($code, $Default)=RT::Link->GetContent($MessageURI); +} +if ($QuoteTransaction) { + my $transaction=RT::Transaction->new($session{'CurrentUser'}); + $transaction->Load($QuoteTransaction); + $message=$transaction->Content(Quote => 1); +} + +my $signature = ''; +if ($session{'CurrentUser'}->UserObj->Signature) { + $signature = "-- \n".$session{'CurrentUser'}->UserObj->Signature; +} + +</%INIT> +<%ARGS> +$QuoteTransaction => undef +$Name => 'Content' +$Default => '' +$DefaultURI => undef +$Width => 72 +$MessageURI => undef +</%ARGS> + diff --git a/rt/webrt/Elements/MyRequests b/rt/webrt/Elements/MyRequests new file mode 100644 index 000000000..67817296c --- /dev/null +++ b/rt/webrt/Elements/MyRequests @@ -0,0 +1,45 @@ +<& /Elements/TitleBoxStart, title => "25 highest priority tickets I requested..." &> +<TABLE BORDER=0 cellspacing=0 cellpadding=1 WIDTH=100%> +<TR> +<TH align=right>#</TH> +<TH align=left>Subject</TH> +<TH align=left>Queue</TH> +<TH align=left>Status</TH> +<TH align=left>Owner</TH> +<TH> </TH> +</TR> +% while (my $Ticket = $MyTickets->Next) { +<TR> +<TD ALIGN=RIGHT> +<%$Ticket->Id%> +</TD> +<TD> +<A HREF="<% $RT::WebPath %>/Ticket/Display.html?id=<%$Ticket->Id%>"> +<%$Ticket->Subject || '[no subject]'%> +</A> +</TD> +<TD> +<%$Ticket->QueueObj->Name%> +</TD><TD> +<%$Ticket->Status%> +</TD><TD> +<%$Ticket->OwnerObj->Name%> +</TD><TD ALIGN=RIGHT> +[<A HREF="<% $RT::WebPath %>/Ticket/Display.html?id=<%$Ticket->Id%>">Display</A>] +</TD> +</TR> +% } +</TABLE> +<& /Elements/TitleBoxEnd &> + + +<%INIT> +my $MyTickets; +$MyTickets = new RT::Tickets ($session{'CurrentUser'}); +$MyTickets->LimitRequestor(VALUE => $session{'CurrentUser'}->EmailAddress); +$MyTickets->LimitStatus(VALUE => "open"); +$MyTickets->LimitStatus(VALUE => "new"); +$MyTickets->OrderBy(FIELD => 'Priority', ORDER => 'DESC'); +$MyTickets->RowsPerPage(25); + +</%INIT> diff --git a/rt/webrt/Elements/MyTickets b/rt/webrt/Elements/MyTickets new file mode 100644 index 000000000..64a2ba7cc --- /dev/null +++ b/rt/webrt/Elements/MyTickets @@ -0,0 +1,43 @@ +<& /Elements/TitleBoxStart, title => "25 highest priority tickets I own..." &> +<TABLE BORDER=0 cellspacing=0 cellpadding=1 WIDTH=100%> +<TR> +<TH ALIGN=RIGHT>#</TH> +<TH ALIGN=LEFT>Subject</TH> +<TH ALIGN=LEFT>Queue</TH> +<TH ALIGN=LEFT>Status</TH> +<TH ALIGN=LEFT> </TH> +</TR> +% while (my $Ticket = $MyTickets->Next) { +<TR> +<TD ALIGN=RIGHT> +<%$Ticket->Id%> +</TD> +<TD> +<A HREF="<% $RT::WebPath %>/Ticket/Display.html?id=<%$Ticket->Id%>"> +<%$Ticket->Subject || '[no subject]'%> +</A> +</TD> +<TD> +<%$Ticket->QueueObj->Name%> +</TD><TD> +<%$Ticket->Status%> +</TD> +<TD ALIGN=RIGHT> +[<A HREF="<% $RT::WebPath %>/Ticket/Update.html?id=<%$Ticket->Id%>">Update</A>] +</TD> +</TR> +% } +</TABLE> +<& /Elements/TitleBoxEnd &> + + +<%INIT> +my $MyTickets; +$MyTickets = new RT::Tickets ($session{'CurrentUser'}); +$MyTickets->LimitOwner(VALUE => $session{'CurrentUser'}->Id); +$MyTickets->LimitStatus(VALUE => "open"); +$MyTickets->LimitStatus(VALUE => "new"); +$MyTickets->OrderBy(FIELD => 'Priority', ORDER => 'DESC'); +$MyTickets->RowsPerPage(25); + +</%INIT> diff --git a/rt/webrt/Elements/Quicksearch b/rt/webrt/Elements/Quicksearch new file mode 100644 index 000000000..d44c996fa --- /dev/null +++ b/rt/webrt/Elements/Quicksearch @@ -0,0 +1,41 @@ +<& /Elements/TitleBoxStart, title => "Find new/open tickets", titleright => "<A class='inverse' href=\"$RT::WebPath/Search/Listing.html?NewSearch=1\">Advanced Search</A>" &> + +<TABLE BORDER=0 cellspacing=0 cellpadding=1 WIDTH=100%> +<tr> + <th align=left>Queue</th> + <th align=left><font size=-1>New</font></th> + <th align=left><font size=-1>Open</font></th> + <th align=left><font size=-1>Stalled</font></th> +</tr> + +<%PERL> +while (my $queue = $Queues->Next) { + $Tickets->ClearRestrictions; + $Tickets->LimitStatus(VALUE => "open"); + $Tickets->LimitQueue(VALUE => $queue->id, OPERATOR => '='); + my $open = $Tickets->Count(); + + $Tickets->ClearRestrictions; + $Tickets->LimitStatus(VALUE => "new"); + $Tickets->LimitQueue(VALUE => $queue->id, OPERATOR => '='); + my $new = $Tickets->Count(); + + $Tickets->ClearRestrictions; + $Tickets->LimitStatus(VALUE => "stalled"); + $Tickets->LimitQueue(VALUE => $queue->id, OPERATOR => '='); + my $stalled = $Tickets->Count(); +</%PERL> +<TR><TD><A HREF="<% $RT::WebPath%>/Search/Listing.html?ValueOfStatus=open&ValueOfStatus=new&StatusOp=%3D&QueueOp=%3D&ValueOfQueue=<%$queue->Id%>&RowsPerPage=50&NewSearch=1"><%$queue->Name%></a></TD> +<TD><%$new%></TD> +<TD><%$open%></TD> +<TD><%$stalled%></TD> +</TR> +% } +</TABLE> +<& /Elements/TitleBoxEnd &> + +<%INIT> +my $Queues = new RT::Queues($session{'CurrentUser'}); +$Queues->UnLimit(); +my $Tickets = new RT::Tickets ($session{'CurrentUser'}); +</%INIT> diff --git a/rt/webrt/Elements/Refresh b/rt/webrt/Elements/Refresh new file mode 100644 index 000000000..6949d8c24 --- /dev/null +++ b/rt/webrt/Elements/Refresh @@ -0,0 +1,22 @@ +<SELECT NAME="<%$Name%>"> +<OPTION VALUE="-1" +%unless ($Default) { + SELECTED +%} +>Don't refresh this page.</OPTION> +%foreach my $value (@refreshevery) { +<OPTION VALUE="<%$value%>" +% if ($value == $Default) { +SELECTED +% } +>Refresh this page every <%$value/60%> minutes. +%} +</SELECT> + +<%INIT> +my @refreshevery = qw(120 300 600 1200 3600 7200); +</%INIT> +<%ARGS> +$Name => undef +$Default => undef +</%ARGS> diff --git a/rt/webrt/Elements/Section b/rt/webrt/Elements/Section new file mode 100755 index 000000000..067311d9e --- /dev/null +++ b/rt/webrt/Elements/Section @@ -0,0 +1,11 @@ +<TABLE WIDTH=100%> +<TR> +<TD> +<font size=+4><%$title%></font> +</TD> +</TR> +</TABLE> + +<%ARGS> +$title => undef +</%ARGS>
\ No newline at end of file diff --git a/rt/webrt/Elements/SelectBoolean b/rt/webrt/Elements/SelectBoolean new file mode 100755 index 000000000..93b78ce76 --- /dev/null +++ b/rt/webrt/Elements/SelectBoolean @@ -0,0 +1,24 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/SelectBoolean,v 1.1 2002-08-12 06:17:08 ivan Exp $ +<SELECT NAME ="<%$Name%>"> +<OPTION VALUE="<%$TrueVal%>" <%$TrueDefault%>><%$True%></OPTION> +<OPTION VALUE="<%$FalseVal%>" <%$FalseDefault%>><%$False%></OPTION> +</SELECT> + +<%ARGS> +$Name => undef +$True => "is" +$Default => 'true' +$TrueVal => 1 +$FalseVal => 0 +$False => "isn't" +</%ARGS> + +<%INIT> +my ($TrueDefault, $FalseDefault); +if ($Default && $Default !~ /true/i) { + $FalseDefault = "SELECTED"; +} +else { + $TrueDefault = "SELECTED"; +} +</%INIT> diff --git a/rt/webrt/Elements/SelectDate b/rt/webrt/Elements/SelectDate new file mode 100755 index 000000000..6fafbf170 --- /dev/null +++ b/rt/webrt/Elements/SelectDate @@ -0,0 +1,25 @@ +<INPUT NAME="<%$Name%>" VALUE="<%$Default%>" size=16> + +<%init> +unless ((defined $Default) or + ($current <= 0)) { + my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = + localtime($current); + $Default = sprintf("%04d-%02d-%02d %02d:%02d", + $year+1900,$mon+1,$mday, + $hour,$min); +} + +unless ($Name) { + $Name = $menu_prefix. "_Date"; +} +</%init> + +<%args> + +$ShowTime => undef +$menu_prefix=>'' +$current=>time +$Default => undef +$Name => undef +</%args> diff --git a/rt/webrt/Elements/SelectDateRelation b/rt/webrt/Elements/SelectDateRelation new file mode 100755 index 000000000..c5849c8e2 --- /dev/null +++ b/rt/webrt/Elements/SelectDateRelation @@ -0,0 +1,14 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/SelectDateRelation,v 1.1 2002-08-12 06:17:08 ivan Exp $ +<SELECT NAME ="<%$Name%>"> +<OPTION VALUE="<"><%$Before%></OPTION> +<OPTION VALUE="="><%$On%></OPTION> +<OPTION VALUE=">"><%$After%></OPTION> +</SELECT> + +<%ARGS> +$Name => undef +$Default => undef +$Before => 'Before' +$On => 'On' +$After => 'After' +</%ARGS> diff --git a/rt/webrt/Elements/SelectDateType b/rt/webrt/Elements/SelectDateType new file mode 100755 index 000000000..65c0e9b4b --- /dev/null +++ b/rt/webrt/Elements/SelectDateType @@ -0,0 +1,12 @@ +<SELECT NAME="<%$Name%>"> +<OPTION VALUE="Created">Created</OPTION> +<OPTION VALUE="Started">Started</OPTION> +<OPTION VALUE="Resolved">Resolved</OPTION> +<OPTION VALUE="Told">Last Contacted</OPTION> +<OPTION VALUE="LastUpdated">Last Updated</OPTION> +<OPTION VALUE="StartsBy">Starts By</OPTION> +<OPTION VALUE="Due">Due</OPTION> +</SELECT> +<%ARGS> +$Name => 'DateType' +</%ARGS> diff --git a/rt/webrt/Elements/SelectEqualityOperator b/rt/webrt/Elements/SelectEqualityOperator new file mode 100755 index 000000000..f93dc1af2 --- /dev/null +++ b/rt/webrt/Elements/SelectEqualityOperator @@ -0,0 +1,18 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/SelectEqualityOperator,v 1.1 2002-08-12 06:17:08 ivan Exp $ +<SELECT NAME ="<%$Name%>"> +% while (my $option = shift @Options) { +% my $value = shift @Values; +<OPTION VALUE="<%$value%>" +% if ($Default eq '$value') { +SELECTED +% } +><%$option%></OPTION> +% } +</SELECT> + +<%ARGS> +$Name => undef +@Options => ('less than', 'equal to', 'greater than', 'not equal to') +@Values => qw(< = > !=) +$Default => undef +</%ARGS> diff --git a/rt/webrt/Elements/SelectKeyword b/rt/webrt/Elements/SelectKeyword new file mode 100644 index 000000000..c4bd9e1aa --- /dev/null +++ b/rt/webrt/Elements/SelectKeyword @@ -0,0 +1,38 @@ +<SELECT NAME=<%$Name%> <%$Size%> <%$Multiple%>> +<OPTION VALUE="">-</OPTION> +<OPTION VALUE="NULL">(empty)</OPTION> +% foreach my $kid ( keys %{$Descendents} ) { +<OPTION VALUE="<% $kid %>" +%if ($kid == $Default) { +SELECTED +%} +><% $Descendents->{$kid} %></OPTION> +% } +</SELECT> + + +<%INIT> + +unless (defined $KeywordObj) { + $KeywordObj = new RT::Keyword($session{'CurrentUser'}); + $KeywordObj->Load($Root); +} +my $Descendents = $KeywordObj->Descendents(); + +if ($Multiple) { + $Multiple = "MULTIPLE"; +} +if ($Size) { + $Size="SIZE=$Size"; +} + + +</%INIT> +<%ARGS> +$Multiple => undef +$Size => undef +$Name => 'Keyword' +$KeywordObj => undef +$Root => 0 +$Default => undef +</%ARGS> diff --git a/rt/webrt/Elements/SelectKeywordOptions b/rt/webrt/Elements/SelectKeywordOptions new file mode 100644 index 000000000..f56dfe52c --- /dev/null +++ b/rt/webrt/Elements/SelectKeywordOptions @@ -0,0 +1,18 @@ +<PERL> +while (my $keyword = $keywords->Next()) { + my ($selected); + if $keyword->Id == $default +</PERL> +<OPTION VALUE="<%$keyword->id%>"><% '-' x $depth %><%$keyword->Name%></OPTION> +<& SelectKeywordOptions, depth => ($depth+1), root => $keyword->id &> +%} +<%INIT> + +my $keywords = new RT::Keywords($session{'CurrentUser'}); +$keywords->LimitToParent($root); + +</%INIT> +<%ARGS> +$root => undef +$depth => 0 +</%ARGS>
\ No newline at end of file diff --git a/rt/webrt/Elements/SelectLinkType b/rt/webrt/Elements/SelectLinkType new file mode 100644 index 000000000..22cde3dff --- /dev/null +++ b/rt/webrt/Elements/SelectLinkType @@ -0,0 +1,16 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/SelectLinkType,v 1.1 2002-08-12 06:17:08 ivan Exp $ + +<SELECT NAME ="<%$Name%>"> +% foreach ('MemberOf', 'DependsOn', 'RefersTo') { # TODO: Merging! +<OPTION VALUE="<%$_%>"><%$_%></OPTION> +% } +</SELECT> + +<%ARGS> +$Name => "LinkType" +$Default => undef +</%ARGS> + +<%INIT> +# TODO handle Default +</%INIT> diff --git a/rt/webrt/Elements/SelectMatch b/rt/webrt/Elements/SelectMatch new file mode 100644 index 000000000..7f3a94fae --- /dev/null +++ b/rt/webrt/Elements/SelectMatch @@ -0,0 +1,31 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/SelectMatch,v 1.1 2002-08-12 06:17:08 ivan Exp $ +<SELECT NAME ="<%$Name%>"> +<OPTION VALUE="LIKE" <%$LikeDefault%>><%$Like%></OPTION> +<OPTION VALUE="NOT LIKE" <%$NotLikeDefault%>><%$NotLike%></OPTION> +<OPTION VALUE="=" <%$TrueDefault%>><%$True%></OPTION> +<OPTION VALUE="!=" <%$FalseDefault%>><%$False%></OPTION> +</SELECT> + +<%ARGS> +$Name => undef +$Like => 'contains' +$NotLike => "doesn't contain" +$True => 'is' +$False => "isn't" +$Default => undef +</%ARGS> +<%INIT> +my ($TrueDefault, $FalseDefault, $LikeDefault, $NotLikeDefault); +if ($Default && $Default !~ /true/i) { + $FalseDefault = "SELECTED"; +} +elsif ($Default && $Default !~ /false/i) { + $TrueDefault = "SELECTED"; +} +elsif ($Default && $Default !~ /notlike/i) { + $NotLikeDefault = "SELECTED"; +} +else { + $LikeDefault = "SELECTED"; +} +</%INIT> diff --git a/rt/webrt/Elements/SelectNewTicketQueue b/rt/webrt/Elements/SelectNewTicketQueue new file mode 100755 index 000000000..9f5cd2871 --- /dev/null +++ b/rt/webrt/Elements/SelectNewTicketQueue @@ -0,0 +1,9 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/SelectNewTicketQueue,v 1.1 2002-08-12 06:17:08 ivan Exp $ +<& SelectQueue, Name => $Name, Verbose => $Verbose, Default => $Default, + ShowAllQueues => 0, ShowNullOption => 0 &> + +<%ARGS> +$Name => 'Queue' +$Verbose => undef +$Default => undef +</%ARGS> diff --git a/rt/webrt/Elements/SelectOwner b/rt/webrt/Elements/SelectOwner new file mode 100755 index 000000000..59ebf3631 --- /dev/null +++ b/rt/webrt/Elements/SelectOwner @@ -0,0 +1,22 @@ +<SELECT NAME="<%$Name%>"> +<OPTION VALUE="">-</OPTION> +<OPTION <% ($RT::Nobody->Id() == $Default) && "SELECTED" %> VALUE="<%$RT::Nobody->Id%>"><%$RT::Nobody->Name%></OPTION> +%while ( my $User = $Users->Next()) { +% if ((!defined $QueueObj) || ($User->HasQueueRight(Right => 'OwnTicket', QueueObj => $QueueObj, TicketObj => $TicketObj))){ +<OPTION VALUE="<%$User->Id()%>" <% ($User->Id() == $Default) && "SELECTED" %>><%$User->Name()%></OPTION> +% } +%} +</SELECT> + +<%INIT> +my $Users = RT::Users->new($session{CurrentUser}); +$Users->LimitToPrivileged; +</%INIT> + +<%ARGS> +$QueueObj => undef +$Name => undef +$Default => undef +$User => undef +$TicketObj => undef +</%ARGS> diff --git a/rt/webrt/Elements/SelectQueue b/rt/webrt/Elements/SelectQueue new file mode 100755 index 000000000..d63b17b4e --- /dev/null +++ b/rt/webrt/Elements/SelectQueue @@ -0,0 +1,38 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/SelectQueue,v 1.1 2002-08-12 06:17:08 ivan Exp $ + +% if ($Lite) { +<INPUT NAME="<%$Name%>" size=25 DEFAULT="<%$d->Name%>"> +% } else { +<SELECT NAME ="<%$Name%>"> +% if ($ShowNullOption) { +<OPTION VALUE="">-</OPTION> +% } +% while (my $queue=$q->Next) { +% if ($ShowAllQueues || $queue->CurrentUserHasRight('CreateTicket')) { +<OPTION VALUE="<%$queue->Id%>" <%($queue->Id == $Default) && 'SELECTED'%>><%$queue->Name%> +% if (($Verbose) and ($queue->Description) ){ +(<%$queue->Description%>) +% } +</OPTION> +% } +% } +</SELECT> +% } +<%ARGS> +$ShowNullOption => 1 +$ShowAllQueues => 1 +$Name => undef +$Verbose => undef +$Default => undef +$Lite => 0 +</%ARGS> + +<%INIT> + +my $q=new RT::Queues($session{'CurrentUser'}); +$q->UnLimit; + +my $d = new RT::Queue($session{'CurrentUser'}); +$d->Load($Default); + +</%INIT> diff --git a/rt/webrt/Elements/SelectResultsPerPage b/rt/webrt/Elements/SelectResultsPerPage new file mode 100644 index 000000000..0699c6868 --- /dev/null +++ b/rt/webrt/Elements/SelectResultsPerPage @@ -0,0 +1,22 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/SelectResultsPerPage,v 1.1 2002-08-12 06:17:08 ivan Exp $ + +%# TODO: Better default handling + +<SELECT NAME ="<%$Name%>"> +% foreach my $value (@values) { +<OPTION VALUE="<%$value%>" <% $value == $Default && 'SELECTED' %>> +<% shift @labels %> +</OPTION> +% } +</SELECT> + +<%INIT> +my @values = qw(0 10 25 50 100); +my @labels = qw(Unlimited 10 25 50 100); +</%INIT> +<%ARGS> + +$Name => undef +$Default => 50 + +</%ARGS> diff --git a/rt/webrt/Elements/SelectSortOrder b/rt/webrt/Elements/SelectSortOrder new file mode 100644 index 000000000..6dc900631 --- /dev/null +++ b/rt/webrt/Elements/SelectSortOrder @@ -0,0 +1,18 @@ +<SELECT NAME="<%$Name%>"> +%foreach my $order (@orders) { +<OPTION VALUE="<%$order%>" <%$order eq $Default && 'SELECTED' %>> +<% shift @order_names %> +</OPTION> +% } +</SELECT> + +<%INIT> +my @orders = qw (ASC DESC); +my @order_names = qw (Ascending Descending); + +</%INIT> + +<%ARGS> +$Name => 'SortOrder' +$Default => 'ASC' +</%ARGS> diff --git a/rt/webrt/Elements/SelectStatus b/rt/webrt/Elements/SelectStatus new file mode 100755 index 000000000..92df7c619 --- /dev/null +++ b/rt/webrt/Elements/SelectStatus @@ -0,0 +1,17 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/SelectStatus,v 1.1 2002-08-12 06:17:08 ivan Exp $ + +<SELECT NAME ="<%$Name%>"> +<OPTION VALUE="">-</OPTION> +%foreach my $status (@status) { +<OPTION VALUE="<%$status%>" <%($Default eq $status) && 'SELECTED'%>><%$status%></OPTION> +% } +</SELECT> +<%ONCE> +my $queue = new RT::Queue($session{'CurrentUser'}); +my @status = $queue->StatusArray(); +</%ONCE> +<%ARGS> +$Name => undef +$Default => undef + +</%ARGS> diff --git a/rt/webrt/Elements/SelectTicketSortBy b/rt/webrt/Elements/SelectTicketSortBy new file mode 100644 index 000000000..02021decc --- /dev/null +++ b/rt/webrt/Elements/SelectTicketSortBy @@ -0,0 +1,15 @@ +<SELECT NAME="<%$Name%>"> +% foreach my $field (@sortfields) { +<OPTION VALUE="<%$field%>" <%$field eq $Default && 'SELECTED'%>><%$field%></OPTION> +% } +</SELECT> + +<%INIT> +my $tickets = new RT::Tickets($session{'CurrentUser'}); +my @sortfields = $tickets->SortFields(); + +</%INIT> +<%ARGS> +$Name => 'SortTicketsBy' +$Default => 'id' +</%ARGS> diff --git a/rt/webrt/Elements/SelectUsers b/rt/webrt/Elements/SelectUsers new file mode 100755 index 000000000..f517d3510 --- /dev/null +++ b/rt/webrt/Elements/SelectUsers @@ -0,0 +1,8 @@ +<select name="UserField"> +<option value="Name">User Id +<option value="EmailAddress">Email +<option value="RealName">Name +<option value="Organization">Organization +</select> +<& /Elements/SelectMatch, Name=> 'UserOp' &> +<input size=8 name="UserString"> diff --git a/rt/webrt/Elements/SelectWatcherType b/rt/webrt/Elements/SelectWatcherType new file mode 100644 index 000000000..5a855192c --- /dev/null +++ b/rt/webrt/Elements/SelectWatcherType @@ -0,0 +1,26 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Elements/Attic/SelectWatcherType,v 1.1 2002-08-12 06:17:08 ivan Exp $ +%# portions Copyright 2000 Tobias Brox <tobix@fsck.com> +%# Request Tracker is Copyright 1996-2000 Jesse Vincent <jesse@fsck.com> + +<SELECT NAME ="<%$Name%>"> +<OPTION VALUE="none">-</OPTION> +%# Make nice options: +%for my $option (@types) { +<OPTION VALUE="<%$option%>" <%$option eq $Default && "SELECTED"%>><%$option%></OPTION> +%} +</SELECT> + +<%INIT> +my @types; +if ($Scope =~ 'queue') { + @types = qw(Cc AdminCc); +} +else { + @types = qw(Requestor Cc AdminCc); +} +</%INIT> +<%ARGS> +$Default=>undef +$Scope => 'ticket' +$Name => 'WatcherType' +</%ARGS> diff --git a/rt/webrt/Elements/ShadedBox b/rt/webrt/Elements/ShadedBox new file mode 100755 index 000000000..334b57975 --- /dev/null +++ b/rt/webrt/Elements/ShadedBox @@ -0,0 +1,5 @@ +<div align="left"><span class=label><%$title |n %></span><br><b><%$content |n %></b></div> +<%ARGS> +$title => undef +$content => " " +</%ARGS> diff --git a/rt/webrt/Elements/Submit b/rt/webrt/Elements/Submit new file mode 100755 index 000000000..7b75e9e98 --- /dev/null +++ b/rt/webrt/Elements/Submit @@ -0,0 +1,44 @@ +<TABLE WIDTH=100% BGCOLOR="<%$color%>" CELLSPACING=0 BORDER=0 CELLPADDING=0 > +<TR> +% if ($Reset) { +<TD> +<FONT COLOR=#ffd800 > +<INPUT TYPE=RESET VALUE="<%$ResetLabel%>"> +</FONT> +</TD> +%} +<TD> + +</TD> +<TD ALIGN=RIGHT VALIGN=CENTER> + +<FONT COLOR=#ffd800> + +% if ($AlternateLabel) { +<B><%$AlternateCaption%> +<INPUT TYPE=SUBMIT +%if ($Name) { +NAME="<%$Name%>" +%} +VALUE='<%$AlternateLabel%>'></B> +% } + +<B><%$Caption%> +<INPUT TYPE=SUBMIT +%if ($Name) { +NAME="<%$Name%>" +% } + VALUE='<%$Label%>'></B></FONT> +</TD> +</TR> +</TABLE> +<%ARGS> +$color => "#336699" +$Caption => undef +$AlternateCaption => undef +$AlternateLabel => undef +$Label => 'Submit' +$Name => undef +$Reset => undef +$ResetLabel => 'Reset' +</%ARGS> diff --git a/rt/webrt/Elements/Tabs b/rt/webrt/Elements/Tabs new file mode 100755 index 000000000..6eacf391a --- /dev/null +++ b/rt/webrt/Elements/Tabs @@ -0,0 +1,133 @@ +<TABLE WIDTH=100%> + <TR> + <TD VALIGN=TOP> + <TABLE cellspacing=1> + <TR> +% foreach $tab (sort keys %{$toptabs}) { + <TD ALIGN=CENTER> + <font size=+1> + [<A +% if ($current_toptab eq $toptabs->{$tab}->{'path'}) { +class='currenttab' +% } + HREF="<%$RT::WebPath%>/<% $toptabs->{$tab}->{'path'}%>"><% $toptabs->{$tab}->{'title'}%></A>] + + + </font> + </TD> +% } + </TR> + </TABLE> +<BR> +% if ($tabs_scalar) { +<% $tabs_scalar |n%> +% } +% if ($tabs) { + + <TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0> + <TR> +% foreach $tab (sort keys %{$tabs}) { + <TD ALIGN=CENTER VALIGN=TOP> +[<A +% if ($current_tab eq $tabs->{$tab}->{'path'}) { +class='currenttab' +% } +HREF="<%$RT::WebPath%>/<% $tabs->{$tab}->{'path'}%>"><% $tabs->{$tab}->{'title'}%></A>]</TD> +%} + </TR> + </TABLE> +%} + +<BR> +% if ($subtabs_scalar) { +<% $subtabs_scalar |n%> +% } +% if ($subtabs) { + <TABLE> + <TR> +% foreach $tab (sort keys %{$subtabs}) { + <TD ALIGN=CENTER> + [<A HREF="<%$RT::WebPath%>/<% $subtabs->{$tab}->{'path'}%>"><% $subtabs->{$tab}->{'title'}%></A>] + </TD> +%} + </TR> + </TABLE> +%} + </TD> + <TD VALIGN=TOP ALIGN=RIGHT> +<TABLE> +<TR> + +% foreach $action (sort keys %{$topactions}) { +<TD><font size=-1><%$topactions->{"$action"}->{'html'} |n %></font></TD> +% } +</TR> +</TABLE> + + + +% if ($actions) { +<TABLE><TR> +% foreach $action (sort keys %{$actions}) { +<TD> +<FONT SIZE=-1> +% if ($actions->{"$action"}->{'html'}) { +<%$actions->{"$action"}->{'html'} |n%> +% } else { +<A HREF="<%$RT::WebPath%>/<% $actions->{$action}->{'path'}%>"><% $actions->{$action}->{'title'}%></A> +% } +</FONT> +</TD> +% } +</TR></TABLE> +% } + +% if ($subactions_scalar) { +<% $subactions_scalar |n%> +% } +% if ($subactions) { +<BR>| +% foreach $action (sort keys %{$subactions}) { +<%$subactions->{"$action"}->{'html'} |n%> | +% } +% } + </TD> + </TR> + </TABLE> + + +<%INIT> +my ($tab, $action); +my $toptabs = { A => { title => 'Home', + path => '', + }, + B => { title => 'Search', + path => 'Search/Listing.html' + }, + + D => { title => 'Configuration', + path => 'Admin/' + } + }; + + +my $topactions = { + A => { html => $m->scomp('/Elements/CreateTicket') + }, + B => { html => $m->scomp('/Elements/GotoTicket') + } + }; +</%INIT> +<%ARGS> +$current_toptab => "none" +$current_tab => "none" +$current_subtab => "none" +$tabs => undef +$tabs_scalar => undef +$subtabs => undef +$actions => undef +$subactions => undef +$subtabs_scalar => undef +$subactions_scalar => undef +</%ARGS> + diff --git a/rt/webrt/Elements/TitleBoxEnd b/rt/webrt/Elements/TitleBoxEnd new file mode 100755 index 000000000..bdd41065a --- /dev/null +++ b/rt/webrt/Elements/TitleBoxEnd @@ -0,0 +1,10 @@ +</TD></TR></TABLE> +</TD> +</TR> +<TR><TD COLSPAN=4><IMG SRC="<%$RT::WebImagesURL%>spacer.gif" height=1 ALT=" "width=1></TD> +</TABLE> +<%ARGS> +$title => undef +$content => undef +</%ARGS> + diff --git a/rt/webrt/Elements/TitleBoxStart b/rt/webrt/Elements/TitleBoxStart new file mode 100755 index 000000000..6d0f1f91a --- /dev/null +++ b/rt/webrt/Elements/TitleBoxStart @@ -0,0 +1,20 @@ +<TABLE CLASS="<%$class%>" BGCOLOR="<%$color%>" CELLSPACING=0 BORDER=0 CELLPADDING=0 WIDTH="<%$width%>"> +<TR><TD ROWSPAN=2><IMG SRC="<%$RT::WebImagesURL%>spacer.gif" width=1 height=1 ALT=""></TD> +<TD valign=middle align=left bgcolor="<%$color%>"> <font size=-1 color="#ffffff"><b><% $title_href && "<A CLASS=\"$title_class\" HREF=\"$title_href\">"|n%><%$title |n %><% $title_href && "</A>" |n%></b></font></TD> +<TD ALIGN="right" valign=middle bgcolor="<%$color%>"><FONT color="#ffffff" SIZE=-1><%$titleright |n %></FONT> </TD> +<TD ROWSPAN=2><IMG SRC="<%$RT::WebImagesURL%>spacer.gif" width=1 height=1 ALT=""></TD></TR> +<TR><TD COLSPAN=2 bgcolor="<%$contentbg%>" valign=top align=left WIDTH=100%> +<TABLE CELLPADDING=2 WIDTH=100%><TR><TD> +<%ARGS> +$width => "100%" +$class => undef + +$title_href => undef +$title => undef +$title_class => undef + +$titleright_href => undef +$titleright => undef +$contentbg => "#dddddd" +$color => "#336699" +</%ARGS> diff --git a/rt/webrt/Elements/ViewUser b/rt/webrt/Elements/ViewUser new file mode 100644 index 000000000..92446e6ef --- /dev/null +++ b/rt/webrt/Elements/ViewUser @@ -0,0 +1,29 @@ + +<& /Elements/TitleBoxStart, + title => "<a class='inverse' href=\"$RT::WebPath/Search/Listing.html?LimitRequestorById=1&IdOfRequestor=".$User->id."\">Tickets from $name</a>", + titleright=> "<a class='inverse' href=\"$RT::WebPath/EditUserComments.html?id=".$User->id."\">Comments about $name</a>" &> +<TABLE WIDTH="100%"> +<tr> +<td halign=left valign=top> +%while (my $w=$tickets->Next) { +<%$w->Id%>: <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$w->id%>"><%$w->Subject%></a> (<%$w->Status%>)<BR> +%} +</td> +<td align=right valign=top> + <% ($User->Comments || "No comment entered about this user") %> +</tr> +</table> +<& /Elements/TitleBoxEnd &> + +<%ARGS> +$User=>undef +</%ARGS> + +<%INIT> +my $name=$User->RealName || $User->EmailAddress; + +my $tickets = new RT::Tickets($session{'CurrentUser'}); +$tickets->LimitRequestor(VALUE => $User->EmailAddress); + + +</%INIT> diff --git a/rt/webrt/Elements/dayMenu b/rt/webrt/Elements/dayMenu new file mode 100755 index 000000000..6591b05d2 --- /dev/null +++ b/rt/webrt/Elements/dayMenu @@ -0,0 +1,19 @@ +<%doc>------------------------------------------------------------------- +dayMenu: Display a pulldown menu of days of the month (1 to 31) + +Optional arguments: +$menu_name - Name of menu, defaults to 'day' +$current - Selected day value (1 to 31) +-------------------------------------------------------------------</%doc> + +<select name="<% $menu_name %>"> +<option value="-1">- +% foreach my $day (1..31) { +<option value="<% $day %>" <% $day==$current ? "selected" : "" %>><% sprintf("%02d",$day) %> +% } +</select> + +<%args> +$menu_name=>'day' +$current=>undef +</%args> diff --git a/rt/webrt/Elements/monthMenu b/rt/webrt/Elements/monthMenu new file mode 100755 index 000000000..b9a71d3f9 --- /dev/null +++ b/rt/webrt/Elements/monthMenu @@ -0,0 +1,37 @@ +<%doc>------------------------------------------------------------------- +monthMenu: Display a pulldown menu of months + +Optional arguments: +$menu_name - Name of menu, defaults to 'month' +$current - Selected month value (1 to 12) +$format - Choice of month labels: + 'full' (January, February, ...) + 'short' (Jan, Feb, ...) + 'numeric' (1, 2, ...) + Defaults to 'full'. The format only affects appearance; the menu + values are always numeric. +-------------------------------------------------------------------</%doc> + +<select name="<% $menu_name %>"> +<option value="-1">- +% foreach my $month (1..12) { +<option value="<% $month %>" <% $month==$current ? "selected" : "" %>> +% if ($format eq 'full') { +<% $month_names[$month-1] %> +% } elsif ($format eq 'short') { +<% substr($month_names[$month-1],0,3) %> +% } elsif ($format eq 'numeric') { +<% sprintf("%02d",$month) %> +% } +% } +</select> + +<%init> +my @month_names = qw(January February March April May June July August September October November December); +</%init> + +<%args> +$menu_name=>'month' +$current=>undef +$format=>'full' +</%args> diff --git a/rt/webrt/Elements/yearMenu b/rt/webrt/Elements/yearMenu new file mode 100755 index 000000000..4a0e7a772 --- /dev/null +++ b/rt/webrt/Elements/yearMenu @@ -0,0 +1,24 @@ +<%doc>------------------------------------------------------------------- +yearMenu: Display a pulldown menu of years. + +Optional arguments: +$menu_name - Name of menu, defaults to 'year' +$current - Selected year value +$min - Minimum year appearing in menu; defaults to current year +$max - Maximum year appearing in menus; defaults to $min plus 10. +-------------------------------------------------------------------</%doc> + +<select name="<% $menu_name %>"> +<option value="-1">- +% foreach my $year ($min..$max) { +<option value="<% $year %>" <% $year==$current ? "selected" : "" %>> +<% $year %> +% } +</select> + +<%args> +$menu_name=>'year' +$current=>(localtime)[5]+1900 +$min=>(localtime)[5]+1900-1 +$max=>$min+10 +</%args> diff --git a/rt/webrt/NoAuth/Logout.html b/rt/webrt/NoAuth/Logout.html new file mode 100755 index 000000000..a00ae9675 --- /dev/null +++ b/rt/webrt/NoAuth/Logout.html @@ -0,0 +1,22 @@ +<HTML> +<HEAD> +<TITLE>RT: Logout</TITLE> + <META HTTP-EQUIV="Refresh" CONTENT="0;URL=<%$RT::WebPath%>/"> +</HEAD> +<BODY> +<p>You have been logged out of RT. + + +<br> +<br> +<A HREF="<%$RT::WebPath%>/">You're welcome to login again</a> + + +<%PERL> +if (defined %session) { + %session = undef; +} +$m->abort(); +</%PERL> + + diff --git a/rt/webrt/NoAuth/Reminder.html b/rt/webrt/NoAuth/Reminder.html new file mode 100755 index 000000000..a814a912f --- /dev/null +++ b/rt/webrt/NoAuth/Reminder.html @@ -0,0 +1,3 @@ +<& /Elements/Header, title => 'Password Reminder' &> + +Not yet implemented. diff --git a/rt/webrt/NoAuth/images/rt.jpg b/rt/webrt/NoAuth/images/rt.jpg Binary files differnew file mode 100644 index 000000000..a137a932b --- /dev/null +++ b/rt/webrt/NoAuth/images/rt.jpg diff --git a/rt/webrt/NoAuth/images/spacer.gif b/rt/webrt/NoAuth/images/spacer.gif Binary files differnew file mode 100644 index 000000000..5bfd67a2d --- /dev/null +++ b/rt/webrt/NoAuth/images/spacer.gif diff --git a/rt/webrt/NoAuth/webrt.css b/rt/webrt/NoAuth/webrt.css new file mode 100755 index 000000000..a71d05720 --- /dev/null +++ b/rt/webrt/NoAuth/webrt.css @@ -0,0 +1,102 @@ +BODY, TD {font-family: Helvetica, Arial, sans-serif} +TD {border-color: #cccccc } + +BLOCKQUOTE.message { + font-size: 80%; + font-family: "Helvetica", sans-serif; +} + + +BODY { + color: #000; + background: #FFFFFF; + font-family: "Helvetica", sans-serif; + + +} + +TD, TH { /* ns workaround */ + font-family: "Helvetica", sans-serif; +} + +TR.oddline { + background-color : #eeeeee; +} + +H1, H2, H3 { + margin-top: 0.2em; + color: #336699; + font-family: "Helvetica", sans-serif; + + clear: both; +} + + +DIV.endmatter { margin-left: -7% } + + + +A { font-weight: bold; + color: #000000; + /* border: none -- breaks NS 4.x */ } + +.currenttab { background-color: #cccccc; } + +.inverse { color: #ffffff; } + + + +A:link IMG, A:visited IMG { border-style: none } + +A IMG { color: white } /* The only way to hide the border in NS 4.x */ + +.hide { + display: none; + color: white; +} + +SPAN.date { font-size: 0.8em } + +SPAN.attribution { + font-weight: bold +} + +SPAN.label { font-size: 0.8em; +} + +BLOCKQUOTE { + font-style: italic; + /* color: #990; */ +} + +ADDRESS { + text-align: right; + font-weight: bold; + font-style: italic +} + +BLOCKQUOTE P { /* Try to avoid space above the attribution */ + margin-bottom: 0; +} +BLOCKQUOTE ADDRESS { + margin: 0; +} + +.motto, .motto A {font: italic 120%/1.3 Georgia, serif; color: #990} + +.emphasized { + font-weight: bold +} + +/* Why o why does this break Netscape 4.x? +IMG { + border: none +} +*/ + +P.map-also { font-style: italic; margin-left: 15%; text-align: right } + +.oddline { +background-color : #eeeeee; + +} diff --git a/rt/webrt/Search/Bulk.html b/rt/webrt/Search/Bulk.html new file mode 100755 index 000000000..ac688d7cd --- /dev/null +++ b/rt/webrt/Search/Bulk.html @@ -0,0 +1,186 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Search/Attic/Bulk.html,v 1.1 2002-08-12 06:17:09 ivan Exp $ +%# Copyright 1996-2001 Jesse Vincent <jesse@fsck.com> +<& /Elements/Header, Title => "Bulk ticket update" &> +<& /Elements/Tabs &> + +<& /Elements/ListActions, actions => \@results &> + +<FORM METHOD=POST> +<TABLE WIDTH=100% border=0 cellpadding=3 CELLSPACING=0> +<TR> +<TH>Update</TH> +%foreach my $col (@cols) { +% my $colalias = $col; +% $colalias =~ s/(Obj\-\>|)(Name|AsString)//; + +<TH ><% $colalias %> </TH> +%} +</TR> + +<%PERL> + +my $i; + + + +$session{'tickets'}->RedoSearch(); +while (my $Ticket = $session{'tickets'}->Next) { + $i++; + if ($i % 2) { + $bgcolor = "#dddddd"; + } + else { + $bgcolor = "#ffffff"; + } + </%PERL> +<TR bgcolor="<%$bgcolor%>"> +<TD><input type=checkbox name="UpdateTicket<%$Ticket->Id%>" CHECKED></TD> +%# The ticket view is controlled by config.pm, WebOptions +%foreach my $col (@cols) { +<TD> +% if ($col eq 'id') { +<A HREF="<% $RT::WebPath%>/Ticket/Display.html?id=<%$Ticket->Id%>"><%$Ticket->Id()%></A> +% } +%else { +<% eval "\$Ticket->$col()" %> +%} +</TD> +%} +</TR> +%} + + + +</TABLE> + +<HR> + + +<& /Elements/TitleBoxStart, title => 'Update selected tickets' &> +<TABLE> +<TR> +<TD VALIGN=TOP> +<UL> +<li> Make Owner <& /Elements/SelectOwner, Name => "Owner" &> +(<input type=checkbox name="ForceOwnerChange"> Force change) +<li> Add Requestor <INPUT Name="AddRequestor" SIZE=20> +<li> Remove Requestor <INPUT Name="DeleteRequestor" SIZE=20> +<li> Add Cc <INPUT Name="AddCc" SIZE=20> +<li> Remove Cc <INPUT Name="DeleteCc" SIZE=20> +<li> Add AdminCc <INPUT Name="AddAdminCc" SIZE=20> +<li> Remove AdminCc <INPUT Name="DeleteAdminCc" SIZE=20> +</UL> +</TD> +<TD VALIGN=TOP> +<UL> +<li> Make subject <INPUT Name="Subject" SIZE=20> +<li> Make priority <INPUT Name="Priority" SIZE=4> +<li> Make queue <& /Elements/SelectQueue, Name => "Queue" &> + +<li>Make Status <& /Elements/SelectStatus, Name => "Status" &> + + + +<li> Make date Starts <& /Elements/SelectDate, Name => "Starts_Date", ShowTime => 0, Default => '' &> +<li> Make date Started <& /Elements/SelectDate, Name => "Started_Date", ShowTime => 0, Default => '' &> +<li> Make date Told <& /Elements/SelectDate, Name => "Told_Date", ShowTime => 0, Default => '' &> +<li> Make date Due <& /Elements/SelectDate, Name => "Due_Date", ShowTime => 0, Default => '' &> +<li> Make date Resolved <& /Elements/SelectDate, Name => "Resolved_Date", ShowTime => 0, Default => '' &> + + +% while ( my $KeywordSelect = $KeywordSelects->Next ) { + +<li> Add <% $KeywordSelect->Name %> <& /Elements/SelectKeyword, Name => "AddToKeywordSelect".$KeywordSelect->id, KeywordObj => $KeywordSelect->KeywordObj &> +<li> Remove <% $KeywordSelect->Name %> <& /Elements/SelectKeyword, Name => "DeleteFromKeywordSelect".$KeywordSelect->id, KeywordObj => $KeywordSelect->KeywordObj &> +% } + +</UL> + + +</TD> +</TR> +</table> +<& /Elements/TitleBoxEnd&> +<& /Elements/TitleBoxStart, title => 'Add comments or replies to selected tickets' &> +<table> +<tr><td align=right>Update Type:</td> +<td><select name="UpdateType"> + <option value="private" >Comments (not sent to requestors)</option> +<option value="response" >Response to requestors</option> +</select> +</td></tr> +<tr><td align=right>Subject:</td><td> <input name="UpdateSubject" size=60 value=""></td></tr> + <tr><td align=right>Attach:</td><td><input name="UpdateAttachment" type="file"></td></tr> + <tr><td colspan="2"> + <& /Elements/MessageBox, Name=>"UpdateContent"&> + </td></tr> + </table> +<& /Elements/TitleBoxEnd &> + + + + +<& /Elements/Submit &> + + +</FORM> +<%INIT> + +# Iterate through the ARGS hash and remove anything with a null value. +map ($ARGS{$_} =~ /^$/ && (delete $ARGS{$_}), keys %ARGS); + +my ($bgcolor, @results); +my @cols = qw(id Status Priority Subject QueueObj->Name OwnerObj->Name RequestorsAsString DueAsString ); + +Abort("No search to operate on.") unless ($session{'tickets'}); + + +my $do_comment_reply=0; +# Prepare for ticket updates +$ARGS{'UpdateContent'} =~ s/\r\n/\n/g; +chomp ($ARGS{'UpdateContent'}) ; + +if ($ARGS{'UpdateContent'} && + $ARGS{'UpdateContent'} ne '' && + $ARGS{'UpdateContent'} ne "-- \n" . + $session{'CurrentUser'}->UserObj->Signature) { + $do_comment_reply=1; +} + +my $KeywordSelects = new RT::KeywordSelects $session{'CurrentUser'}; +foreach ( $session{'tickets'}->RestrictionValues('Queue') ) { + $KeywordSelects->LimitToQueue($_); +} + +$KeywordSelects->IncludeGlobals; + + +#Iterate through each ticket we've been handed + +while (my $Ticket = $session{'tickets'}->Next) { + $RT::Logger->debug( "Checking Ticket ".$Ticket->Id ."\n"); + next unless ($ARGS{"UpdateTicket".$Ticket->Id}); + $RT::Logger->debug ("Matched\n"); + #Update the basics. + my @basicresults = ProcessTicketBasics(TicketObj => $Ticket, ARGSRef => \%ARGS); + my @dateresults = ProcessTicketDates(TicketObj => $Ticket, ARGSRef => \%ARGS); + my @watchresults = ProcessTicketWatchers(TicketObj => $Ticket, ARGSRef => \%ARGS); + my @selectresults = ProcessTicketObjectKeywords(TicketObj => $Ticket, ARGSRef => \%ARGS); + + + my @updateresults; + if ($do_comment_reply) { + ProcessUpdateMessage(TicketObj => $Ticket, ARGSRef => \%ARGS, Actions => \ +@updateresults); + } + my @tempresults = (@watchresults, @basicresults, @dateresults, @updateresults); + @tempresults = map { "Ticket ".$Ticket->Id. ": ".$_ } @tempresults; + + + #Update the keyword selects + #Update the watchers + $RT::Logger->debug(join("\n",@tempresults)); + @results = (@results, @tempresults); +} + +</%INIT> diff --git a/rt/webrt/Search/Listing.html b/rt/webrt/Search/Listing.html new file mode 100755 index 000000000..da927fec7 --- /dev/null +++ b/rt/webrt/Search/Listing.html @@ -0,0 +1,134 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Search/Attic/Listing.html,v 1.1 2002-08-12 06:17:09 ivan Exp $ +%# Copyright 1996-2001 Jesse Vincent <jesse@fsck.com> +<& /Elements/Header, Title => "Search", Refresh => $session{'tickets_refresh_interval'} &> +<& /Elements/Tabs, current_toptab => 'Search/Listing.html' &> + + +% unless ($ARGS{'Action'} eq 'Refine') { +<TABLE WIDTH=100% border=0 cellpadding=3 CELLSPACING=1> +<TR> +%foreach my $col (@{Config(\%ARGS, 'QueueListingCols')}) { +<TH> + +<%PERL> +my ($order); + my $attr = $col->{'TicketAttribute'}; + $attr =~ s/Obj->(Name|AsString|AgeAsString)//g; + if ($session{'tickets_sort_order'} =~ /^asc$/i) { + $order = 'DESC'; + } else { + $order = 'ASC'; + } +</%PERL> + +% if (grep (/^$attr$/i, $session{'tickets'}->SortFields)) { +<A +% if ($attr eq $session{'tickets_sort_by'}) { +class="currenttab" +% } +HREF="<% $RT::WebPath%>/Search/Listing.html?Bookmark=<%$session{'tickets'}->FreezeLimits()|u%>&TicketsSortBy=<%$attr%>&TicketsSortOrder=<%$order%>&RowsPerPage=<%$session{'tickets_rows_per_page'}%>"> +<%$col->{Header}%> +</A> +% } else { +<% $col->{Header} %> +% } +</TH> +%} +</TR> + +<%PERL> + +my $i; + +$session{'tickets'}->RedoSearch(); +while (my $Ticket = $session{'tickets'}->Next) { + $i++; + if ($i % 2) { + $bgcolor = "#dddddd"; + } + else { + $bgcolor = "#ffffff"; + } + </%PERL> +<TR bgcolor="<%$bgcolor%>" > +%# The ticket view is controlled by config.pm, WebOptions +%foreach my $col (@{Config(\%ARGS,'QueueListingCols')}) { +<TD><& TicketCell , Ticket=>$Ticket, Column=>$col &></TD> +%} +</TR> +%} + + + +</TABLE> + +<div align=center> +<font size=2> +<a href="Listing.html?GotoPage=1">First page</a> + +<a href="Listing.html?GotoPage=Prev"><Previous page</a> + +<a href="Listing.html?GotoPage=Next">Next page></a> +%# <form method=get action="Listing.html">Goto page <input name=GotoPage size=2></form> +</font> +</div> +% if ($session{'tickets'}->Count()) { +<div align=right> +<a href="Bulk.html">Update all these tickets at once</a> +</div> +% } +<HR> + +% } #endif {$ARGS{'Action'} eq 'Refine') +<TABLE WIDTH="100%"> +<TR> +<TD VALIGN="TOP"> +<& /Elements/TitleBoxStart, title => 'Search Criteria'&> + +<A HREF="<% $RT::WebPath%>/Search/Listing.html?ClearRestrictions=1">New search</a><br> +<A HREF="<% $RT::WebPath%>/Search/Listing.html?Bookmark=<%$session{'tickets'}->FreezeLimits()|u%>&TicketsSortBy=<%$session{'tickets_sort_by'}%>&TicketsSortOrder=<%$session{'tickets_sort_order'}%>&RowsPerPage=<%$session{'tickets_rows_per_page'}%>">Bookmarkable URL for this search</a> +<BR> +<BR> +% my %restrictions=$session{'tickets'}->DescribeRestrictions(); +% my %seen_restrictions=(); +% foreach $row (keys %restrictions){ +% my $tmp=$restrictions{"$row"}; +% if( ! defined( $seen_restrictions{"$tmp"} ) ){ +<%$restrictions{"$row"}%> <A HREF="<% $RT::WebPath%>/Search/Listing.html?DeleteRestriction=<%$row%>">[delete]</a><br> +% } else { +% $session{'tickets'}->DeleteRestriction($row); +<b>Deleted Duplicate Restriction <i><%$tmp%></i></b><br> +% } +% $seen_restrictions{"$tmp"}++; +%} +<& /Elements/TitleBoxEnd&> +</TD> +<TD> + +<& PickRestriction &> + +</TD> +</TR> +</TABLE> + +<%INIT> + +my $bgcolor; +require RT::Interface::Web; + +$session{'i'}++; +if ($session{'tickets'}) { + if ( ($ARGS{'ClearRestrictions'}) || + ($ARGS{'NewSearch'}) ) { + $session{'tickets'}->ClearRestrictions; + } + + if ($ARGS{'DeleteRestriction'}) { + $session{'tickets'}->DeleteRestriction($ARGS{'DeleteRestriction'}); + } +} +&ProcessSearchQuery(ARGS=>\%ARGS); + +my $row; + +</%INIT> diff --git a/rt/webrt/Search/PickRestriction b/rt/webrt/Search/PickRestriction new file mode 100755 index 000000000..82f576c1f --- /dev/null +++ b/rt/webrt/Search/PickRestriction @@ -0,0 +1,112 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Search/Attic/PickRestriction,v 1.1 2002-08-12 06:17:09 ivan Exp $ +<FORM ACTION="Listing.html" METHOD="GET"> +<INPUT TYPE=HIDDEN NAME="Bookmark" VALUE="<% $session{'tickets'}->FreezeLimits()|u %>"> +<& /Elements/TitleBoxStart, title => 'Refine Search'&> +<INPUT TYPE=HIDDEN NAME="CompileRestriction" VALUE=1> + +<ul> +<li>Owner is <& /Elements/SelectBoolean, Name => "OwnerOp", + TrueVal=> '=', + FalseVal => '!=' +&> +<& /Elements/SelectOwner, Name => "ValueOfOwner" &> + +<li> +Requestor email address +<& /Elements/SelectMatch, Name => "RequestorOp" &> +<INPUT Name="ValueOfRequestor" SIZE=20> + +<li> +Subject <& /Elements/SelectMatch, Name => "SubjectOp" &> +<INPUT Name="ValueOfSubject" SIZE=20> + +<li>Queue <& /Elements/SelectBoolean, Name => "QueueOp" , + True => "is", + False => "isn't", + TrueVal=> '=', + FalseVal => '!=' &> +<& /Elements/SelectQueue, Name => "ValueOfQueue" &> + + +<li>Priority <& /Elements/SelectEqualityOperator, Name => "PriorityOp" &> + +<INPUT Name="ValueOfPriority" SIZE=5> + + +<li> +<& /Elements/SelectDateType, Name => 'DateType' &> +<& /Elements/SelectDateRelation, Name=>"DateOp" &> +<& /Elements/SelectDate, Name => "ValueOfDate", ShowTime => 0, Default => '' &> + +<li>Ticket content +<& /Elements/SelectBoolean, Name => "ContentOp", + True => "matches", + False => "does not match", + TrueVal => 'LIKE', + FalseVal => 'NOT LIKE' +&> +<Input Name="ValueOfContent" Size=20> + +<li>Status +<& /Elements/SelectBoolean, Name => "StatusOp", + True => "is", + False => "isn't", + TrueVal=> '=', + FalseVal => '!=' +&> +<& /Elements/SelectStatus, Name => "ValueOfStatus" &> + +% while ( my $KeywordSelect = $KeywordSelects->Next ) { + +<li><% $KeywordSelect->Name %> + <& /Elements/SelectBoolean, Name => "KeywordSelectOp". $KeywordSelect->id, + True => "is", False => "isn't", + TrueVal=> '=', FalseVal => '!=' &> + +<& /Elements/SelectKeyword, Name => "KeywordSelect".$KeywordSelect->id, + KeywordObj => $KeywordSelect->KeywordObj + &> +% } + +</UL> + +<& /Elements/TitleBoxEnd &> + +<& /Elements/TitleBoxStart, title => 'Ordering and sorting'&> + +<UL> + +<li>Results per page <& /Elements/SelectResultsPerPage, Name => "RowsPerPage", + Default => $session{'tickets_rows_per_page'} || '50' +&> + +<li>Sort results by <& /Elements/SelectTicketSortBy, Name => "TicketsSortBy", + Default => $session{'tickets_sort_by'} +&> +<& /Elements/SelectSortOrder, Name => 'TicketsSortOrder', Default => $session{'tickets_sort_order'} &> + +<li> <& /Elements/Refresh, Name => 'RefreshSearchInterval' , Default => $session{'tickets_refresh_interval'} &> + + +</UL> + + +</DIV> + + + +<& /Elements/TitleBoxEnd &> + +<& /Elements/Submit, Label => 'Show Results', AlternateLabel => 'Refine', Name => 'Action'&> + +</FORM> + + + <%INIT> + my $KeywordSelects = new RT::KeywordSelects $session{'CurrentUser'}; + foreach ( $session{'tickets'}->RestrictionValues('Queue') ) { + $KeywordSelects->LimitToQueue($_); + } + + $KeywordSelects->IncludeGlobals; +</%INIT> diff --git a/rt/webrt/Search/RestrictSearch.html b/rt/webrt/Search/RestrictSearch.html new file mode 100755 index 000000000..977308e3b --- /dev/null +++ b/rt/webrt/Search/RestrictSearch.html @@ -0,0 +1,3 @@ +<& /Elements/Header, Title=>"Compile Restrictions" &> +<& /Elements/Tabs &> +<& PickRestriction &> diff --git a/rt/webrt/Search/TicketCell b/rt/webrt/Search/TicketCell new file mode 100644 index 000000000..aaded88e9 --- /dev/null +++ b/rt/webrt/Search/TicketCell @@ -0,0 +1,28 @@ +%#$Header: /home/cvs/cvsroot/freeside/rt/webrt/Search/Attic/TicketCell,v 1.1 2002-08-12 06:17:09 ivan Exp $ +<% $link |n%><%$Column->{Constant} || eval("\$Ticket->$Column->{TicketAttribute}") || "-" %><% $endlink|n %> +<%INIT> + +my $link = ""; +my $endlink = ""; +if ($Column->{TicketLink}) { + $link = "<A HREF=\""; + if ($Column->{TicketLink} == 1 ) { + $link .= "../Ticket/Display.html?"; + } + else { + $link .= $Column->{TicketLink}; + } + + $link .= "id=".$Ticket->Id . $Column->{ExtraLinks}; + + if ($session{NewWindowOption}) { + $link .= "TARGET=\"TicketDisplay".$session{AlwaysNewWindowOption} && (time() . rand(1024))."\" "; + } + $link .= "\">"; + $endlink = "</a>"; +} +</%INIT> +<%ARGS> +$Ticket => undef +$Column => undef +</%ARGS> diff --git a/rt/webrt/SelfService/Attachment/dhandler b/rt/webrt/SelfService/Attachment/dhandler new file mode 100644 index 000000000..0d646cc0b --- /dev/null +++ b/rt/webrt/SelfService/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/SelfService/Closed.html b/rt/webrt/SelfService/Closed.html new file mode 100644 index 000000000..a35936092 --- /dev/null +++ b/rt/webrt/SelfService/Closed.html @@ -0,0 +1,4 @@ +<& /SelfService/Elements/Header, title => 'RT Self Service / Closed Tickets' &> + +<& /SelfService/Elements/MyRequests, status => ['resolved'], friendly_status => +'closed' &> diff --git a/rt/webrt/SelfService/Create.html b/rt/webrt/SelfService/Create.html new file mode 100755 index 000000000..60110cb5a --- /dev/null +++ b/rt/webrt/SelfService/Create.html @@ -0,0 +1,63 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/SelfService/Attic/Create.html,v 1.1 2002-08-12 06:17:09 ivan Exp $ +%# Copyright 1996-2001 Jesse Vincent <jesse@fsck.com> + +<& Elements/Header, Title => "Create a request" &> + + +<FORM ACTION="Display.html" METHOD="POST" ENCTYPE="multipart/form-data"> +<INPUT TYPE=HIDDEN Name="id" VALUE="new"> +<& /Elements/TitleBoxStart, contentbg => "#cccccc", title => "Create a new ticket" &> + +<TABLE> +<TR> +<TD> +Queue: +</TD> +<TD> +<& /Elements/SelectNewTicketQueue, Verbose => 'True' &> +</TD> +</TR> +<TR> +<TD> +Requestors: +</TD> +<TD> +<INPUT Name="Requestors" Value="<%$session{CurrentUser}->EmailAddress%>" SIZE=20> +</TD> +</TR> +<TR> +<TD> +Cc: +</TD> +<TD> + <INPUT NAME="Cc" SIZE=20> +</TD> +</TR> +<TR> +<TD> +Subject: +</TD> +<TD> +<INPUT Name="Subject" SIZE=60 MAXSIZE=100 value=""> +</TD> +</TR> +<TR> +<TD> +Attach file: +</TD> +<TD> +<INPUT Name="Attach" type=file> +</TD> +</TR> +<TR> +<TD COLSPAN=2> +Describe the issue below:<br> +<& /Elements/MessageBox &> +</TD> +</TR> +</TABLE> +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit, Label => "Create ticket"&> + + +</FORM> diff --git a/rt/webrt/SelfService/Display.html b/rt/webrt/SelfService/Display.html new file mode 100755 index 000000000..2d44f148e --- /dev/null +++ b/rt/webrt/SelfService/Display.html @@ -0,0 +1,190 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/SelfService/Attic/Display.html,v 1.1 2002-08-12 06:17:09 ivan Exp $ +%# Copyright 1996-2001 Jesse Vincent <jesse@fsck.com> + +<& /SelfService/Elements/Header, Title => 'Display ticket #'.$Ticket->id &> + + +<& /Elements/ListActions, actions => \@results &> + +<TABLE> + <TR> + <TD VALIGN=TOP WIDTH="20%" ALIGN=RIGHT> + Ticket Id + </TD> + <TD> + <%$Ticket->Id%> + </TD> + </TR> + <TR> + <TD VALIGN=TOP WIDTH="20%" ALIGN=RIGHT> + Requestors + </TD> + <TD> + <%$Ticket->RequestorsAsString%> + </TD> + </TR> + <TR> + <TD VALIGN=TOP WIDTH="20%" ALIGN=RIGHT> + Cc + </TD> + <TD> + <%$Ticket->CcAsString%> + </TD> + </TR> + + <TR> + <TD VALIGN=TOP WIDTH="20%" ALIGN=RIGHT> + Status + </TD> + <TD> + <%$Ticket->Status%> + </TD> + </TR> + + <TR> + <TD VALIGN=TOP WIDTH="20%" ALIGN=RIGHT> + Queue + </TD> + <TD> + <%$Ticket->QueueObj->Name%> (<%$Ticket->QueueObj->Description%>) + </TD> + </TR> + <TR> + <TD VALIGN=TOP WIDTH="20%" ALIGN=RIGHT> + Priority + </TD> + <TD> + <%$Ticket->Priority %> + </TD> + </TR> + +% if ($Ticket->TimeWorked) { + <TR> + <TD VALIGN=TOP WIDTH="20%" ALIGN=RIGHT> + Worked + </TD> + <TD> + <%$Ticket->TimeWorked %> minutes + </TD> + </TR> +% } + +% my $selects = $Ticket->QueueObj->KeywordSelects; +% while (my $select = $selects->Next) { + <TR> + <TD VALIGN=TOP WIDTH="20%" ALIGN=RIGHT> + <%$select->Name%> + </TD> + <TD> +% my $object_keywords = $Ticket->KeywordsObj($select->id); +% while (my $keyword = $object_keywords->Next) { + <%$keyword->KeywordObj->RelativePath($select->KeywordObj)%> +% } +%} + </TD> + </TR> + + + + + </TABLE> +<TABLE BORDER=0 CELLSPACING=0> +% my ($i); +%while (my $Transaction = $Transactions->Next) { +% $i++; +% if ($Transactions->IsLast) { + <a name="lasttrans"></a> +% } + <& /Ticket/Elements/ShowTransaction, Transaction => $Transaction, + RowNum => $i, + Ticket => $Ticket &> + +%} +</TABLE> + + +<%INIT> + +my ($field, @results); + +# {{{ Load the ticket +#If we get handed two ids, mason will make them an array. bleck. +# We want teh first one. Just because there's no other sensible way +# to deal +my @id = (ref $id eq 'ARRAY') ? @{$id} : ($id); + + +my $Ticket = new RT::Ticket($session{'CurrentUser'}); +if ($id[0] eq 'new') { + # {{{ Create a new ticket + + my $Queue = new RT::Queue($session{'CurrentUser'}); + unless ($Queue->Load($ARGS{'Queue'})) { + $m->comp('Error.html', Why => 'Queue not found'); + $m->abort; + } + + unless ($Queue->CurrentUserHasRight('CreateTicket')) { + $m->comp('Error.html', Why => 'You have no permission to create tickets in that queue.'); + $m->abort; + } + + my @Requestors = split(/,/,$ARGS{'Requestors'}); + my @Cc = split(/,/,$ARGS{'Cc'}); + + + my $MIMEObj = MakeMIMEEntity ( Subject => $ARGS{'Subject'}, + From => $ARGS{'From'}, + Cc => $ARGS{'Cc'}, + Body => $ARGS{'Content'}, + AttachmentFieldName => 'Attach'); + + #TODO in Create_Details.html: priorities and due-date + my ($id, $Trans, $ErrMsg)= $Ticket->Create(Queue=>$ARGS{Queue}, + Requestor=> \@Requestors, + Cc => \@Cc, + Subject=>$ARGS{Subject}, + MIMEObj => $MIMEObj + ); + unless ($id && $Trans) { + $m->comp('Error.html', Why => $ErrMsg); + $m->abort(); + } + + push(@results, $ErrMsg); + + # }}} +} +else { + unless ($Ticket->Load($id[0])) { + $m->comp('Error.html', Why =>"Couldn't load ticket '$id'"); + $m->abort(); + } +} +# }}} + +unless ($session{'CurrentUser'}->HasQueueRight ( TicketObj => $Ticket, + Right => 'ShowTicket')) { + $m->comp('Error.html', Why => "No permission to display that ticket"); + $m->abort(); +} + +my ($code, $msg); + +#Update the status +if ((defined $ARGS{'Status'}) and + ($ARGS{'Status'} ne $Ticket->Status)) { + ($code, $msg) = $Ticket->SetStatus($ARGS{'Status'}); + push @results, "$msg"; +} + +ProcessUpdateMessage(ARGSRef=>\%ARGS, Actions=>\@results, TicketObj=>$Ticket); + +my $Transactions = $Ticket->Transactions; + +</%INIT> + + +<%ARGS> +$id => undef +</%ARGS> diff --git a/rt/webrt/SelfService/Elements/GotoTicket b/rt/webrt/SelfService/Elements/GotoTicket new file mode 100755 index 000000000..0c0c8b67a --- /dev/null +++ b/rt/webrt/SelfService/Elements/GotoTicket @@ -0,0 +1 @@ +<FORM ACTION="<%$RT::WebPath%>/SelfService/Display.html"><input type=submit value="Goto ticket"> <input size=4 name=id></FORM> diff --git a/rt/webrt/SelfService/Elements/Header b/rt/webrt/SelfService/Elements/Header new file mode 100755 index 000000000..ecf58f461 --- /dev/null +++ b/rt/webrt/SelfService/Elements/Header @@ -0,0 +1,55 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" + "http://www.w3.org/TR/REC-html40/loose.dtd"> +<HTML> +<HEAD> +<TITLE><%$Title%></TITLE> +% if ($Code) { +<META NAME="HTTP-EQUIV" VALUE="<%$Code%> <%$Why%>"> +% } + +<link rel="stylesheet" href="<%$RT::WebPath%>/NoAuth/webrt.css" type="text/css"> +</HEAD> +<BODY BGCOLOR="<%$BgColor%>"> +<TABLE BORDER=0 WIDTH=100% CELLSPACING=0 BGCOLOR="#993333"> +<TR VALIGN=TOP> +<TD WIDTH=32> + <IMG SRC="<%$RT::LogoURL%>" alt="RT"> +</TD> +<TD VALIGN=CENTER ALIGN=LEFT> +<font size=+2 color=#ffffff> +<B> +<%$Title%> +</B> +</font> +</TD> +<TD ALIGN=RIGHT> +<font color="#ffffff"> +% if ($session{'CurrentUser'} ) { +Signed in as <b><%$session{'CurrentUser'}->Name%></b>.<BR> +% if ($session{'CurrentUser'}->HasSystemRight('ModifySelf')) { +[<A class='inverse' HREF="<%$RT::WebPath%>/SelfService/Prefs.html" >Preferences</A>] +% } +% unless ($RT::WebExternalAuth) { + [<A class='inverse' HREF="<%$RT::WebPath%>/NoAuth/Logout.html">Logout</a>] +% } +% } else { +Not logged in. +% } +</font> +</TD> +</TR> +</TABLE> + +<BR> +<& /SelfService/Elements/Tabs &> + +<%ARGS> +$Title => '' +$Code => undef +$Why => undef +$BgColor => '#ffffff' +</%ARGS> +<%INIT> +$Title = "RT/$RT::rtname: ".$Title; +</%INIT> + diff --git a/rt/webrt/SelfService/Elements/MyRequests b/rt/webrt/SelfService/Elements/MyRequests new file mode 100644 index 000000000..ce268d58d --- /dev/null +++ b/rt/webrt/SelfService/Elements/MyRequests @@ -0,0 +1,41 @@ +<& /Elements/TitleBoxStart, title => "Your $friendly_status requests" &> +<TABLE BORDER=0 cellspacing=1 cellpadding=1 BGCOLOR="#eeeeee" WIDTH=100%> +<TR> +<TH>Subject</TH> +<TH>Status</TH> +<TH>Owner</TH> +<TH> </TH> +</TR> +<TR> +% while (my $Ticket = $MyTickets->Next) { +<TR> +<TD> +<%$Ticket->Id%>: <%$Ticket->Subject%> +</TD> +<TD> +<%$Ticket->Status%> +</TD><TD> +<%$Ticket->OwnerObj->Name%> +</TD><TD ALIGN=RIGHT> +[<A HREF="<% $RT::WebPath %>/SelfService/Display.html?id=<%$Ticket->Id%>">Details</A>] +</TD> +</TR> +% } +</TABLE> +<& /Elements/TitleBoxEnd &> + + +<%INIT> +my $MyTickets; +$MyTickets = new RT::Tickets ($session{'CurrentUser'}); +$MyTickets->LimitRequestor(VALUE => $session{'CurrentUser'}->EmailAddress); + +foreach my $status (@status) { + + $MyTickets->LimitStatus(VALUE => $status); +} +</%INIT> +<%ARGS> +$friendly_status => 'open' +@status => ('open', 'new', 'stalled') +</%ARGS> diff --git a/rt/webrt/SelfService/Elements/Tabs b/rt/webrt/SelfService/Elements/Tabs new file mode 100644 index 000000000..d689d8a72 --- /dev/null +++ b/rt/webrt/SelfService/Elements/Tabs @@ -0,0 +1,49 @@ +<TABLE WIDTH=100%> +<TR> +% foreach $tab (sort keys %{$tabs}) { +<TD ALIGN=CENTER> +[<A HREF="<%$RT::WebPath%>/<% $tabs->{"$tab"}->{'path'}%>"><% $tabs->{"$tab"}->{'title'}%></A>] +</TD> +%} + +% if ($actions) { + +<TD ALIGN=RIGHT> +<TABLE><TR> +% foreach my $action (sort keys %{$actions}) { +<TD> +<FONT SIZE=-1> +% if ($actions->{"$action"}->{'html'}) { +<%$actions->{"$action"}->{'html'} |n%> +% } else { +<A HREF="<%$RT::WebPath%>/<% $actions->{$action}->{'path'}%>"><% $actions->{$action}->{'title'}%></A> +% } +</FONT> +</TD> +% } +</TR> +</TABLE> +</TD> +%} +</TR> +</TABLE> +<hr> +<%INIT> +my ($tab); +my $tabs = { A => { title => 'Open requests', + path => 'SelfService/', + }, + B => { title => 'Closed requests', + path => 'SelfService/Closed.html', + }, + C => { title => 'New request', + path => 'SelfService/Create.html' + } + }; +my $actions = { + B => { html => $m->scomp('GotoTicket') + } + }; +</%INIT> + + diff --git a/rt/webrt/SelfService/Error.html b/rt/webrt/SelfService/Error.html new file mode 100755 index 000000000..19b79e68b --- /dev/null +++ b/rt/webrt/SelfService/Error.html @@ -0,0 +1,22 @@ +<& /SelfService/Elements/Header, Title => 'Error' &> +<& /Elements/TitleBoxStart, title => $Title &> +<%$Why%> +<br> +<font size=-1> +<%$Details%> +</font> +<& /Elements/TitleBoxEnd &> +</body> +</HTML> + + +<%args> +$Code => undef +$Details => undef +$Title => "RT Error" +$Why => "the calling component did not specify why" +</%args> + +<%INIT> +$RT::Logger->error("WebRT: $Why ($Details)"); +</%INIT> diff --git a/rt/webrt/SelfService/Prefs.html b/rt/webrt/SelfService/Prefs.html new file mode 100755 index 000000000..9c614e9fd --- /dev/null +++ b/rt/webrt/SelfService/Prefs.html @@ -0,0 +1,51 @@ +<& /SelfService/Elements/Header, title => 'Preferences' &> + +<& /Elements/ListActions, actions => \@results &> +<form method=post> + +% unless ($RT::WebExternalAuth) { +<& /Elements/TitleBoxStart, title => 'Change password' &> +New password: <input type=password name="NewPass1" size=16> +Confirm: <input type=password name="NewPass2" size=16> +<& /Elements/TitleBoxEnd &> +<BR> +% } +<& /Elements/TitleBoxStart, title => 'Signature' &> + +<TEXTAREA COLS=72 ROWS=4 WRAP=HARD NAME="Signature"><% $session{'CurrentUser'}->UserObj->Signature %></TEXTAREA> +<br> +<BR> +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit &> + </form> + + +<%INIT> +my @results; + +if ($NewPass1) { + if ($NewPass1 ne $NewPass2) { + push (@results, "Passwords did not match."); + } + else { + my ($val, $msg)=$session{'CurrentUser'}->UserObj->SetPassword($NewPass1); + push (@results, "Password: ".$msg); + } +} +if ($Signature) { + $Signature =~ s/(\r\n|\r)/\n/g; + if ($Signature ne $session{'CurrentUser'}->UserObj->Signature) { + my ($val, $msg)=$session{'CurrentUser'}->UserObj->SetSignature($Signature); + push (@results, "Signature: ".$msg); + } +} +#A hack to make sure that session gets rewritten. + +$session{'i'}++; +</%INIT> + +<%ARGS> +$Signature => undef +$NewPass1 => undef +$NewPass2 => undef +</%ARGS> diff --git a/rt/webrt/SelfService/Update.html b/rt/webrt/SelfService/Update.html new file mode 100755 index 000000000..17f1618a3 --- /dev/null +++ b/rt/webrt/SelfService/Update.html @@ -0,0 +1,40 @@ +<& /SelfService/Elements/Header, Title => 'Update ticket #'.$Ticket->id &> + + +<FORM ACTION="Display.html" METHOD=POST ENCTYPE="multipart/form-data"> + +Status: +<& /Elements/SelectStatus, Name=>"Status", Default => $DefaultStatus &> +<input type=hidden name="UpdateType" value="response"> + +Subject: <input name="UpdateSubject" size=60 value="Re: <% $Ticket->Subject %>"> <br> +Attach: <input name="UpdateAttachment" type=file><br> +<& /Elements/MessageBox, Name=>"UpdateContent", QuoteTransaction=>$ARGS{QuoteTransaction} &> + <INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>"><br> + + +<& /Elements/Submit &> + </FORM> + + + +<%INIT> + +my $Ticket = LoadTicket($id); + +my $title = "Update ticket #" . $Ticket->id; + +$DefaultStatus = $Ticket->Status() unless ($DefaultStatus); + + +Abort("No permission to view update ticket") + unless ( $Ticket->CurrentUserHasRight('ReplyToTicket') or + $Ticket->CurrentUserHasRight('ModifyTicket') ); + +</%INIT> + +<%ARGS> +$id => undef +$Action => undef +$DefaultStatus => undef +</%ARGS> diff --git a/rt/webrt/SelfService/index.html b/rt/webrt/SelfService/index.html new file mode 100644 index 000000000..a377d8cff --- /dev/null +++ b/rt/webrt/SelfService/index.html @@ -0,0 +1,3 @@ +<& /SelfService/Elements/Header, title => 'Self Service' &> + +<& /SelfService/Elements/MyRequests &> 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> diff --git a/rt/webrt/User/Prefs.html b/rt/webrt/User/Prefs.html new file mode 100755 index 000000000..d769977f9 --- /dev/null +++ b/rt/webrt/User/Prefs.html @@ -0,0 +1,53 @@ +<& /Elements/Header, Title=>"Preferences" &> +<& /Elements/Tabs &> + +<& /Elements/ListActions, actions => \@results &> +<form method=post> + +% unless ($RT::WebExternalAuth) { +<& /Elements/TitleBoxStart, title => 'Change password' &> +New password: <input type=password name="NewPass1" size=16> +Confirm: <input type=password name="NewPass2" size=16> +<& /Elements/TitleBoxEnd &> +<BR> +% } +<& /Elements/TitleBoxStart, title => 'Signature' &> +<INPUT TYPE=HIDDEN NAME="SignatureMagic" VALUE=1> +<TEXTAREA COLS=72 ROWS=4 WRAP=HARD NAME="Signature"><% $session{'CurrentUser'}->UserObj->Signature %></TEXTAREA> +<br> +<BR> +<& /Elements/TitleBoxEnd &> +<& /Elements/Submit &> + </form> + + +<%INIT> +my @results; + +if ($NewPass1) { + if ($NewPass1 ne $NewPass2) { + push (@results, "Passwords did not match."); + } + else { + my ($val, $msg)=$session{'CurrentUser'}->UserObj->SetPassword($NewPass1); + push (@results, "Password: ".$msg); + } +} +if ($Signature || $SignatureMagic) { + $Signature =~ s/(\r\n|\r)/\n/g; + if ($Signature ne $session{'CurrentUser'}->UserObj->Signature) { + my ($val, $msg)=$session{'CurrentUser'}->UserObj->SetSignature($Signature); + push (@results, "Signature: ".$msg); + } +} +#A hack to make sure that session gets rewritten. + +$session{'i'}++; +</%INIT> + +<%ARGS> +$Signature => undef +$SignatureMagic => undef +$NewPass1 => undef +$NewPass2 => undef +</%ARGS> diff --git a/rt/webrt/autohandler b/rt/webrt/autohandler new file mode 100755 index 000000000..16cdbc79b --- /dev/null +++ b/rt/webrt/autohandler @@ -0,0 +1,73 @@ +%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Attic/autohandler,v 1.1 2002-08-12 06:17:08 ivan Exp $ +<& /Elements/Footer, %ARGS &> + +<%INIT> + +$m->{'rt_base_time'} = time; + +#if it's a noauth file, don't ask for auth. +if ($m->base_comp->path =~ '^/+NoAuth/') { + $m->call_next(); + $m->abort(); +} + +# If RT is configured for external auth, let's get REMOTE_USER +# We intentionally don't test for REMOTE_USER to meet our policy +elsif ($RT::WebExternalAuth){ + + $user = $ENV{'REMOTE_USER'}; + $session{'CurrentUser'} = RT::CurrentUser->new(); + $session{'CurrentUser'}->Load($user); + unless ($session{'CurrentUser'}->id() ) { + delete $session{'CurrentUser'}; + $m->comp('/Elements/Login', %ARGS, Error=> 'You are not an authorized user'); + $m->abort(); + } +} + +# If the user is loging in, let's authenticate +elsif (defined ($user) && defined ($pass)){ + + $session{'CurrentUser'} = RT::CurrentUser->new(); + $session{'CurrentUser'}->Load($user); + unless ($session{'CurrentUser'}->id() ) { + delete $session{'CurrentUser'}; + $m->comp('/Elements/Login', %ARGS, Error=> 'Your username or password is incorrect'); + $m->abort(); + }; + unless ($session{'CurrentUser'}->IsPassword($pass)) { + delete $session{'CurrentUser'}; + + $m->comp('/Elements/Login', Error => 'Your username or password is incorrect', %ARGS); + $m->abort(); + } +} + + +#If we've got credentials, lets serve the file up. +if ( (defined $session{'CurrentUser'}) and + ( $session{'CurrentUser'}->Id) ) { + + # If the user isn\'t privileged, they can only see SelfService + if ((! $session{'CurrentUser'}->Privileged) and + ($m->base_comp->path !~ '^/+SelfService/') ) { + $m->comp('/SelfService/index.html'); + $m->abort(); + } + else { + $m->call_next; + } +} + +#If we have no credentials +else { + $m->comp('/Elements/Login', %ARGS); + $m->abort(); +} + +</%INIT> + +<%ARGS> +$user => undef +$pass => undef +</%ARGS> diff --git a/rt/webrt/index.html b/rt/webrt/index.html new file mode 100644 index 000000000..0c1091abb --- /dev/null +++ b/rt/webrt/index.html @@ -0,0 +1,25 @@ +<& /Elements/Header, Title=>"Start page", Refresh => $session{'home_refresh_interval'} &> +<& /Elements/Tabs, current_toptab => '' &> +<TABLE BORDER=0 WIDTH=100%> +<TR VALIGN=TOP> +<TD WIDTH=70%> +<& /Elements/CustomHomepageHeader, %ARGS &> +<& /Elements/MyTickets &> +<BR> +<& /Elements/MyRequests &> +</TD> +<TD> +<& /Elements/Quicksearch &> +<BR> +<form method=get action="index.html"> +<& /Elements/Refresh, Name => 'HomeRefreshInterval', Default => $session {'home_refresh_interval'} &> +<div align=right><input type=submit value="Go!"></div> +</form> +</TD> +</TR> +</TABLE> +<%init> +if ($ARGS{'HomeRefreshInterval'}) { + $session{'home_refresh_interval'} = $ARGS{'HomeRefreshInterval'}; +} +</%init> |