Close #1523 Squashed commit of the following: commit 9ae9b0e480c2ec6bd835faf4caccacd8c1fdfe9f Author: ArtemBaskal <a.baskal@adguard.com> Date: Fri Jul 3 17:56:34 2020 +0300 Setup babel and apply everywhere nullish coalescing and optional chaining operators commit 0966063842a79078e1d61a54c271e18c9427b2b1 Merge: 42a54f2b21dfb5ff
Author: ArtemBaskal <a.baskal@adguard.com> Date: Fri Jul 3 16:59:34 2020 +0300 Merge branch 'master' into fix/1523 commit 42a54f2ba0d8f5f4e4c04f16abc507b5d9009035 Author: ArtemBaskal <a.baskal@adguard.com> Date: Fri Jul 3 13:30:25 2020 +0300 Center mobile tooltip buttons commit 9cdd501a863b596f1d903f8dd3c449ffbe4c1604 Author: ArtemBaskal <a.baskal@adguard.com> Date: Fri Jul 3 13:21:37 2020 +0300 Add cross icon to clear input on click commit 1308b93c42ffea2ffb7457c34aef96e5cdaccaf2 Merge: 265fec7cda546790
Author: ArtemBaskal <a.baskal@adguard.com> Date: Mon Jun 29 19:42:04 2020 +0300 Merge branch 'master' of ssh://bit.adguard.com:7999/dns/adguard-home commit 265fec7c72656b0c4738623cb470f1c14736230a Author: ArtemBaskal <a.baskal@adguard.com> Date: Mon Jun 29 19:41:37 2020 +0300 - client: Clear input field when switching from logs page
137 lines
4.7 KiB
JavaScript
137 lines
4.7 KiB
JavaScript
import React from 'react';
|
|
import classNames from 'classnames';
|
|
import { formatElapsedMs } from '../../../helpers/helpers';
|
|
import {
|
|
CUSTOM_FILTERING_RULES_ID,
|
|
FILTERED_STATUS,
|
|
FILTERED_STATUS_TO_META_MAP,
|
|
} from '../../../helpers/constants';
|
|
import getHintElement from './getHintElement';
|
|
|
|
const getFilterName = (filters, whitelistFilters, filterId, t) => {
|
|
if (filterId === CUSTOM_FILTERING_RULES_ID) {
|
|
return t('custom_filter_rules');
|
|
}
|
|
|
|
const filter = filters.find((filter) => filter.id === filterId)
|
|
|| whitelistFilters.find((filter) => filter.id === filterId);
|
|
let filterName = '';
|
|
|
|
if (filter) {
|
|
filterName = filter.name;
|
|
}
|
|
|
|
if (!filterName) {
|
|
filterName = t('unknown_filter', { filterId });
|
|
}
|
|
|
|
return filterName;
|
|
};
|
|
|
|
const getResponseCell = (row, filtering, t, isDetailed) => {
|
|
const {
|
|
reason, filterId, rule, status, upstream, elapsedMs, domain, response,
|
|
} = row.original;
|
|
|
|
const { filters, whitelistFilters } = filtering;
|
|
const formattedElapsedMs = formatElapsedMs(elapsedMs, t);
|
|
|
|
const statusLabel = t(FILTERED_STATUS_TO_META_MAP[reason]?.label || reason);
|
|
const boldStatusLabel = <span className="font-weight-bold">{statusLabel}</span>;
|
|
const filter = getFilterName(filters, whitelistFilters, filterId, t);
|
|
|
|
const renderResponses = (responseArr) => {
|
|
if (responseArr.length === 0) {
|
|
return '';
|
|
}
|
|
|
|
return <div>{responseArr.map((response) => {
|
|
const className = classNames('white-space--nowrap', {
|
|
'overflow-break': response.length > 100,
|
|
});
|
|
|
|
return <div key={response} className={className}>{`${response}\n`}</div>;
|
|
})}</div>;
|
|
};
|
|
|
|
const FILTERED_STATUS_TO_FIELDS_MAP = {
|
|
[FILTERED_STATUS.NOT_FILTERED_NOT_FOUND]: {
|
|
domain,
|
|
encryption_status: boldStatusLabel,
|
|
install_settings_dns: upstream,
|
|
elapsed: formattedElapsedMs,
|
|
response_code: status,
|
|
response_table_header: renderResponses(response),
|
|
},
|
|
[FILTERED_STATUS.FILTERED_BLOCKED_SERVICE]: {
|
|
domain,
|
|
encryption_status: boldStatusLabel,
|
|
install_settings_dns: upstream,
|
|
elapsed: formattedElapsedMs,
|
|
filter,
|
|
rule_label: rule,
|
|
response_code: status,
|
|
},
|
|
[FILTERED_STATUS.NOT_FILTERED_WHITE_LIST]: {
|
|
domain,
|
|
encryption_status: boldStatusLabel,
|
|
install_settings_dns: upstream,
|
|
elapsed: formattedElapsedMs,
|
|
filter,
|
|
rule_label: rule,
|
|
response_code: status,
|
|
},
|
|
[FILTERED_STATUS.NOT_FILTERED_WHITE_LIST]: {
|
|
domain,
|
|
encryption_status: boldStatusLabel,
|
|
filter,
|
|
rule_label: rule,
|
|
response_code: status,
|
|
},
|
|
[FILTERED_STATUS.FILTERED_SAFE_SEARCH]: {
|
|
domain,
|
|
encryption_status: boldStatusLabel,
|
|
install_settings_dns: upstream,
|
|
elapsed: formattedElapsedMs,
|
|
response_code: status,
|
|
},
|
|
[FILTERED_STATUS.FILTERED_BLACK_LIST]: {
|
|
domain,
|
|
encryption_status: boldStatusLabel,
|
|
install_settings_dns: upstream,
|
|
elapsed: formattedElapsedMs,
|
|
response_code: status,
|
|
},
|
|
};
|
|
|
|
const fields = FILTERED_STATUS_TO_FIELDS_MAP[reason]
|
|
? Object.entries(FILTERED_STATUS_TO_FIELDS_MAP[reason])
|
|
: Object.entries(FILTERED_STATUS_TO_FIELDS_MAP.NotFilteredNotFound);
|
|
|
|
const detailedInfo = reason === FILTERED_STATUS.FILTERED_BLOCKED_SERVICE
|
|
|| reason === FILTERED_STATUS.FILTERED_BLACK_LIST
|
|
? filter : formattedElapsedMs;
|
|
|
|
return (
|
|
<div className="logs__row">
|
|
{fields && getHintElement({
|
|
className: classNames('icons mr-4 icon--small cursor--pointer icon--light-gray', { 'my-3': isDetailed }),
|
|
columnClass: 'grid grid--limited',
|
|
tooltipClass: 'px-5 pb-5 pt-4 mw-75 custom-tooltip__response-details',
|
|
contentItemClass: 'text-truncate key-colon o-hidden',
|
|
xlinkHref: 'question',
|
|
title: 'response_details',
|
|
content: fields,
|
|
placement: 'bottom',
|
|
})}
|
|
<div className="text-truncate">
|
|
<div className="text-truncate" title={statusLabel}>{statusLabel}</div>
|
|
{isDetailed && <div
|
|
className="detailed-info d-none d-sm-block pt-1 text-truncate" title={detailedInfo}>{detailedInfo}</div>}
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default getResponseCell;
|