tessa 6.0.1 → 6.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/tessa.esm.js +221 -171
- data/app/assets/javascripts/tessa.js +214 -167
- data/app/javascript/tessa/index.ts +17 -1
- data/lib/tessa/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 195c947f914e8b899ea4fa8b6cea489d7a8f8292e573f4090fde8759f820fb9a
|
4
|
+
data.tar.gz: 8dbaaceb8252224077755508be5e01b08bbeb93c46f5a37d141596826b54f5d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79912868222e71679ed0422041df9165070625ca1d5723ec5de78f47995f348ca61ce007fb70f470e45f0ae2a78330b560edc4f93e2ed650d08bcd8927db0b4c
|
7
|
+
data.tar.gz: b33ab283bf19599fb16ca5751beb078c34712f7195b35a0bc3b4b9e1855279fc331046f82c25cdd0717b6151a0870cb5d6d7ea15b6540032f3e63a4fc419e79c
|
@@ -1,3 +1,34 @@
|
|
1
|
+
var extendStatics = function(d, b) {
|
2
|
+
extendStatics = Object.setPrototypeOf || {
|
3
|
+
__proto__: []
|
4
|
+
} instanceof Array && function(d, b) {
|
5
|
+
d.__proto__ = b;
|
6
|
+
} || function(d, b) {
|
7
|
+
for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
|
8
|
+
};
|
9
|
+
return extendStatics(d, b);
|
10
|
+
};
|
11
|
+
|
12
|
+
function __extends(d, b) {
|
13
|
+
if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
14
|
+
extendStatics(d, b);
|
15
|
+
function __() {
|
16
|
+
this.constructor = d;
|
17
|
+
}
|
18
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __);
|
19
|
+
}
|
20
|
+
|
21
|
+
var __assign = function() {
|
22
|
+
__assign = Object.assign || function __assign(t) {
|
23
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
24
|
+
s = arguments[i];
|
25
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
26
|
+
}
|
27
|
+
return t;
|
28
|
+
};
|
29
|
+
return __assign.apply(this, arguments);
|
30
|
+
};
|
31
|
+
|
1
32
|
var sparkMd5 = {
|
2
33
|
exports: {}
|
3
34
|
};
|
@@ -410,261 +441,280 @@ var sparkMd5 = {
|
|
410
441
|
}));
|
411
442
|
})(sparkMd5);
|
412
443
|
|
413
|
-
var
|
444
|
+
var fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
|
414
445
|
|
415
|
-
|
416
|
-
|
417
|
-
class FileChecksum {
|
418
|
-
static create(file, callback) {
|
419
|
-
const instance = new FileChecksum(file);
|
420
|
-
instance.create(callback);
|
421
|
-
}
|
422
|
-
constructor(file) {
|
446
|
+
var FileChecksum = function() {
|
447
|
+
function FileChecksum(file) {
|
423
448
|
this.file = file;
|
424
449
|
this.chunkSize = 2097152;
|
425
450
|
this.chunkCount = Math.ceil(this.file.size / this.chunkSize);
|
426
451
|
this.chunkIndex = 0;
|
427
452
|
}
|
428
|
-
create(callback) {
|
453
|
+
FileChecksum.create = function(file, callback) {
|
454
|
+
var instance = new FileChecksum(file);
|
455
|
+
instance.create(callback);
|
456
|
+
};
|
457
|
+
FileChecksum.prototype.create = function(callback) {
|
458
|
+
var _this = this;
|
429
459
|
this.callback = callback;
|
430
|
-
this.md5Buffer = new
|
460
|
+
this.md5Buffer = new sparkMd5.exports.ArrayBuffer;
|
431
461
|
this.fileReader = new FileReader;
|
432
|
-
this.fileReader.addEventListener("load", (
|
433
|
-
|
462
|
+
this.fileReader.addEventListener("load", (function(event) {
|
463
|
+
return _this.fileReaderDidLoad(event);
|
464
|
+
}));
|
465
|
+
this.fileReader.addEventListener("error", (function(event) {
|
466
|
+
return _this.fileReaderDidError(event);
|
467
|
+
}));
|
434
468
|
this.readNextChunk();
|
435
|
-
}
|
436
|
-
fileReaderDidLoad(event) {
|
469
|
+
};
|
470
|
+
FileChecksum.prototype.fileReaderDidLoad = function(event) {
|
471
|
+
var _a;
|
472
|
+
if (!this.md5Buffer || !this.fileReader) {
|
473
|
+
throw new Error("FileChecksum: fileReaderDidLoad called before create");
|
474
|
+
}
|
475
|
+
if (!((_a = event.target) === null || _a === void 0 ? void 0 : _a.result)) {
|
476
|
+
return;
|
477
|
+
}
|
437
478
|
this.md5Buffer.append(event.target.result);
|
438
479
|
if (!this.readNextChunk()) {
|
439
|
-
|
440
|
-
|
441
|
-
this.callback
|
480
|
+
var binaryDigest = this.md5Buffer.end(true);
|
481
|
+
var base64digest = btoa(binaryDigest);
|
482
|
+
if (this.callback) {
|
483
|
+
this.callback(null, base64digest);
|
484
|
+
}
|
485
|
+
}
|
486
|
+
};
|
487
|
+
FileChecksum.prototype.fileReaderDidError = function(event) {
|
488
|
+
if (this.callback) {
|
489
|
+
this.callback("Error reading ".concat(this.file.name));
|
490
|
+
}
|
491
|
+
};
|
492
|
+
FileChecksum.prototype.readNextChunk = function() {
|
493
|
+
if (!this.fileReader) {
|
494
|
+
throw new Error("FileChecksum: readNextChunk called before create");
|
442
495
|
}
|
443
|
-
}
|
444
|
-
fileReaderDidError(event) {
|
445
|
-
this.callback(`Error reading ${this.file.name}`);
|
446
|
-
}
|
447
|
-
readNextChunk() {
|
448
496
|
if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) {
|
449
|
-
|
450
|
-
|
451
|
-
|
497
|
+
var start = this.chunkIndex * this.chunkSize;
|
498
|
+
var end = Math.min(start + this.chunkSize, this.file.size);
|
499
|
+
var bytes = fileSlice.call(this.file, start, end);
|
452
500
|
this.fileReader.readAsArrayBuffer(bytes);
|
453
501
|
this.chunkIndex++;
|
454
502
|
return true;
|
455
503
|
} else {
|
456
504
|
return false;
|
457
505
|
}
|
458
|
-
}
|
459
|
-
|
460
|
-
|
461
|
-
var $;
|
506
|
+
};
|
507
|
+
return FileChecksum;
|
508
|
+
}();
|
462
509
|
|
463
510
|
window.WCC || (window.WCC = {});
|
464
511
|
|
465
|
-
$ = window.jQuery;
|
512
|
+
var $ = window.jQuery;
|
466
513
|
|
467
|
-
Dropzone.autoDiscover = false;
|
514
|
+
window.Dropzone.autoDiscover = false;
|
468
515
|
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
516
|
+
var BaseDropzone = window.Dropzone;
|
517
|
+
|
518
|
+
var WCCDropzone = function(_super) {
|
519
|
+
__extends(WCCDropzone, _super);
|
520
|
+
function WCCDropzone() {
|
521
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
522
|
+
}
|
523
|
+
WCCDropzone.prototype.uploadFile = function(file) {
|
524
|
+
var _this = this;
|
525
|
+
var _a;
|
526
|
+
var xhr = new XMLHttpRequest;
|
473
527
|
file.xhr = xhr;
|
474
528
|
xhr.open(file.uploadMethod, file.uploadURL, true);
|
475
|
-
response = null;
|
476
|
-
handleError = ()
|
477
|
-
|
478
|
-
|
479
|
-
|
529
|
+
var response = null;
|
530
|
+
var handleError = function() {
|
531
|
+
var _a;
|
532
|
+
_this._errorProcessing([ file ], response || ((_a = _this.options.dictResponseError) === null || _a === void 0 ? void 0 : _a.replace("{{statusCode}}", xhr.status.toString())), xhr);
|
533
|
+
};
|
534
|
+
var updateProgress = function(e) {
|
535
|
+
var _a;
|
536
|
+
var progress;
|
537
|
+
if (e) {
|
480
538
|
progress = 100 * e.loaded / e.total;
|
481
|
-
file.upload = {
|
539
|
+
file.upload = __assign(__assign({}, file.upload), {
|
482
540
|
progress: progress,
|
483
541
|
total: e.total,
|
484
542
|
bytesSent: e.loaded
|
485
|
-
};
|
543
|
+
});
|
486
544
|
} else {
|
487
|
-
allFilesFinished = true;
|
488
545
|
progress = 100;
|
489
|
-
|
490
|
-
|
546
|
+
var allFilesFinished = false;
|
547
|
+
if (file.upload.progress == 100 && file.upload.bytesSent == file.upload.total) {
|
548
|
+
allFilesFinished = true;
|
491
549
|
}
|
492
550
|
file.upload.progress = progress;
|
493
|
-
file.upload.bytesSent = file.upload.total;
|
551
|
+
file.upload.bytesSent = (_a = file.upload) === null || _a === void 0 ? void 0 : _a.total;
|
494
552
|
if (allFilesFinished) {
|
495
553
|
return;
|
496
554
|
}
|
497
555
|
}
|
498
|
-
|
556
|
+
_this.emit("uploadprogress", file, progress, file.upload.bytesSent);
|
499
557
|
};
|
500
|
-
xhr.onload = e
|
501
|
-
|
502
|
-
if (file.status === WCC.Dropzone.CANCELED) {
|
558
|
+
xhr.onload = function(e) {
|
559
|
+
if (file.status == WCCDropzone.CANCELED) {
|
503
560
|
return;
|
504
561
|
}
|
505
|
-
if (xhr.readyState
|
562
|
+
if (xhr.readyState != 4) {
|
506
563
|
return;
|
507
564
|
}
|
508
565
|
response = xhr.responseText;
|
509
|
-
if (xhr.getResponseHeader("content-type") &&
|
566
|
+
if (xhr.getResponseHeader("content-type") && xhr.getResponseHeader("content-type").indexOf("application/json") >= 0) {
|
510
567
|
try {
|
511
568
|
response = JSON.parse(response);
|
512
|
-
} catch (
|
513
|
-
e = error1;
|
569
|
+
} catch (e) {
|
514
570
|
response = "Invalid JSON response from server.";
|
515
571
|
}
|
516
572
|
}
|
517
573
|
updateProgress();
|
518
|
-
if (
|
519
|
-
|
520
|
-
} else {
|
521
|
-
return this._finished([ file ], response, e);
|
574
|
+
if (xhr.status < 200 || xhr.status >= 300) handleError(); else {
|
575
|
+
_this._finished([ file ], response, e);
|
522
576
|
}
|
523
577
|
};
|
524
|
-
xhr.onerror = ()
|
525
|
-
if (file.status
|
578
|
+
xhr.onerror = function() {
|
579
|
+
if (file.status == WCCDropzone.CANCELED) {
|
526
580
|
return;
|
527
581
|
}
|
528
|
-
|
582
|
+
handleError();
|
529
583
|
};
|
530
|
-
progressObj = (
|
584
|
+
var progressObj = (_a = xhr.upload) !== null && _a !== void 0 ? _a : xhr;
|
531
585
|
progressObj.onprogress = updateProgress;
|
532
|
-
headers = {
|
586
|
+
var headers = {
|
533
587
|
Accept: "application/json",
|
534
588
|
"Cache-Control": "no-cache",
|
535
589
|
"X-Requested-With": "XMLHttpRequest"
|
536
590
|
};
|
537
591
|
if (this.options.headers) {
|
538
|
-
|
592
|
+
Object.assign(headers, this.options.headers);
|
539
593
|
}
|
540
594
|
if (file.uploadHeaders) {
|
541
|
-
|
595
|
+
Object.assign(headers, file.uploadHeaders);
|
542
596
|
}
|
543
|
-
for (
|
544
|
-
|
597
|
+
for (var _i = 0, _b = Object.entries(headers); _i < _b.length; _i++) {
|
598
|
+
var _c = _b[_i], headerName = _c[0], headerValue = _c[1];
|
545
599
|
xhr.setRequestHeader(headerName, headerValue);
|
546
600
|
}
|
547
601
|
this.emit("sending", file, xhr);
|
548
|
-
|
549
|
-
}
|
550
|
-
uploadFiles(files) {
|
551
|
-
var
|
552
|
-
|
553
|
-
|
554
|
-
file = files[l];
|
555
|
-
results.push(this.uploadFile(file));
|
602
|
+
xhr.send(file);
|
603
|
+
};
|
604
|
+
WCCDropzone.prototype.uploadFiles = function(files) {
|
605
|
+
for (var _i = 0, files_1 = files; _i < files_1.length; _i++) {
|
606
|
+
var file = files_1[_i];
|
607
|
+
this.uploadFile(file);
|
556
608
|
}
|
557
|
-
|
558
|
-
|
559
|
-
};
|
609
|
+
};
|
610
|
+
return WCCDropzone;
|
611
|
+
}(BaseDropzone);
|
560
612
|
|
561
|
-
|
613
|
+
var uploadPendingWarning = "File uploads have not yet completed. If you submit the form now they will not be saved. Are you sure you want to continue?";
|
562
614
|
|
563
|
-
|
615
|
+
var kb = 1e3;
|
564
616
|
|
565
|
-
|
617
|
+
var mb = 1e3 * kb;
|
566
618
|
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
619
|
+
var gb = 1e3 * mb;
|
620
|
+
|
621
|
+
function tessaInit() {
|
622
|
+
$(".tessa-upload").each((function(i, item) {
|
623
|
+
var $item = $(item);
|
624
|
+
var directUploadURL = $item.data("direct-upload-url") || "/rails/active_storage/direct_uploads";
|
625
|
+
var options = __assign({
|
626
|
+
maxFiles: 1,
|
627
|
+
maxFilesize: 5 * gb,
|
628
|
+
addRemoveLinks: true,
|
629
|
+
url: "UNUSED",
|
630
|
+
dictDefaultMessage: "Drop files or click to upload.",
|
631
|
+
accept: createAcceptFn({
|
632
|
+
directUploadURL: directUploadURL
|
633
|
+
})
|
634
|
+
}, $item.data("dropzone-options"));
|
635
|
+
if ($item.hasClass("multiple")) {
|
636
|
+
options.maxFiles = undefined;
|
580
637
|
}
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
638
|
+
var dropzone = new WCCDropzone(item, options);
|
639
|
+
$item.find('input[type="hidden"]').each((function(i, input) {
|
640
|
+
var _a, _b;
|
641
|
+
var $input = $(input);
|
642
|
+
var mockFile = $input.data("meta");
|
643
|
+
if (!mockFile) {
|
644
|
+
return;
|
645
|
+
}
|
646
|
+
mockFile.accepted = true;
|
647
|
+
(_a = dropzone.options.addedfile) === null || _a === void 0 ? void 0 : _a.call(dropzone, mockFile);
|
648
|
+
(_b = dropzone.options.thumbnail) === null || _b === void 0 ? void 0 : _b.call(dropzone, mockFile, mockFile.url);
|
649
|
+
dropzone.emit("complete", mockFile);
|
650
|
+
dropzone.files.push(mockFile);
|
651
|
+
}));
|
652
|
+
var inputName = $item.data("input-name") || $item.find('input[type="hidden"]').attr("name");
|
653
|
+
dropzone.on("success", (function(file) {
|
654
|
+
$('input[name="'.concat(inputName, '"]')).val(file.signedID);
|
655
|
+
}));
|
656
|
+
dropzone.on("removedfile", (function(file) {
|
657
|
+
$item.find('input[name="'.concat(inputName, '"]')).val("");
|
658
|
+
}));
|
596
659
|
}));
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
$(sel).each((function(i, form) {
|
602
|
-
var $form;
|
603
|
-
$form = $(form);
|
604
|
-
return $form.bind("submit", (function(event) {
|
605
|
-
var safeToSubmit;
|
606
|
-
safeToSubmit = true;
|
660
|
+
$("form:has(.tessa-upload)").each((function(i, form) {
|
661
|
+
var $form = $(form);
|
662
|
+
$form.on("submit", (function(event) {
|
663
|
+
var safeToSubmit = true;
|
607
664
|
$form.find(".tessa-upload").each((function(j, dropzoneElement) {
|
608
|
-
|
609
|
-
if (file.status
|
610
|
-
|
665
|
+
dropzoneElement.dropzone.files.forEach((function(file) {
|
666
|
+
if (file.status && file.status != WCCDropzone.SUCCESS) {
|
667
|
+
safeToSubmit = false;
|
611
668
|
}
|
612
669
|
}));
|
613
670
|
}));
|
614
|
-
if (!safeToSubmit && !confirm(
|
671
|
+
if (!safeToSubmit && !confirm(uploadPendingWarning)) {
|
615
672
|
return false;
|
616
673
|
}
|
617
674
|
}));
|
618
675
|
}));
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
if ($item.hasClass("multiple")) {
|
628
|
-
args.maxFiles = null;
|
676
|
+
}
|
677
|
+
|
678
|
+
function createAcceptFn(_a) {
|
679
|
+
var directUploadURL = _a.directUploadURL;
|
680
|
+
return function(file, done) {
|
681
|
+
console.log("check file size", file.size, this.options.maxFilesize);
|
682
|
+
if (this.options.maxFilesize && file.size > this.options.maxFilesize) {
|
683
|
+
return done("Uploads are limited to ".concat(Math.floor(this.options.maxFilesize / gb), " Gigabytes.") + " Your file is ".concat((file.size / gb).toFixed(2), " GB.") + " Please contact helpdesk for assistance.");
|
629
684
|
}
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
mockFile.accepted = true;
|
637
|
-
dropzone.options.addedfile.call(dropzone, mockFile);
|
638
|
-
dropzone.options.thumbnail.call(dropzone, mockFile, mockFile.url);
|
639
|
-
dropzone.emit("complete", mockFile);
|
640
|
-
return dropzone.files.push(mockFile);
|
641
|
-
}));
|
642
|
-
updateAction = function(file) {
|
643
|
-
var actionInput, inputID;
|
644
|
-
if (file.assetID == null) {
|
645
|
-
return;
|
646
|
-
}
|
647
|
-
inputID = `#tessa_asset_action_${file.assetID}`;
|
648
|
-
actionInput = $(inputID);
|
649
|
-
if (!actionInput.length) {
|
650
|
-
actionInput = $('<input type="hidden">').attr({
|
651
|
-
id: inputID,
|
652
|
-
name: `${inputPrefix}[${file.assetID}][action]`
|
653
|
-
}).appendTo(item);
|
685
|
+
var postData = {
|
686
|
+
blob: {
|
687
|
+
filename: file.name,
|
688
|
+
byte_size: file.size,
|
689
|
+
content_type: file.type,
|
690
|
+
checksum: ""
|
654
691
|
}
|
655
|
-
return actionInput.val(file.action);
|
656
692
|
};
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
693
|
+
FileChecksum.create(file, (function(error, checksum) {
|
694
|
+
if (error) {
|
695
|
+
return done(error);
|
696
|
+
}
|
697
|
+
if (!checksum) {
|
698
|
+
return done("Failed to generate checksum for file '".concat(file.name, "'"));
|
699
|
+
}
|
700
|
+
postData.blob["checksum"] = checksum;
|
701
|
+
$.ajax(directUploadURL, {
|
702
|
+
type: "POST",
|
703
|
+
data: postData,
|
704
|
+
success: function(response) {
|
705
|
+
file.uploadURL = response.direct_upload.url;
|
706
|
+
file.uploadMethod = "PUT";
|
707
|
+
file.uploadHeaders = response.direct_upload.headers;
|
708
|
+
file.signedID = response.signed_id;
|
709
|
+
done();
|
710
|
+
},
|
711
|
+
error: function(response) {
|
712
|
+
console.error(response);
|
713
|
+
done("Failed to initiate the upload process!");
|
714
|
+
}
|
715
|
+
});
|
664
716
|
}));
|
665
|
-
}
|
666
|
-
}
|
717
|
+
};
|
718
|
+
}
|
667
719
|
|
668
|
-
$(
|
669
|
-
return window.WCC.tessaInit();
|
670
|
-
}));
|
720
|
+
$(tessaInit);
|
@@ -2,6 +2,34 @@
|
|
2
2
|
typeof define === "function" && define.amd ? define(factory) : factory();
|
3
3
|
})((function() {
|
4
4
|
"use strict";
|
5
|
+
var extendStatics = function(d, b) {
|
6
|
+
extendStatics = Object.setPrototypeOf || {
|
7
|
+
__proto__: []
|
8
|
+
} instanceof Array && function(d, b) {
|
9
|
+
d.__proto__ = b;
|
10
|
+
} || function(d, b) {
|
11
|
+
for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
|
12
|
+
};
|
13
|
+
return extendStatics(d, b);
|
14
|
+
};
|
15
|
+
function __extends(d, b) {
|
16
|
+
if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
17
|
+
extendStatics(d, b);
|
18
|
+
function __() {
|
19
|
+
this.constructor = d;
|
20
|
+
}
|
21
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __);
|
22
|
+
}
|
23
|
+
var __assign = function() {
|
24
|
+
__assign = Object.assign || function __assign(t) {
|
25
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
26
|
+
s = arguments[i];
|
27
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
28
|
+
}
|
29
|
+
return t;
|
30
|
+
};
|
31
|
+
return __assign.apply(this, arguments);
|
32
|
+
};
|
5
33
|
var sparkMd5 = {
|
6
34
|
exports: {}
|
7
35
|
};
|
@@ -412,249 +440,268 @@
|
|
412
440
|
return SparkMD5;
|
413
441
|
}));
|
414
442
|
})(sparkMd5);
|
415
|
-
var
|
416
|
-
|
417
|
-
|
418
|
-
static create(file, callback) {
|
419
|
-
const instance = new FileChecksum(file);
|
420
|
-
instance.create(callback);
|
421
|
-
}
|
422
|
-
constructor(file) {
|
443
|
+
var fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
|
444
|
+
var FileChecksum = function() {
|
445
|
+
function FileChecksum(file) {
|
423
446
|
this.file = file;
|
424
447
|
this.chunkSize = 2097152;
|
425
448
|
this.chunkCount = Math.ceil(this.file.size / this.chunkSize);
|
426
449
|
this.chunkIndex = 0;
|
427
450
|
}
|
428
|
-
create(callback) {
|
451
|
+
FileChecksum.create = function(file, callback) {
|
452
|
+
var instance = new FileChecksum(file);
|
453
|
+
instance.create(callback);
|
454
|
+
};
|
455
|
+
FileChecksum.prototype.create = function(callback) {
|
456
|
+
var _this = this;
|
429
457
|
this.callback = callback;
|
430
|
-
this.md5Buffer = new
|
458
|
+
this.md5Buffer = new sparkMd5.exports.ArrayBuffer;
|
431
459
|
this.fileReader = new FileReader;
|
432
|
-
this.fileReader.addEventListener("load", (
|
433
|
-
|
460
|
+
this.fileReader.addEventListener("load", (function(event) {
|
461
|
+
return _this.fileReaderDidLoad(event);
|
462
|
+
}));
|
463
|
+
this.fileReader.addEventListener("error", (function(event) {
|
464
|
+
return _this.fileReaderDidError(event);
|
465
|
+
}));
|
434
466
|
this.readNextChunk();
|
435
|
-
}
|
436
|
-
fileReaderDidLoad(event) {
|
467
|
+
};
|
468
|
+
FileChecksum.prototype.fileReaderDidLoad = function(event) {
|
469
|
+
var _a;
|
470
|
+
if (!this.md5Buffer || !this.fileReader) {
|
471
|
+
throw new Error("FileChecksum: fileReaderDidLoad called before create");
|
472
|
+
}
|
473
|
+
if (!((_a = event.target) === null || _a === void 0 ? void 0 : _a.result)) {
|
474
|
+
return;
|
475
|
+
}
|
437
476
|
this.md5Buffer.append(event.target.result);
|
438
477
|
if (!this.readNextChunk()) {
|
439
|
-
|
440
|
-
|
441
|
-
this.callback
|
478
|
+
var binaryDigest = this.md5Buffer.end(true);
|
479
|
+
var base64digest = btoa(binaryDigest);
|
480
|
+
if (this.callback) {
|
481
|
+
this.callback(null, base64digest);
|
482
|
+
}
|
483
|
+
}
|
484
|
+
};
|
485
|
+
FileChecksum.prototype.fileReaderDidError = function(event) {
|
486
|
+
if (this.callback) {
|
487
|
+
this.callback("Error reading ".concat(this.file.name));
|
488
|
+
}
|
489
|
+
};
|
490
|
+
FileChecksum.prototype.readNextChunk = function() {
|
491
|
+
if (!this.fileReader) {
|
492
|
+
throw new Error("FileChecksum: readNextChunk called before create");
|
442
493
|
}
|
443
|
-
}
|
444
|
-
fileReaderDidError(event) {
|
445
|
-
this.callback(`Error reading ${this.file.name}`);
|
446
|
-
}
|
447
|
-
readNextChunk() {
|
448
494
|
if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) {
|
449
|
-
|
450
|
-
|
451
|
-
|
495
|
+
var start = this.chunkIndex * this.chunkSize;
|
496
|
+
var end = Math.min(start + this.chunkSize, this.file.size);
|
497
|
+
var bytes = fileSlice.call(this.file, start, end);
|
452
498
|
this.fileReader.readAsArrayBuffer(bytes);
|
453
499
|
this.chunkIndex++;
|
454
500
|
return true;
|
455
501
|
} else {
|
456
502
|
return false;
|
457
503
|
}
|
458
|
-
}
|
459
|
-
|
460
|
-
|
504
|
+
};
|
505
|
+
return FileChecksum;
|
506
|
+
}();
|
461
507
|
window.WCC || (window.WCC = {});
|
462
|
-
$ = window.jQuery;
|
463
|
-
Dropzone.autoDiscover = false;
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
508
|
+
var $ = window.jQuery;
|
509
|
+
window.Dropzone.autoDiscover = false;
|
510
|
+
var BaseDropzone = window.Dropzone;
|
511
|
+
var WCCDropzone = function(_super) {
|
512
|
+
__extends(WCCDropzone, _super);
|
513
|
+
function WCCDropzone() {
|
514
|
+
return _super !== null && _super.apply(this, arguments) || this;
|
515
|
+
}
|
516
|
+
WCCDropzone.prototype.uploadFile = function(file) {
|
517
|
+
var _this = this;
|
518
|
+
var _a;
|
519
|
+
var xhr = new XMLHttpRequest;
|
468
520
|
file.xhr = xhr;
|
469
521
|
xhr.open(file.uploadMethod, file.uploadURL, true);
|
470
|
-
response = null;
|
471
|
-
handleError = ()
|
472
|
-
|
473
|
-
|
474
|
-
|
522
|
+
var response = null;
|
523
|
+
var handleError = function() {
|
524
|
+
var _a;
|
525
|
+
_this._errorProcessing([ file ], response || ((_a = _this.options.dictResponseError) === null || _a === void 0 ? void 0 : _a.replace("{{statusCode}}", xhr.status.toString())), xhr);
|
526
|
+
};
|
527
|
+
var updateProgress = function(e) {
|
528
|
+
var _a;
|
529
|
+
var progress;
|
530
|
+
if (e) {
|
475
531
|
progress = 100 * e.loaded / e.total;
|
476
|
-
file.upload = {
|
532
|
+
file.upload = __assign(__assign({}, file.upload), {
|
477
533
|
progress: progress,
|
478
534
|
total: e.total,
|
479
535
|
bytesSent: e.loaded
|
480
|
-
};
|
536
|
+
});
|
481
537
|
} else {
|
482
|
-
allFilesFinished = true;
|
483
538
|
progress = 100;
|
484
|
-
|
485
|
-
|
539
|
+
var allFilesFinished = false;
|
540
|
+
if (file.upload.progress == 100 && file.upload.bytesSent == file.upload.total) {
|
541
|
+
allFilesFinished = true;
|
486
542
|
}
|
487
543
|
file.upload.progress = progress;
|
488
|
-
file.upload.bytesSent = file.upload.total;
|
544
|
+
file.upload.bytesSent = (_a = file.upload) === null || _a === void 0 ? void 0 : _a.total;
|
489
545
|
if (allFilesFinished) {
|
490
546
|
return;
|
491
547
|
}
|
492
548
|
}
|
493
|
-
|
549
|
+
_this.emit("uploadprogress", file, progress, file.upload.bytesSent);
|
494
550
|
};
|
495
|
-
xhr.onload = e
|
496
|
-
|
497
|
-
if (file.status === WCC.Dropzone.CANCELED) {
|
551
|
+
xhr.onload = function(e) {
|
552
|
+
if (file.status == WCCDropzone.CANCELED) {
|
498
553
|
return;
|
499
554
|
}
|
500
|
-
if (xhr.readyState
|
555
|
+
if (xhr.readyState != 4) {
|
501
556
|
return;
|
502
557
|
}
|
503
558
|
response = xhr.responseText;
|
504
|
-
if (xhr.getResponseHeader("content-type") &&
|
559
|
+
if (xhr.getResponseHeader("content-type") && xhr.getResponseHeader("content-type").indexOf("application/json") >= 0) {
|
505
560
|
try {
|
506
561
|
response = JSON.parse(response);
|
507
|
-
} catch (
|
508
|
-
e = error1;
|
562
|
+
} catch (e) {
|
509
563
|
response = "Invalid JSON response from server.";
|
510
564
|
}
|
511
565
|
}
|
512
566
|
updateProgress();
|
513
|
-
if (
|
514
|
-
|
515
|
-
} else {
|
516
|
-
return this._finished([ file ], response, e);
|
567
|
+
if (xhr.status < 200 || xhr.status >= 300) handleError(); else {
|
568
|
+
_this._finished([ file ], response, e);
|
517
569
|
}
|
518
570
|
};
|
519
|
-
xhr.onerror = ()
|
520
|
-
if (file.status
|
571
|
+
xhr.onerror = function() {
|
572
|
+
if (file.status == WCCDropzone.CANCELED) {
|
521
573
|
return;
|
522
574
|
}
|
523
|
-
|
575
|
+
handleError();
|
524
576
|
};
|
525
|
-
progressObj = (
|
577
|
+
var progressObj = (_a = xhr.upload) !== null && _a !== void 0 ? _a : xhr;
|
526
578
|
progressObj.onprogress = updateProgress;
|
527
|
-
headers = {
|
579
|
+
var headers = {
|
528
580
|
Accept: "application/json",
|
529
581
|
"Cache-Control": "no-cache",
|
530
582
|
"X-Requested-With": "XMLHttpRequest"
|
531
583
|
};
|
532
584
|
if (this.options.headers) {
|
533
|
-
|
585
|
+
Object.assign(headers, this.options.headers);
|
534
586
|
}
|
535
587
|
if (file.uploadHeaders) {
|
536
|
-
|
588
|
+
Object.assign(headers, file.uploadHeaders);
|
537
589
|
}
|
538
|
-
for (
|
539
|
-
|
590
|
+
for (var _i = 0, _b = Object.entries(headers); _i < _b.length; _i++) {
|
591
|
+
var _c = _b[_i], headerName = _c[0], headerValue = _c[1];
|
540
592
|
xhr.setRequestHeader(headerName, headerValue);
|
541
593
|
}
|
542
594
|
this.emit("sending", file, xhr);
|
543
|
-
|
544
|
-
}
|
545
|
-
uploadFiles(files) {
|
546
|
-
var
|
547
|
-
|
548
|
-
|
549
|
-
file = files[l];
|
550
|
-
results.push(this.uploadFile(file));
|
595
|
+
xhr.send(file);
|
596
|
+
};
|
597
|
+
WCCDropzone.prototype.uploadFiles = function(files) {
|
598
|
+
for (var _i = 0, files_1 = files; _i < files_1.length; _i++) {
|
599
|
+
var file = files_1[_i];
|
600
|
+
this.uploadFile(file);
|
551
601
|
}
|
552
|
-
return results;
|
553
|
-
}
|
554
|
-
};
|
555
|
-
WCC.Dropzone.uploadPendingWarning = "File uploads have not yet completed. If you submit the form now they will not be saved. Are you sure you want to continue?";
|
556
|
-
WCC.Dropzone.prototype.defaultOptions.url = "UNUSED";
|
557
|
-
WCC.Dropzone.prototype.defaultOptions.dictDefaultMessage = "Drop files or click to upload.";
|
558
|
-
WCC.Dropzone.prototype.defaultOptions.accept = function(file, done) {
|
559
|
-
var dz, postData, tessaParams;
|
560
|
-
dz = $(file._removeLink).closest(".tessa-upload").first();
|
561
|
-
tessaParams = dz.data("tessa-params") || {};
|
562
|
-
postData = {
|
563
|
-
name: file.name,
|
564
|
-
size: file.size,
|
565
|
-
mime_type: file.type
|
566
602
|
};
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
603
|
+
return WCCDropzone;
|
604
|
+
}(BaseDropzone);
|
605
|
+
var uploadPendingWarning = "File uploads have not yet completed. If you submit the form now they will not be saved. Are you sure you want to continue?";
|
606
|
+
var kb = 1e3;
|
607
|
+
var mb = 1e3 * kb;
|
608
|
+
var gb = 1e3 * mb;
|
609
|
+
function tessaInit() {
|
610
|
+
$(".tessa-upload").each((function(i, item) {
|
611
|
+
var $item = $(item);
|
612
|
+
var directUploadURL = $item.data("direct-upload-url") || "/rails/active_storage/direct_uploads";
|
613
|
+
var options = __assign({
|
614
|
+
maxFiles: 1,
|
615
|
+
maxFilesize: 5 * gb,
|
616
|
+
addRemoveLinks: true,
|
617
|
+
url: "UNUSED",
|
618
|
+
dictDefaultMessage: "Drop files or click to upload.",
|
619
|
+
accept: createAcceptFn({
|
620
|
+
directUploadURL: directUploadURL
|
621
|
+
})
|
622
|
+
}, $item.data("dropzone-options"));
|
623
|
+
if ($item.hasClass("multiple")) {
|
624
|
+
options.maxFiles = undefined;
|
571
625
|
}
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
626
|
+
var dropzone = new WCCDropzone(item, options);
|
627
|
+
$item.find('input[type="hidden"]').each((function(i, input) {
|
628
|
+
var _a, _b;
|
629
|
+
var $input = $(input);
|
630
|
+
var mockFile = $input.data("meta");
|
631
|
+
if (!mockFile) {
|
632
|
+
return;
|
633
|
+
}
|
634
|
+
mockFile.accepted = true;
|
635
|
+
(_a = dropzone.options.addedfile) === null || _a === void 0 ? void 0 : _a.call(dropzone, mockFile);
|
636
|
+
(_b = dropzone.options.thumbnail) === null || _b === void 0 ? void 0 : _b.call(dropzone, mockFile, mockFile.url);
|
637
|
+
dropzone.emit("complete", mockFile);
|
638
|
+
dropzone.files.push(mockFile);
|
639
|
+
}));
|
640
|
+
var inputName = $item.data("input-name") || $item.find('input[type="hidden"]').attr("name");
|
641
|
+
dropzone.on("success", (function(file) {
|
642
|
+
$('input[name="'.concat(inputName, '"]')).val(file.signedID);
|
643
|
+
}));
|
644
|
+
dropzone.on("removedfile", (function(file) {
|
645
|
+
$item.find('input[name="'.concat(inputName, '"]')).val("");
|
646
|
+
}));
|
587
647
|
}));
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
var $form;
|
593
|
-
$form = $(form);
|
594
|
-
return $form.bind("submit", (function(event) {
|
595
|
-
var safeToSubmit;
|
596
|
-
safeToSubmit = true;
|
648
|
+
$("form:has(.tessa-upload)").each((function(i, form) {
|
649
|
+
var $form = $(form);
|
650
|
+
$form.on("submit", (function(event) {
|
651
|
+
var safeToSubmit = true;
|
597
652
|
$form.find(".tessa-upload").each((function(j, dropzoneElement) {
|
598
|
-
|
599
|
-
if (file.status
|
600
|
-
|
653
|
+
dropzoneElement.dropzone.files.forEach((function(file) {
|
654
|
+
if (file.status && file.status != WCCDropzone.SUCCESS) {
|
655
|
+
safeToSubmit = false;
|
601
656
|
}
|
602
657
|
}));
|
603
658
|
}));
|
604
|
-
if (!safeToSubmit && !confirm(
|
659
|
+
if (!safeToSubmit && !confirm(uploadPendingWarning)) {
|
605
660
|
return false;
|
606
661
|
}
|
607
662
|
}));
|
608
663
|
}));
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
$.extend(args, $item.data("dropzone-options"));
|
617
|
-
if ($item.hasClass("multiple")) {
|
618
|
-
args.maxFiles = null;
|
664
|
+
}
|
665
|
+
function createAcceptFn(_a) {
|
666
|
+
var directUploadURL = _a.directUploadURL;
|
667
|
+
return function(file, done) {
|
668
|
+
console.log("check file size", file.size, this.options.maxFilesize);
|
669
|
+
if (this.options.maxFilesize && file.size > this.options.maxFilesize) {
|
670
|
+
return done("Uploads are limited to ".concat(Math.floor(this.options.maxFilesize / gb), " Gigabytes.") + " Your file is ".concat((file.size / gb).toFixed(2), " GB.") + " Please contact helpdesk for assistance.");
|
619
671
|
}
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
mockFile.accepted = true;
|
627
|
-
dropzone.options.addedfile.call(dropzone, mockFile);
|
628
|
-
dropzone.options.thumbnail.call(dropzone, mockFile, mockFile.url);
|
629
|
-
dropzone.emit("complete", mockFile);
|
630
|
-
return dropzone.files.push(mockFile);
|
631
|
-
}));
|
632
|
-
updateAction = function(file) {
|
633
|
-
var actionInput, inputID;
|
634
|
-
if (file.assetID == null) {
|
635
|
-
return;
|
672
|
+
var postData = {
|
673
|
+
blob: {
|
674
|
+
filename: file.name,
|
675
|
+
byte_size: file.size,
|
676
|
+
content_type: file.type,
|
677
|
+
checksum: ""
|
636
678
|
}
|
637
|
-
inputID = `#tessa_asset_action_${file.assetID}`;
|
638
|
-
actionInput = $(inputID);
|
639
|
-
if (!actionInput.length) {
|
640
|
-
actionInput = $('<input type="hidden">').attr({
|
641
|
-
id: inputID,
|
642
|
-
name: `${inputPrefix}[${file.assetID}][action]`
|
643
|
-
}).appendTo(item);
|
644
|
-
}
|
645
|
-
return actionInput.val(file.action);
|
646
679
|
};
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
680
|
+
FileChecksum.create(file, (function(error, checksum) {
|
681
|
+
if (error) {
|
682
|
+
return done(error);
|
683
|
+
}
|
684
|
+
if (!checksum) {
|
685
|
+
return done("Failed to generate checksum for file '".concat(file.name, "'"));
|
686
|
+
}
|
687
|
+
postData.blob["checksum"] = checksum;
|
688
|
+
$.ajax(directUploadURL, {
|
689
|
+
type: "POST",
|
690
|
+
data: postData,
|
691
|
+
success: function(response) {
|
692
|
+
file.uploadURL = response.direct_upload.url;
|
693
|
+
file.uploadMethod = "PUT";
|
694
|
+
file.uploadHeaders = response.direct_upload.headers;
|
695
|
+
file.signedID = response.signed_id;
|
696
|
+
done();
|
697
|
+
},
|
698
|
+
error: function(response) {
|
699
|
+
console.error(response);
|
700
|
+
done("Failed to initiate the upload process!");
|
701
|
+
}
|
702
|
+
});
|
654
703
|
}));
|
655
|
-
}
|
656
|
-
}
|
657
|
-
$(
|
658
|
-
return window.WCC.tessaInit();
|
659
|
-
}));
|
704
|
+
};
|
705
|
+
}
|
706
|
+
$(tessaInit);
|
660
707
|
}));
|
@@ -133,6 +133,10 @@ class WCCDropzone extends BaseDropzone {
|
|
133
133
|
|
134
134
|
const uploadPendingWarning = "File uploads have not yet completed. If you submit the form now they will not be saved. Are you sure you want to continue?"
|
135
135
|
|
136
|
+
const kb = 1000
|
137
|
+
const mb = 1000 * kb
|
138
|
+
const gb = 1000 * mb
|
139
|
+
|
136
140
|
/**
|
137
141
|
* Called on page load to initialize the Dropzone
|
138
142
|
*/
|
@@ -144,6 +148,9 @@ function tessaInit() {
|
|
144
148
|
|
145
149
|
const options: WCCDropzoneOptions = {
|
146
150
|
maxFiles: 1,
|
151
|
+
// With a single PUT operation, you can upload a single object up to 5 GB in size.
|
152
|
+
// https://docs.aws.amazon.com/AmazonS3/latest/userguide/upload-objects.html
|
153
|
+
maxFilesize: 5 * gb,
|
147
154
|
addRemoveLinks: true,
|
148
155
|
url: 'UNUSED',
|
149
156
|
dictDefaultMessage: 'Drop files or click to upload.',
|
@@ -221,7 +228,16 @@ interface AcceptOptions {
|
|
221
228
|
* @param done Callback when file is accepted or rejected by the Tessa::RackUploadProxy
|
222
229
|
*/
|
223
230
|
function createAcceptFn({ directUploadURL }: AcceptOptions) {
|
224
|
-
return function(file: WCCDropzoneFile, done: (error?: string | Error) => void) {
|
231
|
+
return function(this: WCCDropzone, file: WCCDropzoneFile, done: (error?: string | Error) => void) {
|
232
|
+
console.log('check file size', file.size, this.options.maxFilesize)
|
233
|
+
if (this.options.maxFilesize && file.size > this.options.maxFilesize) {
|
234
|
+
return done(
|
235
|
+
`Uploads are limited to ${Math.floor(this.options.maxFilesize / gb)} Gigabytes.` +
|
236
|
+
` Your file is ${(file.size / gb).toFixed(2)} GB.` +
|
237
|
+
` Please contact helpdesk for assistance.`
|
238
|
+
)
|
239
|
+
}
|
240
|
+
|
225
241
|
const postData: ActiveStorageDirectUploadParams = {
|
226
242
|
blob: {
|
227
243
|
filename: file.name,
|
data/lib/tessa/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tessa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.0.
|
4
|
+
version: 6.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Powell
|
8
8
|
- Travis Petticrew
|
9
|
-
autorequire:
|
9
|
+
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2023-
|
12
|
+
date: 2023-12-06 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -218,7 +218,7 @@ homepage: https://github.com/watermarkchurch/tessa-client
|
|
218
218
|
licenses:
|
219
219
|
- MIT
|
220
220
|
metadata: {}
|
221
|
-
post_install_message:
|
221
|
+
post_install_message:
|
222
222
|
rdoc_options: []
|
223
223
|
require_paths:
|
224
224
|
- lib
|
@@ -234,7 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
234
234
|
version: '0'
|
235
235
|
requirements: []
|
236
236
|
rubygems_version: 3.0.3.1
|
237
|
-
signing_key:
|
237
|
+
signing_key:
|
238
238
|
specification_version: 4
|
239
239
|
summary: Manage your assets.
|
240
240
|
test_files:
|