Fixes #4001: TOC contains parent books, and add links to previous and next book.
authorRadek Czajka <rczajka@rczajka.pl>
Fri, 24 Apr 2020 16:52:17 +0000 (18:52 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Thu, 10 Sep 2020 12:15:11 +0000 (14:15 +0200)
src/catalogue/models/book.py
src/catalogue/templates/catalogue/book_text.html
src/catalogue/utils.py
src/wolnelektury/static/css/master.book.css
src/wolnelektury/static/css/new.book.css
src/wolnelektury/static/js/book.js
src/wolnelektury/static/js/book_text/toc.js
src/wolnelektury/static/scss/book_text/box.scss

index 371bb3e..8b5ac63 100644 (file)
@@ -247,6 +247,41 @@ class Book(models.Model):
     def gallery_url(self):
         return gallery_url(self.slug)
 
     def gallery_url(self):
         return gallery_url(self.slug)
 
+    def get_first_text(self):
+        if self.html_file:
+            return self
+        child = self.children.all().order_by('parent_number').first()
+        if child is not None:
+            return child.get_first_text()
+
+    def get_last_text(self):
+        if self.html_file:
+            return self
+        child = self.children.all().order_by('parent_number').last()
+        if child is not None:
+            return child.get_last_text()
+
+    def get_prev_text(self):
+        if not self.parent:
+            return None
+        sibling = self.parent.children.filter(parent_number__lt=self.parent_number).order_by('-parent_number').first()
+        if sibling is not None:
+            return sibling.get_last_text()
+        return self.parent.get_prev_text()
+
+    def get_next_text(self):
+        if not self.parent:
+            return None
+        sibling = self.parent.children.filter(parent_number__gt=self.parent_number).order_by('parent_number').first()
+        if sibling is not None:
+            return sibling.get_first_text()
+        return self.parent.get_next_text()
+
+    def get_siblings(self):
+        if not self.parent:
+            return []
+        return self.parent.children.all().order_by('parent_number')
+
     @property
     def name(self):
         return self.title
     @property
     def name(self):
         return self.title
index c0fe955..4ff3d5e 100644 (file)
@@ -28,7 +28,7 @@
   {% endif %}
 
   <li id="menu-toc">
   {% endif %}
 
   <li id="menu-toc">
-    <a href="#" data-box="toc">
+    <a href="#" data-box="wltoc">
       <span class="label">{% trans "Table of contents" %}</span>
     </a>
   </li>
       <span class="label">{% trans "Table of contents" %}</span>
     </a>
   </li>
 {% block big-pane %}
 
   <article id="main-text">
 {% block big-pane %}
 
   <article id="main-text">
-    {{ book_text|safe }}
+    {% with next=book.get_next_text prev=book.get_prev_text %}
+      {% if next %}
+        <a style="float:right; padding: 1em;" href="{% url 'book_text' next.slug %}">{{ next.title }}&nbsp;&rarr;</a>
+      {% endif %}
+      {% if prev %}
+        <a style="display:inline-block;padding: 1em;" href="{% url 'book_text' prev.slug %}">&larr;&nbsp;{{ prev.title }}</a>
+      {% endif %}
+      {{ book_text|safe }}
+    {% endwith %}
   </article>
 
   </article>
 
+
+
   <article id="other-text">
     <a class="other-text-close" href="#">{% trans "Close" %}</a>
     <div id="other-text-waiter">{% trans "Please wait..." %}</div>
   <article id="other-text">
     <a class="other-text-close" href="#">{% trans "Close" %}</a>
     <div id="other-text-waiter">{% trans "Please wait..." %}</div>
   </article>
 {% endblock big-pane %}
 
   </article>
 {% endblock big-pane %}
 
-
 {% block footer %}
 {% block footer %}
+  <div id="wltoc" class="box">
+    {% if book.parent %}
+      {% for b in book.ancestor.all %}
+        {% if forloop.counter > 1 %}
+          <li>
+        {% endif %}
+        <a href="{{ b.get_absolute_url }}">{{ b.title }}</a>
+        <ol>
+      {% endfor %}
+        {% for b in book.get_siblings %}
+          <li>
+            {% if b == book %}
+              <strong>{{ b.title }}</strong>
+              <div id="heretoc"></div>
+            {% else %}
+              <a href="{% url 'book_text' b.slug %}">{{ b.title }}</a>
+            {% endif %}
+          </li>
+        {% endfor %}
+
+        {% for b in book.ancestor.all %}
+        </ol>
+        {% if not forloop.counter.last %}
+          </li>
+        {% endif %}
+        {% endfor %}
+    {% else %}
+      <strong>{{ book.title }}</strong>
+      <div id="heretoc"></div>
+    {% endif %}
+  </div>
+
   <div id="info" class="box">
       {% book_info book %}
   </div>
   <div id="info" class="box">
       {% book_info book %}
   </div>
index d17ead0..d056579 100644 (file)
@@ -313,3 +313,9 @@ def gallery_url(slug):
 def get_mp3_length(path):
     from mutagen.mp3 import MP3
     return int(MP3(path).info.length)
 def get_mp3_length(path):
     from mutagen.mp3 import MP3
     return int(MP3(path).info.length)
+
+
+def set_file_permissions(self, fieldfile):
+    if fieldfile.instance.preview:
+        fieldfile.set_readable(False)
+
index 29d115b..c430a69 100644 (file)
@@ -95,7 +95,7 @@ img {
 }
 
 
 }
 
 
