pgwiz/src/ch/lyrion/pgwiz/db_table_editor.clj

69 lines
2.8 KiB
Clojure

(ns ch.lyrion.pgwiz.db-table-editor
(:require [ch.lyrion.pgwiz.gui :as gui]
[ch.lyrion.pgwiz.inspect :as inspect]
[next.jdbc :as jdbc]
[cljfx.api :as fx]))
(defmethod gui/event-handler ::on-edit-start [{:keys [fx/context fx/event attr]}]
(when (instance? javafx.scene.control.TableColumn$CellEditEvent event)
{:context (fx/swap-context context assoc :edit [attr (:lyrion/index (.getRowValue event))])}))
(defn editable-cell [{:keys [fx/context data attr id value-converter]}]
(let [value (:values data)
value (nth value id)
value (get value attr)
value (str value)]
(if (= (fx/sub context :edit) [attr id])
{:fx/type :text-field
:text-formatter {:fx/type :text-formatter
:value-converter value-converter
:value value}}
{:fx/type :label
:text (str value)})))
(defn editable-cell-factory [view data attr value-converter]
(fn [id]
{:text ""
:graphic {:fx/type view
:data data
:attr attr
:id id
:value-converter value-converter}}))
(defn generate-columns [data]
(reduce #(let [attr (keyword (:TABLE_NAME %2) (:COLUMN_NAME %2))]
(cons {:fx/type :table-column
:cell-value-factory (fn [x] (get x :lyrion/index))
:cell-factory (editable-cell-factory editable-cell
data
attr
:default)
:on-edit-start {:event/type ::on-edit-start :attr attr}
:on-edit-cancel {:event/type ::on-edit-cancel :attr attr}
:on-edit-commit {:event/type ::on-edit-commit :attr attr}
:text (:COLUMN_NAME %2)}
%1))
(list)
(:columns data)))
(defn generate-table-data [schema table offset limit]
(let [table-meta (inspect/get-columns schema table)]
{:schema schema
:table table
:columns table-meta
:values (map #(-> %1
(assoc :lyrion/meta table-meta)
(assoc :lyrion/index %2))
(jdbc/execute!
(jdbc/prepare @inspect/conn
[(str "select * from " schema "." table " limit ? offset ?") limit offset]))
(range))}))
(defn db-table-editor [{:keys [fx/context schema table offset limit]}]
(let [data (generate-table-data schema table offset limit)]
; (let [context (fx/swap-context context assoc :table (generate-table-data schema table offset limit))])
{:fx/type :table-view
:editable true
:items (:values data)
:columns (generate-columns data)}))