Skip to content

Create Deployment Scripts for Both Dynamic-Plugin and Backstage-Standalone#2830

Merged
asmasarw merged 10 commits intoredhat-developer:mainfrom
asmasarw:feature/deployment
Apr 20, 2026
Merged

Create Deployment Scripts for Both Dynamic-Plugin and Backstage-Standalone#2830
asmasarw merged 10 commits intoredhat-developer:mainfrom
asmasarw:feature/deployment

Conversation

@asmasarw
Copy link
Copy Markdown
Contributor

@asmasarw asmasarw commented Apr 20, 2026

Introduced new Image Creation Options

We have 2 Types of Images:

  • Dynamic Plugin
  • Standalone Backstage Application

Dynamic Plugin

What it builds: A tiny OCI artifact (~few MB) containing only the compiled plugin JavaScript files.

How it works:

Exports the frontend (plugins/dcm) and backend (plugins/dcm-backend) as dynamic plugins
Packages them into a single OCI image tagged quay.io/dcm-project/dcm-ui:VERSION
tgz additionally extracts the .tgz tarballs from that image via skopeo
Who consumes it: An already-running Red Hat Developer Hub instance. RHDH loads the plugin at startup by pulling the OCI artifact and mounting the plugin files into its own runtime. You don't run this image directly — RHDH runs it.

Use case: Your production RHDH cluster wants to add the DCM plugin without rebuilding the whole Backstage app.

Standalone Backstage Application

What it builds: A full, self-contained Docker image (~1GB+) with the entire Backstage application baked in — Node.js runtime, all dependencies, compiled frontend, and compiled backend.

How it works:

Runs yarn tsc + yarn workspace app build + yarn workspace backend build inside a build container
Copies only the production artifacts into a lean runtime image
Tags it quay.io/dcm-project/dcm-ui:VERSION
Who consumes it: You run it directly with docker run or podman-compose up. It starts a complete Backstage server on port 7007 that serves both the API and the frontend — no RHDH required.

Use case: Your compose.yaml setup — a standalone Backstage instance specifically for the DCM plugin.


How to Generate Image

To Generate Dynamic Plugin

VERSION=<semver> ./scripts/generate-image.sh [oci|tgz|push]

To Generate Standalone Backstage Application

VERSION=<semver> ./scripts/generate-image.sh backstage-image [--push]

Script Description (Help)

./scripts/generate-image.sh --help

@rhdh-qodo-merge
Copy link
Copy Markdown

rhdh-qodo-merge Bot commented Apr 20, 2026

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider


Action required

