diff --git a/src/app/files/file-explorer.js b/src/app/files/file-explorer.js old mode 100644 new mode 100755 index 99f1ead8eb..5c6bb27d07 --- a/src/app/files/file-explorer.js +++ b/src/app/files/file-explorer.js @@ -1,4 +1,3 @@ -/* global FileReader */ var yo = require('yo-yo') var csjs = require('csjs-inject') var Treeview = require('remix-debugger').ui.TreeView @@ -56,9 +55,14 @@ module.exports = fileExplorer function fileExplorer (appAPI, files) { var self = this this.events = new EventManager() + // file provider backend this.files = files + // element currently focused on this.focusElement = null + // path currently focused on this.focusPath = null + + // warn if file changed outside of Remix function remixdDialog () { return yo`
This file has been changed outside of Remix IDE.
` } @@ -80,8 +84,51 @@ function fileExplorer (appAPI, files) { } }) - var fileEvents = files.event + // register to event of the file provider + files.event.register('fileRemoved', fileRemoved) + files.event.register('fileRenamed', fileRenamed) + files.event.register('fileRenamedError', fileRenamedError) + files.event.register('fileAdded', fileAdded) + + function fileRenamedError (error) { + modalDialogCustom.alert(error) + } + + function fileAdded (filepath) { + self.ensureRoot(() => { + var folderpath = filepath.split('/').slice(0, -1).join('/') + var currentTree = self.treeView.nodeAt(folderpath) + if (currentTree && self.treeView.isExpanded(folderpath)) { + self.files.resolveDirectory(folderpath, (error, fileTree) => { + if (error) console.error(error) + if (!fileTree) return + fileTree = normalize(folderpath, fileTree) + self.treeView.updateNodeFromJSON(folderpath, fileTree, true) + self.focusElement = self.treeView.labelAt(self.focusPath) + // TODO: here we update the selected file (it applicable) + // cause we are refreshing the interface of the whole directory when there's a new file. + if (self.focusElement && !self.focusElement.classList.contains(css.hasFocus)) { + self.focusElement.classList.add(css.hasFocus) + } + }) + } + }) + } + + function fileRemoved (filepath) { + var label = this.treeView.labelAt(filepath) + if (label && label.parentElement) { + label.parentElement.removeChild(label) + } + } + + function fileRenamed (oldName, newName, isFolder) { + fileRemoved(oldName) + fileAdded(newName) + } + + // make interface and register to nodeClick, leafClick self.treeView = new Treeview({ extractData: function extractData (value, tree, key) { var newValue = {} @@ -150,6 +197,7 @@ function fileExplorer (appAPI, files) { return newList } + // register to main app, trigger when the current file in the editor changed appAPI.event.register('currentFileChanged', (newFile, explorer) => { if (self.focusElement && explorer.type !== files.type && self.focusPath !== newFile) { self.focusElement.classList.remove(css.hasFocus) @@ -157,23 +205,14 @@ function fileExplorer (appAPI, files) { self.focusPath = null } }) - fileEvents.register('fileRemoved', fileRemoved) - fileEvents.register('fileRenamed', fileRenamed) - fileEvents.register('fileRenamedError', fileRenamedError) - fileEvents.register('fileAdded', fileAdded) var textUnderEdit = null var textInRename = false - function getElement (path) { - var label = self.element.querySelector(`label[data-path="${path}"]`) - if (label) return getLiFrom(label) - } - function editModeOn (event) { if (self.files.readonly) return var label = this - var li = getLiFrom(label) + var li = label.parentElement.parentElement.parentElement var classes = li.className if (~classes.indexOf('hasFocus') && !label.getAttribute('contenteditable') && label.getAttribute('data-path') !== self.files.type) { textUnderEdit = label.innerText @@ -204,66 +243,19 @@ function fileExplorer (appAPI, files) { } } - function cancelRename () { - label.innerText = textUnderEdit - } - if (event.which === 13) event.preventDefault() if (!textInRename && (event.type === 'blur' || event.which === 27 || event.which === 13) && label.getAttribute('contenteditable')) { textInRename = true var isFolder = label.className.indexOf('folder') !== -1 var save = textUnderEdit !== label.innerText if (save) { - modalDialogCustom.confirm(null, 'Do you want to rename?', () => { rename() }, () => { cancelRename() }) + modalDialogCustom.confirm(null, 'Do you want to rename?', () => { rename() }, () => { label.innerText = textUnderEdit }) } label.removeAttribute('contenteditable') label.classList.remove(css.rename) textInRename = false } } - - function fileRemoved (filepath) { - var li = getElement(filepath) - if (li) li.parentElement.removeChild(li) - } - - function fileRenamed (oldName, newName, isFolder) { - var li = getElement(oldName) - if (li) { - li.parentElement.removeChild(li) - fileAdded(newName) - } - } - - function fileRenamedError (error) { - modalDialogCustom.alert(error) - } - - function fileAdded (filepath) { - self.ensureRoot(() => { - var folderpath = filepath.split('/').slice(0, -1).join('/') - - var currentTree = self.treeView.nodeAt(folderpath) - if (currentTree && self.treeView.isExpanded(folderpath)) { - self.files.resolveDirectory(folderpath, (error, fileTree) => { - if (error) console.error(error) - if (!fileTree) return - fileTree = normalize(folderpath, fileTree) - self.treeView.updateNodeFromJSON(folderpath, fileTree, true) - self.focusElement = self.treeView.labelAt(self.focusPath) - // TODO: here we update the selected file (it applicable) - // cause we are refreshing the interface of the whole directory when there's a new file. - if (self.focusElement && !self.focusElement.classList.contains(css.hasFocus)) { - self.focusElement.classList.add(css.hasFocus) - } - }) - } - }) - } -} - -function getLiFrom (label) { - return label.parentElement.parentElement.parentElement } fileExplorer.prototype.init = function () {