anchor.diff:  
     void _commit() {
       // TODO(grv): add verify checks.
  -    String projectName = (_dialogElement.querySelector(
  +    String projectName = (_dialog.element.querySelector(
           "#gitProjectName") as InputElement).value;
  -    String repoUrl = (_dialogElement.querySelector(
  +    String repoUrl = (_dialog.element.querySelector(
           "#gitRepoUrl") as InputElement).value;
       _gitClone(projectName, repoUrl, spark);
     }
  
positive.code: 
    void _setMessageAndShow() {
      if (_resources.length == 1) {
        _dialogElement.querySelector("#message").text =
            "Are you sure you want to delete '${_resources.first.name}'?";
      } else {
        _dialogElement.querySelector("#message").text =
            "Are you sure you want to delete ${_resources.length} files?";
      }
      _dialog.show();
  
negative.code: }
  
  abstract class SparkActionWithDialog extends SparkAction {
    bootjack.Modal _dialog;
  
    SparkActionWithDialog(Spark spark,
                          String id,
                          String name,
                          Element dialogElement)
        : super(spark, id, name) {
      dialogElement.querySelector("[primary]").onClick.listen((_) => _commit());
      _dialog = bootjack.Modal.wire(dialogElement);
    }
  
    void _commit();
  