tessa 2.0 → 6.0.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -18
  3. data/app/assets/javascripts/tessa.esm.js +212 -173
  4. data/app/assets/javascripts/tessa.js +206 -167
  5. data/app/javascript/activestorage/file_checksum.ts +76 -0
  6. data/app/javascript/tessa/index.ts +264 -0
  7. data/app/javascript/tessa/types.ts +34 -0
  8. data/config/routes.rb +0 -1
  9. data/lib/tessa/simple_form/asset_input.rb +24 -25
  10. data/lib/tessa/version.rb +1 -1
  11. data/lib/tessa.rb +0 -80
  12. data/package.json +7 -2
  13. data/rollup.config.js +5 -5
  14. data/spec/dummy/app/models/single_asset_model.rb +1 -1
  15. data/spec/dummy/app/models/single_asset_model_form.rb +3 -5
  16. data/spec/dummy/bin/rails +2 -2
  17. data/spec/dummy/bin/rake +2 -2
  18. data/spec/dummy/bin/setup +14 -6
  19. data/spec/dummy/bin/yarn +9 -3
  20. data/spec/dummy/config/application.rb +11 -9
  21. data/spec/dummy/config/boot.rb +1 -1
  22. data/spec/dummy/config/environment.rb +1 -1
  23. data/spec/dummy/config/environments/development.rb +34 -5
  24. data/spec/dummy/config/environments/production.rb +49 -10
  25. data/spec/dummy/config/environments/test.rb +28 -12
  26. data/spec/dummy/config/initializers/backtrace_silencers.rb +4 -3
  27. data/spec/dummy/config/initializers/content_security_policy.rb +5 -0
  28. data/spec/dummy/config/initializers/filter_parameter_logging.rb +3 -1
  29. data/spec/dummy/config/initializers/new_framework_defaults_6_1.rb +67 -0
  30. data/spec/dummy/config/initializers/permissions_policy.rb +11 -0
  31. data/spec/dummy/config/initializers/wrap_parameters.rb +5 -0
  32. data/spec/dummy/config/locales/en.yml +1 -1
  33. data/spec/dummy/config/routes.rb +1 -1
  34. data/spec/dummy/config/storage.yml +31 -0
  35. data/spec/dummy/config.ru +2 -1
  36. data/spec/dummy/db/migrate/20230406194400_add_service_name_to_active_storage_blobs.active_storage.rb +22 -0
  37. data/spec/dummy/db/migrate/20230406194401_create_active_storage_variant_records.active_storage.rb +27 -0
  38. data/spec/dummy/db/schema.rb +15 -7
  39. data/tessa.gemspec +4 -5
  40. data/tsconfig.json +10 -0
  41. data/yarn.lock +74 -7
  42. metadata +36 -74
  43. data/app/javascript/activestorage/file_checksum.js +0 -53
  44. data/app/javascript/tessa/index.js.coffee +0 -183
  45. data/lib/tasks/tessa.rake +0 -18
  46. data/lib/tessa/active_storage/asset_wrapper.rb +0 -32
  47. data/lib/tessa/asset/failure.rb +0 -37
  48. data/lib/tessa/asset.rb +0 -47
  49. data/lib/tessa/asset_change.rb +0 -49
  50. data/lib/tessa/asset_change_set.rb +0 -49
  51. data/lib/tessa/config.rb +0 -16
  52. data/lib/tessa/controller_helpers.rb +0 -16
  53. data/lib/tessa/fake_connection.rb +0 -29
  54. data/lib/tessa/jobs/migrate_assets_job.rb +0 -222
  55. data/lib/tessa/model/dynamic_extensions.rb +0 -145
  56. data/lib/tessa/model/field.rb +0 -77
  57. data/lib/tessa/model.rb +0 -94
  58. data/lib/tessa/rack_upload_proxy.rb +0 -41
  59. data/lib/tessa/response_factory.rb +0 -15
  60. data/lib/tessa/upload/uploads_file.rb +0 -18
  61. data/lib/tessa/upload.rb +0 -31
  62. data/lib/tessa/view_helpers.rb +0 -23
  63. data/spec/dummy/app/models/multiple_asset_model.rb +0 -8
  64. data/spec/support/remote_call_macro.rb +0 -40
  65. data/spec/tessa/asset/failure_spec.rb +0 -48
  66. data/spec/tessa/asset_change_set_spec.rb +0 -198
  67. data/spec/tessa/asset_change_spec.rb +0 -86
  68. data/spec/tessa/asset_spec.rb +0 -196
  69. data/spec/tessa/config_spec.rb +0 -70
  70. data/spec/tessa/controller_helpers_spec.rb +0 -55
  71. data/spec/tessa/jobs/migrate_assets_job_spec.rb +0 -247
  72. data/spec/tessa/model_field_spec.rb +0 -72
  73. data/spec/tessa/model_spec.rb +0 -325
  74. data/spec/tessa/rack_upload_proxy_spec.rb +0 -83
  75. data/spec/tessa/upload/uploads_file_spec.rb +0 -72
  76. data/spec/tessa/upload_spec.rb +0 -125
  77. data/spec/tessa_spec.rb +0 -23
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d98c3c1a4dd8795f5631bee2260de0c0794f4eded2c71c6cf4bfaee23dc518e
4
- data.tar.gz: 42c2a4748df92707676e06ecbb965e5245444bf343e468a5db60ea55a6b89337
3
+ metadata.gz: 20d746d445cccc01d998f1d8bead8b92b8e0083e1858cd40ed2151785c1f4830
4
+ data.tar.gz: aa0432076ee14f238af2bf5cffdc83a0f37055246a1524ae2a05cb48e5bb3ed4
5
5
  SHA512:
