discourse-legacysite-perl/site/slowtwitch.com/cgi-bin/articles/admin/Plugins/Widgets.pm
2024-06-17 21:49:12 +10:00

323 lines
11 KiB
Perl

# ==================================================================
# Plugins::Widgets - Auto Generated Program Module
#
# Plugins::Widgets
# Author : Bao Phan
# Version : 1.0
# Updated : Mon Mar 21 11:08:31 2016
#
# ==================================================================
#
package Plugins::Widgets;
# ==================================================================
use strict;
use GT::Base;
use GT::Plugins qw/STOP CONTINUE/;
use Links qw/:objects/;
# Inherit from base class for debug and error methods
@Plugins::Widgets::ISA = qw(GT::Base);
# Your code begins here.
# ADMIN MENU OPTIONS
# ===================================================================
sub widgets {
# -------------------------------------------------------------------
# This subroutine will be called whenever the user clicks on 'Widgets' in the
# admin menu. Remember, you need to print your own HTTP header; to do so you
# can use:
my $args = shift || {};
print $IN->header;
Links::admin_page('widgets.html', { widgets => fetch_widgets($IN->param('page')), %$args });
}
sub assign {
my $cgi = $IN->get_hash();
my $msg;
if ($cgi->{page} and $cgi->{id} and $cgi->{pos}) {
my $widget = $DB->table('Widgets')->get($cgi->{id});
my $page = $cgi->{page};
my $tab_pgwidgets = $DB->table('PageWidgets');
my $pg_widget = $tab_pgwidgets->select({ WidgetID => $widget->{ID}, Page => $page })->fetchrow_hashref;
my ($msg, $category);
$category = $DB->table('Category')->get($page) if $page =~ /^\d+$/;
if (!$pg_widget and $cgi->{pos} =~ /^\d+$/) {
$tab_pgwidgets->insert({ WidgetID => $widget->{ID}, Page => $page, Sort_Pos => $cgi->{pos} || 0 }) or die $GT::SQL::error;
$msg = "The widget was added to page: " . ($category ? $category->{Full_Name} : $page);
}
elsif ($cgi->{pos} =~ /^\d+$/) {
$tab_pgwidgets->update({ Sort_Pos => $cgi->{pos} }, { ID => $pg_widget->{ID} });
$msg = "The widget's position was updated on page: " . ($category ? $category->{Full_Name} : $page);
}
else {
$tab_pgwidgets->delete({ ID => $pg_widget->{ID} });
$msg = "The widget was removed from: " . ($category ? $category->{Full_Name} : $page);
}
}
return widgets({ msg => $msg });
}
sub add {
my $cgi = $IN->get_hash();
my $error;
if ($cgi->{submit}) {
# automated widget
my @fields = ('ID', 'Type', 'Widget', 'Title', 'Subtitle', 'TitleStyle', 'Image', 'URL', 'Button');
if ($cgi->{Type}) {
return form('Widget and Title cannot be null') unless $cgi->{Widget} and $cgi->{Title};
if ($cgi->{Widget} eq 'category_list') {
return form('Select a category') unless $cgi->{Category};
push @fields, 'Category';
}
elsif ($cgi->{Widget} eq 'poll') {
return form('Select a forum') unless $cgi->{Forum};
push @fields, 'Forum';
}
elsif ($cgi->{Widget} =~ /^(:?feature_article|editors_pick|feature_threads)$/) {
return form('Enter Article IDs, comma separated') unless $cgi->{Articles};
push @fields, 'Articles';
}
elsif ($cgi->{Widget} eq 'newsletter') {
return form('Enter List ID') unless $cgi->{ListID};
push @fields, 'ListID';
}
elsif ($cgi->{Widget} eq 'external') {
return form('Enter widget title') unless $cgi->{Title};
}
}
my $rec;
if ($cgi->{Widget} eq 'external') {
$rec = $DB->table('Widgets')->add({
Title => $cgi->{Title},
TitleStyle => $cgi->{TitleStyle},
Widget => 'external',
Type => 1
});
return form($GT::SQL::error) unless $rec;
my $num_links = $cgi->{NumLinks} || 5;
my $tab_links = $DB->table("WidgetLinks");
for my $i (1 .. $num_links) {
next unless $cgi->{"Title-$i"} and $cgi->{"Abstract-$i"} and $cgi->{"URL-$i"} and $cgi->{"URL-$i"} =~ /^http/;
$tab_links->insert({
WidgetID => $rec,
Title => $cgi->{"Title-$i"},
Abstract => $cgi->{"Abstract-$i"},
URL => $cgi->{"URL-$i"},
});
}
}
else {
my %hash = map { $_ => $cgi->{$_} } @fields;
$rec = $DB->table('Widgets')->add(\%hash);
return form($GT::SQL::error) unless $rec;
}
if ($cgi->{page}) {
my $tab_pgwidgets = $DB->table('PageWidgets');
my $max_pos = $tab_pgwidgets->select('MAX(Sort_Pos)', { Page => $cgi->{page} })->fetchrow || 0;
$tab_pgwidgets->insert({ WidgetID => $rec, Page => $cgi->{page}, Sort_Pos => $max_pos + 1 });
}
return widgets({ success => "The widget was added" });
}
form();
}
sub modify {
my $cgi = $IN->get_hash();
my $widget = $DB->table('Widgets')->get($cgi->{ID});
return form("Widget not found") unless $widget;
if ($cgi->{submit}) {
# automated widget
my @fields = ('ID', 'Type', 'Widget', 'Title', 'Subtitle', 'TitleStyle', 'Image', 'URL', 'Button');
if ($cgi->{Type}) {
return form('Widget and Title cannot be null') unless $cgi->{Widget} and $cgi->{Title};
if ($cgi->{Widget} eq 'category_list') {
return form('Select a category') unless $cgi->{Category};
push @fields, 'Category';
}
elsif ($cgi->{Widget} eq 'poll') {
return form('Select a forum') unless $cgi->{Forum};
push @fields, 'Forum';
}
elsif ($cgi->{Widget} =~ /^(:?feature_article|editors_pick|feature_threads)$/) {
return form('Enter Article IDs, comma separated') unless $cgi->{Articles};
push @fields, 'Articles';
}
elsif ($cgi->{Widget} eq 'newsletter') {
return form('Enter List ID') unless $cgi->{ListID};
push @fields, 'ListID';
}
elsif ($cgi->{Widget} eq 'external') {
return form('Enter widget title') unless $cgi->{Title};
}
}
my %hash = map { $_ => $cgi->{$_} } @fields;
if ($cgi->{Widget} eq 'external') {
$DB->table('Widgets')->update({
Title => $cgi->{Title},
TitleStyle => $cgi->{TitleStyle},
}, { ID => $cgi->{ID} });
my $num_links = $cgi->{NumLinks} || 5;
my $tab_links = $DB->table("WidgetLinks");
for my $i (1 .. $num_links) {
my $id = $cgi->{"ID-$i"};
unless ($cgi->{"Title-$i"} and $cgi->{"URL-$i"} and $cgi->{"URL-$i"} =~ /^http/) {
$tab_links->delete({ ID => $id }) if $id;
}
elsif ($id) {
$tab_links->update({
Title => $cgi->{"Title-$i"},
Abstract => $cgi->{"Abstract-$i"},
URL => $cgi->{"URL-$i"},
}, { ID => $id });
}
else {
$tab_links->insert({
WidgetID => $cgi->{ID},
Title => $cgi->{"Title-$i"},
Abstract => $cgi->{"Abstract-$i"},
URL => $cgi->{"URL-$i"},
});
}
}
}
else {
my $rec = $DB->table('Widgets')->modify(\%hash);
}
return widgets({ success => "The widget was updated" });
}
else {
$IN->param($_, $widget->{$_}) for keys %$widget;
if ($widget->{Widget} eq 'external') {
my $links = $DB->table('WidgetLinks')->select({ WidgetID => $widget->{ID} })->fetchall_hashref;
my $i = 1;
foreach my $l (@$links) {
$IN->param("$_-$i", $l->{$_}) foreach (qw/ID Title Abstract URL/);
$i++;
}
}
return form();
}
}
sub retrieve_ntag {
my ($name, $index) = @_;
return unless $name and $index;
my $vars = GT::Template->vars;
return $vars->{"$name-$index"};
}
sub delete {
my $tab = $DB->table('Widgets');
my $widget = $tab->get($IN->param('ID'));
return widgets({ error => "Widget not found" }) unless $widget;
$tab->delete({ ID => $widget->{ID} });
$DB->table('PageWidgets')->delete({ WidgetID => $widget->{ID} });
$DB->table('WidgetLinks')->delete({ WidgetID => $widget->{ID} });
widgets({ success => "The widget was deleted" });
}
sub form {
print $IN->header;
my $widget = $IN->param('Widget') || '';
Links::admin_page($widget eq 'external' ? 'widgetlink_add.html' : 'widget_add.html', { error => shift });
}
sub fetch_widgets {
my $page = shift;
my $tab = $DB->table('Widgets');
my $tab_pgwidgets = $DB->table('PageWidgets');
my $tab_category = $DB->table('Category');
$tab->select_options('ORDER BY Title');
my $widgets = $tab->select()->fetchall_hashref;
my (%selected, %widgets);
if ($page) {
%selected = map { $_->{WidgetID} => $_->{Sort_Pos} } @{$tab_pgwidgets->select({ Page => $page })->fetchall_hashref};
}
my (@selected, @noselected);
foreach my $w (@$widgets) {
if ($w->{Image}) {
my $fh = $tab->file_info('Image', $w->{ID});
$w->{Image_URL} = '/images/widgets/' . $fh->File_RelativeURL;
}
$w->{pages} = $tab_pgwidgets->select({ WidgetID => $w->{ID} })->fetchall_hashref;
if ($selected{$w->{ID}}) {
$w->{selected} = $selected{$w->{ID}};
push @selected, $w;
}
else {
push @noselected, $w;
}
}
@selected = @{qsort(\@selected, 'selected', 'asc')} if scalar @selected;
return { selected => \@selected, available => \@noselected };
}
sub fetch_categories {
my $tab = $DB->table('Category');
$tab->select_options('ORDER BY Full_Name');
my $categories = $tab->select()->fetchall_hashref;
return $categories;
}
sub qsort {
my ($list, $sb, $so) = @_;
my $sorted;
@$sorted =
sort {
my $da = lc $a->{$sb}; #lower case
my $db = lc $b->{$sb};
my $res;
if ($sb eq 'selected') {
$res = $db <=> $da;
}
else {
$res = $db cmp $da;
}
if ($res == 0 and $sb ne 'name') {
lc $b->{name} cmp lc $a->{name};
}
else {
$res;
}
} @$list;
($so) and @$sorted = reverse @$sorted;
return $sorted;
}
1;