summaryrefslogtreecommitdiff
path: root/forms.fnl
diff options
context:
space:
mode:
authorunwox <me@unwox.com>2025-09-09 16:44:10 +0600
committerunwox <me@unwox.com>2025-09-09 16:44:22 +0600
commit85feff4a72bade2488c7927624aae3f5af4769dc (patch)
tree08ed0e48054a0705fa0e70ca384340a7c046f327 /forms.fnl
parent49715f6df79b677481e4cb244a1ca835ee06028f (diff)
make it possible to reset file inputs
Diffstat (limited to 'forms.fnl')
-rw-r--r--forms.fnl88
1 files 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 "&times;&nbsp;Сбросить"]]]]
(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 " = ?, ") " = ? "