| <!-- |
| The common.js file must be included before this file. |
| |
| This in an HTML Import-able file that contains the definitions |
| for the following elements: |
| |
| <cluster-summary-sk> |
| <toggle-display-sk> |
| <word-cloud-sk> |
| |
| To use this file import it: |
| |
| <link href="res/imp/cluster.html" rel="import" /> |
| |
| --> |
| // The <word-cloud-sk> custom element declaration. |
| <polymer-element name="word-cloud-sk" attributes="items"> |
| <template> |
| <style type="text/css" media="screen"> |
| .cloudParam { |
| display: flex; |
| flex-flow: column nowrap; |
| margin: 1em; |
| border: solid #eee 1px; |
| padding: 0.5em; |
| } |
| .clWordCloud { |
| display: flex; |
| flex-flow: row wrap; |
| } |
| |
| .clWordCloud.display { |
| display: flex; |
| } |
| </style> |
| <div class=clWordCloud> |
| <template repeat="{{item in items}}"> |
| <div class=cloudParam> |
| <template repeat="{{entry in item}}"> |
| <div style="font-size: {{entry.Weight}}px;">{{entry.Value}}</div> |
| </template> |
| </div> |
| </template> |
| </div> |
| </template> |
| <script> |
| Polymer({ |
| ready: function() { |
| this.items = this.items || []; |
| } |
| }); |
| </script> |
| </polymer-element> |
| |
| // The <cluster-summary-sk> custom element declaration. |
| // |
| // Attributes: |
| // summary - Attribute contains a JSON serialized type.ClusterSummary. |
| // fade - Should the update dialog be faded if the status isn't New. |
| // issue - Optional Rietveld issue number. |
| <polymer-element name="cluster-summary-sk" attributes="summary fade issue"> |
| <template > |
| <style type="text/css" media="screen"> |
| .clHighlight.clHigh { |
| background-color: #44AA99; |
| color: white; |
| border-radius: 6px; |
| padding: 3px 6px; |
| } |
| |
| .clHighlight.clLow { |
| background-color: #AA4499; |
| color: white; |
| border-radius: 6px; |
| padding: 3px 6px; |
| } |
| |
| #graph { |
| width: 300px; |
| height: 150px; |
| } |
| |
| @media (max-width: 600px) { |
| #graph { |
| display: none; |
| } |
| } |
| |
| p { |
| margin: 0.2em; |
| padding: 0; |
| } |
| |
| .clStatus { |
| margin: 1em; |
| padding: 1em; |
| position: relative; |
| } |
| |
| .fade.Bug, |
| .fade.Ignore { |
| opacity: 0.3; |
| |
| } |
| |
| #clStatus.hidden, |
| #clPermalink.hidden { |
| display: none; |
| } |
| |
| .clStatus .disabledMessage { |
| display: none; |
| } |
| |
| .clStatus.disabled #form { |
| opacity: 0.5; |
| } |
| |
| .clStatus.disabled .disabledMessage { |
| display: block; |
| font-weight: bold; |
| color: #cc6677; |
| } |
| |
| .clStatus #message { |
| width: 100%; |
| } |
| |
| .clClusterSize, |
| .clLeastSquares, |
| .clStepSize, |
| .clBugs |
| { |
| margin-right: 2em; |
| } |
| |
| word-cloud-sk { |
| display: none; |
| } |
| |
| word-cloud-sk.display { |
| display: block; |
| } |
| |
| paper-button { |
| color: #1f78b4; |
| } |
| |
| paper-radio-button::shadow #onRadio { |
| background-color: #1F78B4; |
| } |
| |
| paper-radio-group /deep/ b.status { |
| padding-left: 0; |
| } |
| |
| </style> |
| <div class="clResult {{ {fade: fade} | tokenList }} {{ summary.Status }}" horizontal layout> |
| <div id=graph> </div> |
| <div class=clDetails flex> |
| <p class="clHighlight cl{{summary.StepFit.Status}}"> |
| Regression: <span class=clRegression>{{summary.StepFit.Regression | trunc}}</span> |
| </p> |
| <p><a class="clShortcut" id=shortcut href="#">View on dashboard</a> |
| <a id="clPermalink" class="{{ {hidden: summary.ID == -1} | tokenList}}" href="/cl/{{summary.ID}}">Permlink</a> |
| </p> |
| <p> |
| Cluster Size: <span class=clClusterSize>{{summary.Keys.length}}</span> |
| Least Squares Error: <span class=clLeastSquares>{{summary.StepFit.LeastSquares | trunc}}</span> |
| Step Size: <span class=clStepSize>{{summary.StepFit.StepSize | trunc}}</span> |
| <span class=clBugs>Bugs:</span> |
| Commit: <a href="https://skia.googlesource.com/skia/+/{{summary.Hash}}">{{summary.Hash | truncHash}}</a> |
| </p> |
| <template repeat="{{b in summary.Bugs}}"> |
| <a class=clBug href="https://code.google.com/p/skia/issues/detail?id={{b}}">{{b}}</a> |
| </template> |
| |
| <paper-shadow z="1"> |
| <div id=clStatus class="clStatus {{ {hidden: summary.ID == -1} | tokenList }} disabled" vertical layout> |
| <p class="disabledMessage">You must be logged in to change the status.</p> |
| <paper-radio-group id=status selected="{{cachedStatus}}" horizontal layout> |
| <b class=status>Status:</b> |
| <paper-radio-button name="New" label="New"></paper-radio-button> |
| <paper-radio-button name="Ignore" label="Ignore"></paper-radio-button> |
| <paper-radio-button name="Bug" label="Bug"></paper-radio-button> |
| </paper-radio-group> |
| <paper-input value="{{summary.Message}}" label="Note" id="message"></paper-input> |
| <paper-button self-end id=update>Update</paper-button> |
| </div> |
| </paper-shadow> |
| <toggle-display-sk>Word Cloud</toggle-display-sk> |
| <word-cloud-sk items="{{summary.ParamSummaries}}"></word-cloud-sk> |
| </div> |
| </div> |
| </template> |
| <script> |
| (function() { |
| |
| /** |
| * Handles the click on the Update button. |
| */ |
| function updateClick() { |
| var status = this.$.status.selected |
| var state = { |
| Id: this.summary.ID, |
| Status: status, |
| Message: this.$.message.value |
| }; |
| var that = this; |
| sk.post("/annotate/", JSON.stringify(state)).then(JSON.parse).then(function(json){ |
| that.summary.Status = status; |
| if (json.Bug) { |
| // Open the bug reporting page in a new window. |
| window.open(json.Bug, '_blank'); |
| } |
| }); |
| } |
| |
| /** |
| * Create a shortcut for the cluster and open that shortcut URL in a |
| * new window. |
| */ |
| function openShortcut(e) { |
| var keys = this.summary.Keys.slice(0, 50); |
| var state = { |
| scale: 0, |
| tiles: [-1], |
| hash: this.summary.Hash, |
| keys: keys, |
| issue: this.issue || '', |
| }; |
| sk.post("/shortcuts/", JSON.stringify(state)).then(JSON.parse).then(function(json){ |
| window.open('/#' + json.id, '_blank'); |
| }); |
| e.preventDefault(); |
| } |
| |
| Polymer({ |
| fade: false, |
| issue: '', |
| |
| created: function() { |
| this.summary = {}; |
| }, |
| |
| ready: function() { |
| this.$.update.addEventListener('click', updateClick.bind(this)); |
| this.$.shortcut.addEventListener('click', openShortcut.bind(this)); |
| this.cachedStatus = this.summary.Status || 'New'; |
| |
| var that = this; |
| sk.Login.then(function(status) { |
| if (status["Email"] != "") { |
| that.$.clStatus.classList.remove("disabled"); |
| } |
| }); |
| }, |
| |
| summaryChanged: function() { |
| // Check for an empty summary object. |
| if (this.summary.ParamSummaries == undefined) { |
| return; |
| } |
| |
| this.cachedStatus = this.summary.Status || 'New'; |
| |
| // Set the data- attributes used for sorting cluster summaries. |
| this.dataset.clustersize = this.summary.Keys.length; |
| this.dataset.steplse = this.summary.StepFit.LeastSquares; |
| this.dataset.stepsize = this.summary.StepFit.StepSize; |
| this.dataset.stepregression = this.summary.StepFit.Regression; |
| this.dataset.timestamp = this.summary.Timestamp; |
| |
| this.summary.ParamSummaries.sort(function(a, b){ |
| return b[0].Weight - a[0].Weight; |
| }); |
| // Plot the centroid. |
| jQuery.plot( |
| this.$.graph, |
| [ { |
| color: "black", |
| data: this.summary.Traces[0], |
| lineWidth: 1 |
| } ], |
| { |
| yaxis: { |
| min: -4, |
| max: 4 |
| } |
| }); |
| }, |
| |
| /** |
| * trunc is used as a filter during template expansion. |
| */ |
| trunc: function(value) { |
| return (+value).toPrecision(3); |
| }, |
| |
| truncHash: function(value) { |
| if (value) { |
| return value.substring(0, 7); |
| } |
| }, |
| |
| }); |
| })(); |
| </script> |
| </polymer-element> |