choerodon-ui
Version:
An enterprise-class UI design language and React-based implementation
534 lines (456 loc) • 17.8 kB
JavaScript
import _extends from "@babel/runtime/helpers/extends";
import _objectSpread from "@babel/runtime/helpers/objectSpread2";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
import React, { cloneElement, isValidElement } from 'react';
import isObject from 'lodash/isObject';
import isNil from 'lodash/isNil';
import isString from 'lodash/isString';
import isNumber from 'lodash/isNumber';
import defaultTo from 'lodash/defaultTo';
import isPlainObject from 'lodash/isPlainObject';
import { get, isArrayLike, isObservableObject } from 'mobx';
import classNames from 'classnames';
import { isMoment } from 'moment';
import { BigNumber } from 'bignumber.js';
import { Utils } from 'choerodon-ui/dataset';
import { getConfig, getProPrefixCls } from '../../../es/configure/utils';
import { FieldType, RecordStatus } from '../data-set/enum';
import formatCurrency from '../formatter/formatCurrency';
import formatNumber from '../formatter/formatNumber';
import formatBigNumber from '../formatter/formatBigNumber';
import { getPrecision } from '../number-field/utils';
import isEmpty from '../_util/isEmpty';
import CloseButton from './CloseButton';
import { hide, show } from '../tooltip/singleton';
import Icon from '../icon';
import { $l } from '../locale-context';
import isReactChildren from '../_util/isReactChildren';
import { defaultTextField, findBindFields } from '../data-set/utils';
import ObjectChainValue from '../_util/ObjectChainValue';
import MultiLine from '../output/MultiLine';
var toRangeValue = Utils.toRangeValue;
var getDateFormatByFieldType = Utils.getDateFormatByFieldType;
var getDateFormatByField = Utils.getDateFormatByField;
export { toRangeValue, getDateFormatByFieldType, getDateFormatByField };
export function fromRangeValue(value, range) {
if (isArrayLike(range)) {
var _ref;
var _range = _slicedToArray(range, 2),
start = _range[0],
end = _range[1];
return _ref = {}, _defineProperty(_ref, start, value[0]), _defineProperty(_ref, end, value[1]), _ref;
}
return value;
}
export function toMultipleValue(value, range) {
if (!isNil(value)) {
var multipleValue = isArrayLike(value) ? value.slice() : [value];
if (range) {
return multipleValue.map(function (item) {
return toRangeValue(item, range);
});
}
return multipleValue;
}
return [];
}
export function transformHighlightProps(highlight, props) {
if ( /*#__PURE__*/isValidElement(highlight) || isString(highlight)) {
return _objectSpread(_objectSpread({}, props), {}, {
content: highlight
});
}
if (isObject(highlight)) {
return _objectSpread(_objectSpread({}, props), highlight);
}
return props;
}
export function getCurrencyFormatter() {
var currencyFormatter = getConfig('currencyFormatter');
if (currencyFormatter !== undefined) {
return currencyFormatter;
}
return formatCurrency;
}
export function getNumberFormatter() {
var numberFieldFormatter = getConfig('numberFieldFormatter');
if (numberFieldFormatter !== undefined) {
return numberFieldFormatter;
}
return formatNumber;
}
export function getBigNumberFormatter() {
var bigNumberFormatter = getConfig('bigNumberFormatter');
if (bigNumberFormatter !== undefined) {
return bigNumberFormatter;
}
return formatBigNumber;
}
export function getCurrencyFormatOptions(getProp, controlLang) {
var precision = getProp('precision');
var formatterOptions = getProp('formatterOptions') || {};
var currencyFormatterOptions = getConfig('currencyFormatterOptions') || {
options: {}
};
var lang = formatterOptions.lang || currencyFormatterOptions.lang || controlLang;
var options = {};
if (isNumber(precision)) {
options.minimumFractionDigits = precision;
options.maximumFractionDigits = precision;
}
_extends(options, currencyFormatterOptions.options, formatterOptions.options);
var numberGrouping = getProp('numberGrouping');
var currency = getProp('currency');
if (currency) {
options.currency = currency;
}
if (numberGrouping === false) {
options.useGrouping = false;
}
return {
lang: lang,
options: options
};
}
export function getNumberFormatOptions(getProp, getValue, value, controlLang) {
var precision = getProp('precision');
var precisionInValue = isNumber(precision) ? precision : getPrecision(isNil(value) ? getValue ? getValue() || 0 : 0 : value);
var formatterOptions = getProp('formatterOptions') || {};
var numberFieldFormatterOptions = getConfig('numberFieldFormatterOptions') || {
options: {}
};
var lang = formatterOptions.lang || numberFieldFormatterOptions.lang || controlLang;
var options = _objectSpread(_objectSpread({
maximumFractionDigits: precisionInValue
}, numberFieldFormatterOptions.options), formatterOptions.options);
var numberGrouping = getProp('numberGrouping');
if (numberGrouping === false) {
options.useGrouping = false;
}
return {
lang: lang,
options: options
};
}
export function getBigNumberFormatOptions(getProp, getValue, value, controlLang, bigNumberTarget) {
var precision = getProp('precision');
var bigNumberFormatterOptions;
var options = {};
var formatterOptions = getProp('formatterOptions') || {};
if (bigNumberTarget === 'currency') {
if (isNumber(precision)) {
options.minimumFractionDigits = precision;
options.maximumFractionDigits = precision;
}
bigNumberFormatterOptions = getConfig('currencyFormatterOptions') || {
options: {}
};
_extends(options, bigNumberFormatterOptions.options, formatterOptions.options);
var currency = getProp('currency');
if (currency) {
options.currency = currency;
}
} else {
var precisionInValue = isNumber(precision) ? precision : new BigNumber(isEmpty(value) ? getValue ? getValue() || 0 : 0 : value).decimalPlaces();
bigNumberFormatterOptions = getConfig('numberFieldFormatterOptions') || {
options: {}
};
options = _objectSpread(_objectSpread({
maximumFractionDigits: precisionInValue
}, bigNumberFormatterOptions.options), formatterOptions.options);
}
var numberGrouping = getProp('numberGrouping');
if (numberGrouping === false) {
options.useGrouping = false;
}
var lang = formatterOptions.lang || bigNumberFormatterOptions.lang || controlLang;
return {
lang: lang,
options: options
};
}
export function processFieldValue(value, field, options, showValueIfNotFound, record) {
var getProp = options.getProp,
getValue = options.getValue,
lang = options.lang;
var type = getProp('type');
var currency = getProp('currency');
if (currency || type === FieldType.currency) {
var formatOptions = getCurrencyFormatOptions(getProp, lang);
var formatter = getProp('formatter');
return (formatter || getCurrencyFormatter())(value, formatOptions.lang, formatOptions.options);
}
if (type === FieldType.number) {
var _formatOptions = getNumberFormatOptions(getProp, getValue, value, lang);
var _formatter = getProp('formatter');
return (_formatter || getNumberFormatter())(value, _formatOptions.lang, _formatOptions.options);
}
if (type === FieldType.bigNumber) {
var _formatOptions2 = getBigNumberFormatOptions(getProp, getValue, value, lang, currency ? 'currency' : 'number-field');
var _formatter2 = getProp('formatter');
return (_formatter2 || getBigNumberFormatter())(value, _formatOptions2.lang, _formatOptions2.options, currency ? 'currency' : 'number-field');
}
if (field) {
return field.getText(value, showValueIfNotFound, record);
}
return value;
}
export function processValue(value, format) {
if (!isNil(value)) {
if (isMoment(value)) {
if (value.isValid()) {
return value.format(format);
}
if (getConfig('showInvalidDate')) {
return $l('DatePicker', 'invalid_date');
}
return '';
}
if (isReactChildren(value)) {
// For Select's Option and TreeSelect's TreeNode which type may be ReactElement
return value;
}
return value.toString();
}
return '';
}
export function isFieldValueEmpty(value, range, multiple, valueField, textField) {
if (isEmpty(value)) {
return true;
}
if (multiple) {
return !isArrayLike(value) || value.length === 0;
}
if (range === true) {
return isArrayLike(value) && value.every(function (v) {
return isEmpty(v);
});
}
if (isArrayLike(range)) {
return value && Object.values(value).every(function (v) {
return isEmpty(v);
});
}
var isObjectEmpty = function isObjectEmpty(v) {
if (valueField && textField) {
if (isObservableObject(v)) {
return isEmpty(get(v, valueField)) && isEmpty(get(v, textField));
}
if (isObject(v)) {
return isEmpty(v[valueField]) && isEmpty(v[textField]);
}
}
return false;
};
if (isArrayLike(value)) {
return value.length ? value.every(function (v) {
if (isEmpty(v)) {
return true;
}
return isObjectEmpty(v);
}) : true;
}
return isObjectEmpty(value);
}
export function renderRangeValue(value, option) {
var repeat = option.repeat,
processRenderer = option.processRenderer;
var rangeValue = (value || []).map(function (item) {
return processRenderer(item, repeat);
}, []);
if (rangeValue.some(function (v) {
return !isEmpty(v);
})) {
return /*#__PURE__*/React.createElement(React.Fragment, null, rangeValue[0], "~", rangeValue[1]);
}
}
export function getValueKey(v) {
if (isArrayLike(v)) {
return v.join(',');
}
return v;
}
export function renderMultipleValues(value, option) {
var range = option.range,
maxTagPlaceholder = option.maxTagPlaceholder,
prefixCls = option.prefixCls,
validationResults = option.validationResults,
disabled = option.disabled,
readOnly = option.readOnly,
isMultipleBlockDisabled = option.isMultipleBlockDisabled,
processRenderer = option.processRenderer,
renderValidationResult = option.renderValidationResult,
handleMultipleValueRemove = option.handleMultipleValueRemove,
_option$getKey = option.getKey,
getKey = _option$getKey === void 0 ? getValueKey : _option$getKey,
isValidationMessageHidden = option.isValidationMessageHidden,
selfShowValidationMessage = option.showValidationMessage,
tooltipTheme = option.tooltipTheme;
var values = toMultipleValue(value, range);
var valueLength = values.length;
var _option$maxTagCount = option.maxTagCount,
maxTagCount = _option$maxTagCount === void 0 ? valueLength : _option$maxTagCount;
var repeats = new Map();
var blockClassName = classNames(_defineProperty({}, "".concat(prefixCls, "-multiple-block-disabled"), disabled), "".concat(prefixCls, "-multiple-block"));
var multipleValidateMessageLength = 0;
var tags = values.slice(0, maxTagCount).map(function (v, index) {
var key = getKey(v);
var repeat = repeats.get(key) || 0;
var text = range ? renderRangeValue(v, {
repeat: repeat,
processRenderer: processRenderer
}) : processRenderer(v, repeat);
repeats.set(key, repeat + 1);
if (!isEmpty(text)) {
var _classNames2;
var validationResult = validationResults && validationResults.find(function (error) {
return error.value === v;
});
var blockDisabled = isMultipleBlockDisabled ? isMultipleBlockDisabled(v) : disabled;
var className = classNames((_classNames2 = {}, _defineProperty(_classNames2, "".concat(prefixCls, "-multiple-block-invalid"), validationResult), _defineProperty(_classNames2, "".concat(prefixCls, "-multiple-block-disabled"), blockDisabled), _classNames2), "".concat(prefixCls, "-multiple-block"));
var validationMessage = validationResult && renderValidationResult(validationResult);
if (validationMessage) {
multipleValidateMessageLength++;
}
var closeBtn = !blockDisabled && !readOnly && /*#__PURE__*/React.createElement(CloseButton, {
onClose: handleMultipleValueRemove,
value: v,
index: repeat
});
var inner = readOnly ? /*#__PURE__*/React.createElement("span", {
key: String(index),
className: className
}, text) : /*#__PURE__*/React.createElement("li", {
key: String(index),
className: className
}, /*#__PURE__*/React.createElement("div", null, text), closeBtn);
if (!isValidationMessageHidden(validationMessage)) {
return /*#__PURE__*/cloneElement(inner, {
onMouseEnter: function onMouseEnter(e) {
return selfShowValidationMessage(e, validationMessage, tooltipTheme);
},
onMouseLeave: function onMouseLeave() {
return hide();
}
});
}
return inner;
}
return undefined;
});
if (valueLength > maxTagCount) {
var content = "+ ".concat(valueLength - maxTagCount, " ...");
if (maxTagPlaceholder) {
var omittedValues = values.slice(maxTagCount, valueLength);
content = typeof maxTagPlaceholder === 'function' ? maxTagPlaceholder(omittedValues) : maxTagPlaceholder;
}
tags.push( /*#__PURE__*/React.createElement("li", {
key: "maxTagPlaceholder",
className: blockClassName
}, /*#__PURE__*/React.createElement("div", null, content)));
}
return {
tags: tags,
multipleValidateMessageLength: multipleValidateMessageLength
};
}
export function renderMultiLine(options) {
var field = options.field,
record = options.record,
dataSet = options.dataSet,
name = options.name,
prefixCls = options.prefixCls,
renderer = options.renderer,
renderValidationResult = options.renderValidationResult,
isValidationMessageHidden = options.isValidationMessageHidden,
selfProcessValue = options.processValue,
labelTooltip = options.labelTooltip,
tooltip = options.tooltip;
var multipleValidateMessageLength = 0;
if (record) {
var multiLineFields = findBindFields(field, record.dataSet.fields, false, record);
if (renderer) {
return {
lines: renderer({
multiLineFields: multiLineFields,
record: record,
dataSet: dataSet,
name: name
}),
multipleValidateMessageLength: multipleValidateMessageLength
};
}
if (multiLineFields.length) {
var lines = multiLineFields.map(function (fieldItem) {
if (fieldItem) {
var required = defaultTo(fieldItem.get('required', record), field.get('required', record));
var fieldName = fieldItem.name;
var value = record.get(fieldName);
var validationResults = record.getValidationError(fieldName);
var validationResult = validationResults && validationResults.find(function (error) {
return error.value === value;
});
var validationMessage = validationResult && renderValidationResult(validationResult);
var validationHidden = isValidationMessageHidden(validationMessage);
var processedValue = '';
if (fieldItem.get('lovCode', record)) {
var fieldValue = fieldItem.getValue(record);
if (isPlainObject(fieldValue)) {
processedValue = ObjectChainValue.get(fieldValue, fieldItem.get('textField', record) || defaultTextField);
}
}
var notEmpty = !isEmpty(value); // 值集中不存在 再去取直接返回的值
var text = processedValue || selfProcessValue(value);
multipleValidateMessageLength++;
var validationInner = notEmpty ? text : validationHidden ? record.status === RecordStatus.add ? '' : /*#__PURE__*/React.createElement("span", {
className: "".concat(prefixCls, "-multi-value-invalid")
}, text) : validationMessage;
var label = fieldItem.get('label', record);
return /*#__PURE__*/React.createElement(MultiLine, {
key: "".concat(record.index, "-multi-").concat(fieldName),
prefixCls: prefixCls,
label: label,
required: required,
validationMessage: validationMessage,
validationHidden: validationHidden,
tooltip: tooltip,
labelTooltip: labelTooltip
}, validationInner);
}
return null;
});
return {
lines: lines,
multipleValidateMessageLength: multipleValidateMessageLength
};
}
}
return {
multipleValidateMessageLength: multipleValidateMessageLength
};
}
export function renderValidationMessage(validationMessage, showIcon) {
if (validationMessage) {
return /*#__PURE__*/React.createElement("div", {
className: getProPrefixCls('validation-message')
}, showIcon && /*#__PURE__*/React.createElement(Icon, {
type: "error"
}), /*#__PURE__*/React.createElement("span", null, validationMessage));
}
}
export function defaultRenderer(renderOption) {
var text = renderOption.text,
repeat = renderOption.repeat,
maxTagTextLength = renderOption.maxTagTextLength;
return repeat !== undefined && maxTagTextLength && isString(text) && text.length > maxTagTextLength ? "".concat(text.slice(0, maxTagTextLength), "...") : text;
}
export function showValidationMessage(e, message, tooltipTheme, tooltipPlacement) {
show(e.currentTarget, {
suffixCls: "form-tooltip ".concat(getConfig('proPrefixCls'), "-tooltip"),
title: message,
theme: tooltipTheme,
placement: tooltipPlacement || 'bottomLeft'
});
}
//# sourceMappingURL=utils.js.map