🐛 Fix some errors on navigation

This commit is contained in:
Eva Marco
2026-02-25 10:59:12 +01:00
parent f138ca68a8
commit 8619389f0d
5 changed files with 85 additions and 54 deletions

View File

@@ -137,9 +137,10 @@
(mf/deps value resolve-stream name)
(fn [id]
(let [input-node (mf/ref-val ref)
final-val (tp/select-option-by-id id options-ref input-node value)]
(fm/on-input-change form name final-val true)
(rx/push! resolve-stream final-val)
final-val (tp/select-option-by-id id options-ref input-node value)]
(when final-val
(fm/on-input-change form name final-val true)
(rx/push! resolve-stream final-val))
(reset! filter-term* "")
(reset! is-open* false))))
@@ -180,16 +181,17 @@
id (dom/get-data node "id")
final-val (tp/select-option-by-id id options-ref input-node value)]
(fm/on-input-change form name final-val true)
(rx/push! resolve-stream final-val)
(reset! filter-term* "")
(reset! is-open* false)
(dom/focus! input-node)
(let [new-cursor (+ (str/index-of final-val "}") 1)]
(set! (.-selectionStart input-node) new-cursor)
(set! (.-selectionEnd input-node) new-cursor)))))
(when final-val
(reset! is-open* false)
(fm/on-input-change form name final-val true)
(rx/push! resolve-stream final-val)
(let [new-cursor (+ (str/index-of final-val "}") 1)]
(set! (.-selectionStart input-node) new-cursor)
(set! (.-selectionEnd input-node) new-cursor))))))
hint*
(mf/use-state {})

View File

@@ -6,6 +6,7 @@
(ns app.main.ui.workspace.tokens.management.forms.controls.combobox-navigation
(:require
[app.main.ui.workspace.tokens.management.forms.controls.utils :refer [focusable-options]]
[app.util.dom :as dom]
[app.util.keyboard :as kbd]
[app.util.object :as obj]
@@ -51,16 +52,23 @@
options (if (delay? options) @options options)]
(cond
down?
(do
(dom/prevent-default event)
(if is-open
(let [next-id (next-focus-id options focused-id :down)]
(reset! focused-id* next-id))
(do
(toggle-dropdown event)
(reset! focused-id* (first-focusable-id options)))))
(let [focusables (focusable-options options)]
(cond
is-open
(when (seq focusables)
(let [next-id (next-focus-id options focused-id :down)]
(reset! focused-id* next-id)))
(seq focusables)
(do
(toggle-dropdown event)
(reset! focused-id* (first-focusable-id focusables)))
:else
nil)))
up?
(when is-open
@@ -77,11 +85,8 @@
enter?
(do
(dom/prevent-default event)
(if is-open
(on-enter focused-id)
(do
(reset! focused-id* (first-focusable-id options))
(toggle-dropdown event))))
(when (and is-open focused-id)
(on-enter focused-id)))
esc?
(do
(dom/prevent-default event)

View File

@@ -20,28 +20,40 @@
{:start last-open
:partial (subs text-before (inc last-open))})))
;; (defn replace-active-token
;; [value cursor new-name]
;;
;; (let [before (subs value 0 cursor)
;; last-open (str/last-index-of before "{")
;; last-close (str/last-index-of before "}")]
;;
;; (if (and last-open
;; (or (nil? last-close)
;; (> last-open last-close)))
;;
;; (let [after-start (subs value last-open)
;; close-pos (str/index-of after-start "}")
;; end (if close-pos
;; (+ last-open close-pos 1)
;; cursor)]
;; (str (subs value 0 last-open)
;; "{" new-name "}"
;; (subs value end)))
;; (str (subs value 0 cursor)
;; "{" new-name "}"
;; (subs value cursor)))))
(defn replace-active-token
[value cursor new-name]
(let [before (subs value 0 cursor)
last-open (str/last-index-of before "{")
last-close (str/last-index-of before "}")]
(if (and last-open
(or (nil? last-close)
(> last-open last-close)))
(let [after-start (subs value last-open)
close-pos (str/index-of after-start "}")
end (if close-pos
(+ last-open close-pos 1)
cursor)]
(str (subs value 0 last-open)
"{" new-name "}"
(subs value end)))
(str (subs value 0 cursor)
"{" new-name "}"
(subs value cursor)))))
(if-let [{:keys [start]} (extract-partial-token value cursor)]
;; Hay token activo
(str (subs value 0 start)
"{" new-name "}"
(subs value cursor))
;; No hay token activo → insertar en cursor
(str (subs value 0 cursor)
"{" new-name "}"
(subs value cursor))))
(defn active-token [value input-node]
(let [cursor (dom/selection-start input-node)]

View File

@@ -14,24 +14,28 @@
(defn- generate-dropdown-options
[tokens no-sets]
(if (empty? tokens)
(let [non-empty-groups
(->> tokens
(filter (fn [[_ items]] (seq items))))]
(if (empty? non-empty-groups)
[{:type :empty
:label (if no-sets
(tr "ds.inputs.numeric-input.no-applicable-tokens")
(tr "ds.inputs.numeric-input.no-matches"))}]
(->> tokens
(map (fn [[type items]]
(cons {:group true
:type :group
:id (dm/str "group-" (name type))
:name (name type)}
(map token->dropdown-option items))))
(->> non-empty-groups
(keep (fn [[type items]]
(when (seq? items)
(cons {:group true
:type :group
:id (dm/str "group-" (name type))
:name (name type)}
(map token->dropdown-option items)))))
(interpose [{:separator true
:id "separator"
:type :separator}])
(apply concat)
(vec)
(not-empty))))
(not-empty)))))
(defn- extract-partial-brace-text
[s]
@@ -84,7 +88,7 @@
options (if (seq partial)
(filter-token-groups-by-name sorted-tokens partial)
sorted-tokens)
no-sets? (nil? sorted-tokens)]
no-sets? (empty? sorted-tokens)]
(generate-dropdown-options options no-sets?))))
(defn filter-tokens-for-input
@@ -92,4 +96,7 @@
(delay
(-> (deref raw-tokens)
(select-keys (get cto/tokens-by-input input-type))
(not-empty))))
(not-empty))))
(defn focusable-options [options]
(filter #(= (:type %) :token) options))

View File

@@ -282,6 +282,11 @@
(when (some? node)
(.-selectionStart node)))
(defn set-selection-range!
[^js node start end]
(when (some? node)
(.setSelectionRange node start end)))
(defn ^boolean equals?
[^js node-a ^js node-b]