Bläddra i källkod

fix #34 - versioned posts

George S. Baugh 5 år sedan
förälder
incheckning
3ff5c775a9
4 ändrade filer med 52 tillägg och 11 borttagningar
  1. 0 0
      data/DUMMY.json
  2. 26 3
      lib/Trog/Data/DUMMY.pm
  3. 8 6
      lib/Trog/Routes/HTML.pm
  4. 18 2
      www/templates/posts.tx

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
data/DUMMY.json


+ 26 - 3
lib/Trog/Data/DUMMY.pm

@@ -100,12 +100,11 @@ sub get ($self, %request) {
 
     my @filtered = @$example_posts;
 
-    # If an ID is passed, just get that
+    # If an ID is passed, just get that (and all it's prior versions
     if ($request{id}) {
         @filtered = grep { $_->{id} eq $request{id} } @filtered if $request{id};
-        # Sort by version
-        @filtered = sort { $b->{version} cmp $a->{version} } @filtered;
 
+        @filtered = _dedup_versions($request{version}, @filtered);
         @filtered = _add_post_type(@filtered);
         # Next, add the type of post this is
         @filtered = _add_media_type(@filtered);
@@ -114,6 +113,8 @@ sub get ($self, %request) {
         return (1, \@filtered);
     }
 
+    @filtered = _dedup_versions(undef, @filtered);
+
     # Next, handle the query, tags and ACLs
     @filtered = grep { my $tags = $_->{tags}; grep { my $t = $_; grep {$t eq $_ } @{$request{tags}} } @$tags } @filtered if @{$request{tags}};
     @filtered = grep { my $tags = $_->{tags}; grep { my $t = $_; grep {$t eq $_ } @{$request{acls}} } @$tags } @filtered unless grep { $_ eq 'admin' } @{$request{acls}};    
@@ -136,6 +137,28 @@ sub get ($self, %request) {
     return ($pages,\@filtered);
 }
 
+sub _dedup_versions ($version=-1, @posts) {
+    if (defined $version) {
+        my $version_max = List::Util::max(map { $_->{version } } @posts);
+        return map {
+            $_->{version_max} = $version_max;
+            $_
+        } grep { $_->{version} eq $version } @posts;
+    }
+
+    my @uniqids = List::Util::uniq(map { $_->{id} } @posts);
+    my %posts_deduped;
+    for my $id (@uniqids) {
+        my $version_max = List::Util::max(map { $_->{version } } @posts);
+        my @ofid = sort { $b->{version} cmp $a->{version} } grep { $_->{id} eq $id } @posts;
+        $posts_deduped{$id} = $ofid[0];
+        $posts_deduped{$id}{version_max} = $version_max;
+    }
+    my @deduped = @posts_deduped{@uniqids};
+
+    return @deduped;
+}
+
 sub total_posts {
     my $example_posts = _read();
     return scalar(@$example_posts);

+ 8 - 6
lib/Trog/Routes/HTML.pm

@@ -7,6 +7,7 @@ no warnings 'experimental';
 use feature qw{signatures state};
 
 use File::Touch();
+use List::Util();
 
 use Trog::Config;
 use Trog::Data;
@@ -552,12 +553,13 @@ sub posts ($query, $render_cb) {
 sub _post_helper ($query, $tags, $acls) {
     state $data = Trog::Data->new($conf);
     return $data->get(
-        page  => int($query->{page} || 1),
-        limit => int($query->{limit} || 25),
-        tags  => $tags,
-        acls  => $acls,
-        like  => $query->{like},
-        id    => $query->{id},
+        page    => int($query->{page} || 1),
+        limit   => int($query->{limit} || 25),
+        tags    => $tags,
+        acls    => $acls,
+        like    => $query->{like},
+        id      => $query->{id},
+        version => $query->{version},
     );
 }
 

+ 18 - 2
www/templates/posts.tx

@@ -19,7 +19,16 @@
             <h3 class='blogtitles'>
                 <a href='/posts/<: $post.id :>'><: $post.title :></a>
                 <a class="undecorated" href='<: $post.href :>'>🔗</a>
-                <span id="<: $post.id :>-<: $post.version :>-time" style="float:right;"><: $post.created :></span>
+                : if ( $post.version_max ) {
+                <form method="GET" action="/posts/<: $post.id :>" style="float:right;">
+                    <select id="<: $post.id :>-<: $post.version :>-version" name="version" class="coolbutton">
+                        : for [0..$post.version_max] -> $version {
+                            <option value="<: $version :>" <: if ($post.version == $version ) { :>selected<: } :> >v<: $version :></option>
+                        : }
+                    </select>
+                </form>
+                : }
+                <span id="<: $post.id :>-<: $post.version :>-time" style="float:right; margin:.25rem;"><: $post.created :></span>
                 <a class='usericon <: $post.user :>' title='Posted by <: $post.user :>'></a>
             </h3>
             : if ( !$post.video_href && !$post.is_image && $post.preview ) {
@@ -66,11 +75,18 @@
             </div>
             : }
             <script type="text/javascript">
-                // Fix post dates to be localized
                 document.addEventListener("DOMContentLoaded", function(event) {
+
+                    // Fix post dates to be localized
                     var e = document.getElementById("<: $post.id :>-<: $post.version :>-time");
                     var d = new Date(Date(e.innerText));
                     e.innerHTML = "&nbsp;" + d.toDateString();
+
+                    //Make the version switcher do things
+                    var swit = document.getElementById("<: $post.id :>-<: $post.version :>-version"); // I am an elder scrolls fan
+                    swit.onchange = function (evt) {
+                        this.form.submit();
+                    };
                 });
             </script>
         </div>

Vissa filer visades inte eftersom för många filer har ändrats