diff --git a/frontend/public/components/factory/__tests__/list-page.spec.tsx b/frontend/public/components/factory/__tests__/list-page.spec.tsx
index 0f383c88d66..5dcf568980e 100644
--- a/frontend/public/components/factory/__tests__/list-page.spec.tsx
+++ b/frontend/public/components/factory/__tests__/list-page.spec.tsx
@@ -221,4 +221,58 @@ describe('MultiListPage component', () => {
expect(watchConfig?.Pod?.kind).toBe('Pod');
expect(watchConfig?.Pod?.name).toBe('example-pod');
});
+
+ it('does not treat errors from optional resources as fatal page errors', () => {
+ let receivedLoadError: unknown;
+ const ListComponent = (props: { loadError?: unknown }) => {
+ receivedLoadError = props.loadError;
+ return
List Content
;
+ };
+
+ mockUseK8sWatchResources.mockReturnValue({
+ Pod: { data: [{ kind: 'Pod' }], loaded: true, loadError: undefined },
+ CatalogSource: {
+ data: [],
+ loaded: true,
+ loadError: 'catalogsources.operators.coreos.com is forbidden',
+ },
+ });
+
+ renderWithProviders(
+ ,
+ );
+
+ expect(screen.getByText('List Content')).toBeVisible();
+ expect(receivedLoadError).toBeUndefined();
+ });
+
+ it('treats errors from non-optional resources as fatal page errors', () => {
+ let receivedLoadError: unknown;
+ const ListComponent = (props: { loadError?: unknown }) => {
+ receivedLoadError = props.loadError;
+ return List Content
;
+ };
+
+ const forbiddenError = 'pods is forbidden';
+ mockUseK8sWatchResources.mockReturnValue({
+ Pod: { data: [], loaded: true, loadError: forbiddenError },
+ });
+
+ renderWithProviders(
+ ,
+ );
+
+ expect(receivedLoadError).toBe(forbiddenError);
+ });
});
diff --git a/frontend/public/components/factory/list-page.tsx b/frontend/public/components/factory/list-page.tsx
index 0050c5a1e54..e4331efdc95 100644
--- a/frontend/public/components/factory/list-page.tsx
+++ b/frontend/public/components/factory/list-page.tsx
@@ -604,10 +604,13 @@ export const MultiListPage: FC = (props) => {
const loadError = useMemo(
() =>
- Object.values(watchedResources).find(
- (r) => r.loadError && !(r.loadError instanceof NoModelError),
- )?.loadError,
- [watchedResources],
+ Object.entries(watchedResources).find(
+ ([key, r]) =>
+ r.loadError &&
+ !(r.loadError instanceof NoModelError) &&
+ !watchResources[key]?.optional,
+ )?.[1]?.loadError,
+ [watchedResources, watchResources],
);
const reduxIDs = useMemo(