diff options
Diffstat (limited to 'src/main/kotlin/pl/treksoft/kvision/panel')
11 files changed, 597 insertions, 38 deletions
diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/DockPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/DockPanel.kt index e9670c1a..7f32a61c 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/DockPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/DockPanel.kt @@ -1,7 +1,31 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel import pl.treksoft.kvision.core.Component +/** + * Dock layout directions. + */ enum class SIDE { LEFT, RIGHT, @@ -10,17 +34,51 @@ enum class SIDE { DOWN } +/** + * The container with dock layout (up, down, left, right and center positions). + * + * @constructor + * @param classes a set of CSS class names + */ open class DockPanel(classes: Set<String> = setOf()) : SimplePanel(classes = classes) { + /** + * @suppress + * Internal property. + */ protected var left: Component? = null + /** + * @suppress + * Internal property. + */ protected var center: Component? = null + /** + * @suppress + * Internal property. + */ protected var right: Component? = null + /** + * @suppress + * Internal property. + */ protected var up: Component? = null + /** + * @suppress + * Internal property. + */ protected var down: Component? = null + /** + * @suppress + * Internal property. + */ protected val mainContainer = FlexPanel( direction = FLEXDIR.COLUMN, justify = FLEXJUSTIFY.SPACEBETWEEN, alignItems = FLEXALIGNITEMS.STRETCH ) + /** + * @suppress + * Internal property. + */ protected val subContainer = FlexPanel(justify = FLEXJUSTIFY.SPACEBETWEEN, alignItems = FLEXALIGNITEMS.CENTER) init { @@ -28,33 +86,39 @@ open class DockPanel(classes: Set<String> = setOf()) : SimplePanel(classes = cla mainContainer.add(subContainer, 2) } + /** + * Adds a component to the dock container. + * @param child child component + * @param position position in the dock + * @return current container + */ @Suppress("MagicNumber") - open fun add(widget: Component, position: SIDE): DockPanel { + open fun add(child: Component, position: SIDE): DockPanel { when (position) { SIDE.UP -> { up?.let { mainContainer.remove(it) } - up = widget - mainContainer.add(widget, 1, alignSelf = FLEXALIGNITEMS.CENTER) + up = child + mainContainer.add(child, 1, alignSelf = FLEXALIGNITEMS.CENTER) } SIDE.CENTER -> { center?.let { subContainer.remove(it) } - center = widget - subContainer.add(widget, 2) + center = child + subContainer.add(child, 2) } SIDE.LEFT -> { left?.let { subContainer.remove(it) } - left = widget - subContainer.add(widget, 1) + left = child + subContainer.add(child, 1) } SIDE.RIGHT -> { right?.let { subContainer.remove(it) } - right = widget - subContainer.add(widget, 3) + right = child + subContainer.add(child, 3) } SIDE.DOWN -> { down?.let { mainContainer.remove(it) } - down = widget - mainContainer.add(widget, 3, alignSelf = FLEXALIGNITEMS.CENTER) + down = child + mainContainer.add(child, 3, alignSelf = FLEXALIGNITEMS.CENTER) } } return this @@ -78,6 +142,11 @@ open class DockPanel(classes: Set<String> = setOf()) : SimplePanel(classes = cla return this } + /** + * Removes child from given position in the dock. + * @param position position in the dock + * @return current container + */ open fun removeAt(position: SIDE): DockPanel { when (position) { SIDE.UP -> { diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt index ad3522ea..266612fe 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/FlexPanel.kt @@ -1,25 +1,55 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel import pl.treksoft.kvision.core.Component +import pl.treksoft.kvision.core.StringPair import pl.treksoft.kvision.core.StyledComponent import pl.treksoft.kvision.core.WidgetWrapper -import pl.treksoft.kvision.core.StringPair import pl.treksoft.kvision.utils.px -enum class FLEXDIR(val dir: String) { +/** + * CSS flexbox directions. + */ +enum class FLEXDIR(internal val dir: String) { ROW("row"), ROWREV("row-reverse"), COLUMN("column"), COLUMNREV("column-reverse") } -enum class FLEXWRAP(val wrap: String) { +/** + * CSS flexbox wrap modes. + */ +enum class FLEXWRAP(internal val wrap: String) { NOWRAP("nowrap"), WRAP("wrap"), WRAPREV("wrap-reverse") } -enum class FLEXJUSTIFY(val justify: String) { +/** + * CSS flexbox justification options. + */ +enum class FLEXJUSTIFY(internal val justify: String) { FLEXSTART("flex-start"), FLEXEND("flex-end"), CENTER("center"), @@ -28,7 +58,10 @@ enum class FLEXJUSTIFY(val justify: String) { SPACEEVENLY("space-evenly") } -enum class FLEXALIGNITEMS(val alignItems: String) { +/** + * CSS flexbox alignments options. + */ +enum class FLEXALIGNITEMS(internal val alignItems: String) { FLEXSTART("flex-start"), FLEXEND("flex-end"), CENTER("center"), @@ -36,7 +69,10 @@ enum class FLEXALIGNITEMS(val alignItems: String) { STRETCH("stretch") } -enum class FLEXALIGNCONTENT(val alignContent: String) { +/** + * CSS flexbox content alignment options. + */ +enum class FLEXALIGNCONTENT(internal val alignContent: String) { FLEXSTART("flex-start"), FLEXEND("flex-end"), CENTER("center"), @@ -45,37 +81,68 @@ enum class FLEXALIGNCONTENT(val alignContent: String) { STRETCH("stretch") } +/** + * The container with CSS flexbox layout support. + * + * @constructor + * @param direction flexbox direction + * @param wrap flexbox wrap + * @param justify flexbox content justification + * @param alignItems flexbox items alignment + * @param alignContent flexbox content alignment + * @param spacing spacing between columns/rows + * @param classes a set of CSS class names + */ open class FlexPanel( direction: FLEXDIR? = null, wrap: FLEXWRAP? = null, justify: FLEXJUSTIFY? = null, alignItems: FLEXALIGNITEMS? = null, alignContent: FLEXALIGNCONTENT? = null, spacing: Int? = null, classes: Set<String> = setOf() ) : SimplePanel(classes) { + + /** + * CSS flexbox direction. + */ var direction = direction set(value) { field = value refreshSpacing() refresh() } + /** + * CSS flexbox wrap mode. + */ var wrap = wrap set(value) { field = value refresh() } + /** + * CSS flexbox content justification. + */ var justify = justify set(value) { field = value refresh() } + /** + * CSS flexbox items alignment. + */ var alignItems = alignItems set(value) { field = value refresh() } + /** + * CSS flexbox content alignment. + */ var alignContent = alignContent set(value) { field = value refresh() } + /** + * The spacing between columns/rows. + */ var spacing = spacing set(value) { field = value @@ -83,6 +150,16 @@ open class FlexPanel( refresh() } + /** + * Adds a component to the flexbox container. + * @param child child component + * @param order child flexbox ordering + * @param grow child flexbox grow + * @param shrink child flexbox shrink + * @param basis child flexbox basis + * @param alignSelf child self alignment + * @param classes a set of CSS class names + */ @Suppress("LongParameterList") fun add( child: Component, order: Int? = null, grow: Int? = null, shrink: Int? = null, @@ -123,7 +200,7 @@ open class FlexPanel( } override fun remove(child: Component): FlexPanel { - children.find { (it as FlexWrapper).delegate == child }?.let { + children.find { (it as FlexWrapper).wrapped == child }?.let { super.remove(it) it.dispose() } @@ -162,7 +239,10 @@ open class FlexPanel( } } -class FlexWrapper( +/** + * Helper class form CSS flexbox layout. + */ +internal class FlexWrapper( delegate: Component, private val order: Int? = null, private val grow: Int? = null, private val shrink: Int? = null, private val basis: Int? = null, private val alignSelf: FLEXALIGNITEMS? = null, diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt index 549f7631..b6f1d3a5 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/GridPanel.kt @@ -1,24 +1,54 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel import pl.treksoft.kvision.core.Component -import pl.treksoft.kvision.core.WidgetWrapper import pl.treksoft.kvision.core.StringPair +import pl.treksoft.kvision.core.WidgetWrapper -enum class GRIDJUSTIFY(val justify: String) { +/** + * CSS grid justification options. + */ +enum class GRIDJUSTIFY(internal val justify: String) { START("start"), END("end"), CENTER("center"), STRETCH("stretch") } -enum class GRIDALIGN(val align: String) { +/** + * CSS grid alignment options. + */ +enum class GRIDALIGN(internal val align: String) { START("start"), END("end"), CENTER("center"), STRETCH("stretch") } -enum class GRIDJUSTIFYCONTENT(val justifyContent: String) { +/** + * CSS grid content justification options. + */ +enum class GRIDJUSTIFYCONTENT(internal val justifyContent: String) { START("start"), END("end"), CENTER("center"), @@ -28,7 +58,10 @@ enum class GRIDJUSTIFYCONTENT(val justifyContent: String) { SPACEEVENLY("space-evenly") } -enum class GRIDALIGNCONTENT(val alignContent: String) { +/** + * CSS grid content alignment options. + */ +enum class GRIDALIGNCONTENT(internal val alignContent: String) { START("start"), END("end"), CENTER("center"), @@ -38,13 +71,34 @@ enum class GRIDALIGNCONTENT(val alignContent: String) { SPACEEVENLY("space-evenly") } -enum class GRIDFLOW(val flow: String) { +/** + * CSS grid flow options. + */ +enum class GRIDFLOW(internal val flow: String) { ROW("row"), COLUMN("column"), ROWDENSE("row dense"), COLUMNDENSE("column dense") } +/** + * The container with CSS grid layout support. + * + * @constructor + * @param autoColumns grid auto columns + * @param autoRows grid auto rows + * @param autoFlow grid auto flow + * @param templateColumns grid columns template + * @param templateRows grid rows template + * @param templateAreas grid areas template + * @param columnGap grid column gap + * @param rowGap grid row gap + * @param justifyItems grid items justification + * @param alignItems grid items alignment + * @param justifyContent flexbox content justification + * @param alignContent flexbox content alignment + * @param classes a set of CSS class names + */ open class GridPanel( autoColumns: String? = null, autoRows: String? = null, autoFlow: GRIDFLOW? = null, templateColumns: String? = null, templateRows: String? = null, templateAreas: List<String>? = null, @@ -52,67 +106,117 @@ open class GridPanel( alignItems: GRIDALIGN? = null, justifyContent: GRIDJUSTIFYCONTENT? = null, alignContent: GRIDALIGNCONTENT? = null, classes: Set<String> = setOf() ) : SimplePanel(classes) { + + /** + * CSS grid auto columns. + */ var autoColumns = autoColumns set(value) { field = value refresh() } + /** + * CSS grid auto rows. + */ var autoRows = autoRows set(value) { field = value refresh() } + /** + * CSS grid auto flow. + */ var autoFlow = autoFlow set(value) { field = value refresh() } + /** + * CSS grid columns template. + */ var templateColumns = templateColumns set(value) { field = value refresh() } + /** + * CSS grid rows template. + */ var templateRows = templateRows set(value) { field = value refresh() } + /** + * CSS grid areas template. + */ var templateAreas = templateAreas set(value) { field = value refresh() } + /** + * CSS grid column gap. + */ var columnGap = columnGap set(value) { field = value refresh() } + /** + * CSS grid row gap. + */ var rowGap = rowGap set(value) { field = value refresh() } + /** + * CSS grid items justification. + */ var justifyItems = justifyItems set(value) { field = value refresh() } + /** + * CSS grid items alignment. + */ var alignItems = alignItems set(value) { field = value refresh() } + /** + * CSS grid content justification. + */ var justifyContent = justifyContent set(value) { field = value refresh() } + /** + * CSS grid content alignment. + */ var alignContent = alignContent set(value) { field = value refresh() } + /** + * Adds a component to the grid container. + * @param child child component + * @param columnStart number of starting column + * @param rowStart number of starting row + * @param columnEnd number of ending column + * @param rowEnd number of ending row + * @param area grid area + * @param justifySelf child self justification + * @param alignSelf child self alignment + * @param classes a set of CSS class names + * @return current container + */ @Suppress("LongParameterList") fun add( child: Component, columnStart: Int? = null, rowStart: Int? = null, @@ -133,7 +237,7 @@ open class GridPanel( } override fun remove(child: Component): GridPanel { - children.find { (it as GridWrapper).delegate == child }?.let { + children.find { (it as GridWrapper).wrapped == child }?.let { super.remove(it) it.dispose() } diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/HPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/HPanel.kt index 841985ba..7639ca3b 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/HPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/HPanel.kt @@ -1,5 +1,38 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel +/** + * The container with horizontal layout. + * + * This is a special case of the flexbox layout. + * + * @constructor + * @param wrap flexbox wrap + * @param justify flexbox content justification + * @param alignItems flexbox items alignment + * @param spacing spacing between columns/rows + * @param classes a set of CSS class names + */ open class HPanel( wrap: FLEXWRAP? = null, justify: FLEXJUSTIFY? = null, alignItems: FLEXALIGNITEMS? = null, spacing: Int? = null, classes: Set<String> = setOf() diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/ResponsiveGridPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/ResponsiveGridPanel.kt index f4630298..93588617 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/ResponsiveGridPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/ResponsiveGridPanel.kt @@ -1,3 +1,24 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel import pl.treksoft.kvision.core.Component @@ -6,31 +27,57 @@ import pl.treksoft.kvision.html.ALIGN import pl.treksoft.kvision.html.TAG import pl.treksoft.kvision.html.Tag -enum class GRIDSIZE(val size: String) { +/** + * Bootstrap grid sizes. + */ +enum class GRIDSIZE(internal val size: String) { XS("xs"), SM("sm"), MD("md"), LG("lg") } -const val MAX_COLUMNS = 12 +internal const val MAX_COLUMNS = 12 internal data class WidgetParam(val widget: Component, val size: Int, val offset: Int) +/** + * The container with support for Bootstrap responsive grid layout. + * + * @constructor + * @param gridsize grid size + * @param rows number of rows + * @param cols number of columns + * @param align text align of grid cells + * @param classes a set of CSS class names + */ open class ResponsiveGridPanel( private val gridsize: GRIDSIZE = GRIDSIZE.MD, private var rows: Int = 0, private var cols: Int = 0, align: ALIGN? = null, classes: Set<String> = setOf() ) : SimplePanel(classes) { - protected var align = align + + /** + * Text align of grid cells. + */ + var align = align set(value) { field = value - refresh() + refreshRowContainers() } internal val map = mutableMapOf<Int, MutableMap<Int, WidgetParam>>() private var auto: Boolean = true + /** + * Adds child component to the grid. + * @param child child component + * @param col column number + * @param row row number + * @param size cell size (colspan) + * @param offset cell offset + * @return this container + */ open fun add(child: Component, col: Int, row: Int, size: Int = 0, offset: Int = 0): ResponsiveGridPanel { val cRow = if (row < 0) 0 else row val cCol = if (col < 0) 0 else col @@ -68,6 +115,12 @@ open class ResponsiveGridPanel( return this } + /** + * Removes child component at given location (column, row). + * @param col column number + * @param row row number + * @return this container + */ open fun removeAt(col: Int, row: Int): ResponsiveGridPanel { map[row]?.remove(col) refreshRowContainers() @@ -75,7 +128,7 @@ open class ResponsiveGridPanel( } @Suppress("ComplexMethod", "NestedBlockDepth") - protected open fun refreshRowContainers() { + private fun refreshRowContainers() { singleRender { clearRowContainers() val num = MAX_COLUMNS / cols diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt b/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt index 88634bea..e10fdc86 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/Root.kt @@ -1,10 +1,43 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel import com.github.snabbdom.VNode import pl.treksoft.kvision.KVManager -import pl.treksoft.kvision.modal.Modal import pl.treksoft.kvision.core.StringBoolPair +import pl.treksoft.kvision.modal.Modal +/** + * Root container. + * + * This container is bound to the specific element in the main HTML file of the project. + * It is always the root of components tree and it is responsible for rendering and updating + * Snabbdom virtual DOM. + * + * @constructor + * @param id ID attribute of element in the main HTML file + * @param fixed if false, the container is rendered with Bootstrap "container-fluid" class, + * otherwise it's rendered with "container" class (default is false) + */ class Root(id: String, private val fixed: Boolean = false) : SimplePanel() { private val modals: MutableList<Modal> = mutableListOf() private var rootVnode: VNode = renderVNode() @@ -18,7 +51,7 @@ class Root(id: String, private val fixed: Boolean = false) : SimplePanel() { } override fun render(): VNode { - return kvh("div#" + id, childrenVNodes() + modalsVNodes()) + return render("div#" + id, childrenVNodes() + modalsVNodes()) } internal fun addModal(modal: Modal) { diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/SimplePanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/SimplePanel.kt index 51c42a06..b210f2cb 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/SimplePanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/SimplePanel.kt @@ -1,3 +1,24 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel import com.github.snabbdom.VNode @@ -5,17 +26,32 @@ import pl.treksoft.kvision.core.Component import pl.treksoft.kvision.core.Container import pl.treksoft.kvision.core.Widget +/** + * Basic container class, rendered as a DIV element with all children directly within. + * + * @constructor + * @param classes a set of CSS class names + */ open class SimplePanel(classes: Set<String> = setOf()) : Widget(classes), Container { internal val children: MutableList<Component> = mutableListOf() override fun render(): VNode { - return kvh("div", childrenVNodes()) + return render("div", childrenVNodes()) } + /** + * Returns the array of the children Snabbdom vnodes. + * @return array of children vnodes + */ protected open fun childrenVNodes(): Array<VNode> { return children.filter { it.visible }.map { it.renderVNode() }.toTypedArray() } + /** + * Protected and final method to add given component to the current container. + * @param child child component + * @return current container + */ protected fun addInternal(child: Component): SimplePanel { children.add(child) child.parent = this diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt index 10595a37..cfeadd58 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/SplitPanel.kt @@ -1,3 +1,24 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel import com.github.snabbdom.VNode @@ -9,11 +30,24 @@ import pl.treksoft.kvision.html.TAG import pl.treksoft.kvision.html.Tag import pl.treksoft.kvision.utils.obj -enum class DIRECTION(val dir: String) { +/** + * Split panel direction. + */ +enum class DIRECTION(internal val dir: String) { HORIZONTAL("horizontal"), VERTICAL("vertical") } +/** + * The container with draggable splitter. + * + * It is required to have exactly two children, for both sides of the splitter. Otherwise it will be + * rendered as empty. + * + * @constructor + * @param direction direction of the splitter + * @param classes a set of CSS class names + */ open class SplitPanel( private val direction: DIRECTION = DIRECTION.VERTICAL, classes: Set<String> = setOf() @@ -59,7 +93,7 @@ open class SplitPanel( } } -class Splitter(private val splitPanel: SplitPanel, direction: DIRECTION) : Tag( +internal class Splitter(private val splitPanel: SplitPanel, direction: DIRECTION) : Tag( TAG.DIV, classes = setOf("splitter-" + direction.dir) ) { @@ -75,6 +109,6 @@ class Splitter(private val splitPanel: SplitPanel, direction: DIRECTION) : Tag( } companion object { - var counter = 0 + internal var counter = 0 } } diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/StackPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/StackPanel.kt index e69cc416..672c8690 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/StackPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/StackPanel.kt @@ -1,13 +1,47 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel import com.github.snabbdom.VNode import pl.treksoft.kvision.core.Component import pl.treksoft.kvision.routing.routing +/** + * The container with only one active (visible) child at any moment. + * + * It supports activating children by a JavaScript route. + * + * @constructor + * @param activateLast determines if added component is automatically activated (default true) + * @param classes a set of CSS class names + */ open class StackPanel( private val activateLast: Boolean = true, classes: Set<String> = setOf() ) : SimplePanel(classes) { + + /** + * The index of active (visible) child. + */ var activeIndex = -1 set(value) { field = value @@ -22,6 +56,12 @@ open class StackPanel( } } + /** + * Adds given component and bounds it's activation to a given route. + * @param panel child component + * @param route JavaScript route to activate given child + * @return current container + */ open fun add(panel: Component, route: String): StackPanel { add(panel) val currentIndex = children.size - 1 diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/TabPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/TabPanel.kt index 411c4a57..9072d261 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/TabPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/TabPanel.kt @@ -1,3 +1,24 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel import pl.treksoft.kvision.core.Component @@ -7,7 +28,19 @@ import pl.treksoft.kvision.html.TAG import pl.treksoft.kvision.html.Tag import pl.treksoft.kvision.routing.routing -open class TabPanel : SimplePanel(setOf()) { +/** + * The container rendering it's children as tabs. + * + * It supports activating children by a JavaScript route. + * + * @constructor + * @param classes a set of CSS class names + */ +open class TabPanel(classes: Set<String> = setOf()) : SimplePanel(classes) { + + /** + * The index of active (visible) tab. + */ var activeIndex get() = content.activeIndex set(value) { @@ -30,6 +63,15 @@ open class TabPanel : SimplePanel(setOf()) { this.addInternal(content) } + /** + * Adds new tab and optionally bounds it's activation to a given route. + * @param title title of the tab + * @param panel child component + * @param icon icon of the tab + * @param image image of the tab + * @param route JavaScript route to activate given child + * @return current container + */ open fun addTab( title: String, panel: Component, icon: String? = null, image: ResString? = null, route: String? = null @@ -59,6 +101,9 @@ open class TabPanel : SimplePanel(setOf()) { return this } + /** + * Removes tab at given index. + */ open fun removeTab(index: Int): TabPanel { nav.remove(nav.children[index]) content.remove(content.children[index]) diff --git a/src/main/kotlin/pl/treksoft/kvision/panel/VPanel.kt b/src/main/kotlin/pl/treksoft/kvision/panel/VPanel.kt index 7870b67a..91ee4a6a 100644 --- a/src/main/kotlin/pl/treksoft/kvision/panel/VPanel.kt +++ b/src/main/kotlin/pl/treksoft/kvision/panel/VPanel.kt @@ -1,5 +1,37 @@ +/* + * Copyright (c) 2017-present Robert Jaros + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ package pl.treksoft.kvision.panel +/** + * The container with vertical layout. + * + * This is a special case of the flexbox layout. + * + * @constructor + * @param justify flexbox content justification + * @param alignItems flexbox items alignment + * @param spacing spacing between columns/rows + * @param classes a set of CSS class names + */ open class VPanel( justify: FLEXJUSTIFY? = null, alignItems: FLEXALIGNITEMS? = null, spacing: Int? = null, classes: Set<String> = setOf() |