mirror of
https://github.com/fleetdm/fleet
synced 2026-05-18 06:28:40 +00:00
Fleet used significant resources storing the full network interface information for each host. This data was unused, except to get the IP and MAC of the primary interface. With these changes, only those pieces of data are stored. - Calculate and store primary IP and MAC - Remove transaction for storing full interfaces - Update targets search to use new IP and MAC columns - Update frontend to use new new columns
75 lines
2 KiB
JavaScript
75 lines
2 KiB
JavaScript
import React, { Component } from 'react';
|
|
import PropTypes from 'prop-types';
|
|
import classnames from 'classnames';
|
|
|
|
import Icon from 'components/icons/Icon';
|
|
import targetInterface from 'interfaces/target';
|
|
import TargetIcon from './TargetIcon';
|
|
|
|
const baseClass = 'target-option';
|
|
|
|
class TargetOption extends Component {
|
|
static propTypes = {
|
|
onMoreInfoClick: PropTypes.func,
|
|
onSelect: PropTypes.func,
|
|
target: targetInterface.isRequired,
|
|
};
|
|
|
|
handleSelect = (evt) => {
|
|
const { onSelect, target } = this.props;
|
|
|
|
return onSelect(target, evt);
|
|
}
|
|
|
|
renderTargetDetail = () => {
|
|
const { target } = this.props;
|
|
const {
|
|
count,
|
|
primary_ip: hostIpAddress,
|
|
target_type: targetType,
|
|
} = target;
|
|
|
|
if (targetType === 'hosts') {
|
|
if (!hostIpAddress) {
|
|
return false;
|
|
}
|
|
|
|
return (
|
|
<span>
|
|
<span className={`${baseClass}__delimeter`}>•</span>
|
|
<span className={`${baseClass}__ip`}>{hostIpAddress}</span>
|
|
</span>
|
|
);
|
|
}
|
|
|
|
return <span className={`${baseClass}__count`}>{count} hosts</span>;
|
|
}
|
|
|
|
render () {
|
|
const { onMoreInfoClick, target } = this.props;
|
|
const { display_text: displayText, target_type: targetType } = target;
|
|
const {
|
|
handleSelect,
|
|
renderTargetDetail,
|
|
} = this;
|
|
const wrapperClassName = classnames(`${baseClass}__wrapper`, {
|
|
'is-label': targetType === 'labels',
|
|
'is-host': targetType === 'hosts',
|
|
});
|
|
|
|
return (
|
|
<div className={wrapperClassName}>
|
|
<button className={`button button--unstyled ${baseClass}__target-content`} onClick={onMoreInfoClick(target)}>
|
|
<TargetIcon target={target} />
|
|
<span className={`${baseClass}__label-label`}>{displayText}</span>
|
|
{renderTargetDetail()}
|
|
</button>
|
|
<button className={`button button--unstyled ${baseClass}__add-btn`} onClick={handleSelect}>
|
|
<Icon name="add-button" />
|
|
</button>
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
export default TargetOption;
|