aboutsummaryrefslogtreecommitdiff
path: root/src/services/export_import
diff options
context:
space:
mode:
authorHenry Jameson <me@hjkos.com>2021-04-07 20:45:57 +0300
committerHenry Jameson <me@hjkos.com>2021-04-07 20:45:57 +0300
commit4e56e64034ce1e153ab2bbe3432ada89bdce09cd (patch)
tree791cbd7cf3cc9452bbf9b3dbc67fb35ae550dd50 /src/services/export_import
parent2da37f15ab6a7e0c6088a6e5a0b2c2885f1cb85a (diff)
parent8b96ea93776fd1eb462a7c54822d4f8ad6a9e776 (diff)
Merge remote-tracking branch 'origin/develop' into better-selects
* origin/develop: (76 commits) Translated using Weblate (Italian) Translated using Weblate (Basque) Translated using Weblate (Spanish) Translated using Weblate (Chinese (Simplified)) Translated using Weblate (Italian) Translated using Weblate (Chinese (Traditional)) Translated using Weblate (Russian) Translated using Weblate (Italian) Translated using Weblate (French) Translated using Weblate (Russian) Translated using Weblate (Italian) Translated using Weblate (French) Translated using Weblate (Basque) Translated using Weblate (Spanish) Translated using Weblate (Chinese (Simplified)) Translated using Weblate (Japanese) Translated using Weblate (Italian) Translated using Weblate (Esperanto) Translated using Weblate (Chinese (Traditional)) Translated using Weblate (Norwegian Bokmål) ...
Diffstat (limited to 'src/services/export_import')
-rw-r--r--src/services/export_import/export_import.js55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/services/export_import/export_import.js b/src/services/export_import/export_import.js
new file mode 100644
index 00000000..ac67cf9c
--- /dev/null
+++ b/src/services/export_import/export_import.js
@@ -0,0 +1,55 @@
+export const newExporter = ({
+ filename = 'data',
+ getExportedObject
+}) => ({
+ exportData () {
+ const stringified = JSON.stringify(getExportedObject(), null, 2) // Pretty-print and indent with 2 spaces
+
+ // Create an invisible link with a data url and simulate a click
+ const e = document.createElement('a')
+ e.setAttribute('download', `${filename}.json`)
+ e.setAttribute('href', 'data:application/json;base64,' + window.btoa(stringified))
+ e.style.display = 'none'
+
+ document.body.appendChild(e)
+ e.click()
+ document.body.removeChild(e)
+ }
+})
+
+export const newImporter = ({
+ onImport,
+ onImportFailure,
+ validator = () => true
+}) => ({
+ importData () {
+ const filePicker = document.createElement('input')
+ filePicker.setAttribute('type', 'file')
+ filePicker.setAttribute('accept', '.json')
+
+ filePicker.addEventListener('change', event => {
+ if (event.target.files[0]) {
+ // eslint-disable-next-line no-undef
+ const reader = new FileReader()
+ reader.onload = ({ target }) => {
+ try {
+ const parsed = JSON.parse(target.result)
+ const validationResult = validator(parsed)
+ if (validationResult === true) {
+ onImport(parsed)
+ } else {
+ onImportFailure({ validationResult })
+ }
+ } catch (error) {
+ onImportFailure({ error })
+ }
+ }
+ reader.readAsText(event.target.files[0])
+ }
+ })
+
+ document.body.appendChild(filePicker)
+ filePicker.click()
+ document.body.removeChild(filePicker)
+ }
+})