Skip to content

Feature/multi servicetypes - #4172

Open
asmasarw wants to merge 3 commits into
redhat-developer:mainfrom
asmasarw:feature/multi-servicetypes
Open

Feature/multi servicetypes#4172
asmasarw wants to merge 3 commits into
redhat-developer:mainfrom
asmasarw:feature/multi-servicetypes

Conversation

@asmasarw

@asmasarw asmasarw commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Hey, I just made a Pull Request!

✔️ Checklist

  • A changeset describing the change and affected packages. (more info)
  • Added or Updated documentation
  • Tests for new functionality and regression tests for bug fixes
  • Screenshots attached (for UI changes)

@asmasarw
asmasarw requested review from a team, jkilzi and mareklibra as code owners August 5, 2026 10:14
@rhdh-gh-app

rhdh-gh-app Bot commented Aug 5, 2026

Copy link
Copy Markdown

Important

This PR includes changes that affect public-facing API. Please ensure you are adding/updating documentation for new features or behavior.

Changed Packages

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

@sonarqubecloud

sonarqubecloud Bot commented Aug 5, 2026

Copy link
Copy Markdown

@rhdh-qodo-merge

Copy link
Copy Markdown

PR Summary by Qodo

Add cursor pagination across DCM tabs and support multi-resource catalog items

✨ Enhancement 🧪 Tests 📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Add server-side cursor pagination to all DCM tabs with shared controls and hooks.
• Update DCM API/types to support multi-resource catalog items and instances.
• Replace create/edit forms with vertical-tab wizards and expand automated pagination tests.
Diagram

graph TD
  A["DCM Tab Pages"] --> B["Paginated Hooks"] --> C["DCM API Clients"] --> D{{"DCM Backend"}}
  A --> E["Table Layouts"] --> F["Cursor Controls"]
  C --> G["Pagination Query"]
  subgraph Legend
    direction LR
    _ui["UI"] ~~~ _hook["Hook"] ~~~ _client["Client"] ~~~ _ext{{"Backend"}}
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Adopt react-query infinite queries
  • ➕ Built-in caching, refetching, and request de-duping across tabs
  • ➕ Standardizes loading/error states and retry behavior
  • ➖ Adds architectural dependency/complexity for a plugin currently using local hooks
  • ➖ Would require reworking existing CRUD hook patterns and tests
2. Use Backstage Table paging with synthetic offsets
  • ➕ Leverages existing Table pagination UI without custom controls
  • ➖ Cursor pagination cannot reliably map to offset/page numbers
  • ➖ Would misrepresent total counts and break Previous without token history
3. Backend-side search/filtering for list endpoints
  • ➕ Search works across full dataset, not just current page
  • ➕ Reduces client-side filtering inconsistencies
  • ➖ Requires backend API changes; outside current PR scope
  • ➖ Would need new query param contract and server test coverage

Recommendation: The PR’s approach (token-stack cursor pagination via shared hooks + shared controls, and explicit multi-resource API types + wizards) is the best fit for cursor-based backends and keeps tab implementations consistent. The main follow-up worth considering is server-side search/filtering once backend support exists; for now, keeping search client-side on the current page is a reasonable tradeoff.

Files changed (55) +4659 / -1746

Enhancement (33) +3432 / -674
CatalogApi.tsAdd pagination params to CatalogApi list methods +6/-3

Add pagination params to CatalogApi list methods

• Extends listServiceTypes, listCatalogItems, and listCatalogItemInstances to accept optional PaginationParams. Aligns the client interface with server-side cursor pagination support.

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

CatalogClient.tsAdd shared cursor pagination support to catalog client list calls +20/-6

Add shared cursor pagination support to catalog client list calls

• Updates CatalogClient list methods to accept PaginationParams and append query strings using buildPaginationQuery. Enables consistent max_page_size/page_token handling for service types, catalog items, and instances.

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

PolicyManagerApi.tsAdd optional pagination params to PolicyManagerApi.listPolicies +2/-1

Add optional pagination params to PolicyManagerApi.listPolicies

• Updates the PolicyManagerApi interface so listPolicies accepts optional PaginationParams. Prepares the policies tab for server-side cursor paging.

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

PolicyManagerClient.tsAppend pagination query params for listing policies +4/-2

Append pagination query params for listing policies

• Updates PolicyManagerClient.listPolicies to accept PaginationParams and append them via buildPaginationQuery. Keeps the URL construction consistent with other clients.

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

ProvidersApi.tsAdd optional pagination params to ProvidersApi.listProviders +2/-1

Add optional pagination params to ProvidersApi.listProviders

• Updates the ProvidersApi interface so listProviders accepts optional PaginationParams. Enables providers list to be fetched page-by-page.

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

ProvidersClient.tsAppend pagination query params for listing providers +4/-2

Append pagination query params for listing providers

• Updates ProvidersClient.listProviders to accept PaginationParams and append them via buildPaginationQuery. Supports cursor paging for the providers tab.

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

index.tsExport shared pagination query builder +1/-0

Export shared pagination query builder

• Exports buildPaginationQuery from the dcm-common package entrypoint. Allows all consumers/clients to share identical query formatting.

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

catalog.tsModel catalog items/instances for multiple resources and optional next tokens +24/-7

Model catalog items/instances for multiple resources and optional next tokens