-#toc, #themes, #nota_red, #info, #other-versions, #objects {
+#wltoc, #themes, #nota_red, #info, #other-versions, #objects {
     position: fixed;
     left: 0;
     top: 1.5em;
     position: fixed;
     left: 0;
     top: 1.5em;
@@ -128,30 +128,30 @@ img {
     z-index: 99;
 }
 
     z-index: 99;
 }
 
-#toc ol, #themes ol, #objects ol {
+#wltoc ol, #themes ol, #objects ol {
     list-style: none;
     padding: 0;
     margin: 0;
 }
 
     list-style: none;
     padding: 0;
     margin: 0;
 }
 
-#toc ol li {
+#wltoc ol li {
     font-weight: bold;
 }
 
     font-weight: bold;
 }
 
-#toc ol ol {
+#wltoc ol ol {
     padding: 0 0 1.5em 1.5em;
     margin: 0;
 }
 
     padding: 0 0 1.5em 1.5em;
     margin: 0;
 }
 
-#toc ol ol li {
+#wltoc ol ol li {
     font-weight: normal;
 }
 
     font-weight: normal;
 }
 
-#toc h2 {
+#wltoc h2 {
     display: none;
 }
 
     display: none;
 }
 
-#toc .anchor {
+#wltoc .anchor {
     float: none;
     margin: 0;
     color: blue;
     float: none;
     margin: 0;
     color: blue;
index 689d99f..2208cd3 100644 (file)
@@ -24,30 +24,29 @@ img {
 /* ================================== */
 /* = Header with logo and menu      = */
 /* ================================== */
 /* ================================== */
 /* = Header with logo and menu      = */
 /* ================================== */
-#toc ol, #themes ol, #objects ol {
+#wltoc ol, #themes ol, #objects ol {
     list-style: none;
     padding: 0;
     margin: 0;
 }
     list-style: none;
     padding: 0;
     margin: 0;
 }
-
-#toc ol li {
-    font-weight: bold;
+#wltoc ol {
+  padding-left: 1.5em;
 }
 
 }
 
-#toc ol ol {
+#wltoc ol ol {
     padding: 0 0 1.5em 1.5em;
     margin: 0;
 }
 
     padding: 0 0 1.5em 1.5em;
     margin: 0;
 }
 
-#toc ol ol li {
+#wltoc ol ol li {
     font-weight: normal;
 }
 
     font-weight: normal;
 }
 
-#toc h2 {
+#wltoc h2 {
     display: none;
 }
 
     display: none;
 }
 
-#toc .anchor {
+#wltoc .anchor {
     float: none;
     margin: 0;
     color: blue;
     float: none;
     margin: 0;
     color: blue;
index 72d8174..dfb2316 100644 (file)
@@ -15,10 +15,6 @@ $(function() {
     }
 
     $.highlightFade.defaults.speed = 3000;
     }
 
     $.highlightFade.defaults.speed = 3000;
-    $('#toc').hide();
-    if ($('#toc li').length == 0) {
-        $('#menu li a[href="#toc"]').remove();
-    }
     if ($('#themes li').length == 0) {
         $('#menu li a[href="#themes"]').remove();
     }
     if ($('#themes li').length == 0) {
         $('#menu li a[href="#themes"]').remove();
     }
index 31f4e9f..d03bbb9 100644 (file)
@@ -1,9 +1,17 @@
 (function($){$(function(){
 
 (function($){$(function(){
 
+    if ($("#toc a").length > 0) {
+        $("#toc > ol").appendTo($("#heretoc"));
+    }
 
 
-if ($('#toc li').length > 0) {
-    $('#menu-toc').show();
-}
+    if ($('#wltoc li').length > 0) {
+        $('#menu-toc').show();
+    }
 
 
+    if ($('#wltoc li a').length == 0) {
+        $('#menu li a[href="#wltoc"]').remove();
+    }
+
+    $("#toc").remove();
 
 })})(jQuery);
 
 })})(jQuery);
index 7a04234..4b2211d 100644 (file)
@@ -11,8 +11,9 @@ the hidden boxes (TOC and Themes).
     top: 0;
     right: 0;
 
     top: 0;
     right: 0;
 
+    box-sizing: border-box;
     max-height: 100%;
     max-height: 100%;
-    @include size(max-width, 380px);
+    @include size(max-width, 400px);
     @include size(padding, 10px 10px 30px 10px);
     margin: 0;
     overflow-x: hidden;
     @include size(padding, 10px 10px 30px 10px);
     margin: 0;
     overflow-x: hidden;