Files
SCM-Manager/scm-ui/ui-webapp/src/admin/containers/GlobalConfig.tsx

195 lines
4.5 KiB
TypeScript
Raw Normal View History

import React from 'react';
import { translate } from 'react-i18next';
import { Title, Loading, ErrorNotification } from '@scm-manager/ui-components';
2018-08-09 12:09:50 +02:00
import {
fetchConfig,
getFetchConfigFailure,
2018-08-13 16:35:43 +02:00
isFetchConfigPending,
getConfig,
modifyConfig,
isModifyConfigPending,
getConfigUpdatePermission,
2018-08-21 09:17:15 +02:00
getModifyConfigFailure,
modifyConfigReset,
} from '../modules/config';
import { connect } from 'react-redux';
import { Config, NamespaceStrategies } from '@scm-manager/ui-types';
import ConfigForm from '../components/form/ConfigForm';
import { getConfigLink } from '../../modules/indexResource';
import {
fetchNamespaceStrategiesIfNeeded,
getFetchNamespaceStrategiesFailure,
getNamespaceStrategies,
isFetchNamespaceStrategiesPending,
} from '../modules/namespaceStrategies';
2018-08-09 10:18:12 +02:00
type Props = {
loading: boolean;
error: Error;
config: Config;
configUpdatePermission: boolean;
configLink: string;
namespaceStrategies?: NamespaceStrategies;
2018-08-30 09:46:03 +02:00
2018-08-13 16:35:43 +02:00
// dispatch functions
modifyConfig: (config: Config, callback?: () => void) => void;
fetchConfig: (link: string) => void;
configReset: (p: void) => void;
fetchNamespaceStrategiesIfNeeded: (p: void) => void;
2018-08-30 09:46:03 +02:00
// context objects
t: (p: string) => string;
2018-08-09 10:18:12 +02:00
};
type State = {
configReadPermission: boolean;
configChanged: boolean;
};
class GlobalConfig extends React.Component<Props, State> {
constructor(props: Props) {
super(props);
this.state = {
2019-03-04 16:47:44 +01:00
configReadPermission: true,
configChanged: false,
};
}
2018-08-09 12:09:50 +02:00
componentDidMount() {
2018-08-21 09:17:15 +02:00
this.props.configReset();
this.props.fetchNamespaceStrategiesIfNeeded();
2019-03-04 16:47:44 +01:00
if (this.props.configLink) {
this.props.fetchConfig(this.props.configLink);
} else {
this.setState({
configReadPermission: false,
});
2019-03-04 16:47:44 +01:00
}
2018-08-09 12:09:50 +02:00
}
2018-08-13 16:35:43 +02:00
modifyConfig = (config: Config) => {
2018-08-30 10:10:41 +02:00
this.props.modifyConfig(config);
this.setState({
configChanged: true,
});
};
renderConfigChangedNotification = () => {
if (this.state.configChanged) {
return (
<div className="notification is-primary">
<button
className="delete"
onClick={() =>
this.setState({
configChanged: false,
})
}
/>
{this.props.t('config.form.submit-success-notification')}
</div>
);
}
return null;
2018-08-13 16:35:43 +02:00
};
2018-08-09 10:18:12 +02:00
render() {
const { t, loading } = this.props;
2018-08-09 12:09:50 +02:00
if (loading) {
return <Loading />;
}
2018-08-09 10:18:12 +02:00
2018-08-13 16:35:43 +02:00
return (
<div>
<Title title={t('config.title')} />
{this.renderError()}
{this.renderContent()}
2018-08-13 16:35:43 +02:00
</div>
);
2018-08-09 10:18:12 +02:00
}
renderError = () => {
const { error } = this.props;
if (error) {
return <ErrorNotification error={error} />;
}
return null;
};
renderContent = () => {
const {
error,
loading,
config,
configUpdatePermission,
namespaceStrategies,
} = this.props;
2019-03-04 16:47:44 +01:00
const { configReadPermission } = this.state;
if (!error) {
return (
<>
{this.renderConfigChangedNotification()}
<ConfigForm
submitForm={config => this.modifyConfig(config)}
config={config}
loading={loading}
namespaceStrategies={namespaceStrategies}
configUpdatePermission={configUpdatePermission}
2019-03-04 16:47:44 +01:00
configReadPermission={configReadPermission}
/>
</>
);
}
return null;
};
2018-08-09 10:18:12 +02:00
}
2018-08-09 12:09:50 +02:00
const mapDispatchToProps = dispatch => {
return {
2018-10-09 16:17:25 +02:00
fetchConfig: (link: string) => {
dispatch(fetchConfig(link));
2018-08-13 16:35:43 +02:00
},
modifyConfig: (config: Config, callback?: () => void) => {
dispatch(modifyConfig(config, callback));
2018-08-21 09:17:15 +02:00
},
configReset: () => {
dispatch(modifyConfigReset());
},
fetchNamespaceStrategiesIfNeeded: () => {
dispatch(fetchNamespaceStrategiesIfNeeded());
},
2018-08-09 12:09:50 +02:00
};
};
const mapStateToProps = state => {
const loading =
isFetchConfigPending(state) ||
isModifyConfigPending(state) ||
isFetchNamespaceStrategiesPending(state);
const error =
getFetchConfigFailure(state) ||
getModifyConfigFailure(state) ||
getFetchNamespaceStrategiesFailure(state);
2018-08-13 16:35:43 +02:00
const config = getConfig(state);
const configUpdatePermission = getConfigUpdatePermission(state);
2018-10-09 16:17:25 +02:00
const configLink = getConfigLink(state);
const namespaceStrategies = getNamespaceStrategies(state);
2018-08-09 12:09:50 +02:00
return {
loading,
2018-08-13 16:35:43 +02:00
error,
config,
2018-10-09 16:17:25 +02:00
configUpdatePermission,
configLink,
namespaceStrategies,
2018-08-09 12:09:50 +02:00
};
};
export default connect(
mapStateToProps,
mapDispatchToProps,
)(translate('config')(GlobalConfig));