[Rt-commit] rt branch, 4.6/canned-reports, updated. rt-4.4.1-163-g8da8ce3

Dustin Collins strega at bestpractical.com
Tue Jan 3 04:04:49 EST 2017


The branch, 4.6/canned-reports has been updated
       via  8da8ce303dd4f425af079c6e7abd5b4c607203a4 (commit)
      from  00d21de47feba129ab408135f2a267a79e7ff9e8 (commit)

Summary of changes:
 lib/RT/CannedReport/FieldByField.pm                |  1 -
 share/html/CannedReport/Elements/Menu              |  1 +
 share/html/CannedReport/Elements/MenuItem          |  2 +-
 .../MenuItems/{ReportSelect => OptionSelect}       | 26 +++++--
 .../CannedReport/Elements/MenuItems/ReportSelect   |  2 +-
 share/html/Helpers/CannedReports                   | 17 ++++-
 share/static/js/canned-reports.js                  | 82 +++++++++++++++++++---
 7 files changed, 112 insertions(+), 19 deletions(-)
 copy share/html/CannedReport/Elements/MenuItems/{ReportSelect => OptionSelect} (72%)

- Log -----------------------------------------------------------------
commit 8da8ce303dd4f425af079c6e7abd5b4c607203a4
Author: Dustin Collins <strega at bestpractical.com>
Date:   Tue Jan 3 04:04:30 2017 -0500

    Add report option menus

