Skip to content

Make UI module independent sub-project - #4650

Merged
malliaridis merged 13 commits into
apache:mainfrom
malliaridis:chore/admin-ui-separation
Sep 20, 2026
Merged

malliaridis merged 13 commits into
apache:mainfrom
malliaridis:chore/admin-ui-separation

Conversation

@malliaridis

@malliaridis malliaridis commented Jul 21, 2026 •

Copy link
Copy Markdown
Contributor

See discussion https://lists.apache.org/thread/onc0zyyp8tjoj3fdg3bmpnh9cqsgjhy6

Description

We have noticed slow build times and problems related to the Admin UI module that requires developers to disable the module entirely, which led to other dependency resolution issues.

This PR attempts to separate the module from the rest of the project by making it an independent sub-project.

Solution

The approach that was picked is a completely independent gradle project. Some important changes:

  • Dependency resolution for the UI module is happening separately from the rest of the project, so dependencies are not aligned
  • Many build configurations that apply to most solr modules are removed, allowing the UI module to use simpler builds
  • The exclusion of many plugins and configurations means there are no default checks included

We should evaluate before merging which of the configurations or routines we want to keep and apply to this module as well. We may also keep it as is since the Admin UI is still experimental.

The module is no longer included as a configuration or task dependency as implemented before. Instead, the webapp now has to fetch the UI artifacts from https://nightlies.apache.org/solr/ui/wasm/[commit-hash]/.

Developers can call ./gradlew dev -Psolr.ui.buildFromSource=true to build the UI module locally and include the artifacts from the current state, or alternatively define a commit (and optionally a checksum for validation) in the gradle/solr-ui.properties to download the UI bundle from the nightlies server.

A guard has been added for specific release tasks that prevents using a nightly build artifact, and forces the UI to be built from source.

The jenkins job https://ci-builds.apache.org/job/Solr/job/solr-ui-wasm-assemble/ is building and deploying a version of the project. Right now it is executed manually on this branch, but it can be updated once this is merged to run from main.

I chose running the jenkins job manually so that we can pin down a commit hash and avoid spamming the nightlies with bundles. But we can switch to daily builds too if we prefer that. THe zip size is about 5MB large.

Important Note: This PR introduces a new flag for building the UI module from source, replacing the previously configured production flag in gradle.properties. The flag defaults to false requiring the user to either set it to true or provide a commit hash for download wasmJs. The PR uses the hash from the PR branch, which will no longer match a commit hash on main once this PR is squashed and merged.

Tests

The changes can be tested by adding these lines to your gradle.properties file:

solr.ui.buildFromSource=false
solr.ui.commit=473a55ef64a9a1605e00eb6c1c386887d4cb7dac
solr.ui.wasmSha256=654494303e4af3b8bfb26a83d250603f19033820295591d88db0597991ce8ad2

And run ./gradlew dev. This should download the zip file from https://nightlies.apache.org/solr/ui/wasm/473a55ef64a9a1605e00eb6c1c386887d4cb7dac/ and build the webapp with a pre-built version of the new UI, while verifying the download with the provided checksum.

Checklist

Please review the following and check all that apply:

  • I have reviewed the guidelines for How to Contribute and my code conforms to the standards described there to the best of my ability.
  • I have created a Jira issue and added the issue ID to my pull request title.
  • I have given Solr maintainers access to contribute to my PR branch. (optional but recommended, not available for branches on forks living under an organisation)
  • I have developed this patch against the main branch.
  • I have run ./gradlew check.
  • I have added tests for my changes.
  • I have added documentation for the Reference Guide
  • I have added a changelog entry for my change

@malliaridis
malliaridis force-pushed the chore/admin-ui-separation branch from 8157a60 to d17d65e Compare July 21, 2026 13:38
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Jul 21, 2026

@dsmiley dsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should use the same gradle wrapper, at least.

It's not clear how new master Solr build acquires the UI artifacts to serve.

Comment thread ui/gradle/wrapper/gradle-wrapper.properties Outdated
@malliaridis

Copy link
Copy Markdown
Contributor Author

It's not clear how new master Solr build acquires the UI artifacts to serve.

It is not clear because it is not solved yet. 🫤