• Replaces CatalogItemSpec.service_type with resources?: CatalogResource[]. Adds CatalogResource with name/service_type/requires_resources/fields. Updates instance spec to resource_ids and requires UserValue.resource; makes next_page_token optional in list responses.

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

common.tsIntroduce shared PaginationParams type +13/-0

Introduce shared PaginationParams type

• Adds PaginationParams (max_page_size, page_token) as the shared cursor pagination query shape across list endpoints. Documents constraints and intent for public API consumption.

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

buildPaginationQuery.tsAdd buildPaginationQuery utility for cursor pagination +32/-0

Add buildPaginationQuery utility for cursor pagination

• Introduces a small utility to build URL query strings from PaginationParams, returning '' when no params are set. Standardizes pagination query construction across all clients.

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

CursorPaginationControls.tsxAdd reusable cursor pagination controls and table wrapper +150/-0

Add reusable cursor pagination controls and table wrapper

• Adds Previous/Next cursor navigation controls with an optional page-size selector. Introduces CursorPaginatedTable to render a Backstage Table with built-in paging disabled and the controls attached below.

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

DcmCrudTabLayout.tsxSupport cursor-based pagination mode in CRUD tab layout +62/-30

Support cursor-based pagination mode in CRUD tab layout

• Extends DcmCrudTabLayout to optionally render CursorPaginatedTable when cursorPagination is provided, falling back to client-side paging otherwise. Adjusts empty-state logic to avoid trapping users on empty non-first cursor pages and normalizes page indexing for Table.

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

SchemaButton.tsxExtract inline JSON schema editor button component +279/-0

Extract inline JSON schema editor button component

• Introduces SchemaButton as a reusable dialog-based JSON editor with syntax highlighting, formatting on paste/enter, and validation via validateJsonObject. Replaces schema editing logic previously embedded in catalog item form UI.

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

UserValueFields.tsxExtract reusable user-value field renderer +164/-0

Extract reusable user-value field renderer

• Adds UserValueFields to render editable fields for instances with schema-aware inputs (enum select, number, boolean, text) and per-row error display. Used by per-resource tabs in the instance wizard.

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

VerticalTabDialog.tsxAdd shared vertical-tab wizard dialog shell +293/-0

Add shared vertical-tab wizard dialog shell

• Adds a shared dialog layout with left-side vertical tabs, scrollable content, and Back/Next/Submit footer behavior. Supports optional onBeforeNext gating so wizards can reveal validation errors before advancing.

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

dcmTabListHelpers.tsxAdd cursor-pagination mode to DcmSearchTableCard +49/-26

Add cursor-pagination mode to DcmSearchTableCard

• Updates DcmSearchTableCard to optionally render CursorPaginatedTable instead of the Table’s built-in pager. Introduces a backwards-compatible CursorPaginationProps alias and normalizes page indexing behavior for client-side mode.

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

useCrudTab.tsAllow server-side pagination via PagedLoadResult + expose nextPageToken +28/-3

Allow server-side pagination via PagedLoadResult + expose nextPageToken

• Expands loadFn return type to support either an array or a PagedLoadResult containing items and a nextPageToken. Stores nextPageToken in hook state and clears it on plain-array results or load failures.

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

usePaginatedCrudTab.tsAdd usePaginatedCrudTab hook for cursor pagination in CRUD tabs +203/-0

Add usePaginatedCrudTab hook for cursor pagination in CRUD tabs

• Introduces a wrapper around useCrudTab that manages cursor token stacks, Previous/Next navigation, and persisted page size. Provides ready-to-spread cursorPagination props and a search handler that does not reset cursor state.

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

usePaginatedFetch.tsAdd generic cursor pagination hook for read-only lists +185/-0

Add generic cursor pagination hook for read-only lists

• Introduces usePaginatedFetch, a generic hook that manages cursor navigation with a token stack, loading/error handling, refresh, and reset-to-first-page behavior. Designed for non-CRUD list tabs like Service Types and Resources.

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

CatalogItemInstancesTabContent.tsxPaginate instances list and migrate instance create flow to wizard +48/-60

Paginate instances list and migrate instance create flow to wizard

• Switches instances tab to usePaginatedCrudTab and updates list fetching to pass cursor params to the API. Migrates resource_id UI to resource_ids and replaces the create dialog with InstanceWizardDialog.

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

InstanceWizardDialog.tsxAdd vertical-tab wizard for creating catalog item instances +359/-0

Add vertical-tab wizard for creating catalog item instances

• Adds an instance creation wizard with an Overview tab and one tab per resource containing editable fields. Builds per-resource value rows from the selected catalog item and validates scalar fields and per-resource values before submission.

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

instanceFormTypes.tsGroup instance user values by resource and include resource in API payload +104/-64

Group instance user values by resource and include resource in API payload

• Changes InstanceForm to hold resource_values per resource and updates validation to iterate across resources. Replaces buildUserValueRows with buildResourceUserValues and updates formToInstance to emit UserValue objects including resource name.

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

CatalogItemsTabContent.tsxPaginate catalog items list and migrate create/edit to wizard +94/-239

Paginate catalog items list and migrate create/edit to wizard

• Switches catalog items tab to usePaginatedCrudTab and fetches service types once on mount for dropdowns. Updates table columns to show resources (chips per resource service_type) and sums field counts across resources; replaces form drawer with CatalogItemWizardDialog.

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

