package FS::UI::CGI;
use strict;
use CGI;
#use CGI::Switch; #when FS::UID user and preference callback stuff is fixed
use CGI::Carp qw(fatalsToBrowser);
use HTML::Table;
use FS::UID qw(adminsuidsetup);
#use FS::Record qw( qsearch fields );
die "Can't initialize CGI interface; $FS::UI::Base::_lock used"
if $FS::UI::Base::_lock;
$FS::UI::Base::_lock = "FS::UI::CGI";
=head1 NAME
FS::UI::CGI - Base class for CGI user-interface objects
=head1 SYNOPSIS
use FS::UI::CGI;
use FS::UI::some_table;
$interface = new FS::UI::some_table;
$error = $interface->browse;
$error = $interface->search;
$error = $interface->view;
$error = $interface->edit;
$error = $interface->process;
=head1 DESCRIPTION
An FS::UI::CGI object represents a CGI interface object.
=head1 METHODS
=over 4
=item new
=cut
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = { @_ };
$self->{'_cgi'} = new CGI;
$self->{'_user'} = $self->{'_cgi'}->remote_user;
$self->{'_dbh'} = FS::UID::adminsuidsetup $self->{'_user'};
bless ( $self, $class);
}
sub activate {
my $self = shift;
print $self->_header,
join ( "
", map $_->sprint, @{ $self->{'Widgets'} } ),
$self->_footer,
;
}
=item _header
=cut
sub _header {
my $self = shift;
my $cgi = $self->{'_cgi'};
$cgi->header( '-expires' => 'now' ), '',
'
', $self->title, '',
'',
'', $self->title, '
',
;
}
=item _footer
=cut
sub _footer {
"";
}
=item interface
Returns the string `CGI'. Useful for the author of a table-specific UI class
to conditionally specify certain behaviour.
=cut
sub interface { 'CGI'; }
=back
=cut
package FS::UI::_Widget;
use vars qw( $AUTOLOAD );
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = { @_ };
bless ( $self, $class );
}
sub AUTOLOAD {
my $self = shift;
my $value = shift;
my($field)=$AUTOLOAD;
$field =~ s/.*://;
if ( defined($value) ) {
$self->{$field} = $value;
} else {
$self->{$field};
}
}
package FS::UI::_Text;
use vars qw ( @ISA );
@ISA = qw ( FS::UI::_Widget);
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = {};
$self->{'_text'} = shift;
bless ( $self, $class );
}
sub sprint {
my $self = shift;
$self->{'_text'};
}
package FS::UI::_Link;
use vars qw ( @ISA $BASE_URL );
@ISA = qw ( FS::UI::_Widget);
$BASE_URL = "http://rootwood.sisd.com/freeside";
sub sprint {
my $self = shift;
my $table = $self->{'table'};
my $method = $self->{'method'};
# i will be cleaned up when we're done moving from the old webinterface!
my @arg = @{$self->{'arg'}};
my $yuck = join( "&", @arg);
qq(). $self->{'text'}. "<\A>";
}
package FS::UI::_Table;
use vars qw ( @ISA );
@ISA = qw ( FS::UI::_Widget);
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = $class eq $proto ? { @_ } : $proto;
bless ( $self, $class );
$self->{'_table'} = new HTML::Table ( $self->rows, $self->columns );
$self;
}
sub attach {
my $self = shift;
my ( $row, $column, $widget, $rowspan, $colspan ) = @_;
$self->{"_table"}->setCell( $row+1, $column+1, $widget->sprint );
$self->{"_table"}->setCellRowSpan( $row+1, $column+1, $rowspan ) if $rowspan;
$self->{"_table"}->setCellColSpan( $row+1, $column+1, $colspan ) if $colspan;
}
sub sprint {
my $self = shift;
$self->{'_table'}->getTable;
}
package FS::UI::_Tableborder;
use vars qw ( @ISA );
@ISA = qw ( FS::UI::_Table );
sub new {
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = $class eq $proto ? { @_ } : $proto;
bless ( $self, $class );
$self->SUPER::new(@_);
$self->{'_table'}->setBorder;
$self;
}
=head1 VERSION
$Id: CGI.pm,v 1.1 1999-01-20 09:30:36 ivan Exp $
=head1 BUGS
This documentation is incomplete.
In _Tableborder, headers should be links that sort on their fields.
_Link uses a constant $BASE_URL
_Link passes the arguments as a manually-constructed GET string instead
of POSTing, for compatability while the web interface is upgraded. Once
this is done it should pass arguements properly (i.e. as a POST, 8-bit clean)
Still some small bits of widget code same as FS::UI::Gtk.
=head1 SEE ALSO
L
=head1 HISTORY
$Log: CGI.pm,v $
Revision 1.1 1999-01-20 09:30:36 ivan
skeletal cross-UI UI code.
=cut
1;