From 756f97ede1ba53c52eddb02e6020ede1b896cebd Mon Sep 17 00:00:00 2001 From: Artem Baskal Date: Tue, 22 Sep 2020 15:04:17 +0300 Subject: [PATCH] + upstream: Allow entering comments to the Upstreams box Close #2083 Squashed commit of the following: commit 113ad3c4ae2ca184b3945dcaa357b57303ee5fd6 Merge: 4ca1f005 bf23aa4d Author: ArtemBaskal Date: Tue Sep 22 14:41:30 2020 +0300 Merge branch 'master' into feature/2083 commit 4ca1f0056708eb23bb751587a0ec284508f35edf Author: ArtemBaskal Date: Tue Sep 22 13:14:31 2020 +0300 Simplify filterOutComments, use assert in tests commit bba03568aa979300e0534a2bd2f03086e25b3f87 Author: ArtemBaskal Date: Tue Sep 22 12:05:00 2020 +0300 Add ValidateUpstreams test cases commit 181de508cf266e3a47058f2b7e1b4b4accbab827 Author: ArtemBaskal Date: Tue Sep 22 11:47:03 2020 +0300 Refactor testUpstream commit 19c189cf7b64f4d252428dec5a608595c8e4cbc7 Author: ArtemBaskal Date: Tue Sep 22 10:38:37 2020 +0300 Move functions to utils commit 003937e90e0ff02e696d45c21045a27a49cd0202 Author: ArtemBaskal Date: Mon Sep 21 19:00:49 2020 +0300 Review changes commit b26bf64d8cef0266f33bce51c5bad324c74bb6da Author: ArtemBaskal Date: Mon Sep 21 17:58:01 2020 +0300 + upstream: Filter out the upstream comments commit 920975d2ba14fade07282cdb5c72a699c8083463 Author: ArtemBaskal Date: Mon Sep 21 17:51:00 2020 +0300 Trim upstreams, extract comment token commit a9958eb305ed9af10de68ef3bffe63f216805efe Author: ArtemBaskal Date: Mon Sep 21 10:34:11 2020 +0300 Fix markup styles commit 6efa41d944c7b09454a4011d2c9ea52b5ce91bbf Author: ArtemBaskal Date: Fri Sep 18 17:59:57 2020 +0300 Fix upstream form positioning commit 6eb12158d0bca49d4b41eb65a3ebed44eafbe486 Author: ArtemBaskal Date: Fri Sep 18 17:16:49 2020 +0300 Update example_upstream_comment locale commit aa9317b0243f5d30f0fcb9cbfcdf502547a8e954 Author: ArtemBaskal Date: Fri Sep 18 13:28:30 2020 +0300 Highlight comments in custom rules form, extract highlight logic commit dc55245d3db9edbde60fda0a0e50e1e045e71403 Author: ArtemBaskal Date: Thu Sep 17 22:48:29 2020 +0300 + client: Allow entering comments to the Upstreams box --- client/src/__locales/en.json | 3 +- client/src/actions/index.js | 33 +++- client/src/components/Filters/CustomRules.js | 35 +++- .../Settings/Dns/Upstream/Examples.js | 23 +-- .../components/Settings/Dns/Upstream/Form.js | 166 ++++++++++++------ .../ui/texareaCommentsHighlight.css | 52 ++++++ client/src/helpers/constants.js | 3 + client/src/helpers/form.js | 4 +- client/src/helpers/helpers.js | 14 ++ .../src/helpers/highlightTextareaComments.js | 26 +++ dnsforward/config.go | 1 + dnsforward/dnsforward_http.go | 24 ++- dnsforward/dnsforward_test.go | 26 +-- dnsforward/util.go | 15 ++ home/clients.go | 8 +- 15 files changed, 328 insertions(+), 105 deletions(-) create mode 100644 client/src/components/ui/texareaCommentsHighlight.css create mode 100644 client/src/helpers/highlightTextareaComments.js diff --git a/client/src/__locales/en.json b/client/src/__locales/en.json index 550d887e..340c5bcb 100644 --- a/client/src/__locales/en.json +++ b/client/src/__locales/en.json @@ -1,6 +1,7 @@ { "client_settings": "Client settings", "example_upstream_reserved": "You can specify DNS upstream <0>for the specific domain(s)", + "example_upstream_comment": "You can specify the comment", "upstream_parallel": "Use parallel requests to speed up resolving by simultaneously querying all upstream servers", "parallel_requests": "Parallel requests", "load_balancing": "Load-balancing", @@ -581,4 +582,4 @@ "port_53_faq_link": "Port 53 is often occupied by \"DNSStubListener\" or \"systemd-resolved\" services. Please read <0>this instruction on how to resolve this.", "adg_will_drop_dns_queries": "AdGuard Home will be dropping all DNS queries from this client.", "experimental": "Experimental" -} \ No newline at end of file +} diff --git a/client/src/actions/index.js b/client/src/actions/index.js index d39975ea..efd432fd 100644 --- a/client/src/actions/index.js +++ b/client/src/actions/index.js @@ -5,9 +5,15 @@ import axios from 'axios'; import endsWith from 'lodash/endsWith'; import escapeRegExp from 'lodash/escapeRegExp'; import React from 'react'; -import { splitByNewLine, sortClients } from '../helpers/helpers'; +import { compose } from 'redux'; +import { splitByNewLine, sortClients, filterOutComments } from '../helpers/helpers'; import { - BLOCK_ACTIONS, CHECK_TIMEOUT, STATUS_RESPONSE, SETTINGS_NAMES, FORM_NAME, GETTING_STARTED_LINK, + BLOCK_ACTIONS, + CHECK_TIMEOUT, + STATUS_RESPONSE, + SETTINGS_NAMES, + FORM_NAME, + GETTING_STARTED_LINK, } from '../helpers/constants'; import { areEqualVersions } from '../helpers/version'; import { getTlsStatus } from './encryption'; @@ -289,14 +295,21 @@ export const testUpstreamRequest = createAction('TEST_UPSTREAM_REQUEST'); export const testUpstreamFailure = createAction('TEST_UPSTREAM_FAILURE'); export const testUpstreamSuccess = createAction('TEST_UPSTREAM_SUCCESS'); -export const testUpstream = (config) => async (dispatch) => { +export const testUpstream = ( + { bootstrap_dns, upstream_dns }, upstream_dns_file, +) => async (dispatch) => { dispatch(testUpstreamRequest()); try { - const values = { ...config }; - values.bootstrap_dns = splitByNewLine(values.bootstrap_dns); - values.upstream_dns = splitByNewLine(values.upstream_dns); + const removeComments = compose(filterOutComments, splitByNewLine); - const upstreamResponse = await apiClient.testUpstream(values); + const config = { + bootstrap_dns: splitByNewLine(bootstrap_dns), + ...(upstream_dns_file ? null : { + upstream_dns: removeComments(upstream_dns), + }), + }; + + const upstreamResponse = await apiClient.testUpstream(config); const testMessages = Object.keys(upstreamResponse) .map((key) => { const message = upstreamResponse[key]; @@ -317,6 +330,12 @@ export const testUpstream = (config) => async (dispatch) => { } }; +export const testUpstreamWithFormValues = () => async (dispatch, getState) => { + const { upstream_dns_file } = getState().dnsConfig; + const { bootstrap_dns, upstream_dns } = getState().form[FORM_NAME.UPSTREAM].values; + return dispatch(testUpstream({ bootstrap_dns, upstream_dns }, upstream_dns_file)); +}; + export const changeLanguageRequest = createAction('CHANGE_LANGUAGE_REQUEST'); export const changeLanguageFailure = createAction('CHANGE_LANGUAGE_FAILURE'); export const changeLanguageSuccess = createAction('CHANGE_LANGUAGE_SUCCESS'); diff --git a/client/src/components/Filters/CustomRules.js b/client/src/components/Filters/CustomRules.js index 6a423026..723add5c 100644 --- a/client/src/components/Filters/CustomRules.js +++ b/client/src/components/Filters/CustomRules.js @@ -1,13 +1,18 @@ -import React, { Component, Fragment } from 'react'; +import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { Trans, withTranslation } from 'react-i18next'; - +import classnames from 'classnames'; import Card from '../ui/Card'; import PageTitle from '../ui/PageTitle'; import Examples from './Examples'; import Check from './Check'; +import { getTextareaCommentsHighlight, syncScroll } from '../../helpers/highlightTextareaComments'; +import { COMMENT_LINE_DEFAULT_TOKEN, isFirefox } from '../../helpers/constants'; +import '../ui/texareaCommentsHighlight.css'; class CustomRules extends Component { + ref = React.createRef(); + componentDidMount() { this.props.getFilteringStatus(); } @@ -34,6 +39,8 @@ class CustomRules extends Component { this.props.checkHost(values); }; + onScroll = (e) => syncScroll(e, this.ref) + render() { const { t, @@ -47,17 +54,31 @@ class CustomRules extends Component { } = this.props; return ( - + <>
+