1. Proxy skips authorization 🐞 Bug ⛨ Security
Description
createDcmProxy forwards /proxy/* requests to the upstream gateway using a backend SSO token
without calling the existing authorize() permission check, allowing callers without dcm.plugin
permission to access upstream DCM APIs. This is inconsistent with /token, which correctly returns
403 when the caller is denied.
Code

workspaces/dcm/plugins/dcm-backend/src/routes/proxy.ts[R66-79]

+    let tokenResult;
+    try {
+      tokenResult = await getTokenFromApi(options);
+    } catch (err) {
+      logger.error(`DCM proxy: failed to obtain access token — ${err}`);
+      res
+        .status(502)
+        .json({ error: 'Failed to obtain upstream access token.' });
+      return;
+    }
+
+    const requestHeaders: Record<string, string> = {
+      Authorization: `Bearer ${tokenResult.accessToken}`,
+      Accept: (req.headers.accept as string) || 'application/json',
Relevance

⭐⭐⭐ High

PR2766 claims proxy is permission-gated, but proxy.ts shows no authorize() call; likely a real
security bug.

PR-#2766
PR-#2425

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The proxy handler obtains an SSO token and forwards requests but never checks permissions. In
contrast, the /token route calls authorize(req, options) and denies access when not allowed;
authorize uses permissions.authorize over dcmPluginPermissions.

workspaces/dcm/plugins/dcm-backend/src/routes/proxy.ts[31-80]
workspaces/dcm/plugins/dcm-backend/src/routes/token.ts[23-38]
workspaces/dcm/plugins/dcm-backend/src/routes/access.ts[22-34]
workspaces/dcm/plugins/dcm-common/src/permissions.ts[24-34]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`/proxy/*` performs privileged upstream calls (backend client-credentials token) without enforcing the same `dcm.plugin` permission guard used by `/token`, enabling authorization bypass.

### Issue Context
The codebase already has an `authorize(req, options)` helper that evaluates `dcmPluginPermissions` using `httpAuth.credentials` + `permissions.authorize`.

### Fix
- Call `authorize(req, options)` at the start of `createDcmProxy` and return `403` when the decision is not `ALLOW`.
- Consider reusing the same log message style as `/token`.

### Fix Focus Areas
- workspaces/dcm/plugins/dcm-backend/src/routes/proxy.ts[31-120]
- workspaces/dcm/plugins/dcm-backend/src/routes/access.ts[22-34]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Empty SSO creds still used🐞 Bug ☼ Reliability
Description
app-config.production.yaml defaults dcm.clientId/dcm.clientSecret to empty strings and claims
the backend will “skip token exchange”, but getTokenFromApi always reads credentials and calls the
SSO token endpoint, causing token acquisition to fail (and proxy requests to return 502) when env
vars are not set. This makes the container’s default config break proxying by default.
Code

workspaces/dcm/app-config.production.yaml[R26-32]

+  apiGatewayUrl: ${DCM_API_GATEWAY_URL:-}
+  # SSO / OAuth2 client-credentials config for the backend proxy.
+  ssoBaseUrl: ${DCM_SSO_BASE_URL:-}
+  # clientId and clientSecret are declared required in config.d.ts but can be
+  # left empty if SSO is not configured; the backend will skip token exchange.
+  clientId: ${DCM_CLIENT_ID:-}
+  clientSecret: ${DC****************-}
Relevance

⭐⭐⭐ High

PR2766 tokenUtil/proxy always fetch SSO token; empty default creds would break proxying as
described.

PR-#2766

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The production config explicitly sets empty-default credentials and states token exchange will be
skipped, but getTokenFromApi always constructs a client-credentials request using
dcm.clientId/dcm.clientSecret and performs fetch(...) to the token endpoint; createDcmProxy
treats token acquisition failures as 502 for all proxied calls.

workspaces/dcm/app-config.production.yaml[23-32]
workspaces/dcm/plugins/dcm-backend/src/util/tokenUtil.ts[54-73]
workspaces/dcm/plugins/dcm-backend/src/routes/proxy.ts[66-75]
workspaces/dcm/plugins/dcm-backend/config.d.ts[40-54]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The container production config allows empty `dcm.clientId`/`dcm.clientSecret` and documents “skip token exchange”, but `getTokenFromApi` always attempts the OAuth client-credentials flow, which fails when these values are empty/unset and breaks `/proxy/*`.

### Issue Context
- `app-config.production.yaml` sets `${DCM_CLIENT_ID:-}` / `${DCM_CLIENT_SECRET:-}`.
- `getTokenFromApi` always builds a token request.
- `/proxy/*` depends on successful token acquisition.

### Fix
Implement one consistent behavior:
- Option A (recommended if SSO is optional):
 - Use `getOptionalString` for `dcm.clientId`/`dcm.clientSecret`.
 - If either is missing/empty, skip token exchange and proxy **without** the Authorization header (or return a clear 503 stating SSO creds are required for proxy).
- Option B (recommended if SSO is required):
 - Remove empty defaults in `app-config.production.yaml` and document/env-validate that these must be provided.
 - Update `config.d.ts` docs accordingly.

### Fix Focus Areas
- workspaces/dcm/plugins/dcm-backend/src/util/tokenUtil.ts[54-80]
- workspaces/dcm/plugins/dcm-backend/src/routes/proxy.ts[66-86]
- workspaces/dcm/app-config.production.yaml[23-33]
- workspaces/dcm/plugins/dcm-backend/config.d.ts[40-54]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

3. Git not dockerignored🐞 Bug ➹ Performance
Description
.dockerignore no longer ignores .git while the Dockerfile uses COPY . ., causing git
history/metadata to be included in the Docker build context and copied into the image build stage.
This increases build time/image size and may expose repository metadata inside the image layer
history.
Code

workspaces/dcm/.dockerignore[1]

-.git
Relevance

⭐⭐⭐ High

Including .git in Docker context is a known perf/security issue; no evidence team prefers removing
ignore.

PR-#2339

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The .git ignore entry was removed, and the Dockerfile copies the entire workspace into the build
stage, so .git will be included unless explicitly ignored.

workspaces/dcm/.dockerignore[1-8]
workspaces/dcm/Dockerfile[24-26]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
Docker builds will now include the `.git` directory in the build context and `COPY . .` layer, bloating builds and potentially exposing repo metadata.

### Fix
Add `.git` back to `.dockerignore` (and consider other large/dev-only folders as needed).

### Fix Focus Areas
- workspaces/dcm/.dockerignore[1-10]
- workspaces/dcm/Dockerfile[24-26]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


4. Guest enabled in image 🐞 Bug ⛨ Security
Description
The container runtime config enables the guest auth provider outside development
(dangerouslyAllowOutsideDevelopment: true), and the Dockerfile’s CMD always loads
app-config.production.yaml. This makes the built container image allow guest access by default,
which is risky for any non-demo deployment.
Code

workspaces/dcm/app-config.production.yaml[R34-40]

+auth:
+  providers:
+    guest:
+      # Allow the guest provider to work outside the development environment.
+      # The app uses auto sign-in with guest so there is no login screen.
+      dangerouslyAllowOutsideDevelopment: true
+      userEntityRef: user:default/guest
Relevance

⭐⭐ Medium

DCM workspace historically uses guest auth for local/dev; production image intent unclear, could be
deliberate demo default.

PR-#2339

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
app-config.production.yaml enables the guest provider outside development, and the Dockerfile
explicitly starts Backstage with --config app-config.production.yaml, so this setting is active
for the container image by default.

workspaces/dcm/app-config.production.yaml[34-40]
workspaces/dcm/Dockerfile[116-118]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The container image enables guest auth outside development by default via `app-config.production.yaml`, which is always loaded by the container CMD.

### Fix
Make this behavior opt-in for demos:
- Remove the guest provider from `app-config.production.yaml`, or
- Gate it behind an env var (e.g., `${ENABLE_GUEST_AUTH:-false}`) and default to disabled.

### Fix Focus Areas
- workspaces/dcm/app-config.production.yaml[34-40]
- workspaces/dcm/Dockerfile[116-118]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

ⓘ The new review experience is currently in Beta. Learn more

Grey Divider

Qodo Logo

@rhdh-gh-app
Copy link
Copy Markdown

rhdh-gh-app Bot commented Apr 20, 2026

Changed Packages

Package Name Package Path Changeset Bump Current Version
@red-hat-developer-hub/backstage-plugin-dcm-backend workspaces/dcm/plugins/dcm-backend patch v1.0.0
@red-hat-developer-hub/backstage-plugin-dcm-common workspaces/dcm/plugins/dcm-common patch v1.0.0
@red-hat-developer-hub/backstage-plugin-dcm workspaces/dcm/plugins/dcm patch v1.0.0

@rhdh-qodo-merge
Copy link
Copy Markdown

Review Summary by Qodo

Implement complete DCM API layer with CRUD management UI and deployment infrastructure

✨ Enhancement 🧪 Tests

Grey Divider

Walkthroughs

Description
• **Comprehensive API client layer**: Implemented base client (DcmBaseClient) and four concrete
  API clients (CatalogClient, PolicyManagerClient, ProvidersClient, PlacementClient) for
  secure communication with DCM services through backend proxy
• **Backend proxy route**: Added Express route handler for proxying requests to DCM API Gateway with
  token injection, configuration validation, and error handling
• **Type system**: Defined complete TypeScript interfaces for all DCM domain types (Catalog, Policy
  Manager, Providers, Placement) with validation schemas
• **Form validation framework**: Created reusable form types and Yup validation schemas for all
  resource types (Providers, Policies, Catalog Items, Instances, Resources) with conversion utilities
• **CRUD state management hook**: Implemented useCrudTab custom hook centralizing state management
  for data loading, search, pagination, and create/edit/delete dialogs
• **UI components**: Built reusable components (DcmCrudTabLayout, DcmFormDialog,
  DcmFormDialogActions, DcmDeleteDialog, DcmErrorSnackbar, TruncatedText) for consistent CRUD
  operations
• **Tab pages**: Created six new management tabs (Providers, Policies, Service Types, Catalog Items,
  Instances, Resources) with full CRUD functionality and async API integration
• **Comprehensive test coverage**: Added 15+ test files covering API clients, form validation,
  utilities, and components
• **Configuration & deployment**: Added Docker support, production config, dynamic plugin configs,
  and build scripts for containerized deployment
• **Documentation**: Updated API reports and added changeset documenting major refactoring
Diagram
flowchart LR
  A["Frontend Plugin"] -->|API Refs| B["API Clients"]
  B -->|HTTP Proxy| C["Backend Plugin"]
  C -->|Token Injection| D["DCM API Gateway"]
  A -->|Form Validation| E["Form Types & Schemas"]
  A -->|State Management| F["useCrudTab Hook"]
  A -->|UI Components| G["CRUD Tab Pages"]
  G -->|Display| H["Providers/Policies/Catalog/Resources"]
  C -->|Config| I["SSO & Token Util"]
  J["Docker Build"] -->|Containerize| K["Production Deployment"]
Loading

Grey Divider

File Changes

1. workspaces/dcm/plugins/dcm/src/hooks/useCrudTab.ts ✨ Enhancement +416/-0

Custom React hook for centralized CRUD tab state management

• New custom React hook centralizing CRUD state management for data loading, search, pagination, and
 create/edit/delete dialogs
• Implements stable callbacks using refs to prevent unnecessary re-renders and infinite loops
• Provides comprehensive state for list items, filtering, form handling, and async operations with
 error surfacing
• Exports UseCrudTabOptions and UseCrudTabResult interfaces for type-safe configuration and
 return values

workspaces/dcm/plugins/dcm/src/hooks/useCrudTab.ts


2. workspaces/dcm/plugins/dcm/src/hooks/useCrudTab.test.ts 🧪 Tests +305/-0

Test suite for useCrudTab hook with full coverage

• Comprehensive test suite covering initial load, search, pagination, and CRUD operations
• Tests error handling for failed API calls and form validation
• Verifies reload functionality and state transitions across all dialog flows
• Uses renderHook and waitFor utilities for async hook testing

workspaces/dcm/plugins/dcm/src/hooks/useCrudTab.test.ts


3. workspaces/dcm/plugins/dcm/src/pages/catalog-items/catalogItemFormTypes.ts ✨ Enhancement +239/-0

Catalog item form types and validation logic

• Defines FieldRow and CatalogItemForm types for catalog item form state management
• Implements validation using Yup schema with display name and API version constraints
• Provides conversion functions between form state and API CatalogItem payloads
• Includes JSON parsing utilities for handling default values and validation schemas

workspaces/dcm/plugins/dcm/src/pages/catalog-items/catalogItemFormTypes.ts


View more (89)
4. workspaces/dcm/plugins/dcm-backend/src/routes/proxy.test.ts 🧪 Tests +212/-0

Test suite for DCM API proxy route handler

• Tests for DCM API proxy route handling configuration validation and error scenarios
• Verifies token acquisition failures, upstream fetch errors, and proper error responses
• Tests successful GET/POST/DELETE request proxying with header injection and body forwarding
• Validates 204 No Content response handling

workspaces/dcm/plugins/dcm-backend/src/routes/proxy.test.ts


5. workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/instanceFormTypes.test.ts 🧪 Tests +205/-0

Test suite for catalog item instance form types

• Tests for instance form validation including api_version pattern matching with ReDoS protection
• Verifies display_name and catalog_item_id validation constraints
• Tests buildUserValueRows function for extracting editable fields from catalog items
• Validates form-to-instance conversion with proper field trimming and type coercion

workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/instanceFormTypes.test.ts


6. workspaces/dcm/plugins/dcm-backend/src/util/tokenUtil.test.ts 🧪 Tests +178/-0

Test suite for SSO token acquisition and caching utility

• Tests for SSO token acquisition with caching logic and expiry threshold validation
• Verifies token reuse when expiry is >60s away and fresh token fetch when expiring soon
• Tests error handling for failed SSO requests with descriptive error messages
• Validates configurable SSO base URL with fallback to default

workspaces/dcm/plugins/dcm-backend/src/util/tokenUtil.test.ts


7. workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/instanceFormTypes.ts ✨ Enhancement +174/-0

Instance form types with validation and type coercion

• Defines UserValueRow and InstanceForm types for instance creation/editing
• Implements Yup validation for api_version, display_name, and catalog_item_id fields
• Provides buildUserValueRows to extract editable fields from catalog items with schema metadata
• Includes coerceValue function to convert string form values to proper API types based on JSON
 Schema

workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/instanceFormTypes.ts


8. workspaces/dcm/plugins/dcm-common/src/clients/DcmBaseClient.test.ts 🧪 Tests +154/-0

Test suite for DCM base HTTP client

• Tests for base HTTP client proxy URL construction and error handling
• Verifies 204 No Content response handling and DcmClientError exception throwing
• Tests RFC 7807 JSON error body parsing and HTTP status code preservation
• Validates header merging with default Content-Type

workspaces/dcm/plugins/dcm-common/src/clients/DcmBaseClient.test.ts


9. workspaces/dcm/plugins/dcm-common/src/clients/PlacementClient.test.ts 🧪 Tests +122/-0

Test suite for placement resource API client

• Tests for placement resource API client methods (list, create, delete, rehydrate)
• Verifies query parameter handling and URL construction for resource operations
• Tests POST/DELETE method routing and request body serialization
• Validates optional id parameter appending for create operations

workspaces/dcm/plugins/dcm-common/src/clients/PlacementClient.test.ts


10. workspaces/dcm/plugins/dcm/src/pages/providers/providerFormTypes.test.ts 🧪 Tests +130/-0

Test suite for provider form types and validation

• Tests for provider form validation including name slug pattern and endpoint URL format
• Verifies schema_version pattern matching and service_type requirements
• Tests nameToDisplayName conversion utility and form-to-provider round-trip conversion
• Validates operations array handling (omitted when empty)

workspaces/dcm/plugins/dcm/src/pages/providers/providerFormTypes.test.ts


11. workspaces/dcm/plugins/dcm-backend/src/routes/proxy.ts ✨ Enhancement +120/-0

DCM API Gateway proxy route handler implementation

• Implements Express route handler for proxying all requests to DCM API Gateway
• Handles configuration validation, token injection, and upstream error handling
• Forwards query parameters, request bodies, and response headers appropriately
• Returns proper HTTP status codes and error messages for configuration/token/upstream failures

workspaces/dcm/plugins/dcm-backend/src/routes/proxy.ts


12. workspaces/dcm/plugins/dcm-common/src/clients/CatalogClient.ts ✨ Enhancement +121/-0

Catalog API client implementation

• Implements catalog API client for service types, catalog items, and instances
• Provides methods for CRUD operations on catalog items and instances
• Extends DcmBaseClient for secure proxy routing through dcm-backend
• Supports list, get, create, update, and delete operations with proper HTTP methods

workspaces/dcm/plugins/dcm-common/src/clients/CatalogClient.ts


13. workspaces/dcm/plugins/dcm-common/src/clients/ProvidersClient.test.ts 🧪 Tests +111/-0

Test suite for providers API client

• Tests for providers API client methods (list, get, create, apply/update, delete)
• Verifies correct HTTP methods and URL construction for each operation
• Tests request body serialization and response handling
• Validates 204 No Content response for delete operations

workspaces/dcm/plugins/dcm-common/src/clients/ProvidersClient.test.ts


14. workspaces/dcm/plugins/dcm/src/pages/providers/providerFormTypes.ts ✨ Enhancement +107/-0

Provider form types and validation logic

• Defines ProviderForm type with name, endpoint, service_type, schema_version, and operations
• Implements Yup validation for slug pattern, HTTPS endpoint, and schema version format
• Provides conversion functions between form state and Provider API payloads
• Includes nameToDisplayName utility for converting kebab-case to title case

workspaces/dcm/plugins/dcm/src/pages/providers/providerFormTypes.ts


15. workspaces/dcm/plugins/dcm/src/utils/createYupValidator.test.ts 🧪 Tests +94/-0

Test suite for Yup validator factory utility

• Tests for generic Yup validator factory with optional transform function
• Verifies error object generation and isValid boolean check
• Tests validation with and without field transformation
• Validates handling of multiple field errors and field-specific error messages

workspaces/dcm/plugins/dcm/src/utils/createYupValidator.test.ts


16. workspaces/dcm/plugins/dcm-common/src/types/catalog.ts ✨ Enhancement +115/-0

Catalog domain type definitions

• Defines TypeScript interfaces for catalog domain types derived from OpenAPI spec
• Includes ServiceType, CatalogItem, FieldConfiguration, and CatalogItemInstance types
• Provides list wrapper types with pagination support
• Defines UserValue for instance field values and FieldConfigurationDependsOn for conditional
 display

workspaces/dcm/plugins/dcm-common/src/types/catalog.ts


17. workspaces/dcm/plugins/dcm/src/pages/policies/policyFormTypes.test.ts 🧪 Tests +98/-0

Test suite for policy form types and validation

• Tests for policy form validation including display_name, rego_code, and priority constraints
• Verifies policy_type enum validation (GLOBAL or USER only)
• Tests form-to-policy conversion and round-trip preservation of fields
• Validates priority range (1-1000) and required field checks

workspaces/dcm/plugins/dcm/src/pages/policies/policyFormTypes.test.ts


18. workspaces/dcm/plugins/dcm/src/pages/policies/policyFormTypes.ts ✨ Enhancement +92/-0

Policy form types and validation logic

• Defines PolicyForm type with display_name, description, policy_type, priority, rego_code, and
 enabled
• Implements Yup validation for required fields and priority range (1-1000)
• Provides conversion functions between form state and Policy API payloads
• Stores priority as string in form for text field binding, converts to number on submit

workspaces/dcm/plugins/dcm/src/pages/policies/policyFormTypes.ts


19. workspaces/dcm/plugins/dcm-backend/src/util/tokenUtil.ts ✨ Enhancement +20/-18

Token utility refactoring with improved error handling

• Refactors token caching to use TokenResult type with accessToken and expiresAt fields
• Improves error messages for SSO failures with status code and response body
• Changes log levels from info to debug for cache checks, adds descriptive prefixes
• Adds type assertion comment for cache.set to handle JsonValue type constraints

workspaces/dcm/plugins/dcm-backend/src/util/tokenUtil.ts


20. workspaces/dcm/plugins/dcm/src/pages/resources/resourceFormTypes.test.ts 🧪 Tests +86/-0

Test suite for resource form types and validation

• Tests for resource form validation including catalog_item_instance_id requirement
• Verifies spec field must be valid non-empty JSON
• Tests optional id pattern validation (lowercase alphanumeric with hyphens)
• Validates form-to-resource conversion with JSON parsing

workspaces/dcm/plugins/dcm/src/pages/resources/resourceFormTypes.test.ts


21. workspaces/dcm/plugins/dcm-common/src/errors/DcmClientError.ts ✨ Enhancement +76/-0

Custom error class for DCM API client exceptions

• Defines custom DcmClientError exception class extending Error with HTTP status and structured
 API error
• Implements fromResponse static factory method for parsing RFC 7807 problem detail JSON
• Provides human-readable error messages while preserving structured error details
• Handles both JSON and plain text error responses gracefully

workspaces/dcm/plugins/dcm-common/src/errors/DcmClientError.ts


22. workspaces/dcm/plugins/dcm/src/utils/extractApiError.test.ts 🧪 Tests +71/-0

Test suite for API error extraction utility

• Tests for recursive error message unwrapping from nested JSON structures
• Verifies extraction of detail and title fields from RFC 7807 error responses
• Tests handling of plain Error objects, strings, and non-Error values
• Validates graceful handling of invalid JSON and empty strings

workspaces/dcm/plugins/dcm/src/utils/extractApiError.test.ts


23. workspaces/dcm/plugins/dcm-common/src/utils/extractApiError.ts ✨ Enhancement +84/-0

Utility for extracting human-readable error messages from API responses

• Implements recursive unwrapping of deeply-nested DCM API error messages
• Extracts innermost detail or title from JSON-encoded error chains
• Handles plain text errors, JSON parsing failures, and various input types
• Prevents infinite recursion by comparing unwrapped result with original detail

workspaces/dcm/plugins/dcm-common/src/utils/extractApiError.ts


24. workspaces/dcm/plugins/dcm-common/src/types/index.ts ✨ Enhancement +6/-1

Update type exports to include all domain types

• Replaces example component export with comprehensive type exports
• Exports catalog, common, placement, policy-manager, and providers type modules
• Enables public API surface for all domain types used across DCM plugins

workspaces/dcm/plugins/dcm-common/src/types/index.ts


25. workspaces/dcm/plugins/dcm-common/src/utils/extractApiError.test.ts 🧪 Tests +71/-0

Add comprehensive tests for extractApiError utility

• New test file for extractApiError utility function
• Tests error extraction from plain Error objects, non-Error values, and JSON error messages
• Covers recursive unwrapping of nested JSON detail chains and edge cases

workspaces/dcm/plugins/dcm-common/src/utils/extractApiError.test.ts


26. workspaces/dcm/plugins/dcm-common/src/clients/PlacementClient.ts ✨ Enhancement +77/-0

Implement PlacementClient for resource management

• New client implementation for DCM Placement Manager API
• Provides CRUD operations for resources (list, get, create, delete, rehydrate)
• Routes requests through dcm-backend secure proxy to upstream API gateway

workspaces/dcm/plugins/dcm-common/src/clients/PlacementClient.ts


27. workspaces/dcm/plugins/dcm/src/pages/resources/resourceFormTypes.ts ✨ Enhancement +75/-0

Add resource form types and validation schema

• New form types and validation for resource creation
• Defines ResourceForm with catalog item instance ID, spec, and optional client-assigned ID
• Implements Yup schema validation for JSON spec and ID pattern matching

workspaces/dcm/plugins/dcm/src/pages/resources/resourceFormTypes.ts


28. workspaces/dcm/plugins/dcm/src/plugin.ts ✨ Enhancement +57/-0

Register DCM API clients and new route references

• Register four new API factories for Catalog, PolicyManager, Providers, and Placement services
• Add six new route references for providers, policies, service types, catalog items, instances, and
 resources
• Integrate discovery and fetch APIs for backend communication

workspaces/dcm/plugins/dcm/src/plugin.ts


29. workspaces/dcm/plugins/dcm-common/src/clients/DcmBaseClient.ts ✨ Enhancement +63/-0

Create base client for DCM API communication

• New abstract base class for all DCM API clients
• Handles HTTP requests through dcm-backend secure proxy
• Manages error handling and response parsing with proper content-type headers

workspaces/dcm/plugins/dcm-common/src/clients/DcmBaseClient.ts


30. workspaces/dcm/plugins/dcm-common/src/clients/PolicyManagerClient.ts ✨ Enhancement +65/-0

Implement PolicyManagerClient for policy management

• New client implementation for DCM Policy Manager API
• Provides CRUD operations for policies (list, get, create, update, delete)
• Supports PATCH requests with merge-patch content type for updates

workspaces/dcm/plugins/dcm-common/src/clients/PolicyManagerClient.ts


31. workspaces/dcm/plugins/dcm-common/src/types/providers.ts ✨ Enhancement +70/-0

Define provider API types and data structures

• New type definitions for DCM Providers API
• Defines Provider, ProviderMetadata, ResourceCapacity, and ProviderList interfaces
• Includes optional metadata fields for extensibility and capacity metrics

workspaces/dcm/plugins/dcm-common/src/types/providers.ts


32. workspaces/dcm/plugins/dcm/src/apis.ts ✨ Enhancement +69/-0

Create Backstage API references for DCM services

• New file defining Backstage API references for four DCM services
• Creates catalogApiRef, policyManagerApiRef, providersApiRef, and placementApiRef
• Enables dependency injection of API clients throughout the plugin

workspaces/dcm/plugins/dcm/src/apis.ts


33. workspaces/dcm/plugins/dcm-common/src/clients/ProvidersClient.ts ✨ Enhancement +61/-0

Implement ProvidersClient for provider registration

• New client implementation for DCM Providers API
• Provides CRUD operations for providers (list, get, create, apply/update, delete)
• Uses PUT method for apply operation to replace entire provider resource

workspaces/dcm/plugins/dcm-common/src/clients/ProvidersClient.ts


34. workspaces/dcm/plugins/dcm/src/utils/createYupValidator.ts ✨ Enhancement +58/-0

Create Yup validator factory utility

• New utility factory for creating type-safe form validators from Yup schemas
• Returns validate and isValid functions with proper error handling
• Supports optional transform function for pre-processing form values

workspaces/dcm/plugins/dcm/src/utils/createYupValidator.ts


35. workspaces/dcm/plugins/dcm-common/src/clients/CatalogApi.ts ✨ Enhancement +56/-0

Define CatalogApi interface for catalog operations

• New interface defining DCM Catalog API contract
• Specifies CRUD operations for ServiceTypes, CatalogItems, and CatalogItemInstances
• Includes list, get, create, update, and delete methods

workspaces/dcm/plugins/dcm-common/src/clients/CatalogApi.ts


36. workspaces/dcm/plugins/dcm-common/src/clients/PlacementApi.ts ✨ Enhancement +54/-0

Define PlacementApi interface for resource operations

• New interface defining DCM Placement Manager API contract
• Specifies operations for resource management (list, get, create, delete, rehydrate)
• Includes filtering options for resource listing by provider

workspaces/dcm/plugins/dcm-common/src/clients/PlacementApi.ts


37. workspaces/dcm/plugins/dcm-common/src/types/placement.ts ✨ Enhancement +56/-0

Define placement API types and data structures

• New type definitions for DCM Placement Management API
• Defines Resource, ResourceList, and RehydrateRequest interfaces
• Includes approval status, provider assignment, and specification fields

workspaces/dcm/plugins/dcm-common/src/types/placement.ts


38. workspaces/dcm/plugins/dcm-backend/config.d.ts ⚙️ Configuration changes +56/-0

Add DCM backend configuration type definitions

• New TypeScript configuration interface for DCM backend settings
• Defines apiGatewayUrl, ssoBaseUrl, clientId, and clientSecret options
• Marks sensitive fields with visibility annotations for security

workspaces/dcm/plugins/dcm-backend/config.d.ts


39. workspaces/dcm/plugins/dcm-common/src/clients/PolicyManagerApi.ts ✨ Enhancement +14/-21

Define PolicyManagerApi interface for policy operations

• Replace example component with PolicyManagerApi interface definition
• Specifies CRUD operations for policies (list, get, create, update, delete)
• Provides contract for policy management functionality

workspaces/dcm/plugins/dcm-common/src/clients/PolicyManagerApi.ts


40. workspaces/dcm/plugins/dcm-common/src/types/common.ts ✨ Enhancement +52/-0

Define common types for DCM API services

• New common types shared across DCM API services
• Defines DcmErrorType enum with RFC 7807 error codes
• Includes DcmApiError and DcmHealth interfaces for error and health responses

workspaces/dcm/plugins/dcm-common/src/types/common.ts


41. workspaces/dcm/plugins/dcm-common/src/types/policy-manager.ts ✨ Enhancement +50/-0

Define policy manager API types and data structures

• New type definitions for DCM Policy Manager API
• Defines Policy, PolicyList, and PolicyType interfaces
• Includes OPA Rego code, priority, label selectors, and lifecycle fields

workspaces/dcm/plugins/dcm-common/src/types/policy-manager.ts


42. workspaces/dcm/plugins/dcm-common/src/clients/ProvidersApi.ts ✨ Enhancement +11/-5

Define ProvidersApi interface for provider operations

• Replace placeholder with ProvidersApi interface definition
• Specifies CRUD operations for providers (list, get, create, apply, delete)
• Provides contract for provider management functionality

workspaces/dcm/plugins/dcm-common/src/clients/ProvidersApi.ts


43. workspaces/dcm/plugins/dcm/src/routes.ts ✨ Enhancement +38/-0

Add new route references for API management tabs

• Add six new sub-route references for API-aligned tabs
• Creates routes for providers, policies, service types, catalog items, instances, and resources
• All routes are children of the root DCM route

workspaces/dcm/plugins/dcm/src/routes.ts


44. workspaces/dcm/plugins/dcm-common/src/clients/index.ts ✨ Enhancement +26/-0

Create client module barrel exports

• New barrel export file for all client classes and interfaces
• Exports DcmBaseClient and four concrete client implementations
• Exports all API interface types for public consumption

workspaces/dcm/plugins/dcm-common/src/clients/index.ts


45. workspaces/dcm/plugins/dcm/src/components/dcmStyles.ts ✨ Enhancement +21/-0

Add component styling for forms and tables

• Add new style definitions for name cells, API version chips, and truncated text
• Add dialog error banner styling with top margin
• Styles support flex table layouts and text overflow handling

workspaces/dcm/plugins/dcm/src/components/dcmStyles.ts


46. workspaces/dcm/plugins/dcm-backend/src/router.ts ✨ Enhancement +3/-0

Register DCM proxy route handler

• Import and register new createDcmProxy route handler
• Add /proxy/* route to handle proxied API requests
• Enables backend to forward requests to upstream DCM API gateway

workspaces/dcm/plugins/dcm-backend/src/router.ts


47. workspaces/dcm/plugins/dcm-common/src/index.ts ✨ Enhancement +5/-0
 Expand public API exports for dcm-common package

workspaces/dcm/plugins/dcm-common/src/index.ts


48. workspaces/dcm/plugins/dcm/src/index.ts ✨ Enhancement +6/-0

Export API references from main plugin entry point

• Export four API references (catalogApiRef, placementApiRef, policyManagerApiRef,
 providersApiRef)
• Makes API references available to plugin consumers

workspaces/dcm/plugins/dcm/src/index.ts


49. workspaces/dcm/plugins/dcm-backend/src/plugin.ts ✨ Enhancement +4/-0

Add authentication policy for proxy route

• Add HTTP auth policy for /proxy route with user-cookie allow rule
• Enables secure proxying of API requests through backend

workspaces/dcm/plugins/dcm-backend/src/plugin.ts


50. workspaces/dcm/plugins/dcm/src/utils/extractApiError.ts ✨ Enhancement +3/-1

Re-export extractApiError utility function

• Replace empty export with re-export of extractApiError from dcm-common
• Allows consumers to import from either path for convenience

workspaces/dcm/plugins/dcm/src/utils/extractApiError.ts


51. workspaces/dcm/scripts/dynamic-plugins.sh ⚙️ Configuration changes +235/-0

Add dynamic plugins build and packaging script

• New comprehensive bash script for building and packaging dynamic plugins
• Supports OCI artifact creation, tarball extraction, and Backstage image building
• Includes version management, registry configuration, and pre-release handling

workspaces/dcm/scripts/dynamic-plugins.sh


52. workspaces/dcm/plugins/dcm-common/report.api.md 📝 Documentation +487/-0

Update API documentation report

• Update API report with new client classes and interfaces
• Documents all exported types for Catalog, Placement, Policy Manager, and Providers APIs
• Includes error types, base client, and utility functions

workspaces/dcm/plugins/dcm-common/report.api.md


53. workspaces/dcm/plugins/dcm/src/pages/catalog-items/components/CatalogItemFormFields.tsx ✨ Enhancement +451/-0

Create catalog item form fields component

• New component for rendering catalog item form fields
• Supports dynamic field management (add, remove, edit) with validation
• Includes schema editor dialog and file import functionality for JSON/YAML

workspaces/dcm/plugins/dcm/src/pages/catalog-items/components/CatalogItemFormFields.tsx


54. workspaces/dcm/plugins/dcm/src/pages/catalog-items/CatalogItemsTabContent.tsx ✨ Enhancement +399/-0

Create catalog items management tab

• New tab content component for managing catalog items
• Implements CRUD operations with drawer-based form UI
• Displays items in table with columns for name, API version, service type, and fields

workspaces/dcm/plugins/dcm/src/pages/catalog-items/CatalogItemsTabContent.tsx


55. workspaces/dcm/plugins/dcm/src/pages/policies/PoliciesTabContent.tsx ✨ Enhancement +387/-0

Create policies management tab

• New tab content component for managing policies
• Implements CRUD operations with inline enable/disable toggle
• Displays policies in table with columns for name, type, priority, and description

workspaces/dcm/plugins/dcm/src/pages/policies/PoliciesTabContent.tsx


56. workspaces/dcm/plugins/dcm/src/pages/providers/ProvidersTabContent.tsx ✨ Enhancement +354/-0

Create providers management tab

• New tab content component for managing providers
• Implements CRUD operations with provider registration and editing
• Displays providers in table with columns for name, endpoint, service type, and operations

workspaces/dcm/plugins/dcm/src/pages/providers/ProvidersTabContent.tsx


57. workspaces/dcm/plugins/dcm/src/components/DcmFormDialogActions.test.tsx 🧪 Tests +109/-0

Add tests for DcmFormDialogActions component

• New test file for DcmFormDialogActions component
• Tests button rendering, label customization, click handlers, and disabled states
• Covers submitting state with spinner display

workspaces/dcm/plugins/dcm/src/components/DcmFormDialogActions.test.tsx


58. workspaces/dcm/plugins/dcm-common/package.json ⚙️ Configuration changes +1/-1

Release dcm-common package version 1.0.0

• Bump version from 0.1.0 to 1.0.0

workspaces/dcm/plugins/dcm-common/package.json


59. workspaces/dcm/plugins/dcm/src/pages/service-spec/ServiceSpecsTabContent.tsx ✨ Enhancement +152/-49

Migrate service specs to real catalog API with async operations

• Refactored to load service specs from catalogApi instead of mock data, with loading state and
 error handling
• Extracted helper functions (catalogItemToServiceSpec, specFormToCatalogItem, state updaters)
 to reduce nesting depth
• Converted create/edit/delete handlers to async with fallback optimistic updates on API failures
• Added Progress spinner display during data load

workspaces/dcm/plugins/dcm/src/pages/service-spec/ServiceSpecsTabContent.tsx


60. workspaces/dcm/plugins/dcm/src/pages/data-center/EnvironmentsTabContent.tsx ✨ Enhancement +138/-53

Migrate environments to real providers API with async operations

• Refactored to load environments from providersApi instead of mock data, with loading state and
 error handling
• Extracted helper functions (providerToEnvironment, formToProvider, state updaters) to reduce
 function nesting
• Converted register/edit/delete handlers to async with fallback optimistic updates on API failures
• Added Progress spinner display during data load

workspaces/dcm/plugins/dcm/src/pages/data-center/EnvironmentsTabContent.tsx


61. workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/components/InstanceFormFields.tsx ✨ Enhancement +266/-0

New form fields component for catalog item instances

• New component for rendering form fields in catalog item instance creation/editing dialogs
• Supports dynamic field rendering based on catalog item schema (text, number, enum fields)
• Displays helper text with field metadata (path, type, min/max constraints)
• Handles catalog item selection and user value updates

workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/components/InstanceFormFields.tsx


62. workspaces/dcm/plugins/dcm/src/pages/resources/ResourcesTabContent.tsx ✨ Enhancement +261/-0

New resources tab with CRUD operations

• New tab content component for managing resources using useCrudTab hook
• Loads resources and instances from APIs, displays in searchable paginated table
• Supports resource creation and deletion with form dialogs
• Integrates DcmCrudTabLayout for consistent UI and error handling

workspaces/dcm/plugins/dcm/src/pages/resources/ResourcesTabContent.tsx


63. workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/CatalogItemInstancesTabContent.tsx ✨ Enhancement +253/-0

New catalog item instances tab with CRUD operations

• New tab content component for managing catalog item instances using useCrudTab hook
• Loads instances and catalog items from API, displays in searchable paginated table
• Supports instance creation and deletion with form dialogs
• Integrates DcmCrudTabLayout for consistent UI and error handling

workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/CatalogItemInstancesTabContent.tsx


64. workspaces/dcm/plugins/dcm/src/components/DcmCrudTabLayout.tsx ✨ Enhancement +184/-0

New generic CRUD tab layout component

• New generic layout component for CRUD tab pages with loading, error, empty, and table states
• Handles search, pagination, and column rendering via props
• Shows error alert with optional Retry button when loadError is set
• Displays empty state illustration when no items exist

workspaces/dcm/plugins/dcm/src/components/DcmCrudTabLayout.tsx


65. workspaces/dcm/plugins/dcm/src/pages/service-types/ServiceTypesTabContent.tsx ✨ Enhancement +198/-0

New service types read-only tab

• New tab content component for displaying service types in read-only table
• Loads service types from catalogApi.listServiceTypes() with loading state
• Supports client-side search and pagination
• Shows empty state when no service types are available

workspaces/dcm/plugins/dcm/src/pages/service-types/ServiceTypesTabContent.tsx


66. workspaces/dcm/plugins/dcm/src/pages/resources/components/ResourceFormFields.tsx ✨ Enhancement +185/-0

New form fields component for resources

• New component for rendering resource creation/edit form fields
• Supports catalog item instance selection, JSON spec input with file upload, and optional resource
 ID
• Includes validation error display and helper text for each field
• Provides file upload button to parse JSON from file

workspaces/dcm/plugins/dcm/src/pages/resources/components/ResourceFormFields.tsx


67. workspaces/dcm/plugins/dcm/src/pages/providers/components/ProviderFormFields.tsx ✨ Enhancement +176/-0

New form fields component for providers

• New component for rendering provider creation/edit form fields
• Supports name, endpoint, service type selection, schema version, and operations multi-select
• Includes validation error display and helper text for each field
• Dynamically populates service type dropdown from available service types

workspaces/dcm/plugins/dcm/src/pages/providers/components/ProviderFormFields.tsx


68. workspaces/dcm/Dockerfile ⚙️ Configuration changes +118/-0

New Dockerfile for containerized deployment

• New multi-stage Docker build configuration for containerizing the DCM application
• Stage 1 builds TypeScript and React app; Stage 2 creates production image with minimal
 dependencies
• Configures Yarn 3.x via Corepack and handles workspace dependency resolution
• Exposes port 7007 and runs Backstage backend with production config overrides

workspaces/dcm/Dockerfile


69. workspaces/dcm/plugins/dcm/src/pages/policies/components/PolicyFormFields.tsx ✨ Enhancement +164/-0

New form fields component for policies

• New component for rendering policy creation/edit form fields
• Supports display name, description, policy type (GLOBAL/USER), priority, Rego code, and enabled
 toggle
• Includes validation error display and helper text for each field
• Provides Rego code template placeholder for OPA policy definition

workspaces/dcm/plugins/dcm/src/pages/policies/components/PolicyFormFields.tsx


70. workspaces/dcm/package.json Dependencies +8/-2

Update dependencies and build configuration

• Updated Yarn version from 3.8.7 to 4.12.0
• Added ae-undocumented to API report exclusions
• Added dev dependencies for type definitions (@types/jest, @types/node, @types/webpack-env)
• Added yup as workspace dependency for schema validation

workspaces/dcm/package.json


71. workspaces/dcm/plugins/dcm/src/pages/providers/components/ProviderStatus.tsx ✨ Enhancement +92/-0

New provider status display component

• New component that maps provider health_status string to Backstage Status icons
• Normalizes status values and renders appropriate status component (OK, Warning, Error, Running,
 Aborted, Pending)
• Displays status in a styled chip with icon and text

workspaces/dcm/plugins/dcm/src/pages/providers/components/ProviderStatus.tsx


72. workspaces/dcm/plugins/dcm/src/components/TruncatedText.tsx ✨ Enhancement +77/-0

New truncated text component with tooltip

• New component for rendering text with ellipsis truncation and tooltip on hover
• Supports configurable max-width, typography variant, color, and bold styling
• Provides DcmEmptyCell helper for standard empty-state placeholder
• Useful for table cells with unbounded text content

workspaces/dcm/plugins/dcm/src/components/TruncatedText.tsx


73. workspaces/dcm/plugins/dcm/package.json Dependencies +5/-2

Update plugin version and add validation dependencies

• Bumped plugin version from 0.1.0 to 1.0.0
• Added dependencies: js-yaml and yup for YAML parsing and schema validation
• Added dev dependency @types/js-yaml for TypeScript support

workspaces/dcm/plugins/dcm/package.json


74. workspaces/dcm/plugins/dcm/src/components/DcmDeleteDialog.test.tsx 🧪 Tests +61/-0

New tests for delete dialog component

• New unit test file for DcmDeleteDialog component
• Tests rendering of resource name, custom/default resource labels, button callbacks, and closed
 state
• Uses React Testing Library for component testing

workspaces/dcm/plugins/dcm/src/components/DcmDeleteDialog.test.tsx


75. workspaces/dcm/.changeset/slim-lobsters-refactor.md 📝 Documentation +41/-0

Changeset documenting major frontend refactoring

• Documents refactoring of DCM frontend plugin for reusability and maintainability
• Lists new shared utilities (createYupValidator, useCrudTab), components (DcmCrudTabLayout,
 DcmFormDialogActions, DcmErrorSnackbar, DcmDeleteDialog)
• Describes per-feature file decomposition with dedicated form types and field components
• Notes error handling improvements, dead code removal, and new test coverage

workspaces/dcm/.changeset/slim-lobsters-refactor.md


76. workspaces/dcm/plugins/dcm/src/pages/data-center/DataCenterPage.tsx ✨ Enhancement +36/-8

Refactor data center page tabs to new architecture

• Replaced old EnvironmentsTabContent and ServiceSpecsTabContent with new tabs: Providers,
 Policies, Service types, Catalog items, Instances, Resources
• Updated route references to use new route refs from routes.ts
• Reorganized tab structure to match new data model (providers → policies → service types → catalog
 items → instances → resources)

workspaces/dcm/plugins/dcm/src/pages/data-center/DataCenterPage.tsx


77. workspaces/dcm/plugins/dcm/src/pages/providers/components/CopyButton.tsx ✨ Enhancement +65/-0

New copy-to-clipboard button component

• New component for icon button that copies text to clipboard
• Shows brief checkmark icon feedback after successful copy
• Includes tooltip showing "Copy" or "Copied!" state

workspaces/dcm/plugins/dcm/src/pages/providers/components/CopyButton.tsx


78. workspaces/dcm/plugins/dcm/src/components/DcmFormDialogActions.tsx ✨ Enhancement +70/-0

New standardized form dialog actions component

• New reusable component for form dialog action buttons (Submit/Cancel)
• Displays loading spinner in submit button when submitting is true
• Supports disabled state for form validation and custom submit label

workspaces/dcm/plugins/dcm/src/components/DcmFormDialogActions.tsx


79. workspaces/dcm/app-config.production.yaml ⚙️ Configuration changes +50/-0

New production configuration file

• New production configuration file with environment variable overrides
• Configures app/backend base URLs, in-memory SQLite database, and DCM API gateway settings
• Enables guest auth provider for non-development environments
• Disables TechDocs Docker-in-Docker and removes local file catalog locations

workspaces/dcm/app-config.production.yaml


80. workspaces/dcm/plugins/dcm/report.api.md 📝 Documentation +23/-0

Update API report with new exports and routes

• Updated API report with new exported API refs: catalogApiRef, placementApiRef,
 policyManagerApiRef, providersApiRef
• Added new route refs: providers, policies, serviceTypes, catalogItems,
 catalogItemInstances, resources
• Updated imports to include new API types from common package

workspaces/dcm/plugins/dcm/report.api.md


81. workspaces/dcm/plugins/dcm-backend/package.json ⚙️ Configuration changes +2/-2

Update backend plugin version and add config schema

• Bumped backend plugin version from 0.1.0 to 1.0.0
• Added configSchema field pointing to config.d.ts for Backstage config validation

workspaces/dcm/plugins/dcm-backend/package.json


82. workspaces/dcm/plugins/dcm/src/components/DcmErrorSnackbar.tsx ✨ Enhancement +55/-0

New error snackbar notification component

• New component for displaying transient error notifications at bottom-center of screen
• Renders nothing when error is falsy; auto-hides after configurable duration (default 8s)
• Uses MUI Snackbar and Alert for consistent styling

workspaces/dcm/plugins/dcm/src/components/DcmErrorSnackbar.tsx


83. workspaces/dcm/plugins/dcm/src/components/DcmDeleteDialog.tsx ✨ Enhancement +60/-0

New generic delete confirmation dialog

• New generic delete-confirmation dialog component reused across all DCM resource tabs
• Displays resource name and customizable resource label in confirmation message
• Provides Delete and Cancel buttons with secondary/primary styling

workspaces/dcm/plugins/dcm/src/components/DcmDeleteDialog.tsx


84. workspaces/dcm/plugins/dcm/src/components/DcmFormDialog.tsx ✨ Enhancement +14/-0

Enhance form dialog with error display and submitting state

• Enhanced with error banner display between form content and action buttons
• Added submitting prop to disable close button during request in-flight
• Added Collapse animation for error banner appearance/disappearance

workspaces/dcm/plugins/dcm/src/components/DcmFormDialog.tsx


85. workspaces/dcm/plugins/dcm/src/components/DcmDataCenterTabEmptyState.tsx ✨ Enhancement +11/-5

Make empty state action button optional

• Made primaryActionLabel and onPrimaryAction optional props
• Conditionally renders action button only when both props are provided
• Allows empty state to be used without action button

workspaces/dcm/plugins/dcm/src/components/DcmDataCenterTabEmptyState.tsx


86. workspaces/dcm/plugins/dcm/src/components/dcmTabListHelpers.tsx ✨ Enhancement ...

@rhdh-qodo-merge rhdh-qodo-merge Bot added enhancement New feature or request Tests labels Apr 20, 2026
Ran `yarn --cwd workspaces/dcm dedupe` to collapse the duplicate
@types/node entry (20.19.33 → 20.19.39).

Made-with: Cursor
@asmasarw asmasarw changed the title Feature/deployment Add Deploy Scripts for Both OCI and Dockerise Apr 20, 2026
@asmasarw asmasarw changed the title Add Deploy Scripts for Both OCI and Dockerise Create Deploy Scripts for Both Dynamic-Plugin and Backstage-Standalone Apr 20, 2026
@sonarqubecloud
Copy link
Copy Markdown

@asmasarw asmasarw changed the title Create Deploy Scripts for Both Dynamic-Plugin and Backstage-Standalone Create Deployment Scripts for Both Dynamic-Plugin and Backstage-Standalone Apr 20, 2026
@asmasarw asmasarw enabled auto-merge (squash) April 20, 2026 12:38
Copy link
Copy Markdown
Member

@mareklibra mareklibra left a comment

Choose a reason for hiding this comment

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

This is good for (dev-) testing but eventually you will need OCI builds by https://github.com/redhat-developer/rhdh-plugin-export-overlays .

For the NPM packages for vanilla Backstage deployment, the rhdh-plugins' repo CI with its changesets and Version package PRs is the best option.

@asmasarw asmasarw merged commit ba41609 into redhat-developer:main Apr 20, 2026
13 checks passed
@asmasarw asmasarw deleted the feature/deployment branch April 29, 2026 14:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants