implemented global configuration for mercurial

This commit is contained in:
Sebastian Sdorra
2018-11-06 16:39:11 +01:00
parent f5f96042b3
commit 9c043145a2
4 changed files with 172 additions and 0 deletions

View File

@@ -0,0 +1,117 @@
//@flow
import React from "react";
import type { Links } from "@scm-manager/ui-types";
import { translate } from "react-i18next";
import { InputField, Checkbox } from "@scm-manager/ui-components";
type Configuration = {
"hgBinary": string,
"pythonBinary": string,
"pythonPath"?: string,
"repositoryDirectory": string,
"encoding": string,
"useOptimizedBytecode": boolean,
"showRevisionInId": boolean,
"disabled": boolean,
"_links": Links
};
type Props = {
initialConfiguration: Configuration,
readOnly: boolean,
onConfigurationChange: (Configuration, boolean) => void,
// context props
t: (string) => string
}
type State = Configuration & {
validationErrors: string[]
};
class HgConfigurationForm extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = { ...props.initialConfiguration, validationErrors: [] };
}
updateValidationStatus = () => {
const requiredFields = [
"hgBinary", "pythonBinary", "repositoryDirectory", "encoding"
];
const validationErrors = [];
for (let field of requiredFields) {
if (!this.state[field]) {
validationErrors.push( field );
}
}
this.setState({
validationErrors
});
};
isValid = () => {
return this.state.validationErrors.length === 0;
};
hasValidationError = (name: string) => {
return this.state.validationErrors.indexOf(name) >= 0;
};
handleChange = (value: any, name: string) => {
this.setState({
[name]: value
}, () => {
this.updateValidationStatus();
this.props.onConfigurationChange(this.state, this.isValid());
});
};
inputField = (name: string) => {
const { readOnly, t } = this.props;
return <InputField
name={ name }
label={t("scm-hg-plugin.config." + name)}
helpText={t("scm-hg-plugin.config." + name + "HelpText")}
value={this.state[name]}
onChange={this.handleChange}
validationError={this.hasValidationError(name)}
errorMessage={t("scm-hg-plugin.config.required")}
disabled={readOnly}
/>;
};
checkbox = (name: string) => {
const { readOnly, t } = this.props;
return <Checkbox
name={ name }
label={t("scm-hg-plugin.config." + name)}
helpText={t("scm-hg-plugin.config." + name + "HelpText")}
checked={this.state[name]}
onChange={this.handleChange}
disabled={readOnly}
/>;
};
render() {
return (
<>
{this.inputField("hgBinary")}
{this.inputField("pythonBinary")}
{this.inputField("pythonPath")}
{this.inputField("repositoryDirectory")}
{this.inputField("encoding")}
{this.checkbox("useOptimizedBytecode")}
{this.checkbox("showRevisionInId")}
{this.checkbox("disabled")}
</>
);
}
}
export default translate("plugins")(HgConfigurationForm);

View File

@@ -0,0 +1,28 @@
//@flow
import React from "react";
import { Title, GlobalConfiguration } from "@scm-manager/ui-components";
import { translate } from "react-i18next";
import HgConfigurationForm from "./HgConfigurationForm";
type Props = {
link: string,
// context props
t: (string) => string
}
class HgGlobalConfiguration extends React.Component<Props> {
render() {
const { link, t } = this.props;
return (
<div>
<Title title={t("scm-hg-plugin.config.title")}/>
<GlobalConfiguration link={link} render={props => <HgConfigurationForm {...props} />}/>
</div>
);
}
}
export default translate("plugins")(HgGlobalConfiguration);

View File

@@ -2,6 +2,8 @@
import { binder } from "@scm-manager/ui-extensions";
import ProtocolInformation from "./ProtocolInformation";
import HgAvatar from "./HgAvatar";
import { ConfigurationBinder as cfgBinder } from "@scm-manager/ui-components";
import HgGlobalConfiguration from "./HgGlobalConfiguration";
const hgPredicate = (props: Object) => {
return props.repository && props.repository.type === "hg";
@@ -9,3 +11,7 @@ const hgPredicate = (props: Object) => {
binder.bind("repos.repository-details.information", ProtocolInformation, hgPredicate);
binder.bind("repos.repository-avatar", HgAvatar, hgPredicate);
// bind global configuration
cfgBinder.bindGlobal("/hg", "scm-hg-plugin.config.link", "hgConfig", HgGlobalConfiguration);

View File

@@ -4,6 +4,27 @@
"clone" : "Clone the repository",
"create" : "Create a new repository",
"replace" : "Push an existing repository"
},
"config": {
"link": "Mercurial",
"title": "Mercurial Configuration",
"hgBinary": "HG Binary",
"hgBinaryHelpText": "Location of Mercurial binary.",
"pythonBinary": "Python Binary",
"pythonBinaryHelpText": "Location of Python binary.",
"pythonPath": "Python Module Search Path",
"pythonPathHelpText": "Python Module Search Path (PYTHONPATH).",
"repositoryDirectory": "Repository directory",
"repositoryDirectoryHelpText": "Location of Mercurial repositories.",
"encoding": "Encoding",
"encodingHelpText": "Repository Encoding.",
"useOptimizedBytecode": "Optimized Bytecode (.pyo)",
"useOptimizedBytecodeHelpText": "Use the Python '-O' switch.",
"showRevisionInId": "Show Revision",
"showRevisionInIdHelpText": "Show revision as part of the node id.",
"disabled": "Disabled",
"disabledHelpText": "Enable or disable the Mercurial plugin.",
"required": "This configuration value is required"
}
}
}