/* Copyright (C) 2017 Cloudbase Solutions SRL This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ import * as React from 'react' import styled from 'styled-components' import configLoader from '../../utils/Config' import LabelDictionary from '../../utils/LabelDictionary' import FieldInput from '../../components/ui/FieldInput/FieldInput' import type { Field } from '../../@types/Field' import { Endpoint, Validation } from '../../@types/Endpoint' import { ThemeProps } from '../../components/Theme' export const Wrapper = styled.div` display: flex; flex-direction: column; min-height: 0; ` export const Fields = styled.div` display: flex; margin-top: 32px; padding: 0 32px; flex-direction: column; overflow: auto; ` export const FieldStyled = styled(FieldInput)` min-width: ${props => (props.useTextArea ? '100%' : '224px')}; max-width: ${ThemeProps.inputSizes.large.width}px; margin-bottom: 16px; ` export const Row = styled.div` display: flex; flex-shrink: 0; justify-content: space-between; ` type Props = { connectionInfoSchema: Field[], validation: Validation | null, invalidFields: string[], getFieldValue: (field: Field | null) => any, handleFieldChange: (field: Field | null, value: any) => void, disabled: boolean, cancelButtonText: string, validating: boolean, onRef: (contentPlugin: any) => void, handleFieldsChange: (items: { field: Field, value: any }[]) => void, originalConnectionInfo: Endpoint['connection_info'], onResizeUpdate: (scrollOffset: number) => void, scrollableRef: (ref: HTMLElement) => void, highlightRequired: () => void handleValidateClick: () => void handleCancelClick: () => void } class ContentPlugin extends React.Component { componentDidMount() { this.props.onRef(this) } componentWillUnmount() { this.props.onRef(undefined) } findInvalidFields = () => { const invalidFields = this.props.connectionInfoSchema.filter(field => { if (field.required) { const value = this.props.getFieldValue(field) return !value || value.length === 0 } return false }).map(f => f.name) return invalidFields } renderFields() { const rows: JSX.Element[] = [] let lastField: JSX.Element let i = 0 this.props.connectionInfoSchema.forEach((field, schemaIndex) => { const isPassword = Boolean(configLoader.config.passwordFields.find(fn => field.name === fn)) || field.name.indexOf('password') > -1 const currentField = ( fn === field.name) > -1} value={this.props.getFieldValue(field)} onChange={value => { this.props.handleFieldChange(field, value) }} /> ) const pushRow = (field1: React.ReactNode, field2?: React.ReactNode) => { rows.push(( {field1} {field2} )) } if (field.useTextArea) { pushRow(currentField) i -= 1 } else if (i % 2 !== 0) { pushRow(lastField, currentField) } else if (schemaIndex === this.props.connectionInfoSchema.length - 1) { pushRow(currentField) if (field.useTextArea) { i -= 1 } } else { lastField = currentField } i += 1 }) return ( {rows} ) } render() { return ( {this.renderFields()} ) } } export default ContentPlugin