catalogItemFormTypes.tsRedefine catalog item form for multi-resource specs and validations +225/-115

Redefine catalog item form for multi-resource specs and validations

• Replaces single service_type/fields with a resources array (ResourceFormEntry) including dependencies and per-resource fields. Adds resource-level validation (unique/patterned names, required service type) and reuses validateJsonObject for schema checks; updates overall form validity rules accordingly.

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

CatalogItemWizardDialog.tsxAdd vertical-tab wizard for catalog item create/edit with multi-resources +682/-0

Add vertical-tab wizard for catalog item create/edit with multi-resources

• Introduces a multi-step wizard with Overview/API/Resources tabs and per-resource field configuration tabs. Supports JSON/YAML import, resource dependency selection, per-resource field editing via ResourceFieldsPanel, and edit-mode immutability constraints.

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

ResourceFieldsPanel.tsxAdd per-resource field editor panel for catalog item wizard +229/-0

Add per-resource field editor panel for catalog item wizard

• Adds a focused component for editing field rows for a single resource, including add/remove actions and row-level validation. Integrates SchemaButton and submit-attempt validation for required non-empty field paths.

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

PoliciesTabContent.tsxConvert policies tab to server-side cursor pagination +16/-10

Convert policies tab to server-side cursor pagination

• Replaces useCrudTab with usePaginatedCrudTab and updates listPolicies calls to pass page_token/max_page_size. Wires cursor pagination props into DcmCrudTabLayout while keeping search client-side on the current page.

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

ProvidersTabContent.tsxConvert providers tab to cursor pagination and fetch service types once +22/-20

Convert providers tab to cursor pagination and fetch service types once

• Switches to usePaginatedCrudTab for listing providers and passes cursor params to listProviders. Moves service type dropdown loading into a mount-only effect with max_page_size: 100 to avoid truncation during pagination navigation.

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

ResourcesTabContent.tsxConvert resources tab to usePaginatedFetch cursor pagination +42/-40

Convert resources tab to usePaginatedFetch cursor pagination

• Replaces the manual load/useEffect implementation with usePaginatedFetch and passes cursor params to listServiceTypeInstances. Updates DcmSearchTableCard to use cursor pagination controls and fixes empty-state behavior for non-first pages.

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

ServiceTypesTabContent.tsxConvert service types tab to usePaginatedFetch cursor pagination +42/-43

Convert service types tab to usePaginatedFetch cursor pagination

• Replaces manual load logic with usePaginatedFetch and passes cursor params to listServiceTypes. Updates the search table card to render cursor pagination controls and adjusts loading/error/empty-state handling for cursor mode.

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

validateJsonObject.tsAdd shared JSON-object validation helper +44/-0

Add shared JSON-object validation helper

• Introduces validateJsonObject to validate that a raw string is either empty, valid JSON syntax, and specifically a JSON object (not array/primitive). Used by SchemaButton and catalog item field validation to de-duplicate parsing/shape checks.

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

PolicyManagerApi.tsPolicy manager API pagination signature update +2/-1

Policy manager API pagination signature update

• Adds optional PaginationParams to listPolicies so policy lists can be fetched with cursor-based pagination parameters.

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

ProvidersApi.tsProviders API pagination signature update +2/-1

Providers API pagination signature update

• Adds optional PaginationParams to listProviders so provider lists can be fetched with cursor-based pagination parameters.

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

Refactor (2) +16 / -967
InstanceFormFields.tsxDeprecate legacy instance form fields component +8/-312

Deprecate legacy instance form fields component

• Removes the previous monolithic InstanceFormFields implementation in favor of InstanceWizardDialog and shared UserValueFields. Keeps the file as a minimal stub in the diff context (functionality moved).

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

CatalogItemFormFields.tsxRemove legacy catalog item form fields component (moved to wizard) +8/-655

Remove legacy catalog item form fields component (moved to wizard)

• Removes the previous large CatalogItemFormFields implementation that handled import, service type selection, and field editing inline. Functionality is replaced by CatalogItemWizardDialog and extracted shared components.

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

Tests (11) +1075 / -83
CatalogClient.test.tsUpdate catalog client fixtures for resource_ids +1/-1

Update catalog client fixtures for resource_ids

• Adjusts mocked CatalogItemInstance data to use spec.resource_ids and removes legacy resource_id usage. Keeps client tests aligned with the updated instance spec shape.

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

ProvidersClient.test.tsAdd providers client test for pagination query params +13/-0

Add providers client test for pagination query params

• Adds coverage asserting listProviders appends max_page_size and page_token to the request URL. Validates new shared pagination behavior for provider listings.

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

buildPaginationQuery.test.tsAdd unit tests for buildPaginationQuery +55/-0

Add unit tests for buildPaginationQuery

• Adds coverage for empty params, single-param cases, combined params, and omission rules (empty token/undefined size). Ensures stable query-string output.

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

useCrudTab.test.tsAdd tests for server-paginated load results +45/-0

Add tests for server-paginated load results

• Adds test coverage for loadFn returning a PagedLoadResult, including nextPageToken extraction, empty-token behavior, and clearing token on errors. Ensures the base CRUD hook can power cursor pagination wrappers.

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

usePaginatedFetch.test.tsAdd comprehensive tests for usePaginatedFetch cursor behavior +256/-0

Add comprehensive tests for usePaginatedFetch cursor behavior

