(import-macros {:compile-html 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.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.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" 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?] [(HTML [:div {:class "side"} (templates.header "/shop" authenticated?)]) (HTML [: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}