-
-
Save CmdrDats/948559a228c0b9751004 to your computer and use it in GitHub Desktop.
Autocomplete implementation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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