• Adds tests for initial load, next/prev navigation, refresh/reset behavior, and regression coverage ensuring cursor state is not reset by parent rerenders (e.g., search text updates). Validates hasNext/hasPrev transitions and token stack logic.

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

instanceFormTypes.test.tsUpdate instance form type tests for multi-resource user values +60/-22

Update instance form type tests for multi-resource user values

• Replaces tests for buildUserValueRows with buildResourceUserValues and updates formToInstance expectations to include UserValue.resource. Adjusts fixtures to use resource_values grouped by resource name.

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

CatalogItemFormFields.test.tsxMigrate catalog item import tests to new wizard dialog +33/-38

Migrate catalog item import tests to new wizard dialog

• Updates tests to render CatalogItemWizardDialog instead of the removed CatalogItemFormFields component. Updates valid import payload to the new spec.resources structure and modernizes async assertions.

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

PoliciesTabContent.test.tsxAdd cursor pagination behavior tests for policies tab +82/-4

Add cursor pagination behavior tests for policies tab

• Updates policy API mocks to include next_page_token and adds tests covering pagination param passing, Next/Previous button states, and token propagation on Next. Refreshes some async assertions to use findBy queries.

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

ProvidersTabContent.test.tsxAdd provider tab cursor pagination test coverage +293/-0

Add provider tab cursor pagination test coverage

• Adds a new test suite covering initial paginated load, error/retry behavior, and Next/Previous token navigation for providers. Ensures listProviders is called with pagination params and UI buttons reflect next_page_token presence.

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

ResourcesTabContent.test.tsxAdd resources tab cursor pagination test coverage +225/-0

Add resources tab cursor pagination test coverage

• Adds a new test suite validating paginated list calls, error/retry behavior, and Next/Previous navigation/token passing for resources. Verifies empty-state rendering when no instances are returned.

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

ServiceTypesTabContent.test.tsxStabilize async assertions for service types tab tests +12/-18

Stabilize async assertions for service types tab tests

• Updates tests to use findBy* queries for error/empty state assertions, reducing flakiness with async rendering. Keeps existing behavior coverage while pagination logic moved to hooks.

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

Documentation (9) +136 / -22
multi-resource-catalog-items.mdChangeset for multi-resource catalog items/instances +21/-0

Changeset for multi-resource catalog items/instances

• Adds a minor-version changeset describing the new multi-resource model and the new wizard-based UI flows. Documents key API type changes in dcm-common and table column updates.

workspaces/dcm/.changeset/multi-resource-catalog-items.md

server-side-pagination-all-tabs.mdChangeset for cursor pagination across all tabs +28/-0

Changeset for cursor pagination across all tabs

• Adds a minor-version changeset explaining cursor pagination rollout to all tabs, shared pagination utilities, and test additions. Notes dropdown option fetching changes and optional next_page_token behavior.

workspaces/dcm/.changeset/server-side-pagination-all-tabs.md

report.api.mdUpdate public API report for pagination + multi-resource types +36/-17

Update public API report for pagination + multi-resource types

• Updates the generated API report to reflect PaginationParams, buildPaginationQuery export, optional next_page_token fields, and the new CatalogResource/resources model. Updates policy/provider list signatures to accept pagination params.

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

de.tsAdd pagination navigation translations (DE) +2/-0

Add pagination navigation translations (DE)

• Adds German translations for Previous/Next page labels used by cursor pagination controls. Keeps localization aligned with the new shared pagination UI.

workspaces/dcm/plugins/dcm/src/translations/de.ts

es.tsAdd pagination navigation translations (ES) +2/-0

Add pagination navigation translations (ES)

• Adds Spanish translations for Previous/Next page labels used by cursor pagination controls. Keeps localization aligned with the new shared pagination UI.

workspaces/dcm/plugins/dcm/src/translations/es.ts

fr.tsAdd pagination navigation translations (FR) +2/-0

Add pagination navigation translations (FR)

• Adds French translations for Previous/Next page labels used by cursor pagination controls. Keeps localization aligned with the new shared pagination UI.

workspaces/dcm/plugins/dcm/src/translations/fr.ts

it.tsAdd pagination navigation translations (IT) +2/-0

Add pagination navigation translations (IT)

• Adds Italian translations for Previous/Next page labels used by cursor pagination controls. Keeps localization aligned with the new shared pagination UI.

workspaces/dcm/plugins/dcm/src/translations/it.ts

ja.tsAdd pagination navigation translations (JA) +2/-0

Add pagination navigation translations (JA)

• Adds Japanese translations for Previous/Next page labels used by cursor pagination controls. Keeps localization aligned with the new shared pagination UI.

workspaces/dcm/plugins/dcm/src/translations/ja.ts

ref.tsAdd new reference strings for pagination and multi-resource wizards +41/-5

Add new reference strings for pagination and multi-resource wizards

• Adds common pagination labels (Previous/Next/Back) and new wizard text for catalog items and instances. Updates catalog item descriptions/columns for multi-resource semantics and renames instance column to Resource IDs.

workspaces/dcm/plugins/dcm/src/translations/ref.ts

@codecov

codecov Bot commented Aug 5, 2026

Copy link
Copy Markdown

❌ 18 Tests Failed:

Tests completed Failed Passed Skipped
253 18 235 0
View the top 3 failed test(s) by shortest run time
ref (translation keys) "es" translations has exactly the same keys as ref (no more, no less) should have the same number of keys as ref
Stack Traces | 0s run time
Error: expect(received).toHaveLength(expected)

