diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/DataField.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/DataField.kt index f49936eb..28d6b6f7 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/DataField.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/DataField.kt @@ -1,3 +1,10 @@ package com.bartlomiejpluta.base.editor.database.model.data -class DataField(val value: String) \ No newline at end of file +import javafx.beans.property.SimpleStringProperty +import tornadofx.getValue +import tornadofx.setValue + +class DataField(value: String?) { + val valueProperty = SimpleStringProperty(value) + var value by valueProperty +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/DataRecord.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/DataRecord.kt index d1e975be..f2dc767e 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/DataRecord.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/DataRecord.kt @@ -1,3 +1,3 @@ package com.bartlomiejpluta.base.editor.database.model.data -class DataRecord(val fields: Map) \ No newline at end of file +class DataRecord(val fields: Map, val operation: Operation = Operation.DO_NOTHING) \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/Operation.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/Operation.kt new file mode 100644 index 00000000..62ce1be4 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/Operation.kt @@ -0,0 +1,8 @@ +package com.bartlomiejpluta.base.editor.database.model.data + +enum class Operation { + DO_NOTHING, + INSERT, + UPDATE, + DELETE +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/Query.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/Query.kt index e562ed24..6a8140be 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/Query.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/model/data/Query.kt @@ -1,12 +1,25 @@ package com.bartlomiejpluta.base.editor.database.model.data +import javafx.beans.property.SimpleListProperty +import javafx.collections.ObservableList import tornadofx.getValue import tornadofx.toProperty -class Query(name: String, query: String, val columns: List, val data: List) { +class Query(name: String, query: String, columns: ObservableList, data: ObservableList) { val nameProperty = name.toProperty() val name by nameProperty val queryProperty = query.toProperty() val query by queryProperty + + val columnsProperty = SimpleListProperty(columns) + val columns by columnsProperty + + val dataProperty = SimpleListProperty(data) + val data by dataProperty + + fun addEmptyRecord() { + val fields = columns.map { it to DataField(null) }.toMap() + data += DataRecord(fields, Operation.INSERT) + } } \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/H2DatabaseService.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/H2DatabaseService.kt index 276591a6..0970ece7 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/H2DatabaseService.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/service/H2DatabaseService.kt @@ -7,6 +7,7 @@ import com.bartlomiejpluta.base.editor.database.model.schema.SchemaDatabase import com.bartlomiejpluta.base.editor.project.context.ProjectContext import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service +import tornadofx.observableListOf import java.sql.Connection @Service @@ -54,18 +55,18 @@ class H2DatabaseService : DatabaseService { val metadata = stmt.metaData if (results != null && metadata != null) { - val columns = mutableListOf() + val columns = observableListOf() for (i in 1..metadata.columnCount) { columns += metadata.getColumnLabel(i) } - val data = mutableListOf() + val data = observableListOf() while (results.next()) { val record = mutableMapOf() for (i in 1..metadata.columnCount) { - record[metadata.getColumnLabel(i)] = DataField(results.getObject(i).toString()) + record[metadata.getColumnLabel(i)] = DataField(results.getObject(i)?.toString()) } data += DataRecord(record) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/view/query/QueryResultView.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/view/query/QueryResultView.kt index a9c8fd82..dbb0d861 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/view/query/QueryResultView.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/view/query/QueryResultView.kt @@ -1,8 +1,6 @@ package com.bartlomiejpluta.base.editor.database.view.query -import com.bartlomiejpluta.base.editor.database.component.QueryFieldCell import com.bartlomiejpluta.base.editor.database.controller.DatabaseController -import com.bartlomiejpluta.base.editor.database.model.data.DataField import com.bartlomiejpluta.base.editor.database.model.data.DataRecord import com.bartlomiejpluta.base.editor.database.viewmodel.QueryVM import javafx.scene.control.TableColumn @@ -13,36 +11,40 @@ class QueryResultView : View() { private val databaseController: DatabaseController by di() private val queryVM = find() - private val table = tableview() + private val table = tableview(queryVM.dataProperty) init { - queryVM.itemProperty.addListener { _, _, _ -> refreshData() } + updateColumns() - refreshData() + queryVM.itemProperty.addListener { _, _, query -> + updateColumns() + } } - private fun refreshData() { + private fun updateColumns() { table.columns.clear() - table.items.clear() - queryVM.item?.let { query -> - table.items.addAll(query.data) - query.columns.map { column -> - TableColumn(column).apply { - setCellValueFactory { - it.value.fields[column].toProperty() - } - - setCellFactory { QueryFieldCell() } + queryVM.columns.map { column -> + TableColumn(column).apply { + setCellValueFactory { + it.value.fields[column]!!.valueProperty } - }.forEach { table.addColumnInternal(it) } - } + } + }.let(table.columns::addAll) } override val root = borderpane { top = toolbar { button(graphic = FontIcon("fa-refresh")) { action { - databaseController.execute(queryVM.query, queryVM.name)?.let { queryVM.item = it } + databaseController.execute(queryVM.query, queryVM.name)?.let { + queryVM.item = it + } + } + } + + button(graphic = FontIcon("fa-plus")) { + action { + queryVM.item?.addEmptyRecord() } } } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/viewmodel/QueryVM.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/viewmodel/QueryVM.kt index 41d0a10a..69aab157 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/viewmodel/QueryVM.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/database/viewmodel/QueryVM.kt @@ -10,4 +10,10 @@ class QueryVM(query: Query) : ItemViewModel(query) { val queryProperty = bind(Query::queryProperty) val query by queryProperty + + val columnsProperty = bind(Query::columnsProperty) + val columns by columnsProperty + + val dataProperty = bind(Query::dataProperty) + val data by dataProperty } \ No newline at end of file