                                                              #(selection/click % click)))}
                      :fn (partial mark-page-selected (:selected selection))})]]))
 
-(defn make-page-cache [state columns]
+(defn ^:private inbox-handle-drop! [state owner page-cache target source page-ids]
+  (prn target source page-ids)
+  ;; Call `accepts-drop!' in `target'
+  (let [columns (om/get-state owner :columns)
+        target (get columns target)
+        source (get columns source)
+        pages (mapv page-cache page-ids)
+        operation (accept-drop! target state pages)]
+    (go
+      (<! operation)
+      (println "Target saved. Removing from source...")
+      (<! (remove-pages! source state page-ids))
+      (println "Drop saved!"))))
+
+(defn ^:private make-page-cache [state columns]
   (into {}
         ;; Transducerpower
         (comp (mapcat #(column-pages (val %) state))

                  (om/value new-pages))
        (om/set-state! owner :selection
                       (selection/make-selection new-pages)))))
  ;; ;; Rotate all pages randomly
  ;; (will-mount [_]
  ;;   (go-loop []
  ;;     (<! (async/timeout 100))
  ;;     (om/transact! state [:inbox :pages] (fn [pages]
  ;;                                           (update-in pages [(rand-int (count pages)) :rotation]
  ;;                                                      #(mod (+ % 90) 360))))
  ;;     (recur)))
  (render-state [_ {:keys [selection]}]
    ;; NOTE: `column' needs to be a value OR we need to extend cursors
    [:.column {:on-drag-over (when (satisfies? ColumnDropTarget (om/value column))

    "Fake")
  (column-pages [_ state]
    (get-in state [::fake-column-pages]))
  (remove-pages! [_ state page-ids]
    (go
      (js/console.warn "Unimplemented: Removing pages from Fake...")))
  ColumnDropTarget
  (accepts-drop? [_ state]
    true)
  ;; TODO: Make immutable?
  (accept-drop! [_ state new-pages]
    (go
      (println "dropping" (pr-str new-pages))
      (om/transact! state ::fake-column-pages
                    (fn [pages]
                      (into pages
                            (remove #(contains? (set (map :id pages)) (:id %)))
                            new-pages)))
      (println "Fake-saving...")
      (<! (async/timeout 2000))
      (println "Saved!"))))

;;; NOTE: We need on-drag-start in `inbox-column' and in
;;; `inbox-column-page' (the latter to handle selection-updates when
