X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=httemplate%2Fview%2Felements%2Fsvc_Common.html;h=501fea0206085b8f9b7651315a443530bc16d849;hb=10614457fd7db63cbcc0bf9bfeebbbb99258eaa3;hp=b6d8e652f8a3f85da05730de8b016115c6db656a;hpb=4a476092eda9c8e42292cc7bf01f5c73cf5abcd0;p=freeside.git diff --git a/httemplate/view/elements/svc_Common.html b/httemplate/view/elements/svc_Common.html index b6d8e652f..501fea020 100644 --- a/httemplate/view/elements/svc_Common.html +++ b/httemplate/view/elements/svc_Common.html @@ -1,82 +1,97 @@ -% # options example... -% # -% # 'table' => 'svc_something' -% # -% # 'labels' => { -% # 'column' => 'Label', -% # }, -% # -% # listref - each item is a literal column name (or method) or (notyet) coderef -% # if not specified all columns (except for the primary key) will be viewable -% # 'fields' => [ -% # ] -% # -% # # defaults to "edit/$table.cgi?", will have svcnum appended -% # 'edit_url' => -% -% -% if ( $custnum ) { +<%doc> +#Example: - <% include("/elements/header.html","View $label: $value") %> + include( 'elements/svc_Common.html, - <% include( '/elements/small_custview.html', $custnum, '', 1, - "${p}view/cust_main.cgi") %> - <BR> -% } else { + 'table' => 'svc_something' + + 'labels' => { + 'column' => 'Label', + }, + + #listref - each item is a literal column name (or method) or + # (notyet) coderef. if not specified all columns (except for the + #primary key) will be viewable + 'fields' => [ + ] + + # defaults to "edit/$table.cgi?", will have svcnum appended + 'edit_url' => + + #at the very bottom (well, as low as you can go from here) + 'html_foot' => '', + ) - <SCRIPT> - function areyousure(href) { - if (confirm("Permanently delete this <% $label %>?") == true) - window.location.href = href; +</%doc> +<SCRIPT> +function areyousure(href) { +% my $delmsg = emt("Permanently delete this [_1]?", $label); + if (confirm(<% $delmsg |js_string %>) == true) + window.location.href = href; +} +</SCRIPT> +<STYLE> + td.content { + background-color: #ffffff; + } + .error { + color: #ff0000; + font-weight: bold; } - </SCRIPT> +</STYLE> + +% if ( $custnum ) { + + <& /elements/header.html, mt("View [_1]: [_2]",$label,$value) &> - <% include("/elements/header.html","View $label: $value", menubar( - "Cancel this (unaudited) $label" => + <& /elements/small_custview.html, $custnum, '', 1, + "${p}view/cust_main.cgi" &> + <BR> + +% } else { + + <& /elements/header.html, mt("View [_1]: [_2]",$label,$value), menubar( + emt("Cancel this (unaudited) [_1]",$label) => "javascript:areyousure(\'${p}misc/cancel-unaudited.cgi?$svcnum\')" - )) %> + ) &> + % } +% if ( $opt{radius_usage} ) { + <& svc_radius_usage.html, + 'svc' => $svc_x, + 'part_svc' => $part_svc, + 'cust_pkg' => $cust_pkg, + &> +% } -Service #<B><% $svcnum %></B> -% my $url = $opt{'edit_url'} || $p. 'edit/'. $opt{'table'}. '.cgi?'; -| <A HREF="<%$url%><%$svcnum%>">Edit this <% $label %></A> +<% mt('Service #') |h %><B><% $svcnum %></B> +% if ( $custnum ) { +% my $url = $opt{'edit_url'} || $p. 'edit/'. $opt{'table'}. '.cgi?'; +<& /view/elements/svc_edit_link.html, 'svc' => $svc_x, 'edit_url' => $url &> +% } <BR> <% ntable("#cccccc") %><TR><TD><% ntable("#cccccc",2) %> + % foreach my $f ( @$fields ) { -% -% my( $field, $type); -% if ( ref($f) ) { -% $field = $f->{'field'}, -% $type = $f->{'type'} || 'text', -% } else { -% $field = $f; -% $type = 'text'; -% } -% - - - <TR> - <TD ALIGN="right"> - <% ( $opt{labels} && exists $opt{labels}->{$field} ) - ? $opt{labels}->{$field} - : $field - %> - </TD> -% -% #eventually more options for <SELECT>, etc. fields -% - - - <TD BGCOLOR="#ffffff"><% $svc_x->$field %><TD> - - </TR> -% } -% foreach (sort { $a cmp $b } $svc_x->virtual_fields) { +% my ($field, $label, $value) = &{ $format_field }($f); +% next if !$field; + <TR> + <TD ALIGN="right"> + <% $label %> + </TD> + + <TD CLASS="content"> + <% $value %> + <TD> + + </TR> +% } +% foreach (sort { $a cmp $b } $svc_x->virtual_fields) { <% $svc_x->pvf($_)->widget('HTML', 'view', $svc_x->getfield($_)) %> % } @@ -85,6 +100,11 @@ Service #<B><% $svcnum %></B> <BR> +<& svc_devices.html, + 'svc_x' => $svc_x, + 'table' => $svc_x->device_table, +&> + % if ( defined($opt{'html_foot'}) ) { <% ref($opt{'html_foot'}) @@ -95,6 +115,9 @@ Service #<B><% $svcnum %></B> % } +% if ( $cust_svc ) { +<& /elements/table-tickets.html, object => $cust_svc &> +% } <% joblisting({'svcnum'=>$svcnum}, 1) %> @@ -106,6 +129,9 @@ die "access denied" my(%opt) = @_; +my $conf = new FS::Conf; +my $date_format = $conf->config('date_format') || '%m/%d/%Y'; + my $table = $opt{'table'}; my $fields = $opt{'fields'} @@ -114,7 +140,7 @@ my $fields = $opt{'fields'} my $svcnum; if ( $cgi->param('svcnum') ) { - $cgi->param('svcnum') =~ /^(\d+)$/ or die "unparsable svcnum"; + $cgi->param('svcnum') =~ /^(\d+)$/ or die "unparseable svcnum"; $svcnum = $1; } else { my($query) = $cgi->keywords; @@ -128,13 +154,35 @@ my $svc_x = qsearchs({ ' LEFT JOIN cust_pkg USING ( pkgnum ) '. ' LEFT JOIN cust_main USING ( custnum ) ', 'hashref' => { 'svcnum' => $svcnum }, - 'extra_sql' => ' AND '. $FS::CurrentUser::CurrentUser->agentnums_sql, + 'extra_sql' => ' AND '. $FS::CurrentUser::CurrentUser->agentnums_sql( + 'null_right' => 'View/link unlinked services' + ), }) or die "Unknown svcnum $svcnum in ". $opt{'table'}. " table\n"; my $cust_svc = $svc_x->cust_svc; -my($label, $value, $svcdb) = $cust_svc->label; +my ($label, $value, $svcdb, $part_svc ); +my $labels = $opt{labels} || {}; + +if ( $cust_svc ) { + ($label, $value, $svcdb) = $cust_svc->label; + + $part_svc = $cust_svc->part_svc; + + #false laziness w/edit/svc_Common.html + #override default labels with service-definition labels if applicable + foreach my $field ( keys %$labels ) { + my $col = $part_svc->part_svc_column($field); + $labels->{$field} = $col->columnlabel if $col->columnlabel !~ /^\s*$/; + } +} else { + $label = "Unlinked $table"; + $value = $svc_x->label; + $svcdb = $table; + # just to satisfy callbacks + $part_svc = FS::part_svc->new({ svcpart => 0, svcdb => $table }); +} -my $pkgnum = $cust_svc->pkgnum; +my $pkgnum = $cust_svc->pkgnum if $cust_svc; my($cust_pkg, $custnum); if ($pkgnum) { @@ -145,4 +193,113 @@ if ($pkgnum) { $custnum = ''; } +# attached routers +if ( my $router = qsearchs('router', { svcnum => $svc_x->svcnum }) ) { + push @$fields, + 'router_routername', + 'router_block'; + + $labels->{'router_routername'} = 'Attached router'; + $labels->{'router_block'} = 'Attached address block'; + $svc_x->set('router_routername', $router->routername); + my $block = qsearchs('addr_block', { routernum => $router->routernum }); + if ( $block ) { + $svc_x->set('router_block', $block->cidr); + } else { + $svc_x->set('router_block', '(none)'); + } +} + +my @inventory_items = $svc_x->inventory_item; + +my $format_field = sub { + my $f = shift; + my($field, $type, $value); + if ( ref($f) ) { + $field = $f->{'field'}; + $type = $f->{'type'} || 'text'; + } else { + $field = $f; + $type = 'text'; + } + + my $columndef = $part_svc->part_svc_column($field); + # skip fields that are fixed and empty + if ( $columndef->columnflag eq 'F' + and length($columndef->columnvalue) == 0 ) { + return; + } + + # things that override the column value: value_callback, select + if ( ref($f) and $f->{'value_callback'} ) { + + my $hack_strict_refs = \&{ $f->{'value_callback'} }; + $value = &$hack_strict_refs($svc_x); + + } elsif ( $type eq 'select-table' ) { + # imitates the /elements/select-table interface + $value = $svc_x->$field; + + my $value_col = $f->{'value_col'} || + dbdef->table($f->{'table'})->primary_key; + my $name_col = $f->{'name_col'} or die 'name_col required'; + # we don't yet support multiple-valued fields here + my $obj = qsearchs($f->{'table'}, { $value_col => $value }); + if ( $obj ) { + $value = $obj->$name_col; # can be any method of the object + } else { + # show the raw value, but mark it as an error + $value = '<SPAN CLASS="error">' . $f->{'table'} . ' ' . + encode_entities($value) . '</SPAN>'; + } + + } else { + $value = encode_entities($svc_x->$field); + } + + # inventory-select field with multiple classes + # show the class name to disambiguate + if ( $columndef->columnflag =~ /^[MA]$/ && $columndef->columnvalue =~ /,/ ) + { + my ($item) = grep { $_->svc_field eq $field } @inventory_items; + my $class = qsearchs('inventory_class', { classnum => $item->classnum }); + $value .= ' <i>('. $class->classname . ')</i>' if $class; + } + + # formatting tweaks + if ( $type eq 'date' and $value ) { + $value = time2str($date_format,$value) + } elsif ( $type eq 'datetime' and $value ) { + $value = time2str("$date_format %H:%M",$value) + } elsif ( $type eq 'checkbox' ) { + $value = $value eq 'Y' ? emt('Yes') : emt('No'); + } elsif ( $type eq 'mac_addr' and $value =~ /\w/) { + $value .= ' ('. (Net::MAC::Vendor::lookup($value))->[0]. ')' + } + + # 'link' option + my $href; + if ( ref($f) and exists $f->{'link'} ) { + my $link = $f->{'link'}; + if ( ref($link) eq 'CODE' ) { + $link = &{$link}($svc_x); + } + if ( ref($link) eq 'ARRAY' ) { + my ($base, $method) = @$link; + $href = $base . $svc_x->$method(); + } elsif ( !ref($link) ) { + $href = $link; + } + + if ( $href ) { + $value = qq!<A HREF="$href">$value</A>!; + } + } + + my $label = $opt{labels}->{$field} || $field; + return ($field, $label, $value); +}; + +&{ $opt{'svc_callback'} }( $cgi, $svc_x, $part_svc, $cust_pkg, $fields, \%opt ) + if $opt{'svc_callback'}; </%init>