blob: 2756fcc97c7208e57c51efc69d8a61b50c161df3 [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 React from 'react';
import {
FormGroup,
Popover,
Select,
SelectVariant,
SelectDirection,
SelectOption,
} from '@patternfly/react-core';
import '../../karavan.css';
import "@patternfly/patternfly/patternfly.css";
import HelpIcon from "@patternfly/react-icons/dist/js/icons/help-icon";
import {CamelMetadataApi, Languages, PropertyMeta} from "karavan-core/lib/model/CamelMetadata";
import {CamelDefinitionApiExt} from "karavan-core/lib/api/CamelDefinitionApiExt";
import { ExpressionDefinition} from "karavan-core/lib/model/CamelDefinition";
import {Integration, CamelElement} from "karavan-core/lib/model/IntegrationDefinition";
import {CamelDefinitionApi} from "karavan-core/lib/api/CamelDefinitionApi";
import {DslPropertyField} from "./DslPropertyField";
import {CamelUi} from "../../utils/CamelUi";
interface Props {
property: PropertyMeta,
value: CamelElement,
onExpressionChange?: (propertyName: string, exp:ExpressionDefinition) => void
integration: Integration,
}
interface State {
selectIsOpen: boolean;
}
export class ExpressionField extends React.Component<Props, State> {
public state: State = {
selectIsOpen: false,
}
openSelect = (isExpanded: boolean) => {
this.setState({selectIsOpen: isExpanded});
}
expressionChanged = (language: string, value:CamelElement) => {
if (language !== (value as any).expressionName){
const className = CamelMetadataApi.getCamelLanguageMetadataByName(language)?.className;
value = CamelDefinitionApi.createExpression(className || '', {expression: (value as any).expression}); // perhaps copy other similar fields later
}
const exp = new ExpressionDefinition();
(exp as any)[language] = value;
if (this.props.value) (exp as any).uuid = this.props.value.uuid;
this.props.onExpressionChange?.call(this, this.props.property.name, exp);
this.setState({selectIsOpen: false});
}
propertyChanged = (fieldId: string, value: string | number | boolean | any) => {
const expression = this.getExpressionValue();
if (expression) {
(expression as any)[fieldId] = value;
this.expressionChanged(this.getValueLanguage(), expression);
}
}
getValueClassName = (): string => {
return CamelDefinitionApiExt.getExpressionLanguageClassName(this.props.value) || 'SimpleExpression';
}
getValueLanguage = (): string => {
return CamelDefinitionApiExt.getExpressionLanguageName(this.props.value) || 'simple';
}
getExpressionValue = (): CamelElement => {
const language = this.getValueLanguage();
return this.props.value && (this.props.value as any)[language]
? (this.props.value as any)[language]
: CamelDefinitionApi.createExpression(this.getValueClassName(), this.props.value);
}
getProps = (): PropertyMeta[] => {
const dslName = this.getValueClassName();
console.log(CamelDefinitionApiExt.getElementProperties(dslName))
return CamelDefinitionApiExt.getElementProperties(dslName)
.filter(p => p.name !== 'id')
.filter(p => !p.isObject || (p.isObject && !CamelUi.dslHasSteps(p.type)) || (dslName === 'CatchDefinition' && p.name === 'onWhen'));
}
render() {
const property: PropertyMeta = this.props.property;
const value = this.getExpressionValue();
const dslLanguage = Languages.find((l: [string, string, string]) => l[0] === this.getValueLanguage());
const selectOptions: JSX.Element[] = []
Languages.forEach((lang: [string, string, string]) => {
const s = <SelectOption key={lang[0]} value={lang[0]} description={lang[2]}/>;
selectOptions.push(s);
})
return (
<div>
<FormGroup label={"Language"} key={this.getValueLanguage() + "-" + property.name} fieldId={property.name}>
<Select
variant={SelectVariant.typeahead}
aria-label={property.name}
onToggle={isExpanded => {
this.openSelect(isExpanded)
}}
onSelect={(e, lang, isPlaceholder) => this.expressionChanged(lang.toString(), value)}
selections={dslLanguage}
isOpen={this.state.selectIsOpen}
aria-labelledby={property.name}
direction={SelectDirection.down}
>
{selectOptions}
</Select>
</FormGroup>
<FormGroup
key={property.name}
fieldId={property.name}
labelIcon={property.description ?
<Popover
position={"left"}
headerContent={property.displayName}
bodyContent={property.description}>
<button type="button" aria-label="More info" onClick={e => {
e.preventDefault();
e.stopPropagation();
}}
className="pf-c-form__group-label-help">
<HelpIcon noVerticalAlign/>
</button>
</Popover> : <div></div>
}>
{value && this.getProps().map((property: PropertyMeta) =>
<DslPropertyField key={property.name + this.props.value?.uuid} property={property}
integration={this.props.integration}
element={value}
value={value ? (value as any)[property.name] : undefined}
onExpressionChange={exp => {}}
onParameterChange={parameter => {console.log(parameter)}}
onDataFormatChange={dataFormat => {console.log(dataFormat)}}
onChange={this.propertyChanged} />
)}
</FormGroup>
</div>
)
}
}