Skip to content

Commit fb9ad04

Browse files
authored
Fix S3 actions failing when short cuts are triggered outside of viewer (#2694)
1 parent 4c30b4e commit fb9ad04

File tree

13 files changed

+42
-11
lines changed

13 files changed

+42
-11
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "bugfix",
3+
"description" : "Fix S3 bucket viewer actions being triggered by short cuts even if it is not focused"
4+
}

jetbrains-core/src/software/aws/toolkits/jetbrains/services/s3/objectActions/S3ObjectAction.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ abstract class S3ObjectAction(title: String, icon: Icon? = null) : DumbAwareActi
1818
protected abstract fun performAction(dataContext: DataContext, nodes: List<S3TreeNode>)
1919

2020
final override fun update(e: AnActionEvent) {
21+
val bucketViewer = e.dataContext.getData(S3EditorDataKeys.BUCKET_TABLE)
22+
// Disable the action if the bucket viewer is not in our UI hierarchy
23+
if (bucketViewer == null) {
24+
e.presentation.isEnabledAndVisible = false
25+
return
26+
}
27+
2128
val selected = selected(e.dataContext)
2229
e.presentation.isEnabled = selected.none { it is S3TreeContinuationNode<*> || it is S3TreeErrorNode } && enabled(selected)
2330
}

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/s3/objectActions/CopyPathActionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import java.awt.datatransfer.DataFlavor
1515
import java.time.Instant
1616

1717
class CopyPathActionTest : ObjectActionTestBase() {
18-
private val sut = CopyPathAction()
18+
override val sut = CopyPathAction()
1919

2020
@Test
2121
fun `copy path disabled with no nodes`() {

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/s3/objectActions/CopyUriActionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import java.awt.datatransfer.DataFlavor
1515
import java.time.Instant
1616

1717
class CopyUriActionTest : ObjectActionTestBase() {
18-
private val sut = CopyUriAction()
18+
override val sut = CopyUriAction()
1919

2020
@Test
2121
fun `copy uri disabled with no nodes`() {

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/s3/objectActions/CopyUrlActionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class CopyUrlActionTest : ObjectActionTestBase() {
3131
@JvmField
3232
val disposableRule = DisposableRule()
3333

34-
private val sut = CopyUrlAction()
34+
override val sut = CopyUrlAction()
3535

3636
@Before
3737
fun setUpMock() {

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/s3/objectActions/DeleteObjectActionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import software.aws.toolkits.jetbrains.ui.TestDialogService
2323
import java.time.Instant
2424

2525
class DeleteObjectActionTest : ObjectActionTestBase() {
26-
private val sut = DeleteObjectAction()
26+
override val sut = DeleteObjectAction()
2727

2828
@After
2929
fun tearDown() {

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/s3/objectActions/DownloadObjectActionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class DownloadObjectActionTest : ObjectActionTestBase() {
4444
@JvmField
4545
val testDisposable = DisposableRule()
4646

47-
private val sut = DownloadObjectAction()
47+
override val sut = DownloadObjectAction()
4848

4949
@After
5050
fun tearDown() {

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/s3/objectActions/NewFolderActionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import software.aws.toolkits.jetbrains.ui.TestDialogService
2323
import java.time.Instant
2424

2525
class NewFolderActionTest : ObjectActionTestBase() {
26-
private val sut = NewFolderAction()
26+
override val sut = NewFolderAction()
2727

2828
@After
2929
fun tearDown() {

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/s3/objectActions/ObjectActionTestBase.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@ import com.intellij.openapi.actionSystem.Presentation
1010
import com.intellij.openapi.actionSystem.impl.SimpleDataContext
1111
import com.intellij.testFramework.ProjectRule
1212
import com.intellij.ui.treeStructure.treetable.TreeTableTree
13+
import org.assertj.core.api.Assertions.assertThat
1314
import org.junit.Before
1415
import org.junit.Rule
16+
import org.junit.Test
1517
import org.mockito.kotlin.mock
1618
import software.aws.toolkits.core.utils.test.aString
1719
import software.aws.toolkits.jetbrains.services.s3.editor.S3EditorDataKeys
@@ -21,11 +23,13 @@ import software.aws.toolkits.jetbrains.services.s3.editor.S3TreeTable
2123
import software.aws.toolkits.jetbrains.services.s3.editor.S3TreeTableModel
2224
import software.aws.toolkits.jetbrains.services.s3.editor.S3VirtualBucket
2325

24-
open class ObjectActionTestBase {
26+
abstract class ObjectActionTestBase {
2527
@Rule
2628
@JvmField
2729
val projectRule = ProjectRule()
2830

31+
protected abstract val sut: S3ObjectAction
32+
2933
protected val bucketName = aString()
3034
protected lateinit var treeTable: S3TreeTable
3135
protected lateinit var s3Bucket: S3VirtualBucket
@@ -45,6 +49,22 @@ open class ObjectActionTestBase {
4549
}
4650
}
4751

52+
@Test
53+
fun `action is disabled when UI element is not present`() {
54+
val projectContext = SimpleDataContext.getProjectContext(projectRule.project)
55+
val dc = SimpleDataContext.getSimpleContext(
56+
mapOf(
57+
S3EditorDataKeys.BUCKET_TABLE.name to null
58+
),
59+
projectContext
60+
)
61+
val actionEvent = AnActionEvent.createFromAnAction(sut, null, ActionPlaces.UNKNOWN, dc)
62+
63+
sut.update(actionEvent)
64+
65+
assertThat(actionEvent.presentation.isEnabled).isFalse
66+
}
67+
4868
protected fun AnAction.executeAction(nodes: List<S3TreeNode>) {
4969
val event = createEventFor(this, nodes)
5070
actionPerformed(event)

jetbrains-core/tst/software/aws/toolkits/jetbrains/services/s3/objectActions/RefreshTreeActionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import software.aws.toolkits.jetbrains.services.s3.editor.S3TreeObjectVersionNod
1616
import java.time.Instant
1717

1818
class RefreshTreeActionTest : ObjectActionTestBase() {
19-
private val sut = RefreshTreeAction()
19+
override val sut = RefreshTreeAction()
2020

2121
@Test
2222
fun `refresh tree action is enabled on empty selection`() {

0 commit comments

Comments
 (0)