Ghost/ghost/admin/app/components/modal-import-members/csv-file-select.js
Rishabh Garg f068e40723 Added new members CSV importer (#1797)
no refs
depends on https://github.com/TryGhost/Ghost/pull/12472

The members CSV importer gets an overhaul and works with new importer module in members service, performing the import in a background job when the import will take too long to complete in a reasonable time and send an email with data on completion. Also includes updated CSV mapping UI and error handling to allow easier import from different type of exports.

Co-authored-by: Fabien O'Carroll <fabien@allou.is>
Co-authored-by: Peter Zimon <zimo@ghost.org>
2020-12-10 01:02:31 +05:30

82 lines
1.9 KiB
JavaScript

import Component from '@glimmer/component';
import {UnsupportedMediaTypeError} from 'ghost-admin/services/ajax';
import {action} from '@ember/object';
import {tracked} from '@glimmer/tracking';
export default class CsvFileSelect extends Component {
labelText = 'Select or drop a CSV file'
@tracked
error = null
@tracked
dragClass = null
/*
constructor(...args) {
super(...args);
assert(this.args.setFile);
}
*/
@action
fileSelected(fileList) {
let [file] = Array.from(fileList);
try {
this._validateFileType(file);
this.error = null;
} catch (err) {
this.error = err;
return;
}
this.args.setFile(file);
}
@action
dragOver(event) {
if (!event.dataTransfer) {
return;
}
// this is needed to work around inconsistencies with dropping files
// from Chrome's downloads bar
if (navigator.userAgent.indexOf('Chrome') > -1) {
let eA = event.dataTransfer.effectAllowed;
event.dataTransfer.dropEffect = (eA === 'move' || eA === 'linkMove') ? 'move' : 'copy';
}
event.stopPropagation();
event.preventDefault();
this.dragClass = '-drag-over';
}
@action
dragLeave(event) {
event.preventDefault();
this.dragClass = null;
}
@action
drop(event) {
event.preventDefault();
this.dragClass = null;
if (event.dataTransfer.files) {
this.fileSelected(event.dataTransfer.files);
}
}
_validateFileType(file) {
let [, extension] = (/(?:\.([^.]+))?$/).exec(file.name);
if (extension.toLowerCase() !== 'csv') {
throw new UnsupportedMediaTypeError({
message: 'The file type you uploaded is not supported'
});
}
return true;
}
}