blob: c9ff303dc79cd2d3b7349d657e198645f69b2a6a [file] [log] [blame]
/*
* 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, forwardRef, Input } from '@angular/core';
import { ControlValueAccessor, FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { Relationship } from '../../../../../../state/flow';
import { NiFiCommon } from '../../../../../../../../service/nifi-common.service';
export interface RelationshipItem {
relationshipName: string;
selected: boolean;
available: boolean;
}
@Component({
selector: 'source-processor',
standalone: true,
templateUrl: './source-processor.component.html',
styleUrls: ['./source-processor.component.scss'],
imports: [MatCheckboxModule, FormsModule],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SourceProcessor),
multi: true
}
]
})
export class SourceProcessor implements ControlValueAccessor {
@Input() set processor(processor: any) {
if (processor) {
this.name = processor.component.name;
this.relationships = processor.component.relationships;
this.processRelationships();
}
}
@Input() groupName!: string;
isDisabled = false;
isTouched = false;
onTouched: (() => void) | null = null;
onChange: ((selectedRelationships: string[]) => void) | null = null;
name!: string;
relationships!: Relationship[];
relationshipItems!: RelationshipItem[];
selectedRelationships!: string[];
constructor(private nifiCommon: NiFiCommon) {}
processRelationships(): void {
if (this.relationships) {
if (this.nifiCommon.isEmpty(this.selectedRelationships)) {
this.relationshipItems = this.relationships.map((relationship) => {
return {
relationshipName: relationship.name,
selected: this.relationships.length === 1,
available: true
};
});
this.considerDefaultSelection();
} else {
this.relationshipItems = this.relationships.map((relationship) => {
return {
relationshipName: relationship.name,
selected: this.selectedRelationships.includes(relationship.name),
available: true
};
});
const unavailableRelationships: string[] = this.selectedRelationships.filter(
(selectedRelationship) =>
!this.relationships.some((relationship) => relationship.name == selectedRelationship)
);
unavailableRelationships.forEach((unavailableRelationship) => {
this.relationshipItems.push({
relationshipName: unavailableRelationship,
selected: true,
available: false
});
});
}
}
}
considerDefaultSelection(): void {
const callbacksConfigured: boolean = this.onChange != null && this.onTouched != null;
const autoSelected: boolean =
this.relationships?.length === 1 && this.nifiCommon.isEmpty(this.selectedRelationships);
if (callbacksConfigured && autoSelected) {
this.handleChanged();
}
}
registerOnChange(onChange: (selectedPrioritizers: string[]) => void): void {
this.onChange = onChange;
this.considerDefaultSelection();
}
registerOnTouched(onTouch: () => void): void {
this.onTouched = onTouch;
this.considerDefaultSelection();
}
setDisabledState(isDisabled: boolean): void {
this.isDisabled = isDisabled;
}
writeValue(selectedRelationships: string[]): void {
this.selectedRelationships = [...selectedRelationships];
this.processRelationships();
}
handleChanged() {
if (this.onTouched && this.onChange) {
// mark the component as touched if not already
if (!this.isTouched) {
this.isTouched = true;
this.onTouched();
}
// emit the changes
this.onChange(this.serializeSelectedRelationships());
}
}
private serializeSelectedRelationships(): string[] {
return this.relationshipItems.filter((item) => item.selected).map((item) => item.relationshipName);
}
}