Expected length: 262
Received length: 239
Received array:  ["page.title", "page.tabs.providers", "page.tabs.policies", "page.tabs.serviceTypes", "page.tabs.catalogItems", "page.tabs.instances", "page.tabs.resources", "common.retry", "common.refresh", "common.search", …]
    at Object.toHaveLength (.../src/translations/ref.test.ts:84:26)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "fr" translations has exactly the same keys as ref (no more, no less) should have no extra keys
Stack Traces | 0s run time
Error: expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 4

- Array []
+ Array [
+   "catalogItems.columns.serviceType",
+   "instances.columns.resourceId",
+ ]
    at Object.toEqual (.../src/translations/ref.test.ts:80:23)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "fr" translations has exactly the same keys as ref (no more, no less) should have the same number of keys as ref
Stack Traces | 0s run time
Error: expect(received).toHaveLength(expected)

Expected length: 262
Received length: 239
Received array:  ["page.title", "page.tabs.providers", "page.tabs.policies", "page.tabs.serviceTypes", "page.tabs.catalogItems", "page.tabs.instances", "page.tabs.resources", "common.retry", "common.refresh", "common.search", …]
    at Object.toHaveLength (.../src/translations/ref.test.ts:84:26)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "it" translations has exactly the same keys as ref (no more, no less) should have no extra keys
Stack Traces | 0s run time
Error: expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 4

- Array []
+ Array [
+   "catalogItems.columns.serviceType",
+   "instances.columns.resourceId",
+ ]
    at Object.toEqual (.../src/translations/ref.test.ts:80:23)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "it" translations has exactly the same keys as ref (no more, no less) should have no missing keys
Stack Traces | 0s run time
Error: expect(received).toEqual(expected) // deep equality

- Expected  -  1
+ Received  + 27

- Array []
+ Array [
+   "catalogItems.columns.resources",
+   "catalogItems.resourceCount_one",
+   "catalogItems.resourceCount_other",
+   "catalogItems.wizard.addResourceButton",
+   "catalogItems.wizard.apiVersionImmutable",
+   "catalogItems.wizard.removeResource",
+   "catalogItems.wizard.requiresResourcesHelper",
+   "catalogItems.wizard.requiresResourcesLabel",
+   "catalogItems.wizard.resourceNameHelper",
+   "catalogItems.wizard.resourceNameLabel",
+   "catalogItems.wizard.resourcesDescription",
+   "catalogItems.wizard.resourcesRequired",
+   "catalogItems.wizard.tabApi",
+   "catalogItems.wizard.tabOverview",
+   "catalogItems.wizard.tabResources",
+   "catalogItems.wizard.unnamedResource",
+   "common.back",
+   "common.next",
+   "instances.columns.resourceIds",
+   "instances.wizard.tabOverview",
+   "validation.catalogItem.resourceNameDuplicate",
+   "validation.catalogItem.resourceNamePattern",
+   "validation.catalogItem.resourceNameRequired",
+   "validation.catalogItem.resourcesRequired",
+   "validation.catalogItem.schemaRequiredNotBoolean",
+ ]
    at Object.toEqual (.../src/translations/ref.test.ts:76:25)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "ja" translations has exactly the same keys as ref (no more, no less) should have no extra keys
Stack Traces | 0s run time
Error: expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 4

- Array []
+ Array [
+   "catalogItems.columns.serviceType",
+   "instances.columns.resourceId",
+ ]
    at Object.toEqual (.../src/translations/ref.test.ts:80:23)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "ja" translations has exactly the same keys as ref (no more, no less) should have no missing keys
Stack Traces | 0s run time
Error: expect(received).toEqual(expected) // deep equality

- Expected  -  1
+ Received  + 27

- Array []
+ Array [
+   "catalogItems.columns.resources",
+   "catalogItems.resourceCount_one",
+   "catalogItems.resourceCount_other",
+   "catalogItems.wizard.addResourceButton",
+   "catalogItems.wizard.apiVersionImmutable",
+   "catalogItems.wizard.removeResource",
+   "catalogItems.wizard.requiresResourcesHelper",
+   "catalogItems.wizard.requiresResourcesLabel",
+   "catalogItems.wizard.resourceNameHelper",
+   "catalogItems.wizard.resourceNameLabel",
+   "catalogItems.wizard.resourcesDescription",
+   "catalogItems.wizard.resourcesRequired",
+   "catalogItems.wizard.tabApi",
+   "catalogItems.wizard.tabOverview",
+   "catalogItems.wizard.tabResources",
+   "catalogItems.wizard.unnamedResource",
+   "common.back",
+   "common.next",
+   "instances.columns.resourceIds",
+   "instances.wizard.tabOverview",
+   "validation.catalogItem.resourceNameDuplicate",
+   "validation.catalogItem.resourceNamePattern",
+   "validation.catalogItem.resourceNameRequired",
+   "validation.catalogItem.resourcesRequired",
+   "validation.catalogItem.schemaRequiredNotBoolean",
+ ]
    at Object.toEqual (.../src/translations/ref.test.ts:76:25)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "de" translations has exactly the same keys as ref (no more, no less) should have no extra keys
Stack Traces | 0.001s run time
Error: expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 4

