cspace-ui
Version:
CollectionSpace user interface for browsers
114 lines (112 loc) • 3.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireDefault(require("react"));
var _reactIntl = require("react-intl");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _immutable = _interopRequireDefault(require("immutable"));
var _reactRouterDom = require("react-router-dom");
var _ConfigProvider = require("../../config/ConfigProvider");
var _searchNames = require("../../../constants/searchNames");
var _SearchTable = _interopRequireDefault(require("../../../../styles/cspace-ui/SearchTable.css"));
var _SearchResultCheckbox = _interopRequireDefault(require("../SearchResultCheckbox"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const propTypes = {
item: _propTypes.default.instanceOf(_immutable.default.Map),
index: _propTypes.default.number,
totalItems: _propTypes.default.number,
intl: _propTypes.default.object,
renderContext: _propTypes.default.shape({
listType: _propTypes.default.string,
searchDescriptor: _propTypes.default.object,
columns: _propTypes.default.array,
selectedItems: _propTypes.default.object
})
};
const messages = (0, _reactIntl.defineMessages)({
rowAriaLabel: {
"id": "searchResultTableRow.rowAriaLabel",
"defaultMessage": "Row {index} of {total} - {primary}"
}
});
function createRowLabel(column, item, index, total, intl) {
const data = item.get(column.dataKey);
return data ? intl.formatMessage(messages.rowAriaLabel, {
primary: data,
index: index + 1,
total
}) : 'row';
}
function SearchResultTableRow({
item,
index,
totalItems,
renderContext,
intl
}) {
const config = (0, _ConfigProvider.useConfig)();
const {
listType,
searchDescriptor,
columns,
selectedItems
} = renderContext;
const csid = item.get('csid');
const listTypeConfig = config.listTypes[listType];
const {
getItemLocationPath
} = listTypeConfig;
let location;
let state;
if (getItemLocationPath) {
location = getItemLocationPath(item, {
config,
searchDescriptor
});
state = {
searchDescriptor: searchDescriptor.toJS(),
// The search traverser on records will always link to the search result page, so use
// its search name.
searchName: _searchNames.SEARCH_RESULT_PAGE_SEARCH_NAME,
listType
};
}
const selected = selectedItems ? selectedItems.has(csid) : false;
const rowAriaLabel = createRowLabel(columns[0], item, index, totalItems, intl);
return /*#__PURE__*/_react.default.createElement("tr", {
"aria-label": rowAriaLabel,
className: index % 2 === 0 ? _SearchTable.default.even : _SearchTable.default.odd
}, /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement(_SearchResultCheckbox.default, {
index: index,
listType: listType,
searchDescriptor: searchDescriptor,
selected: selected
})), columns.map(column => {
const {
dataKey,
linkable,
formatValue
} = column;
const data = item.get(dataKey);
const formatted = data ? formatValue(data) : null;
const key = `${csid}-${dataKey}`;
// Wrap the value in a link if it's in a linkable column and the location is available.
if (linkable && location) {
return /*#__PURE__*/_react.default.createElement("td", {
key: key
}, /*#__PURE__*/_react.default.createElement(_reactRouterDom.Link, {
to: {
pathname: location,
state
}
}, formatted));
}
return /*#__PURE__*/_react.default.createElement("td", {
key: key
}, formatted);
}));
}
SearchResultTableRow.propTypes = propTypes;
var _default = exports.default = (0, _reactIntl.injectIntl)(SearchResultTableRow);