blob: 8a41c5b7057e6ae4438cad205a91006ff2920bac [file] [log] [blame]
// Licensed 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 PropTypes from 'prop-types';
import React from 'react';
import { OverlayTrigger, Tooltip } from 'react-bootstrap';
import Constants from '../constants';
import Form from 'react-bootstrap/Form';
const replicationTargetSourceOptions = () => {
return [
{ value: '', label: 'Select target type' },
{ value: Constants.REPLICATION_TARGET.EXISTING_LOCAL_DATABASE, label: 'Existing local database' },
{ value: Constants.REPLICATION_TARGET.EXISTING_REMOTE_DATABASE, label: 'Existing remote database' },
{ value: Constants.REPLICATION_TARGET.NEW_LOCAL_DATABASE, label: 'New local database' },
{ value: Constants.REPLICATION_TARGET.NEW_REMOTE_DATABASE, label: 'New remote database' }
].map((option) => {
return (
<option value={option.value} key={option.value}>{option.label}</option>
);
});
};
const ReplicationTargetSelect = ({ value, onChange }) => {
return (
<div className="row">
<div className="col-12 col-md-2">Type:</div>
<div className="col-12 col-md mt-1 mt-md-0">
<Form.Select
onChange={(e) => onChange(e.target.value)}
id="replication-target"
value={value}
>
{replicationTargetSourceOptions()}
</Form.Select>
</div>
</div>
);
};
ReplicationTargetSelect.propTypes = {
value: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired
};
const RemoteTargetReplicationRow = ({ onChange, value }) => {
return (
<Form.Control
type="text"
id="replication-remote-connection-url"
className="form-control"
placeholder="https://"
value={value}
onChange={(e) => onChange(e.target.value)}
/>
);
};
RemoteTargetReplicationRow.propTypes = {
value: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired
};
const ExistingLocalTargetReplicationRow = ({ onChange, value, databases }) => {
const options = databases.map(option => <option value={option} key={option}>{option}</option>);
return (
<Form.Select
id="replication-target-existing-local-database-database-name"
value={value}
placeholder="Database name"
onChange={(e) => onChange(e.target.value)}
>
{options}
</Form.Select>
);
};
ExistingLocalTargetReplicationRow.propTypes = {
value: PropTypes.string.isRequired,
databases: PropTypes.array.isRequired,
onChange: PropTypes.func.isRequired
};
const NewLocalTargetReplicationRow = ({ onChange, value }) => {
return (
<Form.Control
id="replication-target-new-local-database-database-name"
type="text"
className="form-control"
placeholder="Database name"
value={value}
onChange={(e) => onChange(e.target.value)}
/>
);
};
NewLocalTargetReplicationRow.propTypes = {
value: PropTypes.string.isRequired,
onChange: PropTypes.func.isRequired
};
const ReplicationTargetRow = ({
replicationTarget,
onLocalTargetChange,
onRemoteTargetChange,
localTarget,
remoteTarget,
databases
}) => {
if (!replicationTarget) {
return null;
}
let input;
if (replicationTarget === Constants.REPLICATION_TARGET.NEW_LOCAL_DATABASE) {
targetLabel = 'New database:';
input = <NewLocalTargetReplicationRow
value={localTarget}
onChange={onLocalTargetChange}
/>;
} else if (replicationTarget === Constants.REPLICATION_TARGET.EXISTING_LOCAL_DATABASE) {
input = <ExistingLocalTargetReplicationRow
onChange={onLocalTargetChange}
databases={databases}
value={localTarget}
/>;
} else {
input = <RemoteTargetReplicationRow
onChange={onRemoteTargetChange}
value={remoteTarget}
newRemote={Constants.REPLICATION_TARGET.NEW_REMOTE_DATABASE === replicationTarget}
/>;
}
let targetLabel = 'Name:';
if (replicationTarget === Constants.REPLICATION_TARGET.NEW_REMOTE_DATABASE ||
replicationTarget === Constants.REPLICATION_TARGET.NEW_LOCAL_DATABASE) {
targetLabel = 'New database:';
}
return (
<div className="row mt-2">
<div className="col-12 col-md-2">{targetLabel}</div>
<div className="col-12 col-md mt-1 mt-md-0">
{input}
</div>
</div>
);
};
ReplicationTargetRow.propTypes = {
databases: PropTypes.array.isRequired,
onLocalTargetChange: PropTypes.func.isRequired,
onRemoteTargetChange: PropTypes.func.isRequired,
remoteTarget: PropTypes.string.isRequired,
localTarget: PropTypes.string.isRequired,
replicationTarget: PropTypes.string.isRequired
};
const NewTargetDatabaseOptionsRow = ({
replicationTarget,
targetDatabasePartitioned,
onTargetDatabasePartitionedChange,
allowNewPartitionedLocalDbs
}) => {
if (!replicationTarget) {
return null;
}
if (replicationTarget !== Constants.REPLICATION_TARGET.NEW_LOCAL_DATABASE &&
replicationTarget !== Constants.REPLICATION_TARGET.NEW_REMOTE_DATABASE) {
return null;
}
const disablePartitionedOption = replicationTarget === Constants.REPLICATION_TARGET.NEW_LOCAL_DATABASE &&
!allowNewPartitionedLocalDbs;
let msg = disablePartitionedOption ? "Local server does not support partitioned databases" :
"Creates a new partitioned database";
const tooltip = <Tooltip id="new-db-partitioned-tooltip">{msg}</Tooltip>;
const togglePartitioned = () => {
onTargetDatabasePartitionedChange(!targetDatabasePartitioned);
};
return (
<React.Fragment>
<div className="row mt-2">
<div className="col-12 col-md-2">New database options:</div>
<div className="col-12 col-md mt-1 mt-md-0">
<Form.Check disabled>
<Form.Check.Input
id="target-db-is-partitioned"
type="checkbox"
value="true"
checked={targetDatabasePartitioned}
onChange={togglePartitioned}
disabled={disablePartitionedOption}
/>
<OverlayTrigger placement="right" overlay={tooltip}>
<Form.Check.Label className="ms-2">
Partitioned
</Form.Check.Label>
</OverlayTrigger>
</Form.Check>
</div>
</div>
</React.Fragment>
);
};
NewTargetDatabaseOptionsRow.propTypes = {
onTargetDatabasePartitionedChange: PropTypes.func.isRequired,
targetDatabasePartitioned: PropTypes.bool.isRequired,
replicationTarget: PropTypes.string.isRequired,
allowNewPartitionedLocalDbs: PropTypes.bool.isRequired
};
export class ReplicationTarget extends React.Component {
render() {
const {
replicationTarget,
onLocalTargetChange,
onTargetChange,
databases,
localTarget,
onRemoteTargetChange,
remoteTarget,
targetDatabasePartitioned,
onTargetDatabasePartitionedChange,
allowNewPartitionedLocalDbs
} = this.props;
return (
<React.Fragment>
<ReplicationTargetSelect
value={replicationTarget}
onChange={onTargetChange}
/>
<ReplicationTargetRow
remoteTarget={remoteTarget}
replicationTarget={replicationTarget}
databases={databases}
localTarget={localTarget}
onRemoteTargetChange={onRemoteTargetChange}
onLocalTargetChange={onLocalTargetChange}
/>
<NewTargetDatabaseOptionsRow
replicationTarget={replicationTarget}
onTargetDatabasePartitionedChange={onTargetDatabasePartitionedChange}
targetDatabasePartitioned={targetDatabasePartitioned}
allowNewPartitionedLocalDbs={allowNewPartitionedLocalDbs}
/>
</React.Fragment>
);
}
}
ReplicationTarget.propTypes = {
databases: PropTypes.array.isRequired,
onTargetChange: PropTypes.func.isRequired,
onLocalTargetChange: PropTypes.func.isRequired,
onRemoteTargetChange: PropTypes.func.isRequired,
remoteTarget: PropTypes.string.isRequired,
localTarget: PropTypes.string.isRequired,
replicationTarget: PropTypes.string.isRequired
};