104 lines
2.5 KiB
JavaScript
104 lines
2.5 KiB
JavaScript
export default Ember.Component.extend({
|
|
fileInput: null,
|
|
loading: false,
|
|
expectedRootObjectName: null,
|
|
hover: 0,
|
|
|
|
classNames: ["json-uploader"],
|
|
|
|
_initialize: function() {
|
|
const $this = this.$();
|
|
const self = this;
|
|
|
|
const $fileInput = $this.find("#js-file-input");
|
|
this.set("fileInput", $fileInput[0]);
|
|
|
|
$fileInput.on("change", function() {
|
|
self.fileSelected(this.files);
|
|
});
|
|
|
|
$this.on("dragover", function(e) {
|
|
if (e.preventDefault) e.preventDefault();
|
|
return false;
|
|
});
|
|
$this.on("dragenter", function(e) {
|
|
if (e.preventDefault) e.preventDefault();
|
|
self.set("hover", self.get("hover") + 1);
|
|
return false;
|
|
});
|
|
$this.on("dragleave", function(e) {
|
|
if (e.preventDefault) e.preventDefault();
|
|
self.set("hover", self.get("hover") - 1);
|
|
return false;
|
|
});
|
|
$this.on("drop", function(e) {
|
|
if (e.preventDefault) e.preventDefault();
|
|
|
|
self.set("hover", 0);
|
|
self.fileSelected(e.dataTransfer.files);
|
|
return false;
|
|
});
|
|
}.on("didInsertElement"),
|
|
|
|
accept: function() {
|
|
return (
|
|
".json,application/json,application/x-javascript,text/json" +
|
|
(this.get("extension") ? "," + this.get("extension") : "")
|
|
);
|
|
}.property("extension"),
|
|
|
|
setReady: function() {
|
|
let parsed;
|
|
try {
|
|
parsed = JSON.parse(this.get("value"));
|
|
} catch (e) {
|
|
this.set("ready", false);
|
|
return;
|
|
}
|
|
|
|
const rootObject = parsed[this.get("expectedRootObjectName")];
|
|
|
|
if (rootObject !== null && rootObject !== undefined) {
|
|
this.set("ready", true);
|
|
} else {
|
|
this.set("ready", false);
|
|
}
|
|
}.observes("destination", "expectedRootObjectName"),
|
|
|
|
actions: {
|
|
selectFile: function() {
|
|
const $fileInput = $(this.get("fileInput"));
|
|
$fileInput.click();
|
|
}
|
|
},
|
|
|
|
fileSelected(fileList) {
|
|
const self = this;
|
|
let files = [];
|
|
for (let i = 0; i < fileList.length; i++) {
|
|
files[i] = fileList[i];
|
|
}
|
|
const fileNameRegex = /\.(json|txt)$/;
|
|
files = files.filter(function(file) {
|
|
if (fileNameRegex.test(file.name)) {
|
|
return true;
|
|
}
|
|
if (file.type === "text/plain") {
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
const firstFile = fileList[0];
|
|
|
|
this.set("loading", true);
|
|
|
|
let reader = new FileReader();
|
|
reader.onload = function(evt) {
|
|
self.set("value", evt.target.result);
|
|
self.set("loading", false);
|
|
};
|
|
|
|
reader.readAsText(firstFile);
|
|
}
|
|
});
|