reload-0.0.0.1: web/src/build-status.html
<link rel="import" href="../bower_components/polymer/polymer.html">
<link rel="import" href="../bower_components/x-websocket/x-websocket.html">
<link rel="import" href="../bower_components/paper-icon-button/paper-icon-button.html">
<link rel="import" href="../bower_components/paper-badge/paper-badge.html">
<link rel="import" href="../bower_components/paper-menu-button/paper-menu-button.html">
<link rel="import" href="../bower_components/paper-menu/paper-menu.html">
<link rel="import" href="../bower_components/paper-item/paper-item.html">
<link rel="import" href="../bower_components/paper-item/paper-icon-item.html">
<dom-module id="build-status">
<style>
.warning {
--paper-badge-background: yellow;
--paper-badge-text-color: var(--app-primary-color);
}
paper-menu{
width:800px;
}
.message-list{
font-size:0.6em;
margin:0;
}
</style>
<template>
<x-websocket id="xws" on-message="messageReceived" json="true"></x-websocket>
<div>
<paper-menu-button horizontal-align="right">
<paper-icon-button id="error" icon="error" alt="Errors" class="dropdown-trigger">
</paper-icon-button>
<paper-menu id="errorMenu" class="dropdown-content" on-iron-select="jumpToError">
<template is="dom-repeat" items="[[errors]]">
<paper-item class="message-list" role="menuitem">[[formatMessage(item)]]</paper-item>
</template>
</paper-menu>
</paper-menu-button>
<paper-badge id="errorBadge" for="error" label="[[errorCount]]">
</paper-badge>
<paper-menu-button horizontal-align="right">
<paper-icon-button id="warning" icon="warning" alt="Warnings" class="dropdown-trigger">
</paper-icon-button>
<paper-menu id="warningMenu" class="dropdown-content" on-iron-select="jumpToWarning">
<template is="dom-repeat" items="[[warnings]]">
<paper-item class="message-list" role="menuitem">[[formatMessage(item)]]</paper-item>
</template>
</paper-menu>
</paper-menu-button>
<paper-badge id="warningBadge" for="warning" label="[[warningCount]]" class="warning nocount">
</paper-badge>
</div>
</template>
<script>
Polymer({
is: 'build-status',
properties: {
},
messageReceived: function(e){
var data=e.detail.data;
this.$.xws.send("OK");
console.log(data);
if (data){
var loads=data.loads;
var process=data.process;
var reload=data.reload;
if (loads){
var thisLoad={};
for (var a=0;a<loads.length;a++){
var load=loads[a];
var path=load.file;
if (path){
if (!thisLoad[path]){
thisLoad[path]=true;
var st=this.status[path];
if (st){
st.message=[];
}
}
if (load.severity){
var st=this.status[path];
if (!st){
st={"mime":load.mime,"messages":[]};
this.status[path]=st;
}
if (load.message.length>1){
if (load.message[0].indexOf(path)>-1){
load.message.splice(0,1);
}
}
st.messages.push({"severity":load.severity,"line":load.line,"column":load.column,"message":load.message});
} else {
this.status[path]={"module":load.module,"mime":load.mime,"messages":[]};
}
}
}
this.fire("status-changed",this.status);
var errs=[];
var warns=[];
for (var p in this.status){
var st=this.status[p];
var msgs=st.messages;
for (var a=0;a<msgs.length;a++){
var m=msgs[a];
var it={"path":p,"type":"file","mime":st.mime,"details":m};
if (m.severity==="Error"){
errs.push(it);
} else if (m.severity==="Warning"){
warns.push(it);
}
}
}
this.errorCount=errs.length;
this.warningCount=warns.length;
this.errors=errs;
this.warnings=warns;
this.$.errorBadge.style.visibility=this.errorCount>0?"visible":"hidden";
this.$.warningBadge.style.visibility=this.warningCount>0?"visible":"hidden";
} else if (process){
this.fire("process-stream",data);
} else if (reload){
this.fire("reload-file",data);
}
}
},
ready: function(){
this.status={};
this.errorCount=0;
this.warningCount=0;
this.errors=[];
this.warnings=[];
this.$.errorBadge.style.visibility="hidden";
this.$.warningBadge.style.visibility="hidden";
var xws = this.$.xws;
xws.url='ws://'+location.hostname+(location.port ? ':'+location.port: '');
xws.open();
},
formatMessage(item){
var p=item.path;
var msgs=item.details.message;
var l=item.details.line;
var c=item.details.column;
var s=p;
if (l){
s+=":"+l;
}
if (c){
s+=":"+c;
}
if (msgs.length>0){
s+=": "+msgs.join(" ").trim();
}
return s;
},
jumpToError:function(e){
var item=this.errors[this.$.errorMenu.selected];
if (item !==undefined){
this.fire("file-selected",item);
this.$.errorMenu.select(null);
}
},
jumpToWarning:function(e){
var item=this.warnings[this.$.warningMenu.selected];
if (item!==undefined){
this.fire("file-selected",item);
this.$.warningMenu.select(null);
}
}
});
</script>
</dom-module>