6
- metadata.gz: bd8d14042de56677d144e26ff425551d5e7a68e95d331406e1556fbb34ec43f305203e139150fa05647091caaabe38c4d2df5cf29889d783665a8806a15e9ef8
7
- data.tar.gz: d25ed80bf643b5ff4a126d67094b0ba66caf4f643f90efdfd4acec0dbbbf555bf1f60609bc51bc6bdb633cf5fb86feac3cde3d1cfb26adc4e75856cf76c55103
6
+ metadata.gz: 386f143532a9e1a17b7149488d6d50d2affa444a3fc029653c5dca2218eef980df1963982cc64020b7aca85c7fbd7063e19a23fa0355cdebc4a0881230715585
7
+ data.tar.gz: f504a6ae2e98ee85478bb5d89ddb950533c80aa5a881f7accb336dfd36049eea8b1336c5a9f602ff6b51a4085826d76104475e3af9fdb8e17fdb0b7160a177f6
data/README.md CHANGED
@@ -23,6 +23,12 @@ When that migration is completed, v2.x of this gem will remove all code that acc
23
23
  will transition to being simply a convenience wrapper around ActiveStorage, so that we don't have to re-write as much
24
24
  of our code in our frontend apps.
25
25
 
26
+ v6.x of this gem is compatible with ActiveStorage v6 and above. Since v6, ActiveStorage now does everything that this
27
+ gem used to do, with the exception of Dropzone integration. Therefore, tessa-client v6 only contains the following
28
+ two modules:
29
+ 1. A set of Javascript utilities to integrate Dropzone.js with ActiveStorage direct uploads
30
+ 2. A SimpleForm helper to write out the hidden input fields for an ActiveStorage `has_one_attached`.
31
+
26
32
  ## Installation
27
33
 
28
34
  Add this line to your application's Gemfile:
@@ -61,17 +67,7 @@ from the user's browser.
61
67
 
62
68
  To get all this working, follow these steps:
63
69
 
