diff --git a/public/v1/js/app.js b/public/v1/js/app.js index 7eee2b375f..5f89811fe7 100644 --- a/public/v1/js/app.js +++ b/public/v1/js/app.js @@ -49299,7 +49299,7 @@ exports = module.exports = __webpack_require__(0)(false); // module -exports.push([module.i, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]); +exports.push([module.i, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]); // exports @@ -49350,27 +49350,15 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); // // // -// -// /* harmony default export */ __webpack_exports__["default"] = ({ name: "CustomAttachments", - data: function data() { - return { - files: '' - }; - }, - props: { title: String, name: String, error: Array }, methods: { - handleFilesUpload: function handleFilesUpload() { - this.files = this.$refs.files.files; - }, - hasError: function hasError() { return this.error.length > 0; } @@ -49398,7 +49386,6 @@ var render = function() { { staticClass: "col-sm-12" }, [ _c("input", { - ref: "files", staticClass: "form-control", attrs: { multiple: "multiple", @@ -49407,11 +49394,6 @@ var render = function() { title: _vm.title, name: _vm.name, type: "file" - }, - on: { - change: function($event) { - _vm.handleFilesUpload() - } } }), _vm._v(" "), @@ -54906,7 +54888,7 @@ exports = module.exports = __webpack_require__(0)(false); // module -exports.push([module.i, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]); +exports.push([module.i, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", ""]); // exports @@ -55298,20 +55280,11 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); var button = $(e.currentTarget); button.prop("disabled", true); - axions.post(uri, data).then(function (response) { - // send user onwards. - if (_this.createAnother) { - console.log('Will create another.'); - // do message: - _this.success_message = 'The transaction has been stored.'; - _this.error_message = ''; - if (_this.resetFormAfter) { - _this.addTransaction(); - } - button.prop("disabled", false); - } else { - console.log('Will redirect to transaction.'); - window.location.href = 'transactions/show/' + response.data.data.id + '?message=created'; + axios.post(uri, data).then(function (response) { + + // this method will ultimately send the user on (or not). + if (0 === _this.collectAttachmentData(response)) { + _this.redirectUser(response.data.data.id, button); } }).catch(function (error) { // give user errors things back. @@ -55327,11 +55300,152 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); e.preventDefault(); } }, + redirectUser: function redirectUser(groupId, button) { + console.log('In redirectUser()'); + // if count is 0, send user onwards. + if (this.createAnother) { + console.log('Will create another.'); + // do message: + this.success_message = 'The transaction has been stored.'; + this.error_message = ''; + if (this.resetFormAfter) { + this.addTransaction(); + } + if (button) { + button.prop("disabled", false); + } + } else { + console.log('Will redirect to transaction.'); + window.location.href = 'transactions/show/' + groupId + '?message=created'; + } + }, + collectAttachmentData: function collectAttachmentData(response) { + var _this2 = this; + + console.log('Now incollectAttachmentData()'); + var groupId = response.data.data.id; + //console.log(response.data.data.attributes.transactions); + // + // array of all files to be uploaded: + var toBeUploaded = []; + + // array with all file data. + var fileData = []; + + // all attachments + var attachments = $('input[name="attachments[]"]'); + + // loop over all attachments, and add references to this array: + for (var _key2 in attachments) { + if (attachments.hasOwnProperty(_key2) && /^0$|^[1-9]\d*$/.test(_key2) && _key2 <= 4294967294) { + for (var fileKey in attachments[_key2].files) { + if (attachments[_key2].files.hasOwnProperty(fileKey) && /^0$|^[1-9]\d*$/.test(fileKey) && fileKey <= 4294967294) { + // include journal thing. + toBeUploaded.push({ + journal: response.data.data.attributes.transactions[_key2].transaction_journal_id, + file: attachments[_key2].files[fileKey] + }); + } + } + } + } + var count = toBeUploaded.length; + console.log('Found ' + toBeUploaded.length + ' attachments.'); + + // loop all uploads. + + var _loop = function _loop(_key3) { + if (toBeUploaded.hasOwnProperty(_key3) && /^0$|^[1-9]\d*$/.test(_key3) && _key3 <= 4294967294) { + // create file reader thing that will read all of these uploads + (function (f, i, theParent) { + var fileReader = new FileReader(); + fileReader.onloadend = function (evt) { + + if (evt.target.readyState === FileReader.DONE) { + // DONE == 2 + fileData.push({ + name: toBeUploaded[_key3].file.name, + journal: toBeUploaded[_key3].journal, + content: new Blob([evt.target.result]) + }); + if (fileData.length === count) { + theParent.uploadFiles(fileData, groupId); + } + } + + // // turn into binary strings. + // let chars = new Uint8Array(evt.target.result); + // let CHUNK_SIZE = 0x8000; + // let index = 0; + // let length = chars.length; + // let result = ''; + // let slice; + // while (index < length) { + // slice = chars.subarray(index, Math.min(index + CHUNK_SIZE, length)); + // result += String.fromCharCode.apply(null, slice); + // index += CHUNK_SIZE; + // } + // console.log('Now reading file #' + key); + }; + fileReader.readAsArrayBuffer(f.file); + })(toBeUploaded[_key3], _key3, _this2); + } + }; + + for (var _key3 in toBeUploaded) { + _loop(_key3); + } + return count; + }, + uploadFiles: function uploadFiles(fileData, groupId) { + var _this3 = this; + + var count = fileData.length; + var uploads = 0; + + var _loop2 = function _loop2(_key4) { + if (fileData.hasOwnProperty(_key4) && /^0$|^[1-9]\d*$/.test(_key4) && _key4 <= 4294967294) { + console.log('Creating attachment #' + _key4); + // axios thing, + then. + var uri = './api/v1/attachments'; + var data = { + filename: fileData[_key4].name, + model: 'TransactionJournal', + model_id: fileData[_key4].journal + }; + axios.post(uri, data).then(function (response) { + console.log('Created attachment #' + _key4); + console.log('Uploading attachment #' + _key4); + var uploadUri = './api/v1/attachments/' + response.data.data.id + '/upload'; + axios.post(uploadUri, fileData[_key4].content).then(function (response) { + console.log('Uploaded attachment #' + _key4); + uploads++; + if (uploads === count) { + // finally we can redirect the user onwards. + console.log('FINAL UPLOAD'); + _this3.redirectUser(groupId); + } + console.log('Upload complete!'); + return true; + }).catch(function (error) { + console.error('Could not upload'); + console.error(error); + return false; + }); + }); + } + }; + + for (var _key4 in fileData) { + _loop2(_key4); + } + }, + setDefaultErrors: function setDefaultErrors() { - for (var _key2 in this.transactions) { - if (this.transactions.hasOwnProperty(_key2) && /^0$|^[1-9]\d*$/.test(_key2) && _key2 <= 4294967294) { - this.transactions[_key2].errors = { + for (var _key5 in this.transactions) { + if (this.transactions.hasOwnProperty(_key5) && /^0$|^[1-9]\d*$/.test(_key5) && _key5 <= 4294967294) { + this.transactions[_key5].errors = { source_account: [], destination_account: [], description: [], @@ -55369,15 +55483,15 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); var transactionIndex = void 0; var fieldName = void 0; - for (var _key3 in errors.errors) { - if (errors.errors.hasOwnProperty(_key3)) { - if (_key3 === 'group_title') { - this.group_title_errors = errors.errors[_key3]; + for (var _key6 in errors.errors) { + if (errors.errors.hasOwnProperty(_key6)) { + if (_key6 === 'group_title') { + this.group_title_errors = errors.errors[_key6]; } - if (_key3 !== 'group_title') { + if (_key6 !== 'group_title') { // lol dumbest way to explode "transactions.0.something" ever. - transactionIndex = parseInt(_key3.split('.')[1]); - fieldName = _key3.split('.')[2]; + transactionIndex = parseInt(_key6.split('.')[1]); + fieldName = _key6.split('.')[2]; // set error in this object thing. switch (fieldName) { case 'amount': @@ -55385,19 +55499,19 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); case 'budget_id': case 'description': case 'tags': - this.transactions[transactionIndex].errors[fieldName] = errors.errors[_key3]; + this.transactions[transactionIndex].errors[fieldName] = errors.errors[_key6]; break; case 'source_name': case 'source_id': - this.transactions[transactionIndex].errors.source_account = this.transactions[transactionIndex].errors.source_account.concat(errors.errors[_key3]); + this.transactions[transactionIndex].errors.source_account = this.transactions[transactionIndex].errors.source_account.concat(errors.errors[_key6]); break; case 'destination_name': case 'destination_id': - this.transactions[transactionIndex].errors.destination_account = this.transactions[transactionIndex].errors.destination_account.concat(errors.errors[_key3]); + this.transactions[transactionIndex].errors.destination_account = this.transactions[transactionIndex].errors.destination_account.concat(errors.errors[_key6]); break; case 'foreign_amount': case 'foreign_currency_id': - this.transactions[transactionIndex].errors.foreign_amount = this.transactions[transactionIndex].errors.foreign_amount.concat(errors.errors[_key3]); + this.transactions[transactionIndex].errors.foreign_amount = this.transactions[transactionIndex].errors.foreign_amount.concat(errors.errors[_key6]); break; } } @@ -55488,16 +55602,40 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); setTransactionType: function setTransactionType(type) { this.transactionType = type; }, + + // convert to binary stuff + arrayBufferToBinary: function arrayBufferToBinary(buffer) { + return String.fromCharCode.apply(null, Array.prototype.slice.apply(new Uint8Array(buffer))); + }, + + binaryToString: function binaryToString(binary) { + var error = void 0; + + try { + return decodeURIComponent(escape(binary)); + } catch (_error) { + error = _error; + if (error instanceof URIError) { + return binary; + } else { + throw error; + } + } + }, + + // end of convert to binary stuff + + deleteTransaction: function deleteTransaction(index, event) { event.preventDefault(); - for (var _key4 in this.transactions) { - if (this.transactions.hasOwnProperty(_key4) && /^0$|^[1-9]\d*$/.test(_key4) && _key4 <= 4294967294) {} + for (var _key7 in this.transactions) { + if (this.transactions.hasOwnProperty(_key7) && /^0$|^[1-9]\d*$/.test(_key7) && _key7 <= 4294967294) {} } this.transactions.splice(index, 1); - for (var _key5 in this.transactions) { - if (this.transactions.hasOwnProperty(_key5) && /^0$|^[1-9]\d*$/.test(_key5) && _key5 <= 4294967294) {} + for (var _key8 in this.transactions) { + if (this.transactions.hasOwnProperty(_key8) && /^0$|^[1-9]\d*$/.test(_key8) && _key8 <= 4294967294) {} } }, limitSourceType: function limitSourceType(type) { @@ -55613,7 +55751,8 @@ Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); cash_account_id: 0, createAnother: false, resetFormAfter: false, - resetButtonDisabled: true + resetButtonDisabled: true, + attachmentCount: 0 }; } }); diff --git a/resources/assets/js/components/transactions/CreateTransaction.vue b/resources/assets/js/components/transactions/CreateTransaction.vue index 4aada56dc4..ed14ae407d 100644 --- a/resources/assets/js/components/transactions/CreateTransaction.vue +++ b/resources/assets/js/components/transactions/CreateTransaction.vue @@ -379,20 +379,11 @@ let button = $(e.currentTarget); button.prop("disabled", true); - axions.post(uri, data).then(response => { - // send user onwards. - if (this.createAnother) { - console.log('Will create another.'); - // do message: - this.success_message = 'The transaction has been stored.'; - this.error_message = ''; - if (this.resetFormAfter) { - this.addTransaction(); - } - button.prop("disabled", false); - } else { - console.log('Will redirect to transaction.'); - window.location.href = 'transactions/show/' + response.data.data.id + '?message=created'; + axios.post(uri, data).then(response => { + + // this method will ultimately send the user on (or not). + if (0 === this.collectAttachmentData(response)) { + this.redirectUser(response.data.data.id, button); } }).catch(error => { // give user errors things back. @@ -408,6 +399,144 @@ e.preventDefault(); } }, + redirectUser(groupId, button) { + console.log('In redirectUser()'); + // if count is 0, send user onwards. + if (this.createAnother) { + console.log('Will create another.'); + // do message: + this.success_message = 'The transaction has been stored.'; + this.error_message = ''; + if (this.resetFormAfter) { + this.addTransaction(); + } + if (button) { + button.prop("disabled", false); + } + } else { + console.log('Will redirect to transaction.'); + window.location.href = 'transactions/show/' + groupId + '?message=created'; + } + }, + + collectAttachmentData(response) { + console.log('Now incollectAttachmentData()'); + let groupId = response.data.data.id; + //console.log(response.data.data.attributes.transactions); + // + // array of all files to be uploaded: + let toBeUploaded = []; + + // array with all file data. + let fileData = []; + + // all attachments + let attachments = $('input[name="attachments[]"]'); + + // loop over all attachments, and add references to this array: + for (const key in attachments) { + if (attachments.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) { + for (const fileKey in attachments[key].files) { + if (attachments[key].files.hasOwnProperty(fileKey) && /^0$|^[1-9]\d*$/.test(fileKey) && fileKey <= 4294967294) { + // include journal thing. + toBeUploaded.push( + { + journal: response.data.data.attributes.transactions[key].transaction_journal_id, + file: attachments[key].files[fileKey] + } + ); + } + } + } + } + let count = toBeUploaded.length; + console.log('Found ' + toBeUploaded.length + ' attachments.'); + + // loop all uploads. + for (const key in toBeUploaded) { + if (toBeUploaded.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) { + // create file reader thing that will read all of these uploads + (function (f, i, theParent) { + var fileReader = new FileReader(); + fileReader.onloadend = function (evt) { + + + if (evt.target.readyState === FileReader.DONE) { // DONE == 2 + fileData.push( + { + name: toBeUploaded[key].file.name, + journal: toBeUploaded[key].journal, + content: new Blob([evt.target.result]) + } + ); + if (fileData.length === count) { + theParent.uploadFiles(fileData, groupId); + } + } + + // // turn into binary strings. + // let chars = new Uint8Array(evt.target.result); + // let CHUNK_SIZE = 0x8000; + // let index = 0; + // let length = chars.length; + // let result = ''; + // let slice; + // while (index < length) { + // slice = chars.subarray(index, Math.min(index + CHUNK_SIZE, length)); + // result += String.fromCharCode.apply(null, slice); + // index += CHUNK_SIZE; + // } + // console.log('Now reading file #' + key); + + } + fileReader.readAsArrayBuffer(f.file); + })(toBeUploaded[key], key, this); + } + } + return count; + }, + + uploadFiles(fileData, groupId) { + let count = fileData.length; + let uploads = 0; + for (const key in fileData) { + if (fileData.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) { + console.log('Creating attachment #' + key); + // axios thing, + then. + const uri = './api/v1/attachments'; + const data = { + filename: fileData[key].name, + model: 'TransactionJournal', + model_id: fileData[key].journal, + }; + axios.post(uri, data) + .then(response => { + console.log('Created attachment #' + key); + console.log('Uploading attachment #' + key); + const uploadUri = './api/v1/attachments/' + response.data.data.id + '/upload'; + axios.post(uploadUri, fileData[key].content) + .then(response => { + console.log('Uploaded attachment #' + key); + uploads++; + if (uploads === count) { + // finally we can redirect the user onwards. + console.log('FINAL UPLOAD'); + this.redirectUser(groupId); + } + console.log('Upload complete!'); + return true; + }).catch(error => { + console.error('Could not upload'); + console.error(error); + return false; + }); + }); + } + } + + }, + + setDefaultErrors: function () { for (const key in this.transactions) { if (this.transactions.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) { @@ -571,6 +700,29 @@ setTransactionType: function (type) { this.transactionType = type; }, + + // convert to binary stuff + arrayBufferToBinary(buffer) { + return String.fromCharCode.apply(null, Array.prototype.slice.apply(new Uint8Array(buffer))); + }, + binaryToString: function (binary) { + let error; + + try { + return decodeURIComponent(escape(binary)); + } catch (_error) { + error = _error; + if (error instanceof URIError) { + return binary; + } else { + throw error; + } + } + }, + + // end of convert to binary stuff + + deleteTransaction: function (index, event) { event.preventDefault(); for (const key in this.transactions) { @@ -701,6 +853,7 @@ createAnother: false, resetFormAfter: false, resetButtonDisabled: true, + attachmentCount: 0, }; }, }