mirror of
https://github.com/penpot/penpot.git
synced 2025-02-25 08:16:49 -05:00
159 lines
3 KiB
Clojure
159 lines
3 KiB
Clojure
;; This Source Code Form is subject to the terms of the Mozilla Public
|
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
;;
|
|
;; This Source Code Form is "Incompatible With Secondary Licenses", as
|
|
;; defined by the Mozilla Public License, v. 2.0.
|
|
;;
|
|
;; Copyright (c) 2015-2016 Juan de la Cruz <delacruzgarciajuan@gmail.com>
|
|
;; Copyright (c) 2015-2020 Andrey Antukh <niwi@niwi.nz>
|
|
|
|
(ns uxbox.util.dom
|
|
(:require
|
|
[goog.dom :as dom]
|
|
[cuerdas.core :as str]
|
|
[beicon.core :as rx]
|
|
[cuerdas.core :as str]
|
|
[uxbox.util.geom.point :as gpt]
|
|
[uxbox.util.blob :as blob]
|
|
[uxbox.util.transit :as ts]))
|
|
|
|
;; --- Deprecated methods
|
|
|
|
(defn event->inner-text
|
|
[e]
|
|
(.-innerText (.-target e)))
|
|
|
|
(defn event->value
|
|
[e]
|
|
(.-value (.-target e)))
|
|
|
|
(defn event->target
|
|
[e]
|
|
(.-target e))
|
|
|
|
(defn classnames
|
|
[& params]
|
|
(assert (even? (count params)))
|
|
(str/join " " (reduce (fn [acc [k v]]
|
|
(if (true? v)
|
|
(conj acc (name k))
|
|
acc))
|
|
[]
|
|
(partition 2 params))))
|
|
|
|
;; --- New methods
|
|
|
|
(defn get-element-by-class
|
|
([classname]
|
|
(dom/getElementByClass classname))
|
|
([classname node]
|
|
(dom/getElementByClass classname node)))
|
|
|
|
(defn get-element
|
|
[id]
|
|
(dom/getElement id))
|
|
|
|
(defn stop-propagation
|
|
[e]
|
|
(when e
|
|
(.stopPropagation e)))
|
|
|
|
(defn prevent-default
|
|
[e]
|
|
(when e
|
|
(.preventDefault e)))
|
|
|
|
(defn get-target
|
|
"Extract the target from event instance."
|
|
[event]
|
|
(.-target event))
|
|
|
|
(defn get-value
|
|
"Extract the value from dom node."
|
|
[node]
|
|
(.-value node))
|
|
|
|
(defn click
|
|
"Click a node"
|
|
[node]
|
|
(.click node))
|
|
|
|
(defn get-files
|
|
"Extract the files from dom node."
|
|
[node]
|
|
(.-files node))
|
|
|
|
(defn checked?
|
|
"Check if the node that reprsents a radio
|
|
or checkbox is checked or not."
|
|
[node]
|
|
(.-checked node))
|
|
|
|
(defn clean-value!
|
|
[node]
|
|
(set! (.-value node) ""))
|
|
|
|
(defn ^boolean equals?
|
|
[node-a node-b]
|
|
(.isEqualNode node-a node-b))
|
|
|
|
(defn get-event-files
|
|
"Extract the files from event instance."
|
|
[event]
|
|
(get-files (get-target event)))
|
|
|
|
(defn create-element
|
|
([tag]
|
|
(.createElement js/document tag))
|
|
([ns tag]
|
|
(.createElementNS js/document ns tag)))
|
|
|
|
(defn set-html!
|
|
[el html]
|
|
(set! (.-innerHTML el) html))
|
|
|
|
(defn append-child!
|
|
[el child]
|
|
(.appendChild el child))
|
|
|
|
(defn get-first-child
|
|
[el]
|
|
(.-firstChild el))
|
|
|
|
(defn get-tag-name
|
|
[el]
|
|
(.-tagName el))
|
|
|
|
(defn get-outer-html
|
|
[el]
|
|
(.-outerHTML el))
|
|
|
|
(defn get-inner-text
|
|
[el]
|
|
(.-innerText el))
|
|
|
|
(defn query
|
|
[el query]
|
|
(.querySelector el query))
|
|
|
|
(defn get-client-position
|
|
[event]
|
|
(let [x (.-clientX event)
|
|
y (.-clientY event)]
|
|
(gpt/point x y)))
|
|
|
|
(defn focus!
|
|
[node]
|
|
(.focus node))
|
|
|
|
(defn set-data-transfer
|
|
[event data]
|
|
(let [data-string (ts/encode data)]
|
|
(-> event .-dataTransfer (.setData "text" data-string))))
|
|
|
|
(defn get-data-transfer
|
|
[event]
|
|
(let [data-string (-> event .-dataTransfer (.getData "text"))]
|
|
(ts/decode data-string)))
|
|
|