/* 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 . */ // @flow import React from 'react' import styled from 'styled-components' import ToggleButtonBar from '../../../components/atoms/ToggleButtonBar' import type { Field } from '../../../types/Field' import { Wrapper, Fields, FieldStyled, Row } from '../default/ContentPlugin' const ToggleButtonBarStyled = styled(ToggleButtonBar)` margin-top: 16px; ` type Props = { connectionInfoSchema: Field[], validation: { valid: boolean, validation: { message: string } }, invalidFields: string[], getFieldValue: (field: ?Field) => any, handleFieldChange: (field: Field, value: any) => void, disabled: boolean, cancelButtonText: string, validating: boolean, onRef: (contentPlugin: any) => void, onResizeUpdate: (scrollOfset: number) => void, scrollableRef: (ref: HTMLElement) => void, } type State = { useAdvancedOptions: boolean, } class ContentPlugin extends React.Component { constructor() { super() this.state = { useAdvancedOptions: false, } } componentDidMount() { this.props.onRef(this) } componentDidUpdate(prevProps: Props, prevState: State) { if (prevState.useAdvancedOptions !== this.state.useAdvancedOptions) { this.props.onResizeUpdate(0) } } componentWillUnmount() { this.props.onRef(undefined) } handleAdvancedOptionsToggle(useAdvancedOptions: boolean) { this.setState({ useAdvancedOptions }) } findInvalidFields = () => { const apiVersion = this.props.getFieldValue(this.props.connectionInfoSchema.find(n => n.name === 'identity_api_version')) const invalidFields = this.props.connectionInfoSchema.filter(field => { let required if (typeof field.required === 'function') { required = field.required(apiVersion) } else { required = field.required } if (required) { let value = this.props.getFieldValue(field) return !value } return false }).map(f => f.name) return invalidFields } filterSimpleAdvanced(): Field[] { const apiVersion = this.props.getFieldValue(this.props.connectionInfoSchema.find(n => n.name === 'identity_api_version')) const extraAdvancedFields = ['description', 'glance_api_version', 'identity_api_version'] return this.props.connectionInfoSchema.filter(field => { if (this.state.useAdvancedOptions) { return true } let required if (typeof field.required === 'function') { required = field.required(apiVersion) } else { required = field.required } return required || extraAdvancedFields.find(fieldName => field.name === fieldName) }) } renderSimpleAdvancedToggle() { return ( { this.handleAdvancedOptionsToggle(item.value === 'advanced') }} /> ) } renderFields() { const rows = [] let lastField let apiVersion = this.props.getFieldValue(this.props.connectionInfoSchema.find(n => n.name === 'identity_api_version')) let fields = this.filterSimpleAdvanced() fields.forEach((field, i) => { const currentField = ( fn === field.name) > -1} value={this.props.getFieldValue(field)} onChange={value => { this.props.handleFieldChange(field, value) }} /> ) if (i % 2 !== 0) { rows.push(( {lastField} {currentField} )) } else if (i === this.props.connectionInfoSchema.length - 1) { rows.push(( {currentField} )) } lastField = currentField }) return ( { this.props.scrollableRef(ref) }}> {rows} ) } render() { return ( {this.renderSimpleAdvancedToggle()} {this.renderFields()} ) } } export default ContentPlugin