#!/usr/bin/perl use strict; use warnings; use CGI; use CGI::Carp qw/warningsToBrowser fatalsToBrowser/; use CGI::Ajax; use HTML::Template::Compiled; package HTML::Widget::NavEntry; use Moose; has 'title' => ( is => 'rw' ); has 'link' => ( is => 'rw' ); sub to_html { my $self = shift; return "\t" . '' . $self->title . '' . "\n"; } package HTML::Widget::SubNavigation; use Moose; has 'title' => ( is => 'rw', required => 1 ); has 'entries' => ( isa => 'ArrayRef', is => 'rw', default => sub { return [] } ); sub to_html { my $self = shift; my $o = '
' . "\n"; return $o; } sub add_entry { my $self = shift; my $entry = shift; return unless blessed $entry eq 'HTML::Widget::NavEntry'; push @{$self->entries}, $entry; } package HTML::Widget::Navigation; use Moose; has 'entries' => ( isa => 'ArrayRef', is => 'rw', default => sub { return [] } ); sub to_html { my $self = shift; my $o = ' ' . "\n" x 2; return $o; } sub selected_to_html { my $self = shift; my $selection = shift; my $o = ' ' . "\n" x 2; return $o; } sub add_entry { my $self = shift; my $entry = shift; return unless ( blessed $entry eq 'HTML::Widget::NavEntry' or blessed $entry eq 'HTML::Widget::SubNavigation' ); push @{$self->entries}, $entry; } package main; my $s_nav1 = HTML::Widget::SubNavigation->new( title => 'foo' ); $s_nav1->add_entry( HTML::Widget::NavEntry->new( title => 'foo', link => 'foo.pl' ) ); $s_nav1->add_entry( HTML::Widget::NavEntry->new( title => 'bar', link => 'foo.pl?content=bar' ) ); $s_nav1->add_entry( HTML::Widget::NavEntry->new( title => 'buz', link => 'buz.pl' ) ); my $s_nav2 = HTML::Widget::SubNavigation->new( title => 'ooperl' ); $s_nav2->add_entry( HTML::Widget::NavEntry->new( title => 'yankee', link => 'yankee.pl' ) ); $s_nav2->add_entry( HTML::Widget::NavEntry->new( title => 'zulu', link => 'zulu.pl' ) ); my $nav = HTML::Widget::Navigation->new; $nav->add_entry( $s_nav1 ); $nav->add_entry( $s_nav2 ); my $q = CGI->new; my $selection = $q->param('sel_nav'); my $pjx = new CGI::Ajax( 'filter' => sub { my $selection = shift || ''; return $nav->selected_to_html($selection); } ); my $tmpl = HTML::Template::Compiled->new(filename => 'nav.tmpl'); $tmpl->param( nav => $selection ? $nav->selected_to_html($selection) : $nav->to_html ); print $pjx->build_html($q,$tmpl->output);