UNPKG

@attivio/suit

Version:

Attivio SUIT, the Search UI Toolkit, is a library for creating search clients for searching the Attivio platform.

327 lines (265 loc) 13.8 kB
'use strict'; exports.__esModule = true; exports.default = undefined; var _class, _temp; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); var _BarChartFacetContents = require('./BarChartFacetContents'); var _BarChartFacetContents2 = _interopRequireDefault(_BarChartFacetContents); var _Card = require('./Card'); var _Card2 = _interopRequireDefault(_Card); var _CollapsiblePanel = require('./CollapsiblePanel'); var _CollapsiblePanel2 = _interopRequireDefault(_CollapsiblePanel); var _DateFormat = require('../api/DateFormat'); var _DateFormat2 = _interopRequireDefault(_DateFormat); var _DateUtils = require('../util/DateUtils'); var _DateUtils2 = _interopRequireDefault(_DateUtils); var _FacetSearchBar = require('./FacetSearchBar'); var _FacetSearchBar2 = _interopRequireDefault(_FacetSearchBar); var _HierarchicalFacetContents = require('./HierarchicalFacetContents'); var _HierarchicalFacetContents2 = _interopRequireDefault(_HierarchicalFacetContents); var _ListWithBarsFacetContents = require('./ListWithBarsFacetContents'); var _ListWithBarsFacetContents2 = _interopRequireDefault(_ListWithBarsFacetContents); var _MapFacetContents = require('./MapFacetContents'); var _MapFacetContents2 = _interopRequireDefault(_MapFacetContents); var _MoreListFacetContents = require('./MoreListFacetContents'); var _MoreListFacetContents2 = _interopRequireDefault(_MoreListFacetContents); var _PieChartFacetContents = require('./PieChartFacetContents'); var _PieChartFacetContents2 = _interopRequireDefault(_PieChartFacetContents); var _SearchFacet = require('../api/SearchFacet'); var _SearchFacet2 = _interopRequireDefault(_SearchFacet); var _SearchFacetBucket = require('../api/SearchFacetBucket'); var _SearchFacetBucket2 = _interopRequireDefault(_SearchFacetBucket); var _SentimentFacetContents = require('./SentimentFacetContents'); var _SentimentFacetContents2 = _interopRequireDefault(_SentimentFacetContents); var _SentimentTagCloudFacetContents = require('./SentimentTagCloudFacetContents'); var _SentimentTagCloudFacetContents2 = _interopRequireDefault(_SentimentTagCloudFacetContents); var _TagCloudFacetContents = require('./TagCloudFacetContents'); var _TagCloudFacetContents2 = _interopRequireDefault(_TagCloudFacetContents); var _TimeSeriesFacetContents = require('./TimeSeriesFacetContents'); var _TimeSeriesFacetContents2 = _interopRequireDefault(_TimeSeriesFacetContents); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** * Display a single facet from the search results. */ var Facet = (_temp = _class = function (_React$Component) { _inherits(Facet, _React$Component); Facet.isHierarchical = function isHierarchical(facet) { if (facet && facet.buckets) { // Look for a bucket that has child buckets var parentBucket = facet.buckets.find(function (bucket) { return bucket.children && bucket.children.length > 0; }); return !!parentBucket; } return false; }; function Facet(props) { _classCallCheck(this, Facet); var _this = _possibleConstructorReturn(this, _React$Component.call(this, props)); _this.addFacetFilter = _this.addFacetFilter.bind(_this); _this.addTimeSeriesFilter = _this.addTimeSeriesFilter.bind(_this); return _this; } Facet.prototype.addFacetFilter = function addFacetFilter(bucket, customBucketLabel) { var bucketLabel = void 0; if (this.props.positiveKeyphrases || this.props.negativeKeyphrases) { bucketLabel = customBucketLabel || bucket.value.displayLabel(); if (bucket.sentiment === 'positive' && this.props.positiveKeyphrases) { this.context.searcher.addFacetFilter(this.props.positiveKeyphrases.findLabel(), bucketLabel, bucket.value.filter); } else if (bucket.sentiment === 'negative' && this.props.negativeKeyphrases) { this.context.searcher.addFacetFilter(this.props.negativeKeyphrases.findLabel(), bucketLabel, bucket.value.filter); } } else if (this.props.facet) { bucketLabel = customBucketLabel || bucket.displayLabel(); this.context.searcher.addFacetFilter(this.props.facet.findLabel(), bucketLabel, bucket.filter); } }; /** * Create a facet filter for the starting and ending dates... * If start is set but end is not, filters on the specific time * set by start, otherwises filters on the range. (If start is not * set, this simply returns). */ Facet.prototype.addTimeSeriesFilter = function addTimeSeriesFilter(start, end) { var _this2 = this; if (start !== null) { var facetFilterString = void 0; var labelString = void 0; var startFacetFilterString = _DateUtils2.default.formatDate(start, _DateFormat2.default.ATTIVIO); var startLabelString = _DateUtils2.default.formatDate(start, _DateFormat2.default.MEDIUM); if (end !== null) { var endFacetFilterString = _DateUtils2.default.formatDate(end, _DateFormat2.default.ATTIVIO); var endLabelString = _DateUtils2.default.formatDate(end, _DateFormat2.default.MEDIUM); labelString = startLabelString + ' to ' + endLabelString; facetFilterString = this.props.facet.name + ':FACET(RANGE("' + startFacetFilterString + '", "' + endFacetFilterString + '", upper=inclusive))'; // eslint-disable-line max-len } else { labelString = startLabelString; facetFilterString = this.props.facet.name + ':FACET(RANGE("' + startFacetFilterString + '", ' + startFacetFilterString + ', upper=inclusive))'; // eslint-disable-line max-len } // If a timeseries filter for this facet is already applied, // remove it using removeFacetFilter() and repeatSearch = false. // And then add the new timeseries filter using addFacetFilter(). // So, the search will not be repeated when the facet is removed, // but only when the new filter is added. // This would also ensure, signal for both removing and adding the filter is created. // Also, add the new filter only if the same filter is not already applied. var existingFilters = this.context.searcher.state.facetFilters; var label = this.props.facet ? this.props.facet.findLabel() : ''; var sameFilterAlreadyExists = false; existingFilters.forEach(function (existingFilter) { if (existingFilter.facetName === label) { if (existingFilter.filter === facetFilterString) { sameFilterAlreadyExists = true; return; } _this2.context.searcher.removeFacetFilter(existingFilter, false); } }); if (!sameFilterAlreadyExists) { this.context.searcher.addFacetFilter(label, labelString, facetFilterString); } } }; Facet.prototype.render = function render() { var facetColors = this.props.entityColors; var facetColor = void 0; if (this.props.facet) { facetColor = facetColors.has(this.props.facet.field) ? facetColors.get(this.props.facet.field) : null; } var facetContents = void 0; if (this.props.type === 'sentimenttagcloud' && this.props.positiveKeyphrases && this.props.negativeKeyphrases) { if (this.props.positiveKeyphrases.buckets && this.props.negativeKeyphrases.buckets) { if (this.props.positiveKeyphrases.buckets.length > 0 || this.props.negativeKeyphrases.buckets.length > 0) { facetContents = _react2.default.createElement(_SentimentTagCloudFacetContents2.default, { positiveBuckets: this.props.positiveKeyphrases.buckets, negativeBuckets: this.props.negativeKeyphrases.buckets, maxBuckets: this.props.maxBuckets, addFacetFilter: this.addFacetFilter }); } } } if (this.props.facet && this.props.facet.buckets && this.props.facet.buckets.length > 0) { if (Facet.isHierarchical(this.props.facet)) { // Hierarchical facets are a special case... ignore the type facetContents = _react2.default.createElement(_HierarchicalFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter }); } else { switch (this.props.type) { case 'barchart': facetContents = facetColor ? _react2.default.createElement(_BarChartFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter, color: facetColor }) : _react2.default.createElement(_BarChartFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter }); break; case 'columnchart': facetContents = facetColor ? _react2.default.createElement(_BarChartFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter, columns: true, color: facetColor }) : _react2.default.createElement(_BarChartFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter, columns: true }); break; case 'piechart': facetContents = _react2.default.createElement(_PieChartFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter, entityColors: this.props.entityColors }); break; case 'barlist': facetContents = facetColor ? _react2.default.createElement(_ListWithBarsFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter, color: facetColor }) : _react2.default.createElement(_ListWithBarsFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter }); break; case 'tagcloud': facetContents = _react2.default.createElement(_TagCloudFacetContents2.default, { buckets: this.props.facet.buckets, maxBuckets: this.props.maxBuckets, addFacetFilter: this.addFacetFilter }); break; case 'timeseries': facetContents = _react2.default.createElement(_TimeSeriesFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addTimeSeriesFilter }); break; case 'sentiment': facetContents = _react2.default.createElement(_SentimentFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter }); break; case 'geomap': facetContents = _react2.default.createElement(_MapFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter }); break; case 'list': default: { facetContents = _react2.default.createElement( _FacetSearchBar2.default, { name: this.props.facet.field, label: this.props.facet.label, addFacetFilter: this.addFacetFilter }, _react2.default.createElement(_MoreListFacetContents2.default, { buckets: this.props.facet.buckets, addFacetFilter: this.addFacetFilter }) ); break; } } } } else if (!this.props.positiveKeyphrases && !this.props.negativeKeyphrases) { facetContents = _react2.default.createElement( 'span', { className: 'none' }, 'No values for this facet.' ); } // Prefer the display name but fall back to the name field var label = this.props.facet ? this.props.facet.findLabel() : ''; if (this.props.facet && this.props.collapse) { var collapsed = this.props.facet.buckets.length === 0; return _react2.default.createElement( _CollapsiblePanel2.default, { title: label, id: 'facet-' + this.props.facet.field, collapsed: collapsed }, facetContents ); } return _react2.default.createElement( _Card2.default, { title: label, borderless: !this.props.bordered, className: 'attivio-facet' }, facetContents ); }; return Facet; }(_react2.default.Component), _class.defaultProps = { type: 'list', maxBuckets: 15, collapse: false, bordered: false, entityColors: new Map() }, _class.contextTypes = { searcher: _propTypes2.default.any }, _class.displayName = 'Facet', _temp); exports.default = Facet; module.exports = exports['default'];