New admin UI functionality.
Matthew Horsfall (alh) [Wed, 5 Oct 2011 17:12:12 +0000 (13:12 -0400)]
lib/App/IdiotBox.pm
lib/App/IdiotBox/Bucket.pm
lib/App/IdiotBox/Video.pm
share/skin/presentingperl/html/admin.html
share/skin/presentingperl/html/delete_bucket.html [moved from share/skin/presentingperl/html/delete.html with 100% similarity]
share/skin/presentingperl/html/deleted_bucket.html [moved from share/skin/presentingperl/html/deleted.html with 100% similarity]
share/skin/presentingperl/html/edit_bucket.html [moved from share/skin/presentingperl/html/edit.html with 52% similarity]
share/skin/presentingperl/html/edit_video.html [new file with mode: 0644]
share/skin/presentingperl/html/edited_bucket.html [moved from share/skin/presentingperl/html/edited.html with 100% similarity]
share/skin/presentingperl/static/style/layout.css

index 119f517..4895302 100644 (file)
@@ -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)
   });
 }
index 9af2507..a8f6137 100644 (file)
@@ -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;
index 99b7c38..cd12c20 100644 (file)
@@ -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;
index 00e594b..81f631d 100644 (file)
@@ -13,7 +13,7 @@
               <br /><br />
               <input type="submit" value="Create Bucket"/>
             </form>
-            <span class="error-text">Some error</span>
+            <span class="message-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>
similarity index 52%
rename from share/skin/presentingperl/html/edit.html
rename to share/skin/presentingperl/html/edit_bucket.html
index 8a11a37..24c5036 100644 (file)
@@ -2,8 +2,14 @@
 
           <div id="custom-html">        
             <h1>
-              Editing bucket <span class="bucket-name">THIS IZ MAI BUKKIT</span>
+              Editing bucket
             </h1>
+
+            <p>
+            <span class="bucket-name">THIS IZ MAI BUKKIT</span> - 
+            <span class="bucket-slug">THIS IZ MAI SLUG</span>
+            </p>
+
 <!--
             <form enctype="multipart/form-data" class="edit-bucket-form" action="" method="POST">
 -->
               <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"/>
+              <input type="submit" name="edit_bucket" value="Modify"/>
             </form>
-            <span class="error-text">Some error</span>
+            <span class="message-text">Some error</span>
+
+            <p> Video list </p>
+
+            <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 -->        
diff --git a/share/skin/presentingperl/html/edit_video.html b/share/skin/presentingperl/html/edit_video.html
new file mode 100644 (file)
index 0000000..3b68fdb
--- /dev/null
@@ -0,0 +1,29 @@
+        <div id="main-content">
+
+          <div id="custom-html">        
+            <h1>
+              Editing video
+            </h1>
+
+            <p>
+            <span class="bucket-slug">
+              Event name here
+            </span>
+            <span class="slug-name">
+               Video slug here
+            </span>
+            </p>
+
+            <form class="edit-video-form" action="" method="POST">
+              <label for="new_title">Title:</label> <input class="video-name" type="text" name="new_title"/>
+              <br /><br />
+              <label for="new_author">Author:</label> <input class="author-name" type="text" name="new_author"/>
+              <br /><br />
+              <input type="submit" name="edit_video" value="Modify"/>
+            </form>
+            <span class="message-text">Some error</span>
+
+          </div>
+          
+<!-- END MAIN CONTENT -->        
+        </div>
index c2fe2a5..6cc979d 100644 (file)
@@ -79,7 +79,7 @@
   float: right;
 }
 
-.error-text {
-  color: red;
+.message-text {
+  color: blue;
   font-weight: bold;
 }