UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

472 lines (417 loc) 16.2 kB
import _defineProperty from "@babel/runtime/helpers/defineProperty"; import _extends from "@babel/runtime/helpers/extends"; import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator"; import _objectSpread from "@babel/runtime/helpers/objectSpread2"; import _regeneratorRuntime from "@babel/runtime/regenerator"; import React, { cloneElement, isValidElement, useCallback, useContext, useEffect, useRef } from 'react'; import { observer } from 'mobx-react-lite'; import { isArrayLike } from 'mobx'; import classnames from 'classnames'; import isString from 'lodash/isString'; import isFunction from 'lodash/isFunction'; import isObject from 'lodash/isObject'; import noop from 'lodash/noop'; import { Size } from '../../../es/_util/enum'; import { pxToRem } from '../../../es/_util/UnitConvertor'; import ConfigContext from '../../../es/config-provider/ConfigContext'; import { ProgressStatus } from '../../../es/progress/enum'; import Progress from '../progress/Progress'; import Icon from '../icon'; import { AttachmentButtonType } from './Attachment'; import Picture from '../picture/Picture'; import Button from '../button/Button'; import { FuncType } from '../button/enum'; import { hide, show } from '../tooltip/singleton'; import { formatFileSize } from './utils'; import Tooltip from '../tooltip/Tooltip'; import { $l } from '../locale-context'; export var ATTACHMENT_TARGET = 'attachment-preview'; var Item = function Item(props) { var _classnames2; var attachment = props.attachment, listType = props.listType, prefixCls = props.prefixCls, onUpload = props.onUpload, onRemove = props.onRemove, width = props.pictureWidth, bucketName = props.bucketName, onHistory = props.onHistory, onPreview = props.onPreview, _props$previewTarget = props.previewTarget, previewTarget = _props$previewTarget === void 0 ? ATTACHMENT_TARGET : _props$previewTarget, bucketDirectory = props.bucketDirectory, storageCode = props.storageCode, attachmentUUID = props.attachmentUUID, isCard = props.isCard, provided = props.provided, readOnly = props.readOnly, disabled = props.disabled, restCount = props.restCount, draggable = props.draggable, index = props.index, hidden = props.hidden, isPublic = props.isPublic, showSize = props.showSize, fileButtons = props.buttons, getPreviewUrlProp = props.getPreviewUrl; var status = attachment.status, name = attachment.name, filename = attachment.filename, ext = attachment.ext, url = attachment.url, size = attachment.size, type = attachment.type; var _useContext = useContext(ConfigContext), getConfig = _useContext.getConfig, getTooltipTheme = _useContext.getTooltipTheme, getTooltipPlacement = _useContext.getTooltipPlacement; var attachmentConfig = getConfig('attachment'); var tooltipRef = useRef(false); var pictureRef = useRef(null); var getPreviewUrlConfig = attachmentConfig.getPreviewUrl, getDownloadUrl = attachmentConfig.getDownloadUrl; var getPreviewUrl = getPreviewUrlProp || getPreviewUrlConfig; var previewUrl = getPreviewUrl ? getPreviewUrl({ attachment: attachment, bucketName: bucketName, bucketDirectory: bucketDirectory, storageCode: storageCode, attachmentUUID: attachmentUUID, isPublic: isPublic }) : url; var downloadUrl = getDownloadUrl && getDownloadUrl({ attachment: attachment, bucketName: bucketName, bucketDirectory: bucketDirectory, storageCode: storageCode, attachmentUUID: attachmentUUID, isPublic: isPublic }); var dragProps = _objectSpread({}, provided.dragHandleProps); var isPicture = type.startsWith('image') || ['png', 'gif', 'jpg', 'webp', 'jpeg', 'bmp', 'tif', 'pic', 'svg'].includes(ext); var preview = !!previewUrl && (status === 'success' || status === 'done'); var handleOpenPreview = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var result; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!isFunction(previewUrl)) { _context.next = 5; break; } _context.next = 3; return previewUrl(); case 3: result = _context.sent; if (isString(result)) { window.open(result, previewTarget); } case 5: case "end": return _context.stop(); } } }, _callee); })), [previewUrl, previewTarget]); var handlePreview = useCallback(function () { var current = pictureRef.current; if (current && isString(previewUrl)) { current.preview(); } else if (isFunction(previewUrl)) { handleOpenPreview(); } }, [pictureRef, previewUrl, handleOpenPreview]); var renderDragger = function renderDragger() { if (draggable && !isCard) { var iconProps = { className: "".concat(prefixCls, "-drag-icon"), type: 'baseline-drag_indicator' }; if (status !== 'deleting') { _extends(iconProps, dragProps); } return /*#__PURE__*/React.createElement(Icon, _extends({}, iconProps)); } }; var renderImagePreview = function renderImagePreview() { if (listType === 'text') { var renderIcon = attachmentConfig.renderIcon; var defaultIcon = /*#__PURE__*/React.createElement(Icon, { type: "insert_drive_file" }); var icon = renderIcon ? renderIcon(attachment, listType, defaultIcon) : defaultIcon; var isSrcIcon = isString(icon); if (isPicture || isSrcIcon) { var pictureProps = {}; if (isString(previewUrl)) { pictureProps.previewUrl = previewUrl; } else { pictureProps.onClick = handleOpenPreview; } return /*#__PURE__*/React.createElement(Picture, _extends({ width: 14, height: 14, alt: name, downloadUrl: downloadUrl, src: isSrcIcon ? icon : undefined, objectFit: "contain", status: "loaded", index: index, className: "".concat(prefixCls, "-icon"), previewTarget: isSrcIcon && !isPicture ? previewTarget : undefined, preview: preview, onPreview: onPreview, ref: pictureRef }, pictureProps), /*#__PURE__*/isValidElement(icon) ? icon : undefined); } if (preview) { var previewButtonProps = { funcType: FuncType.link, className: "".concat(prefixCls, "-icon") }; if (isString(previewUrl)) { previewButtonProps.href = previewUrl; previewButtonProps.target = previewTarget; } else { previewButtonProps.onClick = handleOpenPreview; } return /*#__PURE__*/React.createElement(Button, _extends({}, previewButtonProps), icon); } return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-icon") }, icon); } if (isCard || listType === 'picture') { if ((preview || status === 'deleting') && isPicture) { return /*#__PURE__*/React.createElement(Picture, { width: width, height: width, alt: name, src: isString(previewUrl) ? previewUrl : url, downloadUrl: downloadUrl, lazy: true, objectFit: "contain", index: index, preview: preview }); } return /*#__PURE__*/React.createElement(Picture, { width: width, height: width, alt: name, status: status === 'error' ? 'error' : 'empty', index: index }); } }; var renderPlaceholder = function renderPlaceholder() { if (restCount && isCard) { return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-placeholder") }, "+", restCount); } }; var renderTitle = function renderTitle(isCardTitle) { var fileName = /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-name") }, filename), ext && /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-ext") }, ".", ext)); var nameNode = preview && listType === 'text' ? /*#__PURE__*/React.createElement("a", _extends({}, isPicture ? { onClick: handlePreview } : isString(previewUrl) ? { href: previewUrl, target: previewTarget } : { onClick: handleOpenPreview }, { className: "".concat(prefixCls, "-link") }), fileName) : fileName; return /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-title"), style: isCardTitle ? { width: pxToRem(width) } : undefined }, nameNode, !isCardTitle && showSize && /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-size") }, " (", formatFileSize(size), ")")); }; var renderProgress = function renderProgress() { if (status === 'uploading') { return /*#__PURE__*/React.createElement(Progress, { value: attachment.percent || 0, size: Size.small, showInfo: false, strokeWidth: 2, className: "".concat(prefixCls, "-progress"), status: ProgressStatus.normal }); } }; var getButtonProps = function getButtonProps(type) { var commonProps = { className: classnames("".concat(prefixCls, "-icon")), funcType: FuncType.link, block: isCard }; switch (type) { case AttachmentButtonType.download: return _objectSpread(_objectSpread({}, commonProps), {}, { icon: isCard ? 'arrow_downward' : 'get_app', href: isString(downloadUrl) ? downloadUrl : undefined, onClick: isFunction(downloadUrl) ? downloadUrl : noop, target: previewTarget }); case AttachmentButtonType.remove: return _objectSpread(_objectSpread({}, commonProps), {}, { icon: isCard ? 'delete_forever-o' : 'close', onClick: function onClick() { return onRemove(attachment); } }); case AttachmentButtonType.history: if (onHistory && attachmentUUID) { return _objectSpread(_objectSpread({}, commonProps), {}, { icon: 'library_books', onClick: function onClick() { return onHistory(attachment, attachmentUUID); } }); } return { onClick: noop }; default: break; } }; var renderButtons = function renderButtons() { var buttons = []; if (!readOnly && status === 'error' && !attachment.invalid) { var upProps = { key: 'upload', className: classnames("".concat(prefixCls, "-icon")), icon: 'replay', onClick: function onClick() { return onUpload(attachment); }, funcType: FuncType.link, block: isCard }; buttons.push( /*#__PURE__*/React.createElement(Button, _extends({}, upProps))); } fileButtons.forEach(function (btn) { var btnProps = {}; if (isArrayLike(btn)) { btnProps = btn[1] || {}; btn = btn[0]; } if (isString(btn) && btn in AttachmentButtonType) { var defaultButtonProps = getButtonProps(btn); if (defaultButtonProps) { var _index = fileButtons.indexOf(btn); switch (btn) { case AttachmentButtonType.history: if (attachmentUUID && onHistory && (!status || status === 'success' || status === 'done')) { buttons.splice(_index, 1, /*#__PURE__*/React.createElement(Tooltip, { key: btn, title: $l('Attachment', 'view_operation_records') }, /*#__PURE__*/React.createElement(Button, _extends({}, defaultButtonProps, btnProps)))); } break; case AttachmentButtonType.download: if (downloadUrl && (!status || status === 'success' || status === 'done')) { buttons.splice(_index, 1, /*#__PURE__*/React.createElement(Tooltip, { key: btn, title: $l('Attachment', 'download') }, /*#__PURE__*/React.createElement(Button, _extends({}, defaultButtonProps, btnProps)))); } break; case AttachmentButtonType.remove: if (attachmentUUID && status !== 'uploading') { buttons.splice(_index, 1, /*#__PURE__*/React.createElement(Tooltip, { key: btn, title: status === 'deleting' ? undefined : $l('Attachment', 'delete') }, /*#__PURE__*/React.createElement(Button, _extends({ hidden: readOnly || disabled }, defaultButtonProps, btnProps)))); } break; default: break; } } } else if ( /*#__PURE__*/isValidElement(btn)) { buttons.push( /*#__PURE__*/cloneElement(btn, _objectSpread({}, btn.props))); } else if (isObject(btn)) { buttons.push( /*#__PURE__*/React.createElement(Button, _extends({}, btn))); } }); if (buttons.length) { return /*#__PURE__*/React.createElement("div", { className: classnames("".concat(prefixCls, "-buttons"), _defineProperty({}, "".concat(prefixCls, "-buttons-visible"), status === 'deleting')) }, buttons); } }; var renderErrorMessage = function renderErrorMessage() { if (status === 'error') { var errorMessage = attachment.errorMessage; if (errorMessage) { return /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-error-content") }, /*#__PURE__*/React.createElement(Icon, { type: "warning" }), /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-error-message") }, errorMessage)); } } }; var errorMessageNode = renderErrorMessage(); var handleMouseEnter = useCallback(function (e) { if (errorMessageNode) { show(e.currentTarget, { title: errorMessageNode, theme: getTooltipTheme('validation'), placement: getTooltipPlacement('validation') || 'bottomLeft' }); tooltipRef.current = true; } }, [errorMessageNode, getTooltipTheme, getTooltipPlacement, tooltipRef]); var handleMouseLeave = useCallback(function () { if (tooltipRef.current) { hide(); tooltipRef.current = false; } }, [tooltipRef]); useEffect(function () { return function () { if (tooltipRef.current) { hide(); tooltipRef.current = false; } }; }, []); var listProps = _objectSpread(_objectSpread({ ref: provided.innerRef, className: classnames(prefixCls, (_classnames2 = {}, _defineProperty(_classnames2, "".concat(prefixCls, "-error"), status === 'error'), _defineProperty(_classnames2, "".concat(prefixCls, "-success"), status === 'success'), _classnames2)) }, provided.draggableProps), {}, { style: _objectSpread({}, provided.draggableProps.style) }); if (draggable && isCard) { _extends(listProps, dragProps); } return /*#__PURE__*/React.createElement("div", _extends({}, listProps, { hidden: hidden }), /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-container"), onMouseEnter: isCard ? handleMouseEnter : undefined, onMouseLeave: isCard ? handleMouseLeave : undefined }, /*#__PURE__*/React.createElement("div", { className: "".concat(prefixCls, "-content") }, renderDragger(), renderImagePreview(), renderPlaceholder(), !restCount && !isCard && renderTitle(), !restCount && renderButtons()), errorMessageNode, renderProgress()), !restCount && isCard && renderTitle(true)); }; Item.displayName = 'Item'; export default observer(Item); //# sourceMappingURL=Item.js.map