From 0ae00932e94429d25995114e2ba9a82f71377d79 Mon Sep 17 00:00:00 2001
From: ArtemBaskal <a.baskal@adguard.com>
Date: Mon, 5 Oct 2020 14:53:20 +0300
Subject: [PATCH] + client: 2154 Make renderCheckboxField a controlled input

---
 client/src/components/Filters/Form.js         | 21 ++++++++++++++---
 .../src/components/Settings/Clients/Form.js   |  4 ++--
 .../components/Settings/Dns/Config/Form.js    |  4 ++--
 .../components/Settings/Encryption/Form.js    |  6 ++---
 .../components/Settings/FiltersConfig/Form.js |  4 ++--
 .../components/Settings/LogsConfig/Form.js    |  6 ++---
 client/src/helpers/form.js                    | 23 +++++++------------
 7 files changed, 38 insertions(+), 30 deletions(-)

diff --git a/client/src/components/Filters/Form.js b/client/src/components/Filters/Form.js
index 9b2787d2..39791a5f 100644
--- a/client/src/components/Filters/Form.js
+++ b/client/src/components/Filters/Form.js
@@ -5,7 +5,7 @@ import { withTranslation } from 'react-i18next';
 import flow from 'lodash/flow';
 import classNames from 'classnames';
 import { validatePath, validateRequiredValue } from '../../helpers/validators';
-import { renderCheckboxField, renderInputField } from '../../helpers/form';
+import { CheckboxField, renderInputField } from '../../helpers/form';
 import { MODAL_OPEN_TIMEOUT, MODAL_TYPE, FORM_NAME } from '../../helpers/constants';
 
 const filtersCatalog = require('../../helpers/filters/filters.json');
