@attivio/suit
Version:
Attivio SUIT, the Search UI Toolkit, is a library for creating search clients for searching the Attivio platform.
333 lines (263 loc) • 11.4 kB
JavaScript
'use strict';
exports.__esModule = true;
var _class, _temp;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _Row = require('react-bootstrap/lib/Row');
var _Row2 = _interopRequireDefault(_Row);
var _Col = require('react-bootstrap/lib/Col');
var _Col2 = _interopRequireDefault(_Col);
var _SearchDocument = require('../api/SearchDocument');
var _SearchDocument2 = _interopRequireDefault(_SearchDocument);
var _FieldNames = require('../api/FieldNames');
var _FieldNames2 = _interopRequireDefault(_FieldNames);
var _Configurable = require('./Configurable');
var _Configurable2 = _interopRequireDefault(_Configurable);
var _Configuration = require('./Configuration');
var _Configuration2 = _interopRequireDefault(_Configuration);
var _DocumentEntityList = require('./DocumentEntityList');
var _DocumentEntityList2 = _interopRequireDefault(_DocumentEntityList);
var _DocumentThumbnail = require('./DocumentThumbnail');
var _DocumentThumbnail2 = _interopRequireDefault(_DocumentThumbnail);
var _DocumentType = require('./DocumentType');
var _DocumentType2 = _interopRequireDefault(_DocumentType);
var _RelevancyScore = require('./RelevancyScore');
var _RelevancyScore2 = _interopRequireDefault(_RelevancyScore);
var _SearchResultBody = require('./SearchResultBody');
var _SearchResultBody2 = _interopRequireDefault(_SearchResultBody);
var _SearchResultTags = require('./SearchResultTags');
var _SearchResultTags2 = _interopRequireDefault(_SearchResultTags);
var _SearchResultTitle = require('./SearchResultTitle');
var _SearchResultTitle2 = _interopRequireDefault(_SearchResultTitle);
var _Signals = require('../api/Signals');
var _Signals2 = _interopRequireDefault(_Signals);
var _StarRating = require('./StarRating');
var _StarRating2 = _interopRequireDefault(_StarRating);
var _TabPanel = require('./TabPanel');
var _TabPanel2 = _interopRequireDefault(_TabPanel);
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; }
/**
* An individual List-type search result.
*/
var InnerListSearchResult = (_temp = _class = function (_React$Component) {
_inherits(InnerListSearchResult, _React$Component);
/**
* Renders a <ListSearchResult> component for the document.
*/
InnerListSearchResult.renderer = function renderer(doc, position, baseUri, key) {
var hide360Link = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
return _react2.default.createElement(ListSearchResult, {
document: doc,
position: position,
baseUri: baseUri,
key: key,
hide360Link: hide360Link
});
}; // eslint-disable-line max-len
InnerListSearchResult.getFirstDocumentType = function getFirstDocumentType(list) {
var result = '';
if (list && list.length > 0) {
result = list[0].getFirstValue('table');
}
return result;
};
InnerListSearchResult.valueToDisplay = function valueToDisplay(value) {
if (typeof value === 'string') {
return value;
}
var json = JSON.stringify(value, null, 2);
if (json.startsWith('{')) {
return _react2.default.createElement(
'pre',
null,
json
);
}
return _react2.default.createElement(
'span',
null,
json
);
};
function InnerListSearchResult(props) {
_classCallCheck(this, InnerListSearchResult);
var _this = _possibleConstructorReturn(this, _React$Component.call(this, props));
_this.tabChanged = function (newTab) {
_this.setState({
currentTab: newTab
});
};
_this.rateDocument = function (doc, rating) {
if (doc.signal) {
new _Signals2.default(_this.props.baseUri).addSignal(doc, 'like', rating);
}
};
_this.state = {
currentTab: InnerListSearchResult.getFirstDocumentType(props.document.children)
};
return _this;
}
// FIXME: Avoid expensive operations in render method.
InnerListSearchResult.prototype.renderNestedDocs = function renderNestedDocs() {
var _props = this.props,
doc = _props.document,
baseUri = _props.baseUri;
if (doc.children && doc.children.length > 0) {
var childMap = new Map();
doc.children.forEach(function (child) {
var childTable = child.getFirstValue('table');
var tableDocs = childMap.get(childTable);
if (tableDocs) {
tableDocs.push(child);
} else {
var newTableDocs = [child];
childMap.set(childTable, newTableDocs);
}
});
var tabInfos = [];
childMap.forEach(function (tableDocs, tabTable) {
var label = tableDocs.length === 1 ? '1 ' + tabTable : tableDocs.length + ' ' + tabTable;
var docResults = tableDocs.map(function (tableDoc, index) {
var childPosition = index + 1;
return _react2.default.createElement(ListSearchResult, {
document: tableDoc,
key: tableDoc.getFirstValue('.id'),
position: childPosition,
baseUri: baseUri
});
});
var docResultsList = _react2.default.createElement(
'div',
{ className: 'attivio-nested-search-results' },
docResults
);
tabInfos.push(new _TabPanel.TabInfo(label, tabTable, docResultsList));
});
var tabLabel = doc.children.length === 1 ? 'One Child Record:' : doc.children.length + ' Child Records:';
return _react2.default.createElement(_TabPanel2.default, {
tabInfos: tabInfos,
activeTabId: this.state.currentTab,
tabChanged: this.tabChanged,
tabLabel: tabLabel,
nested: true
});
}
return null;
};
InnerListSearchResult.prototype.render = function render() {
var _this2 = this;
var _props2 = this.props,
baseUri = _props2.baseUri,
doc = _props2.document,
entityFields = _props2.entityFields,
position = _props2.position,
showRatings = _props2.showRatings,
showScores = _props2.showScores,
showTags = _props2.showTags,
hide360Link = _props2.hide360Link;
var _context$configuratio = this.context.configuration,
configuration = _context$configuratio === undefined ? null : _context$configuratio;
var docId = doc.getFirstValue('.id');
var table = doc.getFirstValue('table');
var thumbnailUri = doc.getFirstValue('thumbnailImageUri');
var previewUri = doc.getAllValues('previewImageUri');
var scoreString = doc.getFirstValue(_FieldNames2.default.SCORE);
var score = scoreString ? parseFloat(scoreString) : 0;
var scoreDescription = doc.getFirstValue(_FieldNames2.default.SCORE_EXPLAIN);
var text = doc.getFirstValue('teaser');
var moreLikeThisQuery = doc.getFirstValue('morelikethisquery');
var docTags = doc.getAllValues('tags');
var userDefinedEntityFieldsExist = configuration && configuration.state && configuration.state.ALL && configuration.state.ALL.entityFields;
var userEntityFields = userDefinedEntityFieldsExist ? configuration.state.ALL.entityFields : entityFields;
return _react2.default.createElement(
'div',
{ className: ' attivio-search-result' },
_react2.default.createElement(
'div',
{ className: 'attivio-search-result-col' },
_react2.default.createElement(_DocumentType2.default, { docType: table, position: position }),
_react2.default.createElement(_DocumentThumbnail2.default, {
uri: thumbnailUri,
previewUris: previewUri,
previewTitle: doc.getFirstValue(_FieldNames2.default.TITLE)
}),
_react2.default.createElement(
'dl',
{ className: 'attivio-labeldata-stacked attivio-labeldata-stacked-search-results' },
showRatings && _react2.default.createElement(
'div',
null,
_react2.default.createElement(
'dt',
null,
'Rating'
),
_react2.default.createElement(
'dd',
null,
_react2.default.createElement(_StarRating2.default, { onRated: function onRated(rating) {
_this2.rateDocument(doc, rating);
} })
)
),
showScores && _react2.default.createElement(
'dt',
null,
'Relevancy Score'
),
showScores && _react2.default.createElement(
'dd',
null,
_react2.default.createElement(_RelevancyScore2.default, { score: score, explanation: scoreDescription, id: docId })
)
)
),
_react2.default.createElement(
'div',
{ className: 'attivio-search-result-content' },
_react2.default.createElement(_SearchResultTitle2.default, { doc: doc, baseUri: baseUri }),
_react2.default.createElement(
_Row2.default,
null,
_react2.default.createElement(
_Col2.default,
{ xs: 7, sm: 7 },
_react2.default.createElement(_SearchResultBody2.default, { body: text }),
showTags && _react2.default.createElement(_SearchResultTags2.default, {
tags: docTags,
moreLikeThisQuery: moreLikeThisQuery,
docId: docId,
hide360Link: hide360Link
})
),
_react2.default.createElement(
_Col2.default,
{ xs: 5, sm: 5 },
_react2.default.createElement(_DocumentEntityList2.default, { doc: doc, entityFields: userEntityFields })
)
)
),
this.renderNestedDocs()
);
};
return InnerListSearchResult;
}(_react2.default.Component), _class.defaultProps = {
baseUri: '',
format: 'list',
showScores: false,
entityFields: new Map([['people', 'People'], ['location', 'Locations'], ['company', 'Companies']]),
showTags: true,
showRatings: true,
hide360Link: false
}, _class.displayName = 'ListSearchResult', _class.contextTypes = {
configuration: _propTypes2.default.instanceOf(_Configuration2.default)
}, _temp);
var ListSearchResult = (0, _Configurable2.default)(InnerListSearchResult);
ListSearchResult.renderer = InnerListSearchResult.renderer;
exports.default = ListSearchResult;
module.exports = exports['default'];