From: Matthew Horsfall (alh) Date: Wed, 5 Oct 2011 17:12:12 +0000 (-0400) Subject: New admin UI functionality. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=2da7f57fdf9bb6f57c950614bea6e85dd812f667;hp=f29e9b6f6ae3cd365017102ed4ec49160fe8f46a;p=catagits%2FApp-IdiotBox.git New admin UI functionality. --- diff --git a/lib/App/IdiotBox.pm b/lib/App/IdiotBox.pm index 119f517..4895302 100644 --- a/lib/App/IdiotBox.pm +++ b/lib/App/IdiotBox.pm @@ -36,6 +36,7 @@ sub dispatch_request { my $self = shift; sub (/) { $self->show_front_page }, + # Admin sub (/admin/) { sub (%new_name=&new_slug=) { my ($self, $name, $slug) = @_; @@ -45,25 +46,46 @@ sub dispatch_request { 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); @@ -80,6 +102,8 @@ sub dispatch_request { $self->show_bucket_deleted_page($bucket->slug); }, }, + + # Normal site sub (/*/...) { my $bucket = $self->buckets->get({ slug => $_[1] }); sub (/) { @@ -118,7 +142,7 @@ sub show_front_page { sub show_admin_page { my $self = shift; my %opts = @_; - my $error = $opts{error} || ''; + my $message = $opts{message} || ''; my $bucket = $self->buckets; $self->html_response( @@ -130,14 +154,14 @@ sub show_admin_page { $_->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) } @@ -146,7 +170,7 @@ sub show_admin_page { 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/' @@ -156,23 +180,47 @@ sub show_confirm_delete_bucket_page { 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) }); } diff --git a/lib/App/IdiotBox/Bucket.pm b/lib/App/IdiotBox/Bucket.pm index 9af2507..a8f6137 100644 --- a/lib/App/IdiotBox/Bucket.pm +++ b/lib/App/IdiotBox/Bucket.pm @@ -6,14 +6,23 @@ sub fields { return qw(slug 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) = @_; @@ -27,10 +36,10 @@ sub create { $args{slug} =~ s/\s+/-/g; - return bless { + return App::IdiotBox::Bucket->new( name => $args{name}, slug => $args{slug}, - }, $class; + ); } sub update { @@ -44,9 +53,11 @@ 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; diff --git a/lib/App/IdiotBox/Video.pm b/lib/App/IdiotBox/Video.pm index 99b7c38..cd12c20 100644 --- a/lib/App/IdiotBox/Video.pm +++ b/lib/App/IdiotBox/Video.pm @@ -17,4 +17,38 @@ sub url_path { join('/', $_[0]->bucket->slug, $_[0]->slug); } +sub update { + my ($self, %args) = @_; + + my %update = map { $_ => delete $args{$_} } grep { exists $args{$_} } $self->fields; + + if (%args) { + return (undef, "Unknown fields in update: " . join(',', keys %args)); + } + + unless (%update) { + return (undef, "No changes requested"); + } + + for my $k (qw(slug bucket_slug name author details)) { + my @bad; + + if (exists $update{$k} && $update{$k} =~ /^\s+$/) { + push @bad, $k; + } + + return (undef, "Empty fields in update: ", join(',', @bad)) if @bad; + } + + for my $k (qw(slug bucket_slug)) { + $update{$k} =~ s/\s+/-/g if exists $update{$k}; + } + + my $new = $self->clone; + + $new->{$_} = $update{$_} for keys %update; + + return $new; +} + 1; diff --git a/share/skin/presentingperl/html/admin.html b/share/skin/presentingperl/html/admin.html index 00e594b..81f631d 100644 --- a/share/skin/presentingperl/html/admin.html +++ b/share/skin/presentingperl/html/admin.html @@ -13,7 +13,7 @@

- Some error + Some error

Below is a list of existing buckets. Click on the buckets to change details about them, and 'Delete' to remove them.

diff --git a/share/skin/presentingperl/html/delete.html b/share/skin/presentingperl/html/delete_bucket.html similarity index 100% rename from share/skin/presentingperl/html/delete.html rename to share/skin/presentingperl/html/delete_bucket.html diff --git a/share/skin/presentingperl/html/deleted.html b/share/skin/presentingperl/html/deleted_bucket.html similarity index 100% rename from share/skin/presentingperl/html/deleted.html rename to share/skin/presentingperl/html/deleted_bucket.html diff --git a/share/skin/presentingperl/html/edit.html b/share/skin/presentingperl/html/edit_bucket.html similarity index 52% rename from share/skin/presentingperl/html/edit.html rename to share/skin/presentingperl/html/edit_bucket.html index 8a11a37..24c5036 100644 --- a/share/skin/presentingperl/html/edit.html +++ b/share/skin/presentingperl/html/edit_bucket.html @@ -2,8 +2,14 @@

- Editing bucket THIS IZ MAI BUKKIT + Editing bucket

+ +

+ THIS IZ MAI BUKKIT - + THIS IZ MAI SLUG +

+ @@ -14,9 +20,18 @@

--> - + - Some error + Some error + +

Video list

+ + +
diff --git a/share/skin/presentingperl/html/edit_video.html b/share/skin/presentingperl/html/edit_video.html new file mode 100644 index 0000000..3b68fdb --- /dev/null +++ b/share/skin/presentingperl/html/edit_video.html @@ -0,0 +1,29 @@ +
+ +
+

+ Editing video +

+ +

+ + Event name here + + + Video slug here + +

+ +
+ +

+ +

+ +
+ Some error + +
+ + +
diff --git a/share/skin/presentingperl/html/edited.html b/share/skin/presentingperl/html/edited_bucket.html similarity index 100% rename from share/skin/presentingperl/html/edited.html rename to share/skin/presentingperl/html/edited_bucket.html diff --git a/share/skin/presentingperl/static/style/layout.css b/share/skin/presentingperl/static/style/layout.css index c2fe2a5..6cc979d 100644 --- a/share/skin/presentingperl/static/style/layout.css +++ b/share/skin/presentingperl/static/style/layout.css @@ -79,7 +79,7 @@ float: right; } -.error-text { - color: red; +.message-text { + color: blue; font-weight: bold; }