From 59f85150068a73376527ca74c1b0aa37f5cf84ea Mon Sep 17 00:00:00 2001 From: sebai-dhia Date: Tue, 29 Oct 2024 17:23:03 +0100 Subject: [PATCH 1/2] Fix image display behavior during information listing [APPS-02GR] --- build.gradle.kts | 2 +- .../lib/ui/swing/visual/JImageHandler.java | 4 +- .../org/kopi/galite/visual/base/Image.kt | 4 +- .../kopi/galite/visual/list/VColorColumn.kt | 2 +- .../galite/visual/ui/vaadin/base/Image.kt | 7 ++- .../galite/visual/ui/vaadin/common/VImage.kt | 13 +++- .../visual/ui/vaadin/list/ListFilter.kt | 22 ++++--- .../galite/visual/ui/vaadin/list/ListTable.kt | 62 +++++++++++++++---- .../visual/ui/vaadin/visual/VImageHandler.kt | 4 +- gradle.properties | 2 +- 10 files changed, 88 insertions(+), 34 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 69b7fe6176..8538aaa1b0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -82,7 +82,7 @@ allprojects { pom { configureMavenCentralPom(project) } - signPublication(project) +// signPublication(project) } } } diff --git a/galite-core/src/main/java/org/kopi/vkopi/lib/ui/swing/visual/JImageHandler.java b/galite-core/src/main/java/org/kopi/vkopi/lib/ui/swing/visual/JImageHandler.java index ff34162fbe..da33d21080 100644 --- a/galite-core/src/main/java/org/kopi/vkopi/lib/ui/swing/visual/JImageHandler.java +++ b/galite-core/src/main/java/org/kopi/vkopi/lib/ui/swing/visual/JImageHandler.java @@ -102,14 +102,14 @@ public JImage(URL location) { /** * */ - public int getWidth() { + public int getImageWidth() { return getIconWidth(); } /** * */ - public int getHeight() { + public int getImageHeight() { return getIconHeight(); } diff --git a/galite-core/src/main/kotlin/org/kopi/galite/visual/base/Image.kt b/galite-core/src/main/kotlin/org/kopi/galite/visual/base/Image.kt index 51002c8853..99d4a73d0d 100644 --- a/galite-core/src/main/kotlin/org/kopi/galite/visual/base/Image.kt +++ b/galite-core/src/main/kotlin/org/kopi/galite/visual/base/Image.kt @@ -30,13 +30,13 @@ interface Image : Serializable { * Returns the `Image` width * @return The image width */ - fun getWidth(): Int + fun getImageWidth(): Int /** * Returns the `Image` height * @return The image height */ - fun getHeight(): Int + fun getImageHeight(): Int /** * Returns the `Image` description diff --git a/galite-core/src/main/kotlin/org/kopi/galite/visual/list/VColorColumn.kt b/galite-core/src/main/kotlin/org/kopi/galite/visual/list/VColorColumn.kt index 46cde34bb0..03b4105b58 100644 --- a/galite-core/src/main/kotlin/org/kopi/galite/visual/list/VColorColumn.kt +++ b/galite-core/src/main/kotlin/org/kopi/galite/visual/list/VColorColumn.kt @@ -37,7 +37,7 @@ class VColorColumn(title: String, column, table, VConstants.ALG_LEFT, - 7, + 12, sortAscending) { // -------------------------------------------------------------------- diff --git a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/base/Image.kt b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/base/Image.kt index a4016c0ead..c8d1f0822e 100644 --- a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/base/Image.kt +++ b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/base/Image.kt @@ -18,22 +18,23 @@ package org.kopi.galite.visual.ui.vaadin.base import org.kopi.galite.visual.base.Image +import org.kopi.galite.visual.ui.vaadin.common.VImage /** * The vaadin implementation of an image model. * * @param resource The resource file attached to this image. */ -class Image(val resource: String) : Image { +class Image(val resource: String = "image", val source: ByteArray? = null) : VImage(), Image { //--------------------------------------------------- // IMAGE IMPLEMENTATION //--------------------------------------------------- - override fun getWidth(): Int { + override fun getImageWidth(): Int { return -1 } - override fun getHeight(): Int { + override fun getImageHeight(): Int { return -1 } diff --git a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/common/VImage.kt b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/common/VImage.kt index d2b74315cc..cd14875dc4 100644 --- a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/common/VImage.kt +++ b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/common/VImage.kt @@ -19,11 +19,13 @@ package org.kopi.galite.visual.ui.vaadin.common import com.vaadin.flow.component.Focusable import com.vaadin.flow.component.html.Image +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter /** * A widget that wraps image element. */ -class VImage : Image(), Focusable { +open class VImage : Image(), Focusable { //--------------------------------------------------- // IMPLEMENTATIONS //--------------------------------------------------- @@ -41,4 +43,13 @@ class VImage : Image(), Focusable { */ val isEmpty: Boolean get() = src == null || "" == src + + /** + * Creates the dynamic image name. + * @param baseName The base name. + * @return The dynamic image name. + */ + fun createFileName(baseName: String): String = + baseName + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")) + ".png" } + diff --git a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListFilter.kt b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListFilter.kt index f66c980934..7f6859c273 100644 --- a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListFilter.kt +++ b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListFilter.kt @@ -31,16 +31,20 @@ class ListFilter(private val filterFields: List, override fun test(t: ListTable.ListDialogItem): Boolean { for (i in model.columns.indices) { - val filterString = if(ignoreCase) filterFields[i].value.lowercase(Locale.getDefault()) else filterFields[i].value - val value = if (ignoreCase) t.getValueAt(i).lowercase(Locale.getDefault()) else t.getValueAt(i) + val item = t.getValueAt(i) - if (onlyMatchPrefix) { - if (!value.startsWith(filterString)) { - return false - } - } else { - if (!value.contains(filterString)) { - return false + if (item is String) { + val filterString = if(ignoreCase) filterFields[i].value.lowercase(Locale.getDefault()) else filterFields[i].value + val value = if (ignoreCase) item.lowercase(Locale.getDefault()) else item + + if (onlyMatchPrefix) { + if (!value.startsWith(filterString)) { + return false + } + } else { + if (!value.contains(filterString)) { + return false + } } } } diff --git a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListTable.kt b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListTable.kt index 5184d0e4a6..ea270b83e7 100644 --- a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListTable.kt +++ b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListTable.kt @@ -30,7 +30,12 @@ import com.vaadin.flow.component.icon.Icon import com.vaadin.flow.component.icon.VaadinIcon import com.vaadin.flow.component.textfield.TextField import com.vaadin.flow.data.provider.ListDataProvider +import com.vaadin.flow.data.renderer.ComponentRenderer import com.vaadin.flow.data.value.ValueChangeMode +import org.kopi.galite.visual.list.VImageColumn +import org.kopi.galite.visual.ui.vaadin.base.Image +import org.kopi.galite.visual.ui.vaadin.form.DImageField +import java.io.ByteArrayInputStream @CssImport("./styles/galite/list.css") class ListTable(val model: VListDialog) : Grid() { @@ -52,10 +57,31 @@ class ListTable(val model: VListDialog) : Grid() { private fun buildColumns() { for(col in 0 until model.getColumnCount()) { - addColumn { - it.getValueAt(col) - }.setHeader(Span(model.getColumnName(col))) - .setKey(col.toString()) + if (model.columns[col] is VImageColumn) { + addColumn( + ComponentRenderer { item: ListDialogItem -> + val image = (item.getValueAt(col) as? Image) + + if (image != null) { + image.apply { + element.style["outline"] = "1px solid lightgreen" + width = "100px" + height = "100px" + setBorder(0) + element.setProperty("borderStyle", "none") + setSrc(DImageField.DynamicImageResource(createFileName("image")) { ByteArrayInputStream(image.source) }) + } + image + } else { + Image() + } + } + ).setHeader(Span(model.getColumnName(col))).setKey(col.toString()) + } else { + addColumn { + it.getValueAt(col) + }.setHeader(Span(model.getColumnName(col))).setKey(col.toString()) + } } } @@ -66,7 +92,7 @@ class ListTable(val model: VListDialog) : Grid() { val filterRow = appendHeaderRow() filterRow.also { element.classList.add("list-filter") } - val filterFields = this.columns.mapIndexed { _, column -> + val filterFields = this.columns.mapIndexed { i, column -> val cell = filterRow.getCell(column) val filterField = TextField() val search = Icon(VaadinIcon.SEARCH) @@ -74,11 +100,15 @@ class ListTable(val model: VListDialog) : Grid() { filterField.setWidthFull() filterField.suffixComponent = search filterField.className = "filter-text" - filterField.addValueChangeListener { - (dataProvider as ListDataProvider).refreshAll() + if (this.model.columns[i] !is VImageColumn) { + filterField.addValueChangeListener { + (dataProvider as ListDataProvider).refreshAll() + } + + filterField.valueChangeMode = ValueChangeMode.EAGER + } else { + filterField.isReadOnly = true } - - filterField.valueChangeMode = ValueChangeMode.EAGER cell.setComponent(filterField) filterField } @@ -122,7 +152,11 @@ class ListTable(val model: VListDialog) : Grid() { width = 0 for (row in 0 until model.count) { val value = model.columns[col]!!.formatObject(model.getValueAt(row, col)).toString() - width = width.coerceAtLeast(value.length.coerceAtLeast(model.titles[col]!!.length)) + width = if (model.columns[col]!! is VImageColumn) { + model.columns[col]!!.width + } else { + width.coerceAtLeast(value.length.coerceAtLeast(model.titles[col]!!.length)) + } } return 8 * width } @@ -150,8 +184,12 @@ class ListTable(val model: VListDialog) : Grid() { * @param o The object to be formatted. * @return The formatted property object. */ - private fun formatObject(o: Any?, col: Int): String { - return model.columns[col]!!.formatObject(o).toString() + private fun formatObject(o: Any?, col: Int): Any?{ + return if (model.columns[col]!!.formatObject(o) is Image) { + model.columns[col]!!.formatObject(o) + } else { + model.columns[col]!!.formatObject(o).toString() + } } } } diff --git a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/visual/VImageHandler.kt b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/visual/VImageHandler.kt index 5fbddea4e5..fc58fd670b 100644 --- a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/visual/VImageHandler.kt +++ b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/visual/VImageHandler.kt @@ -18,13 +18,13 @@ package org.kopi.galite.visual.ui.vaadin.visual -import org.kopi.galite.visual.base.Image +import org.kopi.galite.visual.ui.vaadin.base.Image import org.kopi.galite.visual.ImageHandler class VImageHandler : ImageHandler() { override fun getImage(image: String): Image? = null - override fun getImage(image: ByteArray): Image? = null + override fun getImage(image: ByteArray): Image = Image(source = image) override fun getURL(image: String): String = "ui/vaadin/$image" // FIXME } diff --git a/gradle.properties b/gradle.properties index 0cfaf24723..16d467e924 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx4g # group=org.kopi -version=1.5.6 +version=1.5.6-02GR From 3d02092c4a28e72e9ce3bb1cb8cecf43ba54a1cd Mon Sep 17 00:00:00 2001 From: sebai-dhia Date: Wed, 30 Oct 2024 09:18:24 +0100 Subject: [PATCH 2/2] Fix order of imports [APPS-02GR] --- .../org/kopi/galite/visual/ui/vaadin/common/VImage.kt | 5 +++-- .../org/kopi/galite/visual/ui/vaadin/list/ListTable.kt | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/common/VImage.kt b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/common/VImage.kt index cd14875dc4..286446e936 100644 --- a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/common/VImage.kt +++ b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/common/VImage.kt @@ -17,11 +17,12 @@ */ package org.kopi.galite.visual.ui.vaadin.common -import com.vaadin.flow.component.Focusable -import com.vaadin.flow.component.html.Image import java.time.LocalDateTime import java.time.format.DateTimeFormatter +import com.vaadin.flow.component.Focusable +import com.vaadin.flow.component.html.Image + /** * A widget that wraps image element. */ diff --git a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListTable.kt b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListTable.kt index ea270b83e7..8808c5d7d0 100644 --- a/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListTable.kt +++ b/galite-core/src/main/kotlin/org/kopi/galite/visual/ui/vaadin/list/ListTable.kt @@ -17,7 +17,12 @@ */ package org.kopi.galite.visual.ui.vaadin.list +import java.io.ByteArrayInputStream + import org.kopi.galite.visual.form.VListDialog +import org.kopi.galite.visual.list.VImageColumn +import org.kopi.galite.visual.ui.vaadin.base.Image +import org.kopi.galite.visual.ui.vaadin.form.DImageField import com.vaadin.flow.component.ComponentEventListener import com.vaadin.flow.component.KeyDownEvent @@ -32,10 +37,6 @@ import com.vaadin.flow.component.textfield.TextField import com.vaadin.flow.data.provider.ListDataProvider import com.vaadin.flow.data.renderer.ComponentRenderer import com.vaadin.flow.data.value.ValueChangeMode -import org.kopi.galite.visual.list.VImageColumn -import org.kopi.galite.visual.ui.vaadin.base.Image -import org.kopi.galite.visual.ui.vaadin.form.DImageField -import java.io.ByteArrayInputStream @CssImport("./styles/galite/list.css") class ListTable(val model: VListDialog) : Grid() {