Skip to content

refactor: complete NFS shell migration and distribute scaffolder fields - #777

Merged
kaviththiranga merged 8 commits into
openchoreo:mainfrom
stefinie123:full-nfs-migration
Sep 8, 2026
Merged

refactor: complete NFS shell migration and distribute scaffolder fields#777
kaviththiranga merged 8 commits into
openchoreo:mainfrom
stefinie123:full-nfs-migration

Conversation

@stefinie123

Copy link
Copy Markdown
Contributor

Purpose

Finish the NFS migration started in #754 . Remove convertLegacyAppRoot from the portal and distribute the 32 scaffolder field extensions through the base OC plugin
Resolves openchoreo/openchoreo#4023

Goals

  • Portal shell runs entirely on NFS primitives; legacy Root.tsx deleted
  • Adopters installing an OC plugin get everything that plugin owns end-to-end — sidebar entries, entity chrome, exec-terminal route, OC template fields — with no manual portal cloning
  • Portal-only customizations (settings chrome, API entity layout, BUI polish) stay portal-scoped so adopters get vanilla upstream behavior for those surface

Approach

Portal shell — themes/icons via ThemeBlueprint/IconBundleBlueprint,
sidebar via NavContentBlueprint, providers via AppRootWrapperBlueprint,
7 API factories via ApiBlueprint, every route via PageBlueprint
(portal-owned) or plugin-shipped extensions. Extensions on internal
inputs live in an appModule under pluginId: 'app'; rest live under
portalAppPlugin.

Portal-only overrides in customOverrides.tsx — API entity 3-tab
layout (Overview / Definition / Try Out), settings chrome using legacy
SettingsLayout, custom overrides for page:catalog-graph, page:api-docs,
page:catalog-import, page:search, page:user-settings.

Scaffolder fields — moved 32 field folders + shared bits (utils/,
types.ts, ScaffolderPreselectionContext.tsx) from packages/portal-app/
to plugins/openchoreo/. Rewrote each extensions.ts from legacy
createScaffolderFieldExtension to FormFieldBlueprint.make +
createFormField. OpenChoreoScaffolderPage now loads fields via
formFieldsApiRef.loadFormFields() and passes as formFields prop —
<ScaffolderFieldExtensions> JSX children gone.

User stories

Summary of user stories addressed by this change>

Release note

Brief description of the new feature or bug fix as it will appear in the release notes

Documentation

Link(s) to product documentation that addresses the changes of this PR. If no doc impact, enter “N/A” plus brief explanation of why there’s no doc impact

Training

Link to the PR for changes to the training content in https://github.com/wso2/WSO2-Training, if applicable

Certification

Type “Sent” when you have provided new/updated certification questions, plus four answers for each question (correct answer highlighted in bold), based on this change. Certification questions/answers should be sent to certification@wso2.com and NOT pasted in this PR. If there is no impact on certification exams, type “N/A” and explain why.

Marketing

Link to drafts of marketing content that will describe and promote this feature, including product page changes, technical articles, blog posts, videos, etc., if applicable

Automation tests

  • Unit tests

    Code coverage information

  • Integration tests

    Details about the test cases and coverage

Security checks

Samples

Provide high-level details about the samples related to this feature

Related PRs

List any other related PRs

Migrations (if applicable)

Describe migration steps and platforms on which migration has been tested

Test environment

List all JDK versions, operating systems, databases, and browser/versions on which this feature/fix was tested

Learning

Describe the research phase and any blog posts, patterns, libraries, or add-ons you used to solve the problem.

Move themes, icons, sidebar (NavContentBlueprint), provider wrappers, and API-entity extensions onto NFS primitives via a portal appModule and portalPlugin.
Signed-off-by: Stefinie Fernando <minolispencer@gmail.com>
…eo core plugin

Signed-off-by: Stefinie Fernando <minolispencer@gmail.com>
…t version 2.0.0 in yarn.lock and openchoreo package.json

Signed-off-by: Stefinie Fernando <minolispencer@gmail.com>
…scaffolder field extensions

Signed-off-by: Stefinie Fernando <minolispencer@gmail.com>
@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 179 files, which is 79 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 1aa94bee-40fd-4f3c-a9e0-afb9f65906b8

