mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-23 02:41:50 +03:00
82 lines
1.9 KiB
JavaScript
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;
|
||
|
}
|
||
|
}
|