Skip to content

Instantly share code, notes, and snippets.

@CmdrDats
Created June 12, 2015 08:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CmdrDats/948559a228c0b9751004 to your computer and use it in GitHub Desktop.
Save CmdrDats/948559a228c0b9751004 to your computer and use it in GitHub Desktop.
Autocomplete implementation
(ns amanda.autocomplete
(:require
[goog.dom :as dom]
[goog.dom.safe :as safe])
(:import [goog.ui.ac Remote RemoteArrayMatcher ArrayMatcher AutoComplete Renderer InputHandler
RemoteArrayMatcher]))
(defn select [element entry]
(let [id (.getElementById js/document (.getAttribute element "data-id"))]
(.log js/console entry)
(cond
(string? entry)
(do
(when id (set! (.-value id) entry))
(set! (.-value element) entry))
(.-url entry)
(do
(set! (.-value element) (.-value entry))
(set! (.-href (.-location js/window)) (.-url entry)))
:else
(do
(when id (set! (.-value id) (.-id entry)))
(set! (.-value element) (.-value entry))))))
(defn render-row [row token node]
(let [data (.-data row)]
(cond
(string? data)
(goog.dom/setTextContent node (.-data row))
(.-catname data)
(set!
(.-innerHTML node)
(str
"<div class='ac-cat'>"
(if (.-img data) (str "<div style='height:40px'><span class='ac-img'><img src='" (.-img data) "'></span>"))
"<span class='ac-value'>" (.-catname data) "</span>"
(if (.-desc data) (str "<span class='ac-hint'>" (.-desc data) "</span>"))
(if (.-img data) (str "</div>"))
"</div>"))
:else
(set!
(.-innerHTML node)
(str
"<div class='ac-rowcontent'>"
(if (.-img data) (str "<div style='height:40px'><span class='ac-img'><img src='" (.-img data) "'></span>"))
"<span class='ac-value'>" (.-value data) "</span>"
(if (.-desc data) (str "<span class='ac-hint'>" (.-desc data) "</span>"))
(if (.-img data) (str "</div>"))
"</div>")))))
(defn setup [root]
(.log js/console "Setting up autocomplete")
(doseq
[a (.getElementsByClassName root "googautocomplete")]
(.log js/console "Autocomplete on: ")
(.log js/console a)
(let [data-ac (.getAttribute a "data-ac")
data (cljs.reader/read-string data-ac)
i (InputHandler. nil nil false 500)
m (cond
(vector? data) (ArrayMatcher. (clj->js data))
:else (RemoteArrayMatcher. data-ac))
r (Renderer. nil (js-obj "renderRow" (fn [r t n] (render-row r t n))))
ac
(AutoComplete.
m r
(js-obj "selectRow" (partial select a)))]
(.attachAutoComplete i ac)
(.attachInputs i a)
(.log js/console (str data)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment