my $self = shift;
sub (/) { $self->show_front_page },
+ # Admin
sub (/admin/) {
sub (%new_name=&new_slug=) {
my ($self, $name, $slug) = @_;
name => $name,
);
- return $self->show_admin_page(error => $err) if $err;
+ return $self->show_admin_page(message => $err) if $err;
my $nb = $self->buckets->add($nb);
- $self->show_admin_page;
+ $self->show_admin_page(message => "New bucket created");
},
},
sub (/admin/) { $self->show_admin_page },
- sub (/admin/*/...) {
+ sub (/admin/bucket/*/...) {
my $bucket = $self->buckets->get({ slug => $_[1] });
- sub (%new_name=) {
- my ($self, $new_name) = @_;
+ # Admin, video
+ sub (/video/*/...) {
+ my $video = $bucket->videos->get({ slug => $_[1] });
+
+ sub (POST + %edit_video=&*) {
+ my ($self, undef, $args) = @_;
+ delete $args->{edit_video};
+
+ my ($uv, $err) = $video->update(%$args);
+
+ return $self->show_edit_video_page($video, message => $err) if $err;
+
+ $self->videos->replace($video, $uv);
+
+ $self->show_edit_video_page($video, message => "Video updated");
+ },
+
+ sub (/) { $self->show_edit_video_page($video); }
+ },
+
+ sub (POST + %edit_bucket=&*) {
+ my ($self, $new_name) = @_;
+ die "WTF";
my ($ub, $err) = $bucket->update(
name => $new_name,
);
- return $self->show_admin_page(error => $err) if $err;
+ return $self->show_admin_page(message => $err) if $err;
$self->buckets->replace($bucket, $ub);
$self->show_bucket_deleted_page($bucket->slug);
},
},
+
+ # Normal site
sub (/*/...) {
my $bucket = $self->buckets->get({ slug => $_[1] });
sub (/) {
sub show_admin_page {
my $self = shift;
my %opts = @_;
- my $error = $opts{error} || '';
+ my $message = $opts{message} || '';
my $bucket = $self->buckets;
$self->html_response(
$_->select('.bucket-slug')->replace_content($obj->slug)
->select('.bucket-name')->replace_content($obj->name)
->select('.edit-link')->set_attribute(
- 'href' => $obj->slug.'/'
+ 'href' => 'bucket/'.$obj->slug.'/'
)
->select('.delete-link')->set_attribute(
- 'href' => $obj->slug.'/delete/'
+ 'href' => 'bucket/'.$obj->slug.'/delete/'
)
}
}))
- ->select('.error-text')->replace_content($error)
+ ->select('.message-text')->replace_content($message)
}
sub show_confirm_delete_bucket_page {
my ($self, $bucket) = @_;
- $self->html_response('delete' => sub {
+ $self->html_response('delete_bucket' => 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 {
+ my $message = $opt{message} || '';
+ $self->html_response('edit_bucket' => sub {
$_->select('.bucket-name')->replace_content($bucket->name)
- ->select('.error-text')->replace_content($error);
+ ->select('.bucket-slug')->replace_content($bucket->slug)
+ ->select('.message-text')->replace_content($message)
+ ->select('#video-list')->repeat_content($bucket->videos->map(sub {
+ my $video = $_;
+ sub {
+ $_->select('.video-name')->replace_content($video->name)
+ ->select('.video-author')->replace_content($video->author)
+ ->select('.video-link')->set_attribute(
+ href => 'video/'.$video->slug.'/'
+ )
+ }
+ }))
+
+ });
+}
+
+sub show_edit_video_page {
+ my ($self, $video, %opt) = @_;
+ my $message = $opt{message} || '';
+ $self->html_response('edit_video' => sub {
+ $_->select('.video-name')->set_attribute(value => $video->name)
+ ->select('.author-name')->set_attribute(value => $video->author)
+ ->select('.bucket-slug')->replace_content($video->bucket->slug)
+ ->select('.slug-name')->replace_content($video->slug)
+ ->select('.message-text')->replace_content($message)
});
}
sub show_bucket_deleted_page {
my ($self, $name) = @_;
- $self->html_response('deleted' => sub {
+ $self->html_response('deleted_bucket' => sub {
$_->select('.bucket-name')->replace_content($name)
});
}
sub show_bucket_edited_page {
my ($self, $name) = @_;
- $self->html_response('edited' => sub {
+ $self->html_response('edited_bucket' => sub {
$_->select('.bucket-name')->replace_content($name)
});
}
with 'App::IdiotBox::Clonable';
-sub slug { shift->{slug} }
sub name { shift->{name} }
+sub slug { shift->{slug} }
+sub videos { shift->{videos} }
+#has 'name' => (is => 'rw');
+#has 'slug' => (is => 'rw');
+#has 'videos' => (is => 'rw');
+has '_video_count' => (is => 'rw');
+
sub video_count {
- exists $_[0]->{video_count}
- ? $_[0]->{video_count}
- : $_[0]->{videos}->count
+ my $self = shift;
+
+ return $self->_video_count if defined $self->_video_count;
+
+ return $self->{video_count} if defined $self->{video_count};
+
+ return $self->videos->count;
}
-sub videos { shift->{videos} }
sub create {
my ($class, %args) = @_;
$args{slug} =~ s/\s+/-/g;
- return bless {
+ return App::IdiotBox::Bucket->new(
name => $args{name},
slug => $args{slug},
- }, $class;
+ );
}
sub update {
return (undef, "Names must not be all whitespace");
}
- $self->{name} = $args{name};
+ my $new = $self->clone;
+
+ $new->{name} = $args{name};
- $self->clone;
+ return $new;
}
1;