|  | @@ -38,7 +38,8 @@
 | 
	
		
			
				|  |  |              [frontend.text :as text]
 | 
	
		
			
				|  |  |              [frontend.date :as date]
 | 
	
		
			
				|  |  |              [frontend.handler.repeated :as repeated]
 | 
	
		
			
				|  |  | -            [clojure.core.async :as async]))
 | 
	
		
			
				|  |  | +            [clojure.core.async :as async]
 | 
	
		
			
				|  |  | +            [lambdaisland.glogi :as log]))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ;; FIXME: should support multiple images concurrently uploading
 | 
	
		
			
				|  |  |  (defonce *image-uploading? (atom false))
 | 
	
	
		
			
				|  | @@ -1423,7 +1424,7 @@
 | 
	
		
			
				|  |  |     ;; "_" "_"
 | 
	
		
			
				|  |  |     ;; ":" ":"                              ; TODO: only properties editing and org mode tag
 | 
	
		
			
				|  |  |     ;; "^" "^"
 | 
	
		
			
				|  |  | -   })
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (def reversed-autopair-map
 | 
	
		
			
				|  |  |    (zipmap (vals autopair-map)
 | 
	
	
		
			
				|  | @@ -1597,38 +1598,44 @@
 | 
	
		
			
				|  |  |      (when-let [prev-block (util/get-prev-block input)]
 | 
	
		
			
				|  |  |        (util/parse-int (d/attr prev-block "level")))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +;; If it's an indent/outdent action followed by an "Enter", only adjust after inserting a block was finished. Maybe we should use a channel to serialize all the events.
 | 
	
		
			
				|  |  |  (defn adjust-block-level!
 | 
	
		
			
				|  |  | -  [state direction]
 | 
	
		
			
				|  |  | -  (state/set-editor-op! :indent-outdent)
 | 
	
		
			
				|  |  | -  (let [{:keys [block block-parent-id value config]} (get-state state)
 | 
	
		
			
				|  |  | -        start-level (:start-level config)
 | 
	
		
			
				|  |  | -        format (:block/format block)
 | 
	
		
			
				|  |  | -        block-pattern (config/get-block-pattern format)
 | 
	
		
			
				|  |  | -        level (:block/level block)
 | 
	
		
			
				|  |  | -        previous-level (or (get-previous-block-level block-parent-id) 1)
 | 
	
		
			
				|  |  | -        [add? remove?] (case direction
 | 
	
		
			
				|  |  | -                         :left [false true]
 | 
	
		
			
				|  |  | -                         :right [true false]
 | 
	
		
			
				|  |  | -                         [(<= level previous-level)
 | 
	
		
			
				|  |  | -                          (and (> level previous-level)
 | 
	
		
			
				|  |  | -                               (> level 2))])
 | 
	
		
			
				|  |  | -        final-level (cond
 | 
	
		
			
				|  |  | -                      add? (inc level)
 | 
	
		
			
				|  |  | -                      remove? (if (> level 2)
 | 
	
		
			
				|  |  | -                                (dec level)
 | 
	
		
			
				|  |  | -                                level)
 | 
	
		
			
				|  |  | -                      :else level)
 | 
	
		
			
				|  |  | -        new-value (block/with-levels value format (assoc block :block/level final-level))]
 | 
	
		
			
				|  |  | -    (when (and
 | 
	
		
			
				|  |  | -           (not (and (= direction :left)
 | 
	
		
			
				|  |  | -                     (and
 | 
	
		
			
				|  |  | -                      (get config :id)
 | 
	
		
			
				|  |  | -                      (util/uuid-string? (get config :id)))
 | 
	
		
			
				|  |  | -                     (<= final-level start-level)))
 | 
	
		
			
				|  |  | -           (<= (- final-level previous-level) 1))
 | 
	
		
			
				|  |  | -      (save-block-if-changed! block new-value
 | 
	
		
			
				|  |  | -                              {:indent-left? (= direction :left)})))
 | 
	
		
			
				|  |  | -  (state/set-editor-op! nil))
 | 
	
		
			
				|  |  | +  ([state direction]
 | 
	
		
			
				|  |  | +   (adjust-block-level! state direction 100))
 | 
	
		
			
				|  |  | +  ([state direction retry-limit]
 | 
	
		
			
				|  |  | +   (if (= :insert (state/get-editor-op))
 | 
	
		
			
				|  |  | +     (if (> retry-limit 0)
 | 
	
		
			
				|  |  | +       (js/setTimeout #(adjust-block-level! state direction (dec retry-limit)) 20)
 | 
	
		
			
				|  |  | +       (log/error :editor/indent-outdent-retry-max-limit {:direction direction}))
 | 
	
		
			
				|  |  | +     (do
 | 
	
		
			
				|  |  | +       (state/set-editor-op! :indent-outdent)
 | 
	
		
			
				|  |  | +       (let [{:keys [block block-parent-id value config]} (get-state state)
 | 
	
		
			
				|  |  | +             start-level (:start-level config)
 | 
	
		
			
				|  |  | +             format (:block/format block)
 | 
	
		
			
				|  |  | +             level (:block/level block)
 | 
	
		
			
				|  |  | +             previous-level (or (get-previous-block-level block-parent-id) 1)
 | 
	
		
			
				|  |  | +             [add? remove?] (case direction
 | 
	
		
			
				|  |  | +                              :left [false true]
 | 
	
		
			
				|  |  | +                              :right [true false]
 | 
	
		
			
				|  |  | +                              [(<= level previous-level)
 | 
	
		
			
				|  |  | +                               (and (> level previous-level)
 | 
	
		
			
				|  |  | +                                    (> level 2))])
 | 
	
		
			
				|  |  | +             final-level (cond
 | 
	
		
			
				|  |  | +                           add? (inc level)
 | 
	
		
			
				|  |  | +                           remove? (if (> level 2)
 | 
	
		
			
				|  |  | +                                     (dec level)
 | 
	
		
			
				|  |  | +                                     level)
 | 
	
		
			
				|  |  | +                           :else level)
 | 
	
		
			
				|  |  | +             new-value (block/with-levels value format (assoc block :block/level final-level))]
 | 
	
		
			
				|  |  | +         (when (and
 | 
	
		
			
				|  |  | +                (not (and (= direction :left)
 | 
	
		
			
				|  |  | +                          (get config :id)
 | 
	
		
			
				|  |  | +                          (util/uuid-string? (get config :id))
 | 
	
		
			
				|  |  | +                          (<= final-level start-level)))
 | 
	
		
			
				|  |  | +                (<= (- final-level previous-level) 1))
 | 
	
		
			
				|  |  | +           (save-block-if-changed! block new-value
 | 
	
		
			
				|  |  | +                                   {:indent-left? (= direction :left)})))
 | 
	
		
			
				|  |  | +       (state/set-editor-op! nil)))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defn adjust-blocks-level!
 | 
	
		
			
				|  |  |    [blocks direction])
 |