From 7ec2dd07c9d3fe7ca2239c4d0950fa81e825c136 Mon Sep 17 00:00:00 2001 From: Matt Gilman Date: Wed, 7 Feb 2024 12:02:13 -0500 Subject: [PATCH] NIFI-12734: Import from Registry (#8354) * NIFI-12734: - Import from Registry. * NIFI-12734: - Providing better guidance when there are no registry clients available based on user permissions. - Showing form validation errors when there are no buckets or no flows. This closes #8354 --- .../flow-designer/service/registry.service.ts | 58 +++ .../flow-designer/state/flow/flow.actions.ts | 14 +- .../flow-designer/state/flow/flow.effects.ts | 115 +++++- .../pages/flow-designer/state/flow/index.ts | 15 + .../ui/canvas/header/header.component.html | 5 + .../new-canvas-item.component.scss | 31 +- .../import-from-registry.component.html | 154 ++++++++ .../import-from-registry.component.scss | 45 +++ .../import-from-registry.component.spec.ts | 136 +++++++ .../import-from-registry.component.ts | 337 ++++++++++++++++++ .../no-registry-clients-dialog.component.html | 38 ++ .../no-registry-clients-dialog.component.scss | 22 ++ ...-registry-clients-dialog.component.spec.ts | 50 +++ .../no-registry-clients-dialog.component.ts | 34 ++ .../service/registry-client.service.ts | 5 +- .../settings/state/registry-clients/index.ts | 12 +- .../registry-clients.selectors.ts | 3 +- .../registry-client-table.component.ts | 3 +- .../registry-clients.component.ts | 3 +- .../flow-configuration.selectors.ts | 5 + .../main/nifi/src/app/state/shared/index.ts | 54 ++- .../common/ok-dialog/ok-dialog.component.html | 2 +- .../src/assets/fonts/flowfont/flowfont.css | 21 +- .../src/assets/fonts/flowfont/flowfont.eot | Bin 25120 -> 25276 bytes .../src/assets/fonts/flowfont/flowfont.svg | 68 ++-- .../src/assets/fonts/flowfont/flowfont.ttf | Bin 24952 -> 25108 bytes .../src/assets/fonts/flowfont/flowfont.woff | Bin 12664 -> 13660 bytes .../src/assets/fonts/flowfont/flowfont.woff2 | Bin 10780 -> 11600 bytes 28 files changed, 1153 insertions(+), 77 deletions(-) create mode 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/registry.service.ts create mode 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.html create mode 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.scss create mode 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.spec.ts create mode 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.ts create mode 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.html create mode 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.scss create mode 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.spec.ts create mode 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.ts mode change 100755 => 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.css mode change 100755 => 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.eot mode change 100755 => 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.svg mode change 100755 => 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.ttf mode change 100755 => 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.woff mode change 100755 => 100644 nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.woff2 diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/registry.service.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/registry.service.ts new file mode 100644 index 0000000000..971fb4b455 --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/service/registry.service.ts @@ -0,0 +1,58 @@ +/* + * 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 { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { HttpClient } from '@angular/common/http'; +import { ImportFromRegistryRequest } from '../state/flow'; + +@Injectable({ providedIn: 'root' }) +export class RegistryService { + private static readonly API: string = '../nifi-api'; + + constructor(private httpClient: HttpClient) {} + + getRegistryClients(): Observable { + return this.httpClient.get(`${RegistryService.API}/flow/registries`); + } + + getBuckets(registryId: string): Observable { + return this.httpClient.get(`${RegistryService.API}/flow/registries/${registryId}/buckets`); + } + + getFlows(registryId: string, bucketId: string): Observable { + return this.httpClient.get(`${RegistryService.API}/flow/registries/${registryId}/buckets/${bucketId}/flows`); + } + + getFlowVersions(registryId: string, bucketId: string, flowId: string): Observable { + return this.httpClient.get( + `${RegistryService.API}/flow/registries/${registryId}/buckets/${bucketId}/flows/${flowId}/versions` + ); + } + + importFromRegistry(processGroupId: string, request: ImportFromRegistryRequest): Observable { + return this.httpClient.post( + `${RegistryService.API}/process-groups/${processGroupId}/process-groups`, + request.payload, + { + params: { + parameterContextHandlingStrategy: request.keepExistingParameterContext ? 'KEEP_EXISTING' : 'REPLACE' + } + } + ); + } +} diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.actions.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.actions.ts index 53f7f10f2d..8b79c0bcc8 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.actions.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.actions.ts @@ -71,7 +71,9 @@ import { NavigateToQueueListing, StartProcessGroupResponse, StopProcessGroupResponse, - CenterComponentRequest + CenterComponentRequest, + ImportFromRegistryDialogRequest, + ImportFromRegistryRequest } from './index'; import { StatusHistoryRequest } from '../../../../state/status-history'; @@ -275,6 +277,16 @@ export const openNewPortDialog = createAction( export const createPort = createAction(`${CANVAS_PREFIX} Create Port`, props<{ request: CreatePortRequest }>()); +export const openImportFromRegistryDialog = createAction( + `${CANVAS_PREFIX} Open Import From Registry Dialog`, + props<{ request: ImportFromRegistryDialogRequest }>() +); + +export const importFromRegistry = createAction( + `${CANVAS_PREFIX} Import From Registry`, + props<{ request: ImportFromRegistryRequest }>() +); + export const createComponentSuccess = createAction( `${CANVAS_PREFIX} Create Component Success`, props<{ response: CreateComponentResponse }>() diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.effects.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.effects.ts index 05ca83d1f3..d77eb0cc08 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.effects.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/flow.effects.ts @@ -40,6 +40,7 @@ import { CreateProcessGroupDialogRequest, DeleteComponentResponse, GroupComponentsDialogRequest, + ImportFromRegistryDialogRequest, LoadProcessGroupRequest, LoadProcessGroupResponse, Snippet, @@ -63,7 +64,13 @@ import { ConnectionManager } from '../../service/manager/connection-manager.serv import { MatDialog } from '@angular/material/dialog'; import { CreatePort } from '../../ui/canvas/items/port/create-port/create-port.component'; import { EditPort } from '../../ui/canvas/items/port/edit-port/edit-port.component'; -import { ComponentType } from '../../../../state/shared'; +import { + BucketEntity, + ComponentType, + RegistryClientEntity, + VersionedFlowEntity, + VersionedFlowSnapshotMetadataEntity +} from '../../../../state/shared'; import { Router } from '@angular/router'; import { Client } from '../../../../service/client.service'; import { CanvasUtils } from '../../service/canvas-utils.service'; @@ -83,6 +90,10 @@ import { ControllerServiceService } from '../../service/controller-service.servi import { YesNoDialog } from '../../../../ui/common/yes-no-dialog/yes-no-dialog.component'; import { PropertyTableHelperService } from '../../../../service/property-table-helper.service'; import { ParameterHelperService } from '../../service/parameter-helper.service'; +import { RegistryService } from '../../service/registry.service'; +import { ImportFromRegistry } from '../../ui/canvas/items/flow/import-from-registry/import-from-registry.component'; +import { selectCurrentUser } from '../../../../state/current-user/current-user.selectors'; +import { NoRegistryClientsDialog } from '../../ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component'; @Injectable() export class FlowEffects { @@ -91,6 +102,7 @@ export class FlowEffects { private store: Store, private flowService: FlowService, private controllerServiceService: ControllerServiceService, + private registryService: RegistryService, private client: Client, private canvasUtils: CanvasUtils, private canvasView: CanvasView, @@ -217,6 +229,18 @@ export class FlowEffects { case ComponentType.InputPort: case ComponentType.OutputPort: return of(FlowActions.openNewPortDialog({ request })); + case ComponentType.Flow: + return from(this.registryService.getRegistryClients()).pipe( + map((response) => { + const dialogRequest: ImportFromRegistryDialogRequest = { + request, + registryClients: response.registries + }; + + return FlowActions.openImportFromRegistryDialog({ request: dialogRequest }); + }), + catchError((error) => of(FlowActions.flowApiError({ error: error.error }))) + ); default: return of(FlowActions.flowApiError({ error: 'Unsupported type of Component.' })); } @@ -587,6 +611,95 @@ export class FlowEffects { ) ); + openImportFromRegistryDialog$ = createEffect( + () => + this.actions$.pipe( + ofType(FlowActions.openImportFromRegistryDialog), + map((action) => action.request), + concatLatestFrom(() => this.store.select(selectCurrentUser)), + tap(([request, currentUser]) => { + const someRegistries = request.registryClients.some( + (registryClient: RegistryClientEntity) => registryClient.permissions.canRead + ); + + if (someRegistries) { + const dialogReference = this.dialog.open(ImportFromRegistry, { + data: request, + panelClass: 'medium-dialog' + }); + + dialogReference.componentInstance.getBuckets = ( + registryId: string + ): Observable => { + return this.registryService.getBuckets(registryId).pipe( + take(1), + map((response) => response.buckets) + ); + }; + + dialogReference.componentInstance.getFlows = ( + registryId: string, + bucketId: string + ): Observable => { + return this.registryService.getFlows(registryId, bucketId).pipe( + take(1), + map((response) => response.versionedFlows) + ); + }; + + dialogReference.componentInstance.getFlowVersions = ( + registryId: string, + bucketId: string, + flowId: string + ): Observable => { + return this.registryService.getFlowVersions(registryId, bucketId, flowId).pipe( + take(1), + map((response) => response.versionedFlowSnapshotMetadataSet) + ); + }; + + dialogReference.afterClosed().subscribe(() => { + this.store.dispatch(FlowActions.setDragging({ dragging: false })); + }); + } else { + this.dialog + .open(NoRegistryClientsDialog, { + data: { + controllerPermissions: currentUser.controllerPermissions + }, + panelClass: 'medium-dialog' + }) + .afterClosed() + .subscribe(() => { + this.store.dispatch(FlowActions.setDragging({ dragging: false })); + }); + } + }) + ), + { dispatch: false } + ); + + importFromRegistry$ = createEffect(() => + this.actions$.pipe( + ofType(FlowActions.importFromRegistry), + map((action) => action.request), + concatLatestFrom(() => this.store.select(selectCurrentProcessGroupId)), + switchMap(([request, processGroupId]) => + from(this.registryService.importFromRegistry(processGroupId, request)).pipe( + map((response) => + FlowActions.createComponentSuccess({ + response: { + type: ComponentType.ProcessGroup, + payload: response + } + }) + ), + catchError((error) => of(FlowActions.flowApiError({ error: error.error }))) + ) + ) + ) + ); + createComponentSuccess$ = createEffect(() => this.actions$.pipe( ofType(FlowActions.createComponentSuccess), diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/index.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/index.ts index 1352c36e2b..bb4f9ddb70 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/index.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/state/flow/index.ts @@ -23,6 +23,7 @@ import { DocumentedType, ParameterContextReferenceEntity, Permissions, + RegistryClientEntity, Revision, SelectOption } from '../../../../state/shared'; @@ -165,6 +166,20 @@ export interface CreateProcessGroupDialogRequest { parameterContexts: ParameterContextEntity[]; } +export interface NoRegistryClientsDialogRequest { + controllerPermissions: Permissions; +} + +export interface ImportFromRegistryDialogRequest { + request: CreateComponentRequest; + registryClients: RegistryClientEntity[]; +} + +export interface ImportFromRegistryRequest { + payload: any; + keepExistingParameterContext: boolean; +} + export interface OpenGroupComponentsDialogRequest { position: Position; moveComponents: MoveComponentRequest[]; diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/header/header.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/header/header.component.html index 963b88a462..2eb6996f03 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/header/header.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/header/header.component.html @@ -48,6 +48,11 @@ [disabled]="!canvasPermissions.canWrite" iconClass="icon-funnel" iconHoverClass="icon-funnel-add"> + + +

Import From Registry

+
+ + + + Registry + + + + {{ option.text }} + + + {{ option.text }} + + + + + + Bucket + + + + {{ option.text }} + + + {{ option.text }} + + + + No buckets available + + + Flow + + + + {{ option.text }} + + + {{ option.text }} + + + + No flows available + +
+ + Keep existing Parameter Contexts + +
+
+
Flow Description
+
{{ selectedFlowDescription || 'No description provided' }}
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
Version + {{ item.version }} + Created + {{ formatTimestamp(item) }} + Comments + {{ item.comments }} +
+
+
+
+ + + + +
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.scss new file mode 100644 index 0000000000..bba2634bef --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.scss @@ -0,0 +1,45 @@ +/* + * 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. + */ + +@use '@angular/material' as mat; + +.import-from-registry-form { + @include mat.button-density(-1); + + .mat-mdc-form-field { + width: 100%; + } + + .mat-mdc-form-field-error { + font-size: 12px; + } + + .listing-table { + table { + width: auto; + table-layout: unset; + + .mat-column-version { + width: 75px; + } + + .mat-column-created { + width: 200px; + } + } + } +} diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.spec.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.spec.ts new file mode 100644 index 0000000000..bdcb15836e --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.spec.ts @@ -0,0 +1,136 @@ +/* + * 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 { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ImportFromRegistry } from './import-from-registry.component'; +import { ImportFromRegistryDialogRequest } from '../../../../../state/flow'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { ComponentType } from '../../../../../../../state/shared'; +import { provideMockStore } from '@ngrx/store/testing'; +import { initialState } from '../../../../../state/flow/flow.reducer'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { EMPTY } from 'rxjs'; + +describe('ImportFromRegistry', () => { + let component: ImportFromRegistry; + let fixture: ComponentFixture; + + const data: ImportFromRegistryDialogRequest = { + request: { + revision: { + clientId: '88cd6620-bd6d-41fa-aa5a-be2b33501e31', + version: 0 + }, + type: ComponentType.Flow, + position: { + x: 461, + y: 58 + } + }, + registryClients: [ + { + revision: { + version: 0 + }, + id: '6a088515-018d-1000-ce79-5ae44266bc20', + uri: 'https://localhost:4200/nifi-api/controller/registry-clients/6a088515-018d-1000-ce79-5ae44266bc20', + permissions: { + canRead: true, + canWrite: true + }, + component: { + id: '6a088515-018d-1000-ce79-5ae44266bc20', + name: 'My Registry', + description: '', + type: 'org.apache.nifi.registry.flow.NifiRegistryFlowRegistryClient', + bundle: { + group: 'org.apache.nifi', + artifact: 'nifi-flow-registry-client-nar', + version: '2.0.0-SNAPSHOT' + }, + properties: { + url: 'http://localhost:18080/nifi-registry', + 'ssl-context-service': null + }, + descriptors: { + url: { + name: 'url', + displayName: 'URL', + description: 'URL of the NiFi Registry', + required: true, + sensitive: false, + dynamic: false, + supportsEl: false, + expressionLanguageScope: 'Not Supported', + dependencies: [] + }, + 'ssl-context-service': { + name: 'ssl-context-service', + displayName: 'SSL Context Service', + description: 'Specifies the SSL Context Service to use for communicating with NiFiRegistry', + allowableValues: [], + required: false, + sensitive: false, + dynamic: false, + supportsEl: false, + expressionLanguageScope: 'Not Supported', + identifiesControllerService: 'org.apache.nifi.ssl.SSLContextService', + identifiesControllerServiceBundle: { + group: 'org.apache.nifi', + artifact: 'nifi-standard-services-api-nar', + version: '2.0.0-SNAPSHOT' + }, + dependencies: [] + } + }, + supportsSensitiveDynamicProperties: false, + restricted: false, + deprecated: false, + validationStatus: 'VALID', + multipleVersionsAvailable: false, + extensionMissing: false + } + } + ] + }; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [ImportFromRegistry, BrowserAnimationsModule], + providers: [{ provide: MAT_DIALOG_DATA, useValue: data }, provideMockStore({ initialState })] + }); + fixture = TestBed.createComponent(ImportFromRegistry); + component = fixture.componentInstance; + + component.getBuckets = () => { + return EMPTY; + }; + component.getFlows = () => { + return EMPTY; + }; + component.getFlowVersions = () => { + return EMPTY; + }; + + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.ts new file mode 100644 index 0000000000..3496b0512f --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/canvas/items/flow/import-from-registry/import-from-registry.component.ts @@ -0,0 +1,337 @@ +/* + * 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 { Component, Inject, Input, OnInit } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { ImportFromRegistryDialogRequest } from '../../../../../state/flow'; +import { Store } from '@ngrx/store'; +import { CanvasState } from '../../../../../state'; +import { + BucketEntity, + isDefinedAndNotNull, + RegistryClientEntity, + SelectOption, + TextTipInput, + VersionedFlow, + VersionedFlowEntity, + VersionedFlowSnapshotMetadata, + VersionedFlowSnapshotMetadataEntity +} from '../../../../../../../state/shared'; +import { selectSaving } from '../../../../../state/flow/flow.selectors'; +import { AsyncPipe, JsonPipe, NgForOf, NgIf, NgTemplateOutlet } from '@angular/common'; +import { ErrorBanner } from '../../../../../../../ui/common/error-banner/error-banner.component'; +import { MatButtonModule } from '@angular/material/button'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatInputModule } from '@angular/material/input'; +import { MatOptionModule } from '@angular/material/core'; +import { MatSelectModule } from '@angular/material/select'; +import { NifiSpinnerDirective } from '../../../../../../../ui/common/spinner/nifi-spinner.directive'; +import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; +import { TextTip } from '../../../../../../../ui/common/tooltips/text-tip/text-tip.component'; +import { NifiTooltipDirective } from '../../../../../../../ui/common/tooltips/nifi-tooltip.directive'; +import { MatIconModule } from '@angular/material/icon'; +import { Observable, take } from 'rxjs'; +import { MatCheckboxModule } from '@angular/material/checkbox'; +import { MatTableDataSource, MatTableModule } from '@angular/material/table'; +import { MatSortModule, Sort } from '@angular/material/sort'; +import { NiFiCommon } from '../../../../../../../service/nifi-common.service'; +import { selectTimeOffset } from '../../../../../../../state/flow-configuration/flow-configuration.selectors'; +import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { Client } from '../../../../../../../service/client.service'; +import { importFromRegistry } from '../../../../../state/flow/flow.actions'; + +@Component({ + selector: 'import-from-registry', + standalone: true, + imports: [ + AsyncPipe, + ErrorBanner, + MatButtonModule, + MatDialogModule, + MatFormFieldModule, + MatInputModule, + NgIf, + NifiSpinnerDirective, + ReactiveFormsModule, + MatOptionModule, + MatSelectModule, + NgForOf, + NifiTooltipDirective, + MatIconModule, + NgTemplateOutlet, + JsonPipe, + MatCheckboxModule, + MatSortModule, + MatTableModule + ], + templateUrl: './import-from-registry.component.html', + styleUrls: ['./import-from-registry.component.scss'] +}) +export class ImportFromRegistry implements OnInit { + @Input() getBuckets!: (registryId: string) => Observable; + @Input() getFlows!: (registryId: string, bucketId: string) => Observable; + @Input() getFlowVersions!: ( + registryId: string, + bucketId: string, + flowId: string + ) => Observable; + + saving$ = this.store.select(selectSaving); + timeOffset = 0; + + protected readonly TextTip = TextTip; + + importFromRegistryForm: FormGroup; + registryClientOptions: SelectOption[] = []; + bucketOptions: SelectOption[] = []; + flowOptions: SelectOption[] = []; + + flowLookup: Map = new Map(); + selectedFlowDescription: string | undefined; + + sort: Sort = { + active: 'version', + direction: 'desc' + }; + displayedColumns: string[] = ['version', 'created', 'comments']; + dataSource: MatTableDataSource = + new MatTableDataSource(); + selectedFlowVersion: number | null = null; + + constructor( + @Inject(MAT_DIALOG_DATA) private dialogRequest: ImportFromRegistryDialogRequest, + private formBuilder: FormBuilder, + private store: Store, + private nifiCommon: NiFiCommon, + private client: Client + ) { + this.store + .select(selectTimeOffset) + .pipe(isDefinedAndNotNull(), takeUntilDestroyed()) + .subscribe((timeOffset: number) => { + this.timeOffset = timeOffset; + }); + + const sortedRegistries = dialogRequest.registryClients.slice().sort((a, b) => { + return this.nifiCommon.compareString(a.component.name, b.component.name); + }); + + sortedRegistries.forEach((registryClient: RegistryClientEntity) => { + if (registryClient.permissions.canRead) { + this.registryClientOptions.push({ + text: registryClient.component.name, + value: registryClient.id, + description: registryClient.component.description + }); + } + }); + + this.importFromRegistryForm = this.formBuilder.group({ + registry: new FormControl(this.registryClientOptions[0].value, Validators.required), + bucket: new FormControl(null, Validators.required), + flow: new FormControl(null, Validators.required), + keepParameterContexts: new FormControl(true, Validators.required) + }); + } + + ngOnInit(): void { + const selectedRegistryId = this.importFromRegistryForm.get('registry')?.value; + + if (selectedRegistryId) { + this.loadBuckets(selectedRegistryId); + } + } + + getSelectOptionTipData(option: SelectOption): TextTipInput { + return { + // @ts-ignore + text: option.description + }; + } + + registryChanged(registryId: string): void { + this.loadBuckets(registryId); + } + + bucketChanged(bucketId: string): void { + const registryId = this.importFromRegistryForm.get('registry')?.value; + this.loadFlows(registryId, bucketId); + } + + flowChanged(flowId: string): void { + const registryId = this.importFromRegistryForm.get('registry')?.value; + const bucketId = this.importFromRegistryForm.get('bucket')?.value; + this.loadVersions(registryId, bucketId, flowId); + } + + loadBuckets(registryId: string): void { + this.bucketOptions = []; + + this.getBuckets(registryId) + .pipe(take(1)) + .subscribe((buckets: BucketEntity[]) => { + if (buckets.length > 0) { + buckets.forEach((entity: BucketEntity) => { + if (entity.permissions.canRead) { + this.bucketOptions.push({ + text: entity.bucket.name, + value: entity.id, + description: entity.bucket.description + }); + } + }); + + const bucketId = this.bucketOptions[0].value; + if (bucketId) { + this.importFromRegistryForm.get('bucket')?.setValue(bucketId); + this.loadFlows(registryId, bucketId); + } + } + }); + } + + loadFlows(registryId: string, bucketId: string): void { + this.flowOptions = []; + this.flowLookup.clear(); + + this.getFlows(registryId, bucketId) + .pipe(take(1)) + .subscribe((versionedFlows: VersionedFlowEntity[]) => { + if (versionedFlows.length > 0) { + versionedFlows.forEach((entity: VersionedFlowEntity) => { + this.flowLookup.set(entity.versionedFlow.flowId, entity.versionedFlow); + + this.flowOptions.push({ + text: entity.versionedFlow.flowName, + value: entity.versionedFlow.flowId, + description: entity.versionedFlow.description + }); + }); + + const flowId = this.flowOptions[0].value; + if (flowId) { + this.importFromRegistryForm.get('flow')?.setValue(flowId); + this.loadVersions(registryId, bucketId, flowId); + } + } + }); + } + + loadVersions(registryId: string, bucketId: string, flowId: string): void { + this.dataSource.data = []; + this.selectedFlowDescription = this.flowLookup.get(flowId)?.description; + + this.getFlowVersions(registryId, bucketId, flowId) + .pipe(take(1)) + .subscribe((metadataEntities: VersionedFlowSnapshotMetadataEntity[]) => { + if (metadataEntities.length > 0) { + const flowVersions = metadataEntities.map( + (entity: VersionedFlowSnapshotMetadataEntity) => entity.versionedFlowSnapshotMetadata + ); + + const sortedFlowVersions = this.sortVersions(flowVersions, this.sort); + this.selectedFlowVersion = sortedFlowVersions[0].version; + + this.dataSource.data = sortedFlowVersions; + } + }); + } + + formatTimestamp(flowVersion: VersionedFlowSnapshotMetadata) { + // get the current user time to properly convert the server time + const now: Date = new Date(); + + // convert the user offset to millis + const userTimeOffset: number = now.getTimezoneOffset() * 60 * 1000; + + // create the proper date by adjusting by the offsets + const date: Date = new Date(flowVersion.timestamp + userTimeOffset + this.timeOffset); + return this.nifiCommon.formatDateTime(date); + } + + sortData(sort: Sort) { + this.sort = sort; + this.dataSource.data = this.sortVersions(this.dataSource.data, sort); + } + + sortVersions(data: VersionedFlowSnapshotMetadata[], sort: Sort): VersionedFlowSnapshotMetadata[] { + if (!data) { + return []; + } + return data.slice().sort((a, b) => { + const isAsc = sort.direction === 'asc'; + let retVal = 0; + switch (sort.active) { + case 'version': + retVal = this.nifiCommon.compareNumber(a.version, b.version); + break; + case 'created': + retVal = this.nifiCommon.compareNumber(a.timestamp, b.timestamp); + break; + case 'comments': + retVal = this.nifiCommon.compareString(a.comments, b.comments); + break; + } + return retVal * (isAsc ? 1 : -1); + }); + } + + select(flowVersion: VersionedFlowSnapshotMetadata): void { + this.selectedFlowVersion = flowVersion.version; + } + + isSelected(flowVersion: VersionedFlowSnapshotMetadata): boolean { + if (this.selectedFlowVersion) { + return flowVersion.version == this.selectedFlowVersion; + } + return false; + } + + importFromRegistry(): void { + if (this.selectedFlowVersion != null) { + const payload: any = { + revision: this.client.getRevision({ + revision: { + version: 0 + } + }), + // disconnectedNodeAcknowledged: nfStorage.isDisconnectionAcknowledged(), + component: { + position: { + x: this.dialogRequest.request.position.x, + y: this.dialogRequest.request.position.y + }, + versionControlInformation: { + registryId: this.importFromRegistryForm.get('registry')?.value, + bucketId: this.importFromRegistryForm.get('bucket')?.value, + flowId: this.importFromRegistryForm.get('flow')?.value, + version: this.selectedFlowVersion + } + } + }; + + this.store.dispatch( + importFromRegistry({ + request: { + payload, + keepExistingParameterContext: this.importFromRegistryForm.get('keepParameterContexts')?.value + } + }) + ); + } + } +} diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.html new file mode 100644 index 0000000000..e6fa0fc55c --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.html @@ -0,0 +1,38 @@ + + +

No Registry clients available

+ +
+ {{ + request.controllerPermissions.canRead + ? 'In order to import a flow a Registry Client must be configured in Controller Settings.' + : 'Cannot import a Flow because there are no available Registry Clients.' + }} +
+
+ + + + + + + + + diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.scss b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.scss new file mode 100644 index 0000000000..fc444ed325 --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.scss @@ -0,0 +1,22 @@ +/* + * 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. + */ + +@use '@angular/material' as mat; + +mat-dialog-actions { + @include mat.button-density(-1); +} diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.spec.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.spec.ts new file mode 100644 index 0000000000..64117f14a8 --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.spec.ts @@ -0,0 +1,50 @@ +/* + * 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 { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { NoRegistryClientsDialog } from './no-registry-clients-dialog.component'; +import { MAT_DIALOG_DATA } from '@angular/material/dialog'; + +describe('NoRegistryClientsDialog', () => { + let component: NoRegistryClientsDialog; + let fixture: ComponentFixture; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [NoRegistryClientsDialog], + providers: [ + { + provide: MAT_DIALOG_DATA, + useValue: { + controllerPermissions: { + canRead: true, + canWrite: true + } + } + } + ] + }); + fixture = TestBed.createComponent(NoRegistryClientsDialog); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.ts new file mode 100644 index 0000000000..f7897b2904 --- /dev/null +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/flow-designer/ui/common/no-registry-clients-dialog/no-registry-clients-dialog.component.ts @@ -0,0 +1,34 @@ +/* + * 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 { Component, Inject } from '@angular/core'; +import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; +import { MatButtonModule } from '@angular/material/button'; +import { NoRegistryClientsDialogRequest } from '../../../state/flow'; +import { NgIf } from '@angular/common'; +import { RouterLink } from '@angular/router'; + +@Component({ + selector: 'no-registry-clients-dialog', + standalone: true, + imports: [MatDialogModule, MatButtonModule, NgIf, RouterLink], + templateUrl: './no-registry-clients-dialog.component.html', + styleUrls: ['./no-registry-clients-dialog.component.scss'] +}) +export class NoRegistryClientsDialog { + constructor(@Inject(MAT_DIALOG_DATA) public request: NoRegistryClientsDialogRequest) {} +} diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/service/registry-client.service.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/service/registry-client.service.ts index 94ed22fd26..514043c7a7 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/service/registry-client.service.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/service/registry-client.service.ts @@ -23,10 +23,9 @@ import { NiFiCommon } from '../../../service/nifi-common.service'; import { CreateRegistryClientRequest, DeleteRegistryClientRequest, - EditRegistryClientRequest, - RegistryClientEntity + EditRegistryClientRequest } from '../state/registry-clients'; -import { PropertyDescriptorRetriever } from '../../../state/shared'; +import { PropertyDescriptorRetriever, RegistryClientEntity } from '../../../state/shared'; @Injectable({ providedIn: 'root' }) export class RegistryClientService implements PropertyDescriptorRetriever { diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/registry-clients/index.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/registry-clients/index.ts index 4cbe47e3ee..7d8ff8bdae 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/registry-clients/index.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/registry-clients/index.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { BulletinEntity, DocumentedType, Permissions, Revision } from '../../../../state/shared'; +import { DocumentedType, RegistryClientEntity, Revision } from '../../../../state/shared'; export const registryClientsFeatureKey = 'registryClients'; @@ -70,16 +70,6 @@ export interface SelectRegistryClientRequest { id: string; } -export interface RegistryClientEntity { - permissions: Permissions; - operatePermissions?: Permissions; - revision: Revision; - bulletins?: BulletinEntity[]; - id: string; - uri: string; - component: any; -} - export interface RegistryClientsState { registryClients: RegistryClientEntity[]; saving: boolean; diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/registry-clients/registry-clients.selectors.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/registry-clients/registry-clients.selectors.ts index 49dcbd5ecf..b98e007ae3 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/registry-clients/registry-clients.selectors.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/state/registry-clients/registry-clients.selectors.ts @@ -18,7 +18,8 @@ import { createSelector } from '@ngrx/store'; import { selectSettingsState, SettingsState } from '../index'; import { selectCurrentRoute } from '../../../../state/router/router.selectors'; -import { RegistryClientEntity, registryClientsFeatureKey, RegistryClientsState } from './index'; +import { registryClientsFeatureKey, RegistryClientsState } from './index'; +import { RegistryClientEntity } from '../../../../state/shared'; export const selectRegistryClientsState = createSelector( selectSettingsState, diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-client-table/registry-client-table.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-client-table/registry-client-table.component.ts index 7b05aa0351..c0384e2caf 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-client-table/registry-client-table.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-client-table/registry-client-table.component.ts @@ -23,8 +23,7 @@ import { TextTip } from '../../../../../ui/common/tooltips/text-tip/text-tip.com import { BulletinsTip } from '../../../../../ui/common/tooltips/bulletins-tip/bulletins-tip.component'; import { ValidationErrorsTip } from '../../../../../ui/common/tooltips/validation-errors-tip/validation-errors-tip.component'; import { NiFiCommon } from '../../../../../service/nifi-common.service'; -import { BulletinsTipInput, ValidationErrorsTipInput } from '../../../../../state/shared'; -import { RegistryClientEntity } from '../../../state/registry-clients'; +import { BulletinsTipInput, RegistryClientEntity, ValidationErrorsTipInput } from '../../../../../state/shared'; @Component({ selector: 'registry-client-table', diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-clients.component.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-clients.component.ts index 55690c4bfb..ef64be5cc3 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-clients.component.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/pages/settings/ui/registry-clients/registry-clients.component.ts @@ -32,12 +32,13 @@ import { resetRegistryClientsState, selectClient } from '../../state/registry-clients/registry-clients.actions'; -import { RegistryClientEntity, RegistryClientsState } from '../../state/registry-clients'; +import { RegistryClientsState } from '../../state/registry-clients'; import { initialState } from '../../state/registry-clients/registry-clients.reducer'; import { selectCurrentUser } from '../../../../state/current-user/current-user.selectors'; import { NiFiState } from '../../../../state'; import { filter, switchMap, take } from 'rxjs'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { RegistryClientEntity } from '../../../../state/shared'; @Component({ selector: 'registry-clients', diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/state/flow-configuration/flow-configuration.selectors.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/state/flow-configuration/flow-configuration.selectors.ts index 458bf59dff..f9a49749c7 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/state/flow-configuration/flow-configuration.selectors.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/state/flow-configuration/flow-configuration.selectors.ts @@ -29,3 +29,8 @@ export const selectSupportsManagedAuthorizer = createSelector( selectFlowConfiguration, (flowConfiguration: FlowConfiguration | null) => flowConfiguration?.supportsManagedAuthorizer ); + +export const selectTimeOffset = createSelector( + selectFlowConfiguration, + (flowConfiguration: FlowConfiguration | null) => flowConfiguration?.timeOffset +); diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/state/shared/index.ts b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/state/shared/index.ts index aec81d5933..63eed665d9 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/state/shared/index.ts +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/state/shared/index.ts @@ -386,7 +386,8 @@ export enum ComponentType { ReportingTask = 'ReportingTask', FlowAnalysisRule = 'FlowAnalysisRule', ParameterProvider = 'ParameterProvider', - FlowRegistryClient = 'FlowRegistryClient' + FlowRegistryClient = 'FlowRegistryClient', + Flow = 'Flow' } export interface ControllerServiceReferencingComponent { @@ -481,6 +482,57 @@ export interface AllowableValueEntity { allowableValue: AllowableValue; } +export interface RegistryClientEntity { + permissions: Permissions; + operatePermissions?: Permissions; + revision: Revision; + bulletins?: BulletinEntity[]; + id: string; + uri: string; + component: any; +} + +export interface BucketEntity { + id: string; + permissions: Permissions; + bucket: Bucket; +} + +export interface Bucket { + created: number; + description: string; + id: string; + name: string; +} + +export interface VersionedFlowEntity { + versionedFlow: VersionedFlow; +} + +export interface VersionedFlow { + registryId: string; + bucketId: string; + flowId: string; + flowName: string; + description: string; + comments: string; + action: string; +} + +export interface VersionedFlowSnapshotMetadataEntity { + registryId: string; + versionedFlowSnapshotMetadata: VersionedFlowSnapshotMetadata; +} + +export interface VersionedFlowSnapshotMetadata { + bucketIdentifier: string; + flowIdentifier: string; + version: number; + timestamp: number; + author: string; + comments: string; +} + export interface SelectOption { text: string; value: string | null; diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/ok-dialog/ok-dialog.component.html b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/ok-dialog/ok-dialog.component.html index 76f19dd22d..945c2f7395 100644 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/ok-dialog/ok-dialog.component.html +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/app/ui/common/ok-dialog/ok-dialog.component.html @@ -17,7 +17,7 @@

{{ request.title }}

-
{{ request.message }}
+
{{ request.message }}
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.css b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.css old mode 100755 new mode 100644 index 76585dbab7..826fce7576 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.css +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.css @@ -1,12 +1,12 @@ @font-face { font-family: 'flowfont'; - src: url('./flowfont.eot?33669169'); + src: url('./flowfont.eot?8516181'); src: - url('./flowfont.eot?33669169#iefix') format('embedded-opentype'), - url('./flowfont.woff2?33669169') format('woff2'), - url('./flowfont.woff?33669169') format('woff'), - url('./flowfont.ttf?33669169') format('truetype'), - url('./flowfont.svg?33669169#flowfont') format('svg'); + url('./flowfont.eot?8516181#iefix') format('embedded-opentype'), + url('./flowfont.woff2?8516181') format('woff2'), + url('./flowfont.woff?8516181') format('woff'), + url('./flowfont.ttf?8516181') format('truetype'), + url('./flowfont.svg?8516181#flowfont') format('svg'); font-weight: normal; font-style: normal; } @@ -16,11 +16,10 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'flowfont'; - src: url('../font/flowfont.svg?33669169#flowfont') format('svg'); + src: url('../font/flowfont.svg?8516181#flowfont') format('svg'); } } */ - [class^='icon-']:before, [class*=' icon-']:before { font-family: 'flowfont'; @@ -126,6 +125,12 @@ .icon-lineage:before { content: '\e816'; } /* '' */ +.icon-import-from-registry-add:before { + content: '\e81d'; +} /* '' */ +.icon-import-from-registry:before { + content: '\e81e'; +} /* '' */ .icon-port-in:before { content: '\e832'; } /* '' */ diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.eot b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.eot old mode 100755 new mode 100644 index 48a3ab1cd429c4e9d71a78e9b1678f0df7bdc8bc..f0d0fe0410a609fbd59a0e881ab5b16119e64f02 GIT binary patch delta 13593 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 TI%`W0E({Ba literal 25120 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 diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.svg b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.svg old mode 100755 new mode 100644 index 4b7cd8a84d..5427d62811 --- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.svg +++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.svg @@ -1,68 +1,72 @@ -Copyright (C) 2016 by original authors @ fontello.com +Copyright (C) 2023 by original authors @ fontello.com - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + - \ No newline at end of file + diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.ttf b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.ttf old mode 100755 new mode 100644 index 519f7cbf1052b8c0306037b38736cd168db2cae3..c16425cc281b148c2b81f162f45886e3515760ff GIT binary patch delta 13486 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 diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.woff b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.woff old mode 100755 new mode 100644 index eea365640511e1c09b294973e9479f0bbf3eda4d..799454c3b28c9ae946835d6ea24499aca040e58e GIT binary patch literal 13660 zcmY+LbC4%JwD*5w+qP})*yfIH+qP|cXUE#HZQHi(nRlLh?>}#{rEC2sVTv=5J002_|QF(q)A&esPlvie8{?U?uY>^-I z`B0QlvP1ZznD z>S<=+^y3RP^K%;V|3Eae_Avd?e%hlb001P?DcD`}%uNi80RSfNpE@i*u#>g;Z<+sy zKU(dNP51*Tgd<3kxs9{?kM>`C|7rd{72g}yc1HizyZNzy`U4PRRK^dsF>tpB0GL^S zY{LHl=0vElHLx-H(Nuo=;`?)-llOJJ1on1L&Oev@=?4(h4?}IlxVrX^CO^KcJ3oG& zKV+cvc>em|SJ38D$8SIQp(vBL%8|oYQ1LAp^vzRDYekBBe41tW* z`CGsfng)df1IT&6Bmn>U8u*TL1_Y!81e8TuAb@}fBLtgz_vnv|fTEh{o0#@M1J7wI zW5RdnyU+IGKJZ5oMS8&XGv_msL=uw&s>|RK+_Nv|q~(AWQG<883kET|(DHh~F$+kC zpsFVlK$iAKOcv>D;hUY&wx+}#?b;A>s)3*U3+O7tuCih^_4qDbkA-7hkAD$t#c}Bi z)I^wST2xKC!U!qT`MLR3+;7%&++J0b%VeH_p?nr|;gnT;NK7Ssn- z__tY^Qx$azBP2;|cS4cV2lWaFngckbJ)n+Tr?1f(8^@n6{V44 z8r~?W1Fj(r{Hlo}E?HSm%chHMyF`m@l5XPG30tRLGQZRBfATqYuNEHD6H-7B8>Q3A zd?y_&_fy&D*%}h&l6$_WLrSg$5wAJ)s#m|lPeP@a_YMkhx8nZJNbqN&&lhg1z1w!m z5tAeRtxB*LiGPuGWF0*)NP^Z}RPB@$rGpS3Jj}cSDFm=hV}{#*rV?1m|M_Q==>#csp67H*WG!A{#2TINk^ zk+Zy<@#?{l7(T?9!a5&?JRzZ*W#F7NJ2@b`$LWehmkIYq>PmvFL%z)9+U^`On_~NB zF8Gjf`l8B%ADCE zr+Z?^&&Ic6`>FG!5LPRB2i|nVo=1^T;S@(D+1ikCD5BH8k-8L#Dyinm$X1r7dDRQ# ztF&soZPuC?VR5I1LQJ8kinCkn$d|w==#Y5u)89$xtbdi}LU!2r0068)F#JoyfBJWg z;X&v!3Z#ZJVWyg}$Xqg{bi~%Onsb|-lr(Tndljs1`S4jPi<>!ry{6^bTqe{eKkBCj zl-#}8P$apCL9-B*L*EJsZenr88r7@L6QhLKGZc~?j>jJ<`Z|T%?~Nbur_pm6 zDyoEBzvBj&RB~A~@m|iB=DxG`H3Ab@=_b*iO&EAU-I~6#<)CTsl{6qrtC^Xkrn&q! zcy-B;O2{k{L9OeR>IVx4dgznw~cY7|A2G#Gbbc)zlDW_)YZPT80b zvz6i7SLUaswmQB4wYZxXtRvsgp9=j|*8%;l&b~u1uKF^3mvs|&$o7+K{p8pmMyqr6 zHqcLPp=;6+BJ)m(J;kVLwS#Q!)u(OZ%MJv2y{ac8EcIn`aDy?Q5wK~Uey-Vj)?LVs zgR?AF8mna?NSVZ5uN!qY*@LYGhxbEw#}1i?!Fr1kR$k?FybQm;$X@KuW7kG(IoX~b z$@hRDjHj87v#Y7FB1^tkykZIsn6Y*@JATKv}Ym2x~h>-C4oOL=R zaAK9U#DeV#+^S|oXQa$a;e^LcL*$P^uJu=xl$ydg@1GtRO4+$R&$MrDs8OPl0FNAVSEI)im3w~4Mg3Fo zU14*eF4)iBtjQg!d}=bhI*UjHpk#nfVj4=E-{g+ zcCY@Iz3*YpIKp(|t?8^*X=*P=5^@y_#{$_)QM&0izv1z<*tq>pMWG~Mc5{E5o;{*e z)hm~7knH=8NjlJ>4f(6bW8=^vl4F)%6L-+24O8S7hF!V!aFz9@#!#ov;lNq-I#1nM zUfZ)I53p==2L;u}obx(PAA2R6 zb?&TQEtai2{#57VZ`HvIl;^r8p$hKb43C`64ME`E<2d4ns?oMyE-Axg&!)(M?T~_# zx?bKfJE3Y?&M3_vjVwp)oKqUrb1*$MR-Q>j3-gLu4(!{62bz8lE;z)5!A(3DY?s-^8t_|JUDWLR z5WN^bqbt)}&&uG5un|TP0d_m)=g5yS9PZ$i*pruzWCQGLyi4Ox;50KiGJI0%ZsjyJ zO=~)!lQHMqc_g7d;Ux4C66eLu>q2;~*#Z5)&fxQuPB~iyQgz=T$GF#g0A2tB z0x3N(Az%vw(jS#UqF6++SR^7@R54XV2VO)nl~SrnbiL3*EpdM(cA7Kxyr>L?LN~J(t}l|^@Vl&`{J!_+~m+_m$jA9dmhA1eC3K`PBB@42h07@r`guT z_si!uivY7w+Mm;NXI$Ar3)ZkJLHT_7e1bxbT7j;nCLAfu)}1U-USf&R5B7gxaD_n0 zV!$6^NMT>_S7GsiTmDvLcZCE6X|s96k<|GQ!p=y!_XULLGyFx}f_~Au04ekZ?Z73~ z5s@hS7y&s!5{W=wi0$27jE5?od$)YXQhNgvpb*p=Yy$U{wIx8 zJ8;zuqz3AGf8qouU~;)il0uAPNEN1!$(p=@TI zn9jfTeOej zM;n(5C}ythMAHp}ztBFBKT+PqAGkf?IwQYu-hkfl-&h`O9^f93->Bc@ zPoz&^PCOo{9^OxiZXPK7hbU&kW{XaMoC(@+a)jOT*Jr6%K~#?YpRk+}FG0@cXNC>_ z;l&gf{DXQdYW$1iQpmm#c%}#!SwwlG3&}YV$J>)aeM1h6Pkti{(0e;`;3W^PO_w>G zvsuO8$gLc%>^nd2Gn5G@8(h#jqZ5=dp|7ylpT!xn>ExUbPJ_CwBh{|gX_|D9J`K%aRyNvmH0t z<+t$^6?{l1BQCR^Qu9prwOGP4{BdPf! zx*s(|#jwC#ZEQ_wSun$AC)wT8*xa8jb!paO*y^tj(|EGmD4`)$aXSxj^mUN_GS}Ol z1xt;-*K<0%FEVgW%pc=iOx5NJD#=VC%ecj%@(RgJ%dz{n7fs-qm^*+{ zR2d&OWLCg;+VU>5kp4sSRQ|{d9&fF^w0Zdf+4-;i-(P|I&)H}*-pZfXLf*?k=C#yLpiO%A3X($edZR|3^7x`8hS>foy!A#H8xpHs$ zfW5Rd?QgWcl-u*hcWPIhS#8wsU!RCzfWG0&reEAzY4rArX!E7D?T_zR5m$<7s| zyXuytA**1#P~lOqP-fal!jV1kkz}TVS_h5;=541!9P#D;Rvt5EDJSNQG8X8gK6yC4;p0Bpq}w&3(!{C8w!g9bXsGKW5b@ zE$l|D+socg=cHpp`+kRlq8B`(d@DU4T_^E~QZVe(U!b@TmPt)x@Q3&(t?+!nZW(ZJ zgTH<9&Aff1bq022_)!H#9IUmqcB>Kw#`%JecctlmfLLnQd>kTlO?t@sg34f}l*#J~ zq*{-qwkiNg(`0RV9Keli_3%Qgj0KE&sAzb^4zC2TAz6W;Md|N2&ralG;~w5R9s9J@tILWq;lxeDCpWzYVE%---LZ^d0kkU9iaez0AJn zdGCz2Pv>-A$G+S0I9VQ@>;}D8Z*z6o%qtX2XQ-%$FBqX*jMe<3y{*tdr|^xk zU>g5Z^64mLXgZk6Xp-AfNIS&P%rQ$dwz9kw)?h-?2l@wV7>p5Kh;|ShkE1hnni>nb zcW;uc!6@Ydx&bSe;XabwMlK8KkKQ=B@Kdtvkfa{z-Z}mf?b~9#sK=SbCKS0*@oX9Y zz5VJ`M^mA0RJVQF1O%zmxMup^p>>^xJrn|T_5w+n&f+8{jkc4EcyWIdq?EKv8oiq| zZX8WtmzU3Ov21w9+lVQw3&og`{{d!!xSAA2xc|6mF9tqhcH-1TAbo3afKt&{vnJT{ z%A)n)9!%j2lAvO7oMe{(i~OE$sf3!!*D$Fl5_DW$E`G(DzsiB33&$i75w$?Uq9yVbs)oxhoRC!$7W>&!gQydW zW!A7nGv{iHC5rrQtn&9)X}IAr@A~Z8jz7vAOVMDuJ9Q~2?&pPZAi(cludZTa+uHPJ zPJ2$KUR$%w%xrlb`+GN&c$(s3tvC4p`RUv1+xNeD`*rzku3dFqb#3LwR>xMe3>79okDFoBhb^Bjs!ASkfxi5KzsLxS@ZcsHvRRcKm}HgUN=_f` zYsxo~GR&4sZ#r2|XG)U8v><`j%Z|vrkls(DiZMX~L$uT-e*(B}1G5Yp(qZs$yvJCc z@%q+@u4>!7Y~xx*;9Un#nBL9q*QK)AJKbkJBP8X)GPojr?@fpMS-VMJL@_Zs9$MXs zuXh&2KWo_irCJKi655KZBPMl5iEncUGI!AhRl>+G8kCK1b>~3TaYC}a3bA!f`P=ur zaC4JY1BZa}Ojz_4qCPI>8bUwxHZF2cw@o)6`qfj&JHsp1oolkQG@^x z=6B5!N4UJ)>9FNiLN4D&TY-o^$`YjqX^-|eVDJ31-o6uuGEOqSWE~8ntfFDsdL|HY z=pB6sYupCs#0}mRKYZs2FaAhP4Ka?J3Yo$+F{MqVNU_zV7DvYLk=Z^uo$TdI_mSEL zs*%a<tp%U^L1`YZYm}Y&QUq} z?5tA(O12#YI!g{*Pe{JHKk7a@3k+$IrNIPEj!0_=+FwE!=+wy>O+pHb8E6)W!7&$6 zzoS!h@!`KvEiJZ`{#C$Ak?K#T3)viU{vHKm(BIqIxeFBHPF+1+-Del1<=vrvxq3%vA0we_dubB4;ibLttiQ70AN2o9oj20R! zm`vam6DSb)VN_X3fOq&71@a@G3M`tDqs`>Lt#MUG=km!W%gr`prN#Ghq;26Zk%U zxZ-SdKE23Y=hmx3;S+D8M53l^Vjo-b8`Q2O#a8zk4KkO3T%;||iJzdl42q#^O6db7 z6}>{^ZTt|_Z>)N=cdnFD{&vliP-e5{vS6-apW)uQYU+{F2JOQMo@o?l_tsEKB?^O$ zq4g$#-LoAS039bBJN2q^jJUn0a&jCG^%^c@WD%GJbfIR0c znI#6D2qv2As;};1089^@xkuScsBQkQ!1m~6_SDDA?Q)~dM5n8>vAUt4fgKA90tC%B z@6>@O$vAPxfe|U#50J?Rb5H|EN|z?9 zbd-n+b+JFjhcFE zI^xj`Ld&hxv!btXMF29{7E|_F(s0nlN~}GOq6B)=$ej}xJuA~Qv|XMwx^}pvjFXsc z)_Z+w0qaGk_-HJz>##dXm;cqI<8YE<91p8fc`kNSNnDR~f%l(*F)Ks-R9EhSv)cOC zo>dHM|gAU$(*N6dOz0Y30zbK36Ri@OUlA zgyvsw!HUpQDN7-(GwEo1G+)jLQ#zqEYxQOSuu63doazF0)n#_h=QiV*K%?{KW6IPA zqb5Xs>xiH3kMq7e4HFuP{VYPGCc7Br1V~B?Fx*Z<3;3T9S*h9lUOnvPG`wH^<{aGb zt@+@hBf;>UBcnaw|G~#WqZ$d_fNC>l7~)@=H{t!WCx({PuFIkOvpV>YGTXGl43J88 ziiVQbMMkJP{kA`^@%bcyjmK!N#qhYqAuveOihAxc=w3d)MDBu;dMPV)eonIer25^M z{TV6lm#E5H=GC=FKj?U*PxqdHqZ$Mn7bKP~_iKLNAegq*NF9_&$`Ff!*{Ky`9h z*Fg`;u$)JRJK73)Sd0V`^wAe7&8+1~Y``1`iq@ZfGrz+oUAr?MPKc;xtJzCC!wiK1 zeFa=-uC<(LYXJ{>rw=hS52(3MrOsc?Mf%F+0UfBMs?!PDp9J_K%T}b z`(D?3kB1i%b}NwBh`C)~&`{lI*S7rW*DVqdo%F=PyWZ-mzrSh}=JiI~@MH~AcKXC+ z31RhWOE6lAWF#%b4O8ihiu^LHI|5Z@TH9X<=SZVh8>9WSYSUw85|gRb@_WI^-EUtiQI zh@LGY=UjaN__4=?1IM$Ao2$FhWgz0;Vc8Y{%?ar2uPa=aL{a5~IE`jQFX98IDr|9Jn7H4wgI?U_d&v4UM* z2puE5LQ7>B5^iiH0^cOG6XqyzItQtIP+RW635Z(^kCnGCPdG_RMvg3g&_k^Y+Q0cw z2G#=)1pm4Q+ugsu1wtT;jh z)J3MXR@fz)`(b~0 z%gy}y3U9qR+8XoZ{PM!wwz4WhyrK_{ufMFBXKmktLl~F#VJe%pDL2=>5O>meLs3&_ zYb*L*!$N(wM4jS^oAEF3417N0fXR|XwIP;42uCUj0sFb}2trRefrgi7#eKHz$4AVb zkJHoF0;TkJPicXQO?Eq!Q=VtcAO;IfMg6m-b&nGnd%idFgzsvxQWNBi5t58t5(SlFDwSAIO2)qkU+myyBwmb^@jao) zjL>#G)Svu&DylvC`0ne1b#R|4ieMdYeRc-ww3<&lX9gh^LNMPzLxX!32%k7ZXfube z+dDmX2x-HpIxh$;e+P5)XM{b8BU7;h?F*UZYo#yPXJ0vw48sYQ*HY!MNQOEa~!s6zLZME^rFGx$fz zUbKp<0}hs9jS|tVr5?{X_b0x#Q=r9TbxV_ZF{=Hho&iP|8n*g@l~fICPe8 zgPFI(y#SSz#+P65cKWrb(`WdKb1iKDoILZ|%d1ww+qorxcNv){NIqSV$MEv$PPTxY zM~=QVTb8!ElV?dO_F@q38=I$|V~+z}oSuC+_L`|OL1)0w;8wOj%BElS@g?101Dj`30dY(!&b|#uA)-6(-TQZiDIu9Ooay%$+(sw{X5Qj z?D=SjXL!zL60VVLan(4K>n!4*GUQtBTcn?_OAT%VqQZuDq%gozdyT&F=W9R`6FR6i z^P9yRb^0TdX}CNF{|C&v-8ZeY{BFO3W;WMpM7X@bVVuh|is69MTk=(Euo>u>j!^cP z4shuumSEsJ!%7!F>GV34G;f|OgYP^maV08~x2o-DKkyCDA6zwB$DI}4>UJ#neH+{+ z)-WS;;7ifcI~Kf^ka|W2<6?+$cXto^gp&bgMzu3kKPmc3eo0;Zq&Fw_8zwBNi3ODr{hV z$1Dzqfc<#fAPeCT>r^qv{S%AMfpcq% zdamHBn%vX!H6=bWs5glQm!PVkEdsy3dyw}S@x z&#NK=UYfSYcPw}Az@V?B73e8ELb4lDfcso(&-|zqK*_c;=<+$Jya`>v2;yT2R(Szi z-yd?xSR)I{sQ~TQBr0oViJU#r7^>6EB?B$hQMnbEL_>FVY?`3LB3od-Uz(a}_};=I z550yc-OeJqFNqGzjQv|?8@&15M@_@^hwP#4CQSFFuXL&(PQwS>Am|Mf~BB6sb^#b{S5NHKoHrL01}0ax*#dqKgJ<7O|zYb z$GsCZ9t@^mhxXjw0m}G~pzbw1f`%Ee{n7rH&29L!^Gb_ z%jk2s1mnAqU^Gd7hqz8uKvmvsrc*))lb48K16|Fs;aR{)%&5pJU?7sEE1*{l9Sb~5 zw86TtGVnsk7iv!+H&V1gr=2_`Jj1L@5r)Wo&sjZ!k z3R=b|M24hC zv6EpH2a{0uT=J&}F27qb5MsM`#-M4Zm)45AsPtew&&gu;Zf*m`~+jSwBS$nqj(iQSyXmBfX$9CTqPh zm4qfDMfy2UTFcWG89MlxxKx?MH_(qeqU9~|zL?xAUUZ_#M`VAL)(fZU?YCT7C3PUe zUaABW00n_ptcgw!x%Ixvx1pr4@%7)eqffVfs0t>1I4^d+a#{*l%_u%lzKQbX{EbzH za9frgHdJhSJ`WEDRzVMYk5KOVKH*d?30g*xMH9Okl;f=o$3+{fdy5(AjmQ=@R#cR9 zm4bmzRnf=LtD;PRuFfjbWuWPijIJ0S4omV;zFVHfoSnqbQkT(X20@ z)Z?ie^?u2H-ey;8F|eE-a4E`ySblyysIQ`XWXnijw`p7X69x3dfPrx-&))1zz4qHb zFdfP13F04~QP8+yh3VNQn3|V=nUd^);D9zmoi&WsS}sPf28t3Nlh)SMH?$jMes6 z>=q6R_71!@89PT92dT3Ts`&fboAE4h8u}pg^Qi6f-8_bTm?b1V>N+Ux+}oX2+RtJ%d>!HlK(#G0T>;91|K*?(HjYT6ycGHxDW8CJ7_r z!t;=L_K?BviDjW+I|fY_iz?zncOZ70gb_ldSR~ucD2))OT7zQABn%`Q)Z7!OPLEmN z(yq^`Q02xD4XeYlmOv~(@EFFQF1`}R5r~U*k|_We{t_^Ui%l8mqjoM}KMLcDP=BTF z9;YL7lttj-{&o}h^>%pedyb>`eulyKJ$jt`GSW}rb5KOkay%8%%0eNJ>udf-gwAJf zBllZPEi14a-wcR03Yh0FJv7bt)2+XCYz|=LNMJ*`1opjI{``eF9dBrix%F8?w~558 zG36>*vesPi6zH9oD~7=eeQCw4WLMFvChSv85^)s?WMXZ|hR2M6%im1;kDM_D4XCoi;q0`L8B5gR!>{}qF76btA4?}9*X`uVGXovQ zRNa+TM>83u@-21I$pRhz*z(NW%>&DyeBR5n427#WmKiXn6h_i zYG=|oO^G6y8Jw1A696p)k|FGaJ9UkH*Vmid^Von>NPTy|jxm!DE-x3t%ixK7Lf`J; zjmG?Xv7rgl^}y(h2}qNAQKCCsTCE#w(8e1%WqJU-;l3Gk71pfMIpD4Zs$Ti56!>B* z4~Nx~-x7wq5Qd*4@u&d(PT-$bIq^U*a~J1^C!XvkDH!$s=!GEo*a*t|d})y9_5JQV{`qV3c{KlC`gCmq|w(jLN~!%BaT+?Ab37Ilx!! zH&+0SuTjLV%c+Mb+IkOBiv-upJ2#PD8fO1I1{KT34vWv+Q^v<%JR8CNlX;ICS_A5R z*ppJhiHPva%(R>$c+fw%Lvr6Ec8r zSKTK{ih$jgAv22muBsxVb+O^*SOf%@qdB@uG2*P>Km>PUXO`9em~`KkJxArZoc(30 zx)F^RP%Lhs3y+E23A-8sVPBP3QajtrvZ3473%wXFBg9(_kmLAbc|G5349wSi!-*r` z@ff4eEE*vn|GtWLK0w-b*k) z(k|1*z{c`z%=z1peCX`pshN*B;~51f3`EsCc{{`L^r?3l`jm4gh^3~9R1X#;Wr=Z- z!Q^NO1$RTB@Mw5zWcoyRpZn)1Kbi!(uBCvTcXbrgCm`VQF$uEhaa(S8VwUA&FA28u zDkq(BBDB|tg3nnF<3%BBK$%yn!?6x))QcB6JH2h4QutSL=@@j76$;4wSFgy*Xw$#Q zv!zX)3~1ki9V-iQ+izNLw&{KICU(#DA1_V@)zo+JkXtunwIM(BDhHS&W9r}q{v~MB zE+GY2iPLV0NGNZ}QN8}InpIbYSEuE>x~sD2-47J+*{>~UV6LyJKM)P^dT`@ZpV2Z% zXl)+@ioOoW$RHlQQm>?ulmM>Y995I>;@y(FNQN3L(bHZN^^<%qL_Zj9ACnHWlOx{% zH}FrVQi716Fz1^|nqaAun%`}3*JBsWTIt19C>*U9`m=l)F&tPhz0K$LG{tXa$sDc7 zm9HPQ{{%SSLAvqeK#sUNWb1nAMlHnSbh;m%Kj6R4=ze?(Nwc)_UZSw;H2JEwK%*I4 zE|}D%PLNgKxj}a?`PCEQOGXOk@oNzZlShN?$;X_O|DQ)E!NY{hFTzPLW)adI{K{HP z@z(nb1$Z!F@aHLMbyPcB8=K8#ZZ@tu8)tKS8$Gkw&L;22co3BPU-%X?vTpmC!&6!xMeZeYZP;cA&8y$MRPDy7MBDcjSwaYNQPh8s? zjcym8m>kNC(J~HI+A|f#n}WUcEt$1ARPqezoQBoJUXG$3O~xM8TH6z~y`@<;9?;urs{VhO@TBI`qYiXC5sb3_aU2b$bW)_ zs?AeTg;hmL4~!MF zThwaLJa|^DB3HGC_&(LUimR-tje>kzP#`XGIp|Vrg*u$W!4lO`s9KSl?q^I_wO%ix z`Q+*twMTiLSLuT`!$0%EGly=v?;dU@GA|6qzJ&wsD0(!0)hQz(u#yk+TkX;HhL^(e z9X(U}p&UXSJ(m=v*zDRK>!aV8yUxs`Syx4)R_TLuq);B8ZIYw41W2XPAj`#ib+~** z2aQM)@;L!}@dzM%_ruD=JV%TjM7z%@Kc-k8N4y&EyVu`3@peX(ZjWDN5n$p@#<50w zx?(_5T~u!hShiJv7BOLzc2l`I`33JaF2sQ&BV&LFkfa67@&ClO z|MF7!73r-ARnNbple|mVNziO;eg@X;inL4k#A5EQRUFjFfOo^ zu(NTb@bK|N2~-Fb2&;*7N$^Q!ei{J!fe;AdfA@<3fB`CiR6xv+OaTx3U;FOaF7caE z{fxMS@*81o0g-{tM^dPDS$JEp;6bCVMI6GeG&+~dCz%PRW4irrHwNBNd4u!xID55Z zlh@hVANO{E>^&Ud^W$8jNni*StF3-M&s3TR0$R1vxKu0iy;aAYuc$+CTSN`pJy?QD z!tyW`7H>^-PNd<~XM0k5TD6mH&FVz2R4Yyl`PB0VpK&-D5!==X>0361s1&)vm63|x zM(1@~aXB@mSt(|Ql&!e|spEPE;gk$Q*_8bXkM#0qp|~LP3{OuIj(gG>k3wdT<9{4W zlq0~G89R-CbGt>WnF?SVGsg?6XfQMBZHd>h7wylxjcGAC zx0~O79)J4+q%DFg{u_TA1ue%QMp)x{#4X9SKQ?c22t5V3h{;$+EKMUaUT=Yt>AoTa zPt{~qOLyp7sC90?;MI4)rC-#E1i~Sikc&rZhrqQq_TZmac7fvD`|zjTdug_AViCOe z{23UkJxe5x3TcCco+C$#iw6{ybfGLP*bYC}PP(KwGjJ@~k{AXPj2EzU;v3fnK)B(m z%JbvPE{pXw8<57D;N%TQYnE*2p|3(<@v5<7v!~1nJO9OyW}3p8v+#4+l){;@H1CP5 zf9Gb8sVAN1iYIc;{Y5fsP<_@~r9@`Cq?qks4#E?5FuKxoC8=)oV{oX-Gn1q;~*5l!FV43p)yigSC>w&dg{o zXiksnNdW=^!hvi>0m1?jG%kiV6x$OH2aktD=o>jM28ZYe0RbZ7-%FL sLJ}n`?g%LZ49d=YV{xhfvE3F>;zoiJG;X?t$_|c!0Z7KBh5!KmAIF6#w*UYD literal 12664 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 diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.woff2 b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-frontend/src/main/nifi/src/assets/fonts/flowfont/flowfont.woff2 old mode 100755 new mode 100644 index 0138d2a8e533297079582d619fa31b7d179a91cb..1917ea71cdff95fd8b8cfda439394ddf756621d9 GIT binary patch literal 11600 zcmV-WEw9pdPew8T0RR9104-1e4*&oF0AdsX04($X0RR9100000000000000000000 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 O`R{MvNrKm|1ONaMj2LbJ literal 10780 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 aFu}ypC9wFP&PZ?m^Zz^K