This is an automated email from the ASF dual-hosted git repository.
scottyaslan pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git
The following commit(s) were added to refs/heads/main by this push:
new 15fb2057be8 NIFI-16047 - Queue listing: Ensure refresh spinner stops
spinning when user cancels the load action (#11368)
15fb2057be8 is described below
commit 15fb2057be84cb05218e27d988022db947f3fea1
Author: Rob Fellows <[email protected]>
AuthorDate: Mon Jun 29 22:00:31 2026 -0400
NIFI-16047 - Queue listing: Ensure refresh spinner stops spinning when user
cancels the load action (#11368)
---
.../queue-listing/queue-listing.reducer.spec.ts | 88 ++++++++++++++++++++++
.../state/queue-listing/queue-listing.reducer.ts | 7 +-
2 files changed, 94 insertions(+), 1 deletion(-)
diff --git
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/queue/state/queue-listing/queue-listing.reducer.spec.ts
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/queue/state/queue-listing/queue-listing.reducer.spec.ts
new file mode 100644
index 00000000000..dc01ff9e523
--- /dev/null
+++
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/queue/state/queue-listing/queue-listing.reducer.spec.ts
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { queueListingReducer, initialState } from './queue-listing.reducer';
+import {
+ submitQueueListingRequest,
+ stopPollingQueueListingRequest,
+ deleteQueueListingRequestSuccess,
+ queueListingApiError,
+ resetQueueListingState
+} from './queue-listing.actions';
+import { QueueListingState } from './index';
+
+describe('queueListingReducer', () => {
+ describe('submitQueueListingRequest', () => {
+ it('should set status to loading', () => {
+ const next = queueListingReducer(
+ initialState,
+ submitQueueListingRequest({ request: { connectionId: 'conn-1'
} as any })
+ );
+
+ expect(next.status).toBe('loading');
+ });
+ });
+
+ describe('stopPollingQueueListingRequest', () => {
+ it('resets status to success when dispatched while loading (cancel
flow)', () => {
+ const loadingState: QueueListingState = { ...initialState, status:
'loading' };
+
+ const next = queueListingReducer(loadingState,
stopPollingQueueListingRequest());
+
+ expect(next.status).toBe('success');
+ });
+
+ it('is a safe no-op when status is already success (normal completion
path)', () => {
+ const successState: QueueListingState = { ...initialState, status:
'success' };
+
+ const next = queueListingReducer(successState,
stopPollingQueueListingRequest());
+
+ expect(next.status).toBe('success');
+ });
+ });
+
+ describe('deleteQueueListingRequestSuccess', () => {
+ it('should clear the activeListingRequest', () => {
+ const stateWithActive: QueueListingState = {
+ ...initialState,
+ activeListingRequest: { id: 'req-1' } as any
+ };
+
+ const next = queueListingReducer(stateWithActive,
deleteQueueListingRequestSuccess());
+
+ expect(next.activeListingRequest).toBeNull();
+ });
+ });
+
+ describe('queueListingApiError', () => {
+ it('should set status to error', () => {
+ const next = queueListingReducer(initialState,
queueListingApiError({ error: 'oops' }));
+
+ expect(next.status).toBe('error');
+ });
+ });
+
+ describe('resetQueueListingState', () => {
+ it('should reset to the initial state', () => {
+ const loadingState: QueueListingState = { ...initialState, status:
'loading' };
+
+ const next = queueListingReducer(loadingState,
resetQueueListingState());
+
+ expect(next).toEqual(initialState);
+ });
+ });
+});
diff --git
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/queue/state/queue-listing/queue-listing.reducer.ts
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/queue/state/queue-listing/queue-listing.reducer.ts
index 7a6a15486ab..0878a948aa6 100644
---
a/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/queue/state/queue-listing/queue-listing.reducer.ts
+++
b/nifi-frontend/src/main/frontend/apps/nifi/src/app/pages/queue/state/queue-listing/queue-listing.reducer.ts
@@ -24,7 +24,8 @@ import {
resetQueueListingState,
queueListingApiError,
loadConnectionLabelSuccess,
- deleteQueueListingRequestSuccess
+ deleteQueueListingRequestSuccess,
+ stopPollingQueueListingRequest
} from './queue-listing.actions';
import { produce } from 'immer';
@@ -79,6 +80,10 @@ export const queueListingReducer = createReducer(
}
});
}),
+ on(stopPollingQueueListingRequest, (state) => ({
+ ...state,
+ status: 'success' as const
+ })),
on(deleteQueueListingRequestSuccess, (state) => ({
...state,
activeListingRequest: null