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 2021/11/10 07:39:03 UTC

[isis] 05/06: ISIS-2348 Replay against current version remote (incode/demoUrlRemote).

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

commit 52c586daa07ead9ad103a4ae5937b409749a3be2
Author: Jörg Rade <jo...@kuehne-nagel.com>
AuthorDate: Wed Nov 10 08:36:55 2021 +0100

    ISIS-2348 Replay against current version remote (incode/demoUrlRemote).
---
 .../org/apache/isis/client/kroviz/core/Session.kt  |   5 +-
 .../isis/client/kroviz/core/event/LogEntry.kt      |   4 +
 .../isis/client/kroviz/core/event/ReplayCommand.kt |  25 ++-
 .../apache/isis/client/kroviz/ui/core/Constants.kt |   2 +-
 .../apache/isis/client/kroviz/ui/core/RoMenuBar.kt |   7 +-
 .../apache/isis/client/kroviz/ui/core/UiManager.kt |   6 +-
 .../client/kroviz/ui/diagram/LinkTreeDiagram.kt    |   2 +-
 .../isis/client/kroviz/ui/dialog/ErrorDialog.kt    |  10 +-
 .../isis/client/kroviz/ui/dialog/EventDialog.kt    |  99 ++++++++++++
 .../client/kroviz/ui/dialog/EventImportDialog.kt   | 165 ++++++++++++++++++++
 .../isis/client/kroviz/ui/dialog/LoginPrompt.kt    |   3 -
 .../apache/isis/client/kroviz/utils/IconManager.kt | 173 +++++++++++----------
 .../apache/isis/client/kroviz/utils/StringUtils.kt |   2 +-
 .../isis/client/kroviz/util/StringUtilsTest.kt     |   2 +-
 14 files changed, 395 insertions(+), 110 deletions(-)

diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
index feb12f0..afb43b5 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/Session.kt
@@ -28,15 +28,14 @@ import org.apache.isis.client.kroviz.utils.StringUtils
 class Session {
     private var user: String = ""
     private var pw: String = ""
-    var url: String = ""
+    var baseUrl: String = ""
     val eventStore = EventStore()
 
     fun login(url: String, user: String, pw: String) {
         this.user = user
         this.pw = pw
-        this.url = url
+        this.baseUrl = url
         UiManager.updateUser(user)
-//        UiManager.updatePower("Powered By: Apache Isis")
     }
 
     fun getCredentials(): String {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
index ed2350d..6e6ebc1 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/LogEntry.kt
@@ -231,6 +231,10 @@ data class LogEntry(
     fun getAggregator(): BaseAggregator {
         //TODO the last aggt is not always the right one
         // callers need to filter  !!!
+        if (aggregators.size == 0) {
+            console.log("[LE.getAggregator]")
+            console.log(this)
+        }
         return aggregators.last()
     }
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt
index c6d3297..e16da18 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/core/event/ReplayCommand.kt
@@ -27,6 +27,7 @@ import org.apache.isis.client.kroviz.main
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.Represention
 import org.apache.isis.client.kroviz.to.TObject
+import org.apache.isis.client.kroviz.ui.core.Constants
 import org.apache.isis.client.kroviz.ui.core.UiManager
 import org.apache.isis.client.kroviz.ui.dialog.ReplayDiffDialog
 
@@ -34,21 +35,29 @@ val AppScope = CoroutineScope(window.asCoroutineDispatcher())
 
 class ReplayCommand {
     private val eventStore = UiManager.getEventStore()
+    private val oldBaseUrl = UiManager.getBaseUrl()
 
-    fun execute() {
+    fun execute(
+        urlUnderTest: String = Constants.demoUrlRemote,
+        userUnderTest: String = Constants.demoUser,
+        passUnderTest: String = Constants.demoPass
+    ) {
         val expectedEvents = copyEvents(eventStore.log)
         eventStore.reset()
         main() // re-creates the UI, but keeps the UiManager(singleton/object) and the session
+        UiManager.login(urlUnderTest, userUnderTest, passUnderTest)
+        console.log("[RC.execute]")
+        console.log(urlUnderTest)
 
         val uiEvents = filterReplayEvents(expectedEvents)
-        replay(uiEvents)
-        val actualEvents: MutableList<LogEntry> = eventStore.log
+        replay(uiEvents, urlUnderTest)
 
+        val actualEvents: MutableList<LogEntry> = eventStore.log
         val rdd = ReplayDiffDialog(expectedEvents, actualEvents)
         rdd.dialog.open()
     }
 
-    private fun replay(userActions: List<LogEntry>) {
+    private fun replay(userActions: List<LogEntry>, newBaseUrl: String) {
         var previous: LogEntry? = null
         userActions.forEach {
             if (it.isUserAction() && previous != null) {
@@ -59,7 +68,11 @@ class ReplayCommand {
                     ResourceProxy().load(obj)
                 }
             } else {
-                val link = Link(href = it.url)
+                var href = it.url
+                if (href.startsWith(oldBaseUrl)) {
+                    href = href.replace(oldBaseUrl, newBaseUrl)
+                }
+                val link = Link(href = href)
                 ResourceProxy().fetch(link, null, it.subType)
             }
             previous = it
@@ -69,7 +82,7 @@ class ReplayCommand {
     private fun calculateDelay(previous: LogEntry, current: LogEntry): Long {
         val currentMs = current.createdAt.getTime()
         val previousMs = previous.createdAt.getTime()
-        return  currentMs.minus(previousMs).toLong()
+        return currentMs.minus(previousMs).toLong()
     }
 
     private fun filterReplayEvents(events: List<LogEntry>): List<LogEntry> {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt
index c01a0d9..076960a 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/Constants.kt
@@ -38,5 +38,5 @@ object Constants {
     const val demoUrl = "http://localhost:8080/"
     const val demoUser = "sven"
     const val demoPass = "pass"
-    //const val demoUrl = "https://demo-wicket.jdo.isis.incode.work/"
+    const val demoUrlRemote = "https://demo-wicket.jdo.isis.incode.work/"
 }
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
index 3df4437..a6043b5 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/RoMenuBar.kt
@@ -32,6 +32,7 @@ import org.apache.isis.client.kroviz.core.event.ReplayCommand
 import org.apache.isis.client.kroviz.to.mb.Menubars
 import org.apache.isis.client.kroviz.ui.chart.SampleChartModel
 import org.apache.isis.client.kroviz.ui.dialog.About
+import org.apache.isis.client.kroviz.ui.dialog.EventDialog
 import org.apache.isis.client.kroviz.ui.dialog.LoginPrompt
 import org.apache.isis.client.kroviz.ui.dialog.SvgInline
 import org.apache.isis.client.kroviz.ui.panel.*
@@ -82,7 +83,11 @@ class RoMenuBar : SimplePanel() {
         )
 
         mainMenu.add(
-            buildMenuEntry("Replay", "Replay", { ReplayCommand().execute() })
+            buildMenuEntry("Events", "Event", { EventDialog().open() })
+        )
+
+        mainMenu.add(
+            buildMenuEntry("Replay", "Replay", {  })
         )
 
         mainMenu.add(
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
index 395c603..a75b415 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/core/UiManager.kt
@@ -194,11 +194,11 @@ object UiManager {
         return sessions.first()
     }
 
-    fun getUrl(): String {
+    fun getBaseUrl(): String {
         val s = getSession()
         return when (s) {
             null -> ""
-            else -> s.url
+            else -> s.baseUrl
         }
     }
 
@@ -217,7 +217,7 @@ object UiManager {
     fun login(url: String, username: String, password: String) {
         val s = Session()
         s.login(url, username, password)
-        sessions.add(s)
+        sessions.add(0,s)
     }
 
     fun getCredentials(): String {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
index 749f715..80b8a10 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/diagram/LinkTreeDiagram.kt
@@ -31,7 +31,7 @@ import org.apache.isis.client.kroviz.utils.StringUtils
 
 object LinkTreeDiagram {
 
-    private val protocolHostPort = UiManager.getUrl()
+    private val protocolHostPort = UiManager.getBaseUrl()
 
     fun build(aggregator: BaseAggregator): String {
         val pc = PumlCode()
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/ErrorDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/ErrorDialog.kt
index 9ced7b1..066ccc9 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/ErrorDialog.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/ErrorDialog.kt
@@ -38,10 +38,12 @@ class ErrorDialog(val logEntry: LogEntry) : Command() {
         }
         val label = "HttpError " + error.httpStatusCode.toString()
         RoDialog(
-                caption = label,
-                items = formItems,
-                command = this,
-                widthPerc = 80).open()
+            caption = label,
+            items = formItems,
+            command = this,
+            widthPerc = 80,
+            heightPerc = 70
+        ).open()
     }
 
     private fun toString(stackTrace: List<String>): String {
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventDialog.kt
new file mode 100644
index 0000000..712c6fc
--- /dev/null
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventDialog.kt
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.client.kroviz.ui.dialog
+
+import io.kvision.core.CssSize
+import io.kvision.core.FlexDirection
+import io.kvision.core.UNIT
+import io.kvision.panel.VPanel
+import org.apache.isis.client.kroviz.core.event.ReplayCommand
+import org.apache.isis.client.kroviz.to.ValueType
+import org.apache.isis.client.kroviz.ui.core.FormItem
+import org.apache.isis.client.kroviz.ui.core.RoDialog
+import org.apache.isis.client.kroviz.ui.core.UiManager
+import org.apache.isis.client.kroviz.ui.panel.EventLogTable
+
+class EventDialog() : Command() {
+    var dialog: RoDialog
+
+    private val eventPanel = VPanel(spacing = 3) {
+        width = CssSize(100, UNIT.perc)
+    }
+
+    // callback parameter
+    private val EXP: String = "exp"
+    private val IMP: String = "imp"
+    private val REP: String = "rep"
+
+    init {
+        //FIXME actions Pin Export Replay Close
+        val customButtons = mutableListOf<FormItem>()
+        customButtons.add(FormItem("Export", ValueType.BUTTON, null, callBack = this, callBackAction = EXP))
+        customButtons.add(FormItem("Import", ValueType.BUTTON, null, callBack = this, callBackAction = IMP))
+        customButtons.add(FormItem("Replay", ValueType.BUTTON, null, callBack = this, callBackAction = REP))
+
+        dialog = RoDialog(
+            caption = "Event History",
+            items = mutableListOf(),
+            command = this,
+            defaultAction = "Pin",
+            widthPerc = 60,
+            heightPerc = 70,
+            customButtons = customButtons
+        )
+        val eventTable = EventLogTable(UiManager.getEventStore().log)
+        eventTable.tabulator.addCssClass("tabulator-in-dialog")
+        eventPanel.add(eventTable)
+
+        val mainPanel = VPanel()
+        mainPanel.addCssClass("dialog-content")
+        mainPanel.flexDirection = FlexDirection.ROW
+        mainPanel.add(eventTable)
+        dialog.formPanel!!.add(mainPanel)
+    }
+
+    override fun execute(action: String?) {
+        when {
+            action.isNullOrEmpty() -> {
+                UiManager.add("Event Log", EventLogTable(UiManager.getEventStore().log))
+                dialog.close()
+            }
+            action == EXP -> {
+                EventExportDialog().open()
+                dialog.close()
+            }
+            action == IMP -> {
+                EventImportDialog().open()
+                dialog.close()
+            }
+            action == REP -> {
+                ReplayCommand().execute()
+                dialog.close()
+            }
+            else -> {
+            }
+        }
+    }
+
+    fun open() {
+        dialog.open()
+    }
+
+}
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventImportDialog.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventImportDialog.kt
new file mode 100644
index 0000000..52fe9a9
--- /dev/null
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/EventImportDialog.kt
@@ -0,0 +1,165 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.client.kroviz.ui.dialog
+
+import org.apache.isis.client.kroviz.core.event.EventState
+import org.apache.isis.client.kroviz.core.event.LogEntry
+import org.apache.isis.client.kroviz.core.event.ReplayEvent
+import org.apache.isis.client.kroviz.to.ValueType
+import org.apache.isis.client.kroviz.ui.core.RoDialog
+import io.kvision.core.StringPair
+import io.kvision.form.select.SimpleSelect
+import org.apache.isis.client.kroviz.ui.core.FormItem
+import org.apache.isis.client.kroviz.ui.core.UiManager
+
+class EventImportDialog() : Command() {
+
+    private lateinit var form: RoDialog
+    private var output: String = ""
+    val formItems = mutableListOf<FormItem>()
+    val events = mutableListOf<ReplayEvent>()
+
+    private fun collectReplayEvents() {
+        UiManager.getEventStore().log.forEach { it ->
+            val re = buildExportEvent(it)
+            when (it.state) {
+                EventState.SUCCESS_JS -> events.add(re)
+                EventState.SUCCESS_XML -> events.add(re)
+                EventState.ERROR -> events.add(re)
+                else -> {
+                }
+            }
+        }
+    }
+
+    override fun execute(action:String?) {
+        val filter = extractUserInput("Filter")
+        var fileName = ""
+        when (filter) {
+            "NONE" -> {
+                collectAllEvents()
+                fileName += "AllEvents"
+            }
+            "REPLAY" -> {
+                collectReplayEvents()
+                fileName += "ReplayEvents"
+            }
+            "UNFINISHED" -> {
+                collectUnfinishedEvents()
+                fileName += "UnfinishedEvents"
+            }
+            else -> {
+            }
+        }
+        val format = extractUserInput("Format")
+        when (format) {
+            "CSV" -> {
+                output = asCsv(events)
+                fileName += ".csv"
+            }
+            "JSON" -> {
+                output = JSON.stringify(events)
+                fileName += ".json"
+            }
+            else -> {
+            }
+        }
+        DownloadDialog(fileName, output).open()
+    }
+
+    private fun extractUserInput(fieldName: String): String? {
+        val formPanel = form.formPanel
+        val kids = formPanel!!.getChildren()
+        //iterate over FormItems (0,1) but not Buttons(2,3)
+        for (i in kids) {
+            when (i) {
+                is SimpleSelect -> {
+                    val key = i.label!!
+                    val value = i.getValue()!!
+                    if (key == fieldName) {
+                        return value
+                    }
+                }
+            }
+        }
+        return null
+    }
+
+    private fun collectUnfinishedEvents() {
+        UiManager.getEventStore().log.forEach { it ->
+            val re = buildExportEvent(it)
+            when (it.state) {
+                EventState.RUNNING -> events.add(re)
+                EventState.ERROR -> events.add(re)
+                else -> {
+                }
+            }
+        }
+    }
+
+    private fun collectAllEvents() {
+        UiManager.getEventStore().log.forEach { it ->
+            val re = buildExportEvent(it)
+            events.add(re)
+        }
+    }
+
+    fun open() {
+        val format = mutableListOf<StringPair>()
+        format.add(StringPair("CSV", "CSV"))
+        format.add(StringPair("JSON", "JSON"))
+        formItems.add(FormItem("Format", ValueType.SIMPLE_SELECT, format))
+        val filter = mutableListOf<StringPair>()
+        filter.add(StringPair("NONE", "No Filter"))
+        filter.add(StringPair("REPLAY", "For Replay"))
+        filter.add(StringPair("UNFINISHED", "Unfinished"))
+        formItems.add(FormItem("Filter", ValueType.SIMPLE_SELECT, filter))
+
+        form = RoDialog(caption = "Export", items = formItems, command = this)
+        form.open()
+    }
+
+    private fun asCsv(events: MutableList<ReplayEvent>): String {
+        val del = ";"
+        val nl = "\n"
+        var csv = "URL$del STATE$del METHOD$del REQUEST$del START$del DURATION$nl"
+        events.forEach { e ->
+            csv += e.url + del
+            csv += e.state + del
+            csv += e.method + del
+            csv += e.request + del
+            csv += e.start + del
+            csv += e.duration.toString() + nl
+        }
+        return csv
+    }
+
+    private fun buildExportEvent(logEntry: LogEntry): ReplayEvent {
+        return ReplayEvent(
+                url = logEntry.url,
+                method = logEntry.method!!,
+                request = logEntry.request,
+                state = logEntry.state.toString(),
+                start = logEntry.createdAt.toISOString() ,
+                duration = logEntry.duration,
+                response = logEntry.response
+        )
+    }
+
+}
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/LoginPrompt.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/LoginPrompt.kt
index e11e5a7..628057b 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/LoginPrompt.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/ui/dialog/LoginPrompt.kt
@@ -20,15 +20,12 @@ package org.apache.isis.client.kroviz.ui.dialog
 
 import io.kvision.form.text.Password
 import io.kvision.form.text.Text
-import kotlinx.browser.document
-import kotlinx.browser.window
 import org.apache.isis.client.kroviz.to.Link
 import org.apache.isis.client.kroviz.to.ValueType
 import org.apache.isis.client.kroviz.ui.core.Constants
 import org.apache.isis.client.kroviz.ui.core.FormItem
 import org.apache.isis.client.kroviz.ui.core.RoDialog
 import org.apache.isis.client.kroviz.ui.core.UiManager
-import org.apache.isis.client.kroviz.utils.Point
 
 class LoginPrompt : Command() {
 
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
index 5a00a3c..b02958c 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/IconManager.kt
@@ -30,92 +30,93 @@ object IconManager {
 
     /* Merge with configuration values*/
     private val word2Icon = mapOf(
-            "About" to "lightbulb-o",
-            "Actions" to "ellipsis-v",
-            "All" to "asterisk",
-            "Basic" to "minus-circle",
-            "Blobs" to "cloud",
-            "Burger" to "bars",
-            "Chart" to "magic",
-            "Close" to "times",
-            "Collections" to "list",
-            "Compare" to "balance-scale",
-            "Configuration" to "wrench",
-            "Connect" to "plug",
-            "Console" to "terminal",
-            "Create" to "plus",
-            "Css" to "css3",
-            "Dates" to "calendar",
-            "Debug" to "bug",
-            "Delete" to "trash",
-            "Demo" to "eye",
-            "Details" to "info-circle",
-            "Described" to "tag",
-            "Diagram" to "project-diagram",
-            "Download" to "download",
-            "Factory" to "industry",
-            "Featured" to "keyboard",
-            "Featured Types" to "keyboard",
-            "Edit" to "pencil",
-            "Error Handling" to "bug",
-            "Error" to "bug",
-            "Event" to "bolt",
-            "Experimental" to "flask",
-            "Export" to "file-export",
-            "Facet" to "gem",
-            "Find" to "search",
-            "Hidden" to "ban",
-            "Hierarchy" to "sitemap",
-            "History" to "history",
-            "Hsql" to "database",
-            "Isis" to "ankh",
-            "JEE/CDI" to "jedi",
-            "List" to "list",
-            "Location" to "map-marker",
-            "Log" to "history",
-            "Logout" to "user-times",
-            "Manager" to "manager",
-            "Map" to "map",
-            "Me" to "user",
-            "Message" to "envelope",
-            "More" to "plus-circle",
-            "Named" to "book",
-            "Notification" to "bell",
-            "Notifications" to "bell",
-            "Object" to "cube",
-            "Objects" to "cubes",
-            "OK" to "check",
-            "Open" to "book",
-            "Other" to "asterisk",
-            "Pin" to "map-pin",
-            "Primitives" to "hashtag",
-            "Properties" to "indent",
-            "Prototyping" to "object-group",
-            "Queen" to "chess-queen",
-            "Replay" to "fast-forward",
-            "Run" to "rocket",
-            "Save" to "file",
-            "Security" to "lock",
-            "Simple" to "cubes",
-            "Strings" to "font",
-            "Switch" to "power-off",
-            "Target" to "bullseye",
-            "Tab" to "folder",
-            "Text" to "font",
-            "Times" to "clock",
-            "Toast" to "bread-slice", //comment-alt-plus/minus/exclamation
-            "Toolbar" to "step-backward",
-            "Tooltips" to "comment-alt",
-            "Temporal" to "clock",
-            "Tenancy" to "lock",
-            "Trees" to "tree",
-            "Types" to "typewriter",
-            "Undo" to "undo",
-            "Unknown" to "question",
-            "Visualize" to "eye",
-            "Wikipedia" to "wikipedia-w",
-            "World" to "plane",
-            "Xml" to "code"
+        "About" to "lightbulb-o",
+        "Actions" to "ellipsis-v",
+        "All" to "asterisk",
+        "Basic" to "minus-circle",
+        "Blobs" to "cloud",
+        "Burger" to "bars",
+        "Chart" to "magic",
+        "Close" to "times",
+        "Collections" to "list",
+        "Compare" to "balance-scale",
+        "Configuration" to "wrench",
+        "Connect" to "plug",
+        "Console" to "terminal",
+        "Create" to "plus",
+        "Css" to "css3",
+        "Dates" to "calendar",
+        "Debug" to "bug",
+        "Delete" to "trash",
+        "Demo" to "eye",
+        "Details" to "info-circle",
+        "Described" to "tag",
+        "Diagram" to "project-diagram",
+        "Download" to "download",
+        "Factory" to "industry",
+        "Featured" to "keyboard",
+        "Featured Types" to "keyboard",
+        "Edit" to "pencil",
+        "Error Handling" to "bug",
+        "Error" to "bug",
+        "Event" to "bolt",
+        "Experimental" to "flask",
+        "Export" to "file-export",
+        "Facet" to "gem",
+        "Find" to "search",
+        "Hidden" to "ban",
+        "Hierarchy" to "sitemap",
+        "History" to "history",
+        "Hsql" to "database",
+        "Import" to "file-import",
+        "Isis" to "ankh",
+        "JEE/CDI" to "jedi",
+        "List" to "list",
+        "Location" to "map-marker",
+        "Log" to "history",
+        "Logout" to "user-times",
+        "Manager" to "manager",
+        "Map" to "map",
+        "Me" to "user",
+        "Message" to "envelope",
+        "More" to "plus-circle",
+        "Named" to "book",
+        "Notification" to "bell",
+        "Notifications" to "bell",
+        "Object" to "cube",
+        "Objects" to "cubes",
+        "OK" to "check",
+        "Open" to "book",
+        "Other" to "asterisk",
+        "Pin" to "map-pin",
+        "Primitives" to "hashtag",
+        "Properties" to "indent",
+        "Prototyping" to "object-group",
+        "Queen" to "chess-queen",
+        "Replay" to "fast-forward",
+        "Run" to "rocket",
+        "Save" to "file",
+        "Security" to "lock",
+        "Simple" to "cubes",
+        "Strings" to "font",
+        "Switch" to "power-off",
+        "Target" to "bullseye",
+        "Tab" to "folder",
+        "Text" to "font",
+        "Times" to "clock",
+        "Toast" to "bread-slice", //comment-alt-plus/minus/exclamation
+        "Toolbar" to "step-backward",
+        "Tooltips" to "comment-alt",
+        "Temporal" to "clock",
+        "Tenancy" to "lock",
+        "Trees" to "tree",
+        "Types" to "typewriter",
+        "Undo" to "undo",
+        "Unknown" to "question",
+        "Visualize" to "eye",
+        "Wikipedia" to "wikipedia-w",
+        "World" to "plane",
+        "Xml" to "code"
     )
 
     @OptIn(ExperimentalStdlibApi::class)
diff --git a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt
index b52d456..e2e77e8 100644
--- a/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt
+++ b/incubator/clients/kroviz/src/main/kotlin/org/apache/isis/client/kroviz/utils/StringUtils.kt
@@ -227,7 +227,7 @@ object StringUtils {
         val signature = Constants.restInfix
         if (url.contains(signature)) {
             // strip off protocol, host, port
-            val protocolHostPort = UiManager.getUrl()
+            val protocolHostPort = UiManager.getBaseUrl()
             result = result.replace(protocolHostPort + signature, "")
             result = StringUtils.removeHexCode(result)
         }
diff --git a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt
index dd37408..9536a9d 100644
--- a/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt
+++ b/incubator/clients/kroviz/src/test/kotlin/org/apache/isis/client/kroviz/util/StringUtilsTest.kt
@@ -15,7 +15,7 @@ class StringUtilsTest {
         val url = "http://localhost:8080/restful/domain-types/demo.JavaLangStrings/collections/entities"
 
         // when
-        val protocolHostPort = UiManager.getUrl()
+        val protocolHostPort = UiManager.getBaseUrl()
         // then
         assertTrue(protocolHostPort.startsWith("http://"))