<!-- The <issue-sk> custom element declaration.

Shows the issues that are currently associated with a digest, a trace or a test.
Used across different views.

TODO(stephana): Fill in all details once we have determined the details on the
backend.

  Attributes:
    TBD

  Events:
    TBD

  Methods:
    TBD
-->
<link rel="import" href="bower_components/polymer/polymer.html">
<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html">
<link rel="import" href="bower_components/paper-button/paper-button.html">
<link rel="import" href="bower_components/iron-icons/iron-icons.html">
<link rel="import" href="shared-styles.html">

<dom-module id="issue-sk">
  <template>
    <style include="shared-styles">
      .issueHeader {
        font-size: 18px;
        font-weight: bold;
        padding-bottom: .5em;
      }

      .issueId {
        width: 5em;
        padding: 0, 1em, 0, 1em;
      }

      .itemTitle {
        padding: 0, 0, 0, 1em;
      }

      .issueRow {
        font-size: 20pt;
        padding: 0 0 0 1em;
      }

      .buttonContainer {
        padding: 1em 0 0 1em;
      }

      .noIssuesContainer {
        padding: .3em 0 .3em 1.3em;
      }

    </style>
    <div class="vertical layout">
      <div class="issueHeader">Issues</div>
      <div class="noIssuesContainer" hidden$="{{_hasIssues(issues)}}">
        No issues.
      </div>
      <template is="dom-repeat" hidden$={{!_hasIssues(issues)}} items="{{issues}}">
        <div class="issueRow">
          <span class="issueId"><a href$="{{_issueTrackerLink(item.id)}}">{{item.id}}</a></span>
          <span class="issueTitle"><a href$="{{_issueTrackerLink(item.id)}}">{{item.title}}</a></span>
        </div>
      </template>

      <div class="buttonContainer horizontal layout">
        <a class="buttonLink" href$="{{_addIssueLink(test, digest)}}" target="_blank" rel="noopener">
          <paper-button title="Create a new issue in Monorail" noink raised><iron-icon icon="icons:add"></iron-icon>New Issue</paper-button>
        </a>
        <paper-button title="Search for existing issue" noink raised><iron-icon icon="icons:search"></iron-icon>Search Issues</paper-button>
      </div>
    </div>
  </template>

  <script>
    Polymer({
      is: "issue-sk",

      // TODO(stephana): These properties are temporary and will change once the backend
      // is better defined.
      properties: {
        test: {
          type: String
        },
        digest: {
          type: String
        },
        issues: {
          type: Array,
          value: function() { return []; }
        }
      },

      _hasIssues(issues) {
        return issues && (issues.length > 0);
      },

      _issueTrackerLink: function(issueID) {
        return gold.issueURL(issueID);
      },

      // _addIssueLink returns the link that can be used to create a new issue
      // that connects this digests.
      _addIssueLink: function(test, digest) {
        var backlink = window.location.origin + "/detail?test=" + test + "&digest=" + digest;
        var msg = "This issue was reported through Skia Gold.\n\n"+
          "Visit this URL to see the details of the digest:\n\n"+
          "    " + backlink + "\n\n";
        var q = {
          labels:  "FromSkiaGold",
          comment: msg,
        }
        return "https://bugs.chromium.org/p/skia/issues/entry?" + sk.query.fromObject(q);
      }
    });
  </script>
</dom-module>
