Updates #3419.
Squashed commit of the following:
commit 370094c00d9c15b1336fbedb1e233bd4436c9898
Author: Dmitriy Seregin <d.seregin@adguard.com>
Date: Fri Sep 10 17:31:16 2021 +0300
added link to github issue
commit 407ba9b2db46b887a30ddb081bd37c56e56b0496
Merge: 426c8146 80548233
Author: Dmitriy Seregin <d.seregin@adguard.com>
Date: Fri Sep 10 17:29:52 2021 +0300
Merge branch 'master' into 3419-client-allowlist-collision
commit 426c8146cff5c112ebb25192af276c6601200528
Author: Dmitriy Seregin <d.seregin@adguard.com>
Date: Fri Sep 10 16:28:11 2021 +0300
fix en
commit d28c6022321828c6bdc55c3f9a4f655b26d146d2
Author: Dmitriy Seregin <d.seregin@adguard.com>
Date: Fri Sep 10 15:49:12 2021 +0300
added missing space
commit b374a09327968ca5343c1595d1ab8cf317c15ffe
Author: Dmitriy Seregin <d.seregin@adguard.com>
Date: Fri Sep 10 15:43:55 2021 +0300
fixes after review
commit 2be629d66e4703e2f5a85615bf1eaaa92e03c6fd
Author: Dmitriy Seregin <d.seregin@adguard.com>
Date: Thu Sep 9 14:17:19 2021 +0300
fixes
commit 5c2aa6201cc0ecf404d4057e354fbb0bdadcdd6d
Author: Dmitriy Seregin <d.seregin@adguard.com>
Date: Wed Sep 8 15:04:30 2021 +0300
return empty line to locale file
commit 3631c3772babbd595b1c3de4a7e91be6bac3e80f
Author: Dmitriy Seregin <d.seregin@adguard.com>
Date: Wed Sep 8 13:57:51 2021 +0300
all: fix collisions in access lists && expand block/unblock client
124 lines
3.6 KiB
JavaScript
124 lines
3.6 KiB
JavaScript
import React from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import { connect } from 'react-redux';
|
|
import { Field, reduxForm, formValueSelector } from 'redux-form';
|
|
import { Trans, withTranslation } from 'react-i18next';
|
|
import flow from 'lodash/flow';
|
|
import { renderTextareaField } from '../../../../helpers/form';
|
|
import {
|
|
trimMultilineString,
|
|
removeEmptyLines,
|
|
} from '../../../../helpers/helpers';
|
|
import { FORM_NAME } from '../../../../helpers/constants';
|
|
|
|
const fields = [
|
|
{
|
|
id: 'allowed_clients',
|
|
title: 'access_allowed_title',
|
|
subtitle: 'access_allowed_desc',
|
|
normalizeOnBlur: removeEmptyLines,
|
|
},
|
|
{
|
|
id: 'disallowed_clients',
|
|
title: 'access_disallowed_title',
|
|
subtitle: 'access_disallowed_desc',
|
|
normalizeOnBlur: trimMultilineString,
|
|
},
|
|
{
|
|
id: 'blocked_hosts',
|
|
title: 'access_blocked_title',
|
|
subtitle: 'access_blocked_desc',
|
|
normalizeOnBlur: removeEmptyLines,
|
|
},
|
|
];
|
|
|
|
let Form = (props) => {
|
|
const {
|
|
allowedClients, handleSubmit, submitting, invalid, processingSet,
|
|
} = props;
|
|
|
|
const renderField = ({
|
|
id, title, subtitle, disabled = false, processingSet, normalizeOnBlur,
|
|
}) => <div key={id} className="form__group mb-5">
|
|
<label className="form__label form__label--with-desc" htmlFor={id}>
|
|
<Trans>{title}</Trans>
|
|
{disabled && <>
|
|
<span> </span>
|
|
(<Trans>disabled</Trans>)
|
|
</>}
|
|
</label>
|
|
<div className="form__desc form__desc--top">
|
|
<Trans>{subtitle}</Trans>
|
|
</div>
|
|
<Field
|
|
id={id}
|
|
name={id}
|
|
component={renderTextareaField}
|
|
type="text"
|
|
className="form-control form-control--textarea font-monospace"
|
|
disabled={disabled || processingSet}
|
|
normalizeOnBlur={normalizeOnBlur}
|
|
/>
|
|
</div>;
|
|
|
|
renderField.propTypes = {
|
|
id: PropTypes.string,
|
|
title: PropTypes.string,
|
|
subtitle: PropTypes.string,
|
|
disabled: PropTypes.bool,
|
|
normalizeOnBlur: PropTypes.func,
|
|
};
|
|
|
|
return (
|
|
<form onSubmit={handleSubmit}>
|
|
{
|
|
fields.map((f) => {
|
|
const props = { ...f };
|
|
if (allowedClients && f.id === 'disallowed_clients') {
|
|
props.disabled = true;
|
|
}
|
|
return renderField(props);
|
|
})
|
|
}
|
|
<div className="card-actions">
|
|
<div className="btn-list">
|
|
<button
|
|
type="submit"
|
|
className="btn btn-success btn-standard"
|
|
disabled={submitting || invalid || processingSet}
|
|
>
|
|
<Trans>save_config</Trans>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</form>
|
|
);
|
|
};
|
|
|
|
Form.propTypes = {
|
|
handleSubmit: PropTypes.func.isRequired,
|
|
submitting: PropTypes.bool.isRequired,
|
|
invalid: PropTypes.bool.isRequired,
|
|
initialValues: PropTypes.object.isRequired,
|
|
processingSet: PropTypes.bool.isRequired,
|
|
t: PropTypes.func.isRequired,
|
|
textarea: PropTypes.bool,
|
|
allowedClients: PropTypes.string,
|
|
};
|
|
|
|
const selector = formValueSelector(FORM_NAME.ACCESS);
|
|
|
|
Form = connect((state) => {
|
|
const allowedClients = selector(state, 'allowed_clients');
|
|
return {
|
|
allowedClients,
|
|
};
|
|
})(Form);
|
|
|
|
export default flow([
|
|
withTranslation(),
|
|
reduxForm({
|
|
form: FORM_NAME.ACCESS,
|
|
}),
|
|
])(Form);
|