Skip to content

Commit

Permalink
Paste tables and plaintext from other apps to bean
Browse files Browse the repository at this point in the history
  • Loading branch information
prabhanshuguptagit committed Jun 16, 2024
1 parent a4bf9e0 commit dcf170b
Show file tree
Hide file tree
Showing 7 changed files with 141 additions and 5 deletions.
1 change: 1 addition & 0 deletions shadow-cljs.edn
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
[re-frame "1.4.2"]
[re-pressed "0.3.2"]
[metosin/malli "0.13.0"]
[org.clj-commons/hickory "0.7.4"]
[com.github.pkpkpk/cljs-node-io "2.0.332"]
^:dev [day8.re-frame/re-frame-10x "1.9.3"]]

Expand Down
27 changes: 24 additions & 3 deletions src/bean/grid.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,8 @@
depgraph* (cond-> depgraph content-changed?
(deps/update-depgraph
[:cell address] cell cell*))
sheet* (merge sheet {:grid grid* :depgraph depgraph*})
sheet* (merge (frames/expand-frames sheet address)
{:grid grid* :depgraph depgraph*})
other-spillers (-> (interested-spillers updated-addrs grid)
(disj address))
deps-to-reval (concat
Expand All @@ -246,10 +247,10 @@
(reduce
(fn [sheet* _] (reduce #(eval-cell %2 %1) sheet* addresses)) sheet (range 3))))

(defn update-cell [address sheet content]
(defn update-cell-content [address sheet content]
(if (= (:content (util/get-cell (:grid sheet) address)) content "")
sheet
(eval-sheet-a-few-times (eval-cell address (frames/expand-frames sheet address) content))))
(eval-sheet-a-few-times (eval-cell address sheet content))))

(defn- merge-cell [sheet address merge-with]
(let [sheet* (if (not= merge-with address)
Expand Down Expand Up @@ -292,6 +293,26 @@
(reduce #(unset-cell-style %1 %2 :merged-until) sheet* merged-addresses))))
sheet)))

;; untested and slightly weird interface, exists for pasting
;; many cells and handling merged cells etc.
(defn update-cells-bulk [sheet start addressed-attrs]
(->> addressed-attrs
(map #(do [(offset (first %) start) (second %)]))
(reduce
(fn [sheet* [address attrs]]
(let [existing-cell (util/get-cell (:grid sheet*) address)
new-cell (-> existing-cell
(assoc :content (:content attrs))
(assoc :style (merge (:style existing-cell) (:style attrs))))
new-sheet (eval-cell address sheet* new-cell true)]
(if (:merge-until attrs)
(merge-cells new-sheet
{:start address
:end (offset (:merge-until attrs) start)})
new-sheet)))
(unmerge-cells sheet (map #(offset % start) (keys addressed-attrs))))
eval-sheet-a-few-times))

(defn eval-named
([name {:keys [bindings] :as sheet}]
(if-let [value (bindings name)]
Expand Down
9 changes: 8 additions & 1 deletion src/bean/ui/events.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,14 @@
(rf/reg-event-db
::update-cell
(fn update-cell [db [_ address content]]
(update-in db [:sheet] #(grid/update-cell address % content))))
(update-in db [:sheet] #(grid/update-cell-content address % content))))

(rf/reg-event-db
::paste-addressed-cells
(fn paste-addressed-cells [db [_ addressed-cells]]
(update-in db [:sheet] #(grid/update-cells-bulk %
(:start (get-in db [:ui :grid :selection]))
addressed-cells))))

(rf/reg-event-fx
::merge-cells
Expand Down
95 changes: 95 additions & 0 deletions src/bean/ui/paste.cljs

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions src/bean/ui/util.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
(map name)
(str/join " ")))

(def map-on-matrix util/map-on-matrix)
(def addresses-matrix util/addresses-matrix)
(def map-on-matrix-addressed util/map-on-matrix-addressed)

(defn color-int->hex [color]
Expand Down
10 changes: 10 additions & 0 deletions src/bean/ui/views/sheet.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
(:require [bean.area :as area]
[bean.grid :as grid]
[bean.frames :as frames]
[bean.ui.paste :as paste]
[bean.ui.events :as events]
[bean.ui.styles :as styles]
[bean.ui.subs :as subs]
Expand Down Expand Up @@ -833,3 +834,12 @@
[:div {:id :grid-container}
[canvas pixi-app*]
[cell-input pixi-app*]]])

(defn handle-paste [e]
(.preventDefault e)
(if-let [pasted-table (paste/parse-table e)]
(rf/dispatch [::events/paste-addressed-cells pasted-table])
(rf/dispatch [::events/paste-addressed-cells (paste/parse-plaintext e)])))

(.addEventListener js/window "paste" handle-paste)
;; (.removeEventListener js/window "paste" handle-paste)
2 changes: 1 addition & 1 deletion test/bean/frames_test.cljs
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@
sheet (as-> (new-sheet) sheet
(frames/make-frame sheet frame-name {:start [0 0] :end [2 2]})
(frames/add-label sheet frame-name [0 0] :top)
(grid/update-cell [0 0] sheet "A label")
(grid/update-cell-content [0 0] sheet "A label")
(frames/mark-skipped sheet frame-name [[2 0]]))]
(is (= (frames/label-name->cells sheet frame-name "A label") #{[1 0]})))))

Expand Down

0 comments on commit dcf170b

Please sign in to comment.