- Array []
+ Array [
+   "catalogItems.columns.serviceType",
+   "instances.columns.resourceId",
+ ]
    at Object.toEqual (.../src/translations/ref.test.ts:80:23)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "de" translations has exactly the same keys as ref (no more, no less) should have the same number of keys as ref
Stack Traces | 0.001s run time
Error: expect(received).toHaveLength(expected)

Expected length: 262
Received length: 239
Received array:  ["page.title", "page.tabs.providers", "page.tabs.policies", "page.tabs.serviceTypes", "page.tabs.catalogItems", "page.tabs.instances", "page.tabs.resources", "common.retry", "common.refresh", "common.search", …]
    at Object.toHaveLength (.../src/translations/ref.test.ts:84:26)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "es" translations has exactly the same keys as ref (no more, no less) should have no extra keys
Stack Traces | 0.001s run time
Error: expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 4

- Array []
+ Array [
+   "catalogItems.columns.serviceType",
+   "instances.columns.resourceId",
+ ]
    at Object.toEqual (.../src/translations/ref.test.ts:80:23)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "es" translations has exactly the same keys as ref (no more, no less) should have no missing keys
Stack Traces | 0.001s run time
Error: expect(received).toEqual(expected) // deep equality

- Expected  -  1
+ Received  + 27

- Array []
+ Array [
+   "catalogItems.columns.resources",
+   "catalogItems.resourceCount_one",
+   "catalogItems.resourceCount_other",
+   "catalogItems.wizard.addResourceButton",
+   "catalogItems.wizard.apiVersionImmutable",
+   "catalogItems.wizard.removeResource",
+   "catalogItems.wizard.requiresResourcesHelper",
+   "catalogItems.wizard.requiresResourcesLabel",
+   "catalogItems.wizard.resourceNameHelper",
+   "catalogItems.wizard.resourceNameLabel",
+   "catalogItems.wizard.resourcesDescription",
+   "catalogItems.wizard.resourcesRequired",
+   "catalogItems.wizard.tabApi",
+   "catalogItems.wizard.tabOverview",
+   "catalogItems.wizard.tabResources",
+   "catalogItems.wizard.unnamedResource",
+   "common.back",
+   "common.next",
+   "instances.columns.resourceIds",
+   "instances.wizard.tabOverview",
+   "validation.catalogItem.resourceNameDuplicate",
+   "validation.catalogItem.resourceNamePattern",
+   "validation.catalogItem.resourceNameRequired",
+   "validation.catalogItem.resourcesRequired",
+   "validation.catalogItem.schemaRequiredNotBoolean",
+ ]
    at Object.toEqual (.../src/translations/ref.test.ts:76:25)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "fr" translations has exactly the same keys as ref (no more, no less) should have no missing keys
Stack Traces | 0.001s run time
Error: expect(received).toEqual(expected) // deep equality

- Expected  -  1
+ Received  + 27

- Array []
+ Array [
+   "catalogItems.columns.resources",
+   "catalogItems.resourceCount_one",
+   "catalogItems.resourceCount_other",
+   "catalogItems.wizard.addResourceButton",
+   "catalogItems.wizard.apiVersionImmutable",
+   "catalogItems.wizard.removeResource",
+   "catalogItems.wizard.requiresResourcesHelper",
+   "catalogItems.wizard.requiresResourcesLabel",
+   "catalogItems.wizard.resourceNameHelper",
+   "catalogItems.wizard.resourceNameLabel",
+   "catalogItems.wizard.resourcesDescription",
+   "catalogItems.wizard.resourcesRequired",
+   "catalogItems.wizard.tabApi",
+   "catalogItems.wizard.tabOverview",
+   "catalogItems.wizard.tabResources",
+   "catalogItems.wizard.unnamedResource",
+   "common.back",
+   "common.next",
+   "instances.columns.resourceIds",
+   "instances.wizard.tabOverview",
+   "validation.catalogItem.resourceNameDuplicate",
+   "validation.catalogItem.resourceNamePattern",
+   "validation.catalogItem.resourceNameRequired",
+   "validation.catalogItem.resourcesRequired",
+   "validation.catalogItem.schemaRequiredNotBoolean",
+ ]
    at Object.toEqual (.../src/translations/ref.test.ts:76:25)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "it" translations has exactly the same keys as ref (no more, no less) should have the same number of keys as ref
Stack Traces | 0.001s run time
Error: expect(received).toHaveLength(expected)

Expected length: 262
Received length: 239
Received array:  ["page.title", "page.tabs.providers", "page.tabs.policies", "page.tabs.serviceTypes", "page.tabs.catalogItems", "page.tabs.instances", "page.tabs.resources", "common.retry", "common.refresh", "common.search", …]
    at Object.toHaveLength (.../src/translations/ref.test.ts:84:26)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "ja" translations has exactly the same keys as ref (no more, no less) should have the same number of keys as ref
Stack Traces | 0.001s run time
Error: expect(received).toHaveLength(expected)

Expected length: 262
Received length: 239
Received array:  ["page.title", "page.tabs.providers", "page.tabs.policies", "page.tabs.serviceTypes", "page.tabs.catalogItems", "page.tabs.instances", "page.tabs.resources", "common.retry", "common.refresh", "common.search", …]
    at Object.toHaveLength (.../src/translations/ref.test.ts:84:26)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
