Author: spadkins
Date: Thu Sep 17 05:40:39 2009
New Revision: 13356
Added:
p5ee/trunk/App-Widget-ExtJS/lib/App/Widget/ExtJS/AppFrame.pm
p5ee/trunk/App-Widget-ExtJS/lib/App/Widget/ExtJS/MenuSelector.pm
Log:
new
Added: p5ee/trunk/App-Widget-ExtJS/lib/App/Widget/ExtJS/AppFrame.pm
==============================================================================
--- (empty file)
+++ p5ee/trunk/App-Widget-ExtJS/lib/App/Widget/ExtJS/AppFrame.pm Thu Sep
17 05:40:39 2009
@@ -0,0 +1,240 @@
+
+######################################################################
+## $Id: AppFrame.pm 3668 2006-03-11 20:51:13Z spadkins $
+######################################################################
+
+package App::Widget::ExtJS::AppFrame;
+$VERSION = (q$Revision: 3668 $ =~ /(\d[\d\.]*)/)[0]; # VERSION numbers
generated by svn
+
+use App;
+use App::Widget::TabbedAppFrame;
+use App::Widget::ExtJS;
+...@isa = ( "App::Widget::TabbedAppFrame", "App::Widget::ExtJS" );
+
+use strict;
+
+=head1 NAME
+
+App::Widget::ExtJS::AppFrame - An application frame.
+
+=head1 SYNOPSIS
+
+ $name = "office";
+
+ # official way
+ use Widget;
+ $context = App->context();
+ $w = $context->widget($name);
+
+ # internal way
+ use App::Widget::ExtJS::AppFrame;
+ $w = App::Widget::ExtJS::AppFrame->new($name);
+
+=cut
+
+######################################################################
+# CONSTANTS
+######################################################################
+
+######################################################################
+# ATTRIBUTES
+######################################################################
+
+# INPUTS FROM THE ENVIRONMENT
+
+=head1 DESCRIPTION
+
+This class implements an application frame.
+This includes a menu, an application toolbar, a screen selector,
+a screen title, a screen toolbar, and
+a screen frame. The application is actually implemented by the set
+of screens that the application frame is configured to allow navigation
+to.
+
+The application frame can implement itself in frames if it is
+configured to do so. Otherwise, it implements itself as a table.
+
+=cut
+
+######################################################################
+# INITIALIZATION
+######################################################################
+
+sub _init {
+ &App::sub_entry if ($App::trace);
+ my $self = shift;
+ $self->SUPER::_init(@_);
+ $self->init_js();
+ &App::sub_exit() if ($App::trace);
+}
+
+######################################################################
+# EVENTS
+######################################################################
+
+sub handle_event {
+ my ($self, $wname, $event, @args) = @_;
+ my ($context, $name, $node);
+ my ($selector_widget, $screen_wname, $screen_widget, $screen_settings);
+ my ($screen_msg, $target);
+
+ $name = $self->{name};
+ $context = $self->{context};
+
+ if ($wname eq "$name-selector" && $event eq "select") {
+ $selector_widget = $context->widget("$name-selector");
+ $screen_wname = $selector_widget->get_selected("wname");
+ $screen_widget = $context->widget($screen_wname);
+ $screen_settings = $selector_widget->get_selected("set");
+
+ if ($screen_settings) {
+ foreach (keys %$screen_settings) {
+ $screen_widget->set($_, $screen_settings->{$_});
+ }
+ }
+ else {
+ $screen_msg = $selector_widget->get_selected("send");
+ if ($screen_msg && ref($screen_msg) eq "ARRAY" && $#$screen_msg >=
1) {
+ my ($target_widget, $target_wname, $method, @args);
+ ($target_wname, $method, @args) = @$screen_msg;
+ $target_widget = $context->widget($target_wname);
+ $target_widget->$method(@args);
+ }
+ }
+
+ #my $frame = $selector_widget->get_selected("frame");
+ #if (defined $frame) {
+ # my ($key);
+ # foreach $key (keys %$frame) {
+ # $self->set($key,$frame->{$key});
+ # }
+ #}
+
+ #my $target = $selector_widget->get_selected("target");
+ #if ($target) {
+ # $main::target = $target;
+ #}
+
+ #$self->{noframe} = $selector_widget->get_selected("noframe");
+
+ return 1;
+ }
+ else {
+ return $self->SUPER::handle_event($wname, $event, @args);
+ }
+}
+
+
+######################################################################
+# OUTPUT METHODS
+######################################################################
+
+sub html {
+ my $self = shift;
+ my ($context, $name, $html);
+ $name = $self->{name};
+ $context = $self->{context};
+
+ my ($menu, $toolbar, $screentitle, $screentoolbar);
+ my ($selector_widget, $selector);
+ my ($screen_wname, $screen, $screen_widget, $screen_bgcolor);
+ my ($screentitle_widget, $screentitle_bgcolor, $screentitle_value);
+
+ #$menu = $context->widget("$name-menu",
+ # class => "App::Widget::Menu",
+ # )->html();
+
+ #$toolbar = $context->widget("$name-toolbar",
+ # class => "App::Widget::Toolbar",
+ # )->html();
+
+ #$screentoolbar = $context->widget("$name-screentoolbar",
+ # class => "App::Widget::Toolbar",
+ # )->html();
+
+ $selector_widget = $context->widget("$name-selector",
+ class => "App::Widget::ExtJS::MenuSelector",
+ );
+
+ $selector = $selector_widget->html();
+ $screen_wname = $selector_widget->get_selected("wname");
+
+ if ($screen_wname) {
+ $screen_widget = $context->widget($screen_wname);
+ $screentitle_value = $selector_widget->get_selected("value");
+ $screentitle_value = $screen_widget->label() if (!$screentitle_value);
+ if ($screen_widget->can("html")) {
+ $screen = $screen_widget->html();
+ }
+ else {
+ $screen = "[$screen_wname: not yet defined]";
+ }
+ $screen_bgcolor = $screen_widget->get("bgcolor");
+ $screen_bgcolor = "#ffffff" if (!defined $screen_bgcolor);
+ }
+ else {
+ $screentitle_value = " ";
+ $screen = " ";
+ $screen_bgcolor = "#cccccc";
+ }
+
+ $screentitle_bgcolor = "#888888";
+ $screentitle = "<font face=verdana,geneva,arial,sans-serif size=+1
color=#ffffff>$screentitle_value</font>";
+
+ my ($messages, $messagebox);
+ $messages = $context->get_messages();
+ $messages =~ s/\n/<br>\n/g;
+ $messagebox = "";
+ if (defined $messages && $messages ne "") {
+ my ($elem_begin, $elem_end, $font_face, $font_size, $font_color);
+ $font_face = $self->{font_face} || "verdana,geneva,arial,sans-serif";
+ $font_size = $self->{font_size} || "+1";
+ $font_color = $self->{font_color};
+ $elem_begin = "";
+ $elem_end = "";
+ if ($font_face || $font_size || $font_color) {
+ $elem_begin = "<font";
+ $elem_begin .= " face=\"$font_face\"" if ($font_face);
+ $elem_begin .= " size=\"" . ($font_size+1) . "\"" if
($font_size);
+ $elem_begin .= " color=\"$font_color\"" if ($font_color);
+ $elem_begin .= ">";
+ $elem_end = "</font>";
+ }
+
+ $messagebox = <<EOF;
+<table width=100% border=0 cellspacing=0 cellpadding=4>
+ <TR>
+ <TD>
+ <table width=100% border=0 cellspacing=0 cellpadding=4>
+ <TR>
+ <TD class=body_sub1 valign=top align=left
bgcolor=#ffaaaa>$elem_begin<B>Messages</B>$elem_end</TD>
+ </TR>
+ <TR>
+ <TD valign=top align=left class=body_sub2>
+ $elem_begin$messages$elem_end
+ </TD>
+ </TR>
+ <TR>
+ <TD valign=top align=left height=4></TD>
+ </TR>
+ </table>
+ </td>
+ </tr>
+</table>
+EOF
+ }
+
+ $html = <<EOF;
+<div id="$name">
+<div id="$name-selector">
+$selector
+$screen
+</div>
+</div>
+EOF
+ return($html);
+}
+
+
+1;
+
Added: p5ee/trunk/App-Widget-ExtJS/lib/App/Widget/ExtJS/MenuSelector.pm
==============================================================================
--- (empty file)
+++ p5ee/trunk/App-Widget-ExtJS/lib/App/Widget/ExtJS/MenuSelector.pm Thu Sep
17 05:40:39 2009
@@ -0,0 +1,352 @@
+
+######################################################################
+## $Id: MenuSelector.pm 9449 2007-04-25 14:56:42Z spadkins $
+######################################################################
+
+package App::Widget::ExtJS::MenuSelector;
+$VERSION = (q$Revision: 9449 $ =~ /(\d[\d\.]*)/)[0]; # VERSION numbers
generated by svn
+
+use App;
+use App::Widget::HierSelector;
+use App::Widget::ExtJS;
+...@isa = ( "App::Widget::ExtJS", "App::Widget::HierSelector" );
+
+use strict;
+
+=head1 NAME
+
+App::Widget::ExtJS::MenuSelector - A screen selector widget
+
+=head1 SYNOPSIS
+
+ use App::Widget::ExtJS::MenuSelector;
+
+ $name = "get_data";
+ $w = App::Widget::ExtJS::MenuSelector->new($name);
+ print $w->html();
+
+=cut
+
+=head1 DESCRIPTION
+
+This class implements a widget selector which is implemented as an
+Ext/JS menu.
+
+=cut
+
+######################################################################
+# INITIALIZATION
+######################################################################
+
+sub _init {
+ &App::sub_entry if ($App::trace);
+ my $self = shift;
+ $self->SUPER::_init(@_);
+ if (! $self->get("selected")) {
+ $self->select_first();
+ }
+ &App::sub_exit() if ($App::trace);
+}
+
+######################################################################
+# OUTPUT METHODS
+######################################################################
+
+sub html {
+ &App::sub_entry if ($App::trace);
+ my $self = shift;
+
+ my $context = $self->{context};
+ my $options = $context->{options};
+ my $name = $self->{name};
+ my $node = $self->node_list();
+ my $theme = $context->so_get("theme") || $options->{theme} || "app";
+ my $html_url_dir = $options->{html_url_dir};
+
+ my $html = "";
+
+ my ($nodebase, $nodeidx, $nodenumber, $nodelabel, $parentnodenumber,
$nodelevel);
+ my (@nodeidx, $w);
+
+ @nodeidx = ("1");
+
+
+ $html = "";
+
+ $nodelevel = 0;
+ $nodebase = "";
+ if (defined $node->{1} && !defined $node->{2}) {
+ $nodelevel = 1;
+ $nodebase = "1.";
+ }
+ my $auth = $context->authorization();
+ my (@args, $auth_name);
+ for (; $nodelevel <= $#nodeidx; $nodelevel++) {
+ $html .= "\n<!-- ExtJS::MenuSelector (BEGIN) -->\n";
+
+ $nodeidx = 1;
+ $nodenumber = "$nodebase$nodeidx"; # create its node number
+ while (defined $node->{$nodenumber}) {
+
+ $auth_name = $node->{$nodenumber}{auth_name};
+ if (!$auth_name ||
$auth->is_authorized("/App/SessionObject/$name/$auth_name")) {
+ }
+
+ $nodeidx++;
+ $nodenumber = "$nodebase$nodeidx"; # create its node number
+ }
+ $nodebase .= "$nodeidx[$nodelevel].";
+ }
+
+ $html = <<EOF;
+<script type="text/javascript">
+App.callbacks.menuItemSelected = function(button) {
+ alert('you clicked ' + button.text);
+}
+
+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
+ }
+ ];
+
+ 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,
+ html: '<br/><br/><center><b>Tables or other content would go
here</b></center><br/><br/>'
+ });
+
+ menuPanel.render('$name');
+
+});
+</script>
+EOF
+ $html .= "<!-- ExtJS::MenuSelector (END) -->\n";
+
+ &App::sub_exit() if ($App::trace);
+ $html;
+}
+
+1;
+