in lib/elements/analysis_results_controller.dart [82:147]
Element _createIssueElement(AnalysisIssue issue) {
final message = issue.message;
final elem = DivElement()..classes.addAll(['issue', 'clickable']);
elem.children.add(SpanElement()
..text = issue.kind
..classes.addAll(_classesForType[issue.kind]!));
final columnElem = DivElement()..classes.add('issue-column');
final messageSpan = DivElement()
..text = 'line ${issue.line} • $message'
..classes.add('message');
columnElem.children.add(messageSpan);
// Add a link to the documentation
if (issue.url.isNotEmpty) {
messageSpan.children.add(AnchorElement()
..href = issue.url
..text = ' (view docs)'
..target = '_blank'
..classes.add('issue-anchor'));
}
// Add the correction, if any.
if (issue.correction.isNotEmpty) {
columnElem.children.add(DivElement()
..text = issue.correction
..classes.add('message'));
}
// TODO: This should likely be named contextMessages.
for (final diagnostic in issue.diagnosticMessages) {
columnElem.children.add(_createDiagnosticElement(diagnostic));
}
elem.children.add(columnElem);
final copyButton = MDCButton(ButtonElement(), isIcon: true);
copyButton.buttonElement.setInnerHtml('content_copy');
copyButton
..toggleClass('mdc-icon-button', true)
..toggleClass('mdc-button-small', true)
..toggleClass('material-icons', true);
copyButton.onClick.listen((event) async {
try {
await window.navigator.clipboard?.writeText(message);
snackbar.showMessage('Copied to clipboard successfully!');
} catch (_) {
snackbar.showMessage('Failed to copy');
}
});
elem.children.add(copyButton.element);
elem.onClick.listen((_) {
_onClickController.add(Location(
line: issue.line,
charStart: issue.charStart,
charLength: issue.charLength));
});
return elem;
}