src/main/kotlin/de/uapcore/lightpit/viewmodel/NavMenus.kt

Mon, 30 Oct 2023 14:44:36 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 30 Oct 2023 14:44:36 +0100
changeset 292
703591e739f4
parent 227
f0ede8046b59
permissions
-rw-r--r--

add possibility to show issues w/o version or component - fixes #335

     1 /*
     2  * Copyright 2021 Mike Becker. All rights reserved.
     3  *
     4  * Redistribution and use in source and binary forms, with or without
     5  * modification, are permitted provided that the following conditions are met:
     6  *
     7  * 1. Redistributions of source code must retain the above copyright
     8  * notice, this list of conditions and the following disclaimer.
     9  *
    10  * 2. Redistributions in binary form must reproduce the above copyright
    11  * notice, this list of conditions and the following disclaimer in the
    12  * documentation and/or other materials provided with the distribution.
    13  *
    14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    17  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
    18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
    20  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    21  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    22  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    24  */
    26 package de.uapcore.lightpit.viewmodel
    28 import de.uapcore.lightpit.OptionalPathInfo
    29 import de.uapcore.lightpit.entities.Component
    30 import de.uapcore.lightpit.entities.Project
    31 import de.uapcore.lightpit.entities.Version
    32 import de.uapcore.lightpit.types.VersionStatus
    34 class NavMenuEntry(
    35     val level: Int,
    36     val caption: String,
    37     val href: String,
    38     val title: String = "",
    39     val active: Boolean = false,
    40     val resolveCaption: Boolean = false,
    41     val iconColor: String? = null
    42 ) {
    43     val iconUseCssClass = iconColor != null && !iconColor.startsWith("#")
    44 }
    46 class NavMenu(val entries: List<NavMenuEntry>)
    48 fun projectNavMenu(projects: List<Project>) = NavMenu(
    49     sequence {
    50         for (project in projects) {
    51             yield(
    52                 NavMenuEntry(
    53                     level = 0,
    54                     caption = project.name,
    55                     href = "projects/${project.node}",
    56                 )
    57             )
    58         }
    59     }.toList()
    60 )
    62 fun projectNavMenu(projects: List<Project>, pathInfos: PathInfos) = NavMenu(
    63     sequence {
    64         val cnode = pathInfos.componentInfo.node
    65         val vnode = pathInfos.versionInfo.node
    66         for (project in projects) {
    67             val active = project == pathInfos.projectInfo.project
    68             yield(
    69                 NavMenuEntry(
    70                     level = 0,
    71                     caption = project.name,
    72                     href = "projects/${project.node}",
    73                     active = active
    74                 )
    75             )
    76             if (active) {
    77                 yield(
    78                     NavMenuEntry(
    79                         level = 1,
    80                         caption = "navmenu.versions",
    81                         resolveCaption = true,
    82                         href = "projects/${project.node}/versions/"
    83                     )
    84                 )
    85                 yield(
    86                     NavMenuEntry(
    87                         level = 2,
    88                         caption = "navmenu.all",
    89                         resolveCaption = true,
    90                         href = "projects/${project.node}/issues/-/${cnode}/",
    91                         iconColor = "#000000",
    92                         active = vnode == "-",
    93                     )
    94                 )
    95                 yield(
    96                     NavMenuEntry(
    97                         level = 2,
    98                         caption = "navmenu.none",
    99                         resolveCaption = true,
   100                         href = "projects/${project.node}/issues/~/${cnode}/",
   101                         iconColor = "#000000",
   102                         active = vnode == "~",
   103                     )
   104                 )
   105                 for (version in pathInfos.projectInfo.versions) {
   106                     if (version.status == VersionStatus.Deprecated && vnode != version.node) continue
   107                     yield(
   108                         NavMenuEntry(
   109                             level = 2,
   110                             caption = version.name,
   111                             title = "version.status.${version.status}",
   112                             href = "projects/${project.node}/issues/${version.node}/${cnode}/",
   113                             iconColor = "version-${version.status}",
   114                             active = version.node == vnode
   115                         )
   116                     )
   117                 }
   118                 yield(
   119                     NavMenuEntry(
   120                         level = 1,
   121                         caption = "navmenu.components",
   122                         resolveCaption = true,
   123                         href = "projects/${project.node}/components/"
   124                     )
   125                 )
   126                 yield(
   127                     NavMenuEntry(
   128                         level = 2,
   129                         caption = "navmenu.all",
   130                         resolveCaption = true,
   131                         href = "projects/${project.node}/issues/${vnode}/-/",
   132                         iconColor = "#000000",
   133                         active = cnode == "-",
   134                     )
   135                 )
   136                 yield(
   137                     NavMenuEntry(
   138                         level = 2,
   139                         caption = "navmenu.none",
   140                         resolveCaption = true,
   141                         href = "projects/${project.node}/issues/${vnode}/~/",
   142                         iconColor = "#000000",
   143                         active = cnode == "~",
   144                     )
   145                 )
   146                 for (component in pathInfos.projectInfo.components) {
   147                     if (!component.active && component.node != cnode) continue
   148                     yield(
   149                         NavMenuEntry(
   150                             level = 2,
   151                             caption = component.name,
   152                             href = "projects/${project.node}/issues/${vnode}/${component.node}/",
   153                             iconColor = "${component.color}",
   154                             active = component.node == cnode
   155                         )
   156                     )
   157                 }
   158             }
   159         }
   160     }.toList()
   161 )

mercurial