Skip to content

Commit ac13652

Browse files
committed
feat(dev-server): clickable line numbers open in editor
1 parent 44393a9 commit ac13652

File tree

3 files changed

+47
-22
lines changed

3 files changed

+47
-22
lines changed

src/dev-server/dev-client/app-error.ts

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,7 @@ function appendDiagnostic(win: Window, doc: Document, config: d.DevClientConfig,
6363
fileHeader.title = escapeHtml(diagnostic.absFilePath);
6464

6565
if (canOpenInEditor) {
66-
(fileHeader as HTMLAnchorElement).href = '#open-in-editor';
67-
fileHeader.addEventListener('click', (ev) => {
68-
ev.preventDefault();
69-
ev.stopPropagation();
70-
openInEditor(win, config, diagnostic);
71-
});
66+
addOpenInEditor(win, config, fileHeader, diagnostic.absFilePath, diagnostic.lineNumber, diagnostic.columnNumber);
7267
}
7368
}
7469

@@ -98,15 +93,24 @@ function appendDiagnostic(win: Window, doc: Document, config: d.DevClientConfig,
9893

9994
prepareLines(diagnostic.lines).forEach(l => {
10095
const tr = doc.createElement('tr');
101-
if (l.errorCharStart > -1) {
102-
tr.className = 'dev-server-diagnostic-error-line';
96+
if (l.errorCharStart > 0) {
97+
tr.classList.add('dev-server-diagnostic-error-line');
98+
}
99+
if (canOpenInEditor) {
100+
tr.classList.add('dev-server-diagnostic-open-in-editor');
103101
}
104102
table.appendChild(tr);
105103

106104
const tdNum = doc.createElement('td');
107105
tdNum.className = 'dev-server-diagnostic-blob-num';
108-
if (l.lineNumber > -1) {
106+
if (l.lineNumber > 0) {
109107
tdNum.setAttribute('data-line-number', l.lineNumber + '');
108+
tdNum.title = escapeHtml(diagnostic.relFilePath) + ', line ' + l.lineNumber;
109+
110+
if (canOpenInEditor) {
111+
const column = l.lineNumber === diagnostic.lineNumber ? diagnostic.columnNumber : 1;
112+
addOpenInEditor(win, config, tdNum, diagnostic.absFilePath, l.lineNumber, column);
113+
}
110114
}
111115
tr.appendChild(tdNum);
112116

@@ -121,17 +125,26 @@ function appendDiagnostic(win: Window, doc: Document, config: d.DevClientConfig,
121125
}
122126

123127

124-
function openInEditor(win: Window, config: d.DevClientConfig, diagnostic: d.Diagnostic) {
125-
const qs: d.OpenInEditorData = {
126-
file: diagnostic.absFilePath,
127-
line: diagnostic.lineNumber,
128-
column: diagnostic.columnNumber,
129-
editor: config.editors[0].id
130-
};
131-
132-
const url = `${OPEN_IN_EDITOR_URL}?${Object.keys(qs).map(k => `${k}=${(qs as any)[k]}`).join('&')}`;
133-
134-
win.fetch(url);
128+
function addOpenInEditor(win: Window, config: d.DevClientConfig, elm: HTMLElement, file: string, line: number, column: number) {
129+
if (elm.tagName === 'A') {
130+
(elm as HTMLAnchorElement).href = '#open-in-editor';
131+
}
132+
if (typeof column !== 'number' || column < 1) {
133+
column = 1;
134+
}
135+
elm.addEventListener('click', (ev) => {
136+
ev.preventDefault();
137+
ev.stopPropagation();
138+
const qs: d.OpenInEditorData = {
139+
file: file,
140+
line: line,
141+
column: column,
142+
editor: config.editors[0].id
143+
};
144+
145+
const url = `${OPEN_IN_EDITOR_URL}?${Object.keys(qs).map(k => `${k}=${(qs as any)[k]}`).join('&')}`;
146+
win.fetch(url);
147+
});
135148
}
136149

137150

src/dev-server/open-in-editor.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ async function parseData(devServerConfig: d.DevServerConfig, fs: d.FileSystem, r
4848

4949
if (qs.line != null && !isNaN(qs.line)) {
5050
data.line = parseInt(qs.line, 10);
51-
} else {
51+
}
52+
if (typeof data.line !== 'number' || data.line < 1) {
5253
data.line = 1;
5354
}
5455

5556
if (qs.column != null && !isNaN(qs.column)) {
5657
data.column = parseInt(qs.column, 10);
57-
} else {
58+
}
59+
if (typeof data.column !== 'number' || data.column < 1) {
5860
data.column = 1;
5961
}
6062

src/dev-server/static/app-error.css

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,16 @@ td.dev-server-diagnostic-blob-num::before {
149149
z-index: -1;
150150
}
151151

152+
.dev-server-diagnostic-open-in-editor td.dev-server-diagnostic-blob-num:hover {
153+
cursor: pointer;
154+
background-color: #ffffe3 !important;
155+
font-weight: bold;
156+
}
157+
158+
.dev-server-diagnostic-open-in-editor.dev-server-diagnostic-error-line td.dev-server-diagnostic-blob-num:hover {
159+
background-color: #ffdada !important;
160+
}
161+
152162
td.dev-server-diagnostic-blob-code {
153163
position: relative !important;
154164
padding-right: 10px !important;

0 commit comments

Comments
 (0)