Element _createIssueElement()

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;
  }