Mon, 30 Oct 2023 14:44:36 +0100
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 )