Author: spadkins
Date: Fri Oct  9 08:43:04 2009
New Revision: 13384

Modified:
   p5ee/trunk/App-Widget-ExtJS/lib/App/Widget/ExtJS/MenuSelector.pm

Log:
dynamic building of menu, submenu and menu toolbar from node list

Modified: p5ee/trunk/App-Widget-ExtJS/lib/App/Widget/ExtJS/MenuSelector.pm
==============================================================================
--- p5ee/trunk/App-Widget-ExtJS/lib/App/Widget/ExtJS/MenuSelector.pm    
(original)
+++ p5ee/trunk/App-Widget-ExtJS/lib/App/Widget/ExtJS/MenuSelector.pm    Fri Oct 
 9 08:43:04 2009
@@ -9,7 +9,7 @@
 use App;
 use App::Widget::HierSelector;
 use App::Widget::ExtJS;
-...@isa = ( "App::Widget::ExtJS", "App::Widget::HierSelector" );
+...@isa = ( "App::Widget::HierSelector", "App::Widget::ExtJS" );
 
 use strict;
 
@@ -81,6 +81,323 @@
     }
     my $auth = $context->authorization();
     my (@args, $auth_name);
+
+    ######################################
+    # Bulid the Menu & Submenu structure
+    ######################################
+    use Sort::Versions;
+
+    my ($ordered_nodes, $parent_node_key, $stripped_node, $node_menu, 
$menu_hash, $sub_menu_hash);
+    my ($menus, $sub_menus, $sub_menus_reverse, @sub_menu_reverse_order, 
$menu_toolbar);
+
+    foreach my $node_key (sort {versioncmp($a, $b)} keys %$node) {
+        my $value = $node->{$node_key}{value};
+        my $wname = $node->{$node_key}{wname};
+        my $open  = $node->{$node_key}{open};
+        push (@$ordered_nodes, [{value => $value, wname => $wname, open => 
$open, node => $node_key}]);
+    }
+
+    for (my $i = 0; $i <= $#$ordered_nodes; $i++) {
+        my $array = $ordered_nodes->[$i];
+        foreach my $hash (@{$array}) {
+            my $node       = $hash->{node};
+            my $value      = $hash->{value};
+            my $wname      = $hash->{wname};
+            my @node_level = split(/\./, $node);
+
+            if ($#node_level > 1) {
+                $stripped_node = $node;
+                $stripped_node =~ s/(.*?)\.\d+$/$1/g;
+            }
+            if ($#node_level == 0) {
+                $parent_node_key = $node;
+                $node_menu->{$node}{attribs} = {value => $value, wname => 
$wname};
+            }
+            else {
+                if ($stripped_node) {
+                    $node_menu->{$parent_node_key}{$stripped_node}{$node} = 
{value => $value, wname => $wname};
+
+                    my $parent_stripped_node = $stripped_node;
+                    $parent_stripped_node =~ s/(.*?)\.\d+$/$1/g;
+
+                    my $stripped_hash     = 
$node_menu->{$parent_node_key}{$parent_stripped_node}{$stripped_node};
+                    my $stripped_node_val = $stripped_hash->{value};
+
+                    if ($stripped_node_val) {
+                        
$node_menu->{$parent_node_key}{$stripped_node}{attribs} = { value => 
$stripped_node_val, wname => $wname };
+                    }
+                }
+                else {
+                    $node_menu->{$parent_node_key}{$node} = { attribs => 
{value => $value, wname => $wname} };
+                }
+            }
+            $stripped_node = "";
+        }
+    }
+
+    foreach my $node_key (sort {versioncmp($a, $b)} keys %$node_menu) {
+        my $sub_menu_flg    = 0;
+        my $node_cnt        = 0;
+        my $menus           = [];
+        my $sub_menus       = [];
+        my $sub_menu        = [];
+        my $hash            = $node_menu->{$node_key};
+        my $parent_node_key = $node_key;
+        my $parent_value    = $node_menu->{$node_key}{attribs}{value};
+
+        foreach my $hash_key (sort {versioncmp($a, $b)} keys %$hash) {
+            next if ($hash_key eq "attribs");
+            my $hash2 = $hash->{$hash_key};
+            if (ref $hash2 eq "HASH") {
+                foreach my $hash_key2 (sort {versioncmp($a, $b)} keys %$hash2) 
{
+                    my ($node, $value);
+                    $node_cnt++;
+
+                    my $attribs    = $hash2->{attribs};
+                    my $wname      = $attribs->{wname};
+                    my $menu_value = $attribs->{value};
+
+                    if ($hash_key2 =~ /^(\d+\.\d+\.*)/) {
+                        $node = $hash_key2;
+                        $sub_menu_flg = 1;
+                    }
+                    else {
+                        $node = $hash_key;
+                    }
+
+                    if (ref $hash2->{$hash_key2} eq 'HASH') {
+                        $value = $hash2->{$hash_key2}{value};
+                        $wname = $hash2->{$hash_key2}{wname} if 
($hash2->{$hash_key2}{wname});
+                    }
+                    else {
+                        $value = $hash2->{$hash_key2};
+                    }
+
+                    #print STDERR 
"[$node][$value][$menu_value][$sub_menu_flg][$wname]\n";
+
+                    if (!$sub_menu_flg) {
+                        push(@$menus, [ {text => $value, node => $node, parent 
=> $parent_value, parent_node => $parent_node_key, wname => $wname} ]);
+                    }
+                    if ($hash_key2 ne 'attribs' && $sub_menu_flg) {
+                        push(@$sub_menu, [ {text => $value, node => $node, 
parent => $parent_value,
+                                            parent_node => $parent_node_key, 
var_name => $menu_value, wname => $wname } ]);
+                    }
+                    if ($hash_key2 eq 'attribs' && $sub_menu_flg) {
+                        my @node_num = split(/\./, $node);
+                        if ($#node_num == 1) {
+                            if ($node_cnt == 1) {
+                                push(@$menus, [ {text => $value, node => 
$node, parent => $parent_value, parent_node => $parent_node_key, wname => 
$wname} ]);
+                            }
+                            else {
+                                push(@$menus, [ {text => $value, node => 
$node, parent => $parent_value,
+                                                 parent_node => 
$parent_node_key, menu => $menu_value, wname => $wname} ]);
+                            }
+                        }
+                        push (@$sub_menus, $sub_menu);
+                        $sub_menu = [];
+                        #print STDERR "===========\n";
+                        $node_cnt = 0;
+                    }
+                }
+            }
+        }
+        if ($#$menus > -1) {
+            $menu_hash->{$parent_node_key} = $menus;
+        }
+        if ($#$sub_menus > -1) {
+            $sub_menu_hash->{$parent_node_key} = $sub_menus;
+        }
+        #print STDERR "==========================\n";
+    }
+
+    ######################################
+    # Bulid the Sub Menus
+    ######################################
+    foreach my $hash_key (sort {versioncmp($a, $b)} keys %$sub_menu_hash) {
+        my $array = $sub_menu_hash->{$hash_key};
+        my $last_node_level = 0;
+        my $node_level;
+        for (my $i = 0; $i <= $#$array; $i++) {
+            my %next_nodes;
+            my $next_array = $array->[$i + 1];
+
+            for (my $ii = 0; $ii <= $#$next_array; $ii++) {
+                my $next_array2 = $next_array->[$ii];
+                for (my $l = 0; $l <= $#$next_array2; $l++) {
+                    my $next_hash = $next_array2->[$l];
+                    my $node      = $next_hash->{node};
+                    my $var_name  = $next_hash->{var_name};
+                    my $stripped_node = $node;
+                    $stripped_node =~ s/(.*?)\.\d+$/$1/g;
+                    $next_nodes{$stripped_node} = $var_name;
+                }
+            }
+
+            my $array2 = $array->[$i];
+            for (my $j = 0; $j <= $#$array2; $j++) {
+                 my $array3 = $array2->[$j];
+
+                 for (my $k = 0; $k <= $#$array3; $k++) {
+                     my $hash = $array3->[$k];
+                     my $parent      = $hash->{text};
+                     my $parent_node = $hash->{parent_node};
+                     my $var_name    = $hash->{var_name};
+                     my $text        = $hash->{text};
+                     my $node        = $hash->{node};
+                     my $wname       = $hash->{wname};
+
+                     $text =~ s/\'//g;
+
+                     my @node_level = split(/\./, $node);
+                     $node_level = $#node_level;
+                     $last_node_level = $node_level if (!$last_node_level);
+
+                     my $handler_or_menu = "        handler: 
App.callbacks.menuItemSelected.createDelegate(this, ['$node','$wname'], 
true)\n";
+                     my $menu_var;
+
+                     if ($next_nodes{$node}) {
+                         $menu_var = $next_nodes{$node};
+                         $menu_var = lc($menu_var);
+                         $menu_var =~ s/\s+//g;  $menu_var =~ s/-//g;
+                         $menu_var = "${menu_var}Submenu";
+                         $handler_or_menu = "        menu: $menu_var\n";
+                     }
+
+                     if ($node_level <= $last_node_level) {
+                         if ($j == 0) {
+                             $var_name = lc($var_name);
+                             $var_name =~ s/\s+//g;  $var_name =~ s/-//g;
+                             $sub_menus .= "var ${var_name}Submenu = [\n";
+                         }
+
+                         $sub_menus .= "    {\n";
+                         $sub_menus .= "        text: '$text',\n";
+                         $sub_menus .= "        icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',\n";
+                         $sub_menus .= $handler_or_menu;
+
+                         if ($j == $#$array2) {
+                             $sub_menus .= "    }\n";
+                             $sub_menus .= "];\n";
+                         }
+                         else {
+                             $sub_menus .= "    },\n";
+                         }
+                     }
+                     else {
+                         if ($j == 0) {
+                             $var_name = lc($var_name);
+                             $var_name =~ s/\s+//g;  $var_name =~ s/-//g;
+                             $sub_menus_reverse .= "var ${var_name}Submenu = 
[\n";
+                         }
+
+                         $sub_menus_reverse .= "    {\n";
+                         $sub_menus_reverse .= "        text: '$text',\n";
+                         $sub_menus_reverse .= "        icon: 
appOptions.urlDocRoot + '/members/car_rpm/resources/icons/arrow_divide.png',\n";
+                         $sub_menus_reverse .= $handler_or_menu;
+
+                         if ($j == $#$array2) {
+                             $sub_menus_reverse .= "    }\n";
+                             $sub_menus_reverse .= "];\n";
+                         }
+                         else {
+                             $sub_menus_reverse .= "    },\n";
+                         }
+                     }
+                     #print STDERR 
"[$node][$var_name][$text][$node_level][$last_node_level]\n";
+                 }
+            }
+            if ($sub_menus_reverse) {
+                push(@sub_menu_reverse_order, $sub_menus_reverse);
+                $sub_menus_reverse = "";
+            }
+            $last_node_level = $node_level;
+            #print STDERR  "===============\n";
+        }
+    }
+
+    my @sub_menus_first = ();
+    if ($#sub_menu_reverse_order > -1) {
+        @sub_menus_first = reverse(@sub_menu_reverse_order);
+    }
+
+    ######################################
+    # Bulid the menus
+    ######################################
+    foreach my $hash_key (sort {versioncmp($a, $b)} keys %$menu_hash) {
+        my $array = $menu_hash->{$hash_key};
+        for (my $i = 0; $i <= $#$array; $i++) {
+            my $array2 = $array->[$i];
+            for (my $j = 0; $j <= $#$array2; $j++) {
+                my $hash = $array2->[$j];
+                my $parent      = $hash->{parent};
+                my $parent_node = $hash->{parent_node};
+                my $menu        = $hash->{menu};
+                my $text        = $hash->{text};
+                my $node        = $hash->{node};
+                my $wname       = $hash->{wname};
+                #print STDERR "[$node][$parent][$menu][$text]\n";
+                if ($i == 0) {
+                    $parent = lc($parent);
+                    $parent =~ s/\s+//g;  $parent =~ s/-//g;
+                    $menus .= "var ${parent}Menu = [\n";
+                }
+                $menus .= "    {\n";
+                $menus .= "        text: '$text',\n";
+                $menus .= "        icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',\n";
+
+                if ($menu) {
+                    $menu = lc($menu);
+                    $menu =~ s/\s+//g;  $menu =~ s/-//g;
+                    $menus .= "        menu: ${menu}Submenu\n";
+                }
+                else {
+                    $menus .= "       handler: 
App.callbacks.menuItemSelected.createDelegate(this, ['$node','$wname'], 
true)\n";
+                }
+
+                if ($i == $#$array) {
+                    $menus .= "    }\n";
+                    $menus .= "];\n";
+                }
+                else {
+                    $menus .= "    },\n";
+                }
+            }
+        }
+        #print STDERR  "===============\n";
+    }
+
+    ######################################
+    # Bulid the menu toolbar
+    ######################################
+    my $num_menus = keys %$node_menu;
+    my $num_menus_cnt = 1;
+    foreach my $node_key (sort {versioncmp($a, $b)} keys %$node_menu) {
+        my $parent_node_key = $node_key;
+        my $parent_value    = $node_menu->{$node_key}{attribs}{value};
+        my $menu_txt        = $parent_value;
+
+        $menu_txt = lc($menu_txt);
+        $menu_txt =~ s/\s+//g;  $menu_txt =~ s/-//g;
+        $menu_txt = "${menu_txt}Menu";
+
+        if ($num_menus_cnt == 1) {
+            $menu_toolbar .= "var menuToolbar = [\n";
+        }
+        $menu_toolbar .= "    new Ext.Toolbar.MenuButton({\n";
+        $menu_toolbar .= "        text: '$parent_value',\n";
+        $menu_toolbar .= "        menu: { items: $menu_txt }\n";
+
+        if ($num_menus_cnt == $num_menus) {
+            $menu_toolbar .= "    })\n";
+            $menu_toolbar .= "];\n";
+        }
+        else {
+            $menu_toolbar .= "    }),\n";
+            $menu_toolbar .= "    ' ', ' ', ' ',\n";
+        }
+        $num_menus_cnt++;
+    }
+
     for (; $nodelevel <= $#nodeidx; $nodelevel++) {
         $html .= "\n<!-- ExtJS::MenuSelector (BEGIN) -->\n";
 
@@ -100,245 +417,32 @@
 
     $html = <<EOF;
 <script type="text/javascript">
-App.callbacks.menuItemSelected = function(button) {
-    alert('you clicked ' + button.text);
+
+App.callbacks.menuItemSelected = function(evt, t, args1, args2) {
+    //alert('you clicked - args1=[' + args1 + '] args2=[' + args2 + ']');
+    f=document.forms[0];
+    e=document.getElementById('app-event-aux');
+    e.value = '${name}.open_exclusively(' + args1 + ')';
+    f.submit();
+    e.value = '';
+    return(0);
 }
 
 Ext.onReady(function(){
 
-    var authOrgSubmenu = [
-        { 
-            text: 'Org', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        }, 
-        { 
-            text: 'OrgUsrMemb', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },    
-        {
-            text: 'OrgUsrAccess', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'OrgAppAccess', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        }    
-    ];
-    
-    var authMenu = [
-        { 
-            text: 'Org SubMenu', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            menu: authOrgSubmenu 
-        },
-        { 
-            text: 'User', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'User Setup', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },        
-        {
-            text: 'CorpOrgMemb', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'User Email', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'User Prefs', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'UsrCorpAffil', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'App', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Role', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        {
-            text: 'RoleUsrGrant', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        {
-            text: 'Perm', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'PermRoleGrant', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'SalesInquiry', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },     
-        { 
-            text: 'SalesPreauth', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        }     
-    ];
-    
-    var generalMenu = [
-        { 
-            text: 'Task Schedule', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Currency (xignite)', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        }
-    ];
-       
-    var carMenu = [
-        { 
-            text: 'Car Orgs', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Car Users', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Car Sources', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Profiles', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Shop Requests', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        }
-    ];
+    @sub_menus_first
+    $sub_menus
+    $menus
+    $menu_toolbar
 
-    var airMenu = [
-        { 
-            text: 'Air Orgs', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Air Users', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Air Sources', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        }
-    ];
-  
-    var hotelMenu = [
-        { 
-            text: 'Props', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Chains', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'E-Mail', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Profiles', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        {
-            text: 'Users', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        {
-            text: 'Demand Load', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Contracts', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        },
-        { 
-            text: 'Dist Mgmt', 
-            icon: appOptions.urlDocRoot + 
'/members/car_rpm/resources/icons/arrow_divide.png',
-            handler: App.callbacks.menuItemSelected
-        }     
-    ];
-
-    var exampleToolbar = [
-        new Ext.Toolbar.MenuButton({
-            text: 'Auth',
-            menu: { items: authMenu }
-        }),
-        ' ', ' ', ' ',
-        new Ext.Toolbar.MenuButton({
-            text: 'General', 
-            menu: { items: generalMenu }
-        }),
-        ' ', ' ', ' ',
-        new Ext.Toolbar.MenuButton({
-            text: 'Rental Cars', 
-            menu: { items: carMenu }
-        }),
-        ' ', ' ', ' ',
-        new Ext.Toolbar.MenuButton({
-            text: 'Airlines', 
-            menu: { items: airMenu }
-        }),
-        ' ', ' ', ' ',
-        new Ext.Toolbar.MenuButton({
-            text: 'Hotels', 
-            menu: { items: hotelMenu }
-        })
-    ];
-    
     var menuPanel = new Ext.Panel({
         id: 'MenuPanel',
-        tbar: exampleToolbar,
+        tbar: menuToolbar,
         html: '{PANEL}'
     });
-    
+
     menuPanel.render('$name');
-   
+
 });
 </script>
 EOF
@@ -348,5 +452,5 @@
     $html;
 }
 
-1;
 
+1;

Reply via email to