📥 Commits

Reviewing files that changed from the base of the PR and between 2310b4d and f07da9f.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (179)
  • .changeset/nfs-shell-and-scaffolder-migration.md
  • app-config.production.yaml
  • app-config.yaml
  • packages/portal-app/src/apis.test.ts
  • packages/portal-app/src/apis.ts
  • packages/portal-app/src/apis/customOverrides.tsx
  • packages/portal-app/src/appModule.tsx
  • packages/portal-app/src/components/DynamicSignInPage.tsx
  • packages/portal-app/src/components/Root/PortalNavContent.tsx
  • packages/portal-app/src/components/Root/Root.tsx
  • packages/portal-app/src/components/Root/index.ts
  • packages/portal-app/src/components/apiOverview/ApiOpenApiDefinitionTab.tsx
  • packages/portal-app/src/components/apiOverview/ApiOverviewLayout.tsx
  • packages/portal-app/src/components/catalog/CustomCatalogImportPage.tsx
  • packages/portal-app/src/components/scaffolder/OpenChoreoScaffolderPage.tsx
  • packages/portal-app/src/components/settings/OpenChoreoUserSettingsPage.tsx
  • packages/portal-app/src/createPortalApp.tsx
  • packages/portal-app/src/kindIcons.ts
  • packages/portal-app/src/portalPlugin.tsx
  • packages/portal-app/src/scaffolder/AdvancedConfigurationField/extensions.ts
  • packages/portal-app/src/scaffolder/AdvancedConfigurationField/index.ts
  • packages/portal-app/src/scaffolder/BuildAndDeployField/extensions.ts
  • packages/portal-app/src/scaffolder/BuildAndDeployField/index.ts
  • packages/portal-app/src/scaffolder/BuildTemplateParameters/extensions.ts
  • packages/portal-app/src/scaffolder/BuildTemplateParameters/index.ts
  • packages/portal-app/src/scaffolder/BuildTemplatePicker/extensions.ts
  • packages/portal-app/src/scaffolder/BuildTemplatePicker/index.ts
  • packages/portal-app/src/scaffolder/BuildWorkflowParameters/index.tsx
  • packages/portal-app/src/scaffolder/BuildWorkflowPicker/index.tsx
  • packages/portal-app/src/scaffolder/ClusterComponentTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ClusterComponentTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ClusterProjectTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ClusterProjectTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ClusterResourceTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ClusterResourceTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ClusterTraitYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ClusterTraitYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ClusterWorkflowYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ClusterWorkflowYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ComponentNamePicker/extensions.ts
  • packages/portal-app/src/scaffolder/ComponentNamePicker/index.ts
  • packages/portal-app/src/scaffolder/ComponentTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ComponentTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ComponentWorkflowYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ComponentWorkflowYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ContainerImageField/extensions.ts
  • packages/portal-app/src/scaffolder/ContainerImageField/index.ts
  • packages/portal-app/src/scaffolder/DeploymentPipelineFormWithYaml/extensions.ts
  • packages/portal-app/src/scaffolder/DeploymentPipelineFormWithYaml/index.ts
  • packages/portal-app/src/scaffolder/DeploymentPipelinePicker/extensions.ts
  • packages/portal-app/src/scaffolder/DeploymentPipelinePicker/index.ts
  • packages/portal-app/src/scaffolder/DeploymentSourcePicker/extensions.ts
  • packages/portal-app/src/scaffolder/DeploymentSourcePicker/index.ts
  • packages/portal-app/src/scaffolder/EnvironmentFormWithYaml/extensions.ts
  • packages/portal-app/src/scaffolder/EnvironmentFormWithYaml/index.ts
  • packages/portal-app/src/scaffolder/GitSourceField/extensions.ts
  • packages/portal-app/src/scaffolder/GitSourceField/index.ts
  • packages/portal-app/src/scaffolder/NamespaceEntityPicker/extensions.ts
  • packages/portal-app/src/scaffolder/NotificationChannelFormWithYaml/extensions.ts
  • packages/portal-app/src/scaffolder/NotificationChannelFormWithYaml/index.ts
  • packages/portal-app/src/scaffolder/ProjectNamespaceField/extensions.ts
  • packages/portal-app/src/scaffolder/ProjectNamespaceField/index.ts
  • packages/portal-app/src/scaffolder/ProjectParametersField/extensions.ts
  • packages/portal-app/src/scaffolder/ProjectParametersField/index.ts
  • packages/portal-app/src/scaffolder/ProjectTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ProjectTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/ResourceNamePicker/extensions.ts
  • packages/portal-app/src/scaffolder/ResourceNamePicker/index.ts
  • packages/portal-app/src/scaffolder/ResourceParametersField/extensions.ts
  • packages/portal-app/src/scaffolder/ResourceParametersField/index.ts
  • packages/portal-app/src/scaffolder/ResourceTypeYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/ResourceTypeYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/SwitchField/extensions.ts
  • packages/portal-app/src/scaffolder/SwitchField/index.ts
  • packages/portal-app/src/scaffolder/TraitYamlEditor/extensions.ts
  • packages/portal-app/src/scaffolder/TraitYamlEditor/index.ts
  • packages/portal-app/src/scaffolder/TraitsField/extensions.ts
  • packages/portal-app/src/scaffolder/TraitsField/index.ts
  • packages/portal-app/src/scaffolder/WorkloadDetailsField/extensions.ts
  • packages/portal-app/src/scaffolder/WorkloadDetailsField/index.ts
  • packages/portal-app/src/scaffolder/openChoreoTokenDecorator.ts
  • plugins/openchoreo-ci/README.md
  • plugins/openchoreo-ci/package.json
  • plugins/openchoreo-observability/README.md
  • plugins/openchoreo-observability/package.json
  • plugins/openchoreo-observability/src/alpha.test.tsx
  • plugins/openchoreo-observability/src/alpha.tsx
  • plugins/openchoreo-portal-assistant/README.md
  • plugins/openchoreo-portal-assistant/package.json
  • plugins/openchoreo-react/src/hooks/useQueryParams.ts
  • plugins/openchoreo-react/src/index.ts
  • plugins/openchoreo-workflows/README.md
  • plugins/openchoreo-workflows/package.json
  • plugins/openchoreo/package.json
  • plugins/openchoreo/src/alpha.test.tsx
  • plugins/openchoreo/src/alpha.tsx
  • plugins/openchoreo/src/api/OpenChoreoFetchApi.test.ts
  • plugins/openchoreo/src/api/OpenChoreoFetchApi.ts
  • plugins/openchoreo/src/api/OpenChoreoPermissionApi.test.ts
  • plugins/openchoreo/src/api/OpenChoreoPermissionApi.ts
  • plugins/openchoreo/src/api/authRefs.ts
  • plugins/openchoreo/src/appModule.tsx
  • plugins/openchoreo/src/components/AccessControl/AccessControlPage.test.tsx
  • plugins/openchoreo/src/extensions/openChoreoEntityPageOverride.tsx
  • plugins/openchoreo/src/hooks/useQueryParams.ts
  • plugins/openchoreo/src/index.ts
  • plugins/openchoreo/src/routes.ts
  • plugins/openchoreo/src/scaffolder/AdvancedConfigurationField/AdvancedConfigurationField.tsx
  • plugins/openchoreo/src/scaffolder/BuildAndDeployField/BuildAndDeployField.tsx
  • plugins/openchoreo/src/scaffolder/BuildTemplateParameters/BuildTemplateParametersExtension.tsx
  • plugins/openchoreo/src/scaffolder/BuildTemplatePicker/BuildTemplatePickerExtension.tsx
  • plugins/openchoreo/src/scaffolder/BuildWorkflowParameters/BuildWorkflowParametersExtension.tsx
  • plugins/openchoreo/src/scaffolder/BuildWorkflowPicker/BuildWorkflowPickerExtension.test.tsx
  • plugins/openchoreo/src/scaffolder/BuildWorkflowPicker/BuildWorkflowPickerExtension.tsx
  • plugins/openchoreo/src/scaffolder/ClusterComponentTypeYamlEditor/ClusterComponentTypeYamlEditorExtension.tsx
  • plugins/openchoreo/src/scaffolder/ClusterComponentTypeYamlEditor/styles.ts
  • plugins/openchoreo/src/scaffolder/ClusterProjectTypeYamlEditor/ClusterProjectTypeYamlEditorExtension.test.tsx
  • plugins/openchoreo/src/scaffolder/ClusterProjectTypeYamlEditor/ClusterProjectTypeYamlEditorExtension.tsx
  • plugins/openchoreo/src/scaffolder/ClusterProjectTypeYamlEditor/styles.ts
  • plugins/openchoreo/src/scaffolder/ClusterResourceTypeYamlEditor/ClusterResourceTypeYamlEditorExtension.tsx
  • plugins/openchoreo/src/scaffolder/ClusterResourceTypeYamlEditor/styles.ts
  • plugins/openchoreo/src/scaffolder/ClusterTraitYamlEditor/ClusterTraitYamlEditorExtension.tsx
  • plugins/openchoreo/src/scaffolder/ClusterTraitYamlEditor/styles.ts
  • plugins/openchoreo/src/scaffolder/ClusterWorkflowYamlEditor/ClusterWorkflowYamlEditorExtension.tsx
  • plugins/openchoreo/src/scaffolder/ClusterWorkflowYamlEditor/styles.ts
  • plugins/openchoreo/src/scaffolder/ComponentNamePicker/ComponentNamePickerExtension.tsx
  • plugins/openchoreo/src/scaffolder/ComponentTypeYamlEditor/ComponentTypeYamlEditorExtension.tsx
  • plugins/openchoreo/src/scaffolder/ComponentTypeYamlEditor/styles.ts
  • plugins/openchoreo/src/scaffolder/ComponentWorkflowYamlEditor/ComponentWorkflowYamlEditorExtension.tsx
  • plugins/openchoreo/src/scaffolder/ComponentWorkflowYamlEditor/styles.ts
  • plugins/openchoreo/src/scaffolder/ContainerImageField/ContainerImageField.tsx
  • plugins/openchoreo/src/scaffolder/DeploymentPipelineFormWithYaml/DeploymentPipelineFormWithYamlExtension.tsx
  • plugins/openchoreo/src/scaffolder/DeploymentPipelineFormWithYaml/styles.ts
  • plugins/openchoreo/src/scaffolder/DeploymentPipelinePicker/DeploymentPipelinePickerExtension.tsx
  • plugins/openchoreo/src/scaffolder/DeploymentSourcePicker/DeploymentSourcePicker.tsx
  • plugins/openchoreo/src/scaffolder/EnvironmentFormWithYaml/EnvironmentFormWithYamlExtension.tsx
  • plugins/openchoreo/src/scaffolder/EnvironmentFormWithYaml/styles.ts
  • plugins/openchoreo/src/scaffolder/GitSecretField/GitSecretDialog.tsx
  • plugins/openchoreo/src/scaffolder/GitSourceField/GitSourceField.tsx
  • plugins/openchoreo/src/scaffolder/NamespaceEntityPicker/NamespaceEntityPicker.tsx
  • plugins/openchoreo/src/scaffolder/NamespaceEntityPicker/NamespaceSelectField.tsx
  • plugins/openchoreo/src/scaffolder/NamespaceEntityPicker/index.ts
  • plugins/openchoreo/src/scaffolder/NotificationChannelFormWithYaml/NotificationChannelFormWithYamlExtension.test.tsx
  • plugins/openchoreo/src/scaffolder/NotificationChannelFormWithYaml/NotificationChannelFormWithYamlExtension.tsx
  • plugins/openchoreo/src/scaffolder/NotificationChannelFormWithYaml/styles.ts
  • plugins/openchoreo/src/scaffolder/ProjectNamespaceField/ProjectNamespaceField.tsx
  • plugins/openchoreo/src/scaffolder/ProjectNamespaceField/projectNamespaceFieldValidation.test.ts
  • plugins/openchoreo/src/scaffolder/ProjectParametersField/ProjectParametersField.test.tsx
  • plugins/openchoreo/src/scaffolder/ProjectParametersField/ProjectParametersField.tsx
  • plugins/openchoreo/src/scaffolder/ProjectTypeYamlEditor/ProjectTypeYamlEditorExtension.test.tsx
  • plugins/openchoreo/src/scaffolder/ProjectTypeYamlEditor/ProjectTypeYamlEditorExtension.tsx
  • plugins/openchoreo/src/scaffolder/ProjectTypeYamlEditor/styles.ts
  • plugins/openchoreo/src/scaffolder/ResourceNamePicker/ResourceNamePickerExtension.tsx
  • plugins/openchoreo/src/scaffolder/ResourceParametersField/ResourceParametersField.tsx
  • plugins/openchoreo/src/scaffolder/ResourceTypeYamlEditor/ResourceTypeYamlEditorExtension.tsx
  • plugins/openchoreo/src/scaffolder/ResourceTypeYamlEditor/styles.ts
  • plugins/openchoreo/src/scaffolder/ScaffolderPreselectionContext.tsx
  • plugins/openchoreo/src/scaffolder/SwitchField/SwitchFieldExtension.test.tsx
  • plugins/openchoreo/src/scaffolder/SwitchField/SwitchFieldExtension.tsx
  • plugins/openchoreo/src/scaffolder/TraitYamlEditor/TraitYamlEditorExtension.tsx
  • plugins/openchoreo/src/scaffolder/TraitYamlEditor/styles.ts
  • plugins/openchoreo/src/scaffolder/TraitsField/NoTraitsAvailableMessage.tsx
  • plugins/openchoreo/src/scaffolder/TraitsField/TraitCard.tsx
  • plugins/openchoreo/src/scaffolder/TraitsField/TraitPicker.tsx
  • plugins/openchoreo/src/scaffolder/TraitsField/TraitsFieldExtension.tsx
  • plugins/openchoreo/src/scaffolder/WorkloadDetailsField/WorkloadDetailsField.tsx
  • plugins/openchoreo/src/scaffolder/extensions.ts
  • plugins/openchoreo/src/scaffolder/makeFormFieldExtension.ts
  • plugins/openchoreo/src/scaffolder/types.ts
  • plugins/openchoreo/src/scaffolder/utils/rjsfUtils.test.ts
  • plugins/openchoreo/src/scaffolder/utils/rjsfUtils.tsx
  • plugins/platform-engineer-core/README.md
  • plugins/platform-engineer-core/package.json
  • plugins/platform-engineer-core/src/alpha.tsx
  • plugins/platform-engineer-core/src/components/PlatformOverviewPage/PlatformOverviewPage.test.tsx
  • plugins/platform-engineer-core/src/components/PlatformOverviewPage/PlatformOverviewPage.tsx
  • plugins/platform-engineer-core/src/components/PlatformOverviewPage/index.ts
  • plugins/platform-engineer-core/src/components/index.ts
  • plugins/platform-engineer-core/src/routes.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

