git.fiddlerwoaroof.com
Browse code

feat: item page

Ed Langley authored on 17/04/2020 11:35:49
Showing 5 changed files
... ...
@@ -49,14 +49,19 @@
49 49
      :flex-grow 0
50 50
      :flex-shrink 0
51 51
      :flex-direction column)
52
-    ((nav a)
52
+    ((:or (nav a) (:and a "[data-ic-get-from]"))
53
+     :cursor pointer
53 54
      :font-weight bold
54
-     :padding 1.5rem
55 55
      :text-align right
56 56
      :text-decoration underline)
57
+    ((nav a)
58
+     :padding 1.5rem)
57 59
     ((nav (:and a :hover))
58 60
      :background ,(link-color layout)
59 61
      :color ,(background-color layout))
62
+    (("#content" img)
63
+     :max-width "70%"
64
+     :margin 1em)
60 65
     (main
61 66
      :border-left 4px double ,(border-color layout)
62 67
      :flex-grow 1
... ...
@@ -40,7 +40,16 @@
40 40
                                                      (find feed (feeds app)
41 41
                                                            :key 'feed-key
42 42
                                                            :test 'string-equal))
43
-                                          params)))))))
43
+                                          params)))))
44
+    (("/f/:feed/:item") (lambda (params)
45
+                          (optima:match params
46
+                            ((optima.extra:alist (:feed . feed) (:item . item))
47
+                             (araneus:run-route (feed-item-page (feeds app)
48
+                                                                (find feed (feeds app)
49
+                                                                      :key 'feed-key
50
+                                                                      :test 'string-equal)
51
+                                                                item)
52
+                                                params)))))))
44 53
 
45 54
 (defun start (app)
46 55
   (prog1 app
... ...
@@ -35,3 +35,7 @@
35 35
          (plump:parse
36 36
           description))))))
37 37
 
38
+(defun id->slug (it)
39
+  (ironclad:byte-array-to-hex-string
40
+   (ironclad:digest-sequence :sha256
41
+                             (babel:string-to-octets it))))
... ...
@@ -36,15 +36,17 @@
36 36
   (plump:first-element
37 37
    (plump:parse
38 38
     (spinneret:with-html-string
39
-      (:li
40
-       (:a :href (alimenta:link item)
41
-           (plump:decode-entities
42
-            (alimenta:title item)))
43
-       (:p.description
44
-        (let ((description (fwoar.rss-reader:prepare-feed-item-description renderer item)))
45
-          (when description
46
-            (plump:decode-entities
47
-             description)))))))))
39
+      (:li (:a :data-ic-push-url "true"
40
+               :data-ic-get-from (format nil "/f/~a/~a"
41
+                                         (fwoar.rss-reader::feed-key renderer)
42
+                                         (fwoar.rss-reader::id->slug (alimenta:id item)))
43
+               (plump:decode-entities
44
+                (alimenta:title item)))
45
+           (:p.description
46
+            (let ((description (fwoar.rss-reader:prepare-feed-item-description renderer item)))
47
+              (when description
48
+                (plump:decode-entities
49
+                 description)))))))))
48 50
 
