Files
atom/packages/git-diff/lib/diff-list-view.js
2019-02-25 12:19:44 +01:00

90 lines
2.6 KiB
JavaScript

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