64
- 1. Mount the engine
65
- in your `config/routes.rb`, `mount Tessa::Engine, at: '/'`. It's important that it is mounted at root.
66
-
67
- You can use Authentication around the engine to prevent unauthorized uploads. With devise it's as simple as:
68
- ```rb
69
- authenticated :user do
70
- mount Tessa::Engine, at: '/'
71
- end
72
- ```
73
-
74
- 2. In your application.js, require the js libraries:
70
+ 1. In your application.js, require the js libraries:
75
71
  ```js
76
72
  //= require dropzone
77
73
  //= require tessa
@@ -79,17 +75,14 @@ You can use Authentication around the engine to prevent unauthorized uploads. W
79
75
  Note that this only works if you are using Sprockets.
80
76
  If you are using another bundler, we don't support that yet.
81
77
 
82
- 3. In your model, use the Tessa `asset` declaration instead of `has_one_attached`. The SimpleForm helper only works
83
- with Tessa `asset` declarations so far.
78
+ 2. use ActiveStorage to add an attached asset
84
79
 
85
80
  ```rb
86
81
  class Model < ApplicationRecord
87
- include Tessa::Model
88
-
89
- asset :image # Note: this essentially delegates to has_one_attached
82
+ has_one_attached :image
90
83
  ```
91
84
 
92
- 4. When rendering your form, use the SimpleForm helper to render the dropzone div:
85
+ 3. When rendering your form, use the SimpleForm helper to render the dropzone div:
93
86
 
94
87
  ```erb
95
88
  <%= f.input :image,
@@ -98,7 +91,7 @@ class Model < ApplicationRecord
98
91
  hint: "Use an image that is 1440 x 288 in size (5:1 aspect ratio)" %>
