69 lines
2.8 KiB
Clojure
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)}))
|