… to core plugin

- Removed local implementations of OpenChoreo fetch, permission, and auth APIs from the portal app.
- Integrated OpenChoreo API references from the new core plugin, ensuring proper encapsulation and reuse.
- Updated tests and components to utilize the new API structure.
- Adjusted README files across plugins to reflect the dependency on the core OpenChoreo plugin.

Signed-off-by: Stefinie Fernando <minolispencer@gmail.com>
…o include @openchoreo/backstage-plugin and @backstage/config

Signed-off-by: Stefinie Fernando <minolispencer@gmail.com>
Signed-off-by: Stefinie Fernando <minolispencer@gmail.com>
- portal-app: remove dead "Skip to main content" link. Targeted an id that no longer exists; Backstage's <Sidebar> already renders an accessible <A11ySkipSidebar> internally.
- portal-app: surface loadFormFields() errors in OpenChoreoScaffolderPage. useAsync error branch was ignored, so a rejected load silently rendered <ScaffolderPage> with formFields === undefined. Now shows a ResponseErrorPanel.
 - openchoreo-react: stabilize useQueryParams params/setValues identity.
Inline config literals defeated memoization, causing consumer effects to re-run every render. Hold config in a ref; memoize only on searchParams.
- openchoreo: collapse 30 scaffolder extensions.ts boilerplate files behind a makeFormFieldExtension helper and a single registry.

Signed-off-by: Stefinie Fernando <minolispencer@gmail.com>
@kaviththiranga
kaviththiranga merged commit 762b22a into openchoreo:main Sep 8, 2026
8 of 9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Backstage] Fully migrate entity pages to NFS primitives

2 participants