(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}