From 66c51b0e714fa8a1c80784108191270babc8525e Mon Sep 17 00:00:00 2001 From: unwox Date: Sun, 31 Aug 2025 17:51:57 +0600 Subject: implement shop --- pages/shop/add.fnl | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 pages/shop/add.fnl (limited to 'pages/shop/add.fnl') 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} -- cgit v1.2.3