49 51
 (defmethod alimenta.render:add-rendered-item (feed-r item-r (renderer fwoar.rss-reader:feed-reference))
50 52
   (lquery:$
... ...
@@ -6,6 +6,16 @@
6 6
 (defclass rss-reader-route ()
7 7
   ((%feed-list :initarg :feed-list :reader feed-list)))
8 8
 
9
+(defun nav (route)
10
+  (spinneret:with-html
11
+    (loop for feed in (feed-list route)
12
+          for idx from 0
13
+          collect (:a :data-ic-get-from (format nil "/f/~a" (string-downcase (feed-key feed)))
14
+                      :class (if (string= (feed-key feed)
15
+                                          (feed-key (feed route)))
16
+                                 "active" "")
17
+                      (feed-key feed)))))
18
+
9 19
 (defmethod araneus:view :around ((route rss-reader-route) model)
10 20
   "basic html and javascript for our app, as well as an invocation of
11 21
 the hook that pulls in CSS"
... ...
@@ -18,7 +28,7 @@ the hook that pulls in CSS"
18 28
         (:head
19 29
          (:script :src "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js")
20 30
          (:script :src
21
-                  "https://cdnjs.cloudflare.com/ajax/libs/intercooler-js/1.2.2/intercooler.min.js"
31
+                  "https://cdnjs.cloudflare.com/ajax/libs/intercooler-js/1.2.3/intercooler.min.js"
22 32
                   :defer "defer")
23 33
          (:script :defer "defer"
24 34
                   (:raw (fwoar.rss-reader.ui:intercooler-debugger)))
... ...
@@ -48,7 +58,9 @@ the hook that pulls in CSS"
48 58
     ((:or h1 h2 h3 h4 h5 h6)
49 59
      :font-size 1.6rem)
50 60
     ((:or ul ol)
51
-     :padding-left 2rem)))
61
+     :padding-left 2rem)
62
+    (.active
63
+     :background "#888")))
52 64
 
53 65
 (defmacro with-layout ((render-type layout) &body content)
54 66
   `(let ((content (lambda ()
... ...
@@ -71,7 +83,7 @@ the hook that pulls in CSS"
71 83
 
72 84
 (defmethod araneus:view ((route feed-page) (model fwoar.intercooler:intercooler-request))
73 85
   (spinneret:with-html
74
-    (:main#content
86
+    (spinneret:html
75 87
      (alimenta:render (fwoar.intercooler:request model)
76 88
                       (feed route)))))
77 89
 
... ...
@@ -81,15 +93,46 @@ the hook that pulls in CSS"
81 93
     (:div.main
82 94
      (:nav
83 95
       :data-ic-push-url "true"
84
-      :data-ic-target "main"
85
-      :data-ic-replace-target "true"
86
-      (loop for feed in (feed-list route)
87
-            collect (:a :data-ic-get-from (format nil "/f/~a" (string-downcase (feed-key feed)))
88
-                        (feed-key feed))))
96
+      :data-ic-target "#content"
97
+      :data-ic-switch-class "active"
98
+      (nav route))
89 99
      (:main#content
100
+      :data-ic-target "#content"
90 101
       (alimenta:render (fwoar.intercooler:request model)
91 102
                        (feed route))))))
92 103
 
104
+(defclass+ feed-item-page ((rss-reader-route (feed-list))
105
+                           fwoar.intercooler:intercooler-route
106
+                           fwoar.default-layout:default-layout)
107
+  ((%feed :initarg :feed :reader feed)
108
+   (%item :initarg :item :reader item)))
109
+
110
+(defmethod araneus:controller ((route feed-item-page) params &key)
111
+  (find (item route)
112
+        (resolve-feed-reference (feed route))
113
+        :key (alexandria:compose 'id->slug 'alimenta:id)
114
+        :test 'string-equal))
115
+
116
+(defmethod araneus:view ((route feed-item-page) (model fwoar.intercooler:intercooler-request))
117
+  (spinneret:with-html
118
+    (:raw
119
+     (alimenta:content (fwoar.intercooler:request model)))))
120
+
121
+(defmethod araneus:view ((route feed-item-page) (model fwoar.intercooler:full-request))
122
+  (spinneret:with-html
123
+    (:h1 "Hello, World!")
124
+    (:div.main
125
+     (:nav
126
+      :data-ic-push-url "true"
127
+      :data-ic-target "#content"
128
+      #+(or)(:data-ic-replace-target "true")
129
+      :data-ic-switch-class "active"
130
+      (nav route))
131
+     (:main#content
132
+      :data-ic-target "#content"
133
+      (:raw
134
+       (alimenta:content (fwoar.intercooler:request model)))))))
135
+
93 136
 (defmethod fwoar.default-layout:border-color ((layout rss-reader-route))
94 137
   "#BDE0F3")
95 138
 (defmethod fwoar.default-layout:background-color ((layout rss-reader-route))