Server IP : 80.87.202.40 / Your IP : 216.73.216.169 Web Server : Apache System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64 User : bitrix ( 600) PHP Version : 8.2.27 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /home/bitrix/ext_www/rospirotorg.ru/bitrix/js/ui/uploader/core/dist/ |
Upload File : |
/* eslint-disable */ this.BX = this.BX || {}; this.BX.UI = this.BX.UI || {}; (function (exports,main_core_events,main_core) { 'use strict'; /** * @namespace BX.UI.Uploader */ /** * @namespace BX.UI.Uploader */ const FileStatus = { INIT: 'init', ADDED: 'added', LOADING: 'loading', PENDING: 'pending', PREPARING: 'preparing', UPLOADING: 'uploading', COMPLETE: 'complete', // REMOVING: 'removing', // REMOVE_FAILED: 'remove-failed', LOAD_FAILED: 'load-failed', UPLOAD_FAILED: 'upload-failed' }; /** * @namespace BX.UI.Uploader */ const FileOrigin = { CLIENT: 'client', SERVER: 'server' }; /** * @namespace BX.UI.Uploader */ const FileEvent = { ADD: 'onAdd', BEFORE_UPLOAD: 'onBeforeUpload', UPLOAD_START: 'onUploadStart', UPLOAD_ERROR: 'onUploadError', UPLOAD_PROGRESS: 'onUploadProgress', UPLOAD_COMPLETE: 'onUploadComplete', UPLOAD_CONTROLLER_INIT: 'onUploadControllerInit', LOAD_START: 'onLoadStart', LOAD_PROGRESS: 'onLoadProgress', LOAD_COMPLETE: 'onLoadComplete', LOAD_ERROR: 'onLoadError', LOAD_CONTROLLER_INIT: 'onLoadControllerInit', REMOVE_ERROR: 'onRemoveError', REMOVE_COMPLETE: 'onRemoveComplete', REMOVE_CONTROLLER_INIT: 'onRemoveControllerInit', STATE_CHANGE: 'onStateChange', STATUS_CHANGE: 'onStatusChange', VALIDATE_FILE_ASYNC: 'onValidateFileAsync', PREPARE_FILE_ASYNC: 'onPrepareFileAsync' }; const getFileExtension = filename => { const position = main_core.Type.isStringFilled(filename) ? filename.lastIndexOf('.') : -1; return position > 0 ? filename.slice(Math.max(0, position + 1)) : ''; }; let videoExtensions = null; const isSupportedVideo = (file, mimeType = null) => { if (videoExtensions === null) { videoExtensions = Uploader.getVideoExtensions(); } const fileName = main_core.Type.isFile(file) ? file.name : file; const type = main_core.Type.isFile(file) ? file.type : mimeType; const extension = getFileExtension(fileName).toLowerCase(); return videoExtensions.includes(extension) && (type === null || /^video\/[\d.a-z-]+$/i.test(type)); }; /** * @namespace BX.UI.Uploader */ class UploaderError extends main_core.BaseError { /** * new UploaderError(code) * new UploaderError(code, customData) * new UploaderError(code, message) * new UploaderError(code, message, description) * new UploaderError(code, message, customData) * new UploaderError(code, message, description, customData) */ constructor(code, ...args) { let message = main_core.Type.isString(args[0]) ? args[0] : null; let description = main_core.Type.isString(args[1]) ? args[1] : null; const customData = main_core.Type.isPlainObject(args[args.length - 1]) ? args[args.length - 1] : {}; const replacements = {}; Object.keys(customData).forEach(key => { replacements[`#${key}#`] = customData[key]; }); if (!main_core.Type.isString(message) && main_core.Loc.hasMessage(`UPLOADER_${code}`)) { message = main_core.Loc.getMessage(`UPLOADER_${code}`, replacements); } if (main_core.Type.isStringFilled(message) && !main_core.Type.isString(description) && main_core.Loc.hasMessage(`UPLOADER_${code}_DESC`)) { description = main_core.Loc.getMessage(`UPLOADER_${code}_DESC`, replacements); } super(message, code, customData); this.description = ''; this.origin = UploaderError.Origin.CLIENT; this.type = UploaderError.Type.USER; this.setDescription(description); } static createFromAjaxErrors(errors) { if (!main_core.Type.isArrayFilled(errors) || !main_core.Type.isPlainObject(errors[0])) { return new this('SERVER_ERROR'); } const uploaderError = errors.find(error => { return error.type === 'file-uploader'; }); if (uploaderError && !uploaderError.system) { // Take the First Uploader User Error const { code, message, description, customData } = uploaderError; const error = new this(code, message, description, customData); error.setOrigin(UploaderError.Origin.SERVER); error.setType(UploaderError.Type.USER); return error; } let { code, message, description } = errors[0]; const { customData, system, type } = errors[0]; if (code === 'NETWORK_ERROR') { message = main_core.Loc.getMessage('UPLOADER_NETWORK_ERROR'); } else { code = main_core.Type.isStringFilled(code) ? code : 'SERVER_ERROR'; if (!main_core.Type.isStringFilled(description)) { description = message; message = main_core.Loc.getMessage('UPLOADER_SERVER_ERROR'); } } console.error('Uploader', errors); const error = new this(code, message, description, customData); error.setOrigin(UploaderError.Origin.SERVER); if (type === 'file-uploader') { error.setType(system ? UploaderError.Type.SYSTEM : UploaderError.Type.USER); } else { error.setType(UploaderError.Type.UNKNOWN); } return error; } static createFromError(error) { return new this(error.name, error.message); } getDescription() { return this.description; } setDescription(text) { if (main_core.Type.isString(text)) { this.description = text; } return this; } getOrigin() { return this.origin; } setOrigin(origin) { if (Object.values(UploaderError.Origin).includes(origin)) { this.origin = origin; } return this; } getType() { return this.type; } setType(type) { if (main_core.Type.isStringFilled(type)) { this.type = type; } return this; } clone() { const options = JSON.parse(JSON.stringify(this)); const error = new UploaderError(options.code, options.message, options.description, options.customData); error.setOrigin(options.origin); error.setType(options.type); return error; } toString() { return `Uploader Error (${this.getCode()}): ${this.getMessage()} (${this.getOrigin()})`; } toJSON() { return { code: this.getCode(), message: this.getMessage(), description: this.getDescription(), origin: this.getOrigin(), type: this.getType(), customData: this.getCustomData() }; } } UploaderError.Origin = { SERVER: 'server', CLIENT: 'client' }; UploaderError.Type = { USER: 'user', SYSTEM: 'system', UNKNOWN: 'unknown' }; var _server = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("server"); var _options = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("options"); class AbstractUploadController extends main_core_events.EventEmitter { constructor(server, options = {}) { super(); Object.defineProperty(this, _server, { writable: true, value: void 0 }); Object.defineProperty(this, _options, { writable: true, value: void 0 }); this.setEventNamespace('BX.UI.Uploader.UploadController'); babelHelpers.classPrivateFieldLooseBase(this, _server)[_server] = server; babelHelpers.classPrivateFieldLooseBase(this, _options)[_options] = options; } getServer() { return babelHelpers.classPrivateFieldLooseBase(this, _server)[_server]; } getOptions() { return babelHelpers.classPrivateFieldLooseBase(this, _options)[_options]; } getOption(option, defaultValue) { if (!main_core.Type.isUndefined(babelHelpers.classPrivateFieldLooseBase(this, _options)[_options][option])) { return babelHelpers.classPrivateFieldLooseBase(this, _options)[_options][option]; } if (!main_core.Type.isUndefined(defaultValue)) { return defaultValue; } return null; } upload(file) { throw new Error('You must implement upload() method.'); } abort() { throw new Error('You must implement abort() method.'); } } var _server$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("server"); var _options$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("options"); class AbstractLoadController extends main_core_events.EventEmitter { constructor(server, options = {}) { super(); Object.defineProperty(this, _server$1, { writable: true, value: void 0 }); Object.defineProperty(this, _options$1, { writable: true, value: void 0 }); this.setEventNamespace('BX.UI.Uploader.LoadController'); babelHelpers.classPrivateFieldLooseBase(this, _server$1)[_server$1] = server; babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1] = options; } getServer() { return babelHelpers.classPrivateFieldLooseBase(this, _server$1)[_server$1]; } getOptions() { return babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1]; } getOption(option, defaultValue) { if (!main_core.Type.isUndefined(babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1][option])) { return babelHelpers.classPrivateFieldLooseBase(this, _options$1)[_options$1][option]; } if (!main_core.Type.isUndefined(defaultValue)) { return defaultValue; } return null; } load(file) { throw new Error('You must implement load() method.'); } abort() { throw new Error('You must implement abort() method.'); } } var _server$2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("server"); var _options$2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("options"); class AbstractRemoveController extends main_core_events.EventEmitter { constructor(server, options = {}) { super(); Object.defineProperty(this, _server$2, { writable: true, value: void 0 }); Object.defineProperty(this, _options$2, { writable: true, value: void 0 }); this.setEventNamespace('BX.UI.Uploader.RemoveController'); babelHelpers.classPrivateFieldLooseBase(this, _server$2)[_server$2] = server; babelHelpers.classPrivateFieldLooseBase(this, _options$2)[_options$2] = options; } getServer() { return babelHelpers.classPrivateFieldLooseBase(this, _server$2)[_server$2]; } getOptions() { return babelHelpers.classPrivateFieldLooseBase(this, _options$2)[_options$2]; } getOption(option, defaultValue) { if (!main_core.Type.isUndefined(babelHelpers.classPrivateFieldLooseBase(this, _options$2)[_options$2][option])) { return babelHelpers.classPrivateFieldLooseBase(this, _options$2)[_options$2][option]; } if (!main_core.Type.isUndefined(defaultValue)) { return defaultValue; } return null; } remove(file) { throw new Error('You must implement remove() method.'); } } /* eslint-disable @bitrix24/bitrix24-rules/no-typeof */ let crypto = window.crypto || window.msCrypto; if (!crypto && typeof process === 'object') { // eslint-disable-next-line no-undef crypto = require('crypto').webcrypto; } const createUniqueId = () => { return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replaceAll(/[018]/g, part => (part ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> part / 4).toString(16)); }; const getExtensionFromType = type => { if (!main_core.Type.isStringFilled(type)) { return ''; } const subtype = type.split('/').pop(); if (/javascript/.test(subtype)) { return 'js'; } if (/plain/.test(subtype)) { return 'txt'; } if (/svg/.test(subtype)) { return 'svg'; } if (/[a-z]+/.test(subtype)) { return subtype; } return ''; }; let counter = 0; const createFileFromBlob = (blob, fileName) => { let newFileName = fileName; if (!main_core.Type.isStringFilled(newFileName)) { const date = new Date(); newFileName = `File ${date.getFullYear()}-${date.getMonth()}-${date.getDate()}-${++counter}`; const extension = getExtensionFromType(blob.type); if (extension) { newFileName += `.${extension}`; } } try { return new File([blob], newFileName, { lastModified: Date.now(), lastModifiedDate: new Date(), type: blob.type }); } catch { const file = blob.slice(0, blob.size, blob.type); file.name = newFileName; file.lastModified = Date.now(); file.lastModifiedDate = new Date(); return file; } }; const regexp = /^data:((?:\w+\/(?:(?!;).)+)?)((?:;[\W\w]*?[^;])*),(.+)$/; const isDataUri = str => { return main_core.Type.isString(str) ? str.match(regexp) : false; }; const createBlobFromDataUri = dataURI => { const byteString = atob(dataURI.split(',')[1]); const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; const buffer = new ArrayBuffer(byteString.length); const view = new Uint8Array(buffer); for (let i = 0; i < byteString.length; i++) { view[i] = byteString.codePointAt(i); } return new Blob([buffer], { type: mimeString }); }; const imageExtensions = new Set(['jpg', 'bmp', 'jpeg', 'jpe', 'gif', 'png', 'webp']); const isResizableImage = (file, mimeType = null) => { const fileName = main_core.Type.isFile(file) ? file.name : file; const type = main_core.Type.isFile(file) ? file.type : mimeType; const extension = getFileExtension(fileName).toLowerCase(); return imageExtensions.has(extension) && (type === null || /^image\/[\d.a-z-]+$/i.test(type)); }; const formatFileSize = (size, base = 1024) => { let i = 0; const units = getUnits(); let currentSize = size; while (currentSize >= base && units[i + 1]) { currentSize /= base; i++; } return (main_core.Type.isInteger(currentSize) ? currentSize : currentSize.toFixed(1)) + units[i]; }; let fileSizeUnits = null; const getUnits = () => { if (fileSizeUnits !== null) { return fileSizeUnits; } const units = main_core.Loc.getMessage('UPLOADER_FILE_SIZE_POSTFIXES').split(/\|/); fileSizeUnits = main_core.Type.isArrayFilled(units) ? units : ['B', 'kB', 'MB', 'GB', 'TB']; return fileSizeUnits; }; // eslint-disable-next-line max-classes-per-file var _id = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id"); var _file = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("file"); var _serverFileId = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("serverFileId"); var _name = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("name"); var _size = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("size"); var _type = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("type"); var _width = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("width"); var _height = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("height"); var _animated = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("animated"); var _treatImageAsFile = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("treatImageAsFile"); var _clientPreview = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("clientPreview"); var _clientPreviewUrl = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("clientPreviewUrl"); var _clientPreviewWidth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("clientPreviewWidth"); var _clientPreviewHeight = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("clientPreviewHeight"); var _serverPreviewUrl = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("serverPreviewUrl"); var _serverPreviewWidth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("serverPreviewWidth"); var _serverPreviewHeight = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("serverPreviewHeight"); var _downloadUrl = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("downloadUrl"); var _status = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("status"); var _origin = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("origin"); var _errors = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("errors"); var _progress = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("progress"); var _customData = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("customData"); var _uploadController = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("uploadController"); var _loadController = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("loadController"); var _removeController = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("removeController"); var _forceServerLoad = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("forceServerLoad"); var _uploadCallbacks = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("uploadCallbacks"); var _setStatus = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setStatus"); class UploaderFile extends main_core_events.EventEmitter { constructor(source, fileOptions = {}) { super(); Object.defineProperty(this, _setStatus, { value: _setStatus2 }); Object.defineProperty(this, _id, { writable: true, value: null }); Object.defineProperty(this, _file, { writable: true, value: null }); Object.defineProperty(this, _serverFileId, { writable: true, value: null }); Object.defineProperty(this, _name, { writable: true, value: null }); Object.defineProperty(this, _size, { writable: true, value: 0 }); Object.defineProperty(this, _type, { writable: true, value: '' }); Object.defineProperty(this, _width, { writable: true, value: null }); Object.defineProperty(this, _height, { writable: true, value: null }); Object.defineProperty(this, _animated, { writable: true, value: false }); Object.defineProperty(this, _treatImageAsFile, { writable: true, value: false }); Object.defineProperty(this, _clientPreview, { writable: true, value: null }); Object.defineProperty(this, _clientPreviewUrl, { writable: true, value: null }); Object.defineProperty(this, _clientPreviewWidth, { writable: true, value: null }); Object.defineProperty(this, _clientPreviewHeight, { writable: true, value: null }); Object.defineProperty(this, _serverPreviewUrl, { writable: true, value: null }); Object.defineProperty(this, _serverPreviewWidth, { writable: true, value: null }); Object.defineProperty(this, _serverPreviewHeight, { writable: true, value: null }); Object.defineProperty(this, _downloadUrl, { writable: true, value: null }); Object.defineProperty(this, _status, { writable: true, value: FileStatus.INIT }); Object.defineProperty(this, _origin, { writable: true, value: FileOrigin.CLIENT }); Object.defineProperty(this, _errors, { writable: true, value: [] }); Object.defineProperty(this, _progress, { writable: true, value: 0 }); Object.defineProperty(this, _customData, { writable: true, value: Object.create(null) }); Object.defineProperty(this, _uploadController, { writable: true, value: null }); Object.defineProperty(this, _loadController, { writable: true, value: null }); Object.defineProperty(this, _removeController, { writable: true, value: null }); Object.defineProperty(this, _forceServerLoad, { writable: true, value: false }); Object.defineProperty(this, _uploadCallbacks, { writable: true, value: new CallbackCollection(this) }); this.setEventNamespace('BX.UI.Uploader.File'); const options = main_core.Type.isPlainObject(fileOptions) ? fileOptions : {}; if (main_core.Type.isFile(source)) { babelHelpers.classPrivateFieldLooseBase(this, _file)[_file] = source; this.update(options); } else if (main_core.Type.isBlob(source)) { babelHelpers.classPrivateFieldLooseBase(this, _file)[_file] = createFileFromBlob(source, options.name || source.name); this.update(options); } else if (isDataUri(source)) { const blob = createBlobFromDataUri(source); babelHelpers.classPrivateFieldLooseBase(this, _file)[_file] = createFileFromBlob(blob, options.name); this.update(options); } else if (main_core.Type.isNumber(source) || main_core.Type.isStringFilled(source)) { babelHelpers.classPrivateFieldLooseBase(this, _origin)[_origin] = FileOrigin.SERVER; babelHelpers.classPrivateFieldLooseBase(this, _serverFileId)[_serverFileId] = source; this.update(options); } else if (main_core.Type.isPlainObject(source) && (main_core.Type.isNumber(source.serverFileId) || main_core.Type.isStringFilled(source.serverFileId))) { babelHelpers.classPrivateFieldLooseBase(this, _origin)[_origin] = FileOrigin.SERVER; this.update(source); } babelHelpers.classPrivateFieldLooseBase(this, _id)[_id] = main_core.Type.isStringFilled(options.id) ? options.id : createUniqueId(); if (babelHelpers.classPrivateFieldLooseBase(this, _origin)[_origin] === FileOrigin.SERVER) { babelHelpers.classPrivateFieldLooseBase(this, _forceServerLoad)[_forceServerLoad] = options.preload === true || main_core.Type.isPlainObject(source) && source.preload === true; } this.subscribeFromOptions({ [FileEvent.ADD]: () => { babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.ADDED); } }); this.subscribeFromOptions(options.events); } load() { if (!this.canLoad()) { return; } babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.LOADING); this.emit(FileEvent.LOAD_START); babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController].load(this); } shouldForceServerLoad() { return babelHelpers.classPrivateFieldLooseBase(this, _forceServerLoad)[_forceServerLoad]; } upload(callbacks = {}) { babelHelpers.classPrivateFieldLooseBase(this, _uploadCallbacks)[_uploadCallbacks].subscribe(callbacks); if (this.isComplete() && this.isUploadable()) { babelHelpers.classPrivateFieldLooseBase(this, _uploadCallbacks)[_uploadCallbacks].emit('onComplete'); return; } if (this.isUploadFailed()) { babelHelpers.classPrivateFieldLooseBase(this, _uploadCallbacks)[_uploadCallbacks].emit('onError', { error: this.getError() }); return; } if (!this.canUpload()) { babelHelpers.classPrivateFieldLooseBase(this, _uploadCallbacks)[_uploadCallbacks].emit('onError', { error: new UploaderError('FILE_UPLOAD_NOT_ALLOWED') }); return; } const event = new main_core_events.BaseEvent({ data: { file: this } }); this.emit(FileEvent.BEFORE_UPLOAD, event); if (event.isDefaultPrevented()) { return; } babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.PREPARING); const prepareEvent = new main_core_events.BaseEvent({ data: { file: this } }); this.emitAsync(FileEvent.PREPARE_FILE_ASYNC, prepareEvent).then(() => { babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.UPLOADING); this.emit(FileEvent.UPLOAD_START); babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController].upload(this); }).catch(prepareError => { const error = this.addError(prepareError); babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.UPLOAD_FAILED); this.emit(FileEvent.UPLOAD_ERROR, { error }); }); } remove(options) { if (this.getStatus() === FileStatus.INIT) { return; } babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.INIT); this.emit(FileEvent.REMOVE_COMPLETE); this.abort(); // this.#setStatus(FileStatus.REMOVING); // this.#removeController.remove(this); const removeFromServer = !options || options.removeFromServer !== false; if (removeFromServer && babelHelpers.classPrivateFieldLooseBase(this, _removeController)[_removeController] !== null && this.getOrigin() === FileOrigin.CLIENT) { babelHelpers.classPrivateFieldLooseBase(this, _removeController)[_removeController].remove(this); } babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController] = null; babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController] = null; babelHelpers.classPrivateFieldLooseBase(this, _removeController)[_removeController] = null; } // stop(): void // { // if (this.isUploading()) // { // this.abort(); // this.setStatus(FileStatus.PENDING); // } // } // // resume(): void // { // // } // retry(): void // { // // TODO // } abort() { if (this.isLoading()) { babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.LOAD_FAILED); const error = new UploaderError('FILE_LOAD_ABORTED'); this.emit(FileEvent.LOAD_ERROR, { error }); } else if (this.isUploading()) { babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.UPLOAD_FAILED); const error = new UploaderError('FILE_UPLOAD_ABORTED'); this.emit('onUploadError', { error }); babelHelpers.classPrivateFieldLooseBase(this, _uploadCallbacks)[_uploadCallbacks].emit('onError', { error }); } if (babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController]) { babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController].abort(); } if (babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController]) { babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController].abort(); } } getUploadController() { return babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController]; } setUploadController(controller) { if (!(controller instanceof AbstractUploadController) && !main_core.Type.isNull(controller)) { return; } const changed = babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController] !== controller; babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController] = controller; if (babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController] && changed) { babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController].subscribeOnce('onError', event => { const error = this.addError(event.getData().error); babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.UPLOAD_FAILED); this.emit(FileEvent.UPLOAD_ERROR, { error }); babelHelpers.classPrivateFieldLooseBase(this, _uploadCallbacks)[_uploadCallbacks].emit('onError', { error }); }); babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController].subscribe('onProgress', event => { const { progress } = event.getData(); this.setProgress(progress); this.emit(FileEvent.UPLOAD_PROGRESS, { progress }); }); babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController].subscribeOnce('onUpload', event => { babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.COMPLETE); this.update(event.getData().fileInfo); this.emit(FileEvent.UPLOAD_COMPLETE); babelHelpers.classPrivateFieldLooseBase(this, _uploadCallbacks)[_uploadCallbacks].emit('onComplete'); }); } if (changed) { this.emit(FileEvent.UPLOAD_CONTROLLER_INIT, { controller }); } } setLoadController(controller) { if (!(controller instanceof AbstractLoadController)) { return; } const changed = babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController] !== controller; babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController] = controller; if (babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController] && changed) { babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController].subscribeOnce('onError', event => { const error = this.addError(event.getData().error); babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.LOAD_FAILED); this.emit(FileEvent.LOAD_ERROR, { error }); }); babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController].subscribe('onProgress', event => { const { progress } = event.getData(); this.emit(FileEvent.LOAD_PROGRESS, { progress }); }); babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController].subscribeOnce('onLoad', event => { if (this.getOrigin() === FileOrigin.CLIENT) { const validationEvent = new main_core_events.BaseEvent({ data: { file: this } }); this.emitAsync(FileEvent.VALIDATE_FILE_ASYNC, validationEvent).then(() => { if (this.isUploadable()) { babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.PENDING); this.emit(FileEvent.LOAD_COMPLETE); } else { const preparationEvent = new main_core_events.BaseEvent({ data: { file: this } }); this.emitAsync(FileEvent.PREPARE_FILE_ASYNC, preparationEvent).then(() => { babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.COMPLETE); this.emit(FileEvent.LOAD_COMPLETE); }).catch(preparationError => { const error = this.addError(preparationError); babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.LOAD_FAILED); this.emit(FileEvent.LOAD_ERROR, { error }); }); } }).catch(validationError => { const error = this.addError(validationError); babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.LOAD_FAILED); this.emit(FileEvent.LOAD_ERROR, { error }); }); } else { this.update(event.getData().fileInfo); if (this.isUploadable()) { babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.PENDING); } else { babelHelpers.classPrivateFieldLooseBase(this, _setStatus)[_setStatus](FileStatus.COMPLETE); } this.emit(FileEvent.LOAD_COMPLETE); } }); } if (changed) { this.emit(FileEvent.LOAD_CONTROLLER_INIT, { controller }); } } setRemoveController(controller) { if (!(controller instanceof AbstractRemoveController) && !main_core.Type.isNull(controller)) { return; } const changed = babelHelpers.classPrivateFieldLooseBase(this, _removeController)[_removeController] !== controller; babelHelpers.classPrivateFieldLooseBase(this, _removeController)[_removeController] = controller; if (babelHelpers.classPrivateFieldLooseBase(this, _removeController)[_removeController] && changed) { babelHelpers.classPrivateFieldLooseBase(this, _removeController)[_removeController].subscribeOnce('onError', event => { // const error = this.addError(event.getData().error); // this.emit(FileEvent.REMOVE_ERROR, { error }); }); babelHelpers.classPrivateFieldLooseBase(this, _removeController)[_removeController].subscribeOnce('onRemove', event => { // this.#setStatus(FileStatus.INIT); // this.emit(FileEvent.REMOVE_COMPLETE); }); } if (changed) { this.emit(FileEvent.REMOVE_CONTROLLER_INIT, { controller }); } } isReadyToUpload() { return this.getStatus() === FileStatus.PENDING; } isUploadable() { return babelHelpers.classPrivateFieldLooseBase(this, _uploadController)[_uploadController] !== null; } isLoadable() { return babelHelpers.classPrivateFieldLooseBase(this, _loadController)[_loadController] !== null; } isRemoveable() { return babelHelpers.classPrivateFieldLooseBase(this, _removeController)[_removeController] !== null; } canUpload() { return this.isReadyToUpload() && this.isUploadable(); } canLoad() { return this.getStatus() === FileStatus.ADDED && this.isLoadable(); } isUploading() { return this.getStatus() === FileStatus.UPLOADING; } isPreparing() { return this.getStatus() === FileStatus.PREPARING; } isLoading() { return this.getStatus() === FileStatus.LOADING; } isComplete() { return this.getStatus() === FileStatus.COMPLETE; } isFailed() { return this.getStatus() === FileStatus.LOAD_FAILED || this.getStatus() === FileStatus.UPLOAD_FAILED; } isLoadFailed() { return this.getStatus() === FileStatus.LOAD_FAILED; } isUploadFailed() { return this.getStatus() === FileStatus.UPLOAD_FAILED; } getBinary() { return babelHelpers.classPrivateFieldLooseBase(this, _file)[_file]; } setFile(file) { if (main_core.Type.isFile(file)) { babelHelpers.classPrivateFieldLooseBase(this, _file)[_file] = file; } else if (main_core.Type.isBlob(file)) { babelHelpers.classPrivateFieldLooseBase(this, _file)[_file] = createFileFromBlob(file, this.getName()); } } update(options) { if (main_core.Type.isPlainObject(options)) { this.setName(options.name); this.setType(options.type); this.setSize(options.size); this.setServerFileId(options.serverFileId); this.setWidth(options.width); this.setHeight(options.height); this.setTreatImageAsFile(options.treatImageAsFile); this.setClientPreview(options.clientPreview, options.clientPreviewWidth, options.clientPreviewHeight); this.setServerPreview(options.serverPreviewUrl, options.serverPreviewWidth, options.serverPreviewHeight); this.setDownloadUrl(options.downloadUrl); this.setCustomData(options.customData); this.setLoadController(options.loadController); this.setUploadController(options.uploadController); this.setRemoveController(options.removeController); } } getName() { return babelHelpers.classPrivateFieldLooseBase(this, _name)[_name] === null ? this.getBinary() ? this.getBinary().name : '' : babelHelpers.classPrivateFieldLooseBase(this, _name)[_name]; } setName(name) { if (main_core.Type.isStringFilled(name) || main_core.Type.isNull(name)) { babelHelpers.classPrivateFieldLooseBase(this, _name)[_name] = name; this.emit(FileEvent.STATE_CHANGE, { property: 'name', value: name }); } } getExtension() { const name = this.getName(); const position = name.lastIndexOf('.'); return position >= 0 ? name.slice(Math.max(0, position + 1)).toLowerCase() : ''; } getType() { return this.getBinary() ? this.getBinary().type : babelHelpers.classPrivateFieldLooseBase(this, _type)[_type]; } setType(type) { if (main_core.Type.isStringFilled(type)) { babelHelpers.classPrivateFieldLooseBase(this, _type)[_type] = type; this.emit(FileEvent.STATE_CHANGE, { property: 'type', value: type }); } } getSize() { return this.getBinary() ? this.getBinary().size : babelHelpers.classPrivateFieldLooseBase(this, _size)[_size]; } getSizeFormatted() { return formatFileSize(this.getSize()); } setSize(size) { if (main_core.Type.isNumber(size) && size >= 0) { babelHelpers.classPrivateFieldLooseBase(this, _size)[_size] = size; this.emit(FileEvent.STATE_CHANGE, { property: 'size', value: size }); } } getId() { return babelHelpers.classPrivateFieldLooseBase(this, _id)[_id]; } getServerFileId() { return babelHelpers.classPrivateFieldLooseBase(this, _serverFileId)[_serverFileId]; } /** * @deprecated * use getServerFileId */ getServerId() { return this.getServerFileId(); } setServerFileId(id) { if (main_core.Type.isNumber(id) || main_core.Type.isStringFilled(id)) { babelHelpers.classPrivateFieldLooseBase(this, _serverFileId)[_serverFileId] = id; this.emit(FileEvent.STATE_CHANGE, { property: 'serverFileId', value: id }); } } getStatus() { return babelHelpers.classPrivateFieldLooseBase(this, _status)[_status]; } getOrigin() { return babelHelpers.classPrivateFieldLooseBase(this, _origin)[_origin]; } getDownloadUrl() { return babelHelpers.classPrivateFieldLooseBase(this, _downloadUrl)[_downloadUrl]; } setDownloadUrl(url) { if (main_core.Type.isStringFilled(url)) { babelHelpers.classPrivateFieldLooseBase(this, _downloadUrl)[_downloadUrl] = url; this.emit(FileEvent.STATE_CHANGE, { property: 'downloadUrl', value: url }); } } getWidth() { return babelHelpers.classPrivateFieldLooseBase(this, _width)[_width]; } setWidth(width) { if (main_core.Type.isNumber(width)) { babelHelpers.classPrivateFieldLooseBase(this, _width)[_width] = width; this.emit(FileEvent.STATE_CHANGE, { property: 'width', value: width }); } } getHeight() { return babelHelpers.classPrivateFieldLooseBase(this, _height)[_height]; } setHeight(height) { if (main_core.Type.isNumber(height)) { babelHelpers.classPrivateFieldLooseBase(this, _height)[_height] = height; this.emit(FileEvent.STATE_CHANGE, { property: 'height', value: height }); } } isAnimated() { return babelHelpers.classPrivateFieldLooseBase(this, _animated)[_animated]; } setAnimated(flag) { if (main_core.Type.isBoolean(flag)) { babelHelpers.classPrivateFieldLooseBase(this, _animated)[_animated] = flag; this.emit(FileEvent.STATE_CHANGE, { property: 'animated', value: flag }); } } setTreatImageAsFile(flag) { if (main_core.Type.isBoolean(flag)) { babelHelpers.classPrivateFieldLooseBase(this, _treatImageAsFile)[_treatImageAsFile] = flag; this.emit(FileEvent.STATE_CHANGE, { property: 'treatImageAsFile', value: flag }); } } shouldTreatImageAsFile() { return babelHelpers.classPrivateFieldLooseBase(this, _treatImageAsFile)[_treatImageAsFile]; } getPreviewUrl() { return this.getClientPreview() ? this.getClientPreviewUrl() : this.getServerPreviewUrl(); } getPreviewWidth() { return this.getClientPreview() ? this.getClientPreviewWidth() : this.getServerPreviewWidth(); } getPreviewHeight() { return this.getClientPreview() ? this.getClientPreviewHeight() : this.getServerPreviewHeight(); } getClientPreview() { return babelHelpers.classPrivateFieldLooseBase(this, _clientPreview)[_clientPreview]; } setClientPreview(file, width = null, height = null) { if (main_core.Type.isBlob(file) || main_core.Type.isNull(file)) { this.revokeClientPreviewUrl(); const url = main_core.Type.isNull(file) ? null : URL.createObjectURL(file); babelHelpers.classPrivateFieldLooseBase(this, _clientPreview)[_clientPreview] = file; babelHelpers.classPrivateFieldLooseBase(this, _clientPreviewUrl)[_clientPreviewUrl] = url; babelHelpers.classPrivateFieldLooseBase(this, _clientPreviewWidth)[_clientPreviewWidth] = width; babelHelpers.classPrivateFieldLooseBase(this, _clientPreviewHeight)[_clientPreviewHeight] = height; this.emit(FileEvent.STATE_CHANGE, { property: 'clientPreviewUrl', value: url }); this.emit(FileEvent.STATE_CHANGE, { property: 'clientPreviewWidth', value: width }); this.emit(FileEvent.STATE_CHANGE, { property: 'clientPreviewHeight', value: height }); } } getClientPreviewUrl() { return babelHelpers.classPrivateFieldLooseBase(this, _clientPreviewUrl)[_clientPreviewUrl]; } revokeClientPreviewUrl() { if (babelHelpers.classPrivateFieldLooseBase(this, _clientPreviewUrl)[_clientPreviewUrl] !== null) { URL.revokeObjectURL(babelHelpers.classPrivateFieldLooseBase(this, _clientPreviewUrl)[_clientPreviewUrl]); babelHelpers.classPrivateFieldLooseBase(this, _clientPreviewUrl)[_clientPreviewUrl] = null; this.emit(FileEvent.STATE_CHANGE, { property: 'clientPreviewUrl', value: null }); } } getClientPreviewWidth() { return babelHelpers.classPrivateFieldLooseBase(this, _clientPreviewWidth)[_clientPreviewWidth]; } getClientPreviewHeight() { return babelHelpers.classPrivateFieldLooseBase(this, _clientPreviewHeight)[_clientPreviewHeight]; } getServerPreviewUrl() { return babelHelpers.classPrivateFieldLooseBase(this, _serverPreviewUrl)[_serverPreviewUrl]; } setServerPreview(url, width = null, height = null) { if (main_core.Type.isStringFilled(url) || main_core.Type.isNull(url)) { babelHelpers.classPrivateFieldLooseBase(this, _serverPreviewUrl)[_serverPreviewUrl] = url; babelHelpers.classPrivateFieldLooseBase(this, _serverPreviewWidth)[_serverPreviewWidth] = width; babelHelpers.classPrivateFieldLooseBase(this, _serverPreviewHeight)[_serverPreviewHeight] = height; this.emit(FileEvent.STATE_CHANGE, { property: 'serverPreviewUrl', value: url }); this.emit(FileEvent.STATE_CHANGE, { property: 'serverPreviewWidth', value: width }); this.emit(FileEvent.STATE_CHANGE, { property: 'serverPreviewHeight', value: height }); } } getServerPreviewWidth() { return babelHelpers.classPrivateFieldLooseBase(this, _serverPreviewWidth)[_serverPreviewWidth]; } getServerPreviewHeight() { return babelHelpers.classPrivateFieldLooseBase(this, _serverPreviewHeight)[_serverPreviewHeight]; } isImage() { if (this.shouldTreatImageAsFile()) { return false; } // return isResizableImage(this.getName(), this.getType()); return this.getWidth() > 0 && this.getHeight() > 0 && isResizableImage(this.getName(), this.getType()); } isVideo() { return isSupportedVideo(this.getName()); } getProgress() { return babelHelpers.classPrivateFieldLooseBase(this, _progress)[_progress]; } setProgress(progress) { if (main_core.Type.isNumber(progress)) { babelHelpers.classPrivateFieldLooseBase(this, _progress)[_progress] = progress; this.emit(FileEvent.STATE_CHANGE, { property: 'progress', value: progress }); } } addError(error) { const uploaderError = error instanceof Error ? UploaderError.createFromError(error) : error; babelHelpers.classPrivateFieldLooseBase(this, _errors)[_errors].push(uploaderError); this.emit(FileEvent.STATE_CHANGE); return uploaderError; } getError() { return babelHelpers.classPrivateFieldLooseBase(this, _errors)[_errors][0] || null; } getErrors() { return babelHelpers.classPrivateFieldLooseBase(this, _errors)[_errors]; } getState() { return JSON.parse(JSON.stringify(this)); } setCustomData(property, value) { if (main_core.Type.isNull(property)) { babelHelpers.classPrivateFieldLooseBase(this, _customData)[_customData] = Object.create(null); this.emit(FileEvent.STATE_CHANGE, { property: 'customData', value: null }); } else if (main_core.Type.isPlainObject(property)) { Object.entries(property).forEach(item => { const [currentKey, currentValue] = item; this.setCustomData(currentKey, currentValue); }); } else if (main_core.Type.isString(property)) { if (main_core.Type.isNull(value)) { delete babelHelpers.classPrivateFieldLooseBase(this, _customData)[_customData][property]; this.emit(FileEvent.STATE_CHANGE, { property: 'customData', customProperty: property, value: null }); } else if (!main_core.Type.isUndefined(value)) { babelHelpers.classPrivateFieldLooseBase(this, _customData)[_customData][property] = value; this.emit(FileEvent.STATE_CHANGE, { property: 'customData', customProperty: property, value }); } } } getCustomData(property) { if (main_core.Type.isUndefined(property)) { return babelHelpers.classPrivateFieldLooseBase(this, _customData)[_customData]; } if (main_core.Type.isStringFilled(property)) { return babelHelpers.classPrivateFieldLooseBase(this, _customData)[_customData][property]; } return undefined; } toJSON() { return { id: this.getId(), serverFileId: this.getServerFileId(), serverId: this.getServerFileId(), // compatibility status: this.getStatus(), name: this.getName(), size: this.getSize(), sizeFormatted: this.getSizeFormatted(), type: this.getType(), extension: this.getExtension(), origin: this.getOrigin(), isImage: this.isImage(), isVideo: this.isVideo(), failed: this.isFailed(), width: this.getWidth(), height: this.getHeight(), animated: this.isAnimated(), progress: this.getProgress(), error: this.getError(), errors: this.getErrors(), previewUrl: this.getPreviewUrl(), previewWidth: this.getPreviewWidth(), previewHeight: this.getPreviewHeight(), clientPreviewUrl: this.getClientPreviewUrl(), clientPreviewWidth: this.getClientPreviewWidth(), clientPreviewHeight: this.getClientPreviewHeight(), serverPreviewUrl: this.getServerPreviewUrl(), serverPreviewWidth: this.getServerPreviewWidth(), serverPreviewHeight: this.getServerPreviewHeight(), downloadUrl: this.getDownloadUrl(), customData: this.getCustomData() }; } } function _setStatus2(status) { babelHelpers.classPrivateFieldLooseBase(this, _status)[_status] = status; this.emit(FileEvent.STATE_CHANGE, { property: 'status', value: status }); this.emit(FileEvent.STATUS_CHANGE); } var _emitter = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("emitter"); class CallbackCollection { constructor(file) { Object.defineProperty(this, _emitter, { writable: true, value: null }); babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter] = new main_core_events.EventEmitter(file, 'BX.UI.Uploader.File.UploadCallbacks'); } subscribe(callbacks = {}) { const handlers = main_core.Type.isPlainObject(callbacks) ? callbacks : {}; if (main_core.Type.isFunction(handlers.onComplete)) { this.getEmitter().subscribeOnce('onComplete', handlers.onComplete); } if (main_core.Type.isFunction(handlers.onError)) { this.getEmitter().subscribeOnce('onError', handlers.onError); } } emit(eventName, event) { if (babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter]) { babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].emit(eventName, event); babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter].unsubscribeAll(); } } getEmitter() { if (main_core.Type.isNull(babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter])) { babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter] = new main_core_events.EventEmitter(this, 'BX.UI.Uploader.File.UploadCallbacks'); } return babelHelpers.classPrivateFieldLooseBase(this, _emitter)[_emitter]; } } var _data = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("data"); var _offset = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("offset"); var _retries = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("retries"); class Chunk { constructor(data, offset) { Object.defineProperty(this, _data, { writable: true, value: null }); Object.defineProperty(this, _offset, { writable: true, value: 0 }); Object.defineProperty(this, _retries, { writable: true, value: [] }); babelHelpers.classPrivateFieldLooseBase(this, _data)[_data] = data; babelHelpers.classPrivateFieldLooseBase(this, _offset)[_offset] = offset; } getNextRetryDelay() { if (babelHelpers.classPrivateFieldLooseBase(this, _retries)[_retries].length === 0) { return null; } return babelHelpers.classPrivateFieldLooseBase(this, _retries)[_retries].shift(); } setRetries(retries) { if (main_core.Type.isArray(retries)) { babelHelpers.classPrivateFieldLooseBase(this, _retries)[_retries] = retries; } } getData() { return babelHelpers.classPrivateFieldLooseBase(this, _data)[_data]; } getOffset() { return babelHelpers.classPrivateFieldLooseBase(this, _offset)[_offset]; } getSize() { return this.getData().size; } } var _file$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("file"); var _chunkOffset = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("chunkOffset"); var _chunkTimeout = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("chunkTimeout"); var _token = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("token"); var _xhr = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("xhr"); var _aborted = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("aborted"); var _uploadChunk = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("uploadChunk"); var _retryUploadChunk = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("retryUploadChunk"); var _getNextChunk = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getNextChunk"); class UploadController extends AbstractUploadController { constructor(server, options = {}) { super(server, options); Object.defineProperty(this, _getNextChunk, { value: _getNextChunk2 }); Object.defineProperty(this, _retryUploadChunk, { value: _retryUploadChunk2 }); Object.defineProperty(this, _uploadChunk, { value: _uploadChunk2 }); Object.defineProperty(this, _file$1, { writable: true, value: null }); Object.defineProperty(this, _chunkOffset, { writable: true, value: null }); Object.defineProperty(this, _chunkTimeout, { writable: true, value: null }); Object.defineProperty(this, _token, { writable: true, value: null }); Object.defineProperty(this, _xhr, { writable: true, value: null }); Object.defineProperty(this, _aborted, { writable: true, value: false }); } upload(file) { if (!main_core.Type.isFile(file.getBinary())) { this.emit('onError', { error: new UploaderError('WRONG_FILE_SOURCE') }); return; } if (babelHelpers.classPrivateFieldLooseBase(this, _chunkOffset)[_chunkOffset] !== null) { return; } babelHelpers.classPrivateFieldLooseBase(this, _file$1)[_file$1] = file; const nextChunk = babelHelpers.classPrivateFieldLooseBase(this, _getNextChunk)[_getNextChunk](); if (nextChunk) { babelHelpers.classPrivateFieldLooseBase(this, _uploadChunk)[_uploadChunk](nextChunk); } } abort() { if (babelHelpers.classPrivateFieldLooseBase(this, _xhr)[_xhr]) { babelHelpers.classPrivateFieldLooseBase(this, _aborted)[_aborted] = true; babelHelpers.classPrivateFieldLooseBase(this, _xhr)[_xhr].abort(); babelHelpers.classPrivateFieldLooseBase(this, _xhr)[_xhr] = null; } clearTimeout(babelHelpers.classPrivateFieldLooseBase(this, _chunkTimeout)[_chunkTimeout]); } getFile() { return babelHelpers.classPrivateFieldLooseBase(this, _file$1)[_file$1]; } getChunkSize() { return this.getServer().getChunkSize(); } getChunkOffset() { return babelHelpers.classPrivateFieldLooseBase(this, _chunkOffset)[_chunkOffset]; } getToken() { return babelHelpers.classPrivateFieldLooseBase(this, _token)[_token]; } setToken(token) { if (main_core.Type.isStringFilled(token)) { babelHelpers.classPrivateFieldLooseBase(this, _token)[_token] = token; } } } function _uploadChunk2(chunk) { const totalSize = this.getFile().getSize(); const isOnlyOneChunk = chunk.getOffset() === 0 && totalSize === chunk.getSize(); let fileName = this.getFile().getName(); if (fileName.normalize) { fileName = fileName.normalize(); } const type = main_core.Type.isStringFilled(this.getFile().getType()) ? this.getFile().getType() : 'application/octet-stream'; const headers = [{ name: 'Content-Type', value: type }, { name: 'X-Upload-Content-Name', value: encodeURIComponent(fileName) }]; if (!isOnlyOneChunk) { const rangeStart = chunk.getOffset(); const rangeEnd = chunk.getOffset() + chunk.getSize() - 1; const rangeHeader = `bytes ${rangeStart}-${rangeEnd}/${totalSize}`; headers.push({ name: 'Content-Range', value: rangeHeader }); } const controllerOptions = this.getServer().getControllerOptions(); main_core.ajax.runAction('ui.fileuploader.upload', { headers, data: chunk.getData(), preparePost: false, getParameters: { controller: this.getServer().getController(), controllerOptions: controllerOptions ? JSON.stringify(controllerOptions) : null, token: this.getToken() || '' }, onrequeststart: xhr => { babelHelpers.classPrivateFieldLooseBase(this, _xhr)[_xhr] = xhr; babelHelpers.classPrivateFieldLooseBase(this, _aborted)[_aborted] = false; }, onprogressupload: event => { if (event.lengthComputable) { const size = this.getFile().getSize(); const uploadedBytes = Math.min(size, chunk.getOffset() + event.loaded); const progress = size > 0 ? Math.floor(uploadedBytes / size * 100) : 100; this.emit('onProgress', { progress }); } } }).then(response => { if (response.data.token) { this.setToken(response.data.token); if (this.getFile().getServerFileId() === null) { // Now we can remove a temp file on the backend this.getFile().setServerFileId(response.data.token); } const size = this.getFile().getSize(); const progress = size > 0 ? Math.floor((chunk.getOffset() + chunk.getSize()) / size * 100) : 100; this.emit('onProgress', { progress }); const nextChunk = babelHelpers.classPrivateFieldLooseBase(this, _getNextChunk)[_getNextChunk](); if (nextChunk) { babelHelpers.classPrivateFieldLooseBase(this, _uploadChunk)[_uploadChunk](nextChunk); } else { this.emit('onProgress', { progress: 100 }); this.emit('onUpload', { fileInfo: response.data.file }); } } else { this.emit('onError', { error: new UploaderError('SERVER_ERROR') }); } }).catch(response => { if (babelHelpers.classPrivateFieldLooseBase(this, _aborted)[_aborted]) { return; } const error = UploaderError.createFromAjaxErrors(response.errors); const shouldRetry = error.getCode() === 'NETWORK_ERROR' || error.getType() === UploaderError.Type.UNKNOWN; if (!shouldRetry || !babelHelpers.classPrivateFieldLooseBase(this, _retryUploadChunk)[_retryUploadChunk](chunk)) { this.emit('onError', { error }); } }); } function _retryUploadChunk2(chunk) { const nextDelay = chunk.getNextRetryDelay(); if (nextDelay === null) { return false; } clearTimeout(babelHelpers.classPrivateFieldLooseBase(this, _chunkTimeout)[_chunkTimeout]); babelHelpers.classPrivateFieldLooseBase(this, _chunkTimeout)[_chunkTimeout] = setTimeout(() => { babelHelpers.classPrivateFieldLooseBase(this, _uploadChunk)[_uploadChunk](chunk); }, nextDelay); return true; } function _getNextChunk2() { if (this.getChunkOffset() !== null && this.getChunkOffset() >= this.getFile().getSize()) { // End of File return null; } if (this.getChunkOffset() === null) { // First call babelHelpers.classPrivateFieldLooseBase(this, _chunkOffset)[_chunkOffset] = 0; } let chunk = null; if (this.getChunkOffset() === 0 && this.getFile().getSize() <= this.getChunkSize()) { chunk = new Chunk(this.getFile().getBinary(), this.getChunkOffset()); babelHelpers.classPrivateFieldLooseBase(this, _chunkOffset)[_chunkOffset] = this.getFile().getSize(); } else { const currentChunkSize = Math.min(this.getChunkSize(), this.getFile().getSize() - this.getChunkOffset()); const nextOffset = this.getChunkOffset() + currentChunkSize; const fileRange = this.getFile().getBinary().slice(this.getChunkOffset(), nextOffset); chunk = new Chunk(fileRange, this.getChunkOffset()); babelHelpers.classPrivateFieldLooseBase(this, _chunkOffset)[_chunkOffset] = nextOffset; } chunk.setRetries([...this.getServer().getChunkRetryDelays()]); return chunk; } const pendingQueues = new WeakMap(); const loadingFiles = new WeakMap(); function loadMultiple(controller, file) { const server = controller.getServer(); const timeout = controller.getOption('timeout', 100); let queue = pendingQueues.get(server); if (!queue) { queue = { tasks: [], load: main_core.Runtime.debounce(loadInternal, timeout, server), xhr: null, aborted: false }; pendingQueues.set(server, queue); } queue.tasks.push({ controller, file }); queue.load(); } function abort(controller, file) { const server = controller.getServer(); const queue = pendingQueues.get(server); if (queue) { queue.tasks = queue.tasks.filter(task => { return task.file !== file; }); if (queue.tasks.length === 0) { pendingQueues.delete(server); } } else { const queue = loadingFiles.get(file); if (queue) { queue.tasks = queue.tasks.filter(task => { return task.file !== file; }); loadingFiles.delete(file); if (queue.tasks.length === 0) { queue.aborted = true; queue.xhr.abort(); } } } } function loadInternal() { // eslint-disable-next-line no-invalid-this,unicorn/no-this-assignment const server = this; const queue = pendingQueues.get(server); if (!queue) { return; } pendingQueues.delete(server); if (queue.tasks.length === 0) { return; } const fileIds = []; queue.tasks.forEach(task => { const file = task.file; fileIds.push(file.getServerFileId()); loadingFiles.set(file, queue); }); const controllerOptions = server.getControllerOptions(); main_core.ajax.runAction('ui.fileuploader.load', { data: { fileIds }, getParameters: { controller: server.getController(), controllerOptions: controllerOptions ? JSON.stringify(controllerOptions) : null }, onrequeststart: xhr => { queue.xhr = xhr; }, onprogress: event => { if (event.lengthComputable) { const progress = event.total > 0 ? Math.floor(event.loaded / event.total * 100) : 100; queue.tasks.forEach(task => { const { controller } = task; controller.emit('onProgress', { progress }); }); } } }).then(response => { var _response$data; if ((_response$data = response.data) != null && _response$data.files) { const fileResults = {}; response.data.files.forEach(fileResult => { fileResults[fileResult.id] = fileResult; }); queue.tasks.forEach(task => { const { controller, file } = task; const fileResult = fileResults[file.getServerFileId()] || null; loadingFiles.delete(file); if (fileResult && fileResult.success) { controller.emit('onProgress', { progress: 100 }); controller.emit('onLoad', { fileInfo: fileResult.data.file }); } else { const error = UploaderError.createFromAjaxErrors(fileResult == null ? void 0 : fileResult.errors); controller.emit('onError', { error }); } }); } else { const error = new UploaderError('SERVER_ERROR'); queue.tasks.forEach(task => { const { controller, file } = task; loadingFiles.delete(file); controller.emit('onError', { error: error.clone() }); }); } }).catch(response => { const error = queue.aborted ? null : UploaderError.createFromAjaxErrors(response.errors); queue.tasks.forEach(task => { const { controller, file } = task; loadingFiles.delete(file); if (!queue.aborted) { controller.emit('onError', { error: error.clone() }); } }); }); } var _file$2 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("file"); class ServerLoadController extends AbstractLoadController { constructor(server, options = {}) { super(server, options); Object.defineProperty(this, _file$2, { writable: true, value: null }); } load(file) { if (this.getServer().getController()) { babelHelpers.classPrivateFieldLooseBase(this, _file$2)[_file$2] = file; loadMultiple(this, file); } else { this.emit('onProgress', { progress: 100 }); this.emit('onLoad', { fileInfo: null }); } } abort() { if (this.getServer().getController() && babelHelpers.classPrivateFieldLooseBase(this, _file$2)[_file$2]) { abort(this, babelHelpers.classPrivateFieldLooseBase(this, _file$2)[_file$2]); } } } class ClientLoadController extends AbstractLoadController { constructor(server, options = {}) { super(server, options); } load(file) { if (main_core.Type.isFile(file.getBinary())) { this.emit('onProgress', { progress: 100 }); this.emit('onLoad', { fileInfo: file }); } else { this.emit('onError', { error: new UploaderError('WRONG_FILE_SOURCE') }); } } abort() { // silent abort } } const queues = new WeakMap(); function removeMultiple(controller, file) { const server = controller.getServer(); let queue = queues.get(server); if (!queue) { queue = { tasks: [], remove: main_core.Runtime.debounce(removeInternal, 1000, server), xhr: null }; queues.set(server, queue); } queue.tasks.push({ controller, file }); queue.remove(); } function removeInternal() { // eslint-disable-next-line no-invalid-this,unicorn/no-this-assignment const server = this; const queue = queues.get(server); if (!queue) { return; } const { tasks } = queue; queues.delete(server); const fileIds = []; tasks.forEach(task => { const file = task.file; if (file.getServerFileId() !== null) { fileIds.push(file.getServerFileId()); } }); if (fileIds.length === 0) { return; } const controllerOptions = server.getControllerOptions(); main_core.ajax.runAction('ui.fileuploader.remove', { data: { fileIds }, getParameters: { controller: server.getController(), controllerOptions: controllerOptions ? JSON.stringify(controllerOptions) : null }, onrequeststart: xhr => { queue.xhr = xhr; } }).then(response => { var _response$data; if ((_response$data = response.data) != null && _response$data.files) { const fileResults = {}; response.data.files.forEach(fileResult => { fileResults[fileResult.id] = fileResult; }); tasks.forEach(task => { const { controller, file } = task; const fileResult = fileResults[file.getServerFileId()] || null; if (fileResult && fileResult.success) { controller.emit('onRemove', { fileId: fileResult.id }); } else { const error = UploaderError.createFromAjaxErrors(fileResult == null ? void 0 : fileResult.errors); controller.emit('onError', { error }); } }); } else { const error = new UploaderError('SERVER_ERROR'); tasks.forEach(task => { const { controller } = task; controller.emit('onError', { error: error.clone() }); }); } }).catch(response => { const error = UploaderError.createFromAjaxErrors(response.errors); tasks.forEach(task => { const { controller } = task; controller.emit('onError', { error: error.clone() }); }); }); } class RemoveController extends AbstractRemoveController { remove(file) { removeMultiple(this, file); } } class ServerlessLoadController extends AbstractLoadController { constructor(server, options = {}) { super(server, options); } load(file) { if (main_core.Type.isStringFilled(file.getName())) { this.emit('onProgress', { progress: 100 }); this.emit('onLoad', { fileInfo: file }); } else { this.emit('onError', { error: new UploaderError('WRONG_FILE_SOURCE') }); } } abort() { // silent abort } } var _controller = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("controller"); var _controllerOptions = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("controllerOptions"); var _uploadControllerClass = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("uploadControllerClass"); var _uploadControllerOptions = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("uploadControllerOptions"); var _loadControllerClass = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("loadControllerClass"); var _loadControllerOptions = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("loadControllerOptions"); var _removeControllerClass = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("removeControllerClass"); var _removeControllerOptions = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("removeControllerOptions"); var _chunkSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("chunkSize"); var _defaultChunkSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("defaultChunkSize"); var _chunkMinSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("chunkMinSize"); var _chunkMaxSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("chunkMaxSize"); var _chunkRetryDelays = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("chunkRetryDelays"); var _calcChunkSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("calcChunkSize"); class Server { constructor(serverOptions) { Object.defineProperty(this, _calcChunkSize, { value: _calcChunkSize2 }); Object.defineProperty(this, _controller, { writable: true, value: null }); Object.defineProperty(this, _controllerOptions, { writable: true, value: null }); Object.defineProperty(this, _uploadControllerClass, { writable: true, value: null }); Object.defineProperty(this, _uploadControllerOptions, { writable: true, value: {} }); Object.defineProperty(this, _loadControllerClass, { writable: true, value: null }); Object.defineProperty(this, _loadControllerOptions, { writable: true, value: {} }); Object.defineProperty(this, _removeControllerClass, { writable: true, value: null }); Object.defineProperty(this, _removeControllerOptions, { writable: true, value: {} }); Object.defineProperty(this, _chunkSize, { writable: true, value: null }); Object.defineProperty(this, _defaultChunkSize, { writable: true, value: null }); Object.defineProperty(this, _chunkMinSize, { writable: true, value: null }); Object.defineProperty(this, _chunkMaxSize, { writable: true, value: null }); Object.defineProperty(this, _chunkRetryDelays, { writable: true, value: [1000, 3000, 6000] }); const options = main_core.Type.isPlainObject(serverOptions) ? serverOptions : {}; babelHelpers.classPrivateFieldLooseBase(this, _controller)[_controller] = main_core.Type.isStringFilled(options.controller) ? options.controller : null; babelHelpers.classPrivateFieldLooseBase(this, _controllerOptions)[_controllerOptions] = main_core.Type.isPlainObject(options.controllerOptions) ? options.controllerOptions : null; const _chunkSize2 = main_core.Type.isNumber(options.chunkSize) && options.chunkSize > 0 ? options.chunkSize : this.getDefaultChunkSize(); babelHelpers.classPrivateFieldLooseBase(this, _chunkSize)[_chunkSize] = options.forceChunkSize === true ? _chunkSize2 : babelHelpers.classPrivateFieldLooseBase(this, _calcChunkSize)[_calcChunkSize](_chunkSize2); if (options.chunkRetryDelays === false || options.chunkRetryDelays === null) { babelHelpers.classPrivateFieldLooseBase(this, _chunkRetryDelays)[_chunkRetryDelays] = []; } else if (main_core.Type.isArray(options.chunkRetryDelays)) { babelHelpers.classPrivateFieldLooseBase(this, _chunkRetryDelays)[_chunkRetryDelays] = options.chunkRetryDelays; } const controllerClasses = ['uploadControllerClass', 'loadControllerClass', 'removeControllerClass']; controllerClasses.forEach(controllerClass => { let fn = null; if (main_core.Type.isStringFilled(options[controllerClass])) { fn = main_core.Runtime.getClass(options[controllerClass]); if (!main_core.Type.isFunction(fn)) { throw new TypeError(`Uploader.Server: "${controllerClass}" must be a function.`); } } else if (main_core.Type.isFunction(options[controllerClass])) { fn = options[controllerClass]; } switch (controllerClass) { case 'uploadControllerClass': babelHelpers.classPrivateFieldLooseBase(this, _uploadControllerClass)[_uploadControllerClass] = fn; break; case 'loadControllerClass': babelHelpers.classPrivateFieldLooseBase(this, _loadControllerClass)[_loadControllerClass] = fn; break; case 'removeControllerClass': babelHelpers.classPrivateFieldLooseBase(this, _removeControllerClass)[_removeControllerClass] = fn; break; default: // No default } }); babelHelpers.classPrivateFieldLooseBase(this, _loadControllerOptions)[_loadControllerOptions] = main_core.Type.isPlainObject(options.loadControllerOptions) ? options.loadControllerOptions : {}; babelHelpers.classPrivateFieldLooseBase(this, _uploadControllerOptions)[_uploadControllerOptions] = main_core.Type.isPlainObject(options.uploadControllerOptions) ? options.uploadControllerOptions : {}; babelHelpers.classPrivateFieldLooseBase(this, _removeControllerOptions)[_removeControllerOptions] = main_core.Type.isPlainObject(options.removeControllerOptions) ? options.removeControllerOptions : {}; } createUploadController() { if (babelHelpers.classPrivateFieldLooseBase(this, _uploadControllerClass)[_uploadControllerClass]) { const controller = new (babelHelpers.classPrivateFieldLooseBase(this, _uploadControllerClass)[_uploadControllerClass])(this, babelHelpers.classPrivateFieldLooseBase(this, _uploadControllerOptions)[_uploadControllerOptions]); if (!(controller instanceof AbstractUploadController)) { throw new TypeError('Uploader.Server: "uploadControllerClass" must be an instance of AbstractUploadController.'); } return controller; } if (main_core.Type.isStringFilled(babelHelpers.classPrivateFieldLooseBase(this, _controller)[_controller])) { return new UploadController(this, babelHelpers.classPrivateFieldLooseBase(this, _uploadControllerOptions)[_uploadControllerOptions]); } return null; } createServerLoadController() { if (babelHelpers.classPrivateFieldLooseBase(this, _loadControllerClass)[_loadControllerClass]) { const controller = new (babelHelpers.classPrivateFieldLooseBase(this, _loadControllerClass)[_loadControllerClass])(this, babelHelpers.classPrivateFieldLooseBase(this, _loadControllerOptions)[_loadControllerOptions]); if (!(controller instanceof AbstractLoadController)) { throw new TypeError('Uploader.Server: "loadControllerClass" must be an instance of AbstractLoadController.'); } return controller; } return this.createDefaultServerLoadController(); } createDefaultServerLoadController() { return new ServerLoadController(this, babelHelpers.classPrivateFieldLooseBase(this, _loadControllerOptions)[_loadControllerOptions]); } createClientLoadController() { return new ClientLoadController(this, babelHelpers.classPrivateFieldLooseBase(this, _loadControllerOptions)[_loadControllerOptions]); } createServerlessLoadController() { return new ServerlessLoadController(this, babelHelpers.classPrivateFieldLooseBase(this, _loadControllerOptions)[_loadControllerOptions]); } createRemoveController() { if (babelHelpers.classPrivateFieldLooseBase(this, _removeControllerClass)[_removeControllerClass]) { const controller = new (babelHelpers.classPrivateFieldLooseBase(this, _removeControllerClass)[_removeControllerClass])(this, babelHelpers.classPrivateFieldLooseBase(this, _removeControllerOptions)[_removeControllerOptions]); if (!(controller instanceof AbstractRemoveController)) { throw new TypeError('Uploader.Server: "removeControllerClass" must be an instance of AbstractRemoveController.'); } return controller; } if (main_core.Type.isStringFilled(babelHelpers.classPrivateFieldLooseBase(this, _controller)[_controller])) { return new RemoveController(this, babelHelpers.classPrivateFieldLooseBase(this, _removeControllerOptions)[_removeControllerOptions]); } return null; } getController() { return babelHelpers.classPrivateFieldLooseBase(this, _controller)[_controller]; } getControllerOptions() { return babelHelpers.classPrivateFieldLooseBase(this, _controllerOptions)[_controllerOptions]; } getChunkSize() { return babelHelpers.classPrivateFieldLooseBase(this, _chunkSize)[_chunkSize]; } getDefaultChunkSize() { if (babelHelpers.classPrivateFieldLooseBase(this, _defaultChunkSize)[_defaultChunkSize] === null) { const settings = main_core.Extension.getSettings('ui.uploader.core'); babelHelpers.classPrivateFieldLooseBase(this, _defaultChunkSize)[_defaultChunkSize] = settings.get('defaultChunkSize', 5 * 1024 * 1024); } return babelHelpers.classPrivateFieldLooseBase(this, _defaultChunkSize)[_defaultChunkSize]; } getChunkMinSize() { if (babelHelpers.classPrivateFieldLooseBase(this, _chunkMinSize)[_chunkMinSize] === null) { const settings = main_core.Extension.getSettings('ui.uploader.core'); babelHelpers.classPrivateFieldLooseBase(this, _chunkMinSize)[_chunkMinSize] = settings.get('chunkMinSize', 1024 * 1024); } return babelHelpers.classPrivateFieldLooseBase(this, _chunkMinSize)[_chunkMinSize]; } getChunkMaxSize() { if (babelHelpers.classPrivateFieldLooseBase(this, _chunkMaxSize)[_chunkMaxSize] === null) { const settings = main_core.Extension.getSettings('ui.uploader.core'); babelHelpers.classPrivateFieldLooseBase(this, _chunkMaxSize)[_chunkMaxSize] = settings.get('chunkMaxSize', 5 * 1024 * 1024); } return babelHelpers.classPrivateFieldLooseBase(this, _chunkMaxSize)[_chunkMaxSize]; } getChunkRetryDelays() { return babelHelpers.classPrivateFieldLooseBase(this, _chunkRetryDelays)[_chunkRetryDelays]; } } function _calcChunkSize2(chunkSize) { return Math.min(Math.max(this.getChunkMinSize(), chunkSize), this.getChunkMaxSize()); } var _uploader = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("uploader"); class Filter { constructor(uploader, filterOptions = {}) { Object.defineProperty(this, _uploader, { writable: true, value: null }); babelHelpers.classPrivateFieldLooseBase(this, _uploader)[_uploader] = uploader; } getUploader() { return babelHelpers.classPrivateFieldLooseBase(this, _uploader)[_uploader]; } /** * @abstract */ apply(...args) { throw new Error('You must implement apply() method.'); } } var _maxFileSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("maxFileSize"); var _minFileSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("minFileSize"); var _maxTotalFileSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("maxTotalFileSize"); var _imageMaxFileSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imageMaxFileSize"); var _imageMinFileSize = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imageMinFileSize"); var _treatOversizeImageAsFile = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("treatOversizeImageAsFile"); class FileSizeFilter extends Filter { constructor(uploader, filterOptions = {}) { super(uploader); Object.defineProperty(this, _maxFileSize, { writable: true, value: 256 * 1024 * 1024 }); Object.defineProperty(this, _minFileSize, { writable: true, value: 0 }); Object.defineProperty(this, _maxTotalFileSize, { writable: true, value: null }); Object.defineProperty(this, _imageMaxFileSize, { writable: true, value: 48 * 1024 * 1024 }); Object.defineProperty(this, _imageMinFileSize, { writable: true, value: 0 }); Object.defineProperty(this, _treatOversizeImageAsFile, { writable: true, value: false }); const settings = main_core.Extension.getSettings('ui.uploader.core'); babelHelpers.classPrivateFieldLooseBase(this, _maxFileSize)[_maxFileSize] = settings.get('maxFileSize', babelHelpers.classPrivateFieldLooseBase(this, _maxFileSize)[_maxFileSize]); babelHelpers.classPrivateFieldLooseBase(this, _minFileSize)[_minFileSize] = settings.get('minFileSize', babelHelpers.classPrivateFieldLooseBase(this, _minFileSize)[_minFileSize]); babelHelpers.classPrivateFieldLooseBase(this, _maxTotalFileSize)[_maxTotalFileSize] = settings.get('maxTotalFileSize', babelHelpers.classPrivateFieldLooseBase(this, _maxTotalFileSize)[_maxTotalFileSize]); babelHelpers.classPrivateFieldLooseBase(this, _imageMaxFileSize)[_imageMaxFileSize] = settings.get('imageMaxFileSize', babelHelpers.classPrivateFieldLooseBase(this, _imageMaxFileSize)[_imageMaxFileSize]); babelHelpers.classPrivateFieldLooseBase(this, _imageMinFileSize)[_imageMinFileSize] = settings.get('imageMinFileSize', babelHelpers.classPrivateFieldLooseBase(this, _imageMinFileSize)[_imageMinFileSize]); const options = main_core.Type.isPlainObject(filterOptions) ? filterOptions : {}; this.setMaxFileSize(options.maxFileSize); this.setMinFileSize(options.minFileSize); this.setMaxTotalFileSize(options.maxTotalFileSize); this.setImageMaxFileSize(options.imageMaxFileSize); this.setImageMinFileSize(options.imageMinFileSize); this.setTreatOversizeImageAsFile(options.treatOversizeImageAsFile); } apply(file) { return new Promise((resolve, reject) => { if (this.getMaxFileSize() !== null && file.getSize() > this.getMaxFileSize()) { reject(new UploaderError('MAX_FILE_SIZE_EXCEEDED', { maxFileSize: formatFileSize(this.getMaxFileSize()), maxFileSizeInBytes: this.getMaxFileSize() })); return; } if (file.getSize() < this.getMinFileSize()) { reject(new UploaderError('MIN_FILE_SIZE_EXCEEDED', { minFileSize: formatFileSize(this.getMinFileSize()), minFileSizeInBytes: this.getMinFileSize() })); return; } if (isResizableImage(file.getName(), file.getType())) { if (this.getImageMaxFileSize() !== null && file.getSize() > this.getImageMaxFileSize()) { if (this.shouldTreatOversizeImageAsFile()) { file.setTreatImageAsFile(true); } else { reject(new UploaderError('IMAGE_MAX_FILE_SIZE_EXCEEDED', { imageMaxFileSize: formatFileSize(this.getImageMaxFileSize()), imageMaxFileSizeInBytes: this.getImageMaxFileSize() })); return; } } if (file.getSize() < this.getImageMinFileSize()) { if (this.shouldTreatOversizeImageAsFile()) { file.setTreatImageAsFile(true); } else { reject(new UploaderError('IMAGE_MIN_FILE_SIZE_EXCEEDED', { imageMinFileSize: formatFileSize(this.getImageMinFileSize()), imageMinFileSizeInBytes: this.getImageMinFileSize() })); return; } } } if (this.getMaxTotalFileSize() !== null && this.getUploader().getTotalSize() > this.getMaxTotalFileSize()) { reject(new UploaderError('MAX_TOTAL_FILE_SIZE_EXCEEDED', { maxTotalFileSize: formatFileSize(this.getMaxTotalFileSize()), maxTotalFileSizeInBytes: this.getMaxTotalFileSize() })); return; } resolve(); }); } getMaxFileSize() { return babelHelpers.classPrivateFieldLooseBase(this, _maxFileSize)[_maxFileSize]; } setMaxFileSize(value) { if (main_core.Type.isNumber(value) && value >= 0 || main_core.Type.isNull(value)) { babelHelpers.classPrivateFieldLooseBase(this, _maxFileSize)[_maxFileSize] = value; } } getMinFileSize() { return babelHelpers.classPrivateFieldLooseBase(this, _minFileSize)[_minFileSize]; } setMinFileSize(value) { if (main_core.Type.isNumber(value) && value >= 0) { babelHelpers.classPrivateFieldLooseBase(this, _minFileSize)[_minFileSize] = value; } } getMaxTotalFileSize() { return babelHelpers.classPrivateFieldLooseBase(this, _maxTotalFileSize)[_maxTotalFileSize]; } setMaxTotalFileSize(value) { if (main_core.Type.isNumber(value) && value >= 0 || main_core.Type.isNull(value)) { babelHelpers.classPrivateFieldLooseBase(this, _maxTotalFileSize)[_maxTotalFileSize] = value; } } getImageMaxFileSize() { return babelHelpers.classPrivateFieldLooseBase(this, _imageMaxFileSize)[_imageMaxFileSize]; } setImageMaxFileSize(value) { if (main_core.Type.isNumber(value) && value >= 0 || main_core.Type.isNull(value)) { babelHelpers.classPrivateFieldLooseBase(this, _imageMaxFileSize)[_imageMaxFileSize] = value; } } getImageMinFileSize() { return babelHelpers.classPrivateFieldLooseBase(this, _imageMinFileSize)[_imageMinFileSize]; } setImageMinFileSize(value) { if (main_core.Type.isNumber(value) && value >= 0) { babelHelpers.classPrivateFieldLooseBase(this, _imageMinFileSize)[_imageMinFileSize] = value; } } setTreatOversizeImageAsFile(value) { if (main_core.Type.isBoolean(value)) { babelHelpers.classPrivateFieldLooseBase(this, _treatOversizeImageAsFile)[_treatOversizeImageAsFile] = value; } } shouldTreatOversizeImageAsFile() { return babelHelpers.classPrivateFieldLooseBase(this, _treatOversizeImageAsFile)[_treatOversizeImageAsFile]; } } const isValidFileType = (file, fileTypes) => { if (!main_core.Type.isArrayFilled(fileTypes)) { return true; } const mimeType = file.type; const baseMimeType = mimeType.replace(/\/.*$/, ''); for (const fileType of fileTypes) { if (!main_core.Type.isStringFilled(fileType)) { continue; } const type = fileType.trim().toLowerCase(); if (type.charAt(0) === '.') // extension case { if (file.name.toLowerCase().includes(type, file.name.length - type.length)) { return true; } } else if (/\/\*$/.test(type)) // image/* mime type case { if (baseMimeType === type.replace(/\/.*$/, '')) { return true; } } else if (mimeType === type) { return true; } } return false; }; class FileTypeFilter extends Filter { constructor(uploader, filterOptions = {}) { super(uploader); } apply(file) { return new Promise((resolve, reject) => { if (isValidFileType(file.getBinary(), this.getUploader().getAcceptedFileTypes())) { resolve(); } else { reject(new UploaderError('FILE_TYPE_NOT_ALLOWED')); } }); } } const getArrayBuffer = file => { if (file.arrayBuffer) { return file.arrayBuffer(); } return new Promise((resolve, reject) => { const fileReader = new FileReader(); fileReader.readAsArrayBuffer(file); fileReader.onload = () => { const buffer = fileReader.result; resolve(buffer); }; fileReader.onerror = () => { reject(fileReader.error); }; }); }; const convertStringToBuffer = str => { const result = []; for (let i = 0; i < str.length; i++) { result.push(str.codePointAt(i) & 0xFF); } return result; }; const compareBuffers = (dataView, dest, start) => { for (let i = start, j = 0; j < dest.length;) { if (dataView.getUint8(i++) !== dest[j++]) { return false; } } return true; }; const GIF87a = convertStringToBuffer('GIF87a'); const GIF89a = convertStringToBuffer('GIF89a'); class Gif { getSize(file) { return new Promise((resolve, reject) => { if (file.size < 10) { reject(new Error('GIF signature not found.')); return; } getArrayBuffer(file).then(buffer => { const view = new DataView(buffer); if (!compareBuffers(view, GIF87a, 0) && !compareBuffers(view, GIF89a, 0)) { reject(new Error('GIF signature not found.')); return; } // * a static 4-byte sequence (\x00\x21\xF9\x04) // * 4 variable bytes // * a static 2-byte sequence (\x00\x2C) (some variants may use \x00\x21 ?) // We read through the file til we reach the end of the file, or we've found // at least 2 frame headers let frames = 0; for (let i = 0, len = view.byteLength - 9; i < len && frames < 2; i++) { if (view.getUint8(i) === 0x00 && view.getUint8(i + 1) === 0x21 && view.getUint8(i + 2) === 0xF9 && view.getUint8(i + 3) === 0x04 && view.getUint8(i + 8) === 0x00 && (view.getUint8(i + 9) === 0x2C || view.getUint8(i + 9) === 0x21)) { frames++; } } const animated = frames > 1; resolve({ width: view.getUint16(6, true), height: view.getUint16(8, true), animated }); }).catch(error => { reject(error); }); }); } } const PNG_SIGNATURE = convertStringToBuffer('\x89PNG\r\n\x1A\n'); const IHDR_SIGNATURE = convertStringToBuffer('IHDR'); const FRIED_CHUNK_NAME = convertStringToBuffer('CgBI'); class Png { getSize(file) { return new Promise((resolve, reject) => { if (file.size < 40) { reject(new Error('PNG signature not found.')); return; } const blob = file.slice(0, 40); getArrayBuffer(blob).then(buffer => { const view = new DataView(buffer); if (!compareBuffers(view, PNG_SIGNATURE, 0)) { reject(new Error('PNG signature not found.')); return; } if (compareBuffers(view, FRIED_CHUNK_NAME, 12)) { if (compareBuffers(view, IHDR_SIGNATURE, 28)) { resolve({ width: view.getUint32(32), height: view.getUint32(36) }); } else { reject(new Error('PNG IHDR not found.')); } } else if (compareBuffers(view, IHDR_SIGNATURE, 12)) { resolve({ width: view.getUint32(16), height: view.getUint32(20) }); } else { reject(new Error('PNG IHDR not found.')); } }).catch(error => { return reject(error); }); }); } } const BMP_SIGNATURE = 0x424D; // BM class Bmp { getSize(file) { return new Promise((resolve, reject) => { if (file.size < 26) { reject(new Error('BMP signature not found.')); return; } const blob = file.slice(0, 26); getArrayBuffer(blob).then(buffer => { const view = new DataView(buffer); if (!view.getUint16(0) === BMP_SIGNATURE) { reject(new Error('BMP signature not found.')); return; } resolve({ width: view.getUint32(18, true), height: Math.abs(view.getInt32(22, true)) }); }).catch(error => { reject(error); }); }); } } const EXIF_SIGNATURE = convertStringToBuffer('Exif\0\0'); class Jpeg { getSize(file) { return new Promise((resolve, reject) => { if (file.size < 2) { reject(new Error('JPEG signature not found.')); return; } getArrayBuffer(file).then(buffer => { const view = new DataView(buffer); if (view.getUint8(0) !== 0xFF || view.getUint8(1) !== 0xD8) { reject(new Error('JPEG signature not found.')); return; } let offset = 2; let orientation = -1; for (;;) { if (view.byteLength - offset < 2) { reject(new Error('JPEG signature not found.')); return; } if (view.getUint8(offset++) !== 0xFF) { reject(new Error('JPEG signature not found.')); return; } let code = view.getUint8(offset++); let length = 0; // skip padding bytes while (code === 0xFF) { code = view.getUint8(offset++); } if (code >= 0xD0 && code <= 0xD9 || code === 0x01) { length = 0; } else if (code >= 0xC0 && code <= 0xFE) { // the rest of the unreserved markers if (view.byteLength - offset < 2) { reject(new Error('JPEG signature not found.')); return; } length = view.getUint16(offset) - 2; offset += 2; } else { reject(new Error('JPEG unknown markers.')); return; } if (code === 0xD9 /* EOI */ || code === 0xDA /* SOS */) { reject(new Error('JPEG end of the data stream.')); return; } // try to get orientation from Exif segment if (code === 0xE1 && length >= 10 && compareBuffers(view, EXIF_SIGNATURE, offset)) { const exifBlock = new DataView(view.buffer, offset + 6, offset + length); orientation = getOrientation(exifBlock); } if (length >= 5 && code >= 0xC0 && code <= 0xCF && code !== 0xC4 && code !== 0xC8 && code !== 0xCC) { if (view.byteLength - offset < length) { reject(new Error('JPEG size not found.')); return; } let width = view.getUint16(offset + 3); let height = view.getUint16(offset + 1); if (orientation >= 5 && orientation <= 8) { [width, height] = [height, width]; } resolve({ width, height, orientation }); return; } offset += length; } }).catch(error => { reject(error); }); }); } } const Marker = { BIG_ENDIAN: 0x4D4D, LITTLE_ENDIAN: 0x4949 }; const getOrientation = exifBlock => { const byteAlign = exifBlock.getUint16(0); const isBigEndian = byteAlign === Marker.BIG_ENDIAN; const isLittleEndian = byteAlign === Marker.LITTLE_ENDIAN; if (isBigEndian || isLittleEndian) { return extractOrientation(exifBlock, isLittleEndian); } return -1; }; const extractOrientation = (exifBlock, littleEndian = false) => { const offset = 8; // idf offset const idfDirectoryEntries = exifBlock.getUint16(offset, littleEndian); const IDF_ENTRY_BYTES = 12; const NUM_DIRECTORY_ENTRIES_BYTES = 2; for (let directoryEntryNumber = 0; directoryEntryNumber < idfDirectoryEntries; directoryEntryNumber++) { const start = offset + NUM_DIRECTORY_ENTRIES_BYTES + directoryEntryNumber * IDF_ENTRY_BYTES; const end = start + IDF_ENTRY_BYTES; // Skip on corrupt EXIF blocks if (start > exifBlock.byteLength) { return -1; } const block = new DataView(exifBlock.buffer, exifBlock.byteOffset + start, end - start); const tagNumber = block.getUint16(0, littleEndian); // 274 is the `orientation` tag ID if (tagNumber === 274) { const dataFormat = block.getUint16(2, littleEndian); if (dataFormat !== 3) { return -1; } const numberOfComponents = block.getUint32(4, littleEndian); if (numberOfComponents !== 1) { return -1; } return block.getUint16(8, littleEndian); } } return -1; }; const RIFF_HEADER = 0x52494646; // RIFF const WEBP_SIGNATURE = 0x57454250; // WEBP const VP8_SIGNATURE = 0x56503820; // VP8 const VP8L_SIGNATURE = 0x5650384C; // VP8L const VP8X_SIGNATURE = 0x56503858; // VP8X class Webp { getSize(file) { return new Promise((resolve, reject) => { if (file.size < 16) { reject(new Error('WEBP signature not found.')); return; } const blob = file.slice(0, 30); getArrayBuffer(blob).then(buffer => { const view = new DataView(buffer); if (view.getUint32(0) !== RIFF_HEADER && view.getUint32(8) !== WEBP_SIGNATURE) { reject(new Error('WEBP signature not found.')); return; } const headerType = view.getUint32(12); const headerView = new DataView(buffer, 20, 10); if (headerType === VP8_SIGNATURE && headerView.getUint8(0) !== 0x2F) { resolve({ width: headerView.getUint16(6, true) & 0x3FFF, height: headerView.getUint16(8, true) & 0x3FFF }); return; } if (headerType === VP8L_SIGNATURE && headerView.getUint8(0) === 0x2F) { const bits = headerView.getUint32(1, true); resolve({ width: (bits & 0x3FFF) + 1, height: (bits >> 14 & 0x3FFF) + 1 }); return; } if (headerType === VP8X_SIGNATURE) { const extendedHeader = headerView.getUint8(0); const validStart = (extendedHeader & 0xC0) === 0; const validEnd = (extendedHeader & 0x01) === 0; if (validStart && validEnd) { const animated = (extendedHeader & 2) === 2; // 00000010 means an animated image const width = 1 + (headerView.getUint8(6) << 16 | headerView.getUint8(5) << 8 | headerView.getUint8(4)); const height = 1 + (Math.trunc(headerView.getUint8(9)) | headerView.getUint8(8) << 8 | headerView.getUint8(7)); resolve({ width, height, animated }); return; } } reject(new Error('WEBP signature not found.')); }).catch(error => { reject(error); }); }); } } const jpg = new Jpeg(); const typeHandlers = { gif: new Gif(), png: new Png(), bmp: new Bmp(), jpg, jpeg: jpg, jpe: jpg, webp: new Webp() }; const getImageSize = file => { if (file.size === 0) { return Promise.reject(new Error('Unknown image type.')); } const extension = getFileExtension(file.name).toLowerCase(); const type = file.type.replace(/^image\//, ''); const typeHandler = typeHandlers[extension] || typeHandlers[type]; if (!typeHandler) { return Promise.reject(new Error('Unknown image type.')); } return typeHandler.getSize(file); }; var _imageMinWidth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imageMinWidth"); var _imageMinHeight = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imageMinHeight"); var _imageMaxWidth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imageMaxWidth"); var _imageMaxHeight = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imageMaxHeight"); var _ignoreUnknownImageTypes = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ignoreUnknownImageTypes"); var _treatOversizeImageAsFile$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("treatOversizeImageAsFile"); class ImageSizeFilter extends Filter { constructor(uploader, filterOptions = {}) { super(uploader); Object.defineProperty(this, _imageMinWidth, { writable: true, value: 1 }); Object.defineProperty(this, _imageMinHeight, { writable: true, value: 1 }); Object.defineProperty(this, _imageMaxWidth, { writable: true, value: 7000 }); Object.defineProperty(this, _imageMaxHeight, { writable: true, value: 7000 }); Object.defineProperty(this, _ignoreUnknownImageTypes, { writable: true, value: false }); Object.defineProperty(this, _treatOversizeImageAsFile$1, { writable: true, value: false }); const settings = main_core.Extension.getSettings('ui.uploader.core'); babelHelpers.classPrivateFieldLooseBase(this, _imageMinWidth)[_imageMinWidth] = settings.get('imageMinWidth', babelHelpers.classPrivateFieldLooseBase(this, _imageMinWidth)[_imageMinWidth]); babelHelpers.classPrivateFieldLooseBase(this, _imageMinHeight)[_imageMinHeight] = settings.get('imageMinHeight', babelHelpers.classPrivateFieldLooseBase(this, _imageMinHeight)[_imageMinHeight]); babelHelpers.classPrivateFieldLooseBase(this, _imageMaxWidth)[_imageMaxWidth] = settings.get('imageMaxWidth', babelHelpers.classPrivateFieldLooseBase(this, _imageMaxWidth)[_imageMaxWidth]); babelHelpers.classPrivateFieldLooseBase(this, _imageMaxHeight)[_imageMaxHeight] = settings.get('imageMaxHeight', babelHelpers.classPrivateFieldLooseBase(this, _imageMaxHeight)[_imageMaxHeight]); const options = main_core.Type.isPlainObject(filterOptions) ? filterOptions : {}; this.setImageMinWidth(options.imageMinWidth); this.setImageMinHeight(options.imageMinHeight); this.setImageMaxWidth(options.imageMaxWidth); this.setImageMaxHeight(options.imageMaxHeight); this.setIgnoreUnknownImageTypes(options.ignoreUnknownImageTypes); this.setTreatOversizeImageAsFile(options.treatOversizeImageAsFile); } apply(file) { return new Promise((resolve, reject) => { if (!isResizableImage(file.getName(), file.getType())) { resolve(); return; } getImageSize(file.getBinary()).then(({ width, height, animated }) => { file.setWidth(width); file.setHeight(height); file.setAnimated(animated === true); if (width < this.getImageMinWidth() || height < this.getImageMinHeight()) { if (this.shouldTreatOversizeImageAsFile()) { file.setTreatImageAsFile(true); resolve(); } else { reject(new UploaderError('IMAGE_IS_TOO_SMALL', { minWidth: this.getImageMinWidth(), minHeight: this.getImageMinHeight() })); } } else if (width > this.getImageMaxWidth() || height > this.getImageMaxHeight()) { if (this.shouldTreatOversizeImageAsFile()) { file.setTreatImageAsFile(true); resolve(); } else { reject(new UploaderError('IMAGE_IS_TOO_BIG', { maxWidth: this.getImageMaxWidth(), maxHeight: this.getImageMaxHeight() })); } } else { resolve(); } }).catch(error => { if (this.getIgnoreUnknownImageTypes()) { file.setTreatImageAsFile(true); resolve(); } else { if (error) { // eslint-disable-next-line no-console console.warn('Uploader ImageSizeFilter:', error); } reject(new UploaderError('IMAGE_TYPE_NOT_SUPPORTED')); } }); }); } getImageMinWidth() { return babelHelpers.classPrivateFieldLooseBase(this, _imageMinWidth)[_imageMinWidth]; } setImageMinWidth(value) { if (main_core.Type.isNumber(value) && value > 0) { babelHelpers.classPrivateFieldLooseBase(this, _imageMinWidth)[_imageMinWidth] = value; } } getImageMinHeight() { return babelHelpers.classPrivateFieldLooseBase(this, _imageMinHeight)[_imageMinHeight]; } setImageMinHeight(value) { if (main_core.Type.isNumber(value) && value > 0) { babelHelpers.classPrivateFieldLooseBase(this, _imageMinHeight)[_imageMinHeight] = value; } } getImageMaxWidth() { return babelHelpers.classPrivateFieldLooseBase(this, _imageMaxWidth)[_imageMaxWidth]; } setImageMaxWidth(value) { if (main_core.Type.isNumber(value) && value > 0) { babelHelpers.classPrivateFieldLooseBase(this, _imageMaxWidth)[_imageMaxWidth] = value; } } getImageMaxHeight() { return babelHelpers.classPrivateFieldLooseBase(this, _imageMaxHeight)[_imageMaxHeight]; } setImageMaxHeight(value) { if (main_core.Type.isNumber(value) && value > 0) { babelHelpers.classPrivateFieldLooseBase(this, _imageMaxHeight)[_imageMaxHeight] = value; } } getIgnoreUnknownImageTypes() { return babelHelpers.classPrivateFieldLooseBase(this, _ignoreUnknownImageTypes)[_ignoreUnknownImageTypes]; } setIgnoreUnknownImageTypes(value) { if (main_core.Type.isBoolean(value)) { babelHelpers.classPrivateFieldLooseBase(this, _ignoreUnknownImageTypes)[_ignoreUnknownImageTypes] = value; } } setTreatOversizeImageAsFile(value) { if (main_core.Type.isBoolean(value)) { babelHelpers.classPrivateFieldLooseBase(this, _treatOversizeImageAsFile$1)[_treatOversizeImageAsFile$1] = value; } } shouldTreatOversizeImageAsFile() { return babelHelpers.classPrivateFieldLooseBase(this, _treatOversizeImageAsFile$1)[_treatOversizeImageAsFile$1]; } } const createWorker = fn => { const workerBlob = new Blob(['(', fn.toString(), ')()'], { type: 'application/javascript' }); const workerURL = URL.createObjectURL(workerBlob); const worker = new Worker(workerURL); return { post: (message, callback, transfer) => { const id = createUniqueId(); worker.onmessage = event => { if (event.data.id === id) { callback(event.data.message); } }; worker.postMessage({ id, message }, transfer); }, terminate: () => { worker.terminate(); URL.revokeObjectURL(workerURL); } }; }; const BitmapWorker = function () { self.onmessage = event => { // Hack for Safari. Workers can become unpredictable. // Sometimes 'self.postMessage' doesn't emit 'onmessage' event. setTimeout(() => { createImageBitmap(event.data.message.file).then(bitmap => { var _event$data; self.postMessage({ id: event == null ? void 0 : (_event$data = event.data) == null ? void 0 : _event$data.id, message: bitmap }, [bitmap]); }).catch(() => { self.postMessage({ id: event.data.id, message: null }, []); }); }, 0); }; }; /* eslint-disable no-new-func */ const ResizeWorker = () => { self.onmessage = event => { // Hack for Safari. Workers can become unpredictable. // Sometimes 'self.postMessage' doesn't emit 'onmessage' event. setTimeout(() => { const { file, options = {}, getResizedImageSizeSource, createImagePreviewCanvasSource, sharpenSource, shouldSharpenSource /* type, */ } = event.data.message; createImageBitmap(file).then(bitmap => { const getResizedImageSize = new Function(`return ${getResizedImageSizeSource}`)(); const { targetWidth, targetHeight, useOriginalSize } = getResizedImageSize(bitmap, options); if (useOriginalSize) { var _event$data; bitmap.close(); self.postMessage({ id: event == null ? void 0 : (_event$data = event.data) == null ? void 0 : _event$data.id, message: { useOriginalSize, targetWidth, targetHeight } }, []); } else { var _event$data2; const createImagePreviewCanvas = new Function(`return ${createImagePreviewCanvasSource}`)(); let offscreenCanvas = createImagePreviewCanvas(bitmap, targetWidth, targetHeight); const sharpen = new Function(`return ${sharpenSource}`)(); const shouldSharpen = new Function(`return ${shouldSharpenSource}`)(); if (shouldSharpen(bitmap, targetWidth, targetHeight)) { sharpen(offscreenCanvas, targetWidth, targetHeight, 0.2); } bitmap.close(); const previewBitmap = offscreenCanvas.transferToImageBitmap(); offscreenCanvas.width = 0; offscreenCanvas.height = 0; offscreenCanvas = null; self.postMessage({ id: event == null ? void 0 : (_event$data2 = event.data) == null ? void 0 : _event$data2.id, message: { bitmap: previewBitmap, useOriginalSize, targetWidth, targetHeight } }, [previewBitmap]); // const { quality = 0.92 } = options; // offscreenCanvas.convertToBlob({ quality, type }) // .then((blob: Blob): void => { // self.postMessage({ // id: event?.data?.id, // message: { // blob, // useOriginalSize, // targetWidth, // targetHeight, // }, // }, []); // }) // .catch((error): void => { // console.log('Resize Worker Error (convertToBlob)', error); // self.postMessage({ // id: event.data.id, // message: null, // }, []); // }) // ; } }).catch(error => { // eslint-disable-next-line no-console console.log('Uploader: Resize Worker Error (createImageBitmap)', error); self.postMessage({ id: event.data.id, message: null }, []); }); }, 0); }; }; const loadImage = file => new Promise((resolve, reject) => { const image = document.createElement('img'); const url = URL.createObjectURL(file); image.src = url; image.onerror = error => { URL.revokeObjectURL(image.src); reject(error); }; image.onload = () => { URL.revokeObjectURL(url); resolve({ width: image.naturalWidth, height: image.naturalHeight, image }); }; }); /* eslint-disable @bitrix24/bitrix24-rules/no-typeof */ // Warning! // This function uses in a resize workers. // You cannot import anything from other files and extensions. const createImagePreviewCanvas = (imageSource, newWidth, newHeight) => { const width = Math.round(newWidth); const height = Math.round(newHeight); const isPageContext = typeof window !== 'undefined' && typeof document !== 'undefined' && typeof parent !== 'undefined'; const createCanvas = (canvasWidth, canvasHeight) => { if (isPageContext) { const canvas = document.createElement('canvas'); canvas.width = canvasWidth; canvas.height = canvasHeight; return canvas; } return new OffscreenCanvas(canvasWidth, canvasHeight); }; if (imageSource.height <= height && imageSource.width <= width) { const canvas = createCanvas(width, height); const context = canvas.getContext('2d'); context.imageSmoothingQuality = 'high'; context.drawImage(imageSource, 0, 0, width, height); return canvas; } let currentImageWidth = Math.floor(imageSource.width); let currentImageHeight = Math.floor(imageSource.height); let currentImageSource = imageSource; let resizingCanvas = null; while (currentImageWidth * 0.5 > width) { const halfImageWidth = Math.floor(currentImageWidth * 0.5); const halfImageHeight = Math.floor(currentImageHeight * 0.5); resizingCanvas = createCanvas(halfImageWidth, halfImageHeight); const resizingCanvasContext = resizingCanvas.getContext('2d'); resizingCanvasContext.imageSmoothingQuality = 'high'; resizingCanvasContext.drawImage(currentImageSource, 0, 0, currentImageWidth, currentImageHeight, 0, 0, halfImageWidth, halfImageHeight); currentImageWidth = halfImageWidth; currentImageHeight = halfImageHeight; currentImageSource = resizingCanvas; } const outputCanvas = createCanvas(width, height); const outputCanvasContext = outputCanvas.getContext('2d'); outputCanvasContext.imageSmoothingQuality = 'high'; outputCanvasContext.drawImage(resizingCanvas === null ? imageSource : resizingCanvas, 0, 0, currentImageWidth, currentImageHeight, 0, 0, width, height); if (resizingCanvas) { resizingCanvas.width = 0; resizingCanvas.height = 0; resizingCanvas = null; currentImageSource.width = 0; currentImageSource.height = 0; currentImageSource = null; } return outputCanvas; }; const getResizedImageSize = (imageData, options) => { const { mode = 'contain', upscale = false } = options; let { width, height } = options; if (!width && !height) { return { targetWidth: 0, targetHeight: 0, useOriginalSize: true }; } if (width === null) { width = height; } else if (height === null) { height = width; } if (mode !== 'force') { const ratioWidth = width / imageData.width; const ratioHeight = height / imageData.height; let ratio = 1; if (mode === 'cover') { ratio = Math.max(ratioWidth, ratioHeight); } else if (mode === 'contain') { ratio = Math.min(ratioWidth, ratioHeight); } // if image is too small, exit here with original image if (ratio > 1 && upscale === false) { return { targetWidth: imageData.width, targetHeight: imageData.height, useOriginalSize: true }; } width = imageData.width * ratio; height = imageData.height * ratio; } /* if (mode === 'crop') { const sourceImageRatio = sourceImageWidth / sourceImageHeight; const targetRatio = targetWidth / targetHeight; if (sourceImageRatio > targetRatio) { const newWidth = sourceImageHeight * targetRatio; srcX = (sourceImageWidth - newWidth) / 2; sourceImageWidth = newWidth; } else { const newHeight = sourceImageWidth / targetRatio; srcY = (sourceImageHeight - newHeight) / 2; sourceImageHeight = newHeight; } context.drawImage(image, srcX, srcY, sourceImageWidth, sourceImageHeight, 0, 0, targetWidth, targetHeight); } */ return { targetWidth: Math.floor(width), targetHeight: Math.floor(height), useOriginalSize: false }; }; const canvasPrototype = window.HTMLCanvasElement && window.HTMLCanvasElement.prototype; const hasToBlobSupport = window.HTMLCanvasElement && canvasPrototype.toBlob; const canUseOffscreenCanvas = !main_core.Type.isUndefined(window.OffscreenCanvas); const convertCanvasToBlob = (canvas, type, quality) => { return new Promise((resolve, reject) => { if (canUseOffscreenCanvas && canvas instanceof OffscreenCanvas) { canvas.convertToBlob({ type, quality }).then(blob => { resolve(blob); }).catch(error => { reject(error); }); } else if (hasToBlobSupport) { canvas.toBlob(blob => { resolve(blob); }, type, quality); } else { const blob = createBlobFromDataUri(canvas.toDataURL(type, quality)); resolve(blob); } }); }; const supportedMimeTypes = main_core.Browser.isSafari() ? ['image/jpeg', 'image/png'] : ['image/jpeg', 'image/png', 'image/webp']; const isSupportedMimeType = mimeType => { return supportedMimeTypes.includes(mimeType); }; const sharpen = (canvas, width, height, mixFactor) => { const context = canvas.getContext('2d'); const weights = [0, -1, 0, -1, 5, -1, 0, -1, 0]; const katet = Math.round(Math.sqrt(weights.length)); const half = Math.trunc(katet * 0.5); const destinationData = context.createImageData(width, height); const destinationBuffer = destinationData.data; const sourceBuffer = context.getImageData(0, 0, width, height).data; let y = height; while (y--) { let x = width; while (x--) { const sy = y; const sx = x; const dstOff = (y * width + x) * 4; let red = 0; let green = 0; let blue = 0; // let alpha = 0; for (let cy = 0; cy < katet; cy++) { for (let cx = 0; cx < katet; cx++) { const scy = sy + cy - half; const scx = sx + cx - half; if (scy >= 0 && scy < height && scx >= 0 && scx < width) { const srcOff = (scy * width + scx) * 4; const wt = weights[cy * katet + cx]; red += sourceBuffer[srcOff] * wt; green += sourceBuffer[srcOff + 1] * wt; blue += sourceBuffer[srcOff + 2] * wt; // alpha += sourceBuffer[srcOff + 3] * wt; } } } destinationBuffer[dstOff] = red * mixFactor + sourceBuffer[dstOff] * (1 - mixFactor); destinationBuffer[dstOff + 1] = green * mixFactor + sourceBuffer[dstOff + 1] * (1 - mixFactor); destinationBuffer[dstOff + 2] = blue * mixFactor + sourceBuffer[dstOff + 2] * (1 - mixFactor); destinationBuffer[dstOff + 3] = sourceBuffer[dstOff + 3]; } } context.putImageData(destinationData, 0, 0); }; const shouldSharpen = (imageData, width, height) => { const scaleX = width / imageData.width; const scaleY = height / imageData.height; const scale = Math.min(scaleX, scaleY); // if target scale is less than half return scale < 0.5; }; const createImagePreview = (imageData, options) => { const { targetWidth, targetHeight } = getResizedImageSize(imageData, options); const canvas = createImagePreviewCanvas(imageData, targetWidth, targetHeight); if (shouldSharpen(imageData, targetWidth, targetHeight)) { sharpen(canvas, targetWidth, targetHeight, 0.2); } const { quality = 0.92 } = options; const mimeType = isSupportedMimeType(options.mimeType) ? options.mimeType : 'image/jpeg'; return convertCanvasToBlob(canvas, mimeType, quality).then(blob => { return { width: targetWidth, height: targetHeight, blob }; }); }; const getCanvasToBlobType = (blob, options) => { const mimeType = isSupportedMimeType(options.mimeType) ? options.mimeType : 'image/jpeg'; const mimeTypeMode = options.mimeTypeMode; if (mimeTypeMode === 'force') { return mimeType; } return isSupportedMimeType(blob.type) ? blob.type : mimeType; }; const getFilenameWithoutExtension = name => { return name.slice(0, Math.max(0, name.lastIndexOf('.'))) || name; }; const extensionMap = { jpeg: 'jpg' }; const renameFileToMatchMimeType = (filename, mimeType) => { const name = getFilenameWithoutExtension(filename); const type = mimeType.split('/')[1]; const extension = extensionMap[type] || type; return `${name}.${extension}`; }; let canCreateImageBitmap = 'createImageBitmap' in window && !main_core.Type.isUndefined(window.ImageBitmap) && ImageBitmap.prototype && ImageBitmap.prototype.close; if (canCreateImageBitmap && main_core.Browser.isSafari()) { const ua = navigator.userAgent.toLowerCase(); const regex = /version\/([\d.]+)/i; const result = regex.exec(ua); if (result && result[1] && result[1] < '16.4') { // Webkit bug https://bugs.webkit.org/show_bug.cgi?id=223326 canCreateImageBitmap = false; } } const createImagePreviewCanvasSource = createImagePreviewCanvas.toString(); const getResizedImageSizeSource = getResizedImageSize.toString(); const sharpenSource = sharpen.toString(); const shouldSharpenSource = shouldSharpen.toString(); const canUseOffscreenCanvas$1 = canCreateImageBitmap && !main_core.Type.isUndefined(window.OffscreenCanvas); // eslint-disable-next-line max-lines-per-function const resizeImage = (source, options) => { // eslint-disable-next-line max-lines-per-function return new Promise((resolve, reject) => { if (canUseOffscreenCanvas$1) { const resizeWorker = createWorker(ResizeWorker); const type = getCanvasToBlobType(source, options); resizeWorker.post({ file: source, type, options, createImagePreviewCanvasSource, getResizedImageSizeSource, sharpenSource, shouldSharpenSource }, message => { resizeWorker.terminate(); if (message) { const { bitmap, targetWidth, targetHeight, useOriginalSize } = message; if (useOriginalSize) { resolve({ preview: source, width: targetWidth, height: targetHeight }); } else { let canvas = document.createElement('canvas'); canvas.width = bitmap.width; canvas.height = bitmap.height; const context = canvas.getContext('bitmaprenderer'); context.transferFromImageBitmap(bitmap); // console.log('bitmaprenderer'); const { quality = 0.92 } = options; convertCanvasToBlob(canvas, type, quality).then(blob => { let preview = blob; if (main_core.Type.isFile(source)) { // File type could be changed pic.gif -> pic.jpg const newFileName = renameFileToMatchMimeType(source.name, type); preview = createFileFromBlob(blob, newFileName); } resolve({ preview, width: targetWidth, height: targetHeight }); }).catch(error => { // eslint-disable-next-line no-console console.log('Uploader: convertCanvasToBlob error', error); loadImageDataFallback(); }).finally(() => { canvas.width = 0; canvas.height = 0; canvas = null; bitmap.close(); }); // let preview: Blob = blob; // if (Type.isFile(source)) // { // // File type could be changed pic.gif -> pic.jpg // const newFileName = renameFileToMatchMimeType(source.name, type); // preview = createFileFromBlob(blob, newFileName); // } // // resolve({ // preview, // width: targetWidth, // height: targetHeight, // }); } } else { loadImageDataFallback(); } }); } else if (canCreateImageBitmap) { const bitmapWorker = createWorker(BitmapWorker); bitmapWorker.post({ file: source }, imageBitmap => { bitmapWorker.terminate(); if (imageBitmap) { handleImageLoad(imageBitmap); } else { loadImageDataFallback(); } }); } else { loadImageDataFallback(); } function handleImageLoad(imageData) { const { useOriginalSize, targetWidth, targetHeight } = getResizedImageSize(imageData, options); if (useOriginalSize) { // if it was ImageBitmap if ('close' in imageData) { imageData.close(); } resolve({ preview: source, width: targetWidth, height: targetHeight }); } else { const mimeType = getCanvasToBlobType(source, options); createImagePreview(imageData, { ...options, mimeType }).then(({ blob, width, height }) => { let preview = blob; if (main_core.Type.isFile(source)) { // File type could be changed pic.gif -> pic.jpg const newFileName = renameFileToMatchMimeType(source.name, mimeType); preview = createFileFromBlob(blob, newFileName); } resolve({ preview, width, height }); }).catch(error => { reject(error); }).finally(() => { // if it was ImageBitmap if ('close' in imageData) { imageData.close(); } }); } } function loadImageDataFallback() { // eslint-disable-next-line no-console console.log('Uploader: resize image fallback'); loadImage(source).then(({ image }) => { handleImageLoad(image); }).catch(error => { reject(error); }); } }); }; const isVideo = file => { return /^video\/[\d.a-z-]+$/i.test(file.getType()) || file.getExtension() === 'mkv'; }; const createVideoPreview = (blob, options = { width: 300, height: 3000 }, seekTime = 10) => { return new Promise((resolve, reject) => { const video = document.createElement('video'); video.setAttribute('src', URL.createObjectURL(blob)); video.load(); main_core.Event.bind(video, 'error', error => { reject(error || 'Error while loading video file'); }); main_core.Event.bind(video, 'loadedmetadata', () => { video.currentTime = video.duration < seekTime ? 0 : seekTime; main_core.Event.bind(video, 'seeked', () => { const imageData = { width: video.videoWidth, height: video.videoHeight }; const { targetWidth, targetHeight } = getResizedImageSize(imageData, options); if (!targetWidth || !targetHeight) { reject(); return; } const canvas = createImagePreviewCanvas(video, targetWidth, targetHeight); const { quality = 0.92, mimeType = 'image/jpeg' } = options; convertCanvasToBlob(canvas, mimeType, quality).then(blob => { resolve({ preview: blob, width: targetWidth, height: targetHeight }); }).catch(() => { reject(); }); }); }); }); }; var _imagePreviewWidth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imagePreviewWidth"); var _imagePreviewHeight = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imagePreviewHeight"); var _imagePreviewQuality = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imagePreviewQuality"); var _imagePreviewMimeType = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imagePreviewMimeType"); var _imagePreviewMimeTypeMode = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imagePreviewMimeTypeMode"); var _imagePreviewUpscale = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imagePreviewUpscale"); var _imagePreviewResizeMode = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imagePreviewResizeMode"); var _imagePreviewFilter = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("imagePreviewFilter"); var _getResizeImageOptions = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("getResizeImageOptions"); class ImagePreviewFilter extends Filter { constructor(uploader, filterOptions = {}) { super(uploader); Object.defineProperty(this, _getResizeImageOptions, { value: _getResizeImageOptions2 }); Object.defineProperty(this, _imagePreviewWidth, { writable: true, value: 300 }); Object.defineProperty(this, _imagePreviewHeight, { writable: true, value: 300 }); Object.defineProperty(this, _imagePreviewQuality, { writable: true, value: 0.92 }); Object.defineProperty(this, _imagePreviewMimeType, { writable: true, value: 'image/jpeg' }); Object.defineProperty(this, _imagePreviewMimeTypeMode, { writable: true, value: 'auto' }); Object.defineProperty(this, _imagePreviewUpscale, { writable: true, value: false }); Object.defineProperty(this, _imagePreviewResizeMode, { writable: true, value: 'contain' }); Object.defineProperty(this, _imagePreviewFilter, { writable: true, value: null }); const options = main_core.Type.isPlainObject(filterOptions) ? filterOptions : {}; this.setImagePreviewWidth(options.imagePreviewWidth); this.setImagePreviewHeight(options.imagePreviewHeight); this.setImagePreviewQuality(options.imagePreviewQuality); this.setImagePreviewUpscale(options.imagePreviewUpscale); this.setImagePreviewResizeMode(options.imagePreviewResizeMode); this.setImagePreviewMimeType(options.imagePreviewMimeType); this.setImagePreviewMimeTypeMode(options.imagePreviewMimeTypeMode); this.setImagePreviewFilter(options.imagePreviewFilter); } apply(file) { return new Promise(resolve => { if (!file.shouldTreatImageAsFile() && isResizableImage(file.getBinary())) { const result = this.invokeFilter(file); if (result === false) { resolve(); return; } const resizeOptions = main_core.Type.isPlainObject(result) ? result : {}; // const start = performance.now(); resizeImage(file.getBinary(), babelHelpers.classPrivateFieldLooseBase(this, _getResizeImageOptions)[_getResizeImageOptions](resizeOptions)).then(({ preview, width, height }) => { // console.log(`resizeImage took ${performance.now() - start} milliseconds.`); file.setClientPreview(preview, width, height); resolve(); }).catch(error => { if (error) { // eslint-disable-next-line no-console console.warn('Uploader: image resize error', error); } resolve(); }); } else if (isVideo(file) && !main_core.Browser.isSafari()) { createVideoPreview(file.getBinary(), babelHelpers.classPrivateFieldLooseBase(this, _getResizeImageOptions)[_getResizeImageOptions]()).then(({ preview, width, height }) => { file.setClientPreview(preview, width, height); resolve(); }).catch(error => { if (error) { // eslint-disable-next-line no-console console.warn('Uploader: video preview error', error); } resolve(); }); } else { resolve(); } }); } getImagePreviewWidth() { return babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewWidth)[_imagePreviewWidth]; } setImagePreviewWidth(value) { if (main_core.Type.isNumber(value) && value > 0) { babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewWidth)[_imagePreviewWidth] = value; } } getImagePreviewHeight() { return babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewHeight)[_imagePreviewHeight]; } setImagePreviewHeight(value) { if (main_core.Type.isNumber(value) && value > 0) { babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewHeight)[_imagePreviewHeight] = value; } } getImagePreviewQuality() { return babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewQuality)[_imagePreviewQuality]; } setImagePreviewQuality(value) { if (main_core.Type.isNumber(value) && value > 0.1 && value <= 1) { babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewQuality)[_imagePreviewQuality] = value; } } getImagePreviewUpscale() { return babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewUpscale)[_imagePreviewUpscale]; } setImagePreviewUpscale(value) { if (main_core.Type.isBoolean(value)) { babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewUpscale)[_imagePreviewUpscale] = value; } } getImagePreviewResizeMode() { return babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewResizeMode)[_imagePreviewResizeMode]; } setImagePreviewResizeMode(value) { if (['contain', 'force', 'cover'].includes(value)) { babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewResizeMode)[_imagePreviewResizeMode] = value; } } getImagePreviewMimeType() { return babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewMimeType)[_imagePreviewMimeType]; } setImagePreviewMimeType(value) { if (['image/jpeg', 'image/png', 'image/webp'].includes(value)) { babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewMimeType)[_imagePreviewMimeType] = value; } } getImagePreviewMimeTypeMode() { return babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewMimeTypeMode)[_imagePreviewMimeTypeMode]; } setImagePreviewMimeTypeMode(value) { if (['auto', 'force'].includes(value)) { babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewMimeTypeMode)[_imagePreviewMimeTypeMode] = value; } } setImagePreviewFilter(fn) { if (main_core.Type.isFunction(fn)) { babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewFilter)[_imagePreviewFilter] = fn; } } invokeFilter(file) { if (babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewFilter)[_imagePreviewFilter] !== null) { const result = babelHelpers.classPrivateFieldLooseBase(this, _imagePreviewFilter)[_imagePreviewFilter](file); if (main_core.Type.isBoolean(result) || main_core.Type.isPlainObject(result)) { return result; } } return true; } } function _getResizeImageOptions2(overrides = {}) { return { width: main_core.Type.isNumber(overrides.width) ? overrides.width : this.getImagePreviewWidth(), height: main_core.Type.isNumber(overrides.height) ? overrides.height : this.getImagePreviewHeight(), mode: main_core.Type.isStringFilled(overrides.mode) ? overrides.mode : this.getImagePreviewResizeMode(), upscale: main_core.Type.isBoolean(overrides.upscale) ? overrides.upscale : this.getImagePreviewUpscale(), quality: main_core.Type.isNumber(overrides.quality) ? overrides.quality : this.getImagePreviewQuality(), mimeType: main_core.Type.isStringFilled(overrides.mimeType) ? overrides.mimeType : this.getImagePreviewMimeType(), mimeTypeMode: main_core.Type.isStringFilled(overrides.mimeTypeMode) ? overrides.mimeTypeMode : this.getImagePreviewMimeTypeMode() }; } var _resizeWidth = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("resizeWidth"); var _resizeHeight = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("resizeHeight"); var _resizeMethod = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("resizeMethod"); var _resizeMimeType = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("resizeMimeType"); var _resizeMimeTypeMode = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("resizeMimeTypeMode"); var _resizeQuality = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("resizeQuality"); var _resizeFilter = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("resizeFilter"); class ImageResizeFilter extends Filter { constructor(uploader, filterOptions = {}) { super(uploader); Object.defineProperty(this, _resizeWidth, { writable: true, value: null }); Object.defineProperty(this, _resizeHeight, { writable: true, value: null }); Object.defineProperty(this, _resizeMethod, { writable: true, value: 'contain' }); Object.defineProperty(this, _resizeMimeType, { writable: true, value: 'image/jpeg' }); Object.defineProperty(this, _resizeMimeTypeMode, { writable: true, value: 'auto' }); Object.defineProperty(this, _resizeQuality, { writable: true, value: 0.92 }); Object.defineProperty(this, _resizeFilter, { writable: true, value: null }); const options = main_core.Type.isPlainObject(filterOptions) ? filterOptions : {}; this.setResizeWidth(options.imageResizeWidth); this.setResizeHeight(options.imageResizeHeight); this.setResizeMode(options.imageResizeMode); this.setResizeMimeType(options.imageResizeMimeType); this.setResizeMimeTypeMode(options.imageResizeMimeTypeMode); this.setResizeQuality(options.imageResizeQuality); this.setResizeFilter(options.imageResizeFilter); } apply(file) { return new Promise(resolve => { if (this.getResizeWidth() === null && this.getResizeHeight() === null) { resolve(); return; } if (file.shouldTreatImageAsFile() || !isResizableImage(file.getBinary())) { resolve(); return; } const result = this.invokeFilter(file); if (result === false) { resolve(); return; } const overrides = main_core.Type.isPlainObject(result) ? result : {}; const options = { width: main_core.Type.isNumber(overrides.width) ? overrides.width : this.getResizeWidth(), height: main_core.Type.isNumber(overrides.height) ? overrides.height : this.getResizeHeight(), mode: main_core.Type.isStringFilled(overrides.mode) ? overrides.mode : this.getResizeMode(), quality: main_core.Type.isNumber(overrides.quality) ? overrides.quality : this.getResizeQuality(), mimeType: main_core.Type.isStringFilled(overrides.mimeType) ? overrides.mimeType : this.getResizeMimeType(), mimeTypeMode: main_core.Type.isStringFilled(overrides.mimeTypeMode) ? overrides.mimeTypeMode : this.getResizeMimeTypeMode() }; resizeImage(file.getBinary(), options).then(({ preview, width, height }) => { file.setWidth(width); file.setHeight(height); file.setFile(preview); resolve(); }).catch(error => { if (error) { // eslint-disable-next-line no-console console.warn('image resize error', error); } resolve(); }); }); } getResizeWidth() { return babelHelpers.classPrivateFieldLooseBase(this, _resizeWidth)[_resizeWidth]; } setResizeWidth(value) { if (main_core.Type.isNumber(value) && value > 0 || main_core.Type.isNull(value)) { babelHelpers.classPrivateFieldLooseBase(this, _resizeWidth)[_resizeWidth] = value; } } getResizeHeight() { return babelHelpers.classPrivateFieldLooseBase(this, _resizeHeight)[_resizeHeight]; } setResizeHeight(value) { if (main_core.Type.isNumber(value) && value > 0 || main_core.Type.isNull(value)) { babelHelpers.classPrivateFieldLooseBase(this, _resizeHeight)[_resizeHeight] = value; } } getResizeMode() { return babelHelpers.classPrivateFieldLooseBase(this, _resizeMethod)[_resizeMethod]; } setResizeMode(value) { if (['contain', 'force', 'cover'].includes(value)) { babelHelpers.classPrivateFieldLooseBase(this, _resizeMethod)[_resizeMethod] = value; } } getResizeMimeType() { return babelHelpers.classPrivateFieldLooseBase(this, _resizeMimeType)[_resizeMimeType]; } setResizeMimeType(value) { if (['image/jpeg', 'image/png', 'image/webp'].includes(value)) { babelHelpers.classPrivateFieldLooseBase(this, _resizeMimeType)[_resizeMimeType] = value; } } getResizeMimeTypeMode() { return babelHelpers.classPrivateFieldLooseBase(this, _resizeMimeTypeMode)[_resizeMimeTypeMode]; } setResizeMimeTypeMode(value) { if (['auto', 'force'].includes(value)) { babelHelpers.classPrivateFieldLooseBase(this, _resizeMimeTypeMode)[_resizeMimeTypeMode] = value; } } getResizeQuality() { return babelHelpers.classPrivateFieldLooseBase(this, _resizeQuality)[_resizeQuality]; } setResizeQuality(value) { if (main_core.Type.isNumber(value) && value > 0.1 && value <= 1) { babelHelpers.classPrivateFieldLooseBase(this, _resizeQuality)[_resizeQuality] = value; } } setResizeFilter(fn) { if (main_core.Type.isFunction(fn)) { babelHelpers.classPrivateFieldLooseBase(this, _resizeFilter)[_resizeFilter] = fn; } } invokeFilter(file) { if (babelHelpers.classPrivateFieldLooseBase(this, _resizeFilter)[_resizeFilter] !== null) { const result = babelHelpers.classPrivateFieldLooseBase(this, _resizeFilter)[_resizeFilter](file); if (main_core.Type.isBoolean(result) || main_core.Type.isPlainObject(result)) { return result; } } return true; } } const UploaderStatus = { STARTED: 0, STOPPED: 1 }; /** * @namespace BX.UI.Uploader */ const UploaderEvent = { UPLOAD_START: 'onUploadStart', UPLOAD_COMPLETE: 'onUploadComplete', ERROR: 'onError', MAX_FILE_COUNT_EXCEEDED: 'onMaxFileCountExceeded', DESTROY: 'onDestroy', BEFORE_BROWSE: 'onBeforeBrowse', BEFORE_DROP: 'onBeforeDrop', BEFORE_PASTE: 'onBeforePaste', BEFORE_FILES_ADD: 'onBeforeFilesAdd', FILE_BEFORE_ADD: 'File:onBeforeAdd', FILE_ADD_START: 'File:onAddStart', FILE_LOAD_START: 'File:onLoadStart', FILE_LOAD_PROGRESS: 'File:onLoadProgress', FILE_LOAD_COMPLETE: 'File:onLoadComplete', FILE_ERROR: 'File:onError', FILE_ADD: 'File:onAdd', FILE_REMOVE: 'File:onRemove', FILE_UPLOAD_START: 'File:onUploadStart', FILE_UPLOAD_PROGRESS: 'File:onUploadProgress', FILE_UPLOAD_COMPLETE: 'File:onUploadComplete', FILE_COMPLETE: 'File:onComplete', FILE_STATUS_CHANGE: 'File:onStatusChange', FILE_STATE_CHANGE: 'File:onStateChange' }; /** * @namespace BX.UI.Uploader */ const FilterType = { VALIDATION: 'validation', PREPARATION: 'preparation' }; const getFilesInDirectory = entry => { return new Promise((resolve, reject) => { const files = []; let dirCounter = 0; let fileCounter = 0; const resolveIfDone = () => { if (fileCounter === 0 && dirCounter === 0) { resolve(files); } }; const readEntries = dirEntry => { dirCounter++; const directoryReader = dirEntry.createReader(); const readBatch = () => { directoryReader.readEntries(entries => { if (entries.length === 0) { dirCounter--; resolveIfDone(); return; } entries.forEach(fileEntry => { if (fileEntry.isDirectory) { readEntries(fileEntry); } else { fileCounter++; fileEntry.file(file => { files.push(file); fileCounter--; resolveIfDone(); }); } }); readBatch(); }, reject); }; readBatch(); }; readEntries(entry); }); }; const isDirectoryEntry = item => { return 'webkitGetAsEntry' in item && (item.webkitGetAsEntry() || {}).isDirectory === true; }; const isFileSystemItem = item => { if ('webkitGetAsEntry' in item) { const entry = item.webkitGetAsEntry(); if (entry) { return entry.isFile || entry.isDirectory; } } return item.kind === 'file'; }; const getFilesFromItem = item => { return new Promise((resolve, reject) => { if (isDirectoryEntry(item)) { getFilesInDirectory(item.webkitGetAsEntry()).then(resolve).catch(reject); return; } resolve([item.getAsFile()]); }); }; const getFilesFromDataTransfer = (dataTransfer, browseFolders = true) => { return new Promise((resolve, reject) => { if (!dataTransfer.items || dataTransfer.items.length === 0) { resolve(dataTransfer.files ? [...dataTransfer.files] : []); return; } const items = [...dataTransfer.items].filter(item => { return browseFolders ? isFileSystemItem(item) : item.kind === 'file'; }).map(item => { return getFilesFromItem(item); }); Promise.all(items).then(fileGroups => { const files = []; fileGroups.forEach(group => { files.push(...group); }); resolve(files); }).catch(reject); }); }; const hasDataTransferOnlyFiles = (dataTransfer, browseFolders = true) => { return new Promise((resolve, reject) => { if (!dataTransfer.items) { resolve(dataTransfer.files ? dataTransfer.files.length > 0 : false); return; } const success = [...dataTransfer.items].every(item => { return browseFolders ? isFileSystemItem(item) : item.kind === 'file' && !isDirectoryEntry(item); }); resolve(success); }); }; const isFilePasted = (dataTransfer, browseFolders = true) => { if (!dataTransfer.types.includes('Files')) { return false; } let files = 0; let texts = 0; const items = dataTransfer.items; for (const item of items) { if (item.kind === 'string') { texts++; } else { const isFile = browseFolders ? isFileSystemItem(item) : item.kind === 'file' && !isDirectoryEntry(item); if (isFile) { files++; } } } return files >= texts; }; let result = null; const canAppendFileToForm = () => { if (result === null) { try { const dataTransfer = new DataTransfer(); const file = new File(['hello'], 'my.txt'); dataTransfer.items.add(file); const input = document.createElement('input'); input.setAttribute('type', 'file'); input.files = dataTransfer.files; result = input.files.length === 1; } catch { result = false; } } return result; }; const assignFileToInput = (input, file) => { try { const dataTransfer = new DataTransfer(); const files = main_core.Type.isArray(file) ? file : [file]; files.forEach(item => { dataTransfer.items.add(item); }); // eslint-disable-next-line no-param-reassign input.files = dataTransfer.files; } catch { return false; } return true; }; const instances = new Map(); /** * @namespace BX.UI.Uploader */ var _id$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("id"); var _files = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("files"); var _multiple = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("multiple"); var _autoUpload = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("autoUpload"); var _allowReplaceSingle = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("allowReplaceSingle"); var _maxParallelUploads = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("maxParallelUploads"); var _maxParallelLoads = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("maxParallelLoads"); var _acceptOnlyImages = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("acceptOnlyImages"); var _acceptedFileTypes = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("acceptedFileTypes"); var _ignoredFileNames = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("ignoredFileNames"); var _maxFileCount = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("maxFileCount"); var _server$3 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("server"); var _hiddenFields = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("hiddenFields"); var _hiddenFieldsContainer = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("hiddenFieldsContainer"); var _hiddenFieldName = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("hiddenFieldName"); var _assignAsFile = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("assignAsFile"); var _assignServerFile = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("assignServerFile"); var _filters = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("filters"); var _status$1 = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("status"); var _onBeforeUploadHandler = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("onBeforeUploadHandler"); var _onFileStatusChangeHandler = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("onFileStatusChangeHandler"); var _onFileStateChangeHandler = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("onFileStateChangeHandler"); var _onInputFileChangeHandler = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("onInputFileChangeHandler"); var _onPasteHandler = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("onPasteHandler"); var _onDropHandler = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("onDropHandler"); var _browsingNodes = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("browsingNodes"); var _dropNodes = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("dropNodes"); var _pastingNodes = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("pastingNodes"); var _setLoadEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setLoadEvents"); var _setUploadEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setUploadEvents"); var _setRemoveEvents = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setRemoveEvents"); var _handleBeforeUpload = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("handleBeforeUpload"); var _handleFileStatusChange = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("handleFileStatusChange"); var _handleFileStateChange = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("handleFileStateChange"); var _exceedsMaxFileCount = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("exceedsMaxFileCount"); var _applyFilters = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("applyFilters"); var _removeFile = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("removeFile"); var _handleBrowseClick = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("handleBrowseClick"); var _handleInputFileChange = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("handleInputFileChange"); var _handleDrop = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("handleDrop"); var _preventDefault = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("preventDefault"); var _handlePaste = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("handlePaste"); var _uploadNext = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("uploadNext"); var _loadNext = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("loadNext"); var _setHiddenField = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("setHiddenField"); var _updateHiddenField = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("updateHiddenField"); var _resetHiddenField = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("resetHiddenField"); var _resetHiddenFields = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("resetHiddenFields"); var _syncInputPositions = /*#__PURE__*/babelHelpers.classPrivateFieldLooseKey("syncInputPositions"); class Uploader extends main_core_events.EventEmitter { static getById(id) { return instances.get(id) || null; } static getInstances() { return [...instances.values()]; } constructor(uploaderOptions) { super(); Object.defineProperty(this, _syncInputPositions, { value: _syncInputPositions2 }); Object.defineProperty(this, _resetHiddenFields, { value: _resetHiddenFields2 }); Object.defineProperty(this, _resetHiddenField, { value: _resetHiddenField2 }); Object.defineProperty(this, _updateHiddenField, { value: _updateHiddenField2 }); Object.defineProperty(this, _setHiddenField, { value: _setHiddenField2 }); Object.defineProperty(this, _loadNext, { value: _loadNext2 }); Object.defineProperty(this, _uploadNext, { value: _uploadNext2 }); Object.defineProperty(this, _handlePaste, { value: _handlePaste2 }); Object.defineProperty(this, _preventDefault, { value: _preventDefault2 }); Object.defineProperty(this, _handleDrop, { value: _handleDrop2 }); Object.defineProperty(this, _handleInputFileChange, { value: _handleInputFileChange2 }); Object.defineProperty(this, _handleBrowseClick, { value: _handleBrowseClick2 }); Object.defineProperty(this, _removeFile, { value: _removeFile2 }); Object.defineProperty(this, _applyFilters, { value: _applyFilters2 }); Object.defineProperty(this, _exceedsMaxFileCount, { value: _exceedsMaxFileCount2 }); Object.defineProperty(this, _handleFileStateChange, { value: _handleFileStateChange2 }); Object.defineProperty(this, _handleFileStatusChange, { value: _handleFileStatusChange2 }); Object.defineProperty(this, _handleBeforeUpload, { value: _handleBeforeUpload2 }); Object.defineProperty(this, _setRemoveEvents, { value: _setRemoveEvents2 }); Object.defineProperty(this, _setUploadEvents, { value: _setUploadEvents2 }); Object.defineProperty(this, _setLoadEvents, { value: _setLoadEvents2 }); Object.defineProperty(this, _id$1, { writable: true, value: null }); Object.defineProperty(this, _files, { writable: true, value: [] }); Object.defineProperty(this, _multiple, { writable: true, value: false }); Object.defineProperty(this, _autoUpload, { writable: true, value: true }); Object.defineProperty(this, _allowReplaceSingle, { writable: true, value: true }); Object.defineProperty(this, _maxParallelUploads, { writable: true, value: 2 }); Object.defineProperty(this, _maxParallelLoads, { writable: true, value: 10 }); Object.defineProperty(this, _acceptOnlyImages, { writable: true, value: false }); Object.defineProperty(this, _acceptedFileTypes, { writable: true, value: [] }); Object.defineProperty(this, _ignoredFileNames, { writable: true, value: ['.ds_store', 'thumbs.db', 'desktop.ini'] }); Object.defineProperty(this, _maxFileCount, { writable: true, value: null }); Object.defineProperty(this, _server$3, { writable: true, value: null }); Object.defineProperty(this, _hiddenFields, { writable: true, value: new Map() }); Object.defineProperty(this, _hiddenFieldsContainer, { writable: true, value: null }); Object.defineProperty(this, _hiddenFieldName, { writable: true, value: 'file' }); Object.defineProperty(this, _assignAsFile, { writable: true, value: false }); Object.defineProperty(this, _assignServerFile, { writable: true, value: true }); Object.defineProperty(this, _filters, { writable: true, value: new Map() }); Object.defineProperty(this, _status$1, { writable: true, value: UploaderStatus.STOPPED }); Object.defineProperty(this, _onBeforeUploadHandler, { writable: true, value: null }); Object.defineProperty(this, _onFileStatusChangeHandler, { writable: true, value: null }); Object.defineProperty(this, _onFileStateChangeHandler, { writable: true, value: null }); Object.defineProperty(this, _onInputFileChangeHandler, { writable: true, value: null }); Object.defineProperty(this, _onPasteHandler, { writable: true, value: null }); Object.defineProperty(this, _onDropHandler, { writable: true, value: null }); Object.defineProperty(this, _browsingNodes, { writable: true, value: new Map() }); Object.defineProperty(this, _dropNodes, { writable: true, value: new Set() }); Object.defineProperty(this, _pastingNodes, { writable: true, value: new Set() }); this.setEventNamespace('BX.UI.Uploader'); babelHelpers.classPrivateFieldLooseBase(this, _onBeforeUploadHandler)[_onBeforeUploadHandler] = babelHelpers.classPrivateFieldLooseBase(this, _handleBeforeUpload)[_handleBeforeUpload].bind(this); babelHelpers.classPrivateFieldLooseBase(this, _onFileStatusChangeHandler)[_onFileStatusChangeHandler] = babelHelpers.classPrivateFieldLooseBase(this, _handleFileStatusChange)[_handleFileStatusChange].bind(this); babelHelpers.classPrivateFieldLooseBase(this, _onFileStateChangeHandler)[_onFileStateChangeHandler] = babelHelpers.classPrivateFieldLooseBase(this, _handleFileStateChange)[_handleFileStateChange].bind(this); babelHelpers.classPrivateFieldLooseBase(this, _onInputFileChangeHandler)[_onInputFileChangeHandler] = babelHelpers.classPrivateFieldLooseBase(this, _handleInputFileChange)[_handleInputFileChange].bind(this); babelHelpers.classPrivateFieldLooseBase(this, _onPasteHandler)[_onPasteHandler] = babelHelpers.classPrivateFieldLooseBase(this, _handlePaste)[_handlePaste].bind(this); babelHelpers.classPrivateFieldLooseBase(this, _onDropHandler)[_onDropHandler] = babelHelpers.classPrivateFieldLooseBase(this, _handleDrop)[_handleDrop].bind(this); const options = main_core.Type.isPlainObject(uploaderOptions) ? { ...uploaderOptions } : {}; babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1] = main_core.Type.isStringFilled(options.id) ? options.id : `ui-uploader-${main_core.Text.getRandom().toLowerCase()}`; babelHelpers.classPrivateFieldLooseBase(this, _multiple)[_multiple] = main_core.Type.isBoolean(options.multiple) ? options.multiple : false; const acceptOnlyImages = main_core.Type.isBoolean(options.acceptOnlyImages) ? options.acceptOnlyImages : null; const acceptOnlyImagesGlobal = Uploader.getGlobalOption('acceptOnlyImages', null); this.setAcceptOnlyImages(acceptOnlyImages || acceptOnlyImagesGlobal); if (main_core.Type.isString(options.acceptedFileTypes) || main_core.Type.isArray(options.acceptedFileTypes)) { this.setAcceptedFileTypes(options.acceptedFileTypes); } else if (acceptOnlyImages !== true) { const acceptedFileTypesGlobal = Uploader.getGlobalOption('acceptedFileTypes', null); this.setAcceptedFileTypes(acceptedFileTypesGlobal); } const ignoredFileNames = main_core.Type.isArray(options.ignoredFileNames) ? options.ignoredFileNames : Uploader.getGlobalOption('ignoredFileNames', null); this.setIgnoredFileNames(ignoredFileNames); this.setMaxFileCount(options.maxFileCount); this.setAllowReplaceSingle(options.allowReplaceSingle); this.assignBrowse(options.browseElement); this.assignDropzone(options.dropElement); this.assignPaste(options.pasteElement); this.setHiddenFieldsContainer(options.hiddenFieldsContainer); this.setHiddenFieldName(options.hiddenFieldName); this.setAssignAsFile(options.assignAsFile); this.setAssignServerFile(options.assignServerFile); this.setAutoUpload(options.autoUpload); this.setMaxParallelUploads(options.maxParallelUploads); this.setMaxParallelLoads(options.maxParallelLoads); let serverOptions = main_core.Type.isPlainObject(options.serverOptions) ? options.serverOptions : {}; serverOptions = { controller: options.controller, controllerOptions: options.controllerOptions, ...serverOptions }; babelHelpers.classPrivateFieldLooseBase(this, _server$3)[_server$3] = new Server(serverOptions); this.subscribeFromOptions(options.events); this.addFilter(FilterType.VALIDATION, new FileSizeFilter(this, options)); this.addFilter(FilterType.VALIDATION, new FileTypeFilter(this, options)); this.addFilter(FilterType.VALIDATION, new ImageSizeFilter(this, options)); this.addFilter(FilterType.VALIDATION, new ImagePreviewFilter(this, options)); this.addFilter(FilterType.PREPARATION, new ImageResizeFilter(this, options)); this.addFilters(options.filters); this.addFiles(options.files); instances.set(babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1], this); } static getGlobalOption(path, defaultValue = null) { const globalOptions = main_core.Extension.getSettings('ui.uploader.core'); return globalOptions.get(path, defaultValue); } addFiles(fileList) { if (!main_core.Type.isArrayLike(fileList)) { return []; } const files = []; [...fileList].forEach(item => { if (item instanceof UploaderFile) { if (item.getStatus() === FileStatus.INIT) { files.push(item); } } else if (main_core.Type.isArrayFilled(item)) { files.push(new UploaderFile(item[0], item[1])); } else { files.push(new UploaderFile(item)); } }); const event = new main_core_events.BaseEvent({ data: { files: [...files] } }); this.emit(UploaderEvent.BEFORE_FILES_ADD, event); if (event.isDefaultPrevented()) { const { error } = event.getData(); if (error instanceof UploaderError) { this.emit(UploaderEvent.ERROR, { error }); } return []; } if (babelHelpers.classPrivateFieldLooseBase(this, _exceedsMaxFileCount)[_exceedsMaxFileCount](files)) { return []; } const results = []; files.forEach(file => { const result = this.addFile(file); if (result !== null) { results.push(result); } }); return results; } addFile(source, options) { let file = null; if (source instanceof UploaderFile) { if (source.getStatus() === FileStatus.INIT) { file = source; } else { return null; } } else { file = new UploaderFile(source, options); } if (this.getIgnoredFileNames().includes(file.getName().toLowerCase())) { return null; } if (babelHelpers.classPrivateFieldLooseBase(this, _exceedsMaxFileCount)[_exceedsMaxFileCount]([file])) { return null; } if (!this.isMultiple() && this.shouldReplaceSingle() && babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].length > 0) { const fileToReplace = babelHelpers.classPrivateFieldLooseBase(this, _files)[_files][0]; this.removeFile(fileToReplace); } const event = new main_core_events.BaseEvent({ data: { file } }); this.emit(UploaderEvent.FILE_BEFORE_ADD, event); if (event.isDefaultPrevented()) { return null; } file.subscribe(FileEvent.STATUS_CHANGE, babelHelpers.classPrivateFieldLooseBase(this, _onFileStatusChangeHandler)[_onFileStatusChangeHandler]); file.subscribe(FileEvent.STATE_CHANGE, babelHelpers.classPrivateFieldLooseBase(this, _onFileStateChangeHandler)[_onFileStateChangeHandler]); babelHelpers.classPrivateFieldLooseBase(this, _setUploadEvents)[_setUploadEvents](file); babelHelpers.classPrivateFieldLooseBase(this, _setLoadEvents)[_setLoadEvents](file); babelHelpers.classPrivateFieldLooseBase(this, _setRemoveEvents)[_setRemoveEvents](file); if (!file.isLoadable()) { if (file.getOrigin() === FileOrigin.SERVER) { const preloaded = main_core.Type.isStringFilled(file.getName()); if (!preloaded || file.shouldForceServerLoad()) { file.setLoadController(this.getServer().createServerLoadController()); } else { file.setLoadController(this.getServer().createServerlessLoadController()); } } else { file.setLoadController(this.getServer().createClientLoadController()); } } if (!file.isUploadable() && file.getOrigin() === FileOrigin.CLIENT) { const uploadController = this.getServer().createUploadController(); file.setUploadController(uploadController); } if (!file.isRemoveable()) { file.setRemoveController(this.getServer().createRemoveController()); } babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].push(file); file.emit(FileEvent.ADD); this.emit(UploaderEvent.FILE_ADD_START, { file }); if (file.getOrigin() === FileOrigin.CLIENT) { babelHelpers.classPrivateFieldLooseBase(this, _loadNext)[_loadNext](); } else { file.load(); } return file; } start() { if (this.getStatus() !== UploaderStatus.STARTED && this.getPendingFileCount() > 0) { babelHelpers.classPrivateFieldLooseBase(this, _status$1)[_status$1] = UploaderStatus.STARTED; this.emit(UploaderEvent.UPLOAD_START); babelHelpers.classPrivateFieldLooseBase(this, _uploadNext)[_uploadNext](); } } stop() { if (babelHelpers.classPrivateFieldLooseBase(this, _status$1)[_status$1] !== UploaderStatus.STOPPED) { babelHelpers.classPrivateFieldLooseBase(this, _status$1)[_status$1] = UploaderStatus.STOPPED; // this.getFiles().forEach((file: UploaderFile) => { // if (file.isUploading()) // { // file.abort(); // file.setStatus(FileStatus.PENDING); // } // }); this.emit('onStop'); } } destroy(options) { this.emit(UploaderEvent.DESTROY); this.unassignBrowseAll(); this.unassignDropzoneAll(); this.unassignPasteAll(); const removeFromServer = !options || options.removeFilesFromServer !== false; this.removeFiles({ removeFromServer }); babelHelpers.classPrivateFieldLooseBase(this, _resetHiddenFields)[_resetHiddenFields](); instances.delete(this.getId()); babelHelpers.classPrivateFieldLooseBase(this, _files)[_files] = []; babelHelpers.classPrivateFieldLooseBase(this, _server$3)[_server$3] = null; babelHelpers.classPrivateFieldLooseBase(this, _acceptedFileTypes)[_acceptedFileTypes] = null; babelHelpers.classPrivateFieldLooseBase(this, _ignoredFileNames)[_ignoredFileNames] = null; babelHelpers.classPrivateFieldLooseBase(this, _filters)[_filters] = null; Object.setPrototypeOf(this, null); } removeFiles(options) { this.getFiles().forEach(file => { file.remove(options); }); } removeFile(fileOrId, options) { const file = main_core.Type.isString(fileOrId) ? this.getFile(fileOrId) : fileOrId; const index = babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].indexOf(file); if (index === -1) { return; } file.remove(options); } getFile(id) { return babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].find(file => file.getId() === id) || null; } getFiles() { return [...babelHelpers.classPrivateFieldLooseBase(this, _files)[_files]]; } getFileCount() { return babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].length; } getId() { return babelHelpers.classPrivateFieldLooseBase(this, _id$1)[_id$1]; } isMultiple() { return babelHelpers.classPrivateFieldLooseBase(this, _multiple)[_multiple]; } getStatus() { return babelHelpers.classPrivateFieldLooseBase(this, _status$1)[_status$1]; } addFilter(type, filterEntity, filterOptions = {}) { let filter = null; if (main_core.Type.isFunction(filterEntity) || main_core.Type.isString(filterEntity)) { const ClassName = main_core.Type.isString(filterEntity) ? main_core.Reflection.getClass(filterEntity) : filterEntity; if (main_core.Type.isFunction(ClassName)) { filter = new ClassName(this, filterOptions); } } else { filter = filterEntity; } if (filter instanceof Filter) { let filters = babelHelpers.classPrivateFieldLooseBase(this, _filters)[_filters].get(type); if (!main_core.Type.isArray(filters)) { filters = []; babelHelpers.classPrivateFieldLooseBase(this, _filters)[_filters].set(type, filters); } filters.push(filter); } else { throw new TypeError('Uploader: a filter must be an instance of FileUploader.Filter.'); } } addFilters(filters) { if (main_core.Type.isArray(filters)) { filters.forEach(filter => { if (main_core.Type.isPlainObject(filter)) { this.addFilter(filter.type, filter.filter, filter.options); } }); } } getServer() { return babelHelpers.classPrivateFieldLooseBase(this, _server$3)[_server$3]; } assignBrowse(htmlElement) { const nodes = main_core.Type.isElementNode(htmlElement) ? [htmlElement] : htmlElement; if (!main_core.Type.isArray(nodes)) { return; } nodes.forEach(node => { if (!main_core.Type.isElementNode(node) || babelHelpers.classPrivateFieldLooseBase(this, _browsingNodes)[_browsingNodes].has(node)) { return; } let input = null; if (node.tagName === 'INPUT' && node.type === 'file') { input = node; // Add already selected files if (input.files && input.files.length > 0) { this.addFiles(input.files); } const acceptAttr = input.getAttribute('accept'); if (main_core.Type.isStringFilled(acceptAttr)) { this.setAcceptedFileTypes(acceptAttr); } babelHelpers.classPrivateFieldLooseBase(this, _browsingNodes)[_browsingNodes].set(node, null); } else { input = document.createElement('input'); input.setAttribute('type', 'file'); const onBrowseClickHandler = babelHelpers.classPrivateFieldLooseBase(this, _handleBrowseClick)[_handleBrowseClick].bind(this, input, node); babelHelpers.classPrivateFieldLooseBase(this, _browsingNodes)[_browsingNodes].set(node, onBrowseClickHandler); main_core.Event.bind(node, 'click', onBrowseClickHandler); } if (this.isMultiple()) { input.setAttribute('multiple', 'multiple'); } if (main_core.Type.isArrayFilled(this.getAcceptedFileTypes())) { input.setAttribute('accept', this.getAcceptedFileTypes().join(',')); } main_core.Event.bind(input, 'change', babelHelpers.classPrivateFieldLooseBase(this, _onInputFileChangeHandler)[_onInputFileChangeHandler]); }); } unassignBrowse(htmlElement) { const nodes = main_core.Type.isElementNode(htmlElement) ? [htmlElement] : htmlElement; if (!main_core.Type.isArray(nodes)) { return; } nodes.forEach(node => { if (babelHelpers.classPrivateFieldLooseBase(this, _browsingNodes)[_browsingNodes].has(node)) { main_core.Event.unbind(node, 'click', babelHelpers.classPrivateFieldLooseBase(this, _browsingNodes)[_browsingNodes].get(node)); main_core.Event.unbind(node, 'change', babelHelpers.classPrivateFieldLooseBase(this, _onInputFileChangeHandler)[_onInputFileChangeHandler]); babelHelpers.classPrivateFieldLooseBase(this, _browsingNodes)[_browsingNodes].delete(node); } }); } unassignBrowseAll() { [...babelHelpers.classPrivateFieldLooseBase(this, _browsingNodes)[_browsingNodes].keys()].forEach(node => { this.unassignBrowse(node); }); } assignDropzone(htmlElement) { const nodes = main_core.Type.isElementNode(htmlElement) ? [htmlElement] : htmlElement; if (!main_core.Type.isArray(nodes)) { return; } nodes.forEach(node => { if (!main_core.Type.isElementNode(node) || babelHelpers.classPrivateFieldLooseBase(this, _dropNodes)[_dropNodes].has(node)) { return; } main_core.Event.bind(node, 'dragover', babelHelpers.classPrivateFieldLooseBase(this, _preventDefault)[_preventDefault]); main_core.Event.bind(node, 'dragenter', babelHelpers.classPrivateFieldLooseBase(this, _preventDefault)[_preventDefault]); main_core.Event.bind(node, 'drop', babelHelpers.classPrivateFieldLooseBase(this, _onDropHandler)[_onDropHandler]); babelHelpers.classPrivateFieldLooseBase(this, _dropNodes)[_dropNodes].add(node); }); } unassignDropzone(htmlElement) { const nodes = main_core.Type.isElementNode(htmlElement) ? [htmlElement] : htmlElement; if (!main_core.Type.isArray(nodes)) { return; } nodes.forEach(node => { if (babelHelpers.classPrivateFieldLooseBase(this, _dropNodes)[_dropNodes].has(node)) { main_core.Event.unbind(node, 'dragover', babelHelpers.classPrivateFieldLooseBase(this, _preventDefault)[_preventDefault]); main_core.Event.unbind(node, 'dragenter', babelHelpers.classPrivateFieldLooseBase(this, _preventDefault)[_preventDefault]); main_core.Event.unbind(node, 'drop', babelHelpers.classPrivateFieldLooseBase(this, _onDropHandler)[_onDropHandler]); babelHelpers.classPrivateFieldLooseBase(this, _dropNodes)[_dropNodes].delete(node); } }); } unassignDropzoneAll() { [...babelHelpers.classPrivateFieldLooseBase(this, _dropNodes)[_dropNodes]].forEach(node => { this.unassignDropzone(node); }); } assignPaste(htmlElement) { const nodes = main_core.Type.isElementNode(htmlElement) ? [htmlElement] : htmlElement; if (!main_core.Type.isArray(nodes)) { return; } nodes.forEach(node => { if (!main_core.Type.isElementNode(node) || babelHelpers.classPrivateFieldLooseBase(this, _pastingNodes)[_pastingNodes].has(node)) { return; } main_core.Event.bind(node, 'paste', babelHelpers.classPrivateFieldLooseBase(this, _onPasteHandler)[_onPasteHandler]); babelHelpers.classPrivateFieldLooseBase(this, _pastingNodes)[_pastingNodes].add(node); }); } unassignPaste(htmlElement) { const nodes = main_core.Type.isElementNode(htmlElement) ? [htmlElement] : htmlElement; if (!main_core.Type.isArray(nodes)) { return; } nodes.forEach(node => { if (babelHelpers.classPrivateFieldLooseBase(this, _pastingNodes)[_pastingNodes].has(node)) { main_core.Event.unbind(node, 'paste', babelHelpers.classPrivateFieldLooseBase(this, _onPasteHandler)[_onPasteHandler]); babelHelpers.classPrivateFieldLooseBase(this, _pastingNodes)[_pastingNodes].delete(node); } }); } unassignPasteAll() { [...babelHelpers.classPrivateFieldLooseBase(this, _pastingNodes)[_pastingNodes]].forEach(node => { this.unassignPaste(node); }); } getHiddenFieldsContainer() { let element = null; if (main_core.Type.isStringFilled(babelHelpers.classPrivateFieldLooseBase(this, _hiddenFieldsContainer)[_hiddenFieldsContainer])) { element = document.querySelector(babelHelpers.classPrivateFieldLooseBase(this, _hiddenFieldsContainer)[_hiddenFieldsContainer]); if (!main_core.Type.isElementNode(element)) { console.error(`Uploader: a hidden field container was not found (${babelHelpers.classPrivateFieldLooseBase(this, _hiddenFieldsContainer)[_hiddenFieldsContainer]}).`); } } else if (main_core.Type.isElementNode(babelHelpers.classPrivateFieldLooseBase(this, _hiddenFieldsContainer)[_hiddenFieldsContainer])) { element = babelHelpers.classPrivateFieldLooseBase(this, _hiddenFieldsContainer)[_hiddenFieldsContainer]; } return element; } setHiddenFieldsContainer(container) { if (main_core.Type.isStringFilled(container) || main_core.Type.isElementNode(container) || main_core.Type.isNull(container)) { babelHelpers.classPrivateFieldLooseBase(this, _hiddenFieldsContainer)[_hiddenFieldsContainer] = container; } } getHiddenFieldName() { return babelHelpers.classPrivateFieldLooseBase(this, _hiddenFieldName)[_hiddenFieldName]; } setHiddenFieldName(name) { if (main_core.Type.isStringFilled(name)) { babelHelpers.classPrivateFieldLooseBase(this, _hiddenFieldName)[_hiddenFieldName] = name; } } shouldAssignAsFile() { return babelHelpers.classPrivateFieldLooseBase(this, _assignAsFile)[_assignAsFile]; } setAssignAsFile(flag) { if (main_core.Type.isBoolean(flag)) { babelHelpers.classPrivateFieldLooseBase(this, _assignAsFile)[_assignAsFile] = flag; } } shouldAssignServerFile() { return babelHelpers.classPrivateFieldLooseBase(this, _assignServerFile)[_assignServerFile]; } setAssignServerFile(flag) { if (main_core.Type.isBoolean(flag)) { babelHelpers.classPrivateFieldLooseBase(this, _assignServerFile)[_assignServerFile] = flag; } } getTotalSize() { return babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].reduce((totalSize, file) => { return totalSize + file.getSize(); }, 0); } shouldAutoUpload() { return babelHelpers.classPrivateFieldLooseBase(this, _autoUpload)[_autoUpload]; } setAutoUpload(flag) { if (main_core.Type.isBoolean(flag)) { babelHelpers.classPrivateFieldLooseBase(this, _autoUpload)[_autoUpload] = flag; } } getMaxParallelUploads() { return babelHelpers.classPrivateFieldLooseBase(this, _maxParallelUploads)[_maxParallelUploads]; } setMaxParallelUploads(number) { if (main_core.Type.isNumber(number) && number > 0) { babelHelpers.classPrivateFieldLooseBase(this, _maxParallelUploads)[_maxParallelUploads] = number; } } getMaxParallelLoads() { return babelHelpers.classPrivateFieldLooseBase(this, _maxParallelLoads)[_maxParallelLoads]; } setMaxParallelLoads(number) { if (main_core.Type.isNumber(number) && number > 0) { babelHelpers.classPrivateFieldLooseBase(this, _maxParallelLoads)[_maxParallelLoads] = number; } } getUploadingFileCount() { return babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].filter(file => file.isUploading() || file.isPreparing()).length; } getPendingFileCount() { return babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].filter(file => file.isReadyToUpload()).length; } static getImageExtensions() { return this.getGlobalOption('imageExtensions', ['jpg', 'bmp', 'jpeg', 'jpe', 'gif', 'png', 'webp']); } static getVideoExtensions() { return this.getGlobalOption('videoExtensions', ['avi', 'wmv', 'mp4', 'mov', 'webm', 'flv', 'm4v', 'mkv', 'vob', '3gp', 'ogv', 'h264']); } setAcceptOnlyImages(flag) { if (main_core.Type.isBoolean(flag)) { babelHelpers.classPrivateFieldLooseBase(this, _acceptOnlyImages)[_acceptOnlyImages] = flag; if (flag) { this.acceptOnlyImages(); } } } acceptOnlyImages() { const imageExtensions = Uploader.getImageExtensions().map(extension => { return `.${extension}`; }); this.setAcceptedFileTypes(imageExtensions); babelHelpers.classPrivateFieldLooseBase(this, _acceptOnlyImages)[_acceptOnlyImages] = true; } shouldAcceptOnlyImages() { return babelHelpers.classPrivateFieldLooseBase(this, _acceptOnlyImages)[_acceptOnlyImages]; } getAcceptedFileTypes() { return babelHelpers.classPrivateFieldLooseBase(this, _acceptedFileTypes)[_acceptedFileTypes]; } setAcceptedFileTypes(fileTypes) { const types = main_core.Type.isString(fileTypes) ? fileTypes.split(',') : fileTypes; if (main_core.Type.isArray(types)) { babelHelpers.classPrivateFieldLooseBase(this, _acceptedFileTypes)[_acceptedFileTypes] = []; babelHelpers.classPrivateFieldLooseBase(this, _acceptOnlyImages)[_acceptOnlyImages] = false; types.forEach(type => { if (main_core.Type.isStringFilled(type)) { babelHelpers.classPrivateFieldLooseBase(this, _acceptedFileTypes)[_acceptedFileTypes].push(type); } }); } } getIgnoredFileNames() { return babelHelpers.classPrivateFieldLooseBase(this, _ignoredFileNames)[_ignoredFileNames]; } setIgnoredFileNames(fileNames) { if (main_core.Type.isArray(fileNames)) { babelHelpers.classPrivateFieldLooseBase(this, _ignoredFileNames)[_ignoredFileNames] = []; fileNames.forEach(fileName => { if (main_core.Type.isStringFilled(fileName)) { babelHelpers.classPrivateFieldLooseBase(this, _ignoredFileNames)[_ignoredFileNames].push(fileName.toLowerCase()); } }); } } setMaxFileCount(maxFileCount) { if (main_core.Type.isNumber(maxFileCount) && maxFileCount > 0 || maxFileCount === null) { babelHelpers.classPrivateFieldLooseBase(this, _maxFileCount)[_maxFileCount] = maxFileCount; } } getMaxFileCount() { return babelHelpers.classPrivateFieldLooseBase(this, _maxFileCount)[_maxFileCount]; } setAllowReplaceSingle(flag) { if (main_core.Type.isBoolean(flag)) { babelHelpers.classPrivateFieldLooseBase(this, _allowReplaceSingle)[_allowReplaceSingle] = flag; } } shouldReplaceSingle() { return babelHelpers.classPrivateFieldLooseBase(this, _allowReplaceSingle)[_allowReplaceSingle]; } } function _setLoadEvents2(file) { file.subscribeFromOptions({ [FileEvent.LOAD_START]: () => { this.emit(UploaderEvent.FILE_LOAD_START, { file }); }, [FileEvent.LOAD_PROGRESS]: event => { const { progress } = event.getData(); this.emit(UploaderEvent.FILE_LOAD_PROGRESS, { file, progress }); }, [FileEvent.LOAD_ERROR]: event => { const { error } = event.getData(); this.emit(UploaderEvent.FILE_ERROR, { file, error }); this.emit(UploaderEvent.FILE_ADD, { file, error }); babelHelpers.classPrivateFieldLooseBase(this, _loadNext)[_loadNext](); }, [FileEvent.LOAD_COMPLETE]: () => { this.emit(UploaderEvent.FILE_ADD, { file }); this.emit(UploaderEvent.FILE_LOAD_COMPLETE, { file }); if (!file.isUploadable()) { this.emit(UploaderEvent.FILE_COMPLETE, { file }); babelHelpers.classPrivateFieldLooseBase(this, _setHiddenField)[_setHiddenField](file); } else if (this.shouldAutoUpload()) { file.upload(); } babelHelpers.classPrivateFieldLooseBase(this, _loadNext)[_loadNext](); }, [FileEvent.VALIDATE_FILE_ASYNC]: event => { const file = event.getData().file; return babelHelpers.classPrivateFieldLooseBase(this, _applyFilters)[_applyFilters](FilterType.VALIDATION, file); }, [FileEvent.PREPARE_FILE_ASYNC]: event => { const file = event.getData().file; return babelHelpers.classPrivateFieldLooseBase(this, _applyFilters)[_applyFilters](FilterType.PREPARATION, file); } }); } function _setUploadEvents2(file) { file.subscribeFromOptions({ [FileEvent.BEFORE_UPLOAD]: babelHelpers.classPrivateFieldLooseBase(this, _onBeforeUploadHandler)[_onBeforeUploadHandler], [FileEvent.UPLOAD_START]: () => { this.emit(UploaderEvent.FILE_UPLOAD_START, { file }); }, [FileEvent.UPLOAD_PROGRESS]: event => { const { progress } = event.getData(); this.emit(UploaderEvent.FILE_UPLOAD_PROGRESS, { file, progress }); }, [FileEvent.UPLOAD_ERROR]: event => { const { error } = event.getData(); this.emit(UploaderEvent.FILE_ERROR, { file, error }); babelHelpers.classPrivateFieldLooseBase(this, _uploadNext)[_uploadNext](); }, [FileEvent.UPLOAD_COMPLETE]: () => { this.emit(UploaderEvent.FILE_UPLOAD_COMPLETE, { file }); this.emit(UploaderEvent.FILE_COMPLETE, { file }); babelHelpers.classPrivateFieldLooseBase(this, _setHiddenField)[_setHiddenField](file); babelHelpers.classPrivateFieldLooseBase(this, _uploadNext)[_uploadNext](); } }); } function _setRemoveEvents2(file) { file.subscribeOnce(FileEvent.REMOVE_ERROR, event => { const { error } = event.getData(); this.emit(UploaderEvent.FILE_ERROR, { file, error }); }); file.subscribeOnce(FileEvent.REMOVE_COMPLETE, () => { babelHelpers.classPrivateFieldLooseBase(this, _removeFile)[_removeFile](file); }); } function _handleBeforeUpload2(event) { if (this.getStatus() === UploaderStatus.STOPPED) { event.preventDefault(); this.start(); } else if (this.getUploadingFileCount() >= this.getMaxParallelUploads()) { event.preventDefault(); } } function _handleFileStatusChange2(event) { const file = event.getTarget(); this.emit(UploaderEvent.FILE_STATUS_CHANGE, { file }); } function _handleFileStateChange2(event) { const file = event.getTarget(); const property = event.getData().property; const value = event.getData().value; if (property === 'serverFileId') { babelHelpers.classPrivateFieldLooseBase(this, _updateHiddenField)[_updateHiddenField](file); } this.emit(UploaderEvent.FILE_STATE_CHANGE, { file, property, value }); } function _exceedsMaxFileCount2(fileList) { const totalNewFiles = fileList.length; const totalFiles = babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].length; if (!this.isMultiple() && totalNewFiles > 1) { return true; } let maxFileCount = null; if (this.isMultiple()) { maxFileCount = this.getMaxFileCount(); } else { maxFileCount = this.shouldReplaceSingle() ? null : 1; } if (maxFileCount !== null && totalFiles + totalNewFiles > maxFileCount) { const error = new UploaderError('MAX_FILE_COUNT_EXCEEDED', { maxFileCount }); this.emit(UploaderEvent.MAX_FILE_COUNT_EXCEEDED, { error }); this.emit(UploaderEvent.ERROR, { error }); return true; } return false; } function _applyFilters2(type, ...args) { return new Promise((resolve, reject) => { const filters = [...(babelHelpers.classPrivateFieldLooseBase(this, _filters)[_filters].get(type) || [])]; if (filters.length === 0) { resolve(); return; } const firstFilter = filters.shift(); // chain filters filters.reduce((current, next) => { return current.then(() => next.apply(...args)); }, firstFilter.apply(...args)).then(result => resolve(result)).catch(error => reject(error)); }); } function _removeFile2(file) { const index = babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].indexOf(file); if (index !== -1) { babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].splice(index, 1); } file.unsubscribeAll(); this.emit(UploaderEvent.FILE_REMOVE, { file }); babelHelpers.classPrivateFieldLooseBase(this, _resetHiddenField)[_resetHiddenField](file); } function _handleBrowseClick2(input, node) { const event = new main_core_events.BaseEvent({ data: { input, node } }); this.emit(UploaderEvent.BEFORE_BROWSE, event); if (event.isDefaultPrevented()) { return; } input.click(); } function _handleInputFileChange2(event) { const input = event.currentTarget; this.addFiles([...input.files]); // reset file input input.value = ''; } function _handleDrop2(dragEvent) { dragEvent.preventDefault(); const event = new main_core_events.BaseEvent({ data: { dragEvent } }); this.emit(UploaderEvent.BEFORE_DROP, event); if (event.isDefaultPrevented()) { return; } getFilesFromDataTransfer(dragEvent.dataTransfer).then(files => { this.addFiles(files); }).catch(error => { console.error('Uploader: data transfer error', error); }); } function _preventDefault2(event) { event.preventDefault(); } function _handlePaste2(clipboardEvent) { const clipboardData = clipboardEvent.clipboardData; if (!clipboardData) { return; } const event = new main_core_events.BaseEvent({ data: { clipboardEvent } }); this.emit(UploaderEvent.BEFORE_PASTE, event); if (event.isDefaultPrevented()) { return; } if (isFilePasted(clipboardData)) { clipboardEvent.preventDefault(); getFilesFromDataTransfer(clipboardData).then(files => { this.addFiles(files); }).catch(error => { console.error('Uploader: data transfer error', error); }); } } function _uploadNext2() { if (this.getStatus() !== UploaderStatus.STARTED) { return; } const maxParallelUploads = this.getMaxParallelUploads(); const currentUploads = this.getUploadingFileCount(); const pendingFiles = babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].filter(file => file.isReadyToUpload()); const pendingUploads = pendingFiles.length; if (currentUploads < maxParallelUploads) { const limit = Math.min(maxParallelUploads - currentUploads, pendingFiles.length); for (let i = 0; i < limit; i++) { const pendingFile = pendingFiles[i]; pendingFile.upload(); } } // All files are COMPLETE or FAILED if (currentUploads === 0 && pendingUploads === 0) { babelHelpers.classPrivateFieldLooseBase(this, _status$1)[_status$1] = UploaderStatus.STOPPED; this.emit(UploaderEvent.UPLOAD_COMPLETE); } } function _loadNext2() { const maxParallelLoads = this.getMaxParallelLoads(); const currentLoads = babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].filter(file => file.isLoading()).length; const pendingFiles = babelHelpers.classPrivateFieldLooseBase(this, _files)[_files].filter(file => { return file.getStatus() === FileStatus.ADDED && file.getOrigin() === FileOrigin.CLIENT; }); if (currentLoads < maxParallelLoads) { const limit = Math.min(maxParallelLoads - currentLoads, pendingFiles.length); for (let i = 0; i < limit; i++) { const pendingFile = pendingFiles[i]; pendingFile.load(); } } } function _setHiddenField2(file) { const container = this.getHiddenFieldsContainer(); if (!container || babelHelpers.classPrivateFieldLooseBase(this, _hiddenFields)[_hiddenFields].has(file.getId())) { return; } if (file.getOrigin() === FileOrigin.SERVER && !this.shouldAssignServerFile()) { return; } const assignAsFile = file.getOrigin() === FileOrigin.CLIENT && !file.isUploadable() && this.shouldAssignAsFile() && canAppendFileToForm(); const input = document.createElement('input'); input.type = assignAsFile ? 'file' : 'hidden'; input.name = this.getHiddenFieldName() + (this.isMultiple() ? '[]' : ''); if (assignAsFile) { main_core.Dom.style(input, { visibility: 'hidden', left: 0, top: 0, width: 0, height: 0, position: 'absolute', 'pointer-events': 'none' }); assignFileToInput(input, file.getBinary()); } else if (file.getServerFileId() !== null) { input.value = file.getServerFileId(); } main_core.Dom.append(input, container); babelHelpers.classPrivateFieldLooseBase(this, _hiddenFields)[_hiddenFields].set(file.getId(), input); babelHelpers.classPrivateFieldLooseBase(this, _syncInputPositions)[_syncInputPositions](); } function _updateHiddenField2(file) { const input = babelHelpers.classPrivateFieldLooseBase(this, _hiddenFields)[_hiddenFields].get(file.getId()); if (input && input.type === 'hidden') { if (file.getServerFileId() === null) { babelHelpers.classPrivateFieldLooseBase(this, _resetHiddenField)[_resetHiddenField](file); } else { input.value = file.getServerFileId(); } } } function _resetHiddenField2(file) { const input = babelHelpers.classPrivateFieldLooseBase(this, _hiddenFields)[_hiddenFields].get(file.getId()); if (input) { main_core.Dom.remove(input); babelHelpers.classPrivateFieldLooseBase(this, _hiddenFields)[_hiddenFields].delete(file.getId()); } } function _resetHiddenFields2() { [...babelHelpers.classPrivateFieldLooseBase(this, _hiddenFields)[_hiddenFields].values()].forEach(input => { main_core.Dom.remove(input); }); babelHelpers.classPrivateFieldLooseBase(this, _hiddenFields)[_hiddenFields] = []; } function _syncInputPositions2() { const container = this.getHiddenFieldsContainer(); if (!container) { return; } this.getFiles().forEach(file => { const input = babelHelpers.classPrivateFieldLooseBase(this, _hiddenFields)[_hiddenFields].get(file.getId()); if (input) { main_core.Dom.append(input, container); } }); } const isImage = blob => { return /^image\/[\d.a-z-]+$/i.test(blob.type); }; const Marker$1 = { JPEG: 0xFFD8, APP1: 0xFFE1, EXIF: 0x45786966, TIFF: 0x4949, Orientation: 0x0112, Unknown: 0xFF00 }; const getUint16 = (view, offset, little = false) => view.getUint16(offset, little); const getUint32 = (view, offset, little = false) => view.getUint32(offset, little); const getJpegOrientation = file => { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = function (e) { const view = new DataView(e.target.result); if (getUint16(view, 0) !== Marker$1.JPEG) { resolve(-1); return; } const length = view.byteLength; let offset = 2; while (offset < length) { const marker = getUint16(view, offset); offset += 2; // APP1 Marker if (marker === Marker$1.APP1) { offset += 2; if (getUint32(view, offset) !== Marker$1.EXIF) { // no EXIF break; } const little = getUint16(view, offset += 6) === Marker$1.TIFF; offset += getUint32(view, offset + 4, little); const tags = getUint16(view, offset, little); offset += 2; for (let i = 0; i < tags; i++) { // Found the orientation tag if (getUint16(view, offset + i * 12, little) === Marker$1.Orientation) { resolve(getUint16(view, offset + i * 12 + 8, little)); return; } } } else if ((marker & Marker$1.Unknown) === Marker$1.Unknown) { offset += getUint16(view, offset); } else { break; // Invalid } } // Nothing found resolve(-1); }; reader.readAsArrayBuffer(file.slice(0, 64 * 1024)); }); }; const isJpeg = blob => { return /^image\/jpeg$/i.test(blob.type); }; var index = /*#__PURE__*/Object.freeze({ formatFileSize: formatFileSize, getFileExtension: getFileExtension, getFilenameWithoutExtension: getFilenameWithoutExtension, getExtensionFromType: getExtensionFromType, getJpegOrientation: getJpegOrientation, getArrayBuffer: getArrayBuffer, isDataUri: isDataUri, isImage: isImage, isResizableImage: isResizableImage, isSupportedVideo: isSupportedVideo, isJpeg: isJpeg, getImageSize: getImageSize, getResizedImageSize: getResizedImageSize, resizeImage: resizeImage, loadImage: loadImage, isValidFileType: isValidFileType, canAppendFileToForm: canAppendFileToForm, assignFileToInput: assignFileToInput, createFileFromBlob: createFileFromBlob, createBlobFromDataUri: createBlobFromDataUri, createVideoPreview: createVideoPreview, createUniqueId: createUniqueId, createWorker: createWorker, getFilesFromDataTransfer: getFilesFromDataTransfer, hasDataTransferOnlyFiles: hasDataTransferOnlyFiles, isFilePasted: isFilePasted }); exports.Uploader = Uploader; exports.UploaderStatus = UploaderStatus; exports.UploaderEvent = UploaderEvent; exports.FileStatus = FileStatus; exports.FileOrigin = FileOrigin; exports.FileEvent = FileEvent; exports.FilterType = FilterType; exports.Helpers = index; exports.UploaderError = UploaderError; exports.Server = Server; exports.AbstractLoadController = AbstractLoadController; exports.AbstractUploadController = AbstractUploadController; exports.AbstractRemoveController = AbstractRemoveController; exports.formatFileSize = formatFileSize; exports.getFileExtension = getFileExtension; exports.getFilenameWithoutExtension = getFilenameWithoutExtension; exports.getExtensionFromType = getExtensionFromType; exports.getJpegOrientation = getJpegOrientation; exports.getArrayBuffer = getArrayBuffer; exports.isDataUri = isDataUri; exports.isImage = isImage; exports.isResizableImage = isResizableImage; exports.isSupportedVideo = isSupportedVideo; exports.isJpeg = isJpeg; exports.getImageSize = getImageSize; exports.getResizedImageSize = getResizedImageSize; exports.resizeImage = resizeImage; exports.loadImage = loadImage; exports.isValidFileType = isValidFileType; exports.canAppendFileToForm = canAppendFileToForm; exports.assignFileToInput = assignFileToInput; exports.createFileFromBlob = createFileFromBlob; exports.createBlobFromDataUri = createBlobFromDataUri; exports.createVideoPreview = createVideoPreview; exports.createUniqueId = createUniqueId; exports.createWorker = createWorker; exports.getFilesFromDataTransfer = getFilesFromDataTransfer; exports.hasDataTransferOnlyFiles = hasDataTransferOnlyFiles; exports.isFilePasted = isFilePasted; }((this.BX.UI.Uploader = this.BX.UI.Uploader || {}),BX.Event,BX)); //# sourceMappingURL=ui.uploader.bundle.js.map