ref (translation keys) "de" translations has exactly the same keys as ref (no more, no less) should have no missing keys
Stack Traces | 0.003s run time
Error: expect(received).toEqual(expected) // deep equality

- Expected  -  1
+ Received  + 27

- Array []
+ Array [
+   "catalogItems.columns.resources",
+   "catalogItems.resourceCount_one",
+   "catalogItems.resourceCount_other",
+   "catalogItems.wizard.addResourceButton",
+   "catalogItems.wizard.apiVersionImmutable",
+   "catalogItems.wizard.removeResource",
+   "catalogItems.wizard.requiresResourcesHelper",
+   "catalogItems.wizard.requiresResourcesLabel",
+   "catalogItems.wizard.resourceNameHelper",
+   "catalogItems.wizard.resourceNameLabel",
+   "catalogItems.wizard.resourcesDescription",
+   "catalogItems.wizard.resourcesRequired",
+   "catalogItems.wizard.tabApi",
+   "catalogItems.wizard.tabOverview",
+   "catalogItems.wizard.tabResources",
+   "catalogItems.wizard.unnamedResource",
+   "common.back",
+   "common.next",
+   "instances.columns.resourceIds",
+   "instances.wizard.tabOverview",
+   "validation.catalogItem.resourceNameDuplicate",
+   "validation.catalogItem.resourceNamePattern",
+   "validation.catalogItem.resourceNameRequired",
+   "validation.catalogItem.resourcesRequired",
+   "validation.catalogItem.schemaRequiredNotBoolean",
+ ]
    at Object.toEqual (.../src/translations/ref.test.ts:76:25)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
CatalogItemWizardDialog – file import error handling dismisses the error alert when the close button is clicked
Stack Traces | 0.101s run time
TypeError: Cannot read properties of null (reading 'namespaceURI')
    at Object.isElementType (.../workspaces/dcm/node_modules/@.../utils/misc/isElementType.js:4:17)
    at Object.upload (.../workspaces/dcm/node_modules/@.../cjs/utility/upload.js:11:33)
    at .../workspaces/dcm/node_modules/@.../cjs/setup/setup.js:85:45
    at Object.cb [as asyncWrapper] (.../workspaces/dcm/node_modules/@.../react/dist/pure.js:88:28)
    at Object.wrapAsync (.../workspaces/dcm/node_modules/@.../cjs/setup/wrapAsync.js:8:28)
    at Object.method (.../workspaces/dcm/node_modules/@.../cjs/setup/setup.js:85:26)
    at Object.upload (.../workspaces/dcm/node_modules/@.../cjs/setup/directApi.js:54:43)
    at Object.upload (.../catalog-items/components/CatalogItemFormFields.test.tsx:145:21)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
CatalogItemWizardDialog – file import error handling does not show an error alert when a valid JSON file is imported
Stack Traces | 0.106s run time
TypeError: Cannot read properties of null (reading 'namespaceURI')
    at Object.isElementType (.../workspaces/dcm/node_modules/@.../utils/misc/isElementType.js:4:17)
    at Object.upload (.../workspaces/dcm/node_modules/@.../cjs/utility/upload.js:11:33)
    at .../workspaces/dcm/node_modules/@.../cjs/setup/setup.js:85:45
    at Object.cb [as asyncWrapper] (.../workspaces/dcm/node_modules/@.../react/dist/pure.js:88:28)
    at Object.wrapAsync (.../workspaces/dcm/node_modules/@.../cjs/setup/wrapAsync.js:8:28)
    at Object.method (.../workspaces/dcm/node_modules/@.../cjs/setup/setup.js:85:26)
    at Object.upload (.../workspaces/dcm/node_modules/@.../cjs/setup/directApi.js:54:43)
    at Object.upload (.../catalog-items/components/CatalogItemFormFields.test.tsx:126:21)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)
CatalogItemWizardDialog – file import error handling shows an error alert when an invalid JSON file is imported
Stack Traces | 0.203s run time
TypeError: Cannot read properties of null (reading 'namespaceURI')
    at Object.isElementType (.../workspaces/dcm/node_modules/@.../utils/misc/isElementType.js:4:17)
    at Object.upload (.../workspaces/dcm/node_modules/@.../cjs/utility/upload.js:11:33)
    at .../workspaces/dcm/node_modules/@.../cjs/setup/setup.js:85:45
    at Object.cb [as asyncWrapper] (.../workspaces/dcm/node_modules/@.../react/dist/pure.js:88:28)
    at Object.wrapAsync (.../workspaces/dcm/node_modules/@.../cjs/setup/wrapAsync.js:8:28)
    at Object.method (.../workspaces/dcm/node_modules/@.../cjs/setup/setup.js:85:26)
    at Object.upload (.../workspaces/dcm/node_modules/@.../cjs/setup/directApi.js:54:43)
    at Object.upload (.../catalog-items/components/CatalogItemFormFields.test.tsx:109:21)
    at Promise.then.completed (.../jest-circus/build/utils.js:298:28)
    at new Promise (<anonymous>)
    at callAsyncCircusFn (.../jest-circus/build/utils.js:231:10)
    at _callCircusTest (.../jest-circus/build/run.js:316:40)
    at processTicksAndRejections (node:internal/process/task_queues:103:5)
    at _runTest (.../jest-circus/build/run.js:252:3)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:126:9)
    at _runTestsForDescribeBlock (.../jest-circus/build/run.js:121:9)
    at run (.../jest-circus/build/run.js:71:3)
    at runAndTransformResultsToJestFormat (.../build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)
    at jestAdapter (.../build/legacy-code-todo-rewrite/jestAdapter.js:79:19)
    at runTestInternal (.../jest-runner/build/runTest.js:367:16)
    at runTest (.../jest-runner/build/runTest.js:444:34)
    at Object.worker (.../jest-runner/build/testWorker.js:106:12)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@rhdh-qodo-merge

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Action required

