Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
c3cc2bf
Display toast notifications with actions
manodnyab Nov 13, 2024
09729c7
Condition matcher for displaying notifications
manodnyab Nov 15, 2024
885f3f0
Show notification banner
manodnyab Nov 18, 2024
f0aca38
feedback 1
manodnyab Nov 19, 2024
e909a0e
Modified deserialization cases and added tests
manodnyab Nov 20, 2024
5a84e39
Merge branch 'feature/ideNotifs' into manodnyb/checkRulesForNotificat…
manodnyab Nov 20, 2024
56c1888
not required file change
manodnyab Nov 20, 2024
a981227
Merge remote-tracking branch 'origin/manodnyb/checkRulesForNotificati…
manodnyab Nov 20, 2024
682897f
feedback 1
manodnyab Nov 20, 2024
adb6ec7
resolved conflicts
manodnyab Nov 20, 2024
dbfcefc
feedback 1
manodnyab Nov 20, 2024
823ea7f
Merge remote-tracking branch 'origin/feature/ideNotifs' into manodnyb…
manodnyab Nov 20, 2024
218c8ed
modified the base class
manodnyab Nov 20, 2024
b684a01
merge conflicts resolved
manodnyab Nov 21, 2024
368fd25
merge conflicts resolved
manodnyab Nov 21, 2024
57fb2ef
rearranged call site
manodnyab Nov 21, 2024
a5126d1
show notifications when panel is opened
manodnyab Nov 21, 2024
22f9438
resolved merge conflicts
manodnyab Nov 21, 2024
87ec1d9
fixed tests
manodnyab Nov 21, 2024
24a2f65
Merge branch 'feature/ideNotifs' into manodnyb/addNotificationBanner
manodnyab Nov 21, 2024
78f8c6b
detekt
manodnyab Nov 21, 2024
bfc1077
Merge remote-tracking branch 'origin/manodnyb/addNotificationBanner' …
manodnyab Nov 21, 2024
1a83a40
feedback
manodnyab Nov 22, 2024
9e8b0af
Merge branch 'feature/ideNotifs' into manodnyb/addNotificationBanner
manodnyab Nov 22, 2024
1b12854
convert panels into wrappers
manodnyab Nov 22, 2024
e7d8594
Merge remote-tracking branch 'origin/manodnyb/addNotificationBanner' …
manodnyab Nov 22, 2024
bbf6779
fixed test
manodnyab Nov 22, 2024
a8fa482
Merge branch 'feature/ideNotifs' into manodnyb/addNotificationBanner
manodnyab Nov 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
import com.intellij.openapi.wm.ToolWindow
import com.intellij.openapi.wm.ToolWindowFactory
import com.intellij.openapi.wm.ex.ToolWindowEx
import com.intellij.ui.content.Content
import com.intellij.ui.content.ContentManager
import com.intellij.ui.components.panels.Wrapper
import com.intellij.util.ui.components.BorderLayoutPanel
import software.aws.toolkits.core.utils.debug
import software.aws.toolkits.core.utils.getLogger
import software.aws.toolkits.jetbrains.core.credentials.AwsBearerTokenConnection
Expand All @@ -22,6 +22,8 @@
import software.aws.toolkits.jetbrains.core.credentials.sono.Q_SCOPES
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenAuthState
import software.aws.toolkits.jetbrains.core.credentials.sso.bearer.BearerTokenProviderListener
import software.aws.toolkits.jetbrains.core.notifications.NotificationPanel
import software.aws.toolkits.jetbrains.core.notifications.ProcessNotificationsBase
import software.aws.toolkits.jetbrains.core.webview.BrowserState
import software.aws.toolkits.jetbrains.services.amazonq.QWebviewPanel
import software.aws.toolkits.jetbrains.services.amazonq.RefreshQChatPanelButtonPressedListener
Expand All @@ -35,7 +37,21 @@
import java.awt.event.ComponentEvent

