@collectionspace/cspace-public-browser
Version:
CollectionSpace public browser
316 lines (310 loc) • 10.9 kB
JavaScript
;
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;