Make email optional

pull/645/head
Tienson Qin 2020-04-20 13:31:33 +08:00
parent 7e3b268d7c
commit cb48f59cc7
8 changed files with 125 additions and 123 deletions

View File

@ -49,7 +49,7 @@
(ui/textarea
{:id "edit-box"
:on-change (fn [e]
(reset! state/edit-content (util/evalue e)))
(handler/set-edit-content! (util/evalue e)))
:initial-value content
:value-atom state/edit-content
:auto-focus true
@ -110,25 +110,27 @@
content
on-click
on-hide]}]
(let [{:keys [edit? format/loading]} (rum/react state/state)]
(if edit?
(let [{:keys [edit? edit-id format/loading edit-journal edit-file]} (rum/react state/state)
edit-id (rum/react state/edit-id)]
(if (and edit? (= id edit-id))
(editor-box content {:on-hide on-hide})
(let [format (format/normalize format)
loading? (get loading format)
html (if-not (string/blank? html) html (format/to-html content format config))
markup? (contains? handler/html-render-formats format)
on-click (fn [e]
(when-not (node-link? (gobj/get e "target"))
(handler/reset-cursor-range! (gdom/getElement id))
(if on-click
(reset! state/edit-id id)
(handler/reset-cursor-range! (gdom/getElement (str id)))
(when on-click
(on-click))
(reset! state/edit-content content)))]
(handler/set-edit-content! content)))]
(cond
(and markup? loading?)
[:div "loading ..."]
markup?
(let [html (if html html "<span></span>")]
(let [html (if-not (string/blank? html) html (format/to-html content format config))
html (if html html "<span></span>")]
[:div
{:id id
:on-click on-click
@ -137,6 +139,5 @@
:else ; other text formats
[:div.pre-white-space
{:id id
:content-editable true
:on-click on-click}
content])))))

View File

@ -4,61 +4,9 @@
[frontend.handler :as handler]
[clojure.string :as string]
[frontend.ui :as ui]
[frontend.mixins :as mixins]
[frontend.db :as db]
[frontend.state :as state :refer [edit-content]]
[frontend.format.org-mode :as org]
[frontend.format :as format]
[goog.object :as gobj]
[goog.dom :as gdom]
[frontend.image :as image]
[frontend.components.content :as content]))
(rum/defc editor-box <
(mixins/event-mixin
(fn [state]
(let [heading (first (:rum/args state))]
(mixins/hide-when-esc-or-outside
state
nil
:show-fn (fn []
(:edit? @state/state))
:on-hide (fn []
(handler/save-current-edit-journal! (str heading "\n" (string/trimr @edit-content) "\n\n")))))))
{:did-mount (fn [state]
(when-let [content (second (:rum/args state))]
(handler/restore-cursor-pos! content))
state)}
[heading content]
[:div.flex-1
(ui/textarea
{:id "edit-box"
:on-change (fn [e]
(reset! edit-content (util/evalue e)))
:initial-value content
:value-atom edit-content
:auto-focus true
:style {:border "none"
:border-radius 0
:background "transparent"
:margin-top 12.5}
:on-key-down handler/reset-cursor-pos!
:on-click handler/reset-cursor-pos!})
[:input
{:id "files"
:type "file"
:on-change (fn [e]
(let [files (.-files (.-target e))]
(image/upload
files
(fn [file file-name file-type]
(handler/request-presigned-url
file file-name file-type
(fn [signed-url]
;; insert into the text
(handler/insert-image! signed-url)))))))
:hidden true}]])
(defn split-first [re s]
(clojure.string/split s re 2))
@ -73,23 +21,20 @@
(rum/defc journal-cp < rum/reactive
[{:keys [uuid title content] :as journal}]
(let [{:keys [edit? edit-journal]} (rum/react state/state)
[heading content] (split-heading-body content)]
[heading content] (split-heading-body content)
id uuid]
[:div.flex-1
[:h1.text-gray-600 {:style {:font-weight "450"}}
title]
(if (and edit? (= uuid (:uuid edit-journal)))
(editor-box heading content)
(let [id (str "journal-" uuid)
html (-> (format/to-html content "org" org/config-with-line-break)
(util/minimize-html))]
[:div
{:id id
:content-editable true
:on-click (fn [_e]
(handler/reset-cursor-range! (gdom/getElement id))
(handler/edit-journal! journal)
(reset! edit-content content))
:dangerouslySetInnerHTML {:__html html}}]))]))
(content/content id
nil
:org
{:content content
:on-click (fn []
(handler/edit-journal! journal))
:on-hide (fn []
(prn content (str heading "\n" (string/trimr @edit-content) "\n\n"))
(handler/save-current-edit-journal! (str heading "\n" (string/trimr @edit-content) "\n\n")))})]))
(rum/defc journals < rum/reactive
[latest-journals]

View File

@ -3,11 +3,15 @@
[frontend.handler :as handler]
[frontend.page :as page]
[frontend.routes :as routes]
[frontend.util :as util]
[reitit.frontend :as rf]
[reitit.frontend.easy :as rfe]))
(defn set-router!
[]
(when-let [fragment (util/get-fragment)]
(util/scroll-to-element fragment))
(rfe/start!
(rf/router routes/routes {})
handler/set-route-match!

View File

@ -531,9 +531,10 @@
(defn me-tx
[db {:keys [name email avatar repos]}]
(let [me-tx [{:me/name name
:me/email email
:me/avatar avatar}]
(let [me (util/remove-nils {:me/name name
:me/email email
:me/avatar avatar})
me-tx [me]
repos-tx (mapv (fn [repo]
{:repo/url (:url repo)})
repos)

View File

@ -61,6 +61,28 @@
(drop-last nodes)
nodes)))
(defn get-heading-non-heading-children
[all-nodes heading]
(let [heading-id (gobj/get heading "id")
heading-tag-name (gobj/get heading "tagName")
control? (fn [node]
(d/has-class? node "control"))
level (get-level heading-tag-name)
nodes (->> all-nodes
;; drop preceding nodes
(drop-while (fn [node]
(not= heading-id (gobj/get node "id"))))
;; drop self
(next)
;; take the children
(take-while (fn [node]
(let [tag-name (gobj/get node "tagName")]
(not (heading? node))))))]
(if (and (last nodes)
(control? (last nodes)))
(drop-last nodes)
nodes)))
(defn collapse!
[all-nodes id]
(when-let [node (gdom/getElement id)]
@ -131,45 +153,64 @@
(let [all-nodes (get-content-children)
headings (get-all-headings)]
(doseq [heading headings]
(when-let [heading-children (seq (get-heading-children all-nodes heading))]
(indent-non-headings! heading heading-children)
(let [id (gobj/get heading "id")
control-id (str "control-" id)
element (d/create-element "a")
mouseover (fn [e]
(when (and
(not (d/has-class? element "caret-down"))
(not (d/has-class? element "caret-right")))
(d/add-class! element "caret-down")))
mouseout (fn [e]
(d/remove-class! element "caret-down"))]
(when-let [old-node (gdom/getElement control-id)]
(d/remove! old-node))
(d/set-style! heading
:position "relative")
(d/set-attr! element
:id control-id
:class "control block no-underline text-gray-700 hover:bg-gray-100 transition ease-in-out duration-150")
(d/set-style! element
:position "absolute"
:top 0
:left "-20px")
(d/listen! heading :mouseover mouseover)
(d/listen! heading :mouseout mouseout)
(d/listen! element :mouseover mouseover)
(d/listen! element :mouseout mouseout)
(d/listen! element
:click (fn [e]
(if (d/has-class? element "caret-down")
(do
(d/remove-class! element "caret-down")
(d/add-class! element "caret-right")
(collapse! all-nodes id))
(do
(d/remove-class! element "caret-right")
(d/add-class! element "caret-down")
(expand! all-nodes id)))))
(d/prepend! heading element))))))
(let [heading-parent (d/parent heading)]
(when-let [heading-children (seq (get-heading-children all-nodes heading))]
(indent-non-headings! heading heading-children)
(let [id (gobj/get heading "id")
control-id (str "control-" id)
element (d/create-element "a")
mouseover (fn [e]
(when (and
(not (d/has-class? element "caret-down"))
(not (d/has-class? element "caret-right")))
(d/add-class! element "caret-down")))
mouseout (fn [e]
(d/remove-class! element "caret-down"))]
(when-let [old-node (gdom/getElement control-id)]
(d/remove! old-node))
(d/set-style! heading
:position "relative")
(d/set-attr! element
:id control-id
:class "control block no-underline text-gray-700 hover:bg-gray-100 transition ease-in-out duration-150")
(d/set-style! element
:position "absolute"
:top 0
:left "-20px")
(d/listen! heading :mouseover mouseover)
(d/listen! heading :mouseout mouseout)
(d/listen! element :mouseover mouseover)
(d/listen! element :mouseout mouseout)
(d/listen! element
:click (fn [e]
(if (d/has-class? element "caret-down")
(do
(d/remove-class! element "caret-down")
(d/add-class! element "caret-right")
(collapse! all-nodes id))
(do
(d/remove-class! element "caret-right")
(d/add-class! element "caret-down")
(expand! all-nodes id)))))
;; create a div wrapper
;; (let [wrapper (d/create-element "div")
;; non-heading-children (get-heading-non-heading-children all-nodes heading)]
;; ;; (d/replace! heading wrapper)
;; ;; (prn "remove " )
;; ;; (js/console.dir heading)
;; (d/set-class! wrapper "heading-group")
;; (d/remove! heading)
;; (doseq [child non-heading-children]
;; (d/remove! child))
;; (apply d/append! wrapper
;; element
;; heading
;; non-heading-children)
;; (d/append! heading-parent wrapper)
;; )
(d/prepend! heading element)
))))))
(comment
(def all-nodes (get-content-children))

View File

@ -236,7 +236,6 @@
(when (and
(not (:edit? @state/state))
(nil? (:git/error @state/state))
(not= status )
(or (nil? status)
(= status :pulling)))
(set-git-status! :pulling)
@ -695,13 +694,18 @@
(when-let [node (gdom/getElement "edit-box")]
(when-let [range (string/trim @state/cursor-range)]
(let [pos (inc (diff/find-position markup range))]
(println "Edit position: " pos)
(util/set-caret-pos! node pos)))))
(defn set-edit-node!
[ref]
(reset! state/edit-node ref))
(defn set-edit-content!
[content]
(prn "set edit content: "
content)
(reset! state/edit-content content))
(defn move-cursor-to-end [input]
(let [n (count (.-value input))]
(set! (.-selectionStart input) n)

View File

@ -19,11 +19,12 @@
;; format => boolean
:format/loading {}
:search/result nil
:edit/journal nil
:edit/file nil}))
:edit-journal nil
:edit-file nil}))
;; TODO: add to global state
(def edit-node (atom nil))
(def edit-id (atom nil))
(def edit-content (atom ""))
(def cursor-range (atom nil))
(def cursor-pos (atom nil))

View File

@ -231,10 +231,15 @@
(defn scroll-into-view
[element]
(let [scroll-top (gobj/get element "offsetTop")
scroll-top (- scroll-top 80)]
scroll-top (if (zero? scroll-top)
(-> (gobj/get element "parentElement")
(gobj/get "offsetTop"))
scroll-top)]
(when-let [main (first (array-seq (gdom/getElementsByTagName "main")))]
(.scroll main #js {:top scroll-top
:behavior "smooth"}))))
;; :behavior "smooth"
}))))
(defn scroll-to-element
[fragment]