class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware {

override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
val mainPanel = BorderLayoutPanel()
val qPanel = Wrapper()
val notificationPanel = NotificationPanel()

Check warning on line 44 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L42-L44

Added lines #L42 - L44 were not covered by tests

mainPanel.addToTop(notificationPanel)
mainPanel.add(qPanel)
val notifListener = ProcessNotificationsBase.getInstance(project)
notifListener.addListenerForNotification { bannerContent ->
runInEdt {
notificationPanel.updateNotificationPanel(bannerContent)
}
}

Check warning on line 53 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L46-L53

Added lines #L46 - L53 were not covered by tests

if (toolWindow is ToolWindowEx) {
val actionManager = ActionManager.getInstance()
toolWindow.setTitleActions(listOf(actionManager.getAction("aws.q.toolwindow.titleBar")))
Expand All @@ -46,7 +62,7 @@
ToolkitConnectionManagerListener.TOPIC,
object : ToolkitConnectionManagerListener {
override fun activeConnectionChanged(newConnection: ToolkitConnection?) {
onConnectionChanged(project, newConnection, toolWindow)
onConnectionChanged(project, newConnection, qPanel)

Check warning on line 65 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L65

Added line #L65 was not covered by tests
}
}
)
Expand All @@ -56,8 +72,7 @@
object : RefreshQChatPanelButtonPressedListener {
override fun onRefresh() {
runInEdt {
contentManager.removeAllContents(true)
prepareChatContent(project, contentManager)
prepareChatContent(project, qPanel)

Check warning on line 75 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L75

Added line #L75 was not covered by tests
}
}
}
Expand All @@ -68,43 +83,37 @@
object : BearerTokenProviderListener {
override fun onChange(providerId: String, newScopes: List<String>?) {
if (ToolkitConnectionManager.getInstance(project).connectionStateForFeature(QConnection.getInstance()) == BearerTokenAuthState.AUTHORIZED) {
val content = contentManager.factory.createContent(AmazonQToolWindow.getInstance(project).component, null, false).also {
it.isCloseable = true
it.isPinnable = true
}
val qComponent = AmazonQToolWindow.getInstance(project).component

Check warning on line 86 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L86

Added line #L86 was not covered by tests

runInEdt {
contentManager.removeAllContents(true)
contentManager.addContent(content)
qPanel.setContent(qComponent)

Check warning on line 89 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L89

Added line #L89 was not covered by tests
}
}
}
}
)

val content = prepareChatContent(project, contentManager)
prepareChatContent(project, qPanel)

Check warning on line 96 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L96

Added line #L96 was not covered by tests

val content = contentManager.factory.createContent(mainPanel, null, false).also {
it.isCloseable = true
it.isPinnable = true
}

Check warning on line 101 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L98-L101

Added lines #L98 - L101 were not covered by tests
toolWindow.activate(null)
contentManager.setSelectedContent(content)
contentManager.addContent(content)

Check warning on line 103 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L103

Added line #L103 was not covered by tests
}

private fun prepareChatContent(
project: Project,
contentManager: ContentManager,
): Content {
qPanel: Wrapper,
) {
val component = if (isQConnected(project) && !isQExpired(project)) {
AmazonQToolWindow.getInstance(project).component
} else {
QWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.AmazonQ))
QWebviewPanel.getInstance(project).component
}

val content = contentManager.factory.createContent(component, null, false).also {
it.isCloseable = true
it.isPinnable = true
}
contentManager.addContent(content)
return content
qPanel.setContent(component)

Check warning on line 116 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L116

Added line #L116 was not covered by tests
}