I haven't figured it out yet how to do that the proper way (e.g. where can we publish artifacts, how to build it in advance for a release, how to retrieve artifacts?). I wanted to look into the solution we use for lucene and see if it can be reliably used for the UI in releases as well.

Another thing that I am unsure is all the licensing stuff. We would have to treat it completely different. I believe the best option we have is to display open-source licenses in the UI somewhere, but for that we would have to retrieve them first.

All the project configurations are removed, which is both a blessing and a curse as you can see.

If you have any input on how to solve specific issues, feel free to leave a comment or commit to this PR. Happy to colaborate on this one. :)

@janhoy

janhoy commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Does this need to be a new top-level folder? The old prometheus-exporter was a separate build but lived under solr/. So we could let the ui live under solr/ui/ but still disconnect it from the main build. Less top-level clutter. The UI is still a part of Solr and it is the solr ui, so nothing funny with solr/ui as location?

@janhoy

janhoy commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

I like the convenience solr.ui.buildFromSource=true for development.

During a release the UI will need to be built before the main tarball and then included in the main tarball. But do we need to release the UI in downloads.apache.org as well? I don't think so, as long as it is evident that the embedded wasm UI was built from the same commit as the main server.

Having a nightly CI job a pre-built UI assembly to nightlies for the common branches provides a nice default fallback for those who just want to play around with local build. If you do cutting edge UI dev or if you want to build a PR branch or an older commit than latest nightly, you may need to re-build UI locally anyway.

@malliaridis

Copy link
Copy Markdown
Contributor Author

But do we need to release the UI in downloads.apache.org as well?

I believe for the jvm standalone client it would make sense to publish it to downloads.apache.org. For the wasmJs that is included in the Solr distribution I would add a guard where the release manager is forced to build from source / same commit. This will avoid the need of managing just another release voting for UI publications, right?

If you do cutting edge UI dev or if you want to build a PR branch or an older commit than latest nightly, you may need to re-build UI locally anyway.

Yeah, devs working on UI or people testing newest changes can always build from source. The rest can pick a commit that has been published on nightlies and bypass the build hassle.

I haven't finished nor tested the changes yet, as I have to update the jenkins nightly build to see if the fetch works as expected. I will also update the directory if it is preferred to be placed under solr/. Thanks for the early feedback!

@malliaridis
malliaridis force-pushed the chore/admin-ui-separation branch from b0cc3bd to ddb1933 Compare September 2, 2026 11:53
@github-actions github-actions Bot removed the documentation Improvements or additions to documentation label Sep 2, 2026
@malliaridis
malliaridis force-pushed the chore/admin-ui-separation branch from ddb1933 to ad5d83c Compare September 2, 2026 11:59
@malliaridis
malliaridis force-pushed the chore/admin-ui-separation branch 3 times, most recently from b5f0f61 to 051fb19 Compare September 2, 2026 16:09
@malliaridis

Copy link
Copy Markdown
Contributor Author

In another PR I will enable spotless checks on the UI module and address the indentation to change it to 2 spaces as it is configured project-wide.

@malliaridis
malliaridis requested a review from dsmiley September 2, 2026 18:12
@malliaridis
malliaridis marked this pull request as ready for review September 2, 2026 18:12
@malliaridis
malliaridis requested a review from janhoy September 2, 2026 20:08

@dsmiley dsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we publish a normal durable released version and reference that? The nighties hash references are going to need to be updated often maybe and will probably get purged.

Comment thread gradle/solr/solr-ui.gradle Outdated
@malliaridis
malliaridis force-pushed the chore/admin-ui-separation branch 2 times, most recently from 48c7d59 to 03a446f Compare September 3, 2026 17:25
@janhoy
janhoy requested a lite review from Copilot September 9, 2026 06:51
@janhoy

janhoy commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

I delegated my reviewing to Copilot. Let's get this in developer's hands and iterate in followup PRs if there are improvements to be made in process, pinning...

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

There are confirmed functional issues (file-size validation always returning success, incorrect wasm fetch error matching, a Gradle self-dependency, and a workflow path filter bug) that can break behavior or CI.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

This PR restructures the experimental Admin UI so it can be built and tested as a standalone Gradle project (ui/), while the Solr webapp consumes a prebuilt wasm bundle (downloaded from nightlies or built from source via a flag) to reduce build-time impact on core Solr development.

