summaryrefslogtreecommitdiff
path: root/rt/share/html
diff options
context:
space:
mode:
Diffstat (limited to 'rt/share/html')
-rw-r--r--rt/share/html/Elements/CustomerFields16
-rw-r--r--rt/share/html/Elements/RT__Ticket/ColumnMap1
-rw-r--r--rt/share/html/Elements/ServiceFields161
-rw-r--r--rt/share/html/Search/Elements/BuildFormatString1
-rw-r--r--rt/share/html/Search/Elements/PickBasics1
-rw-r--r--rt/share/html/Search/Elements/PickCriteria1
-rw-r--r--rt/share/html/Search/Elements/PickCustomerFields8
-rw-r--r--rt/share/html/Ticket/Elements/AddCustomers37
-rw-r--r--rt/share/html/Ticket/Elements/EditCustomers45
-rw-r--r--rt/share/html/Ticket/Elements/ShowCustomers17
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>