summaryrefslogtreecommitdiff
path: root/pages/shop/add.fnl
diff options
context:
space:
mode:
authorunwox <me@unwox.com>2025-08-31 17:51:57 +0600
committerunwox <me@unwox.com>2025-09-04 20:14:11 +0600
commit66c51b0e714fa8a1c80784108191270babc8525e (patch)
tree0640549f522092096d83c78b9be9b1fa4a03929e /pages/shop/add.fnl
parentd8039a77d582f696ab98b2a6d02ce924fbacfa41 (diff)
implement shop
Diffstat (limited to 'pages/shop/add.fnl')
-rw-r--r--pages/shop/add.fnl83
1 files changed, 83 insertions, 0 deletions
diff --git a/pages/shop/add.fnl b/pages/shop/add.fnl
new file mode 100644
index 0000000..8fcfdf1
--- /dev/null
+++ b/pages/shop/add.fnl
@@ -0,0 +1,83 @@
+(import-macros {:compile-html <>} :macros)
+(local templates (require :templates))
+(local dicts (require :dicts))
+(local forms (require :forms))
+(local lib (require :lib))
+
+(local product-form
+ [{:title ""
+ :fields [
+ (forms.checkbox-input "published" "Опубликован" false
+ "Отображать ли товар на страницах магазина.")
+ (forms.number-input "position" "Позиция в списке" true 0 1000
+ "Чем выше число, тем позже в списке будет находиться товар.")
+ (forms.text-input "name" "Алиас" true 0 125
+ (.. "Уникальное название чая на латинице, без пробелов, "
+ "в нижнем регистре."))
+ (forms.text-input "title" "Полное название" true 0 200)
+ (forms.select-input "type" "Вид чая" true dicts.tea-type)
+ (forms.select-input "packaging" "Упаковка" true dicts.tea-packaging)
+ (forms.textarea-input "short_description" "Короткое описание" true 0 1000)
+ (forms.textarea-input "description" "Полное описание" true 0 20000)
+ (forms.number-input "price_per" "Цена" true 0 100000
+ "За штуку или грамм.")
+ (forms.number-input "stock" "Сколько в наличии" true 0 100000
+ "В штуках или граммах.")]}
+
+ {:title "Фото"
+ :fields [
+ (forms.file-input "image1" "Первое" true ".jpg" 512)
+ (forms.file-input "image2" "Второе" false ".jpg" 512)
+ (forms.file-input "image3" "Третье" false ".jpg" 512)
+ (forms.file-input "image4" "Четвертое" false ".jpg" 512)
+ (forms.file-input "image5" "Пятое" false ".jpg" 512)]}
+
+ {:title "Данные о поставщике"
+ :fields [
+ (forms.select-input "vendor" "Поставщик" false
+ [{:value "oz" :label "Орехово-Зуево"}
+ {:value "chaibez" :label "Чай без церемоний"}])
+ (forms.text-input "vendor_article" "Артикль или ID товара у поставщика" false
+ 0 50)
+ (forms.textarea-input "vendor_description" "Описание товара от поставщика"
+ false 0 10000)
+ (forms.number-input "vendor_price_per" "Цена поставщика" false 0 100000
+ "За штуку или грамм.")
+ (forms.url-input "vendor_product_link" "Ссылка на чай у поставщика" false)]}])
+
+(fn insert-product [tx form data]
+ (let [sql-and-args (forms.form-insert-sql-statement "products" form data
+ {:creation_time (lib.now)})]
+ (if sql-and-args
+ (_G.must (luna.db.exec-tx tx (table.unpack sql-and-args)))
+ (error "empty data for insert SQL-statement"))))
+
+(fn content [form data errors authenticated?]
+ [(<>
+ [:div {:class "side"}
+ (templates.header "/shop" authenticated?)])
+ (<>
+ [:div {:class "content"}
+ [:div {:class "mb-1"}
+ [:a {:href "/shop"} "⟵ Обратно к списку"]]
+ [:h2 {} "Добавить товар"]
+ (forms.render-form form data errors)])])
+
+(fn render [request db authenticated?]
+ (if (not authenticated?)
+ (values 302 {:Location "/shop"} "")
+ (if request.form
+ (let [data (forms.convert-values-from-html product-form request.form db)
+ errors (forms.validate-form product-form request.form)
+ has-errors? (not (lib.empty-table? errors))]
+ (if has-errors?
+ (values 200 {} (templates.base (content product-form request.form errors
+ authenticated?)))
+ (do
+ (lib.with-tx db
+ (fn [tx] (insert-product tx product-form request.form)))
+ (values 302 {:Location "/shop"} ""))))
+ (values 200 {} (templates.base (content product-form {} {}
+ authenticated?))))))
+
+{: render : product-form}