diff options
Diffstat (limited to 'pages/shop/_product/index.fnl')
| -rw-r--r-- | pages/shop/_product/index.fnl | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/pages/shop/_product/index.fnl b/pages/shop/_product/index.fnl new file mode 100644 index 0000000..722c952 --- /dev/null +++ b/pages/shop/_product/index.fnl @@ -0,0 +1,83 @@ +(import-macros {:compile-html <>} :macros) +(local templates (require :templates)) +(local dicts (require :dicts)) +(local lib (require :lib)) + +(fn text->html [text] + (assert (= (type text) "string")) + (var result "") + (var from 1) + (var to (text:find "\n%s*\n%s*" from)) + (while to + (set result (.. result "<p>" (text:sub from (- to 1)) "</p>\n")) + (set from (+ to 2)) + (set to (text:find "\n%s*\n%s*" from))) + (.. result "<p>" (text:sub from) "</p>")) + +(fn find-product [db name] + (. + (_G.must + (luna.db.query-assoc + db + "SELECT products.name, + products.title, + products.description, + products.price_per AS \"price-per\", + products.type, + products.stock, + products.published, + products.image1, + products.image2, + products.image3, + products.image4, + products.image5 + FROM products + WHERE products.name = ?" + [name])) + 1)) + +(fn content [product authenticated?] + (local images []) + (for [i 1 5] + (table.insert images (. product (.. "image" i)))) + + [(<> + [:div {:class "side"} + (templates.header "/shop" authenticated?)]) + (<> + [:div {:class "content"} + [:div {:class "mb-1"} [:a {:href "/shop"} "⟵ Обратно к списку"]] + + (let [link (.. "/static/files/" product.image1)] + (<> [:a {:href link :target "_blank"} + [:img {:class "product-page-img-mobile mb-1-5" + :src (.. link "-thumbnail.jpg")}]])) + [:div {:class "product-page-layout"} + [:div {} + [:h2 {:class "product-page-title mb-1"} product.title] + [:section {:class "mb-2"} + (if authenticated? + (<> [:div {:class "mb-0-5"} + [:a {:href (.. "/shop/" product.name "/edit")} + "✎ Редактировать"]]) + "") + [:div {:class "mb-0-5" :style "font-style: italic;"} + (or (dicts.label dicts.tea-type product.type) product.type) ", " + [:strong {} (* 50 product.price-per) "₽ за 50 грамм "] + (.. "(" product.price-per "₽ за 1 грамм)")]] + [:div {:class "mb-2"} "~~~"] + [:NO-ESCAPE (text->html product.description)]] + [:div {:class "product-page-imgs"} + (table.concat + (icollect [idx image (ipairs images)] + (let [link (.. "/static/files/" image)] + (<> [:a {:href link :target "_blank"} + [:img {:class "product-page-img" :src (.. link "-thumbnail.jpg")}]]))))]]])]) + +(fn render [request db authenticated?] + (let [product (find-product db request.params._product)] + (if (and product (or product.published authenticated?)) + (values 200 {} (templates.base (content product authenticated?))) + (values 404 {} "not found")))) + +{: render} |