@@ -34,6 +34,22 @@ const renderIcons = (iconsData) => iconsData.map(({
     </svg>
 </a>);
 
+const renderCheckboxField = (
+    props,
+) => <CheckboxField
+        {...props}
+        input={{
+            ...props.input,
+            checked: props.disabled || props.input.checked,
+        }}
+/>;
+
+renderCheckboxField.propTypes = {
+    // https://redux-form.com/8.3.0/docs/api/field.md/#props
+    input: PropTypes.object.isRequired,
+    disabled: PropTypes.bool.isRequired,
+};
+
 const renderFilters = ({ categories, filters }, selectedSources, t) => Object.keys(categories)
     .map((categoryId) => {
         const category = categories[categoryId];
@@ -60,12 +76,11 @@ const renderFilters = ({ categories, filters }, selectedSources, t) => Object.ke
 
                 return <div key={name} className="d-flex align-items-center pb-1">
                     <Field
-                        name={`${filter.id}`}
+                        name={filter.id}
                         type="checkbox"
                         component={renderCheckboxField}
                         placeholder={t(name)}
                         disabled={isSelected}
-                        checked={isSelected}
                     />
                     {renderIcons(iconsData)}
                 </div>;
diff --git a/client/src/components/Settings/Clients/Form.js b/client/src/components/Settings/Clients/Form.js
index 2142b1a5..28f8a59c 100644
--- a/client/src/components/Settings/Clients/Form.js
+++ b/client/src/components/Settings/Clients/Form.js
@@ -15,7 +15,7 @@ import { toggleAllServices } from '../../../helpers/helpers';
 import {
     renderInputField,
     renderGroupField,
-    renderCheckboxField,
+    CheckboxField,
     renderServiceField,
 } from '../../../helpers/form';
 import { validateClientId, validateRequiredValue } from '../../../helpers/validators';
@@ -151,7 +151,7 @@ let Form = (props) => {
                         <Field
                             name={setting.name}
                             type="checkbox"
-                            component={renderCheckboxField}
+                            component={CheckboxField}
                             placeholder={t(setting.placeholder)}
                             disabled={
                                 setting.name !== 'use_global_settings'
diff --git a/client/src/components/Settings/Dns/Config/Form.js b/client/src/components/Settings/Dns/Config/Form.js
index ecdd2439..a2dd2bf9 100644
--- a/client/src/components/Settings/Dns/Config/Form.js
+++ b/client/src/components/Settings/Dns/Config/Form.js
@@ -6,7 +6,7 @@ import { Trans, useTranslation } from 'react-i18next';
 import {
     renderInputField,
     renderRadioField,
-    renderCheckboxField,
+    CheckboxField,
     toNumber,
 } from '../../../../helpers/form';
 import {
@@ -97,7 +97,7 @@ const Form = ({
                     <Field
                         name={name}
                         type="checkbox"
-                        component={renderCheckboxField}
+                        component={CheckboxField}
                         placeholder={t(placeholder)}
                         disabled={processing}
                         subtitle={t(subtitle)}
diff --git a/client/src/components/Settings/Encryption/Form.js b/client/src/components/Settings/Encryption/Form.js
index 15f8a3c6..8d69f665 100644
--- a/client/src/components/Settings/Encryption/Form.js
+++ b/client/src/components/Settings/Encryption/Form.js
@@ -7,7 +7,7 @@ import flow from 'lodash/flow';
 
 import {
     renderInputField,
-    renderCheckboxField,
+    CheckboxField,
     renderRadioField,
     toNumber,
 } from '../../../helpers/form';
@@ -101,7 +101,7 @@ let Form = (props) => {
                         <Field
                             name="enabled"
                             type="checkbox"
-                            component={renderCheckboxField}
+                            component={CheckboxField}
                             placeholder={t('encryption_enable')}
                             onChange={handleChange}
                         />
@@ -138,7 +138,7 @@ let Form = (props) => {
                         <Field
                             name="force_https"
                             type="checkbox"
-                            component={renderCheckboxField}
+                            component={CheckboxField}
                             placeholder={t('encryption_redirect')}
                             onChange={handleChange}
                             disabled={!isEnabled}
diff --git a/client/src/components/Settings/FiltersConfig/Form.js b/client/src/components/Settings/FiltersConfig/Form.js
index daa5ce25..366d1d84 100644
--- a/client/src/components/Settings/FiltersConfig/Form.js
+++ b/client/src/components/Settings/FiltersConfig/Form.js
@@ -4,7 +4,7 @@ import { Field, reduxForm } from 'redux-form';
 import { Trans, withTranslation } from 'react-i18next';
 import flow from 'lodash/flow';
 
-import { renderCheckboxField, toNumber } from '../../../helpers/form';
+import { CheckboxField, toNumber } from '../../../helpers/form';
 import { FILTERS_INTERVALS_HOURS, FORM_NAME } from '../../../helpers/constants';
 
 const getTitleForInterval = (interval, t) => {
@@ -49,7 +49,7 @@ const Form = (props) => {
                             name="enabled"
                             type="checkbox"
                             modifier="checkbox--settings"
-                            component={renderCheckboxField}
+                            component={CheckboxField}
                             placeholder={t('block_domain_use_filters_and_hosts')}
                             subtitle={t('filters_block_toggle_hint')}
                             onChange={handleChange}
diff --git a/client/src/components/Settings/LogsConfig/Form.js b/client/src/components/Settings/LogsConfig/Form.js
index aa3b61b3..9a1e3ec2 100644
--- a/client/src/components/Settings/LogsConfig/Form.js
+++ b/client/src/components/Settings/LogsConfig/Form.js
@@ -4,7 +4,7 @@ import { Field, reduxForm } from 'redux-form';
 import { Trans, withTranslation } from 'react-i18next';
 import flow from 'lodash/flow';
 
-import { renderCheckboxField, renderRadioField, toNumber } from '../../../helpers/form';
+import { CheckboxField, renderRadioField, toNumber } from '../../../helpers/form';
 import { FORM_NAME, QUERY_LOG_INTERVALS_DAYS } from '../../../helpers/constants';
 
 const getIntervalFields = (processing, t, toNumber) => QUERY_LOG_INTERVALS_DAYS.map((interval) => {
@@ -35,7 +35,7 @@ const Form = (props) => {
                 <Field
                     name="enabled"
                     type="checkbox"
-                    component={renderCheckboxField}
+                    component={CheckboxField}
                     placeholder={t('query_log_enable')}
                     disabled={processing}
                 />
@@ -44,7 +44,7 @@ const Form = (props) => {
                 <Field
                     name="anonymize_client_ip"
                     type="checkbox"
-                    component={renderCheckboxField}
+                    component={CheckboxField}
                     placeholder={t('anonymize_client_ip')}
                     subtitle={t('anonymize_client_ip_desc')}
                     disabled={processing}
diff --git a/client/src/helpers/form.js b/client/src/helpers/form.js
index 3b6801a0..85934a5e 100644
--- a/client/src/helpers/form.js
+++ b/client/src/helpers/form.js
@@ -157,31 +157,24 @@ renderRadioField.propTypes = {
     }).isRequired,
 };
 
-export const renderCheckboxField = ({
+export const CheckboxField = ({
     input,
     placeholder,
     subtitle,
     disabled,
     onClick,
     modifier = 'checkbox--form',
-    checked,
     meta: { touched, error },
 }) => <>
     <label className={`checkbox ${modifier}`} onClick={onClick}>
         <span className="checkbox__marker" />
-        <input {...input} type="checkbox" className="checkbox__input" disabled={disabled}
-               checked={input.checked || checked} />
+        <input {...input} type="checkbox" className="checkbox__input" disabled={disabled} />
         <span className="checkbox__label">
-                        <span className="checkbox__label-text checkbox__label-text--long">
-                            <span className="checkbox__label-title">{placeholder}</span>
-                            {subtitle
-                            && <span
-                                className="checkbox__label-subtitle"
-                                dangerouslySetInnerHTML={{ __html: subtitle }}
-
-                            />}
-                        </span>
-                    </span>
+            <span className="checkbox__label-text checkbox__label-text--long">
+                <span className="checkbox__label-title">{placeholder}</span>
+                {subtitle && <span className="checkbox__label-subtitle">{subtitle}</span>}
+            </span>
+        </span>
     </label>
     {!disabled
     && touched
@@ -189,7 +182,7 @@ export const renderCheckboxField = ({
     && <span className="form__message form__message--error"><Trans>{error}</Trans></span>}
 </>;
 
-renderCheckboxField.propTypes = {
+CheckboxField.propTypes = {
     input: PropTypes.object.isRequired,
     placeholder: PropTypes.string,
     subtitle: PropTypes.string,