1. Catalog items dropdown truncated 🐞 Bug ≡ Correctness
Description
CatalogItemInstancesTabContent only loads catalog items with max_page_size: 25, so
InstanceWizardDialog cannot offer catalog items beyond the first page for selection. This prevents
creating instances for those catalog items and also causes repeated re-fetching of the same limited
list on every cursor page load.
Code

workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/CatalogItemInstancesTabContent.tsx[R99-102]

+        catalogApi
+          .listCatalogItems({ max_page_size: 25 })
+          .then(r => r.results ?? []),
      ]);
Relevance

●●● Strong

User-facing correctness: hard-capping to 25 breaks selection of existing items; likely to be fixed.

PR-#2950

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The tab’s load function hard-caps the catalog-item list to 25 results, and the wizard renders its
selector options directly from that catalogItems array, so any items beyond the first page are
unselectable.

workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/CatalogItemInstancesTabContent.tsx[87-105]
workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/components/InstanceWizardDialog.tsx[116-145]

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 create-instance flow populates `catalogItems` from `listCatalogItems({ max_page_size: 25 })` without iterating `next_page_token`, so the wizard selector omits catalog items beyond the first page.

### Issue Context
This list is used to render the `<Select>` options in `InstanceWizardDialog`, so an incomplete list directly blocks selection/instance creation for omitted items.

### Fix Focus Areas
- workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/CatalogItemInstancesTabContent.tsx[87-105]
- workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/components/InstanceWizardDialog.tsx[116-145]

### Suggested fix
- Fetch catalog items independently of the instances page load (e.g., a `useEffect`) and retrieve **all pages** by following `next_page_token` until empty.
- If loading all is undesirable, replace the selector with a paginated/search-backed selector that can request additional pages on demand (but do not hard-cap at 25).

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


2. Required schema boolean rejected 🐞 Bug ≡ Correctness
Description
catalogItemFormTypes.validateFieldRows flags validation_schema.required when it is a boolean as an
error, but instanceFormTypes still interprets schema.required === true to enforce required fields.
This breaks the internal schema contract and prevents authors from defining required fields using
the boolean convention currently consumed by instance creation.
Code

workspaces/dcm/plugins/dcm/src/pages/catalog-items/catalogItemFormTypes.ts[R241-246]

+        if (typeof schemaResult.required === 'boolean') {
+          rowErrors.validation_schema = m(
+            'validation.catalogItem.schemaRequiredNotBoolean',
+            '"required" must be an array of property names, not a boolean',
+          );
+        }
Relevance

●●● Strong

Inconsistent schema contract (boolean vs array) breaks required-field enforcement; team usually
fixes such mismatches.

PR-#2306

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The catalog-item form validation explicitly rejects boolean required, while the instance form code
explicitly reads boolean required to determine whether a value must be filled; these cannot both
be correct at the same time.

workspaces/dcm/plugins/dcm/src/pages/catalog-items/catalogItemFormTypes.ts[225-263]
workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/instanceFormTypes.ts[234-253]

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

### Issue description
Catalog item authoring rejects boolean `validation_schema.required`, while instance creation logic still expects `required: true` to mark fields required. This inconsistency blocks creating/editing catalog items that rely on the boolean convention and/or makes required-field enforcement unpredictable.

### Issue Context
- Authoring-side validation (`validateFieldRows`) currently errors when `required` is boolean.
- Instance-side extraction (`extractSchemaInfo`) uses `schema.required === true` to set `row.required`.

### Fix Focus Areas
- workspaces/dcm/plugins/dcm/src/pages/catalog-items/catalogItemFormTypes.ts[225-263]
- workspaces/dcm/plugins/dcm/src/pages/catalog-item-instances/instanceFormTypes.ts[234-253]

### Suggested fix
Choose one convention and apply it consistently:
1) **Keep boolean convention**: remove the boolean-`required` rejection in `validateFieldRows` (or accept both boolean and array forms), keeping instance behavior.
OR
2) **Migrate to JSON-Schema array convention**: update instance extraction/required enforcement to use the array-based `required` semantics and update any authoring UI/help text accordingly (including any existing data expectations). Add tests for the chosen behavior.

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


Grey Divider

Context used
✅ Compliance rules (platform): 11 rules
✅ Cross-repo context
  Explored: repo: redhat-developer/rhdh-chart (sha: 8987c2f1)
  Explored: repo: redhat-developer/rhdh-operator (sha: 7f909449)
  Explored: repo: redhat-developer/rhdh-local (sha: a1776caa)
  Explored: repo: redhat-developer/rhdh (sha: 744d5784)

To customize comments, go to the Qodo configuration screen, or learn more in the docs.

Qodo Logo

@rhdh-qodo-merge rhdh-qodo-merge Bot added documentation Improvements or additions to documentation enhancement New feature or request Tests labels Aug 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request Tests workspace/dcm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant