Browse code
feat: item page
Ed Langley authored on 17/04/2020 11:35:49
Showing 5 changed files
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 |
... | ... |
@@ -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)) |