diff options
Diffstat (limited to 'rt/share/html')
-rw-r--r-- | rt/share/html/Elements/CustomerFields | 16 | ||||
-rw-r--r-- | rt/share/html/Elements/RT__Ticket/ColumnMap | 1 | ||||
-rw-r--r-- | rt/share/html/Elements/ServiceFields | 161 | ||||
-rw-r--r-- | rt/share/html/Search/Elements/BuildFormatString | 1 | ||||
-rw-r--r-- | rt/share/html/Search/Elements/PickBasics | 1 | ||||
-rw-r--r-- | rt/share/html/Search/Elements/PickCriteria | 1 | ||||
-rw-r--r-- | rt/share/html/Search/Elements/PickCustomerFields | 8 | ||||
-rw-r--r-- | rt/share/html/Ticket/Elements/AddCustomers | 37 | ||||
-rw-r--r-- | rt/share/html/Ticket/Elements/EditCustomers | 45 | ||||
-rw-r--r-- | rt/share/html/Ticket/Elements/ShowCustomers | 17 |
10 files changed, 246 insertions, 42 deletions
diff --git a/rt/share/html/Elements/CustomerFields b/rt/share/html/Elements/CustomerFields index 553a34999..d5419d213 100644 --- a/rt/share/html/Elements/CustomerFields +++ b/rt/share/html/Elements/CustomerFields @@ -16,7 +16,6 @@ About the keys: name to sort by. </%doc> <%once> -return unless $RT::URI::freeside::IntegrationType eq 'Internal'; my @customer_fields = ( # ordered { @@ -158,8 +157,12 @@ sub select_table { sub ticket_cust_resolvers { my $Ticket = shift; - my @Customers = @{ $Ticket->Customers->ItemsArrayRef }; - return map $_->TargetURI->Resolver, @Customers; + my @Customers = map { $_->TargetURI->Resolver->CustomerResolver } + @{ $Ticket->Customers->ItemsArrayRef }; + # this can contain cust_svc links, careful + # uniq + my %seen = map { $_->URI => $_ } @Customers; + values %seen; } sub cust_info_attribute { # the simple case of $resolver->CustomerInfo->{foo} @@ -177,7 +180,6 @@ sub cust_info_attribute { # the simple case of $resolver->CustomerInfo->{foo} </%once> <%init> -return unless $RT::URI::freeside::IntegrationType eq 'Internal'; my $arg = shift; if ( $arg eq 'Names' ) { @@ -198,9 +200,11 @@ elsif ( $arg eq 'ColumnMap' ) { grep { exists $_->{Display} } @customer_fields; } -elsif ( $arg eq 'PickBasics' ) { +elsif ( $arg eq 'Criteria' ) { return map { my $f = $_; + # argument to Search/Elements/ConditionRow + $f->{Condition} || { Name => ($f->{QueryName} || $f->{Name}), Field => ($f->{QueryLabel} || $f->{Label}), @@ -208,7 +212,7 @@ elsif ( $arg eq 'PickBasics' ) { Value => $f->{Value}, } } #map - grep { exists $_->{Value} } + grep { exists $_->{Condition} || exists $_->{Value} } @customer_fields; } else { die "unknown CustomerFields mode '$arg'\n"; } diff --git a/rt/share/html/Elements/RT__Ticket/ColumnMap b/rt/share/html/Elements/RT__Ticket/ColumnMap index 9e6466cdd..35c0aad86 100644 --- a/rt/share/html/Elements/RT__Ticket/ColumnMap +++ b/rt/share/html/Elements/RT__Ticket/ColumnMap @@ -321,6 +321,7 @@ $COLUMN_MAP = { #freeside $m->comp('/Elements/CustomerFields', 'ColumnMap'), + $m->comp('/Elements/ServiceFields', 'ColumnMap'), }; # if no GPG support, then KeyOwnerName and KeyRequestors fall back to the regular diff --git a/rt/share/html/Elements/ServiceFields b/rt/share/html/Elements/ServiceFields new file mode 100644 index 000000000..9c9a248c8 --- /dev/null +++ b/rt/share/html/Elements/ServiceFields @@ -0,0 +1,161 @@ +<%doc> +Accessible Freeside svc_x fields go in here. RT::URI::freeside::Internal +pulls all fields from cust_svc and the svc_x tables into ServiceInfo(). +RT::Tickets_Overlay resolves "Service.foo" as "cust_svc.foo", and +"Service.svc_acct.bar" as "JOIN svc_acct USING (svcnum) ... svc_acct.bar". + +See /Elements/CustomerFields for notes on this data structure. +</%doc> +<%once> + +my @service_fields = ( # ordered + { + # svcnum + Name => 'Service', + Label => 'Service', + Display => sub { + my $Ticket = shift; + my @return = (); + foreach my $s (ticket_svc_resolvers($Ticket)) { + push @return, \'<A HREF="', $s->HREF, \'">', + $s->AsString, + \'</A>', + \'<BR>'; + } + pop @return; + @return; + }, + OrderBy => 'Service.Number', + }, + { + #Column name (format string) + Name => 'ServiceType', + # Column heading/query builder name + Label => 'Service Type', + # Column value (coderef, cust_svc/svc_x field, or ServiceInfo key) + Display => 'ServiceType', + # Query builder options + # RT-SQL field, defaults to Name + QueryName => 'Service.svcpart', + Op => equals_notequals, + Value => select_table('part_svc', 'svcpart', 'svc'), + # RT-SQL sort key (if any) + OrderBy => 'Service.svcpart', + }, + { + Name => 'ServiceKey', # loosely corresponds to smartsearch/label field + Label => '', + # not displayable + QueryLabel => { + Type => 'select', + Options => [ + 'Service.svc_acct.username' => loc('Username'), + 'Service.svc_phone.phonenum' => loc('Phone Number'), + 'Service.svc_broadband.ip_addr' => loc('IP Address'), + 'Service.svc_broadband.mac_addr' => loc('MAC Address'), + ], + }, + Op => matches_notmatches, + Value => { Type => 'text', Size => 20 }, + }, + { + Name => 'Router', + Label => 'Router', + QueryName => 'Service.svc_broadband.routernum', + # not displayable + Op => equals_notequals, + Value => select_table('router', 'routernum', 'routername'), + OrderBy => 'Service.svc_broadband.routernum', + }, + +); +#helper subs +#Op +sub equals_notequals { + { + Type => 'component', + Path => '/Elements/SelectBoolean', + Arguments => { TrueVal=> '=', FalseVal=> '!=' }, + } +} +sub matches_notmatches { + { + Type => 'component', + Path => '/Elements/SelectMatch', + }, +} + +#Value +sub select_table { + my ($table, $value_col, $name_col, $hashref) = @_; + $hashref ||= { disabled => '' }; # common case + return { + Type => 'select', + Options => [ + '' => '-', + map { $_->$value_col, $_->$name_col } + qsearch($table, $hashref) + ], + } +} + +sub ticket_svc_resolvers { + my $Ticket = shift; + my @Services = @{ $Ticket->Services->ItemsArrayRef }; + return map $_->TargetURI->Resolver, @Services; +} + +sub svc_info_attribute { + my $attribute = shift; + sub { + my $Ticket = shift; + my @return; + foreach my $s (ticket_svc_resolvers($Ticket)) { + push @return, $s->ServiceInfo->{$attribute}, '<BR>'; + } + pop @return; #trailing <BR> + @return; + }; +} + +</%once> +<%init> +use Data::Dumper; +#warn Dumper(\@service_fields); + +my $arg = shift; +if ( $arg eq 'Names' ) { + return map { $_->{Name} } + grep { exists $_->{Display} } + @service_fields; +} +elsif ( $arg eq 'ColumnMap' ) { + return map { + my $f = $_; + $f->{Name} => { + title => $f->{Label}, + attribute => $f->{OrderBy} || '', + value => ref($f->{Display}) eq 'CODE' ? + $f->{Display} : + svc_info_attribute($f->{Display}) + } + } #map + grep { exists $_->{Display} } + @service_fields; +} +elsif ( $arg eq 'Criteria' ) { + return map { + my $f = $_; + # argument to Search/Elements/ConditionRow + { + Name => ($f->{QueryName} || $f->{Name}), + Field => ($f->{QueryLabel} || $f->{Label}), + Op => $f->{Op}, + Value => $f->{Value}, + } + } #map + grep { exists($_->{Value}) } + @service_fields; +} +else { die "unknown ServiceFields mode '$arg'\n"; } +</%init> diff --git a/rt/share/html/Search/Elements/BuildFormatString b/rt/share/html/Search/Elements/BuildFormatString index 96e6a2863..57c767911 100644 --- a/rt/share/html/Search/Elements/BuildFormatString +++ b/rt/share/html/Search/Elements/BuildFormatString @@ -76,6 +76,7 @@ my @fields = ( ), $m->comp('/Elements/CustomerFields', 'Names'), #freeside + $m->comp('/Elements/ServiceFields', 'Names'), #freeside qw( Status ExtendedStatus UpdateStatus diff --git a/rt/share/html/Search/Elements/PickBasics b/rt/share/html/Search/Elements/PickBasics index ff30f7c11..e9534237b 100644 --- a/rt/share/html/Search/Elements/PickBasics +++ b/rt/share/html/Search/Elements/PickBasics @@ -210,7 +210,6 @@ my @lines = ( ); #freeside -push @lines, $m->comp('/Elements/CustomerFields', 'PickBasics'); $m->callback( Conditions => \@lines ); diff --git a/rt/share/html/Search/Elements/PickCriteria b/rt/share/html/Search/Elements/PickCriteria index 44e3b7037..5eb112d17 100644 --- a/rt/share/html/Search/Elements/PickCriteria +++ b/rt/share/html/Search/Elements/PickCriteria @@ -52,6 +52,7 @@ <& PickBasics &> +<& PickCustomerFields &> <& PickCFs, cfqueues => \%cfqueues &> <tr class="separator"><td colspan="3"><hr /></td></tr> diff --git a/rt/share/html/Search/Elements/PickCustomerFields b/rt/share/html/Search/Elements/PickCustomerFields new file mode 100644 index 000000000..96d8e47e7 --- /dev/null +++ b/rt/share/html/Search/Elements/PickCustomerFields @@ -0,0 +1,8 @@ +% if ( $RT::URI::freeside::IntegrationType eq 'Internal' ) { +% my @lines; +% push @lines, $m->comp('/Elements/CustomerFields', 'Criteria'); +% push @lines, $m->comp('/Elements/ServiceFields', 'Criteria'); +% foreach( @lines ) { +<& ConditionRow, Condition => $_ &> +% } +% } diff --git a/rt/share/html/Ticket/Elements/AddCustomers b/rt/share/html/Ticket/Elements/AddCustomers index 09acdfd3f..3c2c82add 100644 --- a/rt/share/html/Ticket/Elements/AddCustomers +++ b/rt/share/html/Ticket/Elements/AddCustomers @@ -13,15 +13,25 @@ <BR> <%$msg%><br> -% if (@Customers) { +% if (@Customers or @Services) { -<br><i>(Check box to link)<i> +<br><i>(Check box to link)</i> <table> % foreach my $customer (@Customers) { <tr> <td> <input type="checkbox" name="Ticket-AddCustomer-<% $customer->{'custnum'} %>" VALUE="1" <% scalar(@Customers) == 1 ? 'CHECKED' : '' %>> - <A HREF="<%$freeside_url%>/view/cust_main.cgi?<% $customer->{'custnum'} %>"><% &RT::URI::freeside::small_custview($customer->{'custnum'}, &RT::URI::freeside::FreesideGetConfig('countrydefault'), 1) |n %> + <& .small_custview, $customer &> + </td> +</tr> +% } +% +% foreach my $service (@Services) { +<tr> + <td> + <input type="checkbox" name="Ticket-AddService-<% $service->{'svcnum'} %>" VALUE="1" <% scalar(@Services) == 1 ? 'CHECKED' : '' %>> + <& .small_custview, $service &> + <& .small_svcview, $service &> </td> </tr> % } @@ -29,11 +39,21 @@ % } +<%once> +my $freeside_url = &RT::URI::freeside::FreesideURL(); + +</%once> +<%def .small_custview> +% my $cust = shift; +<A HREF="<%$freeside_url%>/view/cust_main.cgi?<% $cust->{'custnum'}%>"><% &RT::URI::freeside::small_custview($cust->{'custnum'}, &RT::URI::freeside::FreesideGetConfig, 1) |n %></A> +</%def> +<%def .small_svcview> +% my $svc = shift; +<A HREF="<%$freeside_url%>/view/cust_svc.cgi?<% $svc->{'svcnum'}%>"><B><% $svc->{'label'} %></B></A> +</%def> <%INIT> my ($msg); -my $freeside_url = &RT::URI::freeside::FreesideURL(); - my @Customers = (); if ( $CustomerString ) { @Customers = &RT::URI::freeside::smart_search( @@ -43,8 +63,11 @@ if ( $CustomerString ) { } my @Services = (); -if ($ServiceString) { - @Services = (); #service_search(); +if ( $ServiceString + and $RT::URI::freeside::IntegrationType eq 'Internal' ) { + @Services = RT::URI::freeside::service_search( + 'search' => $ServiceString, + ); } </%INIT> diff --git a/rt/share/html/Ticket/Elements/EditCustomers b/rt/share/html/Ticket/Elements/EditCustomers index 0ba6e447b..96207f4cc 100644 --- a/rt/share/html/Ticket/Elements/EditCustomers +++ b/rt/share/html/Ticket/Elements/EditCustomers @@ -12,7 +12,7 @@ %# General Public License for more details. <TABLE width=100%> <TR> - <TD VALIGN=TOP WIDTH=50%> + <TD VALIGN=TOP WIDTH=50% ROWSPAN=3> <h3><&|/l&>Current Customers</&></h3> <table> @@ -25,33 +25,40 @@ <INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>"> %# <& ShowLink, URI => $link->TargetURI &><br> - <A HREF="<% $link->TargetURI->Resolver->HREF %>"><% $link->TargetURI->Resolver->AsStringLong |n %></A> - <BR> + <% $link->TargetURI->Resolver->AsStringLong |n %></A> + <BR><BR> % } </td> </tr> </table> - + </TD> -<TD VALIGN=TOP> +<TD VALIGN=TOP WIDTH=50% COLSPAN=2> <h3><&|/l&>New Customer Links</&></h3> -<&|/l&>Find customer</&><BR> -<input name="CustomerString"> -<input type=submit name="OnlySearchForCustomers" value="<&|/l&>Go!</&>"> -<br><i>cust #, name, company or phone</i> -<BR> -%#<BR> -%#<&|/l&>Find service</&><BR> -%#<input name="ServiceString"> -%#<input type=submit name="OnlySearchForServices" value="<&|/l&>Go!</&>"> -%#<br><i>username, username@domain, domain, or IP address</i> -%#<BR> - +</TD> +</TR> +<TR VALIGN="top"> +%# rowspan + <td width=25%> + <&|/l&>Find customer</&><br> + <input name="CustomerString"> + <input type=submit name="OnlySearchForCustomers" value="<&|/l&>Go!</&>"> + <br><i>cust #, name, company or phone</i> + </td> + <td width=25%> + <&|/l&>Find service</&><br> + <input name="ServiceString"> + <input type=submit name="OnlySearchForServices" value="<&|/l&>Go!</&>"> + <br><i>user, email, ip, mac, phone</i> + </td> +</TR> +<TR> +%#rowspan... +<TD COLSPAN=2> <& AddCustomers, Ticket => $Ticket, CustomerString => $CustomerString, - ServiceString => $ServiceString, &> - + ServiceString => $ServiceString &> </TD> </TR> </TABLE> diff --git a/rt/share/html/Ticket/Elements/ShowCustomers b/rt/share/html/Ticket/Elements/ShowCustomers index 3acf92dd4..add562440 100644 --- a/rt/share/html/Ticket/Elements/ShowCustomers +++ b/rt/share/html/Ticket/Elements/ShowCustomers @@ -10,20 +10,19 @@ %# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU %# General Public License for more details. <table> -% my $cust = 0; -% foreach my $custResolver ( map { $_->TargetURI->Resolver } -% @{ $Ticket->Customers->ItemsArrayRef } -% ) -% { -% $cust++; -% my $cust_main = ''; +% my @cust = map { $_->TargetURI->Resolver } +% @{ $Ticket->Customers->ItemsArrayRef }; +% +% foreach my $custResolver ( @cust ) { <tr> <td class="value"> - <A HREF="<% $custResolver->HREF %>"><% $custResolver->AsStringLong |n %></A> + <% $custResolver->AsStringLong |n %> +%# includes service label and view/svc_ link for cust_svc links </td> </tr> % } -% unless ( $cust ) { + +% unless ( @cust ) { <tr> <td class="labeltop"> <i>(none)<i> |