cspace-ui
Version:
CollectionSpace user interface for browsers
109 lines (108 loc) • 4 kB
JavaScript
"use strict";
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/cjs/react-router-dom.min");
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 renderColumn(column, item) {
const data = item.get(column.dataKey);
const formatted = data ? column.formatValue(data) : null;
const key = `${item.get('csid')}-${column.dataKey}`;
return /*#__PURE__*/_react.default.createElement("td", {
key: key
}, formatted);
}
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 history = (0, _reactRouterDom.useHistory)();
const {
listType,
searchDescriptor,
columns,
selectedItems
} = renderContext;
const csid = item.get('csid');
const listTypeConfig = config.listTypes[listType];
const {
getItemLocationPath
} = listTypeConfig;
let location;
if (getItemLocationPath) {
location = getItemLocationPath(item, {
config,
searchDescriptor
});
}
const selected = selectedItems ? selectedItems.has(csid) : false;
const rowAriaLabel = createRowLabel(columns[0], item, index, totalItems, intl);
function handleRowClick() {
// from SearchResultTable:
// Create a location with the item location path, along with enough state to reproduce this
// search. The search descriptor is converted to an object in order to reliably store it in
// location state. Also merge in any object that was passed in via the linkState prop.
const 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
// ...linkState,
};
history.push(location, state);
}
return /*#__PURE__*/_react.default.createElement("tr", {
"aria-label": rowAriaLabel,
role: "link",
tabIndex: 0,
className: index % 2 === 0 ? _SearchTable.default.even : _SearchTable.default.odd,
onClick: handleRowClick
}, /*#__PURE__*/_react.default.createElement("td", null, /*#__PURE__*/_react.default.createElement(_SearchResultCheckbox.default, {
index: index,
listType: listType,
searchDescriptor: searchDescriptor,
selected: selected
})), columns.map(column => renderColumn(column, item, location)));
}
SearchResultTableRow.propTypes = propTypes;
var _default = exports.default = (0, _reactIntl.injectIntl)(SearchResultTableRow);