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); } });