You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by jo...@apache.org on 2020/05/30 15:57:48 UTC
[isis] branch master updated: ISIS-2342 buttonbar aligned to bottom,
textarea scales with window
This is an automated email from the ASF dual-hosted git repository.
joergrade pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git
The following commit(s) were added to refs/heads/master by this push:
new b73ef76 ISIS-2342 buttonbar aligned to bottom, textarea scales with window
b73ef76 is described below
commit b73ef76a543dc0624ea3bb4d613ccc7995b3113b
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Sat May 30 17:57:23 2020 +0200
ISIS-2342 buttonbar aligned to bottom, textarea scales with window
---
.../apache/isis/client/kroviz/ui/kv/RoDialog.kt | 7 +-
.../apache/isis/client/kroviz/ui/kv/RoWindow.kt | 440 ---------------------
2 files changed, 4 insertions(+), 443 deletions(-)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
index 97b6161..77ae4d0 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoDialog.kt
@@ -16,6 +16,7 @@ import pl.treksoft.kvision.panel.HPanel
import pl.treksoft.kvision.panel.vPanel
import pl.treksoft.kvision.utils.perc
import pl.treksoft.kvision.utils.px
+import pl.treksoft.kvision.window.Window
class RoDialog(
caption: String,
@@ -23,8 +24,8 @@ class RoDialog(
val command: Command,
defaultAction: String = "OK",
widthPerc: Int = 30,
- heightPerc: Int = 30) :
- Displayable, RoWindow(caption = caption, closeButton = true) {
+ heightPerc: Int = 100) :
+ Displayable, Window(caption = caption, closeButton = true) {
private val okButton = Button(
text = defaultAction,
@@ -71,12 +72,12 @@ class RoDialog(
vPanel(justify = FlexJustify.SPACEBETWEEN) {
height = 100.perc
formPanel = FormPanelFactory(items).panel
- //formPanel?.height = 100.perc -- omitted here, already set in creating function
add(formPanel!!, grow = 2)
val buttonBar = HPanel(spacing = 10) {
id = "button-bar"
+ marginTop = 20.px
marginLeft = 10.px
}
buttonBar.add(okButton)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoWindow.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoWindow.kt
deleted file mode 100644
index 5f6950e..0000000
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/kv/RoWindow.kt
+++ /dev/null
@@ -1,440 +0,0 @@
-package org.apache.isis.client.kroviz.ui.kv
-
-import com.github.snabbdom.VNode
-import org.w3c.dom.events.Event
-import org.w3c.dom.events.MouseEvent
-import pl.treksoft.kvision.core.Component
-import pl.treksoft.kvision.core.Container
-import pl.treksoft.kvision.core.CssSize
-import pl.treksoft.kvision.core.Overflow
-import pl.treksoft.kvision.core.Position
-import pl.treksoft.kvision.core.Resize
-import pl.treksoft.kvision.core.UNIT
-import pl.treksoft.kvision.html.Icon
-import pl.treksoft.kvision.html.TAG
-import pl.treksoft.kvision.html.Tag
-import pl.treksoft.kvision.modal.CloseIcon
-import pl.treksoft.kvision.panel.SimplePanel
-import pl.treksoft.kvision.utils.obj
-import pl.treksoft.kvision.utils.px
-import pl.treksoft.kvision.window.MaximizeIcon
-import pl.treksoft.kvision.window.MinimizeIcon
-import pl.treksoft.kvision.window.Window
-
-internal const val DEFAULT_Z_INDEX = 900
-internal const val WINDOW_HEADER_HEIGHT = 40
-internal const val WINDOW_CONTENT_MARGIN_BOTTOM = 11
-
-/**
- * Floating window container.
- *
- * @constructor
- * @param caption window title
- * @param contentWidth window content width
- * @param contentHeight window content height
- * @param isResizable determines if the window is resizable
- * @param isDraggable determines if the window is draggable
- * @param closeButton determines if Close button is visible
- * @param maximizeButton determines if Maximize button is visible
- * @param minimizeButton determines if Minimize button is visible
- * @param classes a set of CSS class names
- * @param init an initializer extension function
- */
-@Suppress("TooManyFunctions")
-open class RoWindow(
- caption: String? = null,
- contentWidth: CssSize? = CssSize(0, UNIT.auto),
- contentHeight: CssSize? = CssSize(0, UNIT.auto),
- isResizable: Boolean = true,
- isDraggable: Boolean = true,
- closeButton: Boolean = false,
- maximizeButton: Boolean = false,
- minimizeButton: Boolean = false,
- icon: String? = null,
- classes: Set<String> = setOf(),
- init: (RoWindow.() -> Unit)? = null
-) :
- SimplePanel(classes + setOf("modal-content", "kv-window")) {
-
- /**
- * Window caption text.
- */
- var caption
- get() = captionTag.content
- set(value) {
- captionTag.content = value
- checkHeaderVisibility()
- }
- /**
- * Window content width.
- */
- var contentWidth
- get() = width
- set(value) {
- width = value
- }
- /**
- * Window content height.
- */
- var contentHeight
- get() = content.height
- set(value) {
- content.height = value
- }
- /**
- * Window content height.
- */
- var contentOverflow
- get() = content.overflow
- set(value) {
- content.overflow = value
- }
- /**
- * Determines if the window is resizable.
- */
- var isResizable by refreshOnUpdate(isResizable) { checkIsResizable() }
- /**
- * Determines if the window is draggable.
- */
- var isDraggable by refreshOnUpdate(isDraggable) { checkIsDraggable(); checkHeaderVisibility() }
- /**
- * Determines if Close button is visible.
- */
- var closeButton
- get() = closeIcon.visible
- set(value) {
- closeIcon.visible = value
- checkHeaderVisibility()
- }
- /**
- * Determines if Maximize button is visible.
- */
- var maximizeButton
- get() = maximizeIcon.visible
- set(value) {
- maximizeIcon.visible = value
- checkHeaderVisibility()
- }
- /**
- * Determines if Maximize button is visible.
- */
- var minimizeButton
- get() = minimizeIcon.visible
- set(value) {
- minimizeIcon.visible = value
- checkHeaderVisibility()
- }
- /**
- * Window icon.
- */
- var icon
- get() = if (windowIcon.icon == "") null else windowIcon.icon
- set(value) {
- windowIcon.icon = value ?: ""
- windowIcon.visible = (value != null && value != "")
- }
-
- private val header = SimplePanel(setOf("modal-header"))
-
- /**
- * @suppress
- * Internal property.
- */
- protected val content = SimplePanel().apply {
- this.height = contentHeight
- this.overflow = Overflow.AUTO
- }
- private val closeIcon = CloseIcon()
- private val maximizeIcon = MaximizeIcon()
- private val minimizeIcon = MinimizeIcon()
- private val captionTag = Tag(TAG.H5, caption, classes = setOf("modal-title"))
- private val iconsContainer = SimplePanel(setOf("kv-window-icons-container"))
- private val windowIcon = Icon(icon ?: "").apply {
- addCssClass("window-icon")
- visible = (icon != null && icon != "")
- }
-
- private var isResizeEvent = false
-
- init {
- id = "kv_window_$counter"
- @Suppress("LeakingThis")
- position = Position.ABSOLUTE
- @Suppress("LeakingThis")
- overflow = Overflow.HIDDEN
- @Suppress("LeakingThis")
- width = contentWidth
- @Suppress("LeakingThis")
- zIndex = ++zIndexCounter
- header.add(captionTag)
- captionTag.add(windowIcon)
- header.add(iconsContainer)
- minimizeIcon.visible = minimizeButton
- minimizeIcon.setEventListener<MinimizeIcon> {
- click = { _ ->
- @Suppress("UnsafeCastFromDynamic")
- if (this@RoWindow.dispatchEvent("minimizeWindow", obj {}) != false) {
- toggleMinimize()
- }
- }
- mousedown = { e ->
- e.stopPropagation()
- }
- }
- iconsContainer.add(minimizeIcon)
- maximizeIcon.visible = maximizeButton
- maximizeIcon.setEventListener<MaximizeIcon> {
- click = { _ ->
- @Suppress("UnsafeCastFromDynamic")
- if (this@RoWindow.dispatchEvent("maximizeWindow", obj {}) != false) {
- toggleMaximize()
- }
- }
- mousedown = { e ->
- e.stopPropagation()
- }
- }
- iconsContainer.add(maximizeIcon)
- closeIcon.visible = closeButton
- closeIcon.setEventListener<CloseIcon> {
- click = { _ ->
- @Suppress("UnsafeCastFromDynamic")
- if (this@RoWindow.dispatchEvent("closeWindow", obj {}) != false) {
- close()
- }
- }
- mousedown = { e ->
- e.stopPropagation()
- }
- }
- iconsContainer.add(closeIcon)
- checkHeaderVisibility()
- addInternal(header)
- addInternal(content)
- checkIsDraggable()
- if (isResizable) {
- @Suppress("LeakingThis")
- resize = Resize.BOTH
- content.marginBottom = WINDOW_CONTENT_MARGIN_BOTTOM.px
- }
- @Suppress("LeakingThis")
- setEventListener<RoWindow> {
- click = {
- toFront()
- focus()
- }
- }
- @Suppress("LeakingThis")
- init?.invoke(this)
- counter++
- }
-
- private fun checkHeaderVisibility() {
- @Suppress("ComplexCondition")
- if (!closeButton && !maximizeButton && !minimizeButton && caption == null && !isDraggable) {
- header.hide()
- } else {
- header.show()
- }
- }
-
- open fun checkIsDraggable() {
- var isDrag: Boolean
- if (isDraggable) {
- header.setEventListener<SimplePanel> {
- mousedown = { e ->
- if (e.button.toInt() == 0) {
- isDrag = true
- val dragStartX = this@RoWindow.getElementJQuery()?.position()?.left?.toInt() ?: 0
- val dragStartY = this@RoWindow.getElementJQuery()?.position()?.top?.toInt() ?: 0
- val dragMouseX = e.pageX
- val dragMouseY = e.pageY
- val moveCallback = { me: Event ->
- if (isDrag) {
- setOpacity("0.3")
- this@RoWindow.left = (dragStartX + (me as MouseEvent).pageX - dragMouseX).toInt().px
- this@RoWindow.top = (dragStartY + (me).pageY - dragMouseY).toInt().px
- }
- }
- kotlin.browser.window.addEventListener("mousemove", moveCallback)
- var upCallback: ((Event) -> Unit)? = null
- upCallback = {
- isDrag = false
- setOpacity("1.0")
- kotlin.browser.window.removeEventListener("mousemove", moveCallback)
- kotlin.browser.window.removeEventListener("mouseup", upCallback)
- }
- kotlin.browser.window.addEventListener("mouseup", upCallback)
- }
- }
- }
- } else {
- isDrag = false
- header.removeEventListeners()
- }
- }
-
- private fun setOpacity(value: String) {
- val opacity = value.toDouble()
- this@RoWindow.getElementJQuery()?.css(
- "background-color",
- "rgba(255, 255, 255, $opacity)"
- )
- }
-
-
- private fun checkIsResizable() {
- checkResizablEventHandler()
- if (isResizable) {
- resize = Resize.BOTH
- val intHeight = (getElementJQuery()?.height()?.toInt() ?: 0)
- content.height = (intHeight - WINDOW_HEADER_HEIGHT - WINDOW_CONTENT_MARGIN_BOTTOM).px
- content.marginBottom = WINDOW_CONTENT_MARGIN_BOTTOM.px
- } else {
- resize = Resize.NONE
- val intHeight = (getElementJQuery()?.height()?.toInt() ?: 0)
- content.height = (intHeight - WINDOW_HEADER_HEIGHT).px
- content.marginBottom = 0.px
- }
- }
-
- @Suppress("UnsafeCastFromDynamic")
- private fun checkResizablEventHandler() {
- if (isResizable) {
- if (!isResizeEvent) {
- isResizeEvent = true
- RoManagerBootstrap.setResizeEvent(this) {
- val eid = getElementJQuery()?.attr("id")
- if (isResizable && eid == id) {
- val outerWidth = (getElementJQuery()?.outerWidth()?.toInt() ?: 0)
- val outerHeight = (getElementJQuery()?.outerHeight()?.toInt() ?: 0)
- val intWidth = (getElementJQuery()?.width()?.toInt() ?: 0)
- val intHeight = (getElementJQuery()?.height()?.toInt() ?: 0)
- content.width = intWidth.px
- content.height = (intHeight - WINDOW_HEADER_HEIGHT - WINDOW_CONTENT_MARGIN_BOTTOM).px
- width = outerWidth.px
- height = outerHeight.px
- this.dispatchEvent("resizeWindow", obj {
- detail = obj {
- this.width = outerWidth
- this.height = outerHeight
- }
- })
- }
- }
- }
- } else if (isResizeEvent) {
- RoManagerBootstrap.clearResizeEvent(this)
- isResizeEvent = false
- }
- }
-
- override fun add(child: Component): SimplePanel {
- content.add(child)
- return this
- }
-
- override fun addAll(children: List<Component>): SimplePanel {
- content.addAll(children)
- return this
- }
-
- override fun remove(child: Component): SimplePanel {
- content.remove(child)
- return this
- }
-
- override fun removeAll(): SimplePanel {
- content.removeAll()
- return this
- }
-
- override fun getChildren(): List<Component> {
- return content.getChildren()
- }
-
- override fun afterCreate(node: VNode) {
- checkResizablEventHandler()
- }
-
- override fun afterDestroy() {
- if (isResizeEvent) {
- RoManagerBootstrap.clearResizeEvent(this)
- isResizeEvent = false
- }
- }
-
- /**
- * Moves the current window to the front.
- */
- open fun toFront() {
- if ((zIndex ?: 0) < zIndexCounter) zIndex = ++zIndexCounter
- }
-
- /**
- * Makes the current window focused.
- */
- open fun focus() {
- getElementJQuery()?.focus()
- }
-
- /**
- * Close the window.
- */
- open fun close() {
- hide()
- }
-
- /**
- * Maximize or restore the window size.
- */
- open fun toggleMaximize() {
- }
-
- /**
- * Minimize or restore the window size.
- */
- open fun toggleMinimize() {
- }
-
- companion object {
- internal var counter = 0
- internal var zIndexCounter = DEFAULT_Z_INDEX
- }
-}
-
-/**
- * DSL builder extension function.
- *
- * It takes the same parameters as the constructor of the built component.
- */
-fun Container.window(
- caption: String? = null,
- contentWidth: CssSize? = CssSize(0, UNIT.auto),
- contentHeight: CssSize? = CssSize(0, UNIT.auto),
- isResizable: Boolean = true,
- isDraggable: Boolean = true,
- closeButton: Boolean = false,
- maximizeButton: Boolean = false,
- minimizeButton: Boolean = false,
- icon: String? = null,
- classes: Set<String> = setOf(),
- init: (RoWindow.() -> Unit)? = null
-): RoWindow {
- val window =
- RoWindow(
- caption,
- contentWidth,
- contentHeight,
- isResizable,
- isDraggable,
- closeButton,
- maximizeButton,
- minimizeButton,
- icon,
- classes,
- init
- )
- this.add(window)
- return window
-}