discourse-legacysite-perl/site/glist/lib/GList/GUI.pm
2024-06-17 21:49:12 +10:00

250 lines
11 KiB
Perl

# ==================================================================
# Gossamer List - enhanced mailing list management system
#
# Website : http://gossamer-threads.com/
# Support : http://gossamer-threads.com/scripts/support/
# CVS Info :
# Revision : $Id: GUI.pm,v 1.5 2004/08/24 19:28:37 bao Exp $
#
# Copyright (c) 2004 Gossamer Threads Inc. All Rights Reserved.
# Redistribution in part or in whole strictly prohibited. Please
# see LICENSE file for full details.
# ==================================================================
#
package GList::GUI;
# ==================================================================
use strict;
use GList qw/:objects/;
sub gui_profile_form {
# -------------------------------------------------------------------
require GT::SQL::Display::HTML;
require GT::SQL::Display::HTML::Table;
my $opts = {@_};
my $user_tb = $DB->table('Users');
$opts->{cols} ||= [ grep(/^pro_/, $user_tb->ordered_columns) ];
$opts->{tr} ||= 'class="body"';
$opts->{td_l} ||= 'class="body" width="40%" align="right"';
$opts->{td_r} ||= 'class="body" align="left"';
$opts->{cols} ||= [];
$opts->{mode} ||= 'edit';
$opts->{required} ||= ($opts->{mode} eq 'search') ? '' : '*';
my $tags = GT::Template->tags;
my $cols = $user_tb->cols;
my $disp = $DB->html($user_tb, GT::Template->tags);
my $html = '';
my $prefix = $opts->{prefix} || '';
if ( $opts->{mode} eq 'hidden' ) {
# Preserve all columns that relate to the Users database
my $cols = $user_tb->cols;
my $hidden_html = '';
foreach my $col ( keys %$cols ) {
foreach my $name ( map { "$col$_" } ( '', qw( -opt -gt -lt -le -ge -ne )) ) {
my $v = $tags->{$name};
next unless defined $v;
my $input_html = gui_form_control({
form_type => 'hidden',
value => $v,
name => $name
});
$html .= $$input_html;
}
}
return \$html;
}
my %search_defs = (
string => { names => [qw( LIKE <> = )] },
number => { names => [qw( = <> < <= > >= )] },
date => { names => [ '', qw( = <> < <= > >= )] },
radio => { names => [qw( = <> )] },
minimal => { names => [qw( = )] }
);
foreach my $col (@{$opts->{cols}}) {
my $control_opts = {%{$cols->{$col}||{}}};
$control_opts->{name} = $col;
$control_opts->{value} = $tags->{$col};
my $title = GList::language( $cols->{$col}{form_display} );
my $input_html = gui_form_control({
name => "$prefix$col",
value=> ($opts->{mode} eq 'search') ? '' : $tags->{"$prefix$col"},
def => $control_opts
});
$html .= ( $cols->{$col}->{not_null} ) ?
"<tr $opts->{tr}><td $opts->{td_l}><ul/>$title</td><td $opts->{td_r}>$$input_html $opts->{required}</td></tr>" :
"<tr $opts->{tr}><td $opts->{td_l}><ul/>$title</td><td $opts->{td_r}>$$input_html</td></tr>";
}
return \$html;
}
sub gui_form_control {
# -------------------------------------------------------------------
require GT::SQL::Display::HTML;
require GT::SQL::Display::HTML::Table;
require GT::Template;
my $opts = ref $_[0] eq 'HASH' ? shift : {@_};
my $user_tb = $DB->table('Users');
my $tags = GT::Template->tags || {};
my $disp = $DB->html($user_tb, $tags);
my $form_type = lc $opts->{def}->{form_type};
exists $opts->{blank} or $opts->{blank} = $form_type eq 'select' ? 1 : 0;
$opts->{def}->{class} = 'object' if ($form_type !~ /radio|checkbox/);
my $input_html = 'radio' eq $form_type ? $disp->radio( $opts ) :
'checkbox' eq $form_type ? $disp->checkbox( $opts ) :
'select' eq $form_type ? $disp->select( $opts ) :
'hidden' eq $form_type ? $disp->hidden( $opts ) :
'multiple' eq $form_type ? $disp->multiple( $opts ) :
'textarea' eq $form_type ? $disp->textarea( $opts ) :
'file' eq $form_type ? "File type not supported." :
'date' eq $form_type ? do {
require GT::Date;
my ($sel_year, $sel_mon, $sel_day) = split /\-/, GT::CGI::html_escape($opts->{value});
$sel_year ||= 1970;
$sel_mon ||= 1;
$sel_day ||= 1;
my $month_sel = $disp->select({
name => "$opts->{name}-mon",
value => $sel_mon,
values => { map { sprintf("%02d", $_) => $GT::Date::LANGUAGE->{short_month_names}->[$_ - 1] } (1 .. 12) },
sort => [ map { sprintf("%02d", $_) } (1 .. 12) ],
blank => 0
});
my $day_sel = $disp->select({
name => "$opts->{name}-day",
value => $sel_day,
values => { map { sprintf("%02d", $_) => $_ } (1 .. 31) },
sort => [ map { sprintf("%02d", $_) } (1 .. 31) ],
blank => 0
});
qq~
$day_sel /
$month_sel /
<input type="text" name="$opts->{name}-year" value="$sel_year" size="4" maxlength="4">
~;
} :
$disp->text($opts);
return \$input_html;
}
sub gui_toolbar {
my %input = @_;
my $tags = GT::Template->tags;
$input{first} ||= q|<img src="$image_url/icons/first.gif" border="0" width="17" height="11" alt="First page">|;
$input{first_grey} ||= q|<img src="$image_url/icons/first_grey.gif" border="0" width="17" height="11" alt="First page">|;
$input{prev} ||= q|<img src="$image_url/icons/prev.gif" border="0" width="10" height="11" alt="Previous page">|;
$input{prev_grey} ||= q|<img src="$image_url/icons/prev_grey.gif" border="0" width="10" height="11" alt="Previous page">|;
$input{next} ||= q|<img src="$image_url/icons/next.gif" border="0" width="10" height="11" alt="Next page">|;
$input{next_grey} ||= q|<img src="$image_url/icons/next_grey.gif" border="0" width="10" height="11" alt="Next page">|;
$input{last} ||= q|<img src="$image_url/icons/last.gif" border="0" width="17" height="11" alt="Last page">|;
$input{last_grey} ||= q|<img src="$image_url/icons/last_grey.gif" border="0" width="17" height="11" alt="Last page">|;
$input{view_all} ||= q|View All|;
$input{pages} ||= 9;
$input{'...'} ||= '...';
$input{'first_...'} ||= 1;
$input{'last_...'} ||= 1;
$input{before_page} ||= q||;
$input{after_page} ||= q||;
$input{before_current} ||= q|<b>|;
$input{after_current} ||= q|</b>|;
$input{'glist.cgi'} ||= 'glist.cgi';
for (keys %input) {
$input{$_} =~ s/\$image_url/$tags->{image_url}/g;
}
my $hidden_query = ${$tags->{hidden_query} || \''};
my $num_page_items = ref $tags->{num_page_items} eq 'SCALAR' ? ${$tags->{num_page_items}} : $tags->{num_page_items};
my $paging = GList::paging($num_page_items, @$tags{qw/mh nh/}, @input{qw/pages last_.../});
($paging, my ($top_page, $ddd)) = @$paging{'paging', 'top_page', 'dotdotdot'};
my $return = '';
my $search = '';
if ($tags->{toolbar_table}) {
my $cols = $DB->table($tags->{toolbar_table})->cols;
foreach my $c (keys %{$cols}) {
next unless $tags->{$c};
$search .= qq|$c=$tags->{$c};|;
if ($tags->{"$c-opt"}) { $search .= qq|$c-opt=$tags->{"$c-opt"};|; }
}
}
my $link = sub {
my ($page, $disp) = @_;
$return .= qq|<a href="$input{'glist.cgi'}?do=$tags->{do};|;
if ($tags->{toolbar_query}) {
my $query = ref $tags->{toolbar_query} ? ${$tags->{toolbar_query}} : $tags->{toolbar_query};
$return .= qq|$query;|;
}
if ($search) {
$return .= qq|$search|;
}
$return .= qq|nh=$page;|;
if ($tags->{users}) { $return .= qq|users=1;| }
if ($tags->{show_user}) { $return .= qq|show_user=1;| }
if ($tags->{fd}) { $return .= qq|fd=$tags->{fd};| }
if ($tags->{sb}) { $return .= qq|sb=$tags->{sb};| }
if ($tags->{so}) { $return .= qq|so=$tags->{so};| }
if ($tags->{mh}) { $return .= qq|mh=$tags->{mh};| }
if ($tags->{id}) { $return .= qq|id=$tags->{id};| }
if ($tags->{cs}) { $return .= qq|cs=$tags->{cs};| }
if ($tags->{first}) { $return .= qq|first=$tags->{first};| }
if ($tags->{mn_disable}){ $return .= qq|mn_disable=1;| }
$return .= qq|$hidden_query">$disp</a>\n|;
};
unless ($top_page == 1) {
if ($tags->{nh} == 1) {
$return .= $input{first_grey} . "\n";
$return .= $input{prev_grey} . "\n";
}
else {
my $prev = ($tags->{nh} == -1) ? 1 : ($tags->{nh} - 1);
$link->(1, $input{first});
$link->($prev, $input{prev});
}
if (@$paging and $paging->[0]->{page_num} > 1 and $input{'first_...'}) {
$link->(1, qq|$input{before_page}1$input{after_page}|);
$return .= "$input{before_page}$input{'...'}" . ($input{after_page} || " ") if $paging->[0]->{page_num} > 2;
}
for (@$paging) {
if ($_->{is_current_page}) {
$return .= qq|$input{before_current}$_->{page_num}$input{after_current}\n|;
}
else {
$link->($_->{page_num}, qq|$input{before_page}$_->{page_num}$input{after_page}|);
}
}
if ($ddd) {
$return .= "$input{before_page}$input{'...'}" . ($input{after_page} || " ");
$link->($top_page, "$input{before_page}$top_page$input{after_page}");
}
if ($tags->{nh} >= $top_page) {
$return .= $input{next_grey} . "\n";
$return .= $input{last_grey} . "\n";
}
else {
my $next = ($tags->{nh} == -1) ? 1 : ($tags->{nh} + 1);
$link->($next, $input{next});
$link->($top_page, $input{last});
}
}
return \$return;
}
1;