From 3fecc5a9b0c43a1d36b32760100e5db75d02e83c Mon Sep 17 00:00:00 2001 From: ellizio Date: Thu, 21 Aug 2025 16:02:49 +0300 Subject: [PATCH 1/6] Added scroll to Generation Arguments tab --- build.gradle.kts | 3 +-- .../kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt | 9 ++++++--- .../ru/ellizio/odatacliui/extensions/UiExtensions.kt | 11 +++++++++++ .../ru/ellizio/odatacliui/ui/ScrollableDialogPanel.kt | 9 +++++++++ 4 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 src/rider/main/kotlin/ru/ellizio/odatacliui/ui/ScrollableDialogPanel.kt diff --git a/build.gradle.kts b/build.gradle.kts index b0575fa..7336df1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,7 +21,6 @@ val DotnetSolution: String by project val BuildConfiguration: String by project val ProductVersion: String by project val DotnetPluginId: String by project -val RiderPluginId: String by project val PublishToken: String by project allprojects { @@ -73,7 +72,7 @@ tasks.compileJava { } tasks.compileKotlin { - compilerOptions { jvmTarget= JvmTarget.JVM_21 } + compilerOptions { jvmTarget = JvmTarget.JVM_21 } } intellijPlatform { diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt index ff308f3..e85040e 100644 --- a/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt @@ -8,8 +8,10 @@ import ru.ellizio.odatacliui.Constants import ru.ellizio.odatacliui.UiBundle import ru.ellizio.odatacliui.extensions.emptyText import ru.ellizio.odatacliui.extensions.humanize +import ru.ellizio.odatacliui.extensions.scrollablePanel import ru.ellizio.odatacliui.models.CliDialogModel import ru.ellizio.odatacliui.models.validators.CliDialogValidators +import ru.ellizio.odatacliui.ui.ScrollableDialogPanel import javax.swing.JComponent class CliDialog(private val model: CliDialogModel) : BaseDialog(false) { @@ -18,6 +20,7 @@ class CliDialog(private val model: CliDialogModel) : BaseDialog(false) { init { title = Constants.PLUGIN_NAME + isResizable = false setOKActionEnabled(true) init() } @@ -80,7 +83,7 @@ class CliDialog(private val model: CliDialogModel) : BaseDialog(false) { } } - private fun buildGenerationArgumentsTab(): DialogPanel = panel { + private fun buildGenerationArgumentsTab(): ScrollableDialogPanel = scrollablePanel { row("--file-name") { textField() .align(AlignX.FILL) @@ -154,8 +157,8 @@ class CliDialog(private val model: CliDialogModel) : BaseDialog(false) { .bindSelected(model.upperCamelCase) } }.apply { - registerPanelValidators(this) - generationTabPanel = this + registerPanelValidators(this.panel) + generationTabPanel = this.panel } private fun buildRequestArgumentsTab(): DialogPanel = panel { diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/UiExtensions.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/UiExtensions.kt index 4853270..784ae08 100644 --- a/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/UiExtensions.kt +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/UiExtensions.kt @@ -2,8 +2,19 @@ package ru.ellizio.odatacliui.extensions import com.intellij.ui.components.JBTextField import com.intellij.ui.dsl.builder.Cell +import com.intellij.ui.dsl.builder.Panel +import com.intellij.ui.dsl.builder.panel +import ru.ellizio.odatacliui.ui.ScrollableDialogPanel fun Cell.emptyText(text: String): Cell { component.emptyText.text = text return this +} + +fun scrollablePanel(init: Panel.() -> Unit): ScrollableDialogPanel { + val content = panel(init) + return ScrollableDialogPanel(content).apply { + border = null + isOverlappingScrollBar = false + } } \ No newline at end of file diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/ui/ScrollableDialogPanel.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/ui/ScrollableDialogPanel.kt new file mode 100644 index 0000000..5e9c590 --- /dev/null +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/ui/ScrollableDialogPanel.kt @@ -0,0 +1,9 @@ +package ru.ellizio.odatacliui.ui + +import com.intellij.openapi.ui.DialogPanel +import com.intellij.ui.components.JBScrollPane + +class ScrollableDialogPanel(private val view: DialogPanel) : JBScrollPane(view, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_NEVER) { + val panel: DialogPanel + get() = view +} \ No newline at end of file From 6bb2b4661fefe0bbe199d99a083f844bbe39f067 Mon Sep 17 00:00:00 2001 From: ellizio Date: Fri, 22 Aug 2025 12:31:00 +0300 Subject: [PATCH 2/6] Fixed scroll overlapping --- .../kotlin/ru/ellizio/odatacliui/extensions/UiExtensions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/UiExtensions.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/UiExtensions.kt index 784ae08..7533c04 100644 --- a/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/UiExtensions.kt +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/UiExtensions.kt @@ -15,6 +15,6 @@ fun scrollablePanel(init: Panel.() -> Unit): ScrollableDialogPanel { val content = panel(init) return ScrollableDialogPanel(content).apply { border = null - isOverlappingScrollBar = false + isOverlappingScrollBar = true } } \ No newline at end of file From daa58d93cf9225fa2f5807f23c888d90de71bb19 Mon Sep 17 00:00:00 2001 From: ellizio Date: Fri, 22 Aug 2025 15:27:40 +0300 Subject: [PATCH 3/6] Improved validation --- .../main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt | 2 ++ .../kotlin/ru/ellizio/odatacliui/models/CliDialogModel.kt | 2 +- .../odatacliui/models/validators/CliDialogValidators.kt | 7 +++++++ .../ellizio/odatacliui/toolwindows/CliToolWindowManager.kt | 1 + 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt index e85040e..a846486 100644 --- a/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt @@ -90,6 +90,8 @@ class CliDialog(private val model: CliDialogModel) : BaseDialog(false) { .emptyText(UiBundle.text("cli.filename.empty-text")) .comment(UiBundle.text("cli.filename.comment")) .bindText(model.fileName) + .validationOnInput(CliDialogValidators.fileNameValidator()) + .validationOnApply(CliDialogValidators.fileNameValidator()) } row("--namespace-prefix") { textField() diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/models/CliDialogModel.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/models/CliDialogModel.kt index 2e42e43..7fb843c 100644 --- a/src/rider/main/kotlin/ru/ellizio/odatacliui/models/CliDialogModel.kt +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/models/CliDialogModel.kt @@ -60,7 +60,7 @@ class CliDialogModel(project: Project, private val actionMetadata: ActionMetadat fun buildODataCliCommand(): GeneralCommandLine = CommandLineBuilder(DotnetToolsUtils.getToolDefaultPath("odata-cli"), "generate") .withParameter("--metadata-uri", metadataUri.get()) .withParameter("--service-name", serviceName.get(), atLeast031) - .withParameter("--file-name", fileName.get()) + .withParameter("--file-name", fileName.get().removeSuffix(".cs")) .withParameter("--custom-headers", customHeaders.get()) .withParameter("--proxy", proxy.get()) .withParameter("--namespace-prefix", namespacePrefix.get()) diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/models/validators/CliDialogValidators.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/models/validators/CliDialogValidators.kt index 37254a3..64ca41f 100644 --- a/src/rider/main/kotlin/ru/ellizio/odatacliui/models/validators/CliDialogValidators.kt +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/models/validators/CliDialogValidators.kt @@ -30,6 +30,13 @@ object CliDialogValidators { null } + fun fileNameValidator(): ValidationInfoBuilder.(JTextField) -> ValidationInfo? = { + if (it.text.isNotEmpty() && it.text.isBlank()) + error("File name must not be entirely whitespace") + else + null + } + fun namespacePrefixValidator(): ValidationInfoBuilder.(JTextField) -> ValidationInfo? = { if (it.text.isNotEmpty() && !namespacePrefixRegex.matches(it.text)) error("Namespace prefix must be in a valid format") diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/toolwindows/CliToolWindowManager.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/toolwindows/CliToolWindowManager.kt index 0f6076c..1f19de2 100644 --- a/src/rider/main/kotlin/ru/ellizio/odatacliui/toolwindows/CliToolWindowManager.kt +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/toolwindows/CliToolWindowManager.kt @@ -28,6 +28,7 @@ class CliToolWindowManager(private val project: Project) { fun instantiateConsole(): ConsoleView { val consoleView = TextConsoleBuilderFactory.getInstance().createBuilder(project).console val content = toolWindow.contentManager.factory.createContent(consoleView.component, UiBundle.text("cli.tab.generate"), true) + content.setDisposer(consoleView); toolWindow.contentManager.addContent(content) toolWindow.activate { toolWindow.contentManager.setSelectedContent(content) From 5c49937b30106b836fdfb17667a87dbedc260563 Mon Sep 17 00:00:00 2001 From: ellizio Date: Fri, 22 Aug 2025 15:54:47 +0300 Subject: [PATCH 4/6] Updated actions --- .github/workflows/CI.yml | 28 +++++-------------- .github/workflows/Release.yml | 10 ++++--- .../prepare-build-environment/action.yml | 16 +++++++++++ 3 files changed, 29 insertions(+), 25 deletions(-) create mode 100644 .github/workflows/prepare-build-environment/action.yml diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 7daa11c..ef728b9 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -12,10 +12,10 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive - - uses: actions/setup-java@v4 - with: - java-version: '21' - distribution: 'corretto' + + - name: Prepare Build Environment + uses: ./.github/workflows/prepare-build-environment + - uses: actions/cache@v4 with: path: | @@ -24,33 +24,19 @@ jobs: ~/.gradle/caches ~/.gradle/wrapper key: ${{ runner.os }}-Build-${{ hashFiles('gradlew.bat', 'src/dotnet/*/*.csproj', 'src/dotnet/*.props', 'gradle-wrapper.properties') }} + - run: ./gradlew :protocol:rdgen --no-daemon - run: ./gradlew :buildPlugin -PBuildConfiguration=Release --no-daemon + - uses: mad9000/actions-find-and-replace-string@5 id: fix_branch_name with: source: ${{ github.ref_name }} find: '/' replace: '-' + - uses: actions/upload-artifact@v4 if: github.ref_name == 'master' || github.ref_name == 'dev' with: name: odata-cli-ui.${{ steps.fix_branch_name.outputs.value }}-${{ github.run_number }} path: output - Test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - uses: actions/cache@v4 - with: - path: | - build/gradle-jvm - packages - ~/.nuget/packages - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-Test-${{ hashFiles('gradlew.bat', 'src/dotnet/*/*.csproj', 'src/dotnet/*.props', 'gradle-wrapper.properties') }} - - run: ./gradlew :protocol:rdgen --no-daemon - - run: ./gradlew :testDotNet --no-daemon diff --git a/.github/workflows/Release.yml b/.github/workflows/Release.yml index 11480e8..462d985 100644 --- a/.github/workflows/Release.yml +++ b/.github/workflows/Release.yml @@ -12,10 +12,10 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive - - uses: actions/setup-java@v4 - with: - java-version: '21' - distribution: 'corretto' + + - name: Prepare Build Environment + uses: ./.github/workflows/prepare-build-environment + - run: ./gradlew :protocol:rdgen - run: ./gradlew :buildPlugin -PBuildConfiguration=Release - run: ./gradlew :signPlugin -PBuildConfiguration=Release @@ -23,12 +23,14 @@ jobs: CERTIFICATE_CHAIN: ${{ secrets.CERTIFICATE_CHAIN }} PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }} PRIVATE_KEY_PASSWORD: ${{ secrets.PRIVATE_KEY_PASSWORD }} + - uses: mad9000/actions-find-and-replace-string@5 id: fix_branch_name with: source: ${{ github.ref_name }} find: 'release/' replace: '' + - uses: actions/upload-artifact@v4 with: name: odata-cli-ui.${{ steps.fix_branch_name.outputs.value }} diff --git a/.github/workflows/prepare-build-environment/action.yml b/.github/workflows/prepare-build-environment/action.yml new file mode 100644 index 0000000..e938dd7 --- /dev/null +++ b/.github/workflows/prepare-build-environment/action.yml @@ -0,0 +1,16 @@ +name: "prepare-build-environment" +description: "Prepare build environment" +runs: + using: "composite" + steps: + - name: Setup JDK + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'corretto' + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.0.x' + dotnet-quality: 'ga' \ No newline at end of file From f36f4d867e69c1bbcfce34afcf0bc7a997f12270 Mon Sep 17 00:00:00 2001 From: ellizio Date: Mon, 25 Aug 2025 12:02:57 +0300 Subject: [PATCH 5/6] Updated changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 911e9ea..9c61911 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## [1.2.1] +- Added scroll to dialog +- Improved validation + ## [1.2.0] - Added missing odata-cli options - Fixed tabs validation From 88fd13579644b7883c2477d9253760e669e66360 Mon Sep 17 00:00:00 2001 From: ellizio Date: Mon, 25 Aug 2025 12:16:54 +0300 Subject: [PATCH 6/6] Bump to 1.2.1 --- README.md | 1 + gradle.properties | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c035a28..079598a 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ | Plugin version | odata-cli version | |----------------|-------------------| +| 1.2.1 | 0.3.1, 0.3.0 | | 1.2.0 | 0.3.1, 0.3.0 | | 1.1.0 | 0.3.1, 0.3.0 | | 1.0.1 | 0.2.1 | diff --git a/gradle.properties b/gradle.properties index 877fdd1..a418b82 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ DotnetPluginId=ReSharperPlugin.ODataCliUi DotnetSolution=ReSharperPlugin.ODataCliUi.sln RiderPluginId=ru.ellizio.odatacliui -PluginVersion=1.2.0-2025.2 +PluginVersion=1.2.1-2025.2 BuildConfiguration=Debug