diff --git a/lib/RT/CannedReport/FieldByField.pm b/lib/RT/CannedReport/FieldByField.pm
index 0e50731..9fe3ec4 100644
--- a/lib/RT/CannedReport/FieldByField.pm
+++ b/lib/RT/CannedReport/FieldByField.pm
@@ -62,7 +62,6 @@ sub Reports {
 
 sub Options {
     my $self = shift;
-    my $report = shift;
     return [{Option => "field2", Values => [{Name => "By Owner",  Key => 'owner'},
                                             {Name => "By Queue",  Key => 'queue'}]
             },
diff --git a/share/html/CannedReport/Elements/Menu b/share/html/CannedReport/Elements/Menu
index b3a9a37..4f8d7ff 100644
--- a/share/html/CannedReport/Elements/Menu
+++ b/share/html/CannedReport/Elements/Menu
@@ -42,5 +42,6 @@
     </div>
     <div class="reports-menu">
         <& MenuItems/ReportSelect, Name => "Time Worked"  &>
+        <span class="reports-menu-options"></span>
     </div>
 </div>
diff --git a/share/html/CannedReport/Elements/MenuItem b/share/html/CannedReport/Elements/MenuItem
index eff4b89..928c6fc 100644
--- a/share/html/CannedReport/Elements/MenuItem
+++ b/share/html/CannedReport/Elements/MenuItem
@@ -50,7 +50,7 @@ my $content = $m->content;
         <span><% $title %></span>
         <image src="/static/images/disclosure-down.png" width="24" height="14" />
     </div>
-    <div id="ReportDropdown" class="reports-menu-item-content">
+    <div id="<% $id %>" class="reports-menu-item-content">
 % if ($content) {
         <% $content | n %>
 % }
diff --git a/share/html/CannedReport/Elements/MenuItems/ReportSelect b/share/html/CannedReport/Elements/MenuItems/OptionSelect
similarity index 72%
copy from share/html/CannedReport/Elements/MenuItems/ReportSelect
copy to share/html/CannedReport/Elements/MenuItems/OptionSelect
index 3a81242..b4d19fc 100644
--- a/share/html/CannedReport/Elements/MenuItems/ReportSelect
+++ b/share/html/CannedReport/Elements/MenuItems/OptionSelect
@@ -37,20 +37,36 @@
 %# END BPS TAGGED BLOCK }}}
 
 <%ARGS>
-$name => undef
+$name
+$option
+$value => undef
 </%ARGS>
 
 <%INIT>
 use RT::CannedReports;
 my $reports = RT::CannedReports->new($session{'CurrentUser'});
+my $report = $reports->ReportFromReportName($name);
 
-my @names = $reports->AllReportNames();
+my $selectedOption;
+for my $availableOption (@{$report->Options}) {
+    if (!$option || $availableOption->{Option} eq $option) {
+        $selectedOption = $availableOption;
+        last;
+    }
+}
 
+my $selectedValue;
+for my $availableValue (@{$selectedOption->{Values}}) {
+    if (!$value || $availableValue->{Key} eq $value) {
+        $selectedValue = $availableValue;
+        last;
+    }
+}
 </%INIT>
 
-<&| ../MenuItem, title => $names[0], id => "name" &>
-% for my $aReportName (@names) {
-    <a onclick="setParameter('name', '<% $aReportName %>')"><% $aReportName %></a>
+<&| ../MenuItem, title => $selectedValue->{Name}, id => $option &>
+% for my $optionValue (@{$selectedOption->{Values}}) {
+    <a onclick="setParameter('<% $selectedOption->{Option} %>', '<% $optionValue->{Key} %>')"><% $optionValue->{Name} %></a>
 % }
 </&>
 
diff --git a/share/html/CannedReport/Elements/MenuItems/ReportSelect b/share/html/CannedReport/Elements/MenuItems/ReportSelect
index 3a81242..8113b00 100644
--- a/share/html/CannedReport/Elements/MenuItems/ReportSelect
+++ b/share/html/CannedReport/Elements/MenuItems/ReportSelect
@@ -48,7 +48,7 @@ my @names = $reports->AllReportNames();
 
 </%INIT>
 
-<&| ../MenuItem, title => $names[0], id => "name" &>
+<&| ../MenuItem, title => "", id => "name" &>
 % for my $aReportName (@names) {
     <a onclick="setParameter('name', '<% $aReportName %>')"><% $aReportName %></a>
 % }
diff --git a/share/html/Helpers/CannedReports b/share/html/Helpers/CannedReports
index e25718f..695d408 100644
--- a/share/html/Helpers/CannedReports
+++ b/share/html/Helpers/CannedReports
@@ -48,7 +48,8 @@
 <%ARGS>
 $cmd => "results"
 $name
-$kind => undef
+$key => undef
+$value => undef
 </%ARGS>
 <%init>
 
@@ -66,7 +67,7 @@ my $report = $reports->ReportFromReportName($name);
 if ($cmd eq "results") {
     if (ref $report) {
         my $results = $report->Results(\%ARGS);
-        if ($kind && $kind eq "table") {
+        if ($key && $key eq "table") {
             my $html = "<table>";
             for my $hashRef (@$results) {
                 $html .= "\n";
@@ -80,6 +81,18 @@ if ($cmd eq "results") {
             $object{code} = 200;
         }
     }
+}elsif ($cmd eq "options") {
+    if (ref $report) {
+        my $options = $report->Options;
+        $object{content} = $options;
+        $object{code} = 200;
+    }
+}elsif ($cmd eq "optionsMenuItem") {
+    if (ref $report) {
+        my $options = $report->Options;
+        $object{content} = $m->scomp('/CannedReport/Elements/MenuItems/OptionSelect', name => $name, option => $key, value => $value);
+        $object{code} = 200;
+    }
 }
 
 $m->out(encode_json(\%object));
diff --git a/share/static/js/canned-reports.js b/share/static/js/canned-reports.js
index 502939c..2ba94ca 100644
--- a/share/static/js/canned-reports.js
+++ b/share/static/js/canned-reports.js
@@ -3,21 +3,43 @@
 function getReportResults(parameters, kind, completion) {
     var url = "/Helpers/CannedReports?cmd=results";
     if (kind) {
-        url += "&kind=" + kind;
+        url += "&key=" + kind;
     }
     for (var key in parameters) {
         url += "&" + key + "=" + parameters[key];
     }
     submit(url, null, null, function(code, message, content) {
-           completion(code == 200, content);
+        completion(code == 200, content);
     })
 }
 
-function submit(path, pairs, data, completion) {
-//    jQuery.post(path, pairs, function(object) {
-//        completion(object["code"], object["message"], object["content"])
-//    },'json');
+function getReportOptions(parameters, completion) {
+    var url = "/Helpers/CannedReports?cmd=options";
+    for (var key in parameters) {
+        url += "&" + key + "=" + parameters[key];
+    }
+    submit(url, null, null, function(code, message, content) {
+        completion(code == 200, content);
+    })
+}
 
+function getReportOptionsMenuItem(option, optionKey, parameters, completion) {
+    var url = "/Helpers/CannedReports?cmd=optionsMenuItem";
+    if (option) {
+        url += "&key=" + option;
+    }
+    if (optionKey) {
+        url += "&value=" + optionKey;
+    }
+    for (var key in parameters) {
+        url += "&" + key + "=" + parameters[key];
+    }
+    submit(url, null, null, function(code, message, content) {
+        completion(code == 200, content);
+    })
+}
+
+function submit(path, pairs, data, completion) {
     jQuery.ajax({url: path,
                 success: function(object) {
                     completion(object["code"], object["message"], object["content"])
@@ -68,21 +90,63 @@ jQuery(document).ready(function() {
 
 
 //MARK: Menu
-
+var _options;//set from within replaceOptionsMenuItems()
 function updateMenu() {
     //Report name menu item
     var menu = jQuery("#name.reports-menu-item")
     var label = menu.find("div").find("span")
-    label.text(_parameters["name"])
+    if (_parameters["name"] !== label.text()) {
+        label.text(_parameters["name"])
+        replaceOptionsMenuItems()
+    }else{
+        var optionElements = jQuery(".reports-menu-options").children()
+        for (e in optionElements) {
+            var element = optionElements[e];
+            for (i in _options) {
+                var option = _options[i]
+                if (option.Option === element.id) {
+                    var label = jQuery(element).find("div").find("span")
+                    for (v in option.Values) {
+                        var value = option.Values[v]
+                        if (value.Key === _parameters[option.Option]) {
+                            label.text(value.Name)
+                            break;
+                        }
+                    }
+                    break;
+                }
+            }
+        }
+    }
+}
+
+function replaceOptionsMenuItems() {
+    jQuery(".reports-menu-options").children().slideUp(300, function() { jQuery(this).remove() })
+    getReportOptions(_parameters, function (success, content) {
+        _options = content;
+        for (i in content) {
+            var option = content[i].Option
+            if (option) {
+                getReportOptionsMenuItem(option, _parameters[option], _parameters, function (success, content) {
+                    jQuery(".reports-menu-options").append(content)
+                    updateMenuActions()
+                })
+            }
+        }
+    })
 }
 
 jQuery(document).ready(function() {
+    updateMenuActions()
+})
+
+function updateMenuActions() {
     jQuery(".reports-menu-item-btn").on('click', '*', function() {
         jQuery('.reports-menu-item-content').hide();
         var menu = jQuery(this).parents(".reports-menu-item");
         menu.find(".reports-menu-item-content").toggle();
     })
-})
+}
 
 window.onclick = function(event) {
     //Close open menus

-----------------------------------------------------------------------


More information about the rt-commit mailing list