1(function (exports,main_core,main_core_events) { 2 'use strict'; 3 4 function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) { _classCheckPrivateStaticAccess(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor(descriptor, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } 5 6 function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } 7 8 function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { _classCheckPrivateStaticAccess(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor(descriptor, "get"); return _classApplyDescriptorGet(receiver, descriptor); } 9 10 function _classCheckPrivateStaticFieldDescriptor(descriptor, action) { if (descriptor === undefined) { throw new TypeError("attempted to " + action + " private static field before its declaration"); } } 11 12 function _classCheckPrivateStaticAccess(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } } 13 14 function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } 15 16 var Options = /*#__PURE__*/function () { 17 function Options() { 18 babelHelpers.classCallCheck(this, Options); 19 } 20 21 babelHelpers.createClass(Options, null, [{ 22 key: "getEventName", 23 value: function getEventName(eventName) { 24 return [this.getEventNamespace()].concat(babelHelpers.toConsumableArray(eventName)).join(':'); 25 } 26 }, { 27 key: "getEventNamespace", 28 value: function getEventNamespace() { 29 return 'BX:Main:Uploader:'; 30 } 31 }, { 32 key: "calibratePostSize", 33 value: function calibratePostSize(deltaTime, size) { 34 if (deltaTime <= 0) { 35 return; 36 } 37 38 if (deltaTime < this.defaultSettings['estimatedTimeForUploadFile']) { 39 var sizes = [this.defaultSettings['currentPostSize'] * 2, this.defaultSettings["phpPostMaxSize"]]; 40 41 if (size > 0) { 42 sizes.push(Math.ceil(size * this.defaultSettings['estimatedTimeForUploadFile'] * 1000 / deltaTime)); 43 } 44 45 this.defaultSettings['currentPostSize'] = Math.min.apply(Math, sizes); 46 } else { 47 this.defaultSettings['currentPostSize'] = Math.max(Math.ceil(this.defaultSettings['currentPostSize'] / 2), this.defaultSettings['phpPostMinSize']); 48 } 49 50 this.defaultSettings['currentPostSize'] = Math.max(this.defaultSettings['currentPostSize'], this.defaultSettings['phpPostMinSize']); 51 } 52 }, { 53 key: "getUploadLimits", 54 value: function getUploadLimits(key) { 55 if (!this.defaultSettings) { 56 this.defaultSettings = { 57 currentPostSize: 5.5 * 1024 * 1024, 58 phpPostMinSize: 5.5 * 1024 * 1024, 59 // Bytes 60 phpUploadMaxFilesize: Math.min(/^d+$/.test(main_core.Loc.getMessage('phpUploadMaxFilesize')) ? main_core.Loc.getMessage('phpUploadMaxFilesize') : 5 * 1024 * 1024, 5 * 1024 * 1024), 61 // Bytes 5MB because of Cloud 62 phpMaxFileUploads: Math.max(/^d+$/.test(main_core.Loc.getMessage('phpMaxFileUploads')) ? main_core.Loc.getMessage('phpMaxFileUploads') : 20, 20), 63 phpPostMaxSize: /^d+$/.test(main_core.Loc.getMessage('phpPostMaxSize')) ? main_core.Loc.getMessage('phpPostMaxSize') : 11 * 1024 * 1024, 64 // Bytes 65 estimatedTimeForUploadFile: 10 * 60, 66 // in sec 67 maxSize: this.getMaxSize() 68 }; 69 } 70 71 if (key) { 72 return this.defaultSettings[key]; 73 } 74 75 return this.defaultSettings; 76 } 77 }, { 78 key: "getFileTypes", 79 value: function getFileTypes() { 80 return ['A', //'A'll files 81 'I', //'I'mages 82 'F' //'F'iles with selected extensions 83 ]; 84 } 85 }, { 86 key: "getImageExtensions", 87 value: function getImageExtensions() { 88 return ["jpg", "bmp", "jpeg", "jpe", "gif", "png", "webp"]; 89 } 90 }, { 91 key: "getMaxSize", 92 value: function getMaxSize() { 93 if (_classStaticPrivateFieldSpecGet(this, Options, _quota) !== null && !_classStaticPrivateFieldSpecGet(this, Options, _quota)) { 94 if (/^\d+$/.test(main_core.Loc.getMessage("bxQuota"))) { 95 _classStaticPrivateFieldSpecSet(this, Options, _quota, parseInt(main_core.Loc.getMessage("bxQuota"))); 96 } else { 97 _classStaticPrivateFieldSpecSet(this, Options, _quota, null); 98 } 99 } 100 101 return _classStaticPrivateFieldSpecGet(this, Options, _quota); 102 } 103 }, { 104 key: "decrementMaxSize", 105 value: function decrementMaxSize(size) { 106 if (this.getMaxSize() !== null) { 107 _classStaticPrivateFieldSpecSet(this, Options, _quota, _classStaticPrivateFieldSpecGet(this, Options, _quota) - size); 108 } 109 110 return _classStaticPrivateFieldSpecGet(this, Options, _quota); 111 } 112 }, { 113 key: "getMaxTimeToUploading", 114 value: function getMaxTimeToUploading() { 115 return 900; 116 } 117 }, { 118 key: "getVersion", 119 value: function getVersion() { 120 return '1'; 121 } 122 }]); 123 return Options; 124 }(); 125 126 babelHelpers.defineProperty(Options, "defaultSettings", null); 127 var _quota = { 128 writable: true, 129 value: void 0 130 }; 131 babelHelpers.defineProperty(Options, "uploadStatus", { 132 ready: 'upload is ready', 133 preparing: 'upload is not started, but preparing', 134 inProgress: 'upload is in active streaming', 135 done: 'upload is in successfully done', 136 error: 'upload is in finished with errors', 137 stopped: 'PAUSE' 138 }); 139 babelHelpers.defineProperty(Options, "fileStatus", { 140 ready: 'fileIsReady', 141 removed: 'fileIsRemoved', 142 restored: 'fileIsRestored', 143 errored: 'fileIsBad' 144 }); 145 146 var DropZone = /*#__PURE__*/function () { 147 function DropZone(dropZoneNode) { 148 babelHelpers.classCallCheck(this, DropZone); 149 150 if (main_core.Type.isStringFilled(dropZoneNode)) { 151 dropZoneNode = document.getElementById(dropZoneNode); 152 } 153 154 if (main_core.Type.isDomNode(dropZoneNode) && BX.DD && BX.ajax.FormData.isSupported()) { 155 this.initialize(dropZoneNode); 156 } 157 } 158 159 babelHelpers.createClass(DropZone, [{ 160 key: "initialize", 161 value: function initialize(dropZoneNode) { 162 var _this = this; 163 164 this.dndObject = new BX.DD.dropFiles(dropZoneNode); 165 166 if (!this.dndObject || !this.dndObject.supported()) { 167 return; 168 } 169 170 var handlers = { 171 dropFiles: function dropFiles(_ref) { 172 var _ref$compatData = babelHelpers.slicedToArray(_ref.compatData, 2), 173 files = _ref$compatData[0], 174 e = _ref$compatData[1]; 175 176 if (e && e["dataTransfer"] && e["dataTransfer"]["items"] && e["dataTransfer"]["items"].length > 0) { 177 var replaceFileArray = false;
178 var fileCopies = []; 179 var item; 180 181 for (var i = 0; i < e["dataTransfer"]["items"].length; i++) { 182 item = e["dataTransfer"]["items"][i]; 183 184 if (item["webkitGetAsEntry"] && item["getAsFile"]) { 185 replaceFileArray = true; 186 var entry = item["webkitGetAsEntry"](); 187 188 if (entry && entry.isFile) { 189 fileCopies.push(item["getAsFile"]()); 190 } 191 } 192 } 193 194 if (replaceFileArray) files = fileCopies; 195 } 196 197 main_core_events.EventEmitter.emit(_this, Options.getEventName('caught'), { 198 files: files 199 }); 200 }, 201 dragEnter: function dragEnter(_ref2) { 202 var _ref2$compatData = babelHelpers.slicedToArray(_ref2.compatData, 1), 203 e = _ref2$compatData[0]; 204 205 var isFileTransfer = false; 206 207 if (e && e["dataTransfer"] && e["dataTransfer"]["types"]) { 208 for (var i = 0; i < e["dataTransfer"]["types"].length; i++) { 209 if (e["dataTransfer"]["types"][i] === "Files") { 210 isFileTransfer = true; 211 break; 212 } 213 } 214 } 215 216 if (isFileTransfer) { 217 _this.dndObject.DIV.classList.add('bxu-file-input-over'); 218 219 BX.onCustomEvent(_this, 'dragEnter', [e]); // compatibility event 220 } 221 }, 222 dragLeave: function dragLeave(_ref3) { 223 var _ref3$compatData = babelHelpers.slicedToArray(_ref3.compatData, 1), 224 e = _ref3$compatData[0]; 225 226 _this.dndObject.DIV.classList.remove('bxu-file-input-over'); 227 228 BX.onCustomEvent(_this, 'dragLeave', [e]); // compatibility event 229 } 230 }; 231 main_core_events.EventEmitter.subscribe(this.dndObject, 'dropFiles', handlers.dropFiles); 232 main_core_events.EventEmitter.subscribe(this.dndObject, 'dragEnter', handlers.dragEnter); 233 main_core_events.EventEmitter.subscribe(this.dndObject, 'dragLeave', handlers.dragLeave); 234 } 235 }, { 236 key: "destroy", 237 value: function destroy() { 238 main_core_events.EventEmitter.unsubscribeAll(this.dndObject); 239 delete this.dndObject.DIV; 240 delete this.dndObject; 241 } 242 }]); 243 return DropZone; 244 }(); 245 246 var buildAjaxPromiseToRestoreCsrf = function buildAjaxPromiseToRestoreCsrf(config, withoutRestoringCsrf) { 247 withoutRestoringCsrf = withoutRestoringCsrf || false; 248 var originalConfig = Object.assign({}, config); 249 var request = null; 250 251 config.onrequeststart = function (xhr) { 252 request = xhr; 253 }; 254 255 var promise = BX.ajax.promise(config); 256 return promise.then(function (response) { 257 if (!withoutRestoringCsrf && main_core.Type.isPlainObject(response) && response['errors']) { 258 var csrfProblem = false; 259 response.errors.forEach(function (error) { 260 if (error.code === 'invalid_csrf' && error.customData.csrf) { 261 BX.message({ 262 'bitrix_sessid': error.customData.csrf 263 }); 264 originalConfig.headers = originalConfig.headers || []; 265 originalConfig.headers = originalConfig.headers.filter(function (header) { 266 return header && header.name !== 'X-Bitrix-Csrf-Token'; 267 }); 268 originalConfig.headers.push({ 269 name: 'X-Bitrix-Csrf-Token', 270 value: BX.bitrix_sessid() 271 }); 272 csrfProblem = true; 273 } 274 }); 275 276 if (csrfProblem) { 277 return buildAjaxPromiseToRestoreCsrf(originalConfig, true); 278 } 279 } 280 281 return response; 282 }).then(function (response) { 283 var assetsLoaded = new BX.Promise(); 284 assetsLoaded.fulfill(response); 285 return assetsLoaded; 286 }).catch(function (_ref) { 287 var reason = _ref.reason, 288 data = _ref.data; 289 290 if (reason === 'status' && data && (String(data).indexOf('503') >= 0 || String(data).indexOf('504') >= 0)) { 291 originalConfig['50xCounter'] = (originalConfig['50xCounter'] || 0) + 1; 292 293 if (originalConfig['50xCounter'] <= 2) { 294 var headers = request.getAllResponseHeaders().trim().split(/[\r\n]+/); 295 var headerMap = {};
296 headers.forEach(function (line) { 297 var parts = line.split(': '); 298 var header = parts.shift().toLowerCase(); 299 headerMap[header] = parts.join(': '); 300 }); 301 var timeoutSec = null; 302 303 if (headerMap['retry-after'] && /\d+/.test(headerMap['retry-after'])) { 304 timeoutSec = parseInt(headerMap['retry-after']); 305 } 306 307 var p = new BX.Promise(); 308 setTimeout(function () { 309 p.fulfill(); 310 }, (timeoutSec || 20) * 1000); 311 return p.then(function () { 312 return buildAjaxPromiseToRestoreCsrf(originalConfig); 313 }); 314 } 315 } 316 317 var ajaxReject = new BX.Promise(); 318 319 if (main_core.Type.isPlainObject(data) && data.status && data.hasOwnProperty('data')) { 320 ajaxReject.reject(data); 321 } else { 322 ajaxReject.reject({ 323 status: 'error', 324 data: { 325 ajaxRejectData: data 326 }, 327 errors: [{ 328 code: 'NETWORK_ERROR', 329 message: 'Network error' 330 }] 331 }); 332 } 333 334 return ajaxReject; 335 }); 336 }; 337 338 var Stream = /*#__PURE__*/function (_EventEmitter) { 339 babelHelpers.inherits(Stream, _EventEmitter); 340 341 function Stream() { 342 var _this; 343 344 babelHelpers.classCallCheck(this, Stream); 345 _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(Stream).call(this)); 346 347 _this.setEventNamespace(Options.getEventNamespace()); 348 349 _this.onprogress = _this.onprogress.bind(babelHelpers.assertThisInitialized(_this)); 350 _this.onprogressupload = _this.onprogressupload.bind(babelHelpers.assertThisInitialized(_this)); 351 return _this; 352 } 353 354 babelHelpers.createClass(Stream, [{ 355 key: "send", 356 value: function send(url, formData) { 357 var _this2 = this; 358 359 this.deltaTime = -1 * new Date().getTime(); 360 this.totalSize = null; 361 buildAjaxPromiseToRestoreCsrf({ 362 method: 'POST', 363 dataType: 'json', 364 url: url, 365 data: formData, 366 timeout: Options.getMaxTimeToUploading(), 367 preparePost: false, 368 headers: [{ 369 name: 'X-Bitrix-Csrf-Token', 370 value: BX.bitrix_sessid() 371 }, { 372 name: 'X-Bitrix-Site-Id', 373 value: BX.message.SITE_ID || '' 374 }], 375 onprogress: this.onprogress, 376 onprogressupload: this.onprogressupload 377 }).then(function (response) { 378 _this2.done({ 379 status: 'success', 380 data: response 381 }); 382 }).catch(function (_ref2) { 383 var errors = _ref2.errors, 384 data = _ref2.data; 385 386 _this2.done({ 387 status: 'failed', 388 errors: errors.map(function (_ref3) { 389 var code = _ref3.code, 390 message = _ref3.message; 391 return message; 392 }), 393 data: data 394 }); 395 }).catch(function (response) { 396 _this2.done({ 397 status: 'failed', 398 errors: ['Unexpected server response.'], 399 data: response 400 }); 401 }); 402 } 403 }, { 404 key: "onprogress", 405 value: function onprogress(e) {} 406 }, { 407 key: "onprogressupload", 408 value: function onprogressupload(e) { 409 var procent = 5; 410 411 if (babelHelpers.typeof(e) == "object" && e.lengthComputable) { 412 procent = e.loaded * 100 / (e["total"] || e["totalSize"]); 413 this.totalSize = e["total"] || e["totalSize"]; 414 } else if (e > procent) procent = e; 415 416 procent = procent > 5 ? procent : 5; 417 this.emit('progress', procent); 418 } 419 }, { 420 key: "done", 421 value: function done(response) { 422 this.deltaTime += new Date().getTime(); 423 Options.calibratePostSize(this.deltaTime, this.totalSize); 424 this.emit('done', response); 425 } 426 }, { 427 key: "destroy", 428 value: function destroy() { 429 console.log('Clear all from stream'); 430 } 431 }]); 432 return Stream; 433 }(main_core_events.EventEmitter); 434 435 function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); } 436 437 function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } 438 439 var _currentFileToUpload = /*#__PURE__*/new WeakMap(); 440 441 var PackageFile = /*#__PURE__*/function (_EventEmitter) { 442 babelHelpers.inherits(PackageFile, _EventEmitter); 443 444 //null|ready 445 //null|inprogress|done|errored 446 function PackageFile(item, pack) { 447 var _this; 448 449 babelHelpers.classCallCheck(this, PackageFile); 450 _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(PackageFile).call(this)); 451 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "isReadyToPack", true); 452 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "packStatus", null); 453 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "packPercent", 0); 454 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "uploadStatus", null); 455 456 _classPrivateFieldInitSpec(babelHelpers.assertThisInitialized(_this), _currentFileToUpload, { 457 writable: true, 458 value: null 459 }); 460 461 _this.setEventNamespace(Options.getEventNamespace()); 462 463 _this.item = item; // item with a node 464 465 _this.id = item.getId(); 466 _this.name = item.name; 467 _this.fileStatus = Options.fileStatus.ready; // ready|remove|restore 468 469 _this.isReadyToPack = item.preparationStatus === _this.constructor.preparationStatusIsDone; 470 _this.copiesCount = item.getThumbs("getCount") + 1; 471 main_core_events.EventEmitter.subscribeOnce(item, 'onFileIsDeleted', function () { 472 _this.fileStatus = Options.fileStatus.removed; 473 }); 474 475 if (!_this.isReadyToPack) { 476 main_core_events.EventEmitter.subscribeOnce(item, 'onFileIsPrepared', function () { 477 _this.isReadyToPack = true; 478
479 _this.emit('onReady'); 480 }); 481 main_core_events.EventEmitter.emit(item, 'onFileHasToBePrepared', new main_core_events.BaseEvent({ 482 compatData: [item.getId(), item] 483 })); 484 } 485 486 return _this; 487 } 488 489 babelHelpers.createClass(PackageFile, [{ 490 key: "isReady", 491 value: function isReady() { 492 return this.isReadyToPack; 493 } 494 }, { 495 key: "isRemoved", 496 value: function isRemoved() { 497 return this.fileStatus === Options.fileStatus.removed; 498 } 499 }, { 500 key: "isPacked", 501 value: function isPacked() { 502 return this.packStatus === Options.uploadStatus.done; 503 } 504 }, { 505 key: "getId", 506 value: function getId() { 507 return this.id; 508 } 509 }, { 510 key: "markAsPacked", 511 value: function markAsPacked(percentToIncrement) { 512 if (percentToIncrement === true) { 513 this.packStatus = Options.uploadStatus.done; 514 this.packPercent = 100; 515 } else { 516 this.packPercent += percentToIncrement / this.copiesCount; 517 this.packPercent = this.packPercent > 100 ? 100 : this.packPercent; 518 } 519 } 520 }, { 521 key: "packFile", 522 value: function packFile() { 523 var result = { 524 error: false, 525 done: true, 526 data: null 527 }; 528 529 if (this.isRemoved()) { 530 result.data = { 531 removed: 'Y', 532 name: this.name 533 }; 534 this.markAsPacked(true); 535 } 536 537 if (this.isPacked()) { 538 return result; 539 } 540 541 var currentBlob; 542 var copyName = 'default'; 543 544 if (this.packStatus === null) { 545 result.data = this.item.getProps() || { 546 name: this.name 547 }; 548 549 if (this.item['restored']) { 550 result.data['restored'] = this.item['restored']; 551 delete this.item['restored']; 552 } 553 554 this.packStatus = Options.uploadStatus.inProgress; 555 currentBlob = this.item["file"]; 556 } else if (babelHelpers.classPrivateFieldGet(this, _currentFileToUpload) instanceof Blob) { 557 currentBlob = babelHelpers.classPrivateFieldGet(this, _currentFileToUpload); 558 babelHelpers.classPrivateFieldSet(this, _currentFileToUpload, null); 559 } else { 560 currentBlob = this.item.getThumbs(null); 561 562 if (currentBlob === null) { 563 this.markAsPacked(true); 564 return result; 565 } 566 567 copyName = currentBlob['thumb']; 568 } 569 570 var packingPercent = 100; 571 572 if (currentBlob instanceof Blob) // Regular behaviour 573 { 574 var blob = BX.UploaderUtils.getFilePart(currentBlob, Options.getUploadLimits('phpUploadMaxFilesize')); 575 576 if (blob && blob !== currentBlob) { 577 if (blob.packages - blob.package > 1) { 578 babelHelpers.classPrivateFieldSet(this, _currentFileToUpload, currentBlob); 579 } 580 581 packingPercent = blob.size / currentBlob.size * 100; 582 copyName = [copyName, '.ch', blob.package, '.', (blob.start > 0 ? blob.start : "0") + '.chs' + blob.packages].join(''); 583 blob.name = copyName; 584 } 585 586 currentBlob = blob; 587 } 588 589 if (currentBlob) { 590 result.data = result.data || { 591 name: this.name 592 }; 593 594 if (currentBlob instanceof Blob) { 595 result.data[copyName] = currentBlob; 596 } else { 597 result.data['files'] = result.data['files'] || {}; 598 result.data['files'][copyName] = currentBlob; 599 } 600 } 601 602 if (result.data) { 603 result.done = false; 604 this.markAsPacked(packingPercent); 605 } else { 606 this.markAsPacked(true); 607 } 608 609 return result; 610 } 611 }, { 612 key: "parseResponse", 613 value: function parseResponse(_ref) {// console.log('parseResponse: ', this.getId(), file); 614 615 var file = _ref.file, 616 hash = _ref.hash, 617 status = _ref.status; 618 } 619 }, { 620 key: "size", 621 get: function get() { 622 return this.item ? this.item.size || 0 : 0; 623 } 624 }]); 625 return PackageFile; 626 }(main_core_events.EventEmitter); 627 628 babelHelpers.defineProperty(PackageFile, "preparationStatusIsDone", 4); 629 630 var getFormDataSize = function getFormDataSize(formData) { 631 var entries = formData.entries(); 632 var entry, 633 filesCount = 0, 634 formSize = 0; 635 636 while ((entry = entries.next()) && entry.done === false) { 637 var _entry$value = babelHelpers.slicedToArray(entry.value, 2), 638 name = _entry$value[0], 639 value = _entry$value[1]; 640 641 if (value instanceof Blob) { 642 filesCount++; 643 formSize += value.size; 644 } else { 645 formSize += value.toString().length; 646 } 647 648 formSize += name.toString().length; 649 } 650 651 return [formSize, filesCount]; 652 }; 653 654 var convertFormDataToObject = function convertFormDataToObject(formData) { 655 var entries = formData.entries(); 656 var entry; 657 var data = {}; 658 659 while ((entry = entries.next()) && entry.done === false) { 660 var _entry$value2 = babelHelpers.slicedToArray(entry.value, 2), 661 name = _entry$value2[0], 662 value = _entry$value2[1]; 663 664 if (name.indexOf('[') <= 0) { 665 data[name] = value; 666 } else { 667 (function () { 668 var names = [name.substring(0, name.indexOf('['))]; 669 name.replace(/\[(.*?)\]/gi, function (n, nn) { 670 names.push(nn.length > 0 ? nn : ''); 671 }); 672 var n = void 0; 673 var pointer = data; 674 675 while (n = names.shift()) { 676 if (n === '') { 677 pointer.push(value); 678 break; 679 } else if (names.length <= 0) { 680 pointer[n] = value; 681 break; 682 } else if (names[0] === '') { 683 pointer[n] = pointer[n] || []; 684 pointer = pointer[n]; 685 } else { 686 pointer[n] = pointer[n] || {}; 687 pointer = pointer[n]; 688 } 689 } 690 })(); 691 } 692 } 693 694 return data; 695 }; 696 697 var copyFormToForm = function copyFormToForm(fromData1, formData2) { 698 var entries = fromData1.entries(); 699 var entry; 700 701 while ((entry = entries.next()) && entry.done === false) { 702 var _entry$value3 = babelHelpers.slicedToArray(entry.value, 2), 703 name = _entry$value3[0], 704 value = _entry$value3[1]; 705 706 if (value instanceof Blob) { 707 formData2.append(name, value, value.name); 708 } else { 709 formData2.append(name, value); 710 } 711 } 712 }; 713 714 var appendToForm = function appendToForm(formData, ob, prefix) { 715 for (var ii in ob) { 716 if (ob.hasOwnProperty(ii)) { 717 var name = (prefix ? prefix + '[#name#]' : '#name#').replace('#name#', ii); 718 719 if (main_core.Type.isPlainObject(ob[ii])) { 720 appendToForm(formData, ob[ii], name); 721 } else { 722 if (ob[ii] instanceof Blob) { 723 formData.append(name, ob[ii], ob[ii]['name'] || ii); 724 } else { 725 formData.append(name, ob[ii]); 726 } 727 } 728 } 729 } 730 }; 731 732 function _classPrivateFieldInitSpec$1(obj, privateMap, value) { _checkPrivateRedeclaration$1(obj, privateMap); privateMap.set(obj, value); } 733 734 function _checkPrivateRedeclaration$1(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } } 735 736 var _formDataFilesCount = /*#__PURE__*/new WeakMap(); 737 738 var _formDataSize = /*#__PURE__*/new WeakMap(); 739 740 var Package = /*#__PURE__*/function (_EventEmitter) { 741 babelHelpers.inherits(Package, _EventEmitter); 742 743 function Package(_ref) { 744 var _this; 745 746 var id = _ref.id, 747 formData = _ref.formData, 748 files = _ref.files, 749 uploadFileUrl = _ref.uploadFileUrl, 750 uploadInputName = _ref.uploadInputName; 751 babelHelpers.classCallCheck(this, Package); 752 _this = babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(Package).call(this)); 753 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "length", 0); 754 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "filesVirgin", new Set()); 755 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "filesInprogress", new Set()); 756 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "files", new Map()); 757 758 _classPrivateFieldInitSpec$1(babelHelpers.assertThisInitialized(_this), _formDataFilesCount, { 759 writable: true, 760 value: 0 761 }); 762 763 _classPrivateFieldInitSpec$1(babelHelpers.assertThisInitialized(_this), _formDataSize, { 764 writable: true, 765 value: 0 766 }); 767 768 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "makeAPackTimeout", 0); 769 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "uploadStatus", Options.uploadStatus.ready); 770 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "errors", []); 771 babelHelpers.defineProperty(babelHelpers.assertThisInitialized(_this), "response", { 772 status: 'start' 773 }); 774 775 _this.setEventNamespace(Options.getEventNamespace()); 776 777 _this.id = id; 778 _this.formData = formData; 779 _this.uploadFileUrl = uploadFileUrl; 780 _this.uploadInputName = uploadInputName; 781 782 _this.initFiles(files); 783 784 console.log('2. Package is created with ', _this.filesVirgin.size, ' files.'); 785 _this.doneStreaming = _this.doneStreaming.bind(babelHelpers.assertThisInitialized(_this)); 786 _this.progressStreaming = _this.progressStreaming.bind(babelHelpers.assertThisInitialized(_this)); 787 return _this; 788 } 789 790 babelHelpers.createClass(Package, [{ 791 key: "getId", 792 value: function getId() { 793 return this.id; 794 } 795 }, { 796 key: "initFiles", 797 value: function initFiles(files) { 798 var _this2 = this; 799
800 files.forEach(function (fileItem) { 801 var uploadFile = new PackageFile(fileItem); 802 803 _this2.filesVirgin.add(uploadFile.getId()); 804 805 _this2.files.set(uploadFile.getId(), uploadFile); 806 }); 807 } 808 }, { 809 key: "prepare", 810 value: function prepare() { 811 var _getFormDataSize = getFormDataSize(this.formData), 812 _getFormDataSize2 = babelHelpers.slicedToArray(_getFormDataSize, 2), 813 formSize = _getFormDataSize2[0], 814 filesCount = _getFormDataSize2[1]; 815 816 console.log('2.1 Prepare form with files: ', filesCount, ' and formSize: ', parseInt(formSize), 'B'); 817 818 if (Options.getUploadLimits('phpMaxFileUploads') <= filesCount) { 819 this.error('Too many files in your form. '); 820 return false; 821 } 822 823 if (Options.getUploadLimits('phpPostMaxSize') - formSize < Options.getUploadLimits('phpPostMinSize')) { 824 this.error('Too much data in your form. '); 825 return false; 826 } 827 828 var packSize = 0; 829 this.files.forEach(function (file) { 830 packSize += file.size; 831 }); 832 833 if (Options.getMaxSize() !== null && Options.getMaxSize() < packSize) { 834 this.error('There is not enough space on your server.'); 835 return false; 836 } 837 838 Options.decrementMaxSize(packSize); 839 babelHelpers.classPrivateFieldSet(this, _formDataSize, formSize); 840 babelHelpers.classPrivateFieldSet(this, _formDataFilesCount, filesCount); 841 return true; 842 } 843 }, { 844 key: "run", 845 value: function run(stream) { 846 if (this.uploadStatus !== Options.uploadStatus.ready) { 847 return; 848 } 849 850 console.log('4. Package is running with a stream: ', stream); 851 this.uploadStatus = Options.uploadStatus.preparing; 852 return this.startStreaming(stream); 853 } 854 }, { 855 key: "bindStream", 856 value: function bindStream(stream) { 857 if (stream === this.stream) { 858 return; 859 } 860 861 this.stream = stream; 862 stream.subscribe('done', this.doneStreaming); 863 stream.subscribe('progress', this.progressStreaming); 864 } 865 }, { 866 key: "unbindStream", 867 value: function unbindStream(stream) { 868 if (stream || this.stream) { 869 (stream || this.stream).unsubscribe('done', this.doneStreaming); 870 (stream || this.stream).unsubscribe('progress', this.progressStreaming); 871 872 if (stream === this.stream) { 873 delete this.stream; 874 } 875 } 876 } 877 }, { 878 key: "makeAPack", 879 value: function makeAPack(formSize, filesCount, formData) { 880 var _this3 = this; 881 882 while (formSize - Options.getUploadLimits('phpUploadMaxFilesize') > 0 && filesCount > 0) { 883 if (this.filesVirgin.size <= 0) { 884 break; 885 } 886 887 var entry = this.filesVirgin.entries().next(); 888 889 if (entry.done === true) { 890 break; 891 } 892 /*@var uploadItem: PackageFile */ 893 894 895 var _entry$value = babelHelpers.slicedToArray(entry.value, 1), 896 uploadItemId = _entry$value[0]; 897 898 var uploadItem = this.files.get(uploadItemId); 899 900 if (!uploadItem.isReady()) { 901 return uploadItem.subscribeOnce('onReady', function () { 902 _this3.makeAPack(formSize, filesCount, formData); 903 }); 904 } 905 906 var result = uploadItem.packFile(); 907 908 if (result.data) { 909 var name = "".concat(this.uploadInputName, "[").concat(uploadItem.getId(), "]"); 910 var tmpFormData = new FormData(); 911 appendToForm(tmpFormData, result.data, name); 912 913 var _getFormDataSize3 = getFormDataSize(tmpFormData), 914 _getFormDataSize4 = babelHelpers.slicedToArray(_getFormDataSize3, 2), 915 tmpFormSize = _getFormDataSize4[0], 916 tmpFilesCount = _getFormDataSize4[1]; 917 918 copyFormToForm(tmpFormData, formData); 919 formSize -= tmpFormSize; 920 filesCount -= tmpFilesCount; 921 this.filesInprogress.add(uploadItemId); 922 } 923 924 if (result.done === true) { 925 this.filesVirgin.delete(uploadItemId); 926 } 927 } 928
929 return this.emit('onPackIsReady', formData); 930 } 931 }, { 932 key: "startStreaming", 933 value: function startStreaming(stream) { 934 this.bindStream(stream); 935 this.doStreaming(stream); 936 } 937 }, { 938 key: "doStreaming", 939 value: function doStreaming(stream) { 940 var _this4 = this; 941 942 this.subscribeOnce('onPackIsReady', function (_ref2) { 943 var data = _ref2.data; 944 console.log('onPackIsReady: ', data); 945 console.groupEnd('Make a pack.'); 946 clearTimeout(_this4.makeAPackTimeout); 947 _this4.makeAPackTimeout = 0; 948 949 if (data instanceof FormData) { 950 var firstValue = data.entries().next(); 951 952 if (firstValue.done === true && !firstValue.value) { 953 return _this4.checkAndDone(stream); 954 } 955 956 copyFormToForm(_this4.formData, data); 957 console.log('4.1. Start streaming'); 958 return stream.send(_this4.uploadFileUrl, data); 959 } 960 961 _this4.error('Package: error in packing'); 962 }); 963 var formSize = Math.min(Options.getUploadLimits('currentPostSize'), Options.getUploadLimits('phpPostMaxSize') - babelHelpers.classPrivateFieldGet(this, _formDataSize)); 964 var filesCount = Options.getUploadLimits('phpMaxFileUploads') - babelHelpers.classPrivateFieldGet(this, _formDataFilesCount); 965 var fromData = new FormData(); 966 console.group('Make a pack.'); 967 this.makeAPack(formSize, filesCount, fromData); 968 this.makeAPackTimeout = setTimeout(function () { 969 _this4.emit('onPackIsReady', null); 970 }, Options.getUploadLimits('estimatedTimeForUploadFile') * 1000); 971 } 972 }, { 973 key: "doneStreaming", 974 value: function doneStreaming(_ref3) { 975 var stream = _ref3.target, 976 _ref3$data = _ref3.data, 977 status = _ref3$data.status, 978 data = _ref3$data.data, 979 errors = _ref3$data.errors; 980 console.log('4.2. Done streaming'); 981 982 if (status === 'success') { 983 this.parseResponse(data); 984 985 if (this.errors.length <= 0) { 986 this.doStreaming(stream); 987 } 988 } else { 989 this.error(errors.join('. ')); 990 } 991 } 992 }, { 993 key: "progressStreaming", 994 value: function progressStreaming(_ref4) { 995 var _this5 = this; 996 997 var percent = _ref4.data; 998 this.filesInprogress.forEach(function (itemId) { 999 var item = _this5.files.get(itemId); 1000 1001 var currentPercent = percent * (item.packPercent || 0); 1002 1003 if (!item['previousPackPercent']) { 1004 item['previousPackPercent'] = currentPercent; 1005 } 1006 1007 _this5.emit('fileIsInProgress', { 1008 itemId: itemId, 1009 item: item.item, 1010 percent: Math.ceil(Math.max(item['previousPackPercent'], currentPercent) / 100) 1011 }); 1012 1013 item['previousPackPercent'] = currentPercent; 1014 }); 1015 } 1016 }, { 1017 key: "parseResponse", 1018 value: function parseResponse(data) { 1019 var _this6 = this; 1020 1021 var merge = function merge(ar1, ar2) { 1022 for (var jj in ar2) { 1023 if (ar2.hasOwnProperty(jj)) { 1024 ar1[jj] = main_core.Type.isPlainObject(ar2[jj]) && main_core.Type.isPlainObject(ar1[jj]) ? merge(ar1[jj], ar2[jj]) : ar2[jj]; 1025 } 1026 } 1027 1028 return ar1; 1029 }; 1030 1031 this.response = merge(this.response, data); 1032 1033 if (data.status === 'error') { 1034 this.error('Error in a uploading'); 1035 } else if (!data['files']) { 1036 this.error('Unexpected server response.'); 1037 } else { 1038 this.filesInprogress.forEach(function (itemId) { 1039 var fileResponse = data['files'][itemId] || { 1040 status: 'error', 1041 errors: ['File data is not found'] 1042 }; 1043 1044 if (fileResponse.status === 'error' || fileResponse.status === 'uploaded') { 1045 _this6.filesVirgin.delete(itemId); 1046 1047 _this6.emit(fileResponse.status === 'error' ? 'fileIsErrored' : 'fileIsUploaded', { 1048 itemId: itemId, 1049 item: _this6.files.get(itemId).item, 1050 response: fileResponse 1051 }); 1052 } 1053 1054 _this6.files.get(itemId).parseResponse(fileResponse); 1055 }); 1056 this.filesInprogress.clear(); 1057 } 1058 } 1059 }, { 1060 key: "checkAndDone", 1061 value: function checkAndDone(stream) { 1062 console.log('5. Form has been sent.'); 1063 1064 if (this.response['status'] === 'done') { 1065 this.done(stream); 1066 } else if (this.response['status'] === 'start') { 1067 this.error('Error with starting package.'); 1068 } else if (this.response['status'] !== 'continue') { 1069 this.error('Unknown response'); 1070 } 1071 } 1072 }, { 1073 key: "done", 1074 value: function done(stream) { 1075 console.log('5.1 Release the stream'); 1076 this.unbindStream(stream);
1077 this.emit('done', { 1078 status: this.errors.length <= 0 ? 'success' : 'failed' 1079 }); 1080 } 1081 }, { 1082 key: "error", 1083 value: function error(errorText) { 1084 var _this7 = this; 1085 1086 var handler = function handler(itemId) { 1087 _this7.emit('fileIsErrored', { 1088 itemId: itemId, 1089 item: _this7.files.get(itemId).item, 1090 response: { 1091 error: errorText, 1092 status: 'failed' 1093 }, 1094 serverResponse: Object.assign({}, _this7.response) 1095 }); 1096 }; 1097 1098 this.filesVirgin.forEach(handler); 1099 this.filesVirgin.clear(); 1100 this.filesInprogress.forEach(handler); 1101 this.filesInprogress.clear(); 1102 this.errors.push(errorText); 1103 console.log('5. Form has been sent with errors: ', this.errors); 1104 this.done(this.stream); 1105 } 1106 }, { 1107 key: "getServerResponse", 1108 value: function getServerResponse() { 1109 return this.response; 1110 } 1111 }, { 1112 key: "filesCount", 1113 get: function get() { 1114 return this.filesVirgin.size + this.filesInprogress.size; 1115 } 1116 }, { 1117 key: "data", 1118 get: function get() { 1119 return convertFormDataToObject(this.formData); 1120 } 1121 }]); 1122 return Package; 1123 }(main_core_events.EventEmitter); 1124 1125 function _classStaticPrivateMethodGet(receiver, classConstructor, method) { _classCheckPrivateStaticAccess$1(receiver, classConstructor); return method; } 1126 1127 function _classStaticPrivateFieldSpecGet$1(receiver, classConstructor, descriptor) { _classCheckPrivateStaticAccess$1(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor$1(descriptor, "get"); return _classApplyDescriptorGet$1(receiver, descriptor); } 1128 1129 function _classCheckPrivateStaticFieldDescriptor$1(descriptor, action) { if (descriptor === undefined) { throw new TypeError("attempted to " + action + " private static field before its declaration"); } } 1130 1131 function _classCheckPrivateStaticAccess$1(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } } 1132 1133 function _classApplyDescriptorGet$1(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } 1134 1135 var Streams = /*#__PURE__*/function (_EventEmitter) { 1136 babelHelpers.inherits(Streams, _EventEmitter); 1137 1138 function Streams() { 1139 babelHelpers.classCallCheck(this, Streams); 1140 return babelHelpers.possibleConstructorReturn(this, babelHelpers.getPrototypeOf(Streams).apply(this, arguments)); 1141 } 1142 1143 babelHelpers.createClass(Streams, null, [{ 1144 key: "addPackage", 1145 value: function addPackage(pack) { 1146 console.log('3. Add to a stream queue.'); 1147 1148 if (this.maxInstances > 0 && _classStaticPrivateFieldSpecGet$1(this, Streams, _instance).size > this.maxInstances) { 1149 _classStaticPrivateFieldSpecGet$1(this, Streams, _packages).set(pack); 1150 } else { 1151 _classStaticPrivateFieldSpecGet$1(this, Streams, _packages).delete(pack); 1152 1153 _classStaticPrivateMethodGet(this, Streams, _runPackage).call(this, pack); 1154 } 1155 1156 if (!window[_classStaticPrivateFieldSpecGet$1(this, Streams, _hiddenTag)]) { 1157 window[_classStaticPrivateFieldSpecGet$1(this, Streams, _hiddenTag)] = _classStaticPrivateMethodGet(this, Streams, _catchWindow).bind(this); 1158 main_core.Event.bind(window, 'beforeunload', window[_classStaticPrivateFieldSpecGet$1(this, Streams, _hiddenTag)]); 1159 } 1160 } 1161 }]); 1162 return Streams; 1163 }(main_core_events.EventEmitter); 1164 1165 function _catchWindow(event) { 1166 if (_classStaticPrivateFieldSpecGet$1(this, Streams, _packages).size > 0 || _classStaticPrivateFieldSpecGet$1(this, Streams, _instance).size > 0) { 1167 var confirmationMessage = main_core.Loc.getMessage('UPLOADER_UPLOADING_ONBEFOREUNLOAD'); 1168 (event || window.event).returnValue = confirmationMessage; 1169 return confirmationMessage; 1170 } 1171 } 1172 1173 function _runPackage(pack) { 1174 var _this = this; 1175 1176 var stream = new Stream(); 1177 1178 _classStaticPrivateFieldSpecGet$1(this, Streams, _instance).set(stream); 1179 1180 console.log('3.1. Run package in a stream.'); 1181 pack.subscribeOnce('done', function () { 1182 console.log('6. Package is done so release the stream.'); 1183 1184 _classStaticPrivateFieldSpecGet$1(_this, Streams, _instance).delete(stream); 1185 1186 stream.destroy(); 1187 1188 if (_classStaticPrivateFieldSpecGet$1(_this, Streams, _packages).size > 0) { 1189 var _classStaticPrivateFi = babelHelpers.slicedToArray(_classStaticPrivateFieldSpecGet$1(_this, Streams, _packages).entries().next().value, 1), 1190 newPack = _classStaticPrivateFi[0]; 1191 1192 _this.addPackage(newPack); 1193 } else if (_classStaticPrivateFieldSpecGet$1(_this, Streams, _instance).size <= 0) { 1194 main_core.Event.unbind(window, 'beforeunload', window[_classStaticPrivateFieldSpecGet$1(_this, Streams, _hiddenTag)]); 1195 delete window[_classStaticPrivateFieldSpecGet$1(_this, Streams, _hiddenTag)]; 1196 } 1197 }); 1198 pack.run(stream); 1199 } 1200 1201 babelHelpers.defineProperty(Streams, "maxInstances", 3); 1202 var _instance = { 1203 writable: true, 1204 value: new Map() 1205 }; 1206 var _packages = { 1207 writable: true, 1208 value: new Map() 1209 }; 1210 var _hiddenTag = { 1211 writable: true, 1212 value: Symbol('streams descriptor') 1213 }; 1214 1215 (function (window) { 1216 window.BX = window['BX'] || {}; 1217 if (window.BX["UploaderQueue"]) return false;
1218 var BX = window.BX, 1219 statuses = { 1220 "new": 0, 1221 ready: 1, 1222 preparing: 2, 1223 inprogress: 3, 1224 done: 4, 1225 failed: 5, 1226 stopped: 6, 1227 changed: 7, 1228 uploaded: 8 1229 }; 1230 /** 1231 * @return {BX.UploaderQueue} 1232 * @params array 1233 * @params[placeHolder] - DOM node to append files /OL or UL/ 1234 */ 1235 1236 BX.UploaderQueue = function (params, limits, caller) { 1237 this.dialogName = "BX.UploaderQueue"; 1238 limits = !!limits ? limits : {}; 1239 this.limits = { 1240 phpPostMaxSize: limits["phpPostMaxSize"], 1241 phpUploadMaxFilesize: limits["phpUploadMaxFilesize"], 1242 uploadMaxFilesize: limits["uploadMaxFilesize"] > 0 ? limits["uploadMaxFilesize"] : 0, 1243 uploadFileWidth: limits["uploadFileWidth"] > 0 ? limits["uploadFileWidth"] : 0, 1244 uploadFileHeight: limits["uploadFileHeight"] > 0 ? limits["uploadFileHeight"] : 0 1245 }; 1246 this.placeHolder = BX(params["placeHolder"]); 1247 this.showImage = params["showImage"] !== false && params["showImage"] !== 'N'; 1248 this.sortItems = params["sortItems"] !== false && params["sortItems"] !== 'N'; 1249 this.fileCopies = params["copies"]; 1250 this.fileFields = params["fields"]; 1251 this.uploader = caller; 1252 this.itForUpload = new BX.UploaderUtils.Hash(); 1253 this.items = new BX.UploaderUtils.Hash(); 1254 this.itUploaded = new BX.UploaderUtils.Hash(); 1255 this.itFailed = new BX.UploaderUtils.Hash(); 1256 this.thumb = { 1257 tagName: "LI", 1258 className: "bx-bxu-thumb-thumb" 1259 }; 1260 1261 if (!!params["thumb"]) { 1262 for (var ii in params["thumb"]) { 1263 if (params["thumb"].hasOwnProperty(ii) && this.thumb.hasOwnProperty(ii)) { 1264 this.thumb[ii] = params["thumb"][ii]; 1265 } 1266 } 1267 } 1268 1269 BX.addCustomEvent(caller, "onItemIsAdded", BX.delegate(this.addItem, this)); 1270 BX.addCustomEvent(caller, "onFileIsDeleted", BX.delegate(this.deleteItem, this)); 1271 BX.addCustomEvent(caller, "onFileIsReinited", BX.delegate(this.reinitItem, this)); 1272 this.log('Initialized'); 1273 return this; 1274 }; 1275 1276 BX.UploaderQueue.prototype = { 1277 showError: function showError(text) { 1278 this.log('Error! ' + text); 1279 }, 1280 log: function log(text) { 1281 BX.UploaderUtils.log('queue', text); 1282 }, 1283 addItem: function addItem(file, being) { 1284 var isImage; 1285 if (!this.showImage) isImage = false;else if (BX.type.isDomNode(file)) isImage = BX.UploaderUtils.isImage(file.value, null, null);else isImage = BX.UploaderUtils.isImage(file["name"], file["type"], file["size"]); 1286 BX.onCustomEvent(this.uploader, "onFileIsBeforeCreated", [file, being, isImage, this.uploader]); 1287 var params = { 1288 copies: this.fileCopies, 1289 fields: this.fileFields 1290 }, 1291 res = isImage ? new BX.UploaderImage(file, params, this.limits, this.uploader) : new BX.UploaderFile(file, params, this.limits, this.uploader), 1292 children, 1293 node, 1294 itemStatus = { 1295 status: statuses.ready 1296 }; 1297 BX.onCustomEvent(res, "onFileIsAfterCreated", [res, being, itemStatus, this.uploader]); 1298 BX.onCustomEvent(this.uploader, "onFileIsAfterCreated", [res, being, itemStatus, this.uploader]); 1299 this.items.setItem(res.id, res); 1300 1301 if (being || itemStatus["status"] !== statuses.ready) { 1302 this.itUploaded.setItem(res.id, res); 1303 } else { 1304 this.itForUpload.setItem(res.id, res); 1305 } 1306 1307 if (!!this.placeHolder) { 1308 if (BX(being)) { 1309 res.thumbNode = node = BX(being); 1310 node.setAttribute("bx-bxu-item-id", res.id); 1311 } else { 1312 children = res.makeThumb(); 1313 node = BX.create(this.thumb.tagName, { 1314 attrs: { 1315 id: res.id + 'Item', 1316 'bx-bxu-item-id': res.id, 1317 className: this.thumb.className 1318 } 1319 }); 1320 1321 if (BX.type.isNotEmptyString(children)) { 1322 if (this.thumb.tagName == 'TR') { 1323 children = children.replace(/[\n\t]/gi, "").replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1"); 1324 if (!!children["trim"]) children = children.trim(); 1325 1326 var replaceFunction = function replaceFunction(str, tdParams, tdInnerHTML) { 1327 var td = node.insertCell(-1), 1328 attrs = { 1329 colspan: true, 1330 headers: true, 1331 accesskey: true, 1332 "class": true, 1333 contenteditable: true, 1334 contextmenu: true, 1335 dir: true, 1336 hidden: true, 1337 id: true, 1338 lang: true, 1339 spellcheck: true, 1340 style: true, 1341 tabindex: true, 1342 title: true, 1343 translate: true 1344 }, 1345 param; 1346 td.innerHTML = tdInnerHTML; 1347 tdParams = tdParams.split(" "); 1348 1349 while ((param = tdParams.pop()) && param) { 1350 param = param.split("="); 1351 1352 if (param.length == 2) { 1353 param[0] = param[0].replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1").replace(/^["'](.*?)["']$/gi, "$1"); 1354 param[1] = param[1].replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1").replace(/^["'](.*?)["']$/gi, "$1"); 1355 if (attrs[param[0]] === true) td.setAttribute(param[0], param[1]);else td[param[0]] = param[1]; 1356 } 1357 } 1358 1359 return ""; 1360 }, 1361 regex = /^<td(.*?)>(.*?)<\/td>/i; 1362 1363 window.data1 = children; 1364 1365 while (regex.test(children)) { 1366 children = children.replace(regex, replaceFunction); 1367 } 1368 } else { 1369 node.innerHTML = children; 1370 } 1371 } else if (BX.type.isDomNode(children)) { 1372 BX.adjust(node, { 1373 children: [children] 1374 }); 1375 } 1376 } 1377 1378 if (!!window["jsDD"] && this.sortItems) { 1379 if (!this._onbxdragstart) { 1380 this._onbxdragstart = BX.delegate(this.onbxdragstart, this); 1381 this._onbxdragstop = BX.delegate(this.onbxdragstop, this); 1382 this._onbxdrag = BX.delegate(this.onbxdrag, this); 1383 this._onbxdraghout = BX.delegate(this.onbxdraghout, this); 1384 this._onbxdestdraghover = BX.delegate(this.onbxdestdraghover, this); 1385 this._onbxdestdraghout = BX.delegate(this.onbxdestdraghout, this); 1386 this._onbxdestdragfinish = BX.delegate(this.onbxdestdragfinish, this); 1387 } 1388 1389 BX.addClass(node, "bx-drag-draggable"); 1390 node.onbxdragstart = this._onbxdragstart; 1391 node.onbxdragstop = this._onbxdragstop; 1392 node.onbxdrag = this._onbxdrag; 1393 node.onbxdraghout = this._onbxdraghout; 1394 window.jsDD.registerObject(node); 1395 node.onbxdestdraghover = this._onbxdestdraghover; 1396 node.onbxdestdraghout = this._onbxdestdraghout; 1397 node.onbxdestdragfinish = this._onbxdestdragfinish; 1398 window.jsDD.registerDest(node); 1399 var inputs = BX.findChild(node, { 1400 tagName: "INPUT", 1401 props: { 1402 "type": "text" 1403 } 1404 }, true, true); 1405 1406 for (var ii = 0; ii <= inputs.length; ii++) { 1407 BX.bind(inputs[ii], "mousedown", BX.eventCancelBubble); 1408 } 1409 } 1410 1411 node.setAttribute("bx-item-id", res.id); 1412 1413 if (BX(being)) { 1414 BX.onCustomEvent(this.uploader, "onFileIsBound", [res.id, res, this.caller, being]); 1415 BX.onCustomEvent(res, "onFileIsBound", [res.id, res, this.caller, being]); 1416 } else if (!!being) { 1417 this.placeHolder.appendChild(node); 1418 BX.onCustomEvent(this.uploader, "onFileIsAttached", [res.id, res, this.caller, being]); 1419 BX.onCustomEvent(res, "onFileIsAttached", [res.id, res, this.caller, being]); 1420 } else { 1421 this.placeHolder.appendChild(node); 1422 BX.onCustomEvent(this.uploader, "onFileIsAppended", [res.id, res, this.caller]); 1423 BX.onCustomEvent(res, "onFileIsAppended", [res.id, res, this.caller]); 1424 } 1425 } 1426 1427 BX.onCustomEvent(this.uploader, "onQueueIsChanged", [this, "add", res.id, res]); 1428 }, 1429 getItem: function getItem(id) { 1430 var item = this.items.getItem(id); 1431 if (item) return { 1432 item: item, 1433 node: item.thumbNode || BX(id + 'Item') 1434 }; 1435 return null; 1436 }, 1437 onbxdragstart: function onbxdragstart() { 1438 var item = BX.proxy_context, 1439 id = item && item.getAttribute("bx-item-id"); 1440 1441 if (id) { 1442 var template = item.innerHTML.replace(new RegExp(id, "gi"), "DragCopy"); 1443 item.__dragCopyDiv = BX.create('DIV', { 1444 attrs: { 1445 className: "bx-drag-object " + item.className 1446 }, 1447 style: { 1448 position: "absolute", 1449 zIndex: 10, 1450 width: item.clientWidth + 'px' 1451 }, 1452 html: template 1453 }); 1454 item.__dragCopyPos = BX.pos(item); 1455 BX.onCustomEvent(this.uploader, "onBxDragStart", [item, item.__dragCopyDiv]); 1456 document.body.appendChild(item.__dragCopyDiv); 1457 BX.addClass(item, "bx-drag-source"); 1458 var c = BX('DragCopyProperCanvas'),
1459 c1, 1460 it = this.items.getItem(id); 1461 1462 if (c && it && BX(it.canvas)) { 1463 c1 = it.canvas.cloneNode(true); 1464 c.parentNode.replaceChild(c1, c); 1465 c1.getContext("2d").drawImage(it.canvas, 0, 0); 1466 } 1467 } 1468 1469 return true; 1470 }, 1471 onbxdragstop: function onbxdragstop() { 1472 var item = BX.proxy_context; 1473 1474 if (item.__dragCopyDiv) { 1475 BX.removeClass(item, "bx-drag-source"); 1476 1477 item.__dragCopyDiv.parentNode.removeChild(item.__dragCopyDiv); 1478 1479 item.__dragCopyDiv = null; 1480 delete item['__dragCopyDiv']; 1481 delete item['__dragCopyPos']; 1482 } 1483 1484 return true; 1485 }, 1486 onbxdrag: function onbxdrag(x, y) { 1487 var item = BX.proxy_context, 1488 div = item.__dragCopyDiv; 1489 1490 if (div) { 1491 if (item.__dragCopyPos) { 1492 if (!item.__dragCopyPos.deltaX) item.__dragCopyPos.deltaX = item.__dragCopyPos.left - x; 1493 if (!item.__dragCopyPos.deltaY) item.__dragCopyPos.deltaY = item.__dragCopyPos.top - y; 1494 x += item.__dragCopyPos.deltaX; 1495 y += item.__dragCopyPos.deltaY; 1496 } 1497 1498 div.style.left = x + 'px'; 1499 div.style.top = y + 'px'; 1500 } 1501 }, 1502 onbxdraghout: function onbxdraghout(currentNode, x, y) {}, 1503 onbxdestdraghover: function onbxdestdraghover(currentNode) { 1504 if (!currentNode || !currentNode.hasAttribute("bx-bxu-item-id") || !this.items.hasItem(currentNode.getAttribute("bx-bxu-item-id"))) return; 1505 var item = BX.proxy_context; 1506 BX.addClass(item, "bx-drag-over"); 1507 return true; 1508 }, 1509 onbxdestdraghout: function onbxdestdraghout() { 1510 var item = BX.proxy_context; 1511 BX.removeClass(item, "bx-drag-over"); 1512 return true; 1513 }, 1514 onbxdestdragfinish: function onbxdestdragfinish(currentNode) { 1515 var item = BX.proxy_context; 1516 BX.removeClass(item, "bx-drag-over"); 1517 if (item == currentNode || !BX.hasClass(currentNode, "bx-drag-draggable")) return true; 1518 var id = currentNode.getAttribute("bx-bxu-item-id"); 1519 if (!this.items.hasItem(id)) return; 1520 var obj = item.parentNode, 1521 n = obj.childNodes.length, 1522 act, 1523 it, 1524 buff, 1525 j; 1526 1527 for (j = 0; j < n; j++) { 1528 if (obj.childNodes[j] == item) item.number = j;else if (obj.childNodes[j] == currentNode) currentNode.number = j; 1529 if (currentNode.number > 0 && item.number > 0) break; 1530 } 1531 1532 if (this.itForUpload.hasItem(id)) { 1533 act = item.number <= currentNode.number ? "beforeItem" : item.nextSibling ? "afterItem" : "inTheEnd"; 1534 it = null; 1535 1536 if (act != "inTheEnd") { 1537 for (j = item.number + (act == "beforeItem" ? 0 : 1); j < n; j++) { 1538 if (this.itForUpload.hasItem(obj.childNodes[j].getAttribute("bx-bxu-item-id"))) { 1539 it = obj.childNodes[j].getAttribute("bx-bxu-item-id"); 1540 break; 1541 } 1542 } 1543 1544 if (it === null) act = "inTheEnd"; 1545 } 1546 1547 buff = this.itForUpload.removeItem(currentNode.getAttribute("bx-bxu-item-id")); 1548 if (act != "inTheEnd") this.itForUpload.insertBeforeItem(buff.id, buff, it);else this.itForUpload.setItem(buff.id, buff); 1549 } 1550 1551 act = item.number <= currentNode.number ? "beforeItem" : item.nextSibling ? "afterItem" : "inTheEnd"; 1552 it = null; 1553 1554 if (act != "inTheEnd") { 1555 for (j = item.number + (act == "beforeItem" ? 0 : 1); j < n; j++) { 1556 if (this.items.hasItem(obj.childNodes[j].getAttribute("bx-bxu-item-id"))) { 1557 it = obj.childNodes[j].getAttribute("bx-bxu-item-id"); 1558 break; 1559 } 1560 } 1561 1562 if (it === null) act = "inTheEnd"; 1563 } 1564 1565 buff = this.items.removeItem(currentNode.getAttribute("bx-bxu-item-id")); 1566 if (act != "inTheEnd") this.items.insertBeforeItem(buff.id, buff, it);else this.items.setItem(buff.id, buff); 1567 currentNode.parentNode.removeChild(currentNode); 1568 1569 if (item.number <= currentNode.number) { 1570 item.parentNode.insertBefore(currentNode, item); 1571 } else if (item.nextSibling) { 1572 item.parentNode.insertBefore(currentNode, item.nextSibling); 1573 } else { 1574 for (j = 0; j < n; j++) { 1575 if (obj.childNodes[j] == item) item.number = j;else if (obj.childNodes[j] == currentNode) currentNode.number = j; 1576 } 1577 1578 if (item.number <= currentNode.number) { 1579 item.parentNode.insertBefore(currentNode, item); 1580 } else { 1581 item.parentNode.appendChild(currentNode); 1582 } 1583 } 1584 1585 BX.onCustomEvent(item, "onFileOrderIsChanged", [item.id, item, this.caller]); 1586 BX.onCustomEvent(this.uploader, "onQueueIsChanged", [this, "sort", item.id, item]); 1587 return true; 1588 }, 1589 deleteItem: function deleteItem(id, item) { 1590 var pointer = this.getItem(id), 1591 node; 1592 1593 if (pointer && (!this.placeHolder || (node = pointer.node) && node)) { 1594 if (!!node) { 1595 if (!!window["jsDD"]) { 1596 node.onmousedown = null; 1597 node.onbxdragstart = null; 1598 node.onbxdragstop = null; 1599 node.onbxdrag = null; 1600 node.onbxdraghout = null; 1601 node.onbxdestdraghover = null; 1602 node.onbxdestdraghout = null; 1603 node.onbxdestdragfinish = null; 1604 node.__bxpos = null; 1605 window.jsDD.arObjects[node.__bxddid] = null; 1606 delete window.jsDD.arObjects[node.__bxddid]; 1607 window.jsDD.arDestinations[node.__bxddeid] = null; 1608 delete window.jsDD.arDestinations[node.__bxddeid]; 1609 } 1610 1611 BX.unbindAll(node); 1612 if (item["replaced"] !== true) node.parentNode.removeChild(node); 1613 } 1614 1615 this.items.removeItem(id); 1616 this.itUploaded.removeItem(id); 1617 this.itFailed.removeItem(id); 1618 this.itForUpload.removeItem(id); 1619 BX.onCustomEvent(this.uploader, "onQueueIsChanged", [this, "delete", id, item]); 1620 return true; 1621 } 1622 1623 return false;
1624 }, 1625 reinitItem: function reinitItem(id, item) { 1626 var node, children; 1627 1628 if (!!this.placeHolder && this.items.hasItem(id) && (node = BX(id + 'Item')) && node) { 1629 children = item.makeThumb(); 1630 1631 if (BX.type.isNotEmptyString(children)) { 1632 if (this.thumb.tagName == 'TR') { 1633 children = children.replace(/[\n\t]/gi, "").replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1"); 1634 if (!!children["trim"]) children = children.trim(); 1635 1636 var replaceFunction = function replaceFunction(str, tdParams, tdInnerHTML) { 1637 var td = node.insertCell(-1), 1638 attrs = { 1639 colspan: true, 1640 headers: true, 1641 accesskey: true, 1642 "class": true, 1643 contenteditable: true, 1644 contextmenu: true, 1645 dir: true, 1646 hidden: true, 1647 id: true, 1648 lang: true, 1649 spellcheck: true, 1650 style: true, 1651 tabindex: true, 1652 title: true, 1653 translate: true 1654 }, 1655 param; 1656 td.innerHTML = tdInnerHTML; 1657 tdParams = tdParams.split(" "); 1658 1659 while ((param = tdParams.pop()) && param) { 1660 param = param.split("="); 1661 1662 if (param.length == 2) { 1663 param[0] = param[0].replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1").replace(/^["'](.*?)["']$/gi, "$1"); 1664 param[1] = param[1].replace(/^(\s+)(.*?)/gi, "$2").replace(/(.*?)(\s+)$/gi, "$1").replace(/^["'](.*?)["']$/gi, "$1"); 1665 if (attrs[param[0]] === true) td.setAttribute(param[0], param[1]);else td[param[0]] = param[1]; 1666 } 1667 } 1668 1669 return ""; 1670 }, 1671 regex = /^<td(.*?)>(.*?)<\/td>/i; 1672 1673 window.data1 = children; 1674 1675 while (regex.test(children)) { 1676 children = children.replace(regex, replaceFunction); 1677 } 1678 } else { 1679 node.innerHTML = children; 1680 } 1681 } else if (BX.type.isDomNode(children)) { 1682 while (BX(node.firstChild)) { 1683 BX.remove(node.firstChild); 1684 } 1685 1686 BX.adjust(node, { 1687 children: [children] 1688 }); 1689 } 1690 1691 BX.onCustomEvent(this.uploader, "onFileIsAppended", [item.id, item, this.caller]); 1692 BX.onCustomEvent(item, "onFileIsAppended", [item.id, item, this.caller]); 1693 } 1694 }, 1695 clear: function clear() { 1696 var item; 1697 1698 while ((item = this.items.getFirst()) && !!item) { 1699 this.deleteItem(item.id, item); 1700 } 1701 }, 1702 restoreFiles: function restoreFiles(data, restoreErrored, startAgain) { 1703 data.reset(); 1704 var item, copy, erroredFile; 1705 1706 while ((item = data.getNext()) && item) { 1707 erroredFile = this.itFailed.hasItem(item.id); 1708 1709 if (restoreErrored === true) { 1710 this.itFailed.removeItem(item.id); 1711 } 1712 1713 if (!this.items.hasItem(item.id) || this.itFailed.hasItem(item.id)) { 1714 continue; 1715 } 1716 1717 if (startAgain === true || startAgain !== false && erroredFile) // for compatibility 1718 { 1719 delete item["uploadStatus"]; 1720 delete item.file["uploadStatus"]; 1721 delete item.file["firstChunk"]; 1722 delete item.file["package"]; 1723 delete item.file["packages"]; 1724 1725 if (item.file["copies"]) { 1726 item.file["copies"].reset(); 1727 1728 while ((copy = item.file["copies"].getNext()) && copy) { 1729 delete copy["uploadStatus"]; 1730 delete copy["firstChunk"]; 1731 delete copy["package"]; 1732 delete copy["packages"]; 1733 } 1734 1735 item.file["copies"].reset(); 1736 } 1737 1738 item["restored"] = startAgain === true ? "Y" : "C"; // Start again or continue 1739 } else { 1740 if (erroredFile) // If a error was occurred on the last step we should send this piece again 1741 { 1742 if (item.file["package"]) { 1743 item.file["package"]--; 1744 } 1745 1746 if (item.file["copies"]) { 1747 item.file["copies"].reset(); 1748 1749 while ((copy = item.file["copies"].getNext()) && copy) { 1750 delete copy["uploadStatus"]; 1751 delete copy["firstChunk"]; 1752 delete copy["package"]; 1753 delete copy["packages"]; 1754 } 1755 1756 item.file["copies"].reset(); 1757 } 1758 } 1759 1760 item["restored"] = "C"; // Continue 1761 } 1762 1763 this.itUploaded.removeItem(item.id); 1764 this.itForUpload.setItem(item.id, item); 1765 BX.onCustomEvent(item, "onUploadRestore", [item]); 1766 } 1767 } 1768 }; 1769 return statuses; 1770 })(window); 1771 1772 (function (window) { 1773 window.BX = window['BX'] || {}; 1774 if (window.BX["UploaderUtils"]) return false;
1775 var BX = window.BX; 1776 BX.UploaderLog = []; 1777 BX.UploaderDebug = false; 1778 var statuses = { 1779 "new": 0, 1780 ready: 1, 1781 preparing: 2, 1782 inprogress: 3, 1783 done: 4, 1784 failed: 5, 1785 stopped: 6, 1786 changed: 7, 1787 uploaded: 8 1788 }; 1789 BX.UploaderUtils = { 1790 statuses: statuses, 1791 getId: function getId() { 1792 return new Date().valueOf() + Math.round(Math.random() * 1000000); 1793 }, 1794 log: function log() { 1795 if (BX.UploaderDebug === true) { 1796 console.log(arguments); 1797 } else { 1798 BX.UploaderLog.push(arguments); 1799 } 1800 }, 1801 Hash: function () { 1802 var d = function d() { 1803 this.length = 0; 1804 this.items = {}; 1805 this.order = []; 1806 var i; 1807 1808 if (arguments.length == 1 && BX.type.isArray(arguments[0]) && arguments[0].length > 0) { 1809 var data = arguments[0]; 1810 1811 for (i = 0; i < data.length; i++) { 1812 if (data[i] && babelHelpers.typeof(data[i]) == "object" && data[i]["id"]) { 1813 this.setItem(data[i]["id"], data[i]); 1814 } 1815 } 1816 } else { 1817 for (i = 0; i < arguments.length; i += 2) { 1818 this.setItem(arguments[i], arguments[i + 1]); 1819 } 1820 } 1821 }; 1822 1823 d.prototype = { 1824 getIds: function getIds() { 1825 return this.order; 1826 }, 1827 getQueue: function getQueue(id) { 1828 id += ''; 1829 return BX.util.array_search(id, this.order); 1830 }, 1831 getByOrder: function getByOrder(order) { 1832 return this.getItem(this.order[order]); 1833 }, 1834 removeItem: function removeItem(in_key) { 1835 in_key += ''; 1836 var tmp_value, number; 1837 1838 if (typeof this.items[in_key] != 'undefined') { 1839 tmp_value = this.items[in_key]; 1840 number = this.getQueue(in_key); 1841 this.pointer -= this.pointer >= number ? 1 : 0; 1842 delete this.items[in_key]; 1843 this.order = BX.util.deleteFromArray(this.order, number); 1844 this.length = this.order.length; 1845 } 1846 1847 return tmp_value; 1848 }, 1849 getItem: function getItem(in_key) { 1850 in_key += ''; 1851 return this.items[in_key]; 1852 }, 1853 unshiftItem: function unshiftItem(in_key, in_value) { 1854 in_key += ''; 1855 1856 if (typeof in_value != 'undefined') { 1857 if (typeof this.items[in_key] == 'undefined') { 1858 this.order.unshift(in_key); 1859 this.length = this.order.length; 1860 } 1861 1862 this.items[in_key] = in_value; 1863 } 1864 1865 return in_value; 1866 }, 1867 setItem: function setItem(in_key, in_value) { 1868 in_key += ''; 1869 1870 if (typeof in_value != 'undefined') { 1871 if (typeof this.items[in_key] == 'undefined') { 1872 this.order.push(in_key); 1873 this.length = this.order.length; 1874 } 1875 1876 this.items[in_key] = in_value; 1877 } 1878 1879 return in_value; 1880 }, 1881 hasItem: function hasItem(in_key) { 1882 in_key += ''; 1883 return typeof this.items[in_key] != 'undefined'; 1884 }, 1885 insertBeforeItem: function insertBeforeItem(in_key, in_value, after_key) { 1886 in_key += ''; 1887 1888 if (typeof in_value != 'undefined') { 1889 if (typeof this.items[in_key] == 'undefined') { 1890 this.order.splice(this.getQueue(after_key), 0, in_key); 1891 this.length = this.order.length; 1892 } 1893 1894 this.items[in_key] = in_value; 1895 } 1896 1897 return in_value; 1898 }, 1899 getFirst: function getFirst() { 1900 var in_key, 1901 item = null; 1902 1903 for (var ii = 0; ii < this.order.length; ii++) { 1904 in_key = this.order[ii]; 1905 1906 if (!!in_key && this.hasItem(in_key)) { 1907 item = this.getItem(in_key); 1908 break; 1909 } 1910 } 1911 1912 return item; 1913 }, 1914 getNext: function getNext() { 1915 this.pointer = 0 <= this.pointer && this.pointer < this.order.length ? this.pointer : -1; 1916 var res = this.getItem(this.order[this.pointer + 1]); 1917 if (!!res) this.pointer++;else this.pointer = -1; 1918 return res; 1919 }, 1920 getPrev: function getPrev() { 1921 this.pointer = 0 <= this.pointer && this.pointer < this.order.length ? this.pointer : 0; 1922 var res = this.getItem(this.order[this.pointer - 1]); 1923 if (!!res) this.pointer--; 1924 return res; 1925 }, 1926 reset: function reset() { 1927 this.pointer = -1; 1928 }, 1929 setPointer: function setPointer(in_key) { 1930 this.pointer = this.getQueue(in_key); 1931 return this.pointer; 1932 }, 1933 getLast: function getLast() { 1934 var in_key, 1935 item = null; 1936 1937 for (var ii = this.order.length; ii >= 0; ii--) { 1938 in_key = this.order[ii]; 1939 1940 if (!!in_key && this.hasItem(in_key)) { 1941 item = this.getItem(in_key); 1942 break; 1943 } 1944 } 1945 1946 return item; 1947 } 1948 }; 1949 return d; 1950 }(), 1951 getFileNameOnly: function getFileNameOnly(name) { 1952 var delimiter = "\\", 1953 start = name.lastIndexOf(delimiter), 1954 finish = name.length; 1955 1956 if (start == -1) { 1957 delimiter = "/"; 1958 start = name.lastIndexOf(delimiter); 1959 } 1960 1961 if (start + 1 == name.length) { 1962 finish = start; 1963 start = name.substring(0, finish).lastIndexOf(delimiter); 1964 } 1965 1966 name = name.substring(start + 1, finish); 1967 1968 if (delimiter == "/" && name.indexOf("?") > 0) { 1969 name = name.substring(0, name.indexOf("?")); 1970 } 1971 1972 if (name == '') name = 'noname'; 1973 return name; 1974 }, 1975 isImageExt: function isImageExt(ext) { 1976 return BX.message('bxImageExtensions') && BX.type.isNotEmptyString(ext) ? new RegExp('(?:^|\\W)(' + ext + ')(?:\\W|$)', 'gi').test(BX.message('bxImageExtensions')) : false;
1977 }, 1978 isImage: function isImage(name, type, size) { 1979 size = BX.type.isNumber(size) ? size : BX.type.isNotEmptyString(size) && !/[\D]+/gi.test(size) ? parseInt(size) : null; 1980 return (type === null || (type || '').indexOf("image/") === 0) && (size === null || size < 20 * 1024 * 1024) && BX.UploaderUtils.isImageExt((name || '').lastIndexOf('.') > 0 ? name.substr(name.lastIndexOf('.') + 1).toLowerCase() : ''); 1981 }, 1982 scaleImage: function scaleImage(arSourceSize, arSize, resizeType) { 1983 var sourceImageWidth = parseInt(arSourceSize["width"]), 1984 sourceImageHeight = parseInt(arSourceSize["height"]); 1985 resizeType = !resizeType && !!arSize["type"] ? arSize["type"] : resizeType; 1986 arSize = !!arSize ? arSize : {}; 1987 arSize.width = parseInt(!!arSize.width ? arSize.width : 0); 1988 arSize.height = parseInt(!!arSize.height ? arSize.height : 0); 1989 var res = { 1990 bNeedCreatePicture: false, 1991 source: { 1992 x: 0, 1993 y: 0, 1994 width: 0, 1995 height: 0 1996 }, 1997 destin: { 1998 x: 0, 1999 y: 0, 2000 width: 0, 2001 height: 0 2002 } 2003 }, 2004 width, 2005 height; 2006 2007 if (!(sourceImageWidth > 0 || sourceImageHeight > 0)) { 2008 BX.DoNothing(); 2009 } else { 2010 if (!BX.type.isNotEmptyString(resizeType)) { 2011 resizeType = "inscribed"; 2012 } 2013 2014 var ResizeCoeff, iResizeCoeff; 2015 2016 if (resizeType.indexOf("proportional") >= 0) { 2017 width = Math.max(sourceImageWidth, sourceImageHeight); 2018 height = Math.min(sourceImageWidth, sourceImageHeight); 2019 } else { 2020 width = sourceImageWidth; 2021 height = sourceImageHeight; 2022 } 2023 2024 if (resizeType == "exact") { 2025 var ratio = sourceImageWidth / sourceImageHeight < arSize["width"] / arSize["height"] ? arSize["width"] / sourceImageWidth : arSize["height"] / sourceImageHeight, 2026 x = Math.max(0, Math.round(sourceImageWidth / 2 - arSize["width"] / 2 / ratio)), 2027 y = Math.max(0, Math.round(sourceImageHeight / 2 - arSize["height"] / 2 / ratio)); 2028 res.bNeedCreatePicture = true; 2029 res.coeff = ratio; 2030 res.destin["width"] = arSize["width"]; 2031 res.destin["height"] = arSize["height"]; 2032 res.source["x"] = x; 2033 res.source["y"] = y; 2034 res.source["width"] = Math.round(arSize["width"] / ratio, 0); 2035 res.source["height"] = Math.round(arSize["height"] / ratio, 0); 2036 } else { 2037 if (resizeType == "circumscribed") { 2038 ResizeCoeff = { 2039 width: width > 0 ? arSize["width"] / width : 1, 2040 height: height > 0 ? arSize["height"] / height : 1 2041 }; 2042 iResizeCoeff = Math.max(ResizeCoeff["width"], ResizeCoeff["height"], 1); 2043 } else { 2044 ResizeCoeff = { 2045 width: width > 0 ? arSize["width"] / width : 1, 2046 height: height > 0 ? arSize["height"] / height : 1 2047 }; 2048 iResizeCoeff = Math.min(ResizeCoeff["width"], ResizeCoeff["height"], 1); 2049 iResizeCoeff = 0 < iResizeCoeff ? iResizeCoeff : 1; 2050 } 2051 2052 res.bNeedCreatePicture = iResizeCoeff != 1; 2053 res.coeff = iResizeCoeff; 2054 res.destin["width"] = Math.max(1, parseInt(iResizeCoeff * sourceImageWidth)); 2055 res.destin["height"] = Math.max(1, parseInt(iResizeCoeff * sourceImageHeight)); 2056 res.source["x"] = 0; 2057 res.source["y"] = 0; 2058 res.source["width"] = sourceImageWidth; 2059 res.source["height"] = sourceImageHeight; 2060 } 2061 } 2062 2063 return res; 2064 }, 2065 dataURLToBlob: function dataURLToBlob(dataURL) { 2066 var marker = ';base64,', 2067 parts, 2068 contentType, 2069 raw, 2070 rawLength; 2071 2072 if (dataURL.indexOf(marker) == -1) { 2073 parts = dataURL.split(','); 2074 contentType = parts[0].split(':')[1]; 2075 raw = parts[1]; 2076 return new Blob([raw], { 2077 type: contentType 2078 }); 2079 } 2080 2081 parts = dataURL.split(marker); 2082 contentType = parts[0].split(':')[1]; 2083 raw = window.atob(parts[1]); 2084 rawLength = raw.length; 2085 var uInt8Array = new Uint8Array(rawLength); 2086 2087 for (var i = 0; i < rawLength; ++i) { 2088 uInt8Array[i] = raw.charCodeAt(i); 2089 } 2090 2091 return new Blob([uInt8Array], { 2092 type: contentType 2093 }); 2094 }, 2095 sizeof: function sizeof(obj) { 2096 var size = 0, 2097 key; 2098 2099 for (key in obj) { 2100 if (obj.hasOwnProperty(key)) { 2101 size += key.length; 2102 2103 if (babelHelpers.typeof(obj[key]) == "object") { 2104 if (obj[key] === null) BX.DoNothing();else if (obj[key]["size"] > 0) size += obj[key].size;else size += BX.UploaderUtils.sizeof(obj[key]); 2105 } else if (typeof obj[key] == "number") { 2106 size += obj[key].toString().length; 2107 } else if (!!obj[key] && obj[key].length > 0) { 2108 size += obj[key].length; 2109 } 2110 } 2111 } 2112 2113 return size; 2114 }, 2115 FormToArray: function FormToArray(form, data) {
2116 return BX.ajax.prepareForm(form, data); 2117 }, 2118 getFormattedSize: function getFormattedSize(size, precision) { 2119 var a = ["b", "Kb", "Mb", "Gb", "Tb"], 2120 pos = 0; 2121 2122 while (size >= 1024 && pos < 4) { 2123 size /= 1024; 2124 pos++; 2125 } 2126 2127 return Math.round(size * (precision > 0 ? precision * 10 : 1)) / (precision > 0 ? precision * 10 : 1) + " " + BX.message("FILE_SIZE_" + a[pos]); 2128 }, 2129 bindEvents: function bindEvents(obj, event, func) { 2130 var funcs = [], 2131 ii; 2132 2133 if (typeof func == "string") { 2134 eval('funcs.push(' + func + ');'); 2135 } else if (!!func["length"] && func["length"] > 0) { 2136 for (ii = 0; ii < func.length; ii++) { 2137 if (typeof func[ii] == "string") eval('funcs.push(' + func[ii] + ');');else funcs.push(func[ii]); 2138 } 2139 } else funcs.push(func); 2140 2141 if (funcs.length > 0) { 2142 for (ii = 0; ii < funcs.length; ii++) { 2143 BX.addCustomEvent(obj, event, funcs[ii]); 2144 } 2145 } 2146 }, 2147 applyFilePart: function applyFilePart(file, blob) { 2148 if (BX.type.isDomNode(file)) { 2149 file.uploadStatus = statuses.done; 2150 } else if (file == blob) { 2151 file.uploadStatus = statuses.done; 2152 } else if (file.blobed === true) { 2153 file.uploadStatus = file.package + 1 >= file.packages ? statuses.done : statuses.inprogress; 2154 if (file.uploadStatus == statuses.inprogress) file.package++; 2155 } 2156 2157 return true; 2158 }, 2159 getFilePart: function getFilePart(file, MaxFilesize) { 2160 var blob, 2161 chunkSize = MaxFilesize, 2162 start, 2163 end; 2164 2165 if (BX.type.isDomNode(file)) { 2166 blob = file; 2167 } else if (MaxFilesize <= 0 || file.size <= MaxFilesize) { 2168 blob = file; 2169 } else if (file['packages'] && file['packages'] <= file['package']) { 2170 blob = null; 2171 } else if (window.Blob || window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder) { 2172 if (file['packages']) { 2173 file.package++; 2174 start = file.package * chunkSize; 2175 end = start + chunkSize; 2176 } else { 2177 file.packages = Math.ceil(file.size / chunkSize); 2178 file.package = 0; 2179 start = 0; 2180 end = chunkSize; 2181 } 2182 2183 if ('mozSlice' in file) blob = file.mozSlice(start, end, file.type);else if ('webkitSlice' in file) blob = file.webkitSlice(start, end, file.type);else if ('slice' in file) blob = file.slice(start, end, file.type);else blob = file.Slice(start, end, file.type); 2184 2185 for (var ii in file) { 2186 if (file.hasOwnProperty(ii)) { 2187 blob[ii] = file[ii]; 2188 } 2189 } 2190 2191 blob["name"] = file["name"]; 2192 blob["start"] = start; 2193 blob["package"] = file.package; 2194 blob["packages"] = file.packages; 2195 } 2196 2197 return blob; 2198 }, 2199 makeAnArray: function makeAnArray(file, data) { 2200 file = !!file ? file : { 2201 files: [], 2202 props: {} 2203 }; 2204 var ii; 2205 2206 for (var jj in data) { 2207 if (data.hasOwnProperty(jj)) { 2208 if (babelHelpers.typeof(data[jj]) == "object" && data[jj].length > 0) { 2209 file[jj] = !!file[jj] ? file[jj] : []; 2210 2211 for (ii = 0; ii < data[jj].length; ii++) { 2212 file[jj].push(data[jj][ii]); 2213 } 2214 } else { 2215 for (ii in data[jj]) { 2216 if (data[jj].hasOwnProperty(ii)) { 2217 file[jj] = !!file[jj] ? file[jj] : {}; 2218 file[jj][ii] = data[jj][ii]; 2219 } 2220 } 2221 } 2222 } 2223 } 2224 2225 return file; 2226 }, 2227 appendToForm: function appendToForm(fd, key, val) { 2228 if (!!val && babelHelpers.typeof(val) == "object") { 2229 for (var ii in val) { 2230 if (val.hasOwnProperty(ii)) { 2231 BX.UploaderUtils.appendToForm(fd, key + '[' + ii + ']', val[ii]); 2232 } 2233 } 2234 } else { 2235 fd.append(key, !!val ? val : ''); 2236 } 2237 }, 2238 FormData: function FormData() { 2239 return new (BX.Uploader.getInstanceName() == "BX.UploaderSimple" ? FormDataLocal : window.FormData)(); 2240 }, 2241 prepareData: function prepareData(arData) { 2242 var data = {}; 2243 2244 if (null != arData) { 2245 if (babelHelpers.typeof(arData) == 'object') { 2246 for (var i in arData) { 2247 if (arData.hasOwnProperty(i)) { 2248 var name = BX.util.urlencode(i); 2249 if (babelHelpers.typeof(arData[i]) == 'object') data[name] = BX.UploaderUtils.prepareData(arData[i]);else data[name] = BX.util.urlencode(arData[i]); 2250 } 2251 } 2252 } else data = BX.util.urlencode(arData); 2253 } 2254 2255 return data; 2256 } 2257 }; 2258 2259 var FormDataLocal = function FormDataLocal() { 2260 var uniqueID; 2261 2262 do { 2263 uniqueID = Math.floor(Math.random() * 99999); 2264 } while (BX("form-" + uniqueID)); 2265 2266 this.local = true; 2267 this.form = BX.create("FORM", { 2268 props: { 2269 id: "form-" + uniqueID, 2270 method: "POST", 2271 enctype: "multipart/form-data", 2272 encoding: "multipart/form-data" 2273 }, 2274 style: { 2275 display: "none" 2276 } 2277 }); 2278 document.body.appendChild(this.form); 2279 }; 2280 2281 FormDataLocal.prototype = { 2282 append: function append(name, val) { 2283 if (BX.type.isDomNode(val)) { 2284 this.form.appendChild(val); 2285 } else { 2286 this.form.appendChild(BX.create("INPUT", { 2287 props: { 2288 type: "hidden", 2289 name: name, 2290 value: val 2291 } 2292 })); 2293 } 2294 } 2295 }; 2296 2297 BX.UploaderUtils.slice = function (file, start, end) { 2298 var blob = null; 2299 if ('mozSlice' in file) blob = file.mozSlice(start, end);else if ('webkitSlice' in file) blob = file.webkitSlice(start, end);else if ('slice' in file) blob = file.slice(start, end);else blob = file.Slice(start, end, file.type); 2300 return blob; 2301 }; 2302 2303 BX.UploaderUtils.readFile = function (file, callback, method) { 2304 if (window["FileReader"]) { 2305 var fileReader = new FileReader(); 2306 fileReader.onload = fileReader.onerror = callback;
2307 method = method || 'readAsDataURL'; 2308 2309 if (fileReader[method]) { 2310 fileReader[method](file); 2311 return fileReader; 2312 } 2313 } 2314 2315 return false; 2316 }; 2317 })(window); 2318 2319 var UploaderQueue = window.BX["UploaderQueue"]; 2320 var UploaderUtils = window.BX["UploaderUtils"]; 2321 2322 var Uploader = /*#__PURE__*/function () { 2323 function Uploader(params) { 2324 babelHelpers.classCallCheck(this, Uploader); 2325 babelHelpers.defineProperty(this, "fileInput", null); 2326 babelHelpers.defineProperty(this, "form", null); 2327 babelHelpers.defineProperty(this, "limits", {}); 2328 babelHelpers.defineProperty(this, "packages", new Map()); 2329 var input = params.input, 2330 uploadFileUrl = params.uploadFileUrl, 2331 id = params.id, 2332 CID = params.CID, 2333 controlId = params.controlId, 2334 dropZone = params.dropZone, 2335 placeHolder = params.placeHolder, 2336 events = params.events; 2337 2338 if (main_core.Type.isStringFilled(uploadFileUrl)) { 2339 this.uploadFileUrl = uploadFileUrl; 2340 } 2341 2342 input = main_core.Type.isStringFilled(input) ? document.getElementById(input) : input; 2343 2344 if (main_core.Type.isDomNode(input)) { 2345 this.fileInput = input; 2346 this.form = input.form; 2347 this.uploadFileUrl = this.uploadFileUrl || this.form.getAttribute('action'); 2348 } else if (input !== null) { 2349 main_core.Runtime.debug(main_core.Loc.getMessage('UPLOADER_INPUT_IS_NOT_DEFINED')); 2350 return; 2351 } 2352 2353 if (!this.uploadFileUrl) { 2354 main_core.Runtime.debug(main_core.Loc.getMessage('UPLOADER_ACTION_URL_NOT_DEFINED')); 2355 return; 2356 } 2357 2358 this.constructor.justCounter++; 2359 var uniqueId = UploaderUtils.getId(); 2360 this.id = main_core.Type.isStringFilled(id) ? id : ['bitrixUploaderID', uniqueId].join(''); 2361 this.CID = main_core.Type.isStringFilled(CID) ? CID : 'CID' + uniqueId; // this is a security id 2362 2363 this.controlId = controlId || 'bitrixUploader'; // this is a control id can be lice control name 2364 2365 this.onChange = this.onChange.bind(this); 2366 this.setLimits(params); 2367 this.initParams(params); 2368 this.init(this.fileInput); 2369 this.dropZone = this.initDropZone(dropZone); 2370 this.bindUserEvents(events); 2371 this.initFilesQueue(params); 2372 BX.onCustomEvent(window, 'onUploaderIsInited', [this.id, this]); 2373 Uploader.repo.set(this.id, this); 2374 } 2375 2376 babelHelpers.createClass(Uploader, [{ 2377 key: "setLimits", 2378 value: function setLimits(_ref) { 2379 var uploadMaxFilesize = _ref.uploadMaxFilesize, 2380 uploadFileWidth = _ref.uploadFileWidth, 2381 uploadFileHeight = _ref.uploadFileHeight, 2382 allowUpload = _ref.allowUpload, 2383 allowUploadExt = _ref.allowUploadExt; 2384 this.limits = { 2385 uploadMaxFilesize: uploadMaxFilesize || 0, 2386 uploadFileWidth: uploadFileWidth || 0, 2387 uploadFileHeight: uploadFileHeight || 0, 2388 uploadFileExt: '', 2389 uploadFile: this.fileInput ? this.fileInput.getAttribute('accept') : '', 2390 allowUpload: allowUpload, 2391 //compatibility 2392 allowUploadExt: allowUploadExt //compatibility 2393 2394 }; 2395 var acceptAttribute = []; 2396 2397 if (main_core.Type.isStringFilled(this.limits['uploadFile'])) { 2398 acceptAttribute.push(this.limits['uploadFile']); 2399 } 2400 2401 if (allowUpload === 'I') { 2402 acceptAttribute.push('image/*'); 2403 } 2404 2405 if (main_core.Type.isStringFilled(allowUploadExt)) { 2406 var separator = allowUploadExt.indexOf(',') >= 0 ? ',' : ' '; 2407 var extensions = []; 2408 allowUploadExt.split(separator).forEach(function (extension) { 2409 extensions.push(extension.trim().replace('.', '')); 2410 acceptAttribute.push('.' + extension.trim().replace('.', '')); 2411 }); 2412 2413 if (extensions) { 2414 this.limits["uploadFileExt"] = extensions; 2415 } 2416 } 2417 2418 this.limits['uploadFile'] = acceptAttribute.join(', '); 2419 } 2420 }, { 2421 key: "initParams", 2422 value: function initParams(_ref2) { 2423 var uploadMethod = _ref2.uploadMethod, 2424 uploadFormData = _ref2.uploadFormData, 2425 filesInputMultiple = _ref2.filesInputMultiple, 2426 uploadInputName = _ref2.uploadInputName, 2427 uploadInputInfoName = _ref2.uploadInputInfoName, 2428 deleteFileOnServer = _ref2.deleteFileOnServer, 2429 pasteFileHashInForm = _ref2.pasteFileHashInForm; 2430 // Limits 2431 this.params = { 2432 filesInputMultiple: this.fileInput && this.fileInput["multiple"] || filesInputMultiple ? "multiple" : false, 2433 uploadFormData: uploadFormData === "N" ? "N" : "Y", 2434 uploadMethod: uploadMethod === "immediate" ? "immediate" : "deferred", 2435 uploadInputName: main_core.Type.isStringFilled(uploadInputName) ? uploadInputName : 'bxu_files', 2436 uploadInputInfoName: main_core.Type.isStringFilled(uploadInputInfoName) ? uploadInputInfoName : 'bxu_info', 2437 deleteFileOnServer: !(deleteFileOnServer === false || deleteFileOnServer === "N"), 2438 //to insert hash into the form 2439 filesInputName: this.fileInput && this.fileInput["name"] ? this.fileInput["name"] : "FILES", 2440 pasteFileHashInForm: !(pasteFileHashInForm === false || pasteFileHashInForm === "N") 2441 }; 2442 } 2443 }, { 2444 key: "init", 2445 value: function init(fileInput) { 2446 if (fileInput === null) { 2447 return true; 2448 } 2449 2450 if (main_core.Type.isDomNode(fileInput)) { 2451 var newFileInput = this.makeFileInput(fileInput); 2452 2453 if (fileInput === this.fileInput) { 2454 this.fileInput = newFileInput; 2455 } 2456 2457 if (newFileInput) { 2458 return true; 2459 } 2460 } 2461 2462 return false;
2463 } 2464 }, { 2465 key: "initDropZone", 2466 value: function initDropZone(dropZoneNode) { 2467 var _this = this; 2468 2469 var dropZone = new DropZone(dropZoneNode); 2470 main_core_events.EventEmitter.subscribe(dropZone, Options.getEventName('caught'), function (_ref3) { 2471 var data = _ref3.data; 2472 2473 _this.onChange(data); 2474 }); 2475 main_core_events.EventEmitter.subscribe(this, Options.getEventName('destroy'), function () { 2476 main_core_events.EventEmitter.unsubscribeAll(dropZone, Options.getEventName('caught')); 2477 dropZone.destroy(); 2478 }); 2479 return dropZone; 2480 } 2481 }, { 2482 key: "initFilesQueue", 2483 value: function initFilesQueue(_ref4) { 2484 var fields = _ref4.fields, 2485 copies = _ref4.copies, 2486 placeHolder = _ref4.placeHolder, 2487 showImage = _ref4.showImage, 2488 sortItems = _ref4.sortItems, 2489 thumb = _ref4.thumb, 2490 queueFields = _ref4.queueFields; 2491 var params = { 2492 fields: queueFields && queueFields['fields'] ? queueFields['fields'] : fields, 2493 copies: queueFields && queueFields['copies'] ? queueFields['copies'] : copies, 2494 placeHolder: queueFields && queueFields['placeHolder'] ? queueFields['placeHolder'] : placeHolder, 2495 showImage: queueFields && queueFields['showImage'] ? queueFields['showImage'] : showImage, 2496 sortItems: queueFields && queueFields['sortItems'] ? queueFields['sortItems'] : sortItems, 2497 thumb: queueFields && queueFields['thumb'] ? queueFields['thumb'] : thumb 2498 }; 2499 this.queue = new UploaderQueue(params, this.limits, this); 2500 } 2501 }, { 2502 key: "bindUserEvents", 2503 value: function bindUserEvents(events) { 2504 if (!main_core.Type.isPlainObject(events)) { 2505 return; 2506 } 2507 2508 for (var eventName in events) { 2509 if (events.hasOwnProperty(eventName)) { 2510 main_core_events.EventEmitter.subscribe(this, eventName, events[eventName]); 2511 } 2512 } 2513 } 2514 }, { 2515 key: "makeFileInput", 2516 value: function makeFileInput(oldFileInput) { 2517 if (!main_core.Type.isDomNode(oldFileInput)) { 2518 return false; 2519 } 2520 2521 main_core.Event.unbindAll(oldFileInput, 'change'); 2522 var newFileInput = oldFileInput.cloneNode(true); 2523 newFileInput.value = ''; 2524 newFileInput.setAttribute('name', this.params["uploadInputName"] + '[]'); 2525 newFileInput.setAttribute('multiple', this.params["filesInputMultiple"]); 2526 newFileInput.setAttribute('accept', this.limits["uploadFile"]); 2527 oldFileInput.parentNode.replaceChild(newFileInput, oldFileInput); 2528 BX.onCustomEvent(this, "onFileinputIsReinited", [newFileInput, this]); 2529 main_core.Event.bind(newFileInput, "change", this.onChange); 2530 return newFileInput; 2531 } 2532 }, { 2533 key: "onChange", 2534 value: function onChange(event) { 2535 if (!event) { 2536 return; 2537 } 2538 2539 if (event['preventDefault']) { 2540 event.preventDefault(); 2541 } 2542 2543 if (event['stopPropagation']) { 2544 event.stopPropagation(); 2545 } 2546 2547 var files = []; 2548 2549 if (main_core.Type.isArray(event)) { 2550 files = event; 2551 } else if (main_core.Type.isObject(event)) { 2552 if (event['target']) { 2553 var fileInput = event['target']; 2554 files = fileInput.files; 2555 2556 if (!fileInput || fileInput.disabled) { 2557 return false; 2558 } 2559 2560 BX.onCustomEvent(this, "onFileinputIsChanged", [fileInput, this]); 2561 this.init(fileInput); 2562 } else if (event['files']) { 2563 files = event['files']; 2564 } 2565 } 2566 2567 this.onAttach(files); 2568 return false; 2569 } 2570 }, { 2571 key: "onAttach", 2572 value: function onAttach(files, nodes, check) { 2573 var _this2 = this; 2574 2575 if (!files || !files['length']) { 2576 return false; 2577 } 2578 2579 check = check !== false; 2580 files = babelHelpers.toConsumableArray(files); 2581 nodes = nodes && main_core.Type.isArray(nodes) ? babelHelpers.toConsumableArray(nodes) : []; 2582 BX.onCustomEvent(this, "onAttachFiles", [files, nodes, this]); 2583 var added = false;
2584 babelHelpers.toConsumableArray(files).forEach(function (file, index) { 2585 var ext = ''; 2586 var type = (file['type'] || '').toLowerCase(); 2587 2588 if (main_core.Type.isDomNode(file) && file.value) { 2589 ext = (file.value.name || '').split('.').pop(); 2590 } else { 2591 ext = (file['name'] || file['tmp_url'] || '').split('.').pop(); 2592 2593 if (ext.indexOf('?') > 0) { 2594 ext = ext.substr(0, ext.indexOf('?')); 2595 } 2596 } 2597 2598 ext = ext.toLowerCase(); 2599 2600 if (check) { 2601 var errors = []; 2602 2603 if (_this2.limits['uploadFile'].indexOf('image/') >= 0 && type.indexOf('image/') < 0 && Options.getImageExtensions().indexOf(ext) < 0) { 2604 errors.push('File type is not an image like.'); 2605 } 2606 2607 if (_this2.limits['uploadFileExt'].length > 0) { 2608 if (_this2.limits['uploadFileExt'].indexOf(ext) < 0) { 2609 errors.push("File extension ".concat(ext, " is in ").concat(_this2.limits['uploadFileExt'])); 2610 } else { 2611 errors.pop(); 2612 } 2613 } 2614 2615 if (_this2.limits['uploadMaxFilesize'] > 0 && file.size > _this2.limits['uploadMaxFilesize']) { 2616 errors.push("File size ".concat(file.size, " is bigger than ").concat(_this2.limits['uploadMaxFilesize'])); 2617 } 2618 2619 if (errors.length > 0) { 2620 return; 2621 } 2622 } 2623
2624 if (String['normalize']) { 2625 file.name = String(file.name).normalize(); 2626 } 2627 2628 BX.onCustomEvent(_this2, "onItemIsAdded", [file, nodes[index] || null, _this2]); 2629 added = true; 2630 }); 2631 2632 if (added && this.params["uploadMethod"] === "immediate") { 2633 this.submit(); 2634 } 2635 2636 return false; 2637 } 2638 }, { 2639 key: "getFormData", 2640 value: function getFormData() { 2641 var formData = new FormData(this.params["uploadFormData"] === "Y" && this.form ? this.form : undefined); 2642 var entries = formData.entries(); 2643 var entry; 2644 2645 while ((entry = entries.next()) && entry.done === false) { 2646 var _entry$value = babelHelpers.slicedToArray(entry.value, 1), 2647 name = _entry$value[0]; 2648 2649 if (name.indexOf(this.params["filesInputName"]) === 0 || name.indexOf(this.params["uploadInputInfoName"]) === 0 || name.indexOf(this.params["uploadInputName"]) === 0) { 2650 formData.delete(name); 2651 } 2652 } 2653 2654 formData.append('AJAX_POST', 'Y'); 2655 formData.append('USER_ID', main_core.Loc.getMessage('USER_ID')); 2656 formData.append('sessid', BX.bitrix_sessid()); 2657 2658 if (BX.message.SITE_ID) { 2659 formData.append('SITE_ID', BX.message.SITE_ID); 2660 } 2661 2662 formData.append(this.params["uploadInputInfoName"] + '[controlId]', this.controlId); 2663 formData.append(this.params["uploadInputInfoName"] + '[CID]', this.CID); 2664 formData.append(this.params["uploadInputInfoName"] + '[uploadInputName]', this.params["uploadInputName"]); 2665 formData.append(this.params["uploadInputInfoName"] + '[version]', Options.getVersion()); 2666 return formData; 2667 } 2668 }, { 2669 key: "submit", 2670 value: function submit() { 2671 var _this3 = this; 2672 2673 //region Compatibility 2674 if (this.queue.itForUpload.length <= 0) { 2675 BX.onCustomEvent(this, 'onStart', [null, { 2676 filesCount: 0 2677 }, this]); 2678 BX.onCustomEvent(this, 'onDone', [null, null, { 2679 filesCount: 0 2680 }]); 2681 BX.onCustomEvent(this, 'onFinish', [null, null, { 2682 filesCount: 0 2683 }]); 2684 return; 2685 } //endregion 2686 2687 2688 var files = Object.values(this.queue.itForUpload.items); 2689 var formData = this.getFormData(); //region Here we can change formData 2690 2691 var changedData = {}; 2692 var buffer1 = { 2693 post: { 2694 data: changedData, 2695 size: 0, 2696 filesCount: files.length 2697 }, 2698 //compatibility field 2699 filesCount: files.length 2700 }; 2701 var eventOnPackageIsInitialized = new main_core_events.BaseEvent(); 2702 eventOnPackageIsInitialized.setCompatData([buffer1, this.queue.itForUpload]); 2703 eventOnPackageIsInitialized.setData({ 2704 formData: formData, 2705 data: changedData, 2706 files: files 2707 }); 2708 main_core_events.EventEmitter.emit(this, 'onPackageIsInitialized', eventOnPackageIsInitialized); 2709 appendToForm(formData, buffer1.post.data); 2710 2711 if (buffer1.post.data !== changedData) { 2712 appendToForm(formData, changedData); 2713 } //endregion 2714 2715 2716 var packageId = 'pIndex' + (new Date().valueOf() + Math.round(Math.random() * 1000000)); 2717 formData.append(this.params["uploadInputInfoName"] + '[packageIndex]', packageId); 2718 formData.append(this.params["uploadInputInfoName"] + '[mode]', 'upload'); 2719 formData.append(this.params["uploadInputInfoName"] + '[filesCount]', files.length); 2720 2721 if (this.packages.size <= 0) { 2722 console.group('Upload'); 2723 } 2724 2725 console.log('1. Create a new Package'); 2726 var packItem = new Package({ 2727 id: packageId, 2728 formData: formData, 2729 files: files, 2730 uploadFileUrl: this.uploadFileUrl, 2731 uploadInputName: this.params["uploadInputName"] 2732 }); 2733 this.queue.itForUpload = new UploaderUtils.Hash(); 2734 var eventOnStart = new main_core_events.BaseEvent(); 2735 eventOnStart.setCompatData([packageId, Object.assign({ 2736 post: { 2737 data: packItem.data, 2738 filesCount: files.length 2739 } 2740 }, packItem), this]); 2741 eventOnStart.setData({ 2742 package: packItem 2743 }); 2744 main_core_events.EventEmitter.emit(this, 'onStart', eventOnStart); 2745 this.packages.set(packItem.getId(), packItem); 2746 main_core_events.EventEmitter.emit(this, 'onBusy'); 2747 packItem.subscribeOnce('done', function (_ref5) { 2748 var p = _ref5.target, 2749 status = _ref5.data.status; 2750 var evDone = new main_core_events.BaseEvent(); 2751 evDone.setCompatData([{}, packageId, packItem, packItem.getServerResponse()]); 2752 evDone.setData({ 2753 package: packItem, 2754 response: packItem.getServerResponse() 2755 }); 2756 main_core_events.EventEmitter.emit(_this3, 'onDone', evDone); // region Compatibility 2757 2758 if (status === 'failed') { 2759 main_core_events.EventEmitter.emit(_this3, 'onError', new main_core_events.BaseEvent({ 2760 compatData: [{}, packageId, packItem.getServerResponse()] 2761 })); 2762 } // endregion Compatibility 2763 2764 2765 _this3.packages.delete(p.getId()); 2766 2767 if (_this3.packages.size <= 0) { 2768 setTimeout(function () { 2769 var ev = new main_core_events.BaseEvent(); 2770 ev.setCompatData([{}, packageId, packItem, packItem.getServerResponse()]); 2771 ev.setData({ 2772 package: packItem, 2773 response: packItem.getServerResponse() 2774 }); 2775 main_core_events.EventEmitter.emit(_this3, 'onFinish', ev); 2776 console.groupEnd('Upload'); 2777 }); 2778 } 2779 }); 2780 packItem.subscribe('fileIsUploaded', function (_ref6) { 2781 var _ref6$data = _ref6.data, 2782 itemId = _ref6$data.itemId, 2783 item = _ref6$data.item, 2784 response = _ref6$data.response; 2785 2786 _this3.queue.itUploaded.setItem(itemId, item); 2787 2788 BX.onCustomEvent(_this3, 'onFileIsUploaded', [itemId, item, response]); 2789 BX.onCustomEvent(item, 'onUploadDone', [item, response, _this3, packItem.getId()]); 2790 }); 2791 packItem.subscribe('fileIsErrored', function (_ref7) { 2792 var _ref7$data = _ref7.data, 2793 itemId = _ref7$data.itemId, 2794 item = _ref7$data.item, 2795 response = _ref7$data.response; 2796 2797 _this3.queue.itFailed.setItem(itemId, item); 2798 2799 BX.onCustomEvent(_this3, 'onFileIsUploadedWithError', [itemId, item, response, _this3, packItem.getId()]); 2800 BX.onCustomEvent(item, 'onUploadError', [item, response, _this3, packItem.getId()]); 2801 }); 2802 packItem.subscribe('fileIsInProgress', function (_ref8) { 2803 var _ref8$data = _ref8.data, 2804 item = _ref8$data.item, 2805 percent = _ref8$data.percent; 2806 BX.onCustomEvent(item, 'onUploadProgress', [item, percent, _this3, packItem.getId()]); 2807 }); 2808 2809 if (packItem.prepare()) {
2810 files.forEach(function (item) { 2811 BX.onCustomEvent(item, 'onUploadStart', [item, 0, _this3, packItem.getId()]); 2812 }); 2813 Streams.addPackage(packItem); 2814 } 2815 } 2816 }, { 2817 key: "log", 2818 value: function log(text) {} 2819 }, { 2820 key: "destruct", 2821 value: function destruct() { 2822 main_core_events.EventEmitter.emit(this, Options.getEventName('destroy')); 2823 delete this.dropZone; 2824 } 2825 /*region Compatbility */ 2826 2827 }, { 2828 key: "getItem", 2829 2830 /*endregion*/ 2831 value: function getItem(id) { 2832 return this.queue.getItem(id); 2833 } 2834 }, { 2835 key: "getItems", 2836 value: function getItems() { 2837 return this.queue.items; 2838 } 2839 }, { 2840 key: "restoreItems", 2841 value: function restoreItems() { 2842 //Todo check it 2843 this.queue.restoreFiles.apply(this.queue, arguments); 2844 } 2845 }, { 2846 key: "clear", 2847 value: function clear() { 2848 var item; 2849 2850 while ((item = this.queue.items.getFirst()) && item) { 2851 item.deleteFile(); 2852 } 2853 } 2854 }, { 2855 key: "controlID", 2856 get: function get() { 2857 return this.controlId; 2858 } 2859 }, { 2860 key: "dialogName", 2861 get: function get() { 2862 return "BX.Uploader"; 2863 } 2864 }, { 2865 key: "length", 2866 get: function get() { 2867 return this.queue.itForUpload.length; 2868 } 2869 }, { 2870 key: "streams", 2871 get: function get() { 2872 var _this4 = this; 2873 2874 if (!this['#_streams']) { 2875 this['#_streams'] = { 2876 packages: { 2877 getItem: function getItem(id) { 2878 return _this4.packages.get(id); 2879 } 2880 } 2881 }; 2882 } 2883 2884 return this['#_streams']; 2885 } 2886 }], [{ 2887 key: "getById", 2888 value: function getById(id) { 2889 return this.repo.get(id); 2890 } 2891 }, { 2892 key: "getInstanceById", 2893 value: function getInstanceById(id) { 2894 return this.repo.get(id); 2895 } 2896 }, { 2897 key: "getInstanceName", 2898 value: function getInstanceName() { 2899 return 'BX.Uploader'; 2900 } 2901 }]); 2902 return Uploader; 2903 }(); 2904 2905 babelHelpers.defineProperty(Uploader, "repo", new Map()); 2906 babelHelpers.defineProperty(Uploader, "justCounter", 0); 2907 babelHelpers.defineProperty(Uploader, "getInstance", function (params) { 2908 BX.onCustomEvent(window, "onUploaderIsAlmostInited", ['BX.Uploader', params]); 2909 return new this(params); 2910 }); 2911 2912 var Manager = /*#__PURE__*/function () { 2913 function Manager() { 2914 babelHelpers.classCallCheck(this, Manager); 2915 } 2916 2917 babelHelpers.createClass(Manager, null, [{ 2918 key: "getById", 2919 value: function getById(id) { 2920 return Uploader.getById(id); 2921 } 2922 }]); 2923 return Manager; 2924 }(); 2925 2926 exports.UploaderManager = Manager; 2927 exports.Uploader = Uploader; 2928 2929}((this.BX = this.BX || {}),BX,BX.Event)); 2930//# sourceMappingURL=uploader.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.