72901: OFM Freeside Note Classes [v3 merge]
authorJonathan Prykop <jonathan@freeside.biz>
Sat, 15 Oct 2016 01:49:38 +0000 (20:49 -0500)
committerJonathan Prykop <jonathan@freeside.biz>
Tue, 25 Oct 2016 04:20:51 +0000 (23:20 -0500)
FS/FS/Conf.pm
FS/FS/cust_main_note.pm
httemplate/edit/cust_main_note.cgi
httemplate/elements/menu.html
httemplate/view/cust_main/notes/notes.html

index d3d437d..8e07c72 100644 (file)
@@ -5747,11 +5747,7 @@ and customer address. Include units.',
     'section'     => 'UI',
     'description' => 'Use customer note classes',
     'type'        => 'select',
-    'select_hash' => [
-                       0 => 'Disabled',
-                      1 => 'Enabled',
-                      2 => 'Enabled, with tabs',
-                    ],
+    'select_enum' => [ '', 'Enabled', 'Required' ],
   },
 
   {
index 44d99d8..1723951 100644 (file)
@@ -5,6 +5,7 @@ use base qw( FS::otaker_Mixin FS::Record );
 use Carp;
 use FS::Record qw( qsearch qsearchs );
 use FS::cust_note_class;
+use FS::Conf;
 
 =head1 NAME
 
@@ -117,6 +118,13 @@ sub check {
   ;
   return $error if $error;
 
+  if (!$self->classnum) {
+    my $conf = new FS::Conf;
+    return 'Note class is required'
+      if $conf->exists('note-classes')
+        and $conf->config('note-classes') eq 'Required';
+  }
+
   $self->SUPER::check;
 }
 
index a089db2..4cf5024 100755 (executable)
@@ -6,14 +6,17 @@
 <INPUT TYPE="hidden" NAME="custnum" VALUE="<% $custnum %>">
 <INPUT TYPE="hidden" NAME="notenum" VALUE="<% $notenum %>">
 
-% if ($conf->exists('note-classes') && $conf->config('note-classes') > 0) {
+% if ($conf->exists('note-classes') && $conf->config('note-classes')) {
+%   my %includeopts = $conf->config('note-classes') eq 'Enabled'
+%                   ? ('empty_label' => '(unclassified)')
+%                   : ('disable_empty' => 1); # eq 'Required'
     Class &nbsp;
        <% include( '/elements/select-table.html',
                  'table'       => 'cust_note_class',
                  'name_col'    => 'classname',
                  'curr_value'  => $classnum,
-                 'empty_label' => '(none)',
                  'hashref'     => { 'disabled' => '' },
+                 %includeopts,
          ) %>
     <BR>
 % }
index 621165d..f8d727e 100644 (file)
@@ -660,7 +660,7 @@ tie my %config_cust, 'Tie::IxHash',
 ;
   
 $config_cust{'Note classes'} = [ $fsurl.'browse/cust_note_class.html', 'Note classes define groups of customer notes for reporting.' ]
-    if ($conf->exists('note-classes') && $conf->config('note-classes') > 0);
+    if ($conf->exists('note-classes') && $conf->config('note-classes'));
 
 tie my %config_agent, 'Tie::IxHash',
   'Agent types' => [ $fsurl.'browse/agent_type.cgi', 'Agent types define groups of package definitions that you can then assign to particular agents' ],
index fa45a68..f36d7d8 100644 (file)
@@ -1,55 +1,81 @@
 % if ( scalar(@notes) ) {
-
 <SCRIPT TYPE="text/javascript">
 
-    function display_notes_classnum(classnum){
-       document.getElementById('notes_'+classnum).style.display = 'block';
-       document.getElementById('notes_tablink_'+classnum).style.fontWeight = 'bold';
-
-       var divs = document.getElementsByTagName("div");
-       var i;
-       for(i=0; i < divs.length; i++){
-           var d = divs[i];
-           if(d.id.length > 6 && d.id.substring(0,6) == 'notes_') {
-               if(divs[i].id != 'notes_'+classnum) {
-                   divs[i].style.display = 'none';
-               }
-           }
-       }
-       
-       var as = document.getElementsByTagName("a");
-       for(i=0; i < as.length; i++){
-           var a = as[i];
-           if(a.id.length > 14 && a.id.substring(0,14) == 'notes_tablink_') {
-               if(as[i].id != 'notes_tablink_'+classnum) {
-                   as[i].style.fontWeight = 'normal';
-               }
-           }
-       }
+function display_notes_classnum (classnum) {
+
+  var bgcolor1 = '#eeeeee';
+  var bgcolor2 = '#ffffff';
+  var sticky_color = { '#eeeeee' : '#ffff66',
+                       '#ffffff' : '#ffffb8' };
+  var notes_bgcolor = '';
+
+  var trs = document.getElementsByTagName("TR");
+  for (var i=0; i < trs.length; i++) {
+    if (trs[i].id.length > 6 && trs[i].id.substring(0,6) == 'notes_') {
+      if (( classnum == '-1' ) || ( trs[i].getAttribute('data-classnum') == classnum )) {
+        trs[i].style.display = 'table-row';
+        if ( notes_bgcolor == bgcolor1 ) {
+          notes_bgcolor = bgcolor2;
+        } else {
+          notes_bgcolor = bgcolor1;
+        }
+        trs[i].style.backgroundColor = (trs[i].getAttribute('data-sticky') == '1') ? sticky_color[notes_bgcolor] : notes_bgcolor;
+      } else {
+        trs[i].style.display = 'none';
+      }
+    }
+  }
+%   if ($note_classes_conf) {
+
+  var as = document.getElementsByTagName("a");
+  for (var i=0; i < as.length; i++) {
+    if(as[i].id.length > 14 && as[i].id.substring(0,14) == 'notes_tablink_') {
+      if(as[i].id == 'notes_tablink_'+classnum) {
+        as[i].style.fontWeight = 'bold';
+      } else {
+        as[i].style.fontWeight = 'normal';
+      }
     }
+  }
+%   } # if note_classes_conf
+
+}
 
 </SCRIPT>
 
   <& /elements/init_overlib.html &>
 
-% my $bgcolor1 = '#eeeeee';
-% my $bgcolor2 = '#ffffff';
-% my %sticky_color = ( '#eeeeee' => '#ffff66',
-%                      '#ffffff' => '#ffffb8',
-%                    );
-%
-% my $bgcolor = '';
-% my $last_classnum = -1;
-% my $skipheader = 0;
-% my %classes = ();
-%
-% foreach my $note (@notes) {
-%
-%   if ( $bgcolor eq $bgcolor1 ) {
-%     $bgcolor = $bgcolor2;
-%   } else {
-%     $bgcolor = $bgcolor1;
+% if ( $note_classes_conf ) {
+<% mt('Show notes of class:') |h %> &nbsp; 
+%   # list unclassified last
+%      foreach my $classnum ( (grep { $_ != 0} sort { $a <=> $b } (keys %classes)), '0' ) {
+           <A  id="notes_tablink_<% $classnum %>"
+               HREF="javascript:display_notes_classnum(<% $classnum %>)"
+               style="font-weight: <% $classnum == -1 ? 'bold' : 'normal' %>"
+           ><% $classes{$classnum} %></A>
+%      }
+    <BR>
+% }
+
+<& /elements/table-grid.html &>
+  <TR>
+    <TH CLASS="grid" BGCOLOR="#cccccc" STYLE="padding: 0 1em"><% mt('Date') |h %></TH>
+%   if ( $conf->exists('cust_main_note-display_times') ) {
+    <TH CLASS="grid" BGCOLOR="#cccccc" STYLE="padding: 0 1em"><% mt('Time') |h %></TH>
+%   }
+    <TH CLASS="grid" BGCOLOR="#cccccc" STYLE="padding: 0 1em"><% mt('Employee') |h %></TH>
+%   if ($note_classes_conf) {
+    <TH CLASS="grid" BGCOLOR="#cccccc" STYLE="padding: 0 1em"><% mt('Class') |h %></TH>
 %   }
+    <TH CLASS="grid" BGCOLOR="#cccccc" STYLE="padding: 0 1em"><% mt('Note') |h %></TH>
+%   if ($curuser->access_right('Edit customer note') ) {
+    <TH CLASS="grid" BGCOLOR="#cccccc" STYLE="padding: 0 1em">&nbsp;</TH>
+%   }
+  </TR>
+
+% } # end if @notes
+
+% foreach my $note (@notes) {
 %
 %   my $pop = popurl(3);
 %   my $notenum = $note->notenum;
 %             '('.emt('delete').')</A>';
 %   }
 %
-% if ( $last_classnum != $note->classnum && !$skipheader ) {
-% my $tmp_classnum = $note->classnum ? $note->classnum : 0;
-% $classes{$tmp_classnum} = $note->classname ne '' ? $note->classname 
-%                                                   : emt('Other');
-% if ( $last_classnum != -1 ) {
-    </TABLE>
-  </DIV>
-% }
-% my $display = ($tmp_classnum == 0 || !$conf->exists('note-classes') 
-%                                  || $conf->config('note-classes') < 2) 
-%                                                          ? 'block' : 'none';
-       <DIV    id="notes_<% $tmp_classnum %>"
-               style="display:<% $display %>"
-       >
-       <& /elements/table-grid.html &>
-       <TR>
-           <TH CLASS="grid" BGCOLOR="#cccccc"><% mt('Date') |h %></TH>
-%   if ( $conf->exists('cust_main_note-display_times') ) {
-           <TH CLASS="grid" BGCOLOR="#cccccc"><% mt('Time') |h %></TH>
-%   }
-           <TH CLASS="grid" BGCOLOR="#cccccc"><% mt('Person') |h %></TH>
-%   if ($conf->exists('note-classes') && $conf->config('note-classes') == 1) {
-           <TH CLASS="grid" BGCOLOR="#cccccc"><% mt('Class') |h %></TH>
-%   }
-           <TH CLASS="grid" BGCOLOR="#cccccc"><% mt('Note') |h %></TH>
-%   if ($curuser->access_right('Edit customer note') ) {
-           <TH CLASS="grid" BGCOLOR="#cccccc">&nbsp;</TH>
-%   }
-       </TR>
-% $skipheader = (!$conf->exists('note-classes') || $conf->config('note-classes') < 2);
-% $last_classnum = $note->classnum;
-% }
-
-% my $color = $note->sticky ? $sticky_color{$bgcolor} : $bgcolor;
+    <TR ID="notes_<% $note->notenum %>"
+        data-sticky="<% $note->sticky ? 1 : 0 %>"
+        <% $note_classes_conf ? ' data-classnum="'.($note->classnum || 0).'"' : '' %>>
 
-    <TR>
-      <% note_datestr($note,$conf,$color) %>
-      <TD CLASS="grid" BGCOLOR="<% $color %>">
+      <% note_datestr($note,$conf) %>
+      <TD CLASS="grid">
         &nbsp;<% $note->usernum ? $note->access_user->name : $note->otaker %>
       </TD>
-% if ($conf->exists('note-classes') && $conf->config('note-classes') == 1) {
-      <TD CLASS="grid" BGCOLOR="<% $color %>">
+%   if ($note_classes_conf) {
+      <TD CLASS="grid">
        <% $note->classname %>   
       </TD>
-% }
-      <TD CLASS="grid" BGCOLOR="<% $color %>">
+%   }
+      <TD CLASS="grid">
         <% $note->comments | defang %>
       </TD>
-% if($edit) {
-      <TD CLASS="grid" BGCOLOR="<% $color %>"><% $edit %></TD>
-% }
+%   if ($edit) {
+      <TD CLASS="grid"><% $edit %></TD>
+%   }
     </TR>
-
-% } #end display notes
+% } #end foreach note
 
 </TABLE>
-</DIV>
 
-% if ( $conf->exists('note-classes') && $conf->config('note-classes') == 2 ) {
-%      my($classnum,$classname);
-<% mt('Show notes of class:') |h %> &nbsp; 
-%      foreach my $classnum ( sort { $b <=> $a } (keys %classes) ) {
-           <A  id="notes_tablink_<% $classnum %>"
-               HREF="javascript:display_notes_classnum(<% $classnum %>)"
-               style="font-weight: <% $classnum == 0 ? 'bold' : 'normal' %>"
-           ><% $classes{$classnum} %></A>
-%      }
-    <BR>
-% }
+<SCRIPT>display_notes_classnum('-1')</SCRIPT>
 
-% }
 <%init>
 
 use HTML::Defang;
@@ -157,13 +138,18 @@ my(%opt) = @_;
 my $cust_main = $opt{'cust_main'};
 my $custnum = $cust_main->custnum;
 
-my (@notes) = $cust_main->notes($conf->exists('note-classes') && $conf->config('note-classes') == 2);
+my $note_classes_conf = $conf->exists('note-classes') ? $conf->config('note-classes') : '';
+
+my (@notes) = $cust_main->notes();
+
+my %classes = map { ($_->classnum || 0) => ( $_->classname ne '' ? $_->classname : '('.emt('unclassified').')' ) } @notes;
+$classes{'-1'} = 'All';
 
 #subroutines
 
 sub note_datestr {
-  my($note, $conf, $bgcolor) = @_ or return '';
-  my $td = qq{<TD CLASS="grid" BGCOLOR="$bgcolor" ALIGN="right">};
+  my($note, $conf) = @_ or return '';
+  my $td = qq{<TD CLASS="grid" ALIGN="right">};
   my $format = "$td%b&nbsp;%o,&nbsp;%Y</TD>";
   $format .= "$td%l:%M%P</TD>"
     if $conf->exists('cust_main_note-display_times');