summaryrefslogtreecommitdiff
path: root/pages/shop/add.fnl
blob: 02ec731f4953859059781aba31bb6194b85f5abf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
(import-macros {:compile-html HTML} :macros)
(local templates (require :templates))
(local dicts (require :dicts))
(local shop (require :shop))
(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.product-type)
     (forms.select-input "packaging" "Упаковка" true dicts.tea-packaging)
     (forms.number-input "year" "Год изготовления" false 1950
                         (tonumber (os.date "%Y")) "Для чая.")
     (forms.select-input "season" "Сезон изготовления" false dicts.tea-season
                         "Для чая.")
     (forms.number-input "volume" "Объем" false 0 2000 "В мл. Для посуды.")
     (forms.text-input "region" "Место изготовления" false 0 500)
     (forms.textarea-input "short_description" "Короткое описание" true 0 1000
                           "Суть и основные качества товара в одном предложении.")
     (forms.textarea-input "description" "Полное описание" false 0 20000
                           "Отображается на странице товара.")
     (forms.textarea-input "recommendations" "Рекомендации по завариванию"
                           false 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,.webm" 512
                       "Дополнительные изображения или видео.")
     (forms.file-input "image3" "Третье" false ".jpg,.webm" 512)
     (forms.file-input "image4" "Четвертое" false ".jpg,.webm" 512)
     (forms.file-input "image5" "Пятое" false ".jpg,.webm" 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?]
  [(HTML
    [:aside {}
     (templates.header "/shop" authenticated?)])
   (HTML
    [:div {:class "content"}
     [:div {:class "back"} [: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.html-form->data product-form request.form db)
           errors (forms.validate 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)
               (shop.update-search-index tx)))
           (values 302 {:Location "/shop"} ""))))
     (values 200 {} (templates.base (content product-form {} {}
                                             authenticated?))))))

{: render : product-form}