Files
atom/packages/git-diff/lib/diff-list-view.js
2019-05-31 18:33:56 +02: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();
}
}
};