summaryrefslogtreecommitdiff
path: root/src/chef/frontend/visitor
diff options
context:
space:
mode:
authorTim <contact@bytim.eu>2025-06-14 11:49:28 +0200
committerTim <contact@bytim.eu>2025-06-14 11:49:28 +0200
commit8e23d9dade945f87f5fc7fb15042a53a7eeb9a9e (patch)
treec0f5b6587b6f9f0b591b395c69ad7da08717a30b /src/chef/frontend/visitor
parent229299146376a2b847f4fe3f331efbd26c0abc70 (diff)
downloadchef-8e23d9dade945f87f5fc7fb15042a53a7eeb9a9e.tar.xz
chef-8e23d9dade945f87f5fc7fb15042a53a7eeb9a9e.zip
Refactor project structure
Diffstat (limited to 'src/chef/frontend/visitor')
-rw-r--r--src/chef/frontend/visitor/home.clj41
-rw-r--r--src/chef/frontend/visitor/recipe.clj55
-rw-r--r--src/chef/frontend/visitor/recipe/thumbnail.clj10
-rw-r--r--src/chef/frontend/visitor/search.clj38
4 files changed, 144 insertions, 0 deletions
diff --git a/src/chef/frontend/visitor/home.clj b/src/chef/frontend/visitor/home.clj
new file mode 100644
index 0000000..6503983
--- /dev/null
+++ b/src/chef/frontend/visitor/home.clj
@@ -0,0 +1,41 @@
+(ns chef.frontend.visitor.home
+ (:require [hiccup2.core :as html]
+ [ring.util.response :as ruresp]
+ [chef.utils :as cutils]
+
+ [chef.frontend.visitor.search :as cfvsearch]
+
+ [chef.logic.categories :as clcategories]))
+
+(defn- render [req]
+ (cutils/gen-page "chef"
+ (let [category (clcategories/get-category (or (get-in req [:params "category"]) -1))]
+ [:div {:style {:text-align :center}}
+ [:h1 "chef"]
+ [:h2 "Finde das perfekte Gericht für dich!"]
+ [:b (:categories/question category)]
+ [:div
+ (for [child-category (clcategories/find-categories-with-parent (:categories/id category))]
+ [:div
+ [:button {:style {:margin-bottom "1em"}
+ :onclick (str "window.location = \"/?category=" (:categories/id child-category) "\"")}
+ (:categories/name child-category)]
+ [:br]])]
+ (when (pos? (:categories/id category))
+ [:h3 (clcategories/generate-path category)])
+ [:input {:type :text
+ :style {:width "90%" :margin :auto}
+ :placeholder "Suche"
+ :hx-get (str "/components/search?category=" (:categories/id category))
+ :name "query"
+ :hx-swap "innerHTML"
+ :hx-target "#search-results"}]
+ [:div {:id "search-results"}
+ (cfvsearch/render "" (:categories/id category))]])))
+
+(defn handler [req]
+ (-> req
+ render
+ html/html
+ str
+ ruresp/response))
diff --git a/src/chef/frontend/visitor/recipe.clj b/src/chef/frontend/visitor/recipe.clj
new file mode 100644
index 0000000..e3dbf97
--- /dev/null
+++ b/src/chef/frontend/visitor/recipe.clj
@@ -0,0 +1,55 @@
+(ns chef.frontend.visitor.recipe
+ (:require [chef.utils :as cutils]
+ [clojure.string :as cstr]
+ [hiccup2.core :as html]
+ [ring.util.response :as ruresp]
+
+ [chef.logic.recipes :as clrecipes]
+ [chef.logic.categories :as clcategories]))
+
+(defn- render [portions recipe]
+ (cutils/gen-page (str "chef - " (:recipes/title recipe))
+ [:div {:style {:margin-left "1em"}}
+ [:div
+ [:h1 {:style {:display :inline-block
+ :margin-right "0.5em"}}
+ (:recipes/title recipe)]
+ [:i (str "(" (-> (:recipes/category recipe)
+ clcategories/get-category
+ clcategories/generate-path) ")")]]
+ (when (some? (clrecipes/get-recipe-thumbnail (:recipes/id recipe)))
+ [:img {:src (str "/recipes/" (:recipes/id recipe) "/thumbnail")
+ :width "50%"}])
+ [:h2
+ "Zutaten pro "
+ [:input {:type :number
+ :value portions
+ :style {:width "3em"
+ :display :inline-block}
+ "_" "on change go to url `?portions=${value of me}`"}]
+ (condp = (:recipes/unit recipe)
+ 0 " Portion(en)"
+ 1 " Person(en)"
+ "")
+ ":"]
+ [:ul (for [ingredient (-> recipe
+ :recipes/ingredients
+ cutils/parse-ingredients)]
+ [:li
+ [:b (:description ingredient)] ": "
+ (* (:amount ingredient) portions)
+ (:unit ingredient)])]
+ [:h2 "Zubereitung"]
+ (->> (:recipes/preparation recipe)
+ cstr/split-lines
+ (map #(if (cstr/blank? %)
+ [:br]
+ [:p %])))]))
+
+(defn handler [req]
+ (->> (clrecipes/get-recipe (get-in req [:path-params :id]))
+ (render (or (cutils/s->int-or-nil (get-in req [:params "portions"]))
+ 1))
+ html/html
+ str
+ ruresp/response))
diff --git a/src/chef/frontend/visitor/recipe/thumbnail.clj b/src/chef/frontend/visitor/recipe/thumbnail.clj
new file mode 100644
index 0000000..c14f491
--- /dev/null
+++ b/src/chef/frontend/visitor/recipe/thumbnail.clj
@@ -0,0 +1,10 @@
+(ns chef.frontend.visitor.recipe.thumbnail
+ (:require [ring.util.response :as ruresp]
+ [chef.logic.recipes :as clrecipes])
+ (:import java.io.File))
+
+(defn handler [req]
+ (if-let [id (get-in req [:path-params :id])]
+ (when-let [thumbnail-file (clrecipes/get-recipe-thumbnail id)]
+ (ruresp/file-response (.getPath ^File thumbnail-file)))
+ (ruresp/bad-request "Bad request.")))
diff --git a/src/chef/frontend/visitor/search.clj b/src/chef/frontend/visitor/search.clj
new file mode 100644
index 0000000..7a2db93
--- /dev/null
+++ b/src/chef/frontend/visitor/search.clj
@@ -0,0 +1,38 @@
+(ns chef.frontend.visitor.search
+ (:require [chef.utils :as cutils]
+ [clojure.string :as cstr]
+ [hiccup2.core :as html]
+ [ring.util.response :as ruresp]
+
+ [chef.logic.categories :as clcategories]
+ [chef.logic.recipes :as clrecipes]))
+
+(defn render [query category]
+ [:table
+ [:tr
+ [:th "Rezept"]
+ [:th "Kategorie"]]
+ (for [recipe (clrecipes/get-all-recipes)
+ :let [recipe-category (clcategories/get-category (:recipes/category recipe))]]
+ (when (or (= category -1)
+ (and (cstr/includes? (-> recipe
+ :recipes/title
+ cstr/lower-case)
+ query)
+ (some #(= (:categories/id %) category)
+ (clcategories/get-parents recipe-category))))
+ [:tr
+ [:td
+ [:b [:a {:href (str "/recipes/" (:recipes/id recipe))} (:recipes/title recipe)]]]
+ [:td
+ (-> (:recipes/category recipe)
+ clcategories/get-category
+ clcategories/generate-path)]]))])
+
+(defn handler [req]
+ (if-let [query (get-in req [:params "query"])]
+ (-> (render query (or (cutils/s->int-or-nil (get-in req [:params "category"])) -1))
+ html/html
+ str
+ ruresp/response)
+ (ruresp/bad-request "No search query provide.")))