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: 42a54f2b21dfb5ffAuthor: 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: 265fec7cda546790Author: 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
125 lines
4.2 KiB
JavaScript
125 lines
4.2 KiB
JavaScript
import React from 'react';
|
|
import classNames from 'classnames';
|
|
import PropTypes from 'prop-types';
|
|
import getHintElement from './getHintElement';
|
|
import {
|
|
DEFAULT_SHORT_DATE_FORMAT_OPTIONS,
|
|
LONG_TIME_FORMAT,
|
|
SCHEME_TO_PROTOCOL_MAP,
|
|
} from '../../../helpers/constants';
|
|
import { captitalizeWords, formatDateTime, formatTime } from '../../../helpers/helpers';
|
|
import { getSourceData } from '../../../helpers/trackers/trackers';
|
|
|
|
const getDomainCell = (props) => {
|
|
const {
|
|
row, t, isDetailed, dnssec_enabled,
|
|
} = props;
|
|
|
|
const {
|
|
tracker, type, answer_dnssec, client_proto, domain, time,
|
|
} = row.original;
|
|
|
|
const hasTracker = !!tracker;
|
|
|
|
const lockIconClass = classNames('icons', 'icon--small', 'd-none', 'd-sm-block', 'cursor--pointer', {
|
|
'icon--active': answer_dnssec,
|
|
'icon--disabled': !answer_dnssec,
|
|
'my-3': isDetailed,
|
|
});
|
|
|
|
const privacyIconClass = classNames('icons', 'mx-2', 'icon--small', 'd-none', 'd-sm-block', 'cursor--pointer', {
|
|
'icon--active': hasTracker,
|
|
'icon--disabled': !hasTracker,
|
|
'my-3': isDetailed,
|
|
});
|
|
|
|
const dnssecHint = getHintElement({
|
|
className: lockIconClass,
|
|
tooltipClass: 'py-4 px-5 pb-45',
|
|
canShowTooltip: answer_dnssec,
|
|
xlinkHref: 'lock',
|
|
columnClass: 'w-100',
|
|
content: 'validated_with_dnssec',
|
|
placement: 'bottom',
|
|
});
|
|
|
|
const protocol = t(SCHEME_TO_PROTOCOL_MAP[client_proto]) || '';
|
|
const ip = type ? `${t('type_table_header')}: ${type}` : '';
|
|
|
|
const requestDetailsObj = {
|
|
time_table_header: formatTime(time, LONG_TIME_FORMAT),
|
|
date: formatDateTime(time, DEFAULT_SHORT_DATE_FORMAT_OPTIONS),
|
|
domain,
|
|
type_table_header: type,
|
|
protocol,
|
|
};
|
|
|
|
const sourceData = getSourceData(tracker);
|
|
|
|
const knownTrackerDataObj = {
|
|
name_table_header: tracker?.name,
|
|
category_label: hasTracker && captitalizeWords(tracker.category),
|
|
source_label: sourceData
|
|
&& <a href={sourceData.url} target="_blank" rel="noopener noreferrer"
|
|
className="link--green">{sourceData.name}</a>,
|
|
};
|
|
|
|
const renderGrid = (content, idx) => {
|
|
const preparedContent = typeof content === 'string' ? t(content) : content;
|
|
const className = classNames('text-truncate key-colon o-hidden', {
|
|
'overflow-break': preparedContent.length > 100,
|
|
});
|
|
return <div key={idx} className={className}>{preparedContent}</div>;
|
|
};
|
|
|
|
const getGrid = (contentObj, title, className) => [
|
|
<div key={title} className={classNames('pb-2 grid--title', className)}>{t(title)}</div>,
|
|
<div key={`${title}-1`}
|
|
className="grid grid--limited">{React.Children.map(Object.entries(contentObj), renderGrid)}</div>,
|
|
];
|
|
|
|
const requestDetails = getGrid(requestDetailsObj, 'request_details');
|
|
|
|
const renderContent = hasTracker ? requestDetails.concat(getGrid(knownTrackerDataObj, 'known_tracker', 'pt-4')) : requestDetails;
|
|
|
|
const trackerHint = getHintElement({
|
|
className: privacyIconClass,
|
|
tooltipClass: 'pt-4 pb-5 px-5 mw-75',
|
|
xlinkHref: 'privacy',
|
|
contentItemClass: 'key-colon',
|
|
renderContent,
|
|
place: 'bottom',
|
|
});
|
|
|
|
const valueClass = classNames('w-100', {
|
|
'px-2 d-flex justify-content-center flex-column': isDetailed,
|
|
});
|
|
|
|
const details = [ip, protocol].filter(Boolean)
|
|
.join(', ');
|
|
|
|
return (
|
|
<div className="logs__row o-hidden">
|
|
{dnssec_enabled && dnssecHint}
|
|
{trackerHint}
|
|
<div className={valueClass}>
|
|
<div className="text-truncate" title={domain}>{domain}</div>
|
|
{details && isDetailed
|
|
&& <div className="detailed-info d-none d-sm-block text-truncate"
|
|
title={details}>{details}</div>}
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
getDomainCell.propTypes = {
|
|
row: PropTypes.object.isRequired,
|
|
t: PropTypes.func.isRequired,
|
|
isDetailed: PropTypes.bool.isRequired,
|
|
toggleBlocking: PropTypes.func.isRequired,
|
|
autoClients: PropTypes.array.isRequired,
|
|
dnssec_enabled: PropTypes.bool.isRequired,
|
|
};
|
|
|
|
export default getDomainCell;
|