From 85feff4a72bade2488c7927624aae3f5af4769dc Mon Sep 17 00:00:00 2001 From: unwox Date: Tue, 9 Sep 2025 16:44:10 +0600 Subject: make it possible to reset file inputs --- forms.fnl | 88 ++++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 68 insertions(+), 20 deletions(-) diff --git a/forms.fnl b/forms.fnl index ee5d08b..b4c0795 100644 --- a/forms.fnl +++ b/forms.fnl @@ -132,6 +132,29 @@ (if help (HTML [:div {:class "form-help"} help]) "")]))}) (fn file-input [name label required? accept thumbnail-width help] + (local onchange-input-js + "const file = event.target.files[0]; + const containerEl = event.target.parentElement.parentElement; + if (file && file.name.toLowerCase().endsWith('.jpg')) { + const reader = new FileReader(); + reader.onload = function () { + const imgEl = containerEl.querySelector('.form-file-img') + imgEl.src = reader.result; + imgEl.classList.add('d-block'); + } + reader.readAsDataURL(event.target.files[0]); + } + containerEl.querySelector('.form-file-reset') + .classList.add('d-block');") + (local reset-button-js + "const parentEl = event.target.parentElement; + for (const inputEl of parentEl.querySelectorAll('input')) { + inputEl.value = '' + } + parentEl.parentElement.querySelector('.form-file-img') + .classList.remove('d-block'); + event.target.classList.remove('d-block');") + {:type "file" : name : label : required? : help :value-from-html (fn [value {: data : db}] @@ -139,7 +162,10 @@ (lib.handle-upload db value nil thumbnail-width) (not (lib.empty? value)) value - (. data (.. name "_previous")))) + (let [previous-value (. data (.. name "_previous"))] + (if (not (lib.empty? previous-value)) + previous-value + nil)))) :html (fn [value error] (local empty-value? (lib.empty? value)) @@ -148,16 +174,30 @@ (HTML [:div {:class "form-row"} [:div {:class "d-flex gap-1"} - (if (and value (lib.ends-with? value ".jpg")) - (HTML [:img {:class "form-file-img" :src (.. "/static/files/" value)}]) - "") + (HTML [:img (fn [] + {:class (.. "form-file-img" + (if (and value (lib.ends-with? value ".jpg")) + " d-block" + "")) + :src (if value + (.. "/static/files/" value "-thumbnail.jpg") + "")})]) [:div {} [:label {:class "form-label" :for name} label (if required? required-marker "")] [:input (fn [] {:type "file" :name name :id name :class "form-input" - :required required? :accept accept})]]] - (if (not empty-value?) - (HTML [:input {:type "hidden" :name (.. name "_previous") :value value}]) - "") + :onchange onchange-input-js + :required required? :accept accept})] + (if (not empty-value?) + (HTML [:input {:type "hidden" :name (.. name "_previous") + :value value}]) + "") + [:button + (fn [] + {:type "button" + :style "display: none" + :class (.. "form-file-reset" (if value " d-block" "")) + :onclick reset-button-js}) + [:NO-ESCAPE "× Сбросить"]]]] (if error (HTML [:div {:class "form-error"} error]) "") (if help (HTML [:div {:class "form-help"} help]) "")]))}) @@ -225,18 +265,22 @@ (fn form-insert-sql-statement [table-name form data extra-data] (var columns []) (var args []) + (var i 1) (each [_ group (ipairs form)] (each [_ field (ipairs group.fields)] - (local value (. data field.name)) - (when (not (lib.empty? value)) - (table.insert columns field.name) - (table.insert args value)))) + (table.insert columns field.name) + (tset args i (. data field.name)) + (set i (+ 1 i)))) (when extra-data (each [key value (pairs extra-data)] (table.insert columns key) - (table.insert args value))) + (tset args i value) + (set i (+ 1 i)))) + + ;; specify count of args so go knows how many there are args including nils + (tset args :n (- i 1)) (if (< 0 (# columns)) [(.. "INSERT INTO " table-name " (" (table.concat columns ", ") ") VALUES " @@ -247,25 +291,29 @@ (fn form-update-sql-statement [table-name form data extra-data where] (var columns []) (var args []) + (var i 1) (each [_ group (ipairs form)] (each [_ field (ipairs group.fields)] - (local value (. data field.name)) - (when (not (lib.empty? value)) - (table.insert columns field.name) - (table.insert args value)))) + (table.insert columns field.name) + (tset args i (. data field.name)) + (set i (+ 1 i)))) (when extra-data (each [key value (pairs extra-data)] (table.insert columns key) - (table.insert args value))) + (tset args i value) + (set i (+ 1 i)))) (var where-columns []) - (when where (each [key value (pairs where)] (table.insert where-columns key) - (table.insert args value))) + (tset args i value) + (set i (+ 1 i)))) + + ;; specify count of args so go knows how many there are args including nils + (tset args :n (- i 1)) (if (< 0 (# columns)) [(.. "UPDATE " table-name " SET " (table.concat columns " = ?, ") " = ? " -- cgit v1.2.3