Skip to content

Instantly share code, notes, and snippets.

@digal
Last active August 29, 2015 13:56
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 digal/8858323 to your computer and use it in GitHub Desktop.
Save digal/8858323 to your computer and use it in GitHub Desktop.
Working with bootstrap dropdowns in clojurescript
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Pay QR</title>
<!-- Bootstrap -->
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css">
<!-- Optional theme -->
<link rel="stylesheet" href="http://netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap-theme.min.css">
</head>
<body>
<div class="container">
<h1>QR Generator!</h1>
<div class="btn-group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<span id="category-name">Категория</span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu" id="categories-list">
</ul>
</div>
<div class="btn-group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
<span id="provider-name">Провайдер</span>
<span class="caret"></span>
</button>
<ul class="dropdown-menu" id="providers-list">
</ul>
</div>
</div>
<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="https://code.jquery.com/jquery.js"></script>
<!-- Latest compiled and minified JavaScript -->
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.1.0/js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>
</body>
</html>
(ns select
(:use [domina :only [by-id value append! attr set-text! destroy-children!]]
[domina.events :only [listen!]]
[categories :only [categories]]))
;populates dropdown with options
(defn set-options!
[ul-element ;<ul> to insert dropdown items
items ;items seq
to-li ;function to serialize item to <li> tag
id-attr ;function to create "id" attribute for item
selected-handler] ;item selected handler
(destroy-children! ul-element)
(doseq [item items]
(do
(append! ul-element (to-li item))
(listen! (by-id (id-attr item)) :click #((selected-handler item))))))
;provider HTML stuff
(defn provider-id-attr [provider]
(str "prv-" (:id provider)))
(defn provider-to-li [provider]
(str "<li><a href=\"#\" prv-id=\"" (:id provider) "\" id=\"" (provider-id-attr provider) "\">" (:name provider) "</a></li>"))
(defn provider-selected [provider]
(.log js/console (:name provider))
(set-text! (by-id "provider-name") (:name provider)))
;category HTML stuff
(defn cat-id-attr [cat]
(str "cat-" (:id cat)))
(defn cat-to-li [cat]
(str "<li><a href=\"#\" cat-id=\"" (:id cat) "\" id=\"" (cat-id-attr cat) "\">" (:title cat) "</a></li>"))
(defn cat-selected [cat]
(.log js/console (:title cat))
(set-text! (by-id "category-name") (:title cat))
(set-text! (by-id "provider-name") "Провайдер")
(set-options! (by-id "providers-list") (:providers cat) provider-to-li provider-id-attr provider-selected))
; initialize stuff
(defn init []
;; verify that js/document exists and that it has a getElementById
;; property
(if (and js/document
(.-getElementById js/document))
;; populate categories list
(set-options! (by-id "categories-list") categories cat-to-li cat-id-attr cat-selected)))
;; initialize the HTML page in unobtrusive way
(set! (.-onload js/window) init)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment