UNPKG

@collectionspace/cspace-public-browser

Version:
316 lines (310 loc) 10.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.valueWithNote = exports.valueAt = exports.unqualifiedFieldName = exports.unformatted = exports.split = exports.renderLink = exports.renderJoined = exports.renderFilterLink = exports.property = exports.pickFromList = exports.pickAllFromList = exports.paragraphs = exports.objectTypeValue = exports.numericRange = exports.nameValue = exports.nameRole = exports.literal = exports.listOf = exports.list = exports.linkedDisplayName = exports.linkText = exports.linkNote = exports.lines = exports.inlineListOf = exports.inlineList = exports.html = exports.head = exports.filterLink = exports.displayNameFrom = exports.displayName = exports.decade = exports.collectionValue = exports.boolean = void 0; var _react = _interopRequireDefault(require("react")); var _get = _interopRequireDefault(require("lodash/get")); var _qs = _interopRequireDefault(require("qs")); var _reactRouterDom = require("react-router-dom"); var _cspaceRefname = require("cspace-refname"); var _FieldValueList = _interopRequireDefault(require("../components/detail/FieldValueList")); var _Link = _interopRequireDefault(require("../../styles/cspace/Link.css")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const renderLink = (url, text, type) => { if (!url) { return text; } if (type === 'external') { const fullUrl = !url.startsWith('http') ? `http://${url}` : url; const content = text || url; // Make sure urls with no spaces are able to wrap anywhere. const inlineStyle = content.startsWith('http') ? { overflowWrap: 'anywhere' } : undefined; return /*#__PURE__*/_react.default.createElement("a", { className: _Link.default[type], href: fullUrl, rel: "noopener noreferrer", style: inlineStyle, target: "_blank" }, content); } return /*#__PURE__*/_react.default.createElement(_reactRouterDom.Link, { className: type && _Link.default[type], to: url }, text || url); }; exports.renderLink = renderLink; const renderFilterLink = (filterId, filterValue, linkText) => { if (!filterValue) { return null; } const values = [filterValue]; const query = _qs.default.stringify({ [filterId]: JSON.stringify(values) }); return renderLink(`/search?${query}`, typeof linkText === 'undefined' ? filterValue : linkText); }; exports.renderFilterLink = renderFilterLink; const renderJoined = (parts, separator = '') => { const nonEmptyParts = parts.filter(part => typeof part !== 'undefined' && part !== null && part !== ''); if (nonEmptyParts.length === 0) { return null; } const separatorElement = separator === '\n' ? /*#__PURE__*/_react.default.createElement("br", null) : separator; return nonEmptyParts.reduce((joinedParts, nextPart) => /*#__PURE__*/ // eslint-disable-next-line react/jsx-one-expression-per-line _react.default.createElement("span", null, joinedParts, separatorElement, nextPart)); }; exports.renderJoined = renderJoined; const renderList = (values, inline = false) => { if (Array.isArray(values)) { if (values.length > 1) { return /*#__PURE__*/_react.default.createElement(_FieldValueList.default, { inline: inline }, values.map((value, index) => /*#__PURE__*/_react.default.createElement("li", { key: index }, value))); } return values[0]; } return values; }; const unformatted = data => data; exports.unformatted = unformatted; const boolean = value => { switch (value) { case 0: return 'No'; case 1: return 'Yes'; default: return value; } }; exports.boolean = boolean; const literal = value => () => value; exports.literal = literal; const collectionValue = value => value.replace('_', '-'); exports.collectionValue = collectionValue; const objectTypeValue = value => value.replace('_', '-'); exports.objectTypeValue = objectTypeValue; const lines = values => values && values.join('\n'); exports.lines = lines; const list = values => renderList(values); exports.list = list; const inlineList = values => renderJoined(values, ', '); exports.inlineList = inlineList; const listOf = format => (array, fieldName) => renderList(array.map(value => format(value, fieldName))); exports.listOf = listOf; const inlineListOf = format => (array, fieldName) => renderJoined(array.map(value => format(value, fieldName)), ', '); exports.inlineListOf = inlineListOf; const displayName = value => (0, _cspaceRefname.getDisplayName)(value) || value; exports.displayName = displayName; const displayNameFrom = name => data => displayName(data[name]); exports.displayNameFrom = displayNameFrom; const unqualifiedFieldName = (data, fieldName) => { const parts = fieldName.split(':'); return parts.length > 1 ? parts[1] : parts[0]; }; exports.unqualifiedFieldName = unqualifiedFieldName; const filterLink = config => (data, fieldName) => { const { filterIdFormat = unqualifiedFieldName, filterValueFormat = unformatted, linkTextFormat } = config; const formattedFilterId = filterIdFormat(data, fieldName); const formattedFilterValue = filterValueFormat(data, fieldName); const formattedLinkText = linkTextFormat ? linkTextFormat(data, fieldName) : formattedFilterValue; return renderFilterLink(formattedFilterId, formattedFilterValue, formattedLinkText); }; exports.filterLink = filterLink; const linkNote = (urlField, noteField, separator = ' - ') => object => { const { [noteField]: note, [urlField]: url } = object; const link = renderLink(url); return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, link, link && note && separator, note); }; exports.linkNote = linkNote; const linkedDisplayName = filterId => data => renderFilterLink(filterId, displayName(data)); exports.linkedDisplayName = linkedDisplayName; const linkText = config => data => { const { urlFieldName, textFieldName, type } = config; return renderLink(data[urlFieldName], data[textFieldName], type); }; exports.linkText = linkText; const nameValue = config => (data, fieldName) => { const { nameFormat, valueFormat, separator = ': ' } = config; const formattedName = nameFormat(data, fieldName); const formattedValue = valueFormat(data, fieldName); const parts = [formattedName, formattedValue]; return renderJoined(parts, separator); }; exports.nameValue = nameValue; const property = config => data => { const { nameFieldName, valueFieldName, separator = ': ' } = config; const parts = [renderFilterLink(nameFieldName, displayName(data[nameFieldName])), data[valueFieldName]]; return renderJoined(parts, separator); }; exports.property = property; const nameRole = config => data => { const { nameFieldName, roleFieldName, linkName = true, separator = ' ' } = config; const name = displayName(data[nameFieldName]); let role = displayName(data[roleFieldName]); if (role) { role = `(${role})`; } const parts = [linkName ? renderFilterLink(nameFieldName, name) : name, role]; return renderJoined(parts, separator); }; exports.nameRole = nameRole; const valueWithNote = config => data => { const { valueFieldName, noteFieldName, linkValue = true, separator = '\n', noteLabel = 'Note: ' } = config; const value = displayName(data[valueFieldName]); let note = data[noteFieldName]; if (note) { note = `${noteLabel}${note}`; } const parts = [linkValue ? renderFilterLink(valueFieldName, value) : value, note]; return renderJoined(parts, separator); }; exports.valueWithNote = valueWithNote; const numericRange = config => data => { const { linkQualifier, lowFieldName, highFieldName, unitFieldName, qualifierFieldName, qualifierSeparator = ' ' } = config; let { unit } = config; const low = data[lowFieldName]; const high = data[highFieldName]; const range = [low, high].filter(part => !!part).join('-'); if (range) { unit = unit || displayName(data[unitFieldName]); } else { unit = null; } const qualifier = displayName(data[qualifierFieldName]); const rangeUnit = renderJoined([range, unit], ' '); return renderJoined([rangeUnit, linkQualifier ? renderFilterLink(qualifierFieldName, qualifier) : qualifier], qualifierSeparator); }; /** * Create a paragraph element for each String in an array. If the String contains a newline, it will * be split in order to retain line breaks in that display. * * @param {} array * @returns */ exports.numericRange = numericRange; const paragraphs = array => // eslint-disable-next-line react/no-array-index-key Array.isArray(array) && array.flatMap(value => value.split('\n')).map((value, index) => /*#__PURE__*/_react.default.createElement("p", { key: index }, value)); /** * Split a string based on a given character to split with. Defaults to newline. * * @param {*} config * @returns */ exports.paragraphs = paragraphs; const split = config => string => { const { splitter = '\n', format = unformatted } = config; if (!(typeof string === 'string' || string instanceof String)) { return null; } return format(string.split(splitter)); }; exports.split = split; const head = format => (array, fieldName) => Array.isArray(array) && array.length > 0 ? format(array[0], fieldName) : null; exports.head = head; const valueAt = config => data => { const { path, format = unformatted } = config; const value = (0, _get.default)(data, path); const fieldName = Array.isArray(path) ? path[path.length - 1] : path; return format(value, fieldName); }; exports.valueAt = valueAt; const pickFromList = config => array => { const { condition, format } = config; const { path, value: targetValue } = condition; const value = array.find(candidateItem => { const candidateValue = path ? (0, _get.default)(candidateItem, path) : candidateItem; return candidateValue === targetValue; }); return format ? format(value) : value; }; exports.pickFromList = pickFromList; const pickAllFromList = config => array => { const { condition, format } = config; const { path, value: targetValue } = condition; const values = array.filter(candidateItem => { const candidateValue = path ? (0, _get.default)(candidateItem, path) : candidateItem; return candidateValue === targetValue; }); return renderJoined(format ? values.map(format) : values, '\n'); }; exports.pickAllFromList = pickAllFromList; const decade = startYear => { const endYear = startYear + 9; return `${startYear}${endYear}`; }; // eslint-disable-next-line react/no-danger exports.decade = decade; const html = value => /*#__PURE__*/_react.default.createElement("div", { dangerouslySetInnerHTML: { __html: value } }); exports.html = html;