99
92
  ```
100
93
 
101
- 5. Configure your ActiveStorage service to accept direct uploads.
94
+ 4. Configure your ActiveStorage service to accept direct uploads.
102
95
  The disk service does this automatically. The S3 service requires additional CORS configuration.
103
96
 
104
97
  ## Contributing
@@ -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,269 @@ var sparkMd5 = {
410
441
  }));
411
442
  })(sparkMd5);
412
443
 
413
- var SparkMD5 = sparkMd5.exports;
444
+ var fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
414
445
 
415
- const fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
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 SparkMD5.ArrayBuffer;
460
+ this.md5Buffer = new sparkMd5.exports.ArrayBuffer;
431
461
  this.fileReader = new FileReader;
432
- this.fileReader.addEventListener("load", (event => this.fileReaderDidLoad(event)));
433
- this.fileReader.addEventListener("error", (event => this.fileReaderDidError(event)));
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
- const binaryDigest = this.md5Buffer.end(true);
440
- const base64digest = btoa(binaryDigest);
441
- this.callback(null, base64digest);
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
- const start = this.chunkIndex * this.chunkSize;
450
- const end = Math.min(start + this.chunkSize, this.file.size);
451
- const bytes = fileSlice.call(this.file, start, end);
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
- window.WCC.Dropzone = class Dropzone extends window.Dropzone {
470
- uploadFile(file) {
471
- var handleError, headerName, headerValue, headers, progressObj, ref, response, updateProgress, xhr;
472
- xhr = new XMLHttpRequest;
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 = () => this._errorProcessing([ file ], response || this.options.dictResponseError.replace("{{statusCode}}", xhr.status), xhr);
477
- updateProgress = e => {
478
- var allFilesFinished, progress;
479
- if (e != null) {
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
- if (!(file.upload.progress === 100 && file.upload.bytesSent === file.upload.total)) {
490
- allFilesFinished = false;
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
- return this.emit("uploadprogress", file, progress, file.upload.bytesSent);
556
+ _this.emit("uploadprogress", file, progress, file.upload.bytesSent);
499
557
  };
500
- xhr.onload = e => {
501
- var ref;
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 !== 4) {
562
+ if (xhr.readyState != 4) {
506
563
  return;
507
564
  }
508
565
  response = xhr.responseText;
509
- if (xhr.getResponseHeader("content-type") && ~xhr.getResponseHeader("content-type").indexOf("application/json")) {
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 (error1) {
513
- e = error1;
569
+ } catch (e) {
514
570
  response = "Invalid JSON response from server.";
515
571
  }
516
572
  }
517
573
  updateProgress();
518
- if (!(200 <= (ref = xhr.status) && ref < 300)) {
519
- return handleError();
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 === WCC.Dropzone.CANCELED) {
578
+ xhr.onerror = function() {
579
+ if (file.status == WCCDropzone.CANCELED) {
526
580
  return;
527
581
  }
528
- return handleError();
582
+ handleError();
529
583
  };
530
- progressObj = (ref = xhr.upload) != null ? ref : xhr;
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
- $.extend(headers, this.options.headers);
592
+ Object.assign(headers, this.options.headers);
539
593
  }
540
594
  if (file.uploadHeaders) {
541
- $.extend(headers, file.uploadHeaders);
595
+ Object.assign(headers, file.uploadHeaders);
542
596
  }
543
- for (headerName in headers) {
544
- headerValue = headers[headerName];
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
- return xhr.send(file);
549
- }
550
- uploadFiles(files) {
551
- var file, l, len, results;
552
- results = [];
553
- for (l = 0, len = files.length; l < len; l++) {
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
- return results;
558
- }
559
- };
560
-
561
- 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?";
562
-
563
- WCC.Dropzone.prototype.defaultOptions.url = "UNUSED";
609
+ };
610
+ return WCCDropzone;
611
+ }(BaseDropzone);
564
612
 
565
- WCC.Dropzone.prototype.defaultOptions.dictDefaultMessage = "Drop files or click to upload.";
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?";
566
614
 
567
- WCC.Dropzone.prototype.defaultOptions.accept = function(file, done) {
568
- var dz, postData, tessaParams;
569
- dz = $(file._removeLink).closest(".tessa-upload").first();
570
- tessaParams = dz.data("tessa-params") || {};
571
- postData = {
572
- name: file.name,
573
- size: file.size,
574
- mime_type: file.type
575
- };
576
- postData = $.extend(postData, tessaParams);
577
- return FileChecksum.create(file, (function(error, checksum) {
578
- if (error) {
579
- return done(error);
615
+ function tessaInit() {
616
+ $(".tessa-upload").each((function(i, item) {
617
+ var $item = $(item);
618
+ var directUploadURL = $item.data("direct-upload-url") || "/rails/active_storage/direct_uploads";
619
+ var options = __assign({
620
+ maxFiles: 1,
621
+ addRemoveLinks: true,
622
+ url: "UNUSED",
623
+ dictDefaultMessage: "Drop files or click to upload.",
624
+ accept: createAcceptFn({
625
+ directUploadURL: directUploadURL
626
+ })
627
+ }, $item.data("dropzone-options"));
628
+ if ($item.hasClass("multiple")) {
629
+ options.maxFiles = undefined;
580
630
  }
581
- postData["checksum"] = checksum;
582
- return $.ajax("/tessa/uploads", {
583
- type: "POST",
584
- data: postData,
585
- success: function(response) {
586
- file.uploadURL = response.upload_url;
587
- file.uploadMethod = response.upload_method;
588
- file.uploadHeaders = response.upload_headers;
589
- file.assetID = response.asset_id;
590
- return done();
591
- },
592
- error: function(response) {
593
- return done("Failed to initiate the upload process!");
594
- }
595
- });
631
+ var dropzone = new WCCDropzone(item, options);
632
+ $item.find('input[type="hidden"]').each((function(i, input) {
633
+ var _a, _b;
634
+ var $input = $(input);
635
+ var mockFile = $input.data("meta");
636
+ if (!mockFile) {
637
+ return;
638
+ }
639
+ mockFile.accepted = true;
640
+ (_a = dropzone.options.addedfile) === null || _a === void 0 ? void 0 : _a.call(dropzone, mockFile);
641
+ (_b = dropzone.options.thumbnail) === null || _b === void 0 ? void 0 : _b.call(dropzone, mockFile, mockFile.url);
642
+ dropzone.emit("complete", mockFile);
643
+ dropzone.files.push(mockFile);
644
+ }));
645
+ var inputName = $item.data("input-name") || $item.find('input[type="hidden"]').attr("name");
646
+ dropzone.on("success", (function(file) {
647
+ $('input[name="'.concat(inputName, '"]')).val(file.signedID);
648
+ }));
649
+ dropzone.on("removedfile", (function(file) {
650
+ $item.find('input[name="'.concat(inputName, '"]')).val("");
651
+ }));
596
652
  }));
597
- };
598
-
599
- window.WCC.tessaInit = function(sel) {
600
- sel = sel || "form:has(.tessa-upload)";
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;
653
+ $("form:has(.tessa-upload)").each((function(i, form) {
654
+ var $form = $(form);
655
+ $form.on("submit", (function(event) {
656
+ var safeToSubmit = true;
607
657
  $form.find(".tessa-upload").each((function(j, dropzoneElement) {
608
- return $(dropzoneElement.dropzone.files).each((function(k, file) {
609
- if (file.status != null && file.status !== WCC.Dropzone.SUCCESS) {
610
- return safeToSubmit = false;
658
+ dropzoneElement.dropzone.files.forEach((function(file) {
659
+ if (file.status && file.status != WCCDropzone.SUCCESS) {
660
+ safeToSubmit = false;
611
661
  }
612
662
  }));
613
663
  }));
614
- if (!safeToSubmit && !confirm(WCC.Dropzone.uploadPendingWarning)) {
664
+ if (!safeToSubmit && !confirm(uploadPendingWarning)) {
615
665
  return false;
616
666
  }
617
667
  }));
618
668
  }));
619
- return $(".tessa-upload", sel).each((function(i, item) {
620
- var $item, args, dropzone, inputPrefix, updateAction;
621
- $item = $(item);
622
- args = {
623
- maxFiles: 1,
624
- addRemoveLinks: true
669
+ }
670
+
671
+ function createAcceptFn(_a) {
672
+ var directUploadURL = _a.directUploadURL;
673
+ return function(file, done) {
674
+ var postData = {
675
+ blob: {
676
+ filename: file.name,
677
+ byte_size: file.size,
678
+ content_type: file.type,
679
+ checksum: ""
680
+ }
625
681
  };
626
- $.extend(args, $item.data("dropzone-options"));
627
- if ($item.hasClass("multiple")) {
628
- args.maxFiles = null;
629
- }
630
- inputPrefix = $item.data("asset-field-prefix");
631
- dropzone = new WCC.Dropzone(item, args);
632
- $item.find('input[type="hidden"]').each((function(j, input) {
633
- var $input, mockFile;
634
- $input = $(input);
635
- mockFile = $input.data("meta");
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;
682
+ FileChecksum.create(file, (function(error, checksum) {
683
+ if (error) {
684
+ return done(error);
646
685
  }
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);
686
+ if (!checksum) {
687
+ return done("Failed to generate checksum for file '".concat(file.name, "'"));
654
688
  }
655
- return actionInput.val(file.action);
656
- };
657
- dropzone.on("success", (function(file) {
658
- file.action = "add";
659
- return updateAction(file);
660
- }));
661
- return dropzone.on("removedfile", (function(file) {
662
- file.action = "remove";
663
- return updateAction(file);
689
+ postData.blob["checksum"] = checksum;
690
+ $.ajax(directUploadURL, {
691
+ type: "POST",
692
+ data: postData,
693
+ success: function(response) {
694
+ file.uploadURL = response.direct_upload.url;
695
+ file.uploadMethod = "PUT";
696
+ file.uploadHeaders = response.direct_upload.headers;
697
+ file.signedID = response.signed_id;
698
+ done();
699
+ },
700
+ error: function(response) {
701
+ console.error(response);
702
+ done("Failed to initiate the upload process!");
703
+ }
704
+ });
664
705
  }));
665
- }));
666
- };
706
+ };
707
+ }
667
708
 
668
- $((function() {
669
- return window.WCC.tessaInit();
670
- }));
709
+ $(tessaInit);