diff options
| author | Henry Jameson <me@hjkos.com> | 2021-04-07 20:45:57 +0300 |
|---|---|---|
| committer | Henry Jameson <me@hjkos.com> | 2021-04-07 20:45:57 +0300 |
| commit | 4e56e64034ce1e153ab2bbe3432ada89bdce09cd (patch) | |
| tree | 791cbd7cf3cc9452bbf9b3dbc67fb35ae550dd50 /src/services/export_import | |
| parent | 2da37f15ab6a7e0c6088a6e5a0b2c2885f1cb85a (diff) | |
| parent | 8b96ea93776fd1eb462a7c54822d4f8ad6a9e776 (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.js | 55 |
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) + } +}) |
