Skip to content

Commit

Permalink
Merge pull request #1098 from bosun-monitor/dashboard-improvements
Browse files Browse the repository at this point in the history
Dashboard improvements
  • Loading branch information
maddyblue committed Jun 24, 2015
2 parents 9a57f54 + a9fdc3d commit 3a58440
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 35 deletions.
32 changes: 19 additions & 13 deletions cmd/bosun/sched/sched.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,19 +145,22 @@ func (s *Schedule) GetMetadata(metric string, subset opentsdb.TagSet) []metadata
type States map[expr.AlertKey]*State

type StateTuple struct {
NeedAck bool
Active bool
Status Status
NeedAck bool
Active bool
Status Status
Silenced bool
}

// GroupStates groups by NeedAck, Active, and Status.
func (states States) GroupStates() map[StateTuple]States {
// GroupStates groups by NeedAck, Active, Status, and Silenced.
func (states States) GroupStates(silenced map[expr.AlertKey]Silence) map[StateTuple]States {
r := make(map[StateTuple]States)
for ak, st := range states {
_, sil := silenced[ak]
t := StateTuple{
st.NeedAck,
st.IsActive(),
st.AbnormalStatus(),
sil,
}
if _, present := r[t]; !present {
r[t] = make(States)
Expand Down Expand Up @@ -239,8 +242,8 @@ func (states States) GroupSets() map[string]expr.AlertKeys {
type StateGroup struct {
Active bool `json:",omitempty"`
Status Status
Silenced bool
Subject string `json:",omitempty"`
Len int `json:",omitempty"`
Alert string `json:",omitempty"`
AlertKey expr.AlertKey `json:",omitempty"`
Ago string `json:",omitempty"`
Expand All @@ -253,13 +256,12 @@ type StateGroups struct {
Acknowledged []*StateGroup `json:",omitempty"`
}
TimeAndDate []int
Silenced map[expr.AlertKey]Silence
}

func (s *Schedule) MarshalGroups(T miniprofiler.Timer, filter string) (*StateGroups, error) {
silenced := s.Silenced()
t := StateGroups{
TimeAndDate: s.Conf.TimeAndDate,
Silenced: s.Silenced(),
}
s.TimeLock(T)
defer s.Unlock()
Expand All @@ -282,7 +284,7 @@ func (s *Schedule) MarshalGroups(T miniprofiler.Timer, filter string) (*StateGro
}
var groups map[StateTuple]States
T.Step("GroupStates", func(T miniprofiler.Timer) {
groups = status.GroupStates()
groups = status.GroupStates(silenced)
})
T.Step("groups", func(T miniprofiler.Timer) {
for tuple, states := range groups {
Expand All @@ -295,22 +297,26 @@ func (s *Schedule) MarshalGroups(T miniprofiler.Timer, filter string) (*StateGro
})
for name, group := range sets {
g := StateGroup{
Active: tuple.Active,
Status: tuple.Status,
Subject: fmt.Sprintf("%s - %s", tuple.Status, name),
Len: len(group),
Active: tuple.Active,
Status: tuple.Status,
Silenced: tuple.Silenced,
Subject: fmt.Sprintf("%s - %s", tuple.Status, name),
}
for _, ak := range group {
st := s.status[ak]
g.Children = append(g.Children, &StateGroup{
Active: tuple.Active,
Status: tuple.Status,
Silenced: tuple.Silenced,
AlertKey: ak,
Alert: ak.Name(),
Subject: string(st.Subject),
Ago: marshalTime(st.Last().Time),
})
}
if len(g.Children) == 1 && g.Children[0].Subject != "" {
g.Subject = g.Children[0].Subject
}
grouped = append(grouped, &g)
}
default:
Expand Down
36 changes: 18 additions & 18 deletions cmd/bosun/web/static.go
Original file line number Diff line number Diff line change
Expand Up @@ -7845,15 +7845,15 @@ var _escData = map[string]*_escFile{

"/partials/ackgroup.html": {
local: "web/static/partials/ackgroup.html",
size: 1672,
size: 1774,
compressed: "" +
"\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xa4T=o\xe38\x10\xad}\xbf\x82'\x04\xb0\f\x9c\xec\"\xa9\x0e\x92\x81 \xc0b\x8b\xedR.\xb6\x18Qc\x91k\x9a\x14H*\xb6a\xf8\xbf/\xbf$ˉ\x9d\x14[\b\xe2\xc7\xe3\xbc\x19\xce{,\x1b\xfeF\xa8\x00c\xaa\xac\x03\x89\xa2h\xb5껌ȶ0L\xed\xab,\xccM\xb6\xfeg6\xc5" +
"R\x81\xa07\xfc\xe0\xd7g%{\xf4\xf8\x9a˦ʀn\xb31b/D!pc\xb3u\xb9b\x8f\x01k\x1c\xcdվ\xe6-\xb3!\xce̠@j\xfd\xa8\xac\xf5:\xfe{k\xd5x\xa0\xb6\x92\xb8\xafhp\x03\xbd\xb0alv![*8\xddVY\f\x91[\xdd\xe3\"[\x83\x10\xe5*\x86\xf8\xabp\x1b\x10\xc6ǓJ\xe24`" +
"\xb9\xf2\xe5|R\x17\xd9sˊ\x18\x05\x9bɵ\x82<\xbe\x0e\xab!5\x0f$\x03\xf0\xea\n\xe0}\xba\x9d\xe6;\xd0\xc7i\xbaL\xe3\xa6\xcaN\xa7\x9d+\x83\x03\xb5\\\xc9|\xeeZ1_\x9c\xcf\x01\xd0p\x03\xb5@נ\u007f)\xc8g\xba\xbd\xb0;\x98T{\xb7\u05fa\xda\xe0\x0e\xe7\x1e\xb4\xe4\xb2\xfd\x92\x93\ne\xf0\x0e\xeb\x8b\u07fb\xf0" +
"\x06\xe8}\xc6\x06d\x8b\xfaK\u008d\xd2-\xda;\x8c\xdf\xc2\xe6\x852\x82?\xe1\xfc(\x84\x81\x94qc\x95>\xe6\x9eh\xfd=NR\xa0Q\x05\xe5\xcaY\xe4\x9dS\x82\xab\x92\xa4.\v/~\x9c\ao-_-\xd8\xde,\x02Fc\x87`\x93\xeb\b\x97$\xd9\xcf\xefq\xc9\xdd\x0eo\x0e\xa4\"\x0f\xcek\x98\xdc\xf7\xc1\xc2\f\xa1q\xbd\x9a" +
"\xea\x98*!\xa03\x98\xbb\xe3\x8b(\xb8\x92=]\x1f\xb3\xdc\n\x8c{\xb3R@\x8d↞\xa3B\x13jVr\xd9\xf5\x96\xd8c\x87\x8e\x83!\xdd\xd6\xea\x90ݰ\xb7Oe\xa7\x1a\x14\xa9\xb4e\x00'G\f9\xfa_\xfe\x80o(\xed\u007f\xa9\xc2x+\x94y-TY\xdf5`1_\fI\xaeB\x96i\x02ķjHlj\xc7V" +
"\x1c;Ʃ\x92\xd36\x9c\xe6\xe3r\x81\a\xb7\xb8\x03/\xa8\xc2\xf0V\xce\xff\x8f\xf7\xbe|v\"{ó\u007f\xbe\x06\xa3\x8f\xc1\xc7\x17/u\xb1\xaf\u007f\x87\x9b\xb9\x01\xbd\xf1ܝN\xf1\xd8\x0f\x94\xe73\x01\x81ښ\xe9\xc9Q\xa3+\xf6\x145\x16\xa5u\xa3ݵj\x8e\xe4\xfd\xe3͝h\xfdK#\u007f\xba\x8e\xffJ\x1dwGC\xf0+" +
"i\x86\x95\x9b\xf24N\x98\xb8tC;jt\x00\x0f:\xa5\x8c\x8bf\xd4\xe9\xf2\xc5O5ʈ\xb3\xa6\b!R!C\x01\x83I\xe2?\xfe\xfe\x04\x00\x00\xff\xff\x0ea_\x8f\x88\x06\x00\x00",
"\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xa4UM\x8f\xdb \x14<\xa7\xbf\x82Z+ő\xea\xe4\xb0{\xaa\xecH\xab\x95\xaa\xde\xf7X\xf5\x80\xe1\xd9\xd0\x10\xb0\x00\xe7CQ\xfe{\xf9\xb2\xe3\xec&\xbb\xaaz\x88l\xc30\xf3\x1e̐\x92\xf2\x1d\"\x02\x1bSe\x1d\x96 \x8aV\xab\xbeːl\v\xc3Ծ\xca·\xc9\xd6_fS,\x11\x80" +
"u\xc3\x0f~|V\xb2G\x8f\xaf\xb9\xa4U\x86\xc9&\x1b\x19{!\n\x01\x8d\xcd\xd6\xe5\x8a=\x06\xacq2W\xf3\x9a\xb7\xcc\x06\x9e\x99\x01\x01\xc4\xfa\xb7\xb2\xd6\xeb\xf8\xec\xadU\xe3\x82\xdaJ\xe4~\x05\x85\x06\xf7\u0086w\xb3\r\xd5\x12\xc1ɦ\xca\"Enu\x0f\x8bl\x8d\x85(W\x91\xe2\xbf\xe8\x1a,\x8c\xe7\x93J\u0094\xb0\\\xf9v" +
">\xe8\v\xed\xb9eEd\x01:\xd9V,\x8f\xaf\xc3h(\xcd\x03\xd1\x00\xbc\xda\x02\xfc\xb6\xdcN\xf3-\xd6\xc7i\xb9LCSe\xa7\xd3ֵ\xc11\xb1\\\xc9|\xee\x8eb\xbe8\x9f\x03\x80r\x83k\x01\ue03e\x12,\x9f\xc9\xe6\xa2\xee`R\xed\xdd\\\xebz\xc3w4\xf7XK.\xdbO5\x89P\x06\uea3e\xf8\xb9\x8bn\x80\xde" +
"W\xa4X\xb6\xa0?\x15l\x94n\xc1\xdeQ\xfc\x11&/\x92\x11\xfc\x81\xe6{#\f\xa2\x8c\x1b\xab\xf41\xf7B\xeb\x9f\xf1#\x11\x8d.(W.\"o\x92\x12R\x95,u\x19x\xf1\xefy\xc8\xd6\xf2\xd5bۛE\xc0h\xe8\x00۔:\xc4%J\xf1\xf3s\\r7\xc3\xe9\x01U\xe8\xc1e\rR\xfa\xdeE\x98\x01\xa6\ueb26>&" +
"J\b\xdc\x19\xc8\xdd\xf2E4\\ɞ\xae\x97Yn\x05ĹY)p\r↟\xa3C\x13jVr\xd9\xf5\x16\xd9c\aN\x83\x01\xd9\xd4\xea\x90݈\xb7/e\xab(\x88\xd4\xda2\x80S\"\x86\x1a\xfd#\u007f\x80\x1dH\xfb-u\x18w\x850\xef\x85*\xeb;\x8a-䋡\xc8U\xa82}`\xe4\x8fj(l\x1a\xc7V\x1c;" +
"Ɖ\x92\xd3c8\xcd\xc7\xe1\x02\x0enp\x8b\xbd\xa1\n\xc3[9\xff\x1e\xf7}\xf9\xecL\xb6\x83\xb3\xbf\xbe\x86\xa0\xff3\xf9N\x89~\v\x85j\x9a\x91\xf6\x95\v\x90\x04\xe8m\xe2\xf1*M\xe0\xbe\xfe\x13\xb6\xfc~\r\xd3{\xf4t\x8a\xcb^\x18\x17T\x83\\:\xa9ֲ\xf3\x19a\x01ښ)\xcb\x18\x84\x15{\x8aF\x8e\xfe\xbd\xe1\xa9Z" +
"\xd1#z\xfb\x0f\xc1]2\xfcu&\u007f9[\xfdN\xb6rK\x03\xf9\x95\xff\xc3\xc8\xcd\f\x18\xe7~X\xbaW;\x06a\x00\x0fa \xbe\x951\fcg\x11gM\x11(R#C\x03C\x12\xe33=\xfe\x06\x00\x00\xff\xff\xdcɆx\xee\x06\x00\x00",
},

"/partials/action.html": {
Expand All @@ -7880,17 +7880,17 @@ var _escData = map[string]*_escFile{

"/partials/alertstate.html": {
local: "web/static/partials/alertstate.html",
size: 3352,
size: 3334,
compressed: "" +
"\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xb4VQ\x8f\xe26\x10~\xe6~\x85\xcf'-\xbbR\x93\b\x8aV\xea*\t\xbaVW\xf5\xd4\xebKw\xb7/U\x1fLb\x12\x17c\xa7\xb6\xb3,\xe5\xf2\xdf;\x8e\x03$\x10z-p\x0f\xbb\x19\xc63\x9f\xbf\x99\xb1g\x1c\xa6\xec\x05%\x9ch\x1d\xe1\x82\bʽ\x9c\x92\x94\x89\f#\x91y\tg\xc9\"" +
"\xc2:\x97+\x14\xa1\xb7\xf6\x8b\xe37\x830\x9ft}\f3\x9cڕAHP\xae\xe8܊\x83Pê\x85\xb1~\x11\xe6\xd2\x01Ƿ\x9f\x9ct\x17\x06֢eۀf|]\xe4,\x91\xa2!Q+7Ýڣ\xaf\xa0\\\x12\xc3@\xd6,\x13\xc3\a\xa4\r1\xd4\aS\xe3?\x82Xjtsӣ|\x1b\xa1\xa1\x90jI\xf8" +
"\xb0\xc2\xf1\xd9\x04^$/\x97ԓ\xf3\xb9\xdd:\xc9iZr\xea?2NEB\xd3ߓ\x9c\xf1\xd4\u007fϩ2?\xd3\xf5\x1f\x97\xec\xf4WI\xf5q\x9cς\xbe\x10^\x82\x98\xf6\x81\xefr\xdeJ\xc0G\x91\xb0\x94\n\xf31\xc5\xf1\xbbͦw\xa5\xaa\x1e\xfa\xb0fL\xa4\x11vA=\x96\xb3?ib\xd0\xe7Ϩ\x1be\x87\xc6Q" +
"\x9cEɹ\xa7X\x96\x1b\xbcg\xd7\x00d\x12#\xa3!@\xc8][\xd9\x02\f\x03b\xcf]\x90O\xe27a\x00g\x16>G'w&\xd3u\x8d\xce\xe6͙\x05\x92\x99\x92e\xe1\xff`A\x15\x15>\x14(39\x8a\"4\xaaOr\vD\xb9\xc3\xdd\xd1%\x92{z\xe9\xddc\x97\x90\x1e\xeb^\xfbo\x9b\xa5AXġ6J\x8a," +
"\xae\xf3\x84 Q6\xc5N\x15\x06E\x03\xe1B:\x81\xf6\xdd\x0e\xad[\x90\xbfW\xfaV\x90%\xbd\xc3(8\xc4iI\x97\x90\xb6\xb7\x86^\x8d\xf0\xd1u\xb4\xc4Q]w\xe4L\xe1\x18\x18\xb6\xa4\x1d\xd3'P\xe0\xaf\x15\xe0o\x8c\xae\xf4\x05\x01\x12\x1b\x9d\xedx\x11\x0er\xa6\x8dT\xeb邮\xa3\xcd\x06:\x81L\xa9+P\x05\x97\xf4G\xb8" +
"\x01\xe8'gb\x8f\xf37\xc7\b\xdb[\xf9+4\x93gŭ\x97\x15ч\x94\x81\xd7\t\xa7\x80\xbe\x16jj\xff\xc1\xa63#ɭ\x03\xf9\x00\x9azc+P\xad\xa1\x87\x9cB`M\x03\x98\xb24:\xd9\x19p\xbc\xfd\x85nߝ.l\xab\xcd\x04\U0005def7\xfd\x85\xdb\v_\xe7\xc25\xdd\xf8\xa2\xe26+3#\x10\xfcy)\x9d\x93" +
"\x92\x9bZ~ո\x95B\xed6\x9b\xa6\xa5\xaa\xc7R4\xcao\x88\xbd\xf1\xbb\x84\xd6\xf7\xbf\xaan\f\xc9\xf4\xfex\xb8\xb5'\xd0յ\x1a\xa1\\\x96j\x97\xb5\xcb(\x8cϢ0\xae)\xe8+q\xb8?\x8b\xc3\xfdU9\x8c\xceK\xc4躙\x18O\xce+\xc7\xe4\x80\xc5\xd5[\xe0\xfb\xc4\xf2\xbb\xa4\tB\xd7&\xc9\x02\xfc\x1aa\xafN\xb8" +
"\xd4\xd4-8q\xbf4\x97*\xa3f;\xaeݘn\x1ei0\x9d\x87\xa5X\b\xb9\x12C켝\xf5\u007f\xcf\xc0\xe1\x13\xe8\x13\xf4&\x17\xe8\xffK\x8e\xf5C\xce\xf1\xfc\x04m\v\xbe'\xe1?\xad\vZU\aS\xb2\x9f\xb0\xff\xac\xa9\xc2\xf1l\x8dzp\xecZU\xb5^^\x83\x011\xfdô\xbd\xbb\x1d\xa9q\xc7\xebK$~\x81\x11B" +
"2\xf0z\xe8\xa3Ѭv\x99\xfcK\xcf\xdf}{\xcaV\xbf\xde\xea\r\xbe\xb7\x0f\xba\x13\x13b4nFD\xae\x82/M\x13\xb0\xdd\xce*/7K\xde\xc5?\xe0\xe4>\xff\x04\x00\x00\xff\xff\xfd\xb6t\xe9\x18\r\x00\x00",
"\x1f\x8b\b\x00\x00\tn\x88\x00\xff\xb4VQ\x8f\xe26\x10~\xe6~\x85\xcf'-\xbbRC\xc4\x16\xad\xd4U\x12t\xad\xae\xea\xa9ח\xden\xdfMb\x12\x17c\xa7\xb6\xb3,\xe5\xf2\xdf;\x8e\r$\x10z-p\x0f\xbb\x19ƞ\xcf\xdf\xccxf\x1ce\xec\x05\xa5\x9ch\x1d\xe3\x92\bʃ\x82\x92\x8c\x89\x1c#\x91\a)g\xe9\"ƺ" +
"\x90+\x14\xa3\xb7\xf6\x8b\x937\x83\xa8\x98tm\f3\x9cڕADP\xa1\xe8܊\x83Hê\x85\xb1v1\xe6\xd2\x01'\xb7\x9f\x9ct\x17\x85vGk\xaf\a\xcd\xf9\xba,X*\x85'\xd1(7Ý:\xa0\xaf\xa0\\\x12\xc3@\xd6,\x17\xc3G\xa4\r1t\x04[\xcd\xe83\x88\x95F77=ʷ1\x1a\n\xa9\x96\x84\x0fk" +
"\x9c\x9cM\xe0E\xf2jI\x039\x9f\xc3\xd1i\xc1x6\xfa\xcc8\x15)\xcd.\x81\xfd\xab\xa2\xfaةgA_\b\xaf@\xec\x05\xdf\x05\xb8\xe5\xedG\x91\xb2\x8c\n\xf31\xc3ɻͦw\xa5\xae\x1f\xfb\xb0fLd1\xf6>U\xb3?ijЗ/\xde\xc9\xf7\x9c*\xf3+]wh\x1c\xf9YV\x9c\a\x8a\xe5\x85\xc1{v\x1e " +
"\x97\x18\x19\r\x0eB\xac\xda\xca\x16`\x14\x12{\xc9\xc2b\x92\xbc\x89B\xb8\xa0\xf09\xba\xa63\x99\xad\x1bt6\xf7\x17\x14H\xe6JV\xe5\xe8'\v\xaa\xa8\x18ABrS\xa08F\xe3\xe6ڶ@\x94\xbb\xc9\x1d]*y\xa0\x97\xc1\x03v\x01\xe9\xd9ݻ\xff{\xbf4\x88\xca$\xd2FI\x91'M\x9c\x10\x04ʆة\xa2\xb0\xf4\x10" +
"Υ\x13h?\xecк\t\xf9{\xa5o\x05Y\xd2;\x8c\xc2C\x9c\x96t\ti[\"\xf4j\x84\x8fj\xcf\x12GMޑ\xdb\n\xd7\xc0\xb0%\xedl}\x02\x05\xfeV\x0e\xfe\xc1\xe8J_\xe0 \xb1\xde\xd9\xf6\x16\xe3\xb0`\xdaH\xb5\x9e.\xe8:\xdel\xa0\xf2eF]\x82j(ҟ\xa1\x02\xd0/n\x8b\xbd\xce\xdf\x1d#l\xab\xf2" +
"\xf7\x8a\xd3gŭ\x95\x15ч\x8c\x81\xd5\t\xa3\x90\xbe\x96jj\xff\xc1\xa13#ɭ\x03\xf9\x00\x9a\xe6`+P\xad\xa1\x87\x9cB`\xbe\x01LY\x16\x9f\xec\f8\xd9\xfeB\xb7\xefN'\xb6\xd5f\xc2\xe4\xce\xd5m\u007f\xe2\xf6·)8\xdf}/J\xae_\x99\x19\x81\xe0/\xc8\xe8\x9cT\xdc4\xf2\xabƭ\x10jw\xd84\xabT" +
"3\x83\xe2qqCl\xc5\xef\x02\xda\xd4\u007f]\xdf\x18\x92\xeb\xfd\xf5pkO\xa0kr5F\x85\xac\xd4.j\x97Q\xb8?\x8b\xc2}CA_\x89\xc3\xc3Y\x1c\x1e\xae\xcaa|^ \xc6\u05cd\xc4\xfd\xe4\xbctL\x0eX\\\xbd\x05\xbeO-\xbfK\x9a tm\x92.\xc0\xce\v{uʥ\xa6n\xc1\x89\xfb\xa5\xb9T95\xdbq\xed" +
"ƴ\u007f\x91\xc1t\x1eVb!\xe4J\f\xb1\xb3v\xbb\xff{\x04\x0e\x9f@\x9f\xa079G\xff_p\xac\x1dr\x86\xe7\ah\x9b\xf0=\x89\xd1Ӻ\xa4u}0%\xfb\t\x8f\x9e5U8\x99\xadQ\x0f\x8e]\xab\xeb\xd6\xcbk0 \xa6\u007f\x98\xb6O\xb7#5\xe9X}\x8d\xc4o0BH\x0eV\x8f}4\xfcj\x97ɿ\xf4\xfc\xdd" +
"\xb7'm\xcd\xeb\xad9\xe0G\xfb\xa0;1!\xc6\xf7~D\x14*\xfc\xda4\x81\xbd\xdbY\x15\x14fɻ\xf8\a\x9c\xfc\xe7\x9f\x00\x00\x00\xff\xff\xbc\x94\xe3\xc5\x06\r\x00\x00",
},

"/partials/close.html": {
Expand Down
5 changes: 3 additions & 2 deletions cmd/bosun/web/static/partials/ackgroup.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ <h4 class="panel-title">
</label>
<a href>
<span class="glyphicon" ng-class="{'glyphicon-exclamation-sign': group.Active}"></span>
<span class="glyphicon" ng-class="{'glyphicon-volume-off': group.Silenced}"></span>
<span ng-bind="group.Subject"></span>
<span class="pull-right">{{group.Len}} alerts</span>
<span class="pull-right">{{group.Children.length}} alerts</span>
</a>
</h4>
</div>
Expand All @@ -38,4 +39,4 @@ <h4 class="panel-title">
</div>
</div>
</div>
</div>
</div>
4 changes: 2 additions & 2 deletions cmd/bosun/web/static/partials/alertstate.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ <h4 class="panel-title">
<a href>
<span ng-show="loading">(Loading)</span>
<span class="glyphicon" ng-class="{'glyphicon-exclamation-sign': state.last.Status && state.last.Status != 'normal'}"></span>
<span class="glyphicon" ng-class="{'glyphicon-volume-off': schedule.Silenced[child.AlertKey]}"></span>
<span class="glyphicon" ng-class="{'glyphicon-volume-off': child.Silenced}"></span>
<span class="glyphicon" ng-class="{'glyphicon-question-sign': state.Unevaluated}"></span>
<span ng-show="state.last.IncidentId">#{{state.last.IncidentId}}:</span>
<span ng-bind="child.Subject || child.AlertKey"></span>
Expand Down Expand Up @@ -85,4 +85,4 @@ <h4 class="panel-title">
</div>
<div class="col-sm-12" ng-bind-html="state.Body"></div>
</div>
</div>
</div>

0 comments on commit 3a58440

Please sign in to comment.