const SelectListView = require('atom-select-list') const {repositoryForPath} = require('./helpers') module.exports = class DiffListView { constructor () { this.selectListView = new SelectListView({ emptyMessage: 'No diffs in file', items: [], filterKeyForItem: (diff) => diff.lineText, elementForItem: (diff) => { const li = document.createElement('li') li.classList.add('two-lines') const primaryLine = document.createElement('div') primaryLine.classList.add('primary-line') primaryLine.textContent = diff.lineText li.appendChild(primaryLine) const secondaryLine = document.createElement('div') secondaryLine.classList.add('secondary-line') secondaryLine.textContent = `-${diff.oldStart},${diff.oldLines} +${diff.newStart},${diff.newLines}` li.appendChild(secondaryLine) return li }, didConfirmSelection: (diff) => { this.cancel() const bufferRow = diff.newStart > 0 ? diff.newStart - 1 : diff.newStart this.editor.setCursorBufferPosition([bufferRow, 0], {autoscroll: true}) this.editor.moveToFirstCharacterOfLine() }, didCancelSelection: () => { this.cancel() } }) this.selectListView.element.classList.add('diff-list-view') this.panel = atom.workspace.addModalPanel({item: this.selectListView, visible: false}) } attach () { this.previouslyFocusedElement = document.activeElement this.selectListView.reset() this.panel.show() this.selectListView.focus() } cancel () { this.panel.hide() if (this.previouslyFocusedElement) { this.previouslyFocusedElement.focus() this.previouslyFocusedElement = null } } destroy () { this.cancel() this.panel.destroy() return this.selectListView.destroy() } async toggle () { const editor = atom.workspace.getActiveTextEditor() if (this.panel.isVisible()) { this.cancel() } else if (editor) { this.editor = editor const repository = repositoryForPath(this.editor.getPath()) let diffs = repository ? repository.getLineDiffs(this.editor.getPath(), this.editor.getText()) : [] if (!diffs) diffs = [] for (let diff of diffs) { const bufferRow = diff.newStart > 0 ? diff.newStart - 1 : diff.newStart const lineText = this.editor.lineTextForBufferRow(bufferRow) diff.lineText = lineText ? lineText.trim() : '' } await this.selectListView.update({items: diffs}) this.attach() } } }