-
Notifications
You must be signed in to change notification settings - Fork 169
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Guice Tab to Misk admin dashboard
The new Guice tab includes a searchable table to more easily look up a type and find where it is being bound and other relevant DI metadata. ![Screenshot 2024-07-25 at 11 11 31 AM](https://github.com/user-attachments/assets/eb64cb0d-07ec-4a86-ae65-5226bab88083) --------- Co-authored-by: David Amar <[email protected]> GitOrigin-RevId: 578885bb01f8e9d1d3529d54c23bcfeb9ce57bd7
- Loading branch information
1 parent
e019b30
commit 918a819
Showing
9 changed files
with
326 additions
and
113 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
19 changes: 19 additions & 0 deletions
19
misk-admin/src/main/kotlin/misk/web/metadata/guice/GuiceDashboardTabModule.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package misk.web.metadata.guice | ||
|
||
import misk.inject.KAbstractModule | ||
import misk.web.WebActionModule | ||
import misk.web.dashboard.AdminDashboard | ||
import misk.web.dashboard.AdminDashboardAccess | ||
import misk.web.dashboard.DashboardModule | ||
|
||
class GuiceDashboardTabModule: KAbstractModule() { | ||
override fun configure() { | ||
install(WebActionModule.create<GuiceTabIndexAction>()) | ||
install(DashboardModule.createHotwireTab<AdminDashboard, AdminDashboardAccess>( | ||
slug = "guice", | ||
urlPathPrefix = GuiceTabIndexAction.PATH, | ||
menuCategory = "Container Admin", | ||
menuLabel = "Guice", | ||
)) | ||
} | ||
} |
119 changes: 119 additions & 0 deletions
119
misk-admin/src/main/kotlin/misk/web/metadata/guice/GuiceTabIndexAction.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
package misk.web.metadata.guice | ||
|
||
import jakarta.inject.Inject | ||
import jakarta.inject.Singleton | ||
import kotlinx.html.InputType | ||
import kotlinx.html.div | ||
import kotlinx.html.h1 | ||
import kotlinx.html.input | ||
import kotlinx.html.script | ||
import kotlinx.html.table | ||
import kotlinx.html.tbody | ||
import kotlinx.html.td | ||
import kotlinx.html.th | ||
import kotlinx.html.thead | ||
import kotlinx.html.tr | ||
import misk.web.Get | ||
import misk.web.ResponseContentType | ||
import misk.web.actions.WebAction | ||
import misk.web.dashboard.AdminDashboardAccess | ||
import misk.web.mediatype.MediaTypes | ||
import misk.web.v2.DashboardPageLayout | ||
|
||
@Singleton | ||
class GuiceTabIndexAction @Inject constructor( | ||
private val dashboardPageLayout: DashboardPageLayout, | ||
private val guiceMetadataProvider: GuiceMetadataProvider, | ||
) : WebAction { | ||
@Get(PATH) | ||
@ResponseContentType(MediaTypes.TEXT_HTML) | ||
@AdminDashboardAccess | ||
fun get(): String = dashboardPageLayout | ||
.newBuilder() | ||
.headBlock { | ||
val controllers = listOf( | ||
"search_bar_controller", | ||
) | ||
controllers.forEach { | ||
script { | ||
type = "module" | ||
src = "/static/controllers/$it.js" | ||
} | ||
} | ||
} | ||
.build { _, _, _ -> | ||
val registrations = guiceMetadataProvider.get().guice.bindingMetadata | ||
|
||
val checkIcon = "✔" | ||
|
||
div("p-4 sm:p-6 lg:p-8") { | ||
h1("text-3xl font-medium mb-8") { | ||
+"""Guice""" | ||
} | ||
div { | ||
attributes["data-controller"] = "search-bar" | ||
div { | ||
input( | ||
type = InputType.search, | ||
classes = "flex h-10 w-full bg-gray-100 hover:bg-gray-200 duration-500 border-none rounded-lg text-sm" | ||
) { | ||
attributes["data-action"] = "input->search-bar#search" | ||
placeholder = "Search" | ||
} | ||
} | ||
div("mt-8 flow-root") { | ||
div("-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8") { | ||
div("inline-block min-w-full py-2 align-middle sm:px-6 lg:px-8") { | ||
table("min-w-full divide-y divide-gray-300") { | ||
thead { | ||
tr { | ||
th(classes = "px-3 py-3.5 text-left text-sm font-semibold text-gray-900") { | ||
+"""Type""" | ||
} | ||
th(classes = "px-3 py-3.5 text-left text-sm font-semibold text-gray-900") { | ||
+"""Source""" | ||
} | ||
th(classes = "px-3 py-3.5 text-left text-sm font-semibold text-gray-900") { | ||
+"""Annotation""" | ||
} | ||
th(classes = "px-3 py-3.5 text-left text-sm font-semibold text-gray-900") { | ||
+"""Scope""" | ||
} | ||
th(classes = "px-3 py-3.5 text-left text-sm font-semibold text-gray-900") { | ||
+"""Provider""" | ||
} | ||
} | ||
} | ||
tbody("divide-y divide-gray-200") { | ||
registrations.map { | ||
tr("registration") { | ||
td("whitespace-normal px-3 py-4 text-sm") { | ||
+it.type | ||
} | ||
td("whitespace-normal px-3 py-4 text-sm") { | ||
+it.source | ||
} | ||
td( | ||
"whitespace-normal px-3 py-4 text-sm" | ||
) { + (it.annotation ?: "") } | ||
td("whitespace-normal px-3 py-4 text-sm") { | ||
+ (it.scope ?: "") | ||
} | ||
td("whitespace-normal px-3 py-4 text-sm") { | ||
+it.provider | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
companion object { | ||
const val PATH = "/_admin/guice/" | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
misk-admin/src/main/resources/web/static/controllers/search_bar_controller.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import { Application, Controller } from "../cache/stimulus/3.1.0/stimulus.min.js"; | ||
window.Stimulus = Application.start(); | ||
|
||
Stimulus.register("search-bar", class extends Controller { | ||
search(ev) { | ||
const input = ev.target.value.toLowerCase(); | ||
document.querySelectorAll(".registration").forEach(registration => { | ||
let hide = true; | ||
registration.querySelectorAll("*").forEach(col => { | ||
if (col.textContent.toLowerCase().includes(input)) { | ||
hide = false; | ||
} | ||
}); | ||
if (hide) { | ||
registration.classList.contains("hidden") || registration.classList.add("hidden"); | ||
} else { | ||
registration.classList.remove("hidden"); | ||
} | ||
}) | ||
} | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.