sub dispatch_request {
my $self = shift;
sub (/) { $self->show_front_page },
+ sub (/admin/) {
+ sub (%new_name=&new_slug=) {
+ my ($self, $name, $slug) = @_;
+
+ unless ($name && $slug) {
+ return $self->show_admin_page(error => "Please enter a name and a bucket");
+ }
+ if ($name =~ /^\s+$/ || $slug =~ /^\s+$/) {
+ return $self->show_admin_page(error => "Names/buckets must not be all whitespace");
+ }
+
+ $slug =~ s/ /-/g;
+
+ my $nb = $self->buckets->add(bless({
+ slug => $slug,
+ name => $name,
+ }, 'App::IdiotBox::Bucket'));
+
+ $self->show_admin_page;
+ },
+ },
+ sub (/admin/) { $self->show_admin_page },
+
+ sub (/admin/*/...) {
+ my $bucket = $self->buckets->get({ slug => $_[1] });
+ sub (%new_name=) {
+ my ($self, $new_name) = @_;
+ if (!$new_name) {
+ return $self->show_edit_bucket_page($bucket, error => "Please enter a new name");
+ } elsif ($new_name =~ /^\s+$/) {
+ return $self->show_edit_bucket_page($bucket, error => "Names must not be all whitespace");
+ }
+ $self->buckets->replace($bucket, bless({
+ slug => $bucket->slug,
+ name => $new_name,
+ }, 'App::IdiotBox::Bucket'));
+ $self->show_bucket_edited_page($bucket);
+ },
+ sub (/) {
+ $self->show_edit_bucket_page($bucket);
+ },
+ sub (/delete/) {
+ $self->show_confirm_delete_bucket_page($bucket)
+ },
+ sub (/delete/yes/) {
+ $self->buckets->remove({ slug => $bucket->slug });
+ $self->show_bucket_deleted_page($bucket->slug);
+ },
+ },
sub (/*/...) {
my $bucket = $self->buckets->get({ slug => $_[1] });
sub (/) {
);
}
+sub show_admin_page {
+ my $self = shift;
+ my %opts = @_;
+ my $error = $opts{error} || '';
+
+ my $bucket = $self->buckets;
+ $self->html_response(
+ admin => sub {
+ $_->select('#bucket-list')
+ ->repeat_content($bucket->map(sub {
+ my $obj = $_;
+ sub {
+ $_->select('.bucket-slug')->replace_content($obj->slug)
+ ->select('.bucket-name')->replace_content($obj->name)
+ ->select('.edit-link')->set_attribute(
+ 'href' => $obj->slug.'/'
+ )
+ ->select('.delete-link')->set_attribute(
+ 'href' => $obj->slug.'/delete/'
+ )
+ }
+ }))
+ ->select('.error-text')->replace_content($error)
+
+ }
+
+ );
+}
+
+sub show_confirm_delete_bucket_page {
+ my ($self, $bucket) = @_;
+ $self->html_response('delete' => sub {
+ $_->select('.bucket-name')->replace_content($bucket->name)
+ ->select('.confirm-yes')->set_attribute(
+ 'href' => 'yes/'
+ )
+ });
+}
+
+sub show_edit_bucket_page {
+ my ($self, $bucket, %opt) = @_;
+ my $error = $opt{error} || '';
+ $self->html_response('edit' => sub {
+ $_->select('.bucket-name')->replace_content($bucket->name)
+ ->select('.error-text')->replace_content($error);
+ });
+}
+
+sub show_bucket_deleted_page {
+ my ($self, $name) = @_;
+ $self->html_response('deleted' => sub {
+ $_->select('.bucket-name')->replace_content($name)
+ });
+}
+
+sub show_bucket_edited_page {
+ my ($self, $name) = @_;
+ $self->html_response('edited' => sub {
+ $_->select('.bucket-name')->replace_content($name)
+ });
+}
+
sub show_bucket {
my ($self, $bucket) = @_;
$self->html_response(bucket => sub {
(slug, name)
VALUES
(?, ?)
- }
-
+ },
+ delete_one => q{
+ DELETE FROM buckets WHERE slug = ?
+ },
+ update_one => q{
+ UPDATE buckets SET slug = ?, name = ? WHERE slug = ?
+ },
}
)
}
--- /dev/null
+ <div id="main-content">
+
+ <h2 class="author-name">
+ List of available buckets
+ </h2>
+ <p>
+ Add a new bucket
+ </p>
+ <form class="add-bucket-form" action="" method="POST">
+ <label for="new_name">Enter a name for this bucket</label> <input type="text" name="new_name"/>
+ <br /><br />
+ <label for="new_slug">Enter a relative URI for this bucket</label> <input type="text" name="new_slug"/>
+ <br /><br />
+ <input type="submit" value="Create Bucket"/>
+ </form>
+ <span class="error-text">Some error</span>
+ <p>
+ Below is a list of existing buckets. Click on the buckets to change details about them, and 'Delete' to remove them.
+ </p>
+ <ul id="bucket-list">
+ <li class="bucket">
+ <a class="edit-link">
+ <span class="bucket-slug">Some Random Event</span> -
+ <span class="bucket-name">Some Random Event</span>
+ </a>
+ <a class="delete-link">Delete</a>
+ </a>
+ </li>
+ </ul>
+ </div>
+
+ <div id="custom-html">
+ <h1>
+ <span class="bucket-name">THIS IZ MAI BUKKIT</span>
+ </h1>
+ <ul id="video-list">
+ <li class="video">
+ <a class="video-link"><span class="video-name">Really Imaginative Video Name</span> (<span class="video-author">Some Guy</span>)</a>
+ </li>
+ </ul>
+ </div>
+
+<!-- END MAIN CONTENT -->
+ </div>
--- /dev/null
+ <div id="main-content">
+
+ <div id="custom-html">
+ <h1>
+ Do you really want to delete this bucket:
+ </h1>
+ <span class="bucket-name">THIS IZ MAI BUKKIT</span>
+ <a class="confirm-yes">Yes</a>
+ <br /><br /><a href="/admin">No</a>
+ </div>
+
+<!-- END MAIN CONTENT -->
+ </div>
--- /dev/null
+ <div id="main-content">
+
+ <div id="custom-html">
+ <h1>
+ The bucket was deleted. Say good by to <span class="bucket-name">THIS IZ MAI BUKKIT</span>
+ </h1>
+ </div>
+
+<!-- END MAIN CONTENT -->
+ </div>
--- /dev/null
+ <div id="main-content">
+
+ <div id="custom-html">
+ <h1>
+ Editing bucket <span class="bucket-name">THIS IZ MAI BUKKIT</span>
+ </h1>
+<!--
+ <form enctype="multipart/form-data" class="edit-bucket-form" action="" method="POST">
+-->
+ <form class="edit-bucket-form" action="" method="POST">
+ <label for="new_name">Enter a new name for this bucket</label> <input type="text" name="new_name"/>
+ <br /><br />
+<!--
+ <label for="new_file">Upload new file to bucket</label> <input type="file" name="new_file" accept="*.flv,*.m4v"/>
+ <br /><br />
+-->
+ <input type="submit" value="Modify"/>
+ </form>
+ <span class="error-text">Some error</span>
+ </div>
+
+<!-- END MAIN CONTENT -->
+ </div>
--- /dev/null
+ <div id="main-content">
+
+ <div id="custom-html">
+ <h1>
+ The bucket was modifed.
+ </h1>
+ </div>
+
+<!-- END MAIN CONTENT -->
+ </div>
--- /dev/null
+ <div id="main-content">
+
+ <h2 class="author-name">
+ List of available buckets
+ </h2>
+ <p>
+ Add a new bucket
+ </p>
+ <form class="add-bucket-form" action="" method="POST">
+ <label for="new_name">Enter a name for this bucket</label> <input type="text" name="new_name"/>
+ <br /><br />
+ <label for="new_slug">Enter a relative URI for this bucket</label> <input type="text" name="new_slug"/>
+ <br /><br />
+ <input type="submit" value="Create Bucket"/>
+ </form>
+ <span class="error-text">Some error</span>
+ <p>
+ Below is a list of existing buckets. Click on the buckets to change details about them, and 'Delete' to remove them.
+ </p>
+ <ul id="bucket-list">
+ <li class="bucket">
+ <a class="edit-link">
+ <span class="bucket-slug">Some Random Event</span> -
+ <span class="bucket-name">Some Random Event</span>
+ </a>
+ <a class="delete-link">Delete</a>
+ </a>
+ </li>
+ </ul>
+ </div>
+
+ <div id="custom-html">
+ <h1>
+ <span class="bucket-name">THIS IZ MAI BUKKIT</span>
+ </h1>
+ <ul id="video-list">
+ <li class="video">
+ <a class="video-link"><span class="video-name">Really Imaginative Video Name</span> (<span class="video-author">Some Guy</span>)</a>
+ </li>
+ </ul>
+ </div>
+
+<!-- END MAIN CONTENT -->
+ </div>
--- /dev/null
+ <div id="main-content">
+
+ <div id="custom-html">
+ <h1>
+ Do you really want to delete this bucket:
+ </h1>
+ <span class="bucket-name">THIS IZ MAI BUKKIT</span>
+ <a class="confirm-yes">Yes</a>
+ <br /><br /><a href="/admin">No</a>
+ </div>
+
+<!-- END MAIN CONTENT -->
+ </div>
--- /dev/null
+ <div id="main-content">
+
+ <div id="custom-html">
+ <h1>
+ The bucket was deleted. Say good by to <span class="bucket-name">THIS IZ MAI BUKKIT</span>
+ </h1>
+ </div>
+
+<!-- END MAIN CONTENT -->
+ </div>
--- /dev/null
+ <div id="main-content">
+
+ <div id="custom-html">
+ <h1>
+ Editing bucket <span class="bucket-name">THIS IZ MAI BUKKIT</span>
+ </h1>
+<!--
+ <form enctype="multipart/form-data" class="edit-bucket-form" action="" method="POST">
+-->
+ <form class="edit-bucket-form" action="" method="POST">
+ <label for="new_name">Enter a new name for this bucket</label> <input type="text" name="new_name"/>
+ <br /><br />
+<!--
+ <label for="new_file">Upload new file to bucket</label> <input type="file" name="new_file" accept="*.flv,*.m4v"/>
+ <br /><br />
+-->
+ <input type="submit" value="Modify"/>
+ </form>
+ <span class="error-text">Some error</span>
+ </div>
+
+<!-- END MAIN CONTENT -->
+ </div>
--- /dev/null
+ <div id="main-content">
+
+ <div id="custom-html">
+ <h1>
+ The bucket was modifed.
+ </h1>
+ </div>
+
+<!-- END MAIN CONTENT -->
+ </div>
border-top: 1px dashed #336699;
}
+.delete-link {
+ float: right;
+}
+.error-text {
+ color: red;
+ font-weight: bold;
+}