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;