override fun init(toolWindow: ToolWindow) {
Expand All @@ -125,8 +134,7 @@

override fun shouldBeAvailable(project: Project): Boolean = isQWebviewsAvailable()

private fun onConnectionChanged(project: Project, newConnection: ToolkitConnection?, toolWindow: ToolWindow) {
val contentManager = toolWindow.contentManager
private fun onConnectionChanged(project: Project, newConnection: ToolkitConnection?, qPanel: Wrapper) {
val isNewConnectionForQ = newConnection?.let {
(it as? AwsBearerTokenConnection)?.let { conn ->
val scopeShouldHave = Q_SCOPES
Expand All @@ -151,15 +159,8 @@
LOG.debug { "returning login window; no Q connection found" }
QWebviewPanel.getInstance(project).component
}

val content = contentManager.factory.createContent(component, null, false).also {
it.isCloseable = true
it.isPinnable = true
}

runInEdt {
contentManager.removeAllContents(true)
contentManager.addContent(content)
qPanel.setContent(component)

Check warning on line 163 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt#L163

Added line #L163 was not covered by tests
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.services.amazonq.toolwindow

import com.intellij.openapi.project.Project
import com.intellij.ui.components.panels.Wrapper
import com.intellij.util.ui.components.BorderLayoutPanel
import software.aws.toolkits.core.utils.error
import software.aws.toolkits.core.utils.getLogger
import software.aws.toolkits.jetbrains.core.webview.BrowserState
import software.aws.toolkits.jetbrains.services.amazonq.QWebviewPanel
import software.aws.toolkits.jetbrains.utils.isQConnected
import software.aws.toolkits.jetbrains.utils.isQExpired
import software.aws.toolkits.telemetry.FeatureId
import javax.swing.JComponent

class OuterAmazonQPanel(val project: Project) : BorderLayoutPanel() {

Check warning on line 18 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Unused symbol

Class "OuterAmazonQPanel" is never used

Check warning

Code scanning / QDJVMC

Unused symbol Warning

Class "OuterAmazonQPanel" is never used
private val wrapper = Wrapper()
init {
isOpaque = false
addToCenter(wrapper)

Check warning on line 22 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt#L18-L22

Added lines #L18 - L22 were not covered by tests
val component = if (isQConnected(project) && !isQExpired(project)) {
AmazonQToolWindow.getInstance(project).component

Check warning on line 24 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt#L24

Added line #L24 was not covered by tests
} else {
QWebviewPanel.getInstance(project).browser?.prepareBrowser(BrowserState(FeatureId.AmazonQ))
QWebviewPanel.getInstance(project).component

Check warning on line 27 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt#L27

Added line #L27 was not covered by tests
}
updateQPanel(component)
}

Check warning on line 30 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt#L29-L30

Added lines #L29 - L30 were not covered by tests

fun updateQPanel(content: JComponent) {

Check notice on line 32 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt

View workflow job for this annotation

GitHub Actions / Qodana Community for JVM

Class member can have 'private' visibility

Function 'updateQPanel' could be private

Check notice

Code scanning / QDJVMC

Class member can have 'private' visibility Note

Function 'updateQPanel' could be private
try {
wrapper.setContent(content)
} catch (e: Exception) {
getLogger<OuterAmazonQPanel>().error { "Error while creating window" }

Check warning on line 36 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt#L33-L36

Added lines #L33 - L36 were not covered by tests
}
}

Check warning on line 38 in plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/OuterAmazonQPanel.kt#L38

Added line #L38 was not covered by tests
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ object AwsToolkit {

const val GITHUB_URL = "https://github.com/aws/aws-toolkit-jetbrains"
const val AWS_DOCS_URL = "https://docs.aws.amazon.com/console/toolkit-for-jetbrains"
const val GITHUB_CHANGELOG = "https://github.com/aws/aws-toolkit-jetbrains/blob/main/CHANGELOG.md"
}

data class PluginInfo(val id: String, val name: String) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,109 @@

package software.aws.toolkits.jetbrains.core.notifications

import com.intellij.icons.AllIcons
import com.intellij.ide.BrowserUtil
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.Messages
import com.intellij.ui.EditorNotificationPanel
import software.aws.toolkits.jetbrains.AwsToolkit
import software.aws.toolkits.resources.AwsCoreBundle

fun checkSeverity(notificationSeverity: String): NotificationSeverity = when (notificationSeverity) {
"Critical" -> NotificationSeverity.CRITICAL
"Warning" -> NotificationSeverity.WARNING
"Info" -> NotificationSeverity.INFO
else -> NotificationSeverity.INFO
}

// TODO: Add actions that can be performed from the notifications here
object NotificationManager {
fun createActions(
project: Project,
followupActions: List<NotificationFollowupActions>?,
message: String,
title: String,

): List<NotificationActionList> = buildList {
var url: String? = null
followupActions?.forEach { action ->
if (action.type == "ShowUrl") {
url = action.content.locale.url

Check warning on line 34 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L34

Added line #L34 was not covered by tests
}

if (action.type == "UpdateExtension") {
add(
NotificationActionList(AwsCoreBundle.message("notification.update")) {
// TODO: Add update logic
}

Check warning on line 41 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L40-L41

Added lines #L40 - L41 were not covered by tests
)
}

if (action.type == "OpenChangelog") {
add(
NotificationActionList(AwsCoreBundle.message("notification.changelog")) {
BrowserUtil.browse(AwsToolkit.GITHUB_CHANGELOG)
}

Check warning on line 49 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L46-L49

Added lines #L46 - L49 were not covered by tests
)
}
}
add(
NotificationActionList(AwsCoreBundle.message("general.more_dialog")) {
if (url == null) {
Messages.showYesNoDialog(
project,
message,
title,
AwsCoreBundle.message("general.acknowledge"),
AwsCoreBundle.message("general.cancel"),
AllIcons.General.Error

Check warning on line 62 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L56-L62

Added lines #L56 - L62 were not covered by tests
)
} else {
val link = url ?: AwsToolkit.GITHUB_URL
val openLink = Messages.showYesNoDialog(
project,
message,
title,
AwsCoreBundle.message(AwsCoreBundle.message("notification.learn_more")),
AwsCoreBundle.message("general.cancel"),
AllIcons.General.Error

Check warning on line 72 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L66-L72

Added lines #L66 - L72 were not covered by tests
)
if (openLink == 0) {
BrowserUtil.browse(link)

Check warning on line 75 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L75

Added line #L75 was not covered by tests
}
}
}

Check warning on line 78 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L78

Added line #L78 was not covered by tests
)
}

fun buildNotificationActions(actions: List<NotificationActionList>): List<AnAction> = actions.map { (title, block) ->
object : AnAction(title) {

Check warning on line 83 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L82-L83

Added lines #L82 - L83 were not covered by tests
override fun actionPerformed(e: AnActionEvent) {
block()
}
}
}

Check warning on line 88 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L85-L88

Added lines #L85 - L88 were not covered by tests

fun buildBannerPanel(panel: EditorNotificationPanel, actions: List<NotificationActionList>): EditorNotificationPanel {
actions.forEach { (actionTitle, block) ->
panel.createActionLabel(actionTitle) {
block()
}
}

Check warning on line 95 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L91-L95

Added lines #L91 - L95 were not covered by tests

return panel

Check warning on line 97 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L97

Added line #L97 was not covered by tests
}
}

data class NotificationActionList(
val title: String,
val blockToExecute: () -> Unit,
)

data class BannerContent(
val title: String,
val message: String,
val actions: List<NotificationActionList>,
val id: String,

Check warning on line 110 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt#L106-L110

Added lines #L106 - L110 were not covered by tests
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Copyright 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

package software.aws.toolkits.jetbrains.core.notifications

import com.intellij.icons.AllIcons
import com.intellij.openapi.application.runInEdt
import com.intellij.ui.EditorNotificationPanel
import com.intellij.ui.components.panels.Wrapper
import com.intellij.util.ui.components.BorderLayoutPanel
import software.aws.toolkits.resources.AwsCoreBundle

class NotificationPanel : BorderLayoutPanel() {
private val wrapper = Wrapper()
init {
isOpaque = false
addToCenter(wrapper)
ProcessNotificationsBase.showBannerNotification.forEach {
updateNotificationPanel(it.value)
}
}

Check warning on line 21 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt#L13-L21

Added lines #L13 - L21 were not covered by tests

private fun removeNotificationPanel(notificationId: String) = runInEdt {
ProcessNotificationsBase.showBannerNotification.remove(notificationId) // TODO: add id to dismissed notification list
wrapper.removeAll()
}

Check warning on line 26 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt#L23-L26

Added lines #L23 - L26 were not covered by tests

fun updateNotificationPanel(bannerContent: BannerContent) {
val panel = EditorNotificationPanel()
panel.text = bannerContent.title
panel.icon(AllIcons.General.Error)
val panelWithActions = NotificationManager.buildBannerPanel(panel, bannerContent.actions)
panelWithActions.createActionLabel(AwsCoreBundle.message("general.dismiss")) {
removeNotificationPanel(bannerContent.id)
}

Check warning on line 35 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt#L29-L35

Added lines #L29 - L35 were not covered by tests

wrapper.setContent(panelWithActions)
}

Check warning on line 38 in plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt

View check run for this annotation

Codecov / codecov/patch

plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt#L37-L38

Added lines #L37 - L38 were not covered by tests
}
Loading
Loading