diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt index 0883a83b657..01ad95b3f4f 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQToolWindowFactory.kt @@ -20,6 +20,8 @@ import software.aws.toolkits.jetbrains.core.credentials.ToolkitConnectionManager import software.aws.toolkits.jetbrains.core.credentials.pinning.QConnection 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.BannerContent +import software.aws.toolkits.jetbrains.core.notifications.NotificationDismissalState import software.aws.toolkits.jetbrains.core.notifications.NotificationPanel import software.aws.toolkits.jetbrains.core.notifications.ProcessNotificationsBase import software.aws.toolkits.jetbrains.core.webview.BrowserState @@ -32,6 +34,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.profile.QRegionProfileSe import software.aws.toolkits.jetbrains.utils.isQConnected import software.aws.toolkits.jetbrains.utils.isQExpired import software.aws.toolkits.jetbrains.utils.isQWebviewsAvailable +import software.aws.toolkits.jetbrains.utils.isRunningOnRemoteBackend +import software.aws.toolkits.resources.AmazonQBundle import software.aws.toolkits.resources.message import software.aws.toolkits.telemetry.FeatureId import java.awt.event.ComponentAdapter @@ -42,7 +46,18 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware { override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) { val mainPanel = BorderLayoutPanel() val qPanel = Wrapper() - val notificationPanel = NotificationPanel() + val notificationPanel = NotificationPanel().apply { + if (isRunningOnRemoteBackend() && !NotificationDismissalState.getInstance().isDismissed(REMOTE_RESIZE_NOTIFICATION_ID)) { + updateNotificationPanel( + BannerContent( + REMOTE_RESIZE_NOTIFICATION_ID, + AmazonQBundle.message("amazonq.resize.panel"), + // message is not used for banner + "", + ) + ) + } + } mainPanel.addToTop(notificationPanel) mainPanel.add(qPanel) @@ -161,5 +176,6 @@ class AmazonQToolWindowFactory : ToolWindowFactory, DumbAware { private val LOG = getLogger() const val WINDOW_ID = AMAZON_Q_WINDOW_ID private const val MINIMUM_TOOLWINDOW_WIDTH = 325 + private const val REMOTE_RESIZE_NOTIFICATION_ID = "resize.amazon.q.toolwindow.if.remote" } } diff --git a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties index 761a500ca06..2a5f5b647ca 100644 --- a/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties +++ b/plugins/amazonq/shared/jetbrains-community/resources/software/aws/toolkits/resources/AmazonQBundle.properties @@ -11,6 +11,7 @@ amazonq.getLogs.tooltip.text=Show Logs amazonq.logs.error=Cannot retrieve logs. Please try Help-> Collect Logs and Diagnostic data amazonq.logs.warning=Log files may contain sensitive information such as account IDs, resource names, and other data. Please be careful when sharing these logs. amazonq.refresh.panel=Refresh Chat Session +amazonq.resize.panel=Please resize your IDE if the chat box isn't visible amazonq.title=Amazon Q amazonq.workspace.settings.open.prompt=Workspace index is now enabled. You can disable it from Amazon Q settings. action.q.manage.subscription.text=Manage Q Developer Pro Subscription diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt index ba18c46d60e..aece5fe9a25 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/CustomizeNotificationsUi.kt @@ -123,8 +123,9 @@ data class NotificationActionList( ) data class BannerContent( + val id: String, val title: String, val message: String, - val actions: List, - val id: String, + val actions: List = emptyList(), + val severity: NotificationSeverity = NotificationSeverity.INFO, ) diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt index e9b6564adc8..79276f25c1c 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/NotificationPanel.kt @@ -3,12 +3,10 @@ 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() @@ -23,15 +21,21 @@ class NotificationPanel : BorderLayoutPanel() { private fun removeNotificationPanel(notificationId: String) = runInEdt { BannerNotificationService.getInstance().removeNotification(notificationId) NotificationDismissalState.getInstance().dismissNotification(notificationId) - wrapper.removeAll() + wrapper.setContent(null) } fun updateNotificationPanel(bannerContent: BannerContent) { - val panel = EditorNotificationPanel() + val panel = EditorNotificationPanel( + when (bannerContent.severity) { + NotificationSeverity.CRITICAL -> EditorNotificationPanel.Status.Error + NotificationSeverity.WARNING -> EditorNotificationPanel.Status.Warning + NotificationSeverity.INFO -> EditorNotificationPanel.Status.Info + } + ) panel.text = bannerContent.title - panel.icon(AllIcons.General.Error) + val panelWithActions = NotificationManager.buildBannerPanel(panel, bannerContent.actions) - panelWithActions.createActionLabel(AwsCoreBundle.message("general.dismiss")) { + panelWithActions.setCloseAction { removeNotificationPanel(bannerContent.id) } diff --git a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/ProcessNotificationsBase.kt b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/ProcessNotificationsBase.kt index 1313f2b6871..cab722a4426 100644 --- a/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/ProcessNotificationsBase.kt +++ b/plugins/core/jetbrains-community/src/software/aws/toolkits/jetbrains/core/notifications/ProcessNotificationsBase.kt @@ -88,7 +88,7 @@ class ProcessNotificationsBase( if (shouldShow) { LOG.info { "Showing notification with id: ${notificationData.id}" } val notificationContent = notificationData.content.locale - val severity = notificationData.severity + val severity = checkSeverity(notificationData.severity) val followupActions = NotificationManager.createActions( project, notificationData.actions, @@ -99,11 +99,11 @@ class ProcessNotificationsBase( notificationContent.title, notificationContent.description, NotificationManager.buildNotificationActions(followupActions), - checkSeverity(severity), + severity, notificationData.id ) - if (severity == "Critical") { - val bannerContent = BannerContent(notificationContent.title, notificationContent.description, followupActions, notificationData.id) + if (severity == NotificationSeverity.CRITICAL) { + val bannerContent = BannerContent(notificationData.id, notificationContent.title, notificationContent.description, followupActions, severity) BannerNotificationService.getInstance().addNotification(notificationData.id, bannerContent) notifyListenerForNotification(bannerContent) }