UNPKG

primereact

Version:

PrimeReact is an open source UI library for React featuring a rich set of 90+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with Prime

1,016 lines (992 loc) 38.8 kB
'use client'; import * as React from 'react'; import { PrimeReactContext, localeOption } from 'primereact/api'; import { ComponentBase, useHandleStyle } from 'primereact/componentbase'; import { useMergeProps } from 'primereact/hooks'; import { classNames, ObjectUtils, IconUtils, DomHandler } from 'primereact/utils'; import { Button } from 'primereact/button'; import { PlusIcon } from 'primereact/icons/plus'; import { TimesIcon } from 'primereact/icons/times'; import { UploadIcon } from 'primereact/icons/upload'; import { Messages } from 'primereact/messages'; import { ProgressBar } from 'primereact/progressbar'; import { Ripple } from 'primereact/ripple'; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function toPropertyKey(t) { var i = toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _defineProperty(e, r, t) { return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function _arrayLikeToArray$1(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray$1(r); } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _unsupportedIterableToArray$1(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray$1(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray$1(r, a) : void 0; } } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray$1(r) || _nonIterableSpread(); } function _readOnlyError(r) { throw new TypeError('"' + r + '" is read-only'); } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray$1(r, e) || _nonIterableRest(); } var classes$1 = { root: function root(_ref) { var props = _ref.props; return classNames('p-badge p-component', _defineProperty({ 'p-badge-no-gutter': ObjectUtils.isNotEmpty(props.value) && String(props.value).length === 1, 'p-badge-dot': ObjectUtils.isEmpty(props.value), 'p-badge-lg': props.size === 'large', 'p-badge-xl': props.size === 'xlarge' }, "p-badge-".concat(props.severity), props.severity !== null)); } }; var styles$1 = "\n@layer primereact {\n .p-badge {\n display: inline-block;\n border-radius: 10px;\n text-align: center;\n padding: 0 .5rem;\n }\n \n .p-overlay-badge {\n position: relative;\n }\n \n .p-overlay-badge .p-badge {\n position: absolute;\n top: 0;\n right: 0;\n transform: translate(50%,-50%);\n transform-origin: 100% 0;\n margin: 0;\n }\n \n .p-badge-dot {\n width: .5rem;\n min-width: .5rem;\n height: .5rem;\n border-radius: 50%;\n padding: 0;\n }\n \n .p-badge-no-gutter {\n padding: 0;\n border-radius: 50%;\n }\n}\n"; var BadgeBase = ComponentBase.extend({ defaultProps: { __TYPE: 'Badge', __parentMetadata: null, value: null, severity: null, size: null, style: null, className: null, children: undefined }, css: { classes: classes$1, styles: styles$1 } }); function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var Badge = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (inProps, ref) { var mergeProps = useMergeProps(); var context = React.useContext(PrimeReactContext); var props = BadgeBase.getProps(inProps, context); var _BadgeBase$setMetaDat = BadgeBase.setMetaData(_objectSpread$1({ props: props }, props.__parentMetadata)), ptm = _BadgeBase$setMetaDat.ptm, cx = _BadgeBase$setMetaDat.cx, isUnstyled = _BadgeBase$setMetaDat.isUnstyled; useHandleStyle(BadgeBase.css.styles, isUnstyled, { name: 'badge' }); var elementRef = React.useRef(null); React.useImperativeHandle(ref, function () { return { props: props, getElement: function getElement() { return elementRef.current; } }; }); var rootProps = mergeProps({ ref: elementRef, style: props.style, className: classNames(props.className, cx('root')) }, BadgeBase.getOtherProps(props), ptm('root')); return /*#__PURE__*/React.createElement("span", rootProps, props.value); })); Badge.displayName = 'Badge'; var classes = { root: function root(_ref) { var props = _ref.props; return classNames("p-fileupload p-fileupload-".concat(props.mode, " p-component")); }, buttonbar: 'p-fileupload-buttonbar', content: 'p-fileupload-content', chooseButton: function chooseButton(_ref2) { var iconOnly = _ref2.iconOnly, disabled = _ref2.disabled, focusedState = _ref2.focusedState; return classNames('p-button p-fileupload-choose p-component', { 'p-disabled': disabled, 'p-focus': focusedState, 'p-button-icon-only': iconOnly }); }, label: 'p-button-label p-clickable', file: 'p-fileupload-row', fileName: 'p-fileupload-filename', thumbnail: 'p-fileupload-file-thumbnail', chooseButtonLabel: 'p-button-label p-clickable', basicButton: function basicButton(_ref3) { var disabled = _ref3.disabled, focusedState = _ref3.focusedState, hasFiles = _ref3.hasFiles; return classNames('p-button p-component p-fileupload-choose', { 'p-fileupload-choose-selected': hasFiles, 'p-disabled': disabled, 'p-focus': focusedState }); }, chooseIcon: function chooseIcon(_ref4) { var props = _ref4.props, iconOnly = _ref4.iconOnly; return props.mode === 'basic' ? classNames('p-button-icon', { 'p-button-icon-left': !iconOnly }) : classNames('p-button-icon p-clickable', { 'p-button-icon-left': !iconOnly }); }, uploadIcon: function uploadIcon(_ref5) { var iconOnly = _ref5.iconOnly; return classNames('p-button-icon p-c', { 'p-button-icon-left': !iconOnly }); }, cancelIcon: function cancelIcon(_ref6) { var iconOnly = _ref6.iconOnly; return classNames('p-button-icon p-c', { 'p-button-icon-left': !iconOnly }); } }; var styles = "\n@layer primereact {\n .p-fileupload-content {\n position: relative;\n }\n \n .p-fileupload-row {\n display: flex;\n align-items: center;\n }\n \n .p-fileupload-row > div {\n flex: 1 1 auto;\n width: 25%;\n }\n \n .p-fileupload-row > div:last-child {\n text-align: right;\n }\n \n .p-fileupload-content > .p-progressbar {\n width: 100%;\n position: absolute;\n top: 0;\n left: 0;\n }\n \n .p-button.p-fileupload-choose {\n position: relative;\n overflow: hidden;\n }\n \n .p-fileupload-buttonbar {\n display: flex;\n flex-wrap: wrap;\n }\n \n .p-button.p-fileupload-choose input[type='file'] {\n display: none;\n }\n \n .p-fileupload-choose.p-fileupload-choose-selected input[type='file'] {\n display: none;\n }\n \n .p-fileupload-filename {\n word-break: break-all;\n }\n \n .p-fileupload-file-thumbnail {\n flex-shrink: 0;\n }\n \n .p-fileupload-file-badge {\n margin: 0.5rem;\n }\n \n .p-fluid .p-fileupload .p-button {\n width: auto;\n }\n}\n"; var FileUploadBase = ComponentBase.extend({ defaultProps: { __TYPE: 'FileUpload', id: null, name: null, url: null, mode: 'advanced', multiple: false, accept: null, removeIcon: null, disabled: false, auto: false, maxFileSize: null, invalidFileSizeMessageSummary: '{0}: Invalid file size, ', invalidFileSizeMessageDetail: 'maximum upload size is {0}.', style: null, className: null, withCredentials: false, previewWidth: 50, chooseLabel: null, selectedFileLabel: null, uploadLabel: null, cancelLabel: null, chooseOptions: { label: null, icon: null, iconOnly: false, className: null, style: null }, uploadOptions: { label: null, icon: null, iconOnly: false, className: null, style: null }, cancelOptions: { label: null, icon: null, iconOnly: false, className: null, style: null }, customUpload: false, headerClassName: null, headerStyle: null, contentClassName: null, contentStyle: null, headerTemplate: null, itemTemplate: null, emptyTemplate: null, progressBarTemplate: null, onBeforeUpload: null, onBeforeSend: null, onBeforeDrop: null, onBeforeSelect: null, onUpload: null, onError: null, onClear: null, onSelect: null, onProgress: null, onValidationFail: null, uploadHandler: null, onRemove: null, children: undefined }, css: { classes: classes, styles: styles } }); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } var FileUpload = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (inProps, ref) { var mergeProps = useMergeProps(); var context = React.useContext(PrimeReactContext); var props = FileUploadBase.getProps(inProps, context); var _React$useState = React.useState([]), _React$useState2 = _slicedToArray(_React$useState, 2), uploadedFilesState = _React$useState2[0], setUploadedFilesState = _React$useState2[1]; var _React$useState3 = React.useState([]), _React$useState4 = _slicedToArray(_React$useState3, 2), filesState = _React$useState4[0], setFilesState = _React$useState4[1]; var _React$useState5 = React.useState(0), _React$useState6 = _slicedToArray(_React$useState5, 2), progressState = _React$useState6[0], setProgressState = _React$useState6[1]; var _React$useState7 = React.useState(false), _React$useState8 = _slicedToArray(_React$useState7, 2), focusedState = _React$useState8[0], setFocusedState = _React$useState8[1]; var _React$useState9 = React.useState(false), _React$useState10 = _slicedToArray(_React$useState9, 2), uploadingState = _React$useState10[0], setUploadingState = _React$useState10[1]; var metaData = { props: props, state: { progress: progressState, uploading: uploadingState, uploadedFiles: uploadedFilesState, files: filesState, focused: focusedState } }; var _FileUploadBase$setMe = FileUploadBase.setMetaData(metaData), ptm = _FileUploadBase$setMe.ptm, cx = _FileUploadBase$setMe.cx, isUnstyled = _FileUploadBase$setMe.isUnstyled; useHandleStyle(FileUploadBase.css.styles, isUnstyled, { name: 'fileupload' }); var fileInputRef = React.useRef(null); var messagesRef = React.useRef(null); var contentRef = React.useRef(null); var uploadedFileCount = React.useRef(0); var hasFiles = ObjectUtils.isNotEmpty(filesState); var hasUploadedFiles = ObjectUtils.isNotEmpty(uploadedFilesState); var disabled = props.disabled || uploadingState; var chooseButtonLabel = props.chooseLabel || props.chooseOptions.label || localeOption('choose'); var uploadButtonLabel = props.uploadLabel || props.uploadOptions.label || localeOption('upload'); var cancelButtonLabel = props.cancelLabel || props.cancelOptions.label || localeOption('cancel'); var chooseDisabled = disabled || props.fileLimit && props.fileLimit <= filesState.length + uploadedFileCount; var uploadDisabled = disabled || !hasFiles; var cancelDisabled = disabled || !hasFiles; var isImage = function isImage(file) { return /^image\//.test(file.type); }; var remove = function remove(event, index) { clearInput(); var currentFiles = _toConsumableArray(filesState); var removedFile = filesState[index]; currentFiles.splice(index, 1); setFilesState(currentFiles); if (props.onRemove) { props.onRemove({ originalEvent: event, file: removedFile }); } }; var removeUploadedFiles = function removeUploadedFiles(event, index) { clearInput(); var currentUploadedFiles = _toConsumableArray(uploadedFilesState); var removedFile = filesState[index]; currentUploadedFiles.splice(index, 1); setUploadedFilesState(currentUploadedFiles); if (props.onRemove) { props.onRemove({ originalEvent: event, file: removedFile }); } }; var clearInput = function clearInput() { if (fileInputRef.current) { fileInputRef.current.value = ''; } }; var formatSize = function formatSize(bytes) { var k = 1024; var dm = 3; var sizes = localeOption('fileSizeTypes'); if (bytes === 0) { return "0 ".concat(sizes[0]); } var i = Math.floor(Math.log(bytes) / Math.log(k)); var formattedSize = parseFloat((bytes / Math.pow(k, i)).toFixed(dm)); return "".concat(formattedSize, " ").concat(sizes[i]); }; var onFileSelect = function onFileSelect(event) { // give caller a chance to stop the selection if (props.onBeforeSelect && props.onBeforeSelect({ originalEvent: event, files: filesState }) === false) { return; } var currentFiles = []; if (props.multiple) { currentFiles = filesState ? _toConsumableArray(filesState) : []; } var selectedFiles = event.dataTransfer ? event.dataTransfer.files : event.target.files; for (var i = 0; i < selectedFiles.length; i++) { var file = selectedFiles[i]; if (!isFileSelected(file) && validate(file)) { file.objectURL = window.URL.createObjectURL(file); currentFiles.push(file); } } setFilesState(currentFiles); if (ObjectUtils.isNotEmpty(currentFiles) && props.auto) { upload(currentFiles); } if (props.onSelect) { props.onSelect({ originalEvent: event, files: currentFiles }); } clearInput(); if (props.mode === 'basic' && currentFiles.length > 0) { fileInputRef.current.style.display = 'none'; } }; var isFileSelected = function isFileSelected(file) { return filesState.some(function (f) { return f.name + f.type + f.size === file.name + file.type + file.size; }); }; var validate = function validate(file) { if (props.maxFileSize && file.size > props.maxFileSize) { var message = { severity: 'error', summary: props.invalidFileSizeMessageSummary.replace('{0}', file.name), detail: props.invalidFileSizeMessageDetail.replace('{0}', formatSize(props.maxFileSize)), sticky: true }; if (props.mode === 'advanced') { messagesRef.current.show(message); } props.onValidationFail && props.onValidationFail(file); return false; } return true; }; var upload = function upload(files) { files = files || filesState; if (files && files.nativeEvent) { files = filesState; } if (props.customUpload) { if (props.fileLimit) { uploadedFileCount + files.length, _readOnlyError("uploadedFileCount"); } if (props.uploadHandler) { props.uploadHandler({ files: files, options: { clear: clear, props: props } }); } } else { setUploadingState(true); var xhr = new XMLHttpRequest(); var formData = new FormData(); if (props.onBeforeUpload) { props.onBeforeUpload({ xhr: xhr, formData: formData }); } var _iterator = _createForOfIteratorHelper(files), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var file = _step.value; formData.append(props.name, file, file.name); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } xhr.upload.addEventListener('progress', function (event) { if (event.lengthComputable) { var progress = Math.round(event.loaded * 100 / event.total); setProgressState(progress); if (props.onProgress) { props.onProgress({ originalEvent: event, progress: progress }); } } }); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { setProgressState(0); setUploadingState(false); if (xhr.status >= 200 && xhr.status < 300) { if (props.fileLimit) { uploadedFileCount + files.length, _readOnlyError("uploadedFileCount"); } if (props.onUpload) { props.onUpload({ xhr: xhr, files: files }); } } else if (props.onError) { props.onError({ xhr: xhr, files: files }); } clear(); setUploadedFilesState(function (prevUploadedFiles) { return [].concat(_toConsumableArray(prevUploadedFiles), _toConsumableArray(files)); }); } }; xhr.open('POST', props.url, true); if (props.onBeforeSend) { props.onBeforeSend({ xhr: xhr, formData: formData }); } xhr.withCredentials = props.withCredentials; xhr.send(formData); } }; var clear = function clear() { setFilesState([]); setUploadedFilesState([]); setUploadingState(false); props.onClear && props.onClear(); clearInput(); }; var choose = function choose() { fileInputRef.current.click(); }; var onFocus = function onFocus() { setFocusedState(true); }; var onBlur = function onBlur() { setFocusedState(false); }; var _onKeyDown = function onKeyDown(event) { if (event.code === 'Enter' || event.code === 'NumpadEnter') { choose(); } }; var _onDragEnter = function onDragEnter(event) { if (!disabled) { event.dataTransfer.dropEffect = 'copy'; event.stopPropagation(); event.preventDefault(); } }; var _onDragOver = function onDragOver(event) { if (!disabled) { event.dataTransfer.dropEffect = 'copy'; !isUnstyled() && DomHandler.addClass(contentRef.current, 'p-fileupload-highlight'); contentRef.current.setAttribute('data-p-highlight', true); event.stopPropagation(); event.preventDefault(); } }; var _onDragLeave = function onDragLeave(event) { if (!disabled) { event.dataTransfer.dropEffect = 'copy'; !isUnstyled() && DomHandler.removeClass(contentRef.current, 'p-fileupload-highlight'); contentRef.current.setAttribute('data-p-highlight', false); } }; var _onDrop = function onDrop(event) { if (props.disabled) { return; } !isUnstyled() && DomHandler.removeClass(contentRef.current, 'p-fileupload-highlight'); contentRef.current.setAttribute('data-p-highlight', false); event.stopPropagation(); event.preventDefault(); // give caller a chance to stop the drop if (props.onBeforeDrop && props.onBeforeDrop(event) === false) { return; } var files = event.dataTransfer ? event.dataTransfer.files : event.target.files; var allowDrop = props.multiple || ObjectUtils.isEmpty(filesState) && files && files.length === 1; allowDrop && onFileSelect(event); }; var onSimpleUploaderClick = function onSimpleUploaderClick() { !disabled && hasFiles ? upload() : fileInputRef.current.click(); }; React.useImperativeHandle(ref, function () { return { props: props, upload: upload, clear: clear, formatSize: formatSize, onFileSelect: onFileSelect, getInput: function getInput() { return fileInputRef.current; }, getContent: function getContent() { return contentRef.current; }, getFiles: function getFiles() { return filesState; }, setFiles: function setFiles(files) { return setFilesState(files || []); }, getUploadedFiles: function getUploadedFiles() { return uploadedFilesState; }, setUploadedFiles: function setUploadedFiles(files) { return setUploadedFilesState(files || []); } }; }); var createChooseButton = function createChooseButton() { var _props$chooseOptions = props.chooseOptions, className = _props$chooseOptions.className, style = _props$chooseOptions.style, _icon = _props$chooseOptions.icon, iconOnly = _props$chooseOptions.iconOnly; var chooseButtonLabelProps = mergeProps({ className: cx('chooseButtonLabel') }, ptm('chooseButtonLabel')); var label = iconOnly ? /*#__PURE__*/React.createElement("span", _extends({}, chooseButtonLabelProps, { dangerouslySetInnerHTML: { __html: '&nbsp;' } })) : /*#__PURE__*/React.createElement("span", chooseButtonLabelProps, chooseButtonLabel); var inputProps = mergeProps({ ref: fileInputRef, type: 'file', onChange: function onChange(e) { return onFileSelect(e); }, multiple: props.multiple, accept: props.accept, disabled: chooseDisabled }, ptm('input')); var input = /*#__PURE__*/React.createElement("input", inputProps); var chooseIconProps = mergeProps({ className: cx('chooseIcon', { iconOnly: iconOnly }), 'aria-hidden': 'true' }, ptm('chooseIcon')); var icon = _icon || /*#__PURE__*/React.createElement(PlusIcon, chooseIconProps); var chooseIcon = IconUtils.getJSXIcon(icon, _objectSpread({}, chooseIconProps), { props: props }); var chooseButtonProps = mergeProps({ className: classNames(className, cx('chooseButton', { iconOnly: iconOnly, disabled: disabled, className: className, focusedState: focusedState })), style: style, onClick: choose, onKeyDown: function onKeyDown(e) { return _onKeyDown(e); }, onFocus: onFocus, onBlur: onBlur, tabIndex: 0, 'data-p-disabled': disabled, 'data-p-focus': focusedState }, ptm('chooseButton')); return /*#__PURE__*/React.createElement("span", chooseButtonProps, input, chooseIcon, label, /*#__PURE__*/React.createElement(Ripple, null)); }; var onRemoveClick = function onRemoveClick(e, badgeOptions, index) { if (badgeOptions.severity === 'warning') { remove(e, index); } else { removeUploadedFiles(e, index); } }; var createFile = function createFile(file, index, badgeOptions) { var key = file.name + file.type + file.size; var thumbnailProps = mergeProps({ role: 'presentation', className: cx('thumbnail'), src: file.objectURL, width: props.previewWidth }, ptm('thumbnail')); var preview = isImage(file) ? /*#__PURE__*/React.createElement("img", _extends({}, thumbnailProps, { alt: file.name })) : null; var detailsProps = mergeProps(ptm('details')); var fileSizeProps = mergeProps(ptm('fileSize')); var fileNameProps = mergeProps({ className: cx('fileName') }, ptm('fileName')); var actionsProps = mergeProps(ptm('actions')); var fileName = /*#__PURE__*/React.createElement("div", fileNameProps, file.name); var size = /*#__PURE__*/React.createElement("div", fileSizeProps, formatSize(file.size)); var contentBody = /*#__PURE__*/React.createElement("div", detailsProps, /*#__PURE__*/React.createElement("div", fileNameProps, " ", file.name), /*#__PURE__*/React.createElement("span", fileSizeProps, formatSize(file.size)), /*#__PURE__*/React.createElement(Badge, { className: "p-fileupload-file-badge", value: badgeOptions.value, severity: badgeOptions.severity, pt: ptm('badge'), __parentMetadata: { parent: metaData } })); var removeButton = /*#__PURE__*/React.createElement("div", actionsProps, /*#__PURE__*/React.createElement(Button, { type: "button", icon: props.removeIcon || /*#__PURE__*/React.createElement(TimesIcon, null), text: true, rounded: true, severity: "danger", onClick: function onClick(e) { return onRemoveClick(e, badgeOptions, index); }, disabled: disabled, pt: ptm('removeButton'), __parentMetadata: { parent: metaData }, unstyled: isUnstyled() })); var content = /*#__PURE__*/React.createElement(React.Fragment, null, preview, contentBody, removeButton); if (props.itemTemplate) { var defaultContentOptions = { onRemove: function onRemove(event) { return remove(event, index); }, previewElement: preview, fileNameElement: fileName, sizeElement: size, removeElement: removeButton, formatSize: formatSize(file.size), element: content, index: index, props: props }; content = ObjectUtils.getJSXElement(props.itemTemplate, file, defaultContentOptions); } var fileProps = mergeProps({ key: key, className: cx('file') }, ptm('file')); return /*#__PURE__*/React.createElement("div", fileProps, content); }; var createFiles = function createFiles() { var badgeOptions = { severity: 'warning', value: localeOption('pending') || 'Pending' }; var content = filesState.map(function (file, index) { return createFile(file, index, badgeOptions); }); return /*#__PURE__*/React.createElement("div", null, content); }; var createUploadedFiles = function createUploadedFiles() { var badgeOptions = { severity: 'success', value: localeOption('completed') || 'Completed' }; var content = uploadedFilesState && uploadedFilesState.map(function (file, index) { return createFile(file, index, badgeOptions); }); return /*#__PURE__*/React.createElement("div", null, content); }; var createEmptyContent = function createEmptyContent() { return props.emptyTemplate && !hasFiles && !hasUploadedFiles ? ObjectUtils.getJSXElement(props.emptyTemplate, props) : null; }; var createProgressBarContent = function createProgressBarContent() { if (props.progressBarTemplate) { var defaultProgressBarTemplateOptions = { progress: progressState, props: props }; return ObjectUtils.getJSXElement(props.progressBarTemplate, defaultProgressBarTemplateOptions); } return /*#__PURE__*/React.createElement(ProgressBar, { value: progressState, showValue: false, pt: ptm('progressbar'), __parentMetadata: { parent: metaData } }); }; var createAdvanced = function createAdvanced() { var chooseButton = createChooseButton(); var emptyContent = createEmptyContent(); var uploadButton; var cancelButton; var filesList; var uplaodedFilesList; var progressBar; if (!props.auto) { var uploadOptions = props.uploadOptions; var cancelOptions = props.cancelOptions; var uploadLabel = !uploadOptions.iconOnly ? uploadButtonLabel : ''; var cancelLabel = !cancelOptions.iconOnly ? cancelButtonLabel : ''; var uploadIconProps = mergeProps({ className: cx('uploadIcon', { iconOnly: uploadOptions.iconOnly }), 'aria-hidden': 'true' }, ptm('uploadIcon')); var uploadIcon = IconUtils.getJSXIcon(uploadOptions.icon || /*#__PURE__*/React.createElement(UploadIcon, uploadIconProps), _objectSpread({}, uploadIconProps), { props: props }); var cancelIconProps = mergeProps({ className: cx('cancelIcon', { iconOnly: cancelOptions.iconOnly }), 'aria-hidden': 'true' }, ptm('cancelIcon')); var cancelIcon = IconUtils.getJSXIcon(cancelOptions.icon || /*#__PURE__*/React.createElement(TimesIcon, cancelIconProps), _objectSpread({}, cancelIconProps), { props: props }); uploadButton = /*#__PURE__*/React.createElement(Button, { type: "button", label: uploadLabel, "aria-hidden": "true", icon: uploadIcon, onClick: upload, disabled: uploadDisabled, style: uploadOptions.style, className: uploadOptions.className, pt: ptm('uploadButton'), __parentMetadata: { parent: metaData }, unstyled: isUnstyled() }); cancelButton = /*#__PURE__*/React.createElement(Button, { type: "button", label: cancelLabel, "aria-hidden": "true", icon: cancelIcon, onClick: clear, disabled: cancelDisabled, style: cancelOptions.style, className: cancelOptions.className, pt: ptm('cancelButton'), __parentMetadata: { parent: metaData }, unstyled: isUnstyled() }); } if (hasFiles) { filesList = createFiles(); progressBar = createProgressBarContent(); } if (hasUploadedFiles) { uplaodedFilesList = createUploadedFiles(); } var buttonbarProps = mergeProps({ className: classNames(props.headerClassName, cx('buttonbar')), style: props.headerStyle }, ptm('buttonbar')); var header = /*#__PURE__*/React.createElement("div", buttonbarProps, chooseButton, uploadButton, cancelButton); if (props.headerTemplate) { var defaultContentOptions = { className: classNames('p-fileupload-buttonbar', props.headerClassName), chooseButton: chooseButton, uploadButton: uploadButton, cancelButton: cancelButton, element: header, props: props }; header = ObjectUtils.getJSXElement(props.headerTemplate, defaultContentOptions); } var rootProps = mergeProps({ id: props.id, className: classNames(props.className, cx('root')), style: props.style }, FileUploadBase.getOtherProps(props), ptm('root')); var contentProps = mergeProps({ ref: contentRef, className: classNames(props.contentClassName, cx('content')), style: props.contentStyle, onDragEnter: function onDragEnter(e) { return _onDragEnter(e); }, onDragOver: function onDragOver(e) { return _onDragOver(e); }, onDragLeave: function onDragLeave(e) { return _onDragLeave(e); }, onDrop: function onDrop(e) { return _onDrop(e); }, 'data-p-highlight': false }, ptm('content')); return /*#__PURE__*/React.createElement("div", rootProps, header, /*#__PURE__*/React.createElement("div", contentProps, progressBar, /*#__PURE__*/React.createElement(Messages, { ref: messagesRef, __parentMetadata: { parent: metaData } }), hasFiles ? filesList : null, hasUploadedFiles ? uplaodedFilesList : null, emptyContent)); }; var createBasic = function createBasic() { var chooseOptions = props.chooseOptions; var labelProps = mergeProps({ className: cx('label') }, ptm('label')); var chooseLabel = chooseOptions.iconOnly ? /*#__PURE__*/React.createElement("span", _extends({}, labelProps, { dangerouslySetInnerHTML: { __html: '&nbsp;' } })) : /*#__PURE__*/React.createElement("span", labelProps, chooseButtonLabel); var label = props.auto ? chooseLabel : /*#__PURE__*/React.createElement("span", labelProps, hasFiles ? props.selectedFileLabel || filesState[0].name : chooseLabel); var chooseIconProps = mergeProps({ className: cx('chooseIcon', { iconOnly: chooseOptions.iconOnly }) }, ptm('chooseIcon')); var icon = chooseOptions.icon ? chooseOptions.icon : !chooseOptions.icon && (!hasFiles || props.auto) ? /*#__PURE__*/React.createElement(PlusIcon, chooseIconProps) : !chooseOptions.icon && hasFiles && !props.auto && /*#__PURE__*/React.createElement(UploadIcon, chooseIconProps); var chooseIcon = IconUtils.getJSXIcon(icon, _objectSpread({}, chooseIconProps), { props: props, hasFiles: hasFiles }); var inputProps = mergeProps({ ref: fileInputRef, type: 'file', onChange: function onChange(e) { return onFileSelect(e); }, multiple: props.multiple, accept: props.accept, disabled: disabled }, ptm('input')); var input = !hasFiles && /*#__PURE__*/React.createElement("input", inputProps); var rootProps = mergeProps({ className: classNames(props.className, cx('root')), style: props.style }, FileUploadBase.getOtherProps(props), ptm('root')); var basicButtonProps = mergeProps({ className: classNames(chooseOptions.className, cx('basicButton', { hasFiles: hasFiles, disabled: disabled, focusedState: focusedState })), style: chooseOptions.style, tabIndex: 0, onClick: onSimpleUploaderClick, onKeyDown: function onKeyDown(e) { return _onKeyDown(e); }, onFocus: onFocus, onBlur: onBlur }, FileUploadBase.getOtherProps(props), ptm('basicButton')); return /*#__PURE__*/React.createElement("div", rootProps, /*#__PURE__*/React.createElement(Messages, { ref: messagesRef, pt: ptm('message'), __parentMetadata: { parent: metaData } }), /*#__PURE__*/React.createElement("span", basicButtonProps, chooseIcon, label, input, /*#__PURE__*/React.createElement(Ripple, null))); }; if (props.mode === 'advanced') { return createAdvanced(); } else if (props.mode === 'basic') { return createBasic(); } })); FileUpload.displayName = 'FileUpload'; export { FileUpload };