From 2082b51c5b33a13f83aa3b8e3ba8bbe11ae33243 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A2u=20Cao?= Date: Sat, 31 Dec 2022 15:05:36 +0700 Subject: [PATCH] Add expenses from file Allow to upload a JSON file containing a list of expense items --- app/components/add-reimbursement/component.js | 18 +++++++++++++++++- app/components/add-reimbursement/template.hbs | 6 ++++++ app/utils/read-file-content.js | 8 ++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 app/utils/read-file-content.js diff --git a/app/components/add-reimbursement/component.js b/app/components/add-reimbursement/component.js index fd00dea..2bc100b 100644 --- a/app/components/add-reimbursement/component.js +++ b/app/components/add-reimbursement/component.js @@ -6,6 +6,7 @@ import { action } from '@ember/object'; import { A } from '@ember/array'; import { scheduleOnce } from '@ember/runloop'; import isValidAmount from 'kredits-web/utils/is-valid-amount'; +import readFileContent from 'kredits-web/utils/read-file-content'; import config from 'kredits-web/config/environment'; export default class AddReimbursementComponent extends Component { @@ -85,7 +86,22 @@ export default class AddReimbursementComponent extends Component { } @action - updateContributor(event) { + async addExpensesFromFile (evt) { + const content = await readFileContent(evt.target.files[0]); + const expenses = JSON.parse(content); + + if (expenses instanceof Array) { + for (const item of expenses) { + this.addExpenseItem(item); + } + } else { + console.warn("Expenses in file must be a list of items:"); + console.debug(content); + } + } + + @action + updateContributor (event) { this.recipientId = event.target.value; } diff --git a/app/components/add-reimbursement/template.hbs b/app/components/add-reimbursement/template.hbs index 6c1c06a..43235b3 100644 --- a/app/components/add-reimbursement/template.hbs +++ b/app/components/add-reimbursement/template.hbs @@ -87,3 +87,9 @@ {{/if}} +
+

Add expense items from file

+ +
diff --git a/app/utils/read-file-content.js b/app/utils/read-file-content.js new file mode 100644 index 0000000..0413399 --- /dev/null +++ b/app/utils/read-file-content.js @@ -0,0 +1,8 @@ +export default function (file) { + const reader = new FileReader(); + return new Promise((resolve, reject) => { + reader.onload = event => resolve(event.target.result) + reader.onerror = error => reject(error) + reader.readAsText(file) + }) +}