Changes:

  • Introduces an independent ui/ Gradle build (settings, properties, subprojects) and updates CI to run UI checks separately.
  • Adjusts the Solr webapp packaging to include the new UI bundle under /solr/ui/, with release-task guards requiring “build from source”.
  • Adds/reshapes UI shared code (platform expect/actuals, new components, tests, and resources) to support the separated build and wasm distribution.
File summaries
File Description
ui/webApp/webpack.config.d/adjust-limits.js Disable webpack performance hints for large Compose assets.
ui/webApp/src/webMain/resources/styles.css Minor formatting fix.
ui/webApp/src/webMain/resources/index.html Update entry script and add initial loading indicator.
ui/webApp/src/webMain/kotlin/org/apache/solr/ui/Main.kt Update wasm entrypoint annotations and viewport usage.
ui/shared/src/wasmJsTest/kotlin/org/apache/solr/ui/components/auth/AuthUtilsTestJs.kt Adjust redirect URI test logic for wasm.
ui/shared/src/wasmJsMain/kotlin/org/apache/solr/ui/utils/PlatformUtils.kt wasm default Solr URL uses browser origin.
ui/shared/src/wasmJsMain/kotlin/org/apache/solr/ui/utils/ErrorUtils.kt wasm-specific error parsing.
ui/shared/src/wasmJsMain/kotlin/org/apache/solr/ui/utils/AppDispatchers.web.kt wasm dispatcher implementation.
ui/shared/src/wasmJsMain/kotlin/org/apache/solr/ui/components/auth/integration/PlatformOAuthStoreClient.kt wasm OAuth store client opt-in annotation adjustment.
ui/shared/src/wasmJsMain/kotlin/org/apache/solr/ui/components/auth/AuthUtils.wasmJs.kt wasm redirect URI generation.
ui/shared/src/jvmMain/kotlin/org/apache/solr/ui/utils/PlatformUtils.kt JVM default Solr URL implementation.
ui/shared/src/jvmMain/kotlin/org/apache/solr/ui/utils/FileUtils.desktop.kt Desktop file picker implementation.
ui/shared/src/jvmMain/kotlin/org/apache/solr/ui/utils/ErrorUtils.desktop.kt Desktop error mapping implementation.
ui/shared/src/jvmMain/kotlin/org/apache/solr/ui/utils/AppDispatchers.jvm.kt JVM dispatcher implementation.
ui/shared/src/jvmMain/kotlin/org/apache/solr/ui/preview/start/PreviewStartContent.kt Update generated resources package for previews.
ui/shared/src/jvmMain/kotlin/org/apache/solr/ui/preview/PreviewContainer.kt Add preview container applying theme + padding.
ui/shared/src/jvmMain/kotlin/org/apache/solr/ui/preview/navigation/PreviewNavigationSideBar.kt Add navigation sidebar preview.
ui/shared/src/jvmMain/kotlin/org/apache/solr/ui/preview/auth/PreviewUserAuthenticationContent.kt Update preview OAuth URLs (localhost → 127.0.0.1).
ui/shared/src/jvmMain/kotlin/org/apache/solr/ui/components/auth/AuthUtils.desktop.kt Desktop redirect URI implementation.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/views/start/TestStartComponent.kt Add start-component test double.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/views/start/StartContentTest.kt Adjust start view tests (tags/resources) and ignore wasm failures.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/views/environment/EnvironmentContentTest.kt Add environment view rendering test.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/views/components/SolrCardTest.kt Add SolrCard view test.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/views/auth/UserAuthenticationContentTest.kt Adjust auth view test resources and ignore wasm failures.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/views/auth/TestOAuthData.kt Add shared OAuth test data.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/views/auth/TestOAuthComponent.kt Add OAuth component test double.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/views/auth/TestBasicAuthComponent.kt Add basic-auth component test double.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/TestUtils.kt Add Ktor MockEngine helpers for tests.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/TestDispatchers.kt Add test dispatchers implementation.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/TestAppComponentContext.kt Add test component context implementation.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/Semantics.kt Add semantics matcher helper for UI tests.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/components/start/integration/DefaultStartComponentIntegrationTest.kt Adjust integration test assertions to be host-independent.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/components/environment/store/MockedEnvironmentStoreClient.kt Add mocked environment store client for tests.
ui/shared/src/commonTest/kotlin/org/apache/solr/ui/components/auth/store/FakeOAuthClient.kt Add fake OAuth client for store tests.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/theme/Theme.kt Remove InternalComposeUiApi usage and system theme local.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/theme/Shapes.kt Add Solr theme shape overrides.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/theme/ColorFamily.kt Add color family model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/start/StartContent.kt Update resource imports to shared generated resources.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/root/RootContent.kt Add shared root composable for navigation.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/navigation/MainMenu.kt Add main menu enum abstraction.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/navigation/Footer.kt Update footer resources to shared generated resources.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/logging/LoggingContent.kt Add placeholder logging screen composable.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/icons/SolrLogo.kt Update icon resources package.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/files/FileTypeIcon.kt Update file icon resources package.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/files/FileSelector.kt Update selector resources package.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/configsets/ImportConfigsetDialog.kt Update resources package for dialogs.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/configsets/CreateConfigsetDialog.kt Update resources package for dialogs.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/configsets/ConfigsetsOverviewContent.kt Update resources package for configsets overview.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/configsets/ConfigsetsDropdown.kt Update resources package for configsets dropdown.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/configsets/ConfigsetsContent.kt Update resources package for configsets section.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/components/SolrTextButton.kt Add Solr-specific TextButton wrapper.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/components/SolrLinearProgressIndicator.kt Add Solr-specific linear progress indicator wrapper.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/components/SolrCard.kt Add Solr-specific card wrapper.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/components/SolrButton.kt Add Solr-specific Button wrapper.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/cluster/ClusterContent.kt Update resources package for cluster section.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/auth/UserAuthenticationContent.kt Update resources package for auth section.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/auth/OAuthContent.kt Update resources package for OAuth screen.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/views/auth/BasicAuthContent.kt Update resources package for basic-auth screen.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/utils/Validators.kt Add UI-level validation constants (configset name/length).
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/utils/FileUtils.kt Add expect API for file picking.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/utils/ErrorUtils.kt Add expect API for platform error parsing.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/utils/DefaultAppComponentContext.kt Add default component context implementation.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/utils/CoroutineContextOwner.kt Add interface for main/io coroutine contexts.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/utils/Constants.kt Add default Solr URL constant and expect default URL provider.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/utils/AppDispatchers.kt Add AppDispatchers abstraction + expect factory.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/utils/AppComponentContext.kt Add shared component context interface.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/errors/UnknownResponseException.kt Add unknown-response exception type.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/errors/UnauthorizedException.kt Add unauthorized exception type.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/errors/InvalidResponseException.kt Add invalid-response exception type.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/errors/InvalidCredentialsException.kt Add invalid-credentials exception type.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/errors/HostNotFoundException.kt Add host-not-found exception type.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/domain/PickedFile.kt Add PickedFile domain model (byte-array equality).
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/domain/OAuthData.kt Add OAuth domain model + auth flow enum.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/domain/Configset.kt Add Configset domain model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/domain/AuthOption.kt Add post-authentication option types (none/basic/oauth).
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/domain/AuthMethod.kt Add available authentication method types.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/data/SolrAuthData.kt Add header model for Solr OAuth authdata.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/data/AuthorizationTokenRequest.kt Add token request model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/data/AuthorizationResponse.kt Add token response model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/start/integration/Mappers.kt Update resources package for start component mapping.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/root/RootComponent.kt Add root component interface for navigation decisions.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/navigation/TabNavigationComponent.kt Add generic tab-navigation component interface.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/navigation/NavigationComponent.kt Add basic navigation component interface.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/main/integration/Mappers.kt Add mapping from MainComponent children to menu items.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/logging/LoggingComponent.kt Add logging component interface.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/logging/integration/DefaultLoggingComponent.kt Add default logging component wiring.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/files/domain/SelectFileUseCase.kt Add select-file use case contract + result types.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/files/domain/FileSelectorEvent.kt Add file-selector event type.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/files/domain/DefaultSelectFileUseCase.kt Add default file selection use case.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/store/EnvironmentStore.kt Add environment store contract and state.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/integration/Mappers.kt Add environment store → model mapper.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/integration/DefaultEnvironmentComponent.kt Add default environment component wiring/store initialization.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/EnvironmentComponent.kt Add environment component interface + model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/Versions.kt Add versions API model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/SystemMode.kt Add system mode enum.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/SystemInformation.kt Add system info model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/SystemData.kt Add system data model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/SecurityConfig.kt Add security config model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/JvmMemoryRaw.kt Add raw JVM memory model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/JvmMemory.kt Add JVM memory model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/JvmData.kt Add JVM data model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/Jmx.kt Add JMX model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/JavaRuntimeInfo.kt Add Java runtime info model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/JavaProperty.kt Add JavaProperty typealias.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/environment/data/JavaPropertiesResponse.kt Add java-properties API response model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/viewmodel/ConfigsetsViewModel.kt Add configsets view model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/repository/ConfigsetsRepository.kt Add configsets repository contract.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/domain/LoadConfigsetsUseCase.kt Add load-configsets use case contract.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/domain/ImportConfigsetUseCase.kt Add import-configset use case contract + result types.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/domain/DefaultLoadConfigsetsUseCase.kt Add default load-configsets implementation.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/domain/DefaultImportConfigsetUseCase.kt Add default import-configset implementation.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/domain/DefaultCreateConfigsetUseCase.kt Add default create-configset implementation with basic validation.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/domain/CreateConfigsetUseCase.kt Add create-configset use case contract + result types.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/domain/CreateConfigsetEvent.kt Add configset creation event model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/di/DefaultConfigsetsComponent.kt Add default DI wiring for configsets component.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/di/ConfigsetsComponent.kt Add configsets component DI contract.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/data/ListConfigsets.kt Add list-configsets API model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/configsets/data/CreateConfigset.kt Add create-configset API model.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/cluster/integration/DefaultClusterComponent.kt Add default cluster component + tab slot navigation.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/cluster/ClusterComponent.kt Add cluster component contract + tabs.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/auth/store/AuthenticationStore.kt Add authentication store contract.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/auth/integration/PlatformOAuthStoreClient.kt Add expect declaration for platform OAuth store client.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/auth/integration/Mappers.kt Update auth mapping resources package.
ui/shared/src/commonMain/kotlin/org/apache/solr/ui/components/auth/integration/HttpBasicAuthStoreClient.kt Add HTTP basic-auth client implementation.
ui/shared/src/commonMain/composeResources/drawable/upload.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/text_snippet_filled.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/tag.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/solr-sun.svg Add SVG resource.
ui/shared/src/commonMain/composeResources/drawable/security.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/search.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/logout.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/info.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/folder_zip.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/edit.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/draft.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/dashboard_filled.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/code.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/close.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/chevron_left.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/broken_image.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/analytics_filled.xml Add drawable resource.
ui/shared/src/commonMain/composeResources/drawable/add.xml Add drawable resource.
ui/settings.gradle.kts Define UI build as independent Gradle root with version catalogs.
ui/proguard.pro Proguard rules for desktop UI distribution.
ui/kotlin-js-store/wasm/yarn.lock Add yarn lockfile for wasm JS store.
ui/gradle.properties UI build defaults (heap, caching, config cache off).
ui/desktopApp/src/main/kotlin/org/apache/solr/ui/Utils.kt Package move for desktop utility.
ui/desktopApp/src/main/kotlin/org/apache/solr/ui/Main.kt Remove unused import in desktop entrypoint.
ui/desktopApp/build.gradle.kts Add standalone desktopApp module build.
ui/build.gradle.kts Add standalone UI root build logic + Spotless wiring.
ui/.gitignore Ignore gradle wrapper files within standalone UI build.
solr/webapp/gradle.lockfile Add uiBundle configuration to lockfile “empty” entry.
solr/webapp/build.gradle Wire UI bundle into war packaging; apply UI bundle script.
solr/ui/README.md Remove old in-tree UI module README.
solr/ui/.editorconfig Remove old UI module editor config.
solr/server/etc/jetty-new-ui.xml Add Jetty rewrite + CSP config for /solr/ui/*.
solr/server/etc/jetty-new-ui-dev.xml Remove dev-specific CSP override file.
solr/server/build.gradle Remove dev/prod XML rename/exclude logic in packaging sync.
solr/packaging/build.gradle Guard release tasks to require building UI from voted source.
settings.gradle Stop including the old :solr:ui subproject.
gradle/validation/spotless.gradle Remove Kotlin MPP Spotless wiring previously targeting :solr:ui.
gradle/validation/rat-sources.gradle Ensure RAT excludes include ui under root project.
gradle/validation/dependency-analyze.gradle.kts Remove dependency-analysis ignores for removed :solr:ui project.
gradle/template.gradle.properties Add UI commit/sha/buildFromSource properties to template.
build.gradle Remove development flag wiring and withUiModule reference.
.github/workflows/new-ui-check.yml Add GitHub Actions workflow to run ./gradlew -p ui check.
.github/renovate.json Include UI version catalog and adjust post-upgrade tasks for UI.
.github/labeler.yml Add ui/** to admin-ui label patterns.
Review details

Suppressed comments (1)

ui/shared/src/wasmJsTest/kotlin/org/apache/solr/ui/components/auth/AuthUtilsTestJs.kt:51

  • This test’s failure message contradicts the assertion (it says the URI should contain double slashes). Also, stripping only "http://" makes the check brittle if the test environment uses https.
  • Files reviewed: 56/255 changed files
  • Comments generated: 3
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread solr/webapp/build.gradle Outdated
Comment thread .github/workflows/new-ui-check.yml Outdated
Comment thread ui/build.gradle.kts Outdated
@malliaridis malliaridis mentioned this pull request Sep 14, 2026
1 task
@malliaridis
malliaridis force-pushed the chore/admin-ui-separation branch from 03a446f to 444aa48 Compare September 20, 2026 08:24
@malliaridis
malliaridis force-pushed the chore/admin-ui-separation branch from 5d14290 to da6707f Compare September 20, 2026 08:36

@dsmiley dsmiley left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's see a changelog "type: other" on this big change.

@malliaridis
malliaridis merged commit c78939a into apache:main Sep 20, 2026
9 of 10 checks passed
@malliaridis malliaridis added this to the 10.x milestone Sep 22, 2026
dsmiley pushed a commit that referenced this pull request Sep 22, 2026
The approach that was picked is a completely independent gradle project. Some important changes:

- Dependency resolution for the UI module is happening separately from the rest of the project, so dependencies are not aligned
- Many build configurations that apply to most `solr` modules are removed, allowing the UI module to use simpler builds
- The exclusion of many plugins and configurations means there are no default checks included

We should evaluate before merging which of the configurations or routines we want to keep and apply to this module as well. We may also keep it as is since the Admin UI is still experimental.

The module is no longer included as a configuration or task dependency as implemented before. Instead, the webapp now has to fetch the UI artifacts from https://nightlies.apache.org/solr/ui/wasm/[commit-hash]/.

Developers can call `./gradlew dev -Psolr.ui.buildFromSource=true` to build the UI module locally and include the artifacts from the current state, or alternatively define a commit (and optionally a checksum for validation) in the `gradle/solr-ui.properties` to download the UI bundle from the nightlies server.

A guard has been added for specific release tasks that prevents using a nightly build artifact, and forces the UI to be built from source.

The jenkins job https://ci-builds.apache.org/job/Solr/job/solr-ui-wasm-assemble/ is building and deploying a version of the project. Right now it is executed manually on this branch, but it can be updated once this is merged to run from main.

_I chose running the jenkins job manually so that we can pin down a commit hash and avoid spamming the nightlies with bundles. But we can switch to daily builds too if we prefer that. THe zip size is about 5MB large._

**Important Note**: This PR introduces a new flag for building the UI module from source, replacing the previously configured `production` flag in `gradle.properties`. The flag defaults to `false` requiring the user to either set it to `true` or provide a commit hash for download wasmJs. The PR uses the hash from the PR branch, which will no longer match a commit hash on main once this PR is squashed and merged.

See discussion https://lists.apache.org/thread/onc0zyyp8tjoj3fdg3bmpnh9cqsgjhy6

(cherry picked from commit c78939a)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants