logster 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 898c489f2c456f2c301686c92fbb0d84f490c92e52bb14e4f0fa7696c68a71e2
4
- data.tar.gz: 2ce45b725d50d43bb79f7eec5d0e9216631b617a8841c9adbc878f84267eedcd
3
+ metadata.gz: 68799d063f1eb9cc2cedbb1c88ff2d8b83fcf27959f602778cb9b4387cfb5a76
4
+ data.tar.gz: 3e6b055f68c84af171b9442eb44bb785156c743a4c2050d8fc276c31b194236b
5
5
  SHA512:
6
- metadata.gz: 8e2f1ea6e080db96266106173ec1020fa525190ec22fa9717a7be97a7500dfed4f8b4fc289358e949b2a0df7a7444ad3b99add718f22c79f605915752d1c3c9f
7
- data.tar.gz: 482810869a48d60c51878fd6dd2bc9ccdcfb83900bb0a58618bb2bf4ee7e1c3cebb3acb59a62297f96ced1c95b6f9d2cb99331b1efd7deccccfc6465149c1426
6
+ metadata.gz: 13e14d3745cae3716d7f8133e1617935d73568e78c7cd76f92fd472c737ffc9f66c5a394f91e1f63374b41eb9412227b6c1eefc7068c71682d5e2c7694695cd9
7
+ data.tar.gz: ed736a79f07daa41263b166893a756f429991e79bc4fc5e6dc8c58ffd5c23be2fe2f83c73b88c1deb68a1e4255ab377da070402b6be5a60034753798cf5d8163
@@ -1,5 +1,9 @@
1
1
  # CHANGELOG
2
2
 
3
+ - 2019-03-26: 2.3.0
4
+
5
+ - FEATURE: track count of suppressed logs for each pattern
6
+
3
7
  - 2019-03-19: 2.2.0
4
8
 
5
9
  - FEATURE: custom suppression patterns via UI
@@ -22,12 +22,12 @@ var s=Em.$(document)
22
22
  t.forEach(function(e){return s.unbind(e,r)}),n.forEach(function(e){return s.unbind(e,a)})}
23
23
  this.divider.on(a.join(" "),function(e){e.preventDefault(),Em.$("<div id='overlay'></div>").appendTo(Em.$("body")),i=!0,Em.$(document).on(t.join(" "),_.throttle(r,25)).on(n.join(" "),o)}),Em.run.next(function(){var t=localStorage&&localStorage.logster_divider_bottom||300,n=s.height()-parseInt(t,10)
24
24
  e.divideView(n,s)})},willDestroyElement:function(){Em.$(".divider").off(a.join(" "))}})}),define("client-app/components/patterns-list",["exports","client-app/models/pattern-item","client-app/lib/utilities"],function(e,t,n){function a(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t]
25
- return n}return Array.from(e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Component.extend({immutable:Ember.computed.not("mutable"),init:function(){this._super.apply(this,arguments),this.get("patterns.length")<1&&this.get("mutable")&&this.send("create")},allPatterns:Ember.computed("patterns.[]","newPatterns.[]",function(){var e=this.get("patterns").map(function(e){return t.default.create({value:e})}),n=this.get("newPatterns")||[]
26
- return[].concat(a(n.reverse()),a(e.reverse()))}),makeAPICall:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.method
25
+ return n}return Array.from(e)}Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Component.extend({immutable:Ember.computed.not("mutable"),init:function(){this._super.apply(this,arguments),this.get("patterns.length")<1&&this.get("mutable")&&this.send("create")},allPatterns:Ember.computed("patterns.[]","newPatterns.[]",function(){var e=this.get("patterns"),t=this.get("newPatterns")||[]
26
+ return[].concat(a(t.reverse()),a(e.reverse()))}),makeAPICall:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.method
27
27
  return delete e.method,(0,n.ajax)("/patterns/"+this.get("key")+".json",{method:t,data:e})},alwaysBlock:function(e){e.set("saving",!1)},catchBlock:function(e,t){t.responseText?e.set("error",t.responseText):e.set("error","Unkown error occured. Please see dev console.")},requestInit:function(e){e.setProperties({saving:!0,error:null})},actions:{create:function(){this.get("newPatterns")||this.set("newPatterns",[]),this.get("newPatterns").pushObject(t.default.create({isNew:!0}))},trash:function(e){var t=this
28
- e.get("isNew")?(this.get("newPatterns").removeObject(e),e.destroy()):(this.requestInit(e),this.makeAPICall({method:"DELETE",pattern:e.get("value")}).then(function(){t.get("patterns").removeObject(e.get("value")),e.destroy()}).catch(function(n){return t.catchBlock(e,n)}).always(function(){return t.alwaysBlock(e)}))},save:function(e){var t=this
29
- this.requestInit(e);(e.get("isNew")?this.makeAPICall({method:"POST",pattern:e.get("valueBuffer")}).then(function(n){e.updateValue(n.pattern),e.set("isNew",!1),t.get("patterns").pushObject(e.get("value")),t.get("newPatterns").removeObject(e)}):this.makeAPICall({method:"PUT",pattern:e.get("value"),new_pattern:e.get("valueBuffer")}).then(function(n){var a=t.get("patterns").indexOf(e.get("value"))
30
- e.updateValue(n.pattern),t.get("patterns")[a]=e.get("value")})).catch(function(n){t.catchBlock(e,n)}).always(function(){return t.alwaysBlock(e)})}}})}),define("client-app/components/tab-contents",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Component.extend({classNameBindings:["active",":content","name"],isLink:!1,invokeParent:function(e){for(var t=this.get("parentView");t&&!t[e];)t=t.get("parentView")
28
+ e.get("isNew")?(this.get("newPatterns").removeObject(e),e.destroy()):(this.requestInit(e),this.makeAPICall({method:"DELETE",pattern:e.get("value")}).then(function(){t.get("patterns").removeObject(e),e.destroy()}).catch(function(n){return t.catchBlock(e,n)}).always(function(){return t.alwaysBlock(e)}))},save:function(e){var t=this
29
+ this.requestInit(e);(e.get("isNew")?this.makeAPICall({method:"POST",pattern:e.get("valueBuffer")}).then(function(n){e.updateValue(n.pattern),e.set("isNew",!1),t.get("patterns").pushObject(e),t.get("newPatterns").removeObject(e)}):this.makeAPICall({method:"PUT",pattern:e.get("value"),new_pattern:e.get("valueBuffer")}).then(function(t){e.updateValue(t.pattern),e.set("count",0)})).catch(function(n){t.catchBlock(e,n)}).always(function(){return t.alwaysBlock(e)})},resetCount:function(e){var t=this
30
+ e.set("saving",!0),(0,n.ajax)("/reset-count.json",{method:"PUT",data:{pattern:e.get("value"),hard:!!e.get("hard")}}).then(function(){e.set("count",0)}).catch(function(n){return t.catchBlock(e,n)}).always(function(){return t.alwaysBlock(e)})}}})}),define("client-app/components/tab-contents",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Component.extend({classNameBindings:["active",":content","name"],isLink:!1,invokeParent:function(e){for(var t=this.get("parentView");t&&!t[e];)t=t.get("parentView")
31
31
  t&&t[e](this)},didInsertElement:function(){this.invokeParent("addTab"),this.get("defaultTab")&&this.invokeParent("selectTab")},willDestroyElement:function(){this.invokeParent("removeTab")}})}),define("client-app/components/tabbed-section",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Component.extend({tabs:Em.A(),selectTab:function(e){if(e.get("isLink"))this.triggerAction(e.get("action"))
32
32
  else{var t=this.get("selected")
33
33
  t&&t.set("active",!1),this.set("selected",e),e.set("active",!0)}},addTab:function(e){this.get("tabs").addObject(e),this.get("selected")||e.get("isLink")||this.selectTab(e)},removeTab:function(e){this.get("selected")===e&&this.set("selected",null),this.get("tabs").removeObject(e)}})}),define("client-app/components/time-formatter",["exports","client-app/lib/utilities"],function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Component.extend({tagName:"span",classNames:"auto-update-time",attributeBindings:["dataTimestamp:data-timestamp","title"],title:Ember.computed(function(){return this.get("moment").format()}),dataTimestamp:Ember.computed(function(){return this.get("timestamp")}),moment:Ember.computed(function(){return moment(this.get("timestamp"))}),time:Ember.computed("timestamp",function(){return(0,t.formatTime)(this.get("timestamp"))})})}),define("client-app/components/update-time",["exports","client-app/lib/utilities"],function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Component.extend({didInsertElement:function(){Em.run.later(function e(){Em.$(".auto-update-time").each(function(){var e=parseInt(this.getAttribute("data-timestamp"),10),n=(0,t.formatTime)(e)
@@ -102,14 +102,14 @@ case 3:return"error"
102
102
  case 4:return"fatal"}}),glyph:Ember.computed("severity",function(){switch(this.get("severity")){case 0:case 1:return""
103
103
  case 2:return"<i class='fa fa-exclamation-circle warning'></i>"
104
104
  case 3:return"<i class='fa fa-times-circle error'></i>"
105
- case 4:return"<i class='fa fa-times-circle fatal'></i>"}})})}),define("client-app/models/pattern-item",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Object.extend({isNew:!1,value:"",valueBuffer:"",error:null,saving:!1,init:function(){this._super.apply(this,arguments),this.set("valueBuffer",this.get("value"))},updateValue:function(e){this.setProperties({value:e,valueBuffer:e})},hasBuffer:Ember.computed("value","valueBuffer",function(){return this.get("value")!==this.get("valueBuffer")})})}),define("client-app/resolver",["exports","ember-resolver"],function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t.default})
105
+ case 4:return"<i class='fa fa-times-circle fatal'></i>"}})})}),define("client-app/models/pattern-item",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Object.extend({isNew:!1,value:"",valueBuffer:"",error:null,saving:!1,count:0,init:function(){this._super.apply(this,arguments),this.set("valueBuffer",this.get("value"))},updateValue:function(e){this.setProperties({value:e,valueBuffer:e})},hasBuffer:Ember.computed("value","valueBuffer",function(){return this.get("value")!==this.get("valueBuffer")}),zeroCount:Ember.computed("count",function(){return this.get("count")<=0})})}),define("client-app/resolver",["exports","ember-resolver"],function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=t.default})
106
106
  define("client-app/router",["exports","client-app/config/environment"],function(e,t){Object.defineProperty(e,"__esModule",{value:!0})
107
107
  var n=Ember.Router.extend({location:t.default.locationType,rootURL:t.default.rootURL})
108
108
  n.map(function(){this.route("index",{path:"/"}),this.route("show",{path:"/show/:id"}),this.route("settings")}),e.default=n}),define("client-app/routes/index",["exports","client-app/models/message-collection","client-app/lib/utilities"],function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Route.extend({model:function(){return t.default.create()},setupController:function(e,t){this._super(e,t),t.setProperties(e.getProperties("filter","search")),t.reload(),e.set("initialized",!0)
109
109
  var a=0,s=1
110
110
  this.refreshInterval=setInterval(function(){a+=1
111
111
  var e=(0,n.isHidden)(),i=!e
112
- e&&a%s==0&&(i=!0,s<20&&s++),i&&(t.loadMore(),e||(s=1))},3e3),this.events.on("panelResized",function(t){e.resizePanels(t)})},deactivate:function(){clearInterval(this.refreshInterval)}})}),define("client-app/routes/settings",["exports","client-app/lib/utilities"],function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Route.extend({model:function(){return(0,t.ajax)("/settings.json")},setupController:function(e,t){this._super.apply(this,arguments)
113
- var n=t.coded_patterns&&t.coded_patterns.length>0
114
- e.set("showCodedPatterns",n)}})}),define("client-app/routes/show",["exports","client-app/models/message","client-app/lib/utilities"],function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Route.extend({model:function(e){return(0,n.preloadOrAjax)("/show/"+e.id+".json")},setupController:function(e,n){this._super.apply(this,arguments),e.set("model",t.default.create(n))}})}),define("client-app/services/ajax",["exports","ember-ajax/services/ajax"],function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})}),define("client-app/templates/application",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"yOsrYpw5",block:'{"symbols":[],"statements":[[1,[21,"update-time"],false],[0,"\\n"],[1,[21,"outlet"],false],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/application.hbs"}})}),define("client-app/templates/components/actions-menu",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"ebB3+Z4x",block:'{"symbols":["&default"],"statements":[[4,"if",[[23,["actionsInMenu"]]],null,{"statements":[[4,"if",[[23,["showMenu"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","actions-menu"],[9],[0,"\\n "],[14,1],[0,"\\n "],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[7,"button"],[11,"class","expand btn no-text"],[3,"action",[[22,0,[]],"expandMenu"]],[9],[7,"i"],[11,"class","fa fa-ellipsis-h"],[9],[10],[10],[0,"\\n "],[7,"button"],[11,"class","share btn"],[3,"action",[[22,0,[]],"share"]],[9],[7,"i"],[11,"class","fa fa-share"],[9],[10],[7,"span"],[9],[0,"Share"],[10],[10],[0,"\\n"]],"parameters":[]},{"statements":[[0," "],[14,1],[0,"\\n "],[7,"button"],[11,"class","share btn"],[3,"action",[[22,0,[]],"share"]],[9],[7,"i"],[11,"class","fa fa-share"],[9],[10],[7,"span"],[9],[0,"Share"],[10],[10],[0,"\\n"]],"parameters":[]}]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/actions-menu.hbs"}})}),define("client-app/templates/components/env-tab",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"5078JpTW",block:'{"symbols":[],"statements":[[4,"if",[[23,["isEnvArray"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","nav-controls"],[9],[0,"\\n "],[7,"button"],[12,"disabled",[21,"disableBackButtons"]],[11,"class","btn nav-btn no-text"],[3,"action",[[22,0,[]],"bigJump","back"]],[9],[7,"i"],[11,"class","fa fa-fast-backward"],[9],[10],[10],[0,"\\n "],[7,"button"],[12,"disabled",[21,"disableBackButtons"]],[11,"class","btn nav-btn no-text"],[3,"action",[[22,0,[]],"takeStep","back"]],[9],[7,"i"],[11,"class","fa fa-backward"],[9],[10],[10],[0,"\\n "],[7,"span"],[11,"class","env-number"],[9],[1,[21,"current"],false],[0,"/"],[1,[23,["message","env","length"]],false],[10],[0,"\\n "],[7,"button"],[12,"disabled",[21,"disableForwardButtons"]],[11,"class","btn nav-btn no-text"],[3,"action",[[22,0,[]],"takeStep","front"]],[9],[7,"i"],[11,"class","fa fa-forward"],[9],[10],[10],[0,"\\n "],[7,"button"],[12,"disabled",[21,"disableForwardButtons"]],[11,"class","btn nav-btn no-text"],[3,"action",[[22,0,[]],"bigJump","front"]],[9],[7,"i"],[11,"class","fa fa-fast-forward"],[9],[10],[10],[0,"\\n "],[10],[0,"\\n"]],"parameters":[]},null],[1,[21,"html"],true],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/env-tab.hbs"}})}),define("client-app/templates/components/message-info",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"SK12lkYh",block:'{"symbols":["btn"],"statements":[[7,"div"],[11,"class","message-info"],[9],[0,"\\n"],[4,"tabbed-section",null,null,{"statements":[[4,"tab-contents",null,[["name","hint","currentMessage"],["info","show info",[23,["currentMessage"]]]],{"statements":[[4,"if",[[23,["showTitle"]]],null,{"statements":[[0," "],[7,"h3"],[9],[0,"Message\\n"],[4,"if",[[23,["currentMessage","showCount"]]],null,{"statements":[[0," ("],[1,[23,["currentMessage","count"]],false],[0," copies reported)\\n"]],"parameters":[]},null],[0," "],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[7,"pre"],[9],[1,[23,["currentMessage","message"]],false],[10],[0,""]],"parameters":[]},null],[4,"tab-contents",null,[["name","defaultTab","hint","currentMessage"],["backtrace","true","show backtrace",[23,["currentMessage"]]]],{"statements":[[4,"if",[[23,["showTitle"]]],null,{"statements":[[0," "],[7,"h3"],[9],[0,"Backtrace"],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[7,"pre"],[9],[1,[23,["currentMessage","backtrace"]],false],[10],[0,""]],"parameters":[]},null],[4,"if",[[23,["currentMessage","env"]]],null,{"statements":[[4,"tab-contents",null,[["className","name","hint","currentMessage"],["env","env","show environment",[23,["currentMessage"]]]],{"statements":[[4,"if",[[23,["showTitle"]]],null,{"statements":[[0," "],[7,"h3"],[9],[0,"Env"],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[1,[27,"env-tab",null,[["message"],[[23,["currentMessage"]]]]],false],[0,"\\n"]],"parameters":[]},null]],"parameters":[]},null]],"parameters":[]},null],[0,"\\n"],[4,"if",[[23,["currentMessage"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","message-actions"],[9],[0,"\\n"],[4,"actions-menu",null,[["actionsInMenu","share"],[[23,["actionsInMenu"]],[27,"action",[[22,0,[]],"share"],null]]],{"statements":[[4,"each",[[23,["buttons"]]],null,{"statements":[[0," "],[7,"button"],[12,"class",[28,[[22,1,["klass"]]," btn ",[27,"if",[[22,1,["danger"]],"danger",""],null]]]],[3,"action",[[22,0,[]],[22,1,["action"]]]],[9],[0,"\\n "],[7,"i"],[12,"class",[28,["fa fa-",[22,1,["icon"]]]]],[9],[10],[0,"\\n "],[7,"span"],[9],[1,[22,1,["label"]],false],[10],[0,"\\n "],[10],[0,"\\n"]],"parameters":[1]},null]],"parameters":[]},null],[0," "],[10],[0,"\\n"]],"parameters":[]},null],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/message-info.hbs"}})}),define("client-app/templates/components/message-row",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"pF0hQ9a+",block:'{"symbols":[],"statements":[[7,"div"],[11,"class","count"],[9],[0,"\\n"],[4,"if",[[23,["model","showCount"]]],null,{"statements":[[0," "],[1,[23,["model","count"]],false],[0,"\\n"]],"parameters":[]},null],[10],[0,"\\n"],[7,"div"],[11,"class","severity"],[9],[1,[23,["model","glyph"]],true],[10],[0,"\\n"],[7,"div"],[11,"class","message-body"],[9],[0,"\\n "],[1,[23,["model","displayMessage"]],false],[0,"\\n"],[10],[0,"\\n"],[7,"div"],[11,"class","protected"],[9],[0,"\\n"],[4,"if",[[23,["model","protected"]]],null,{"statements":[[0," "],[7,"i"],[11,"title","message is protected, clearing will not remove it"],[11,"class","fa fa-lock"],[9],[10],[0,"\\n"]],"parameters":[]},null],[10],[0,"\\n"],[7,"div"],[11,"class","time"],[9],[1,[27,"time-formatter",null,[["timestamp"],[[23,["model","timestamp"]]]]],false],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/message-row.hbs"}})}),define("client-app/templates/components/panel-resizer",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"FLUzT7ST",block:'{"symbols":[],"statements":[[7,"div"],[11,"class","line-1"],[9],[10],[0,"\\n"],[7,"div"],[11,"class","line-2"],[9],[10],[0,"\\n"],[7,"div"],[11,"class","line-3"],[9],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/panel-resizer.hbs"}})}),define("client-app/templates/components/patterns-list",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"5na0eBOC",block:'{"symbols":["pattern"],"statements":[[4,"if",[[23,["mutable"]]],null,{"statements":[[0," "],[7,"button"],[11,"class","btn new-pattern"],[3,"action",[[22,0,[]],"create"]],[9],[7,"i"],[11,"class","fa fa-plus"],[9],[10],[0," New"],[10],[0,"\\n"]],"parameters":[]},null],[4,"each",[[23,["allPatterns"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","pattern-wrapper"],[9],[0,"\\n "],[1,[27,"input",null,[["type","class","placeholder","value","disabled"],["textfield","pattern-input","Enter regular expression…",[22,1,["valueBuffer"]],[27,"or",[[23,["immutable"]],[22,1,["saving"]]],null]]]],false],[0,"\\n"],[4,"if",[[23,["mutable"]]],null,{"statements":[[4,"if",[[22,1,["hasBuffer"]]],null,{"statements":[[0," "],[7,"button"],[12,"disabled",[22,1,["saving"]]],[11,"class","btn ok no-text save"],[3,"action",[[22,0,[]],"save",[22,1,[]]]],[9],[7,"i"],[11,"class","fa fa-check"],[9],[10],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[7,"button"],[12,"disabled",[22,1,["saving"]]],[11,"class","btn no-text trash"],[3,"action",[[22,0,[]],"trash",[22,1,[]]]],[9],[7,"i"],[11,"class","fa fa-trash"],[9],[10],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[10],[4,"if",[[22,1,["error"]]],null,{"statements":[[7,"pre"],[11,"class","api-error"],[9],[1,[22,1,["error"]],false],[10]],"parameters":[]},null]],"parameters":[1]},null]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/patterns-list.hbs"}})}),define("client-app/templates/components/tabbed-section",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"nreTgL17",block:'{"symbols":["tab","&default"],"statements":[[14,2],[0,"\\n"],[7,"ul"],[11,"class","tabs"],[9],[0,"\\n"],[4,"each",[[23,["tabs"]]],null,{"statements":[[0," "],[7,"li"],[9],[0,"\\n "],[7,"a"],[12,"title",[28,[[27,"unbound",[[22,1,["hint"]]],null]]]],[11,"href","#"],[12,"class",[28,[[27,"if",[[22,1,["active"]],"active"],null]]]],[3,"action",[[22,0,[]],[23,["selectTab"]],[22,1,[]]]],[9],[0,"\\n "],[1,[27,"unbound",[[22,1,["name"]]],null],false],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n"]],"parameters":[1]},null],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/tabbed-section.hbs"}})}),define("client-app/templates/components/time-formatter",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"sp53cTcH",block:'{"symbols":[],"statements":[[1,[21,"time"],false],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/time-formatter.hbs"}})}),define("client-app/templates/index",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"kvEL01NO",block:'{"symbols":["message"],"statements":[[7,"div"],[11,"id","top-panel"],[9],[0,"\\n "],[7,"div"],[11,"id","log-table"],[9],[0,"\\n"],[4,"if",[[23,["model","moreBefore"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","show-more"],[3,"action",[[22,0,[]],"showMoreBefore"]],[9],[0,"\\n"],[4,"if",[[23,["model","hideCountInLoadMore"]]],null,{"statements":[[0," Load more\\n"]],"parameters":[]},{"statements":[[0," Select to see "],[1,[23,["model","totalBefore"]],false],[0," more\\n"]],"parameters":[]}],[0," "],[10],[0,"\\n"]],"parameters":[]},null],[4,"each",[[23,["model","messages"]]],null,{"statements":[[0," "],[1,[27,"message-row",null,[["model","selectedMessage"],[[22,1,[]],[27,"action",[[22,0,[]],"selectMessage"],null]]]],false],[0,"\\n"]],"parameters":[1]},null],[0," "],[10],[0,"\\n"],[10],[0,"\\n"],[7,"div"],[11,"id","bottom-panel"],[9],[0,"\\n "],[1,[27,"message-info",null,[["currentMessage","removeMessage","solveMessage","actionsInMenu"],[[23,["currentMessage"]],[27,"action",[[22,0,[]],"removeMessage"],null],[27,"action",[[22,0,[]],"solveMessage"],null],[23,["actionsInMenu"]]]]],false],[0,"\\n\\n "],[7,"div"],[11,"class","action-panel"],[9],[0,"\\n "],[7,"div"],[11,"class","severity-filters"],[9],[0,"\\n "],[7,"div"],[11,"class","more-wrapping"],[9],[0,"\\n "],[7,"label"],[11,"class","debug"],[9],[0,"\\n "],[1,[27,"input",null,[["type","checked"],["checkbox",[23,["showDebug"]]]]],false],[0,"\\n "],[7,"span"],[9],[0,"Debug"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","info"],[9],[0,"\\n "],[1,[27,"input",null,[["type","checked"],["checkbox",[23,["showInfo"]]]]],false],[0,"\\n "],[7,"span"],[9],[0,"Info"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","warn"],[9],[0,"\\n "],[1,[27,"input",null,[["type","checked"],["checkbox",[23,["showWarn"]]]]],false],[0,"\\n "],[7,"i"],[11,"class","fa fa-exclamation-circle warning"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Warning"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","error"],[9],[0,"\\n "],[1,[27,"input",null,[["type","checked"],["checkbox",[23,["showErr"]]]]],false],[0,"\\n "],[7,"i"],[11,"class","fa fa-times-circle error"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Error"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","fatal"],[9],[0,"\\n "],[1,[27,"input",null,[["type","checked"],["checkbox",[23,["showFatal"]]]]],false],[0,"\\n "],[7,"i"],[11,"class","fa fa-times-circle fatal"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Fatal"],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[7,"div"],[11,"class","search-clear-all"],[9],[0,"\\n "],[1,[27,"input",null,[["type","class","placeholder","value"],["textfield","search","Search",[23,["search"]]]]],false],[0,"\\n "],[7,"div"],[11,"class","footer-btns"],[9],[0,"\\n"],[4,"if",[[23,["showSettings"]]],null,{"statements":[[4,"link-to",["settings"],[["class"],["settings btn no-text"]],{"statements":[[0," "],[7,"i"],[11,"class","fa fa-cog"],[9],[10],[0,"\\n"]],"parameters":[]},null]],"parameters":[]},null],[0," "],[7,"button"],[11,"class","clear btn danger"],[3,"action",[[22,0,[]],"clear"]],[9],[7,"i"],[11,"class","fa fa-trash-o"],[9],[10],[7,"span"],[9],[0,"Clear logs"],[10],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n"],[10],[0,"\\n"],[1,[21,"panel-resizer"],false],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/index.hbs"}})}),define("client-app/templates/settings",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"ARVjebWt",block:'{"symbols":[],"statements":[[7,"div"],[11,"class","settings-page"],[9],[0,"\\n "],[4,"link-to",["index"],null,{"statements":[[0,"Home"]],"parameters":[]},null],[0,"\\n "],[7,"div"],[11,"class","settings-header"],[9],[0,"\\n "],[7,"h1"],[11,"class","header-title"],[9],[0,"Settings"],[10],[0,"\\n "],[7,"img"],[11,"class","header-logo"],[12,"src",[27,"logster-url",["images/icon_144x144.png"],null]],[9],[10],[0,"\\n "],[10],[0,"\\n\\n "],[7,"div"],[11,"class","settings-section suppression-patterns"],[9],[0,"\\n "],[7,"h2"],[11,"class","section-title"],[9],[0,"Suppression Patterns"],[10],[0,"\\n "],[7,"div"],[9],[0,"New messages that match these Regular Expression patterns will be suppressed."],[10],[0,"\\n\\n"],[4,"if",[[23,["showCodedPatterns"]]],null,{"statements":[[0," "],[7,"h3"],[11,"class","subsection-title"],[9],[0,"Hard-coded patterns:"],[10],[0,"\\n "],[7,"div"],[11,"class","tip"],[9],[0,"These patterns can\'t be removed via the UI because they are commited to the source code of your app."],[10],[0,"\\n "],[1,[27,"patterns-list",null,[["patterns","mutable"],[[23,["model","coded_patterns"]],false]]],false],[0,"\\n"]],"parameters":[]},null],[0,"\\n "],[7,"h3"],[11,"class","subsection-title"],[9],[0,"Custom patterns:"],[10],[0,"\\n "],[1,[27,"patterns-list",null,[["patterns","key","mutable"],[[23,["model","custom_patterns"]],"suppression",true]]],false],[0,"\\n "],[10],[0,"\\n"],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/settings.hbs"}})}),define("client-app/templates/show",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"V916vpg9",block:'{"symbols":[],"statements":[[4,"link-to",["index"],null,{"statements":[[0,"Recent"]],"parameters":[]},null],[0,"\\n"],[7,"div"],[11,"id","bottom-panel"],[11,"class","full"],[9],[0,"\\n "],[1,[27,"message-info",null,[["currentMessage","showTitle","actionsInMenu"],[[23,["model"]],"true",false]]],false],[0,"\\n"],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/show.hbs"}})}),define("client-app/config/environment",[],function(){try{var e="client-app/config/environment",t=document.querySelector('meta[name="'+e+'"]').getAttribute("content"),n={default:JSON.parse(unescape(t))}
115
- return Object.defineProperty(n,"__esModule",{value:!0}),n}catch(a){throw new Error('Could not read config from meta tag with name "'+e+'".')}}),runningTests||require("client-app/app").default.create({name:"client-app",version:"0.0.0+f505f3d6"})
112
+ e&&a%s==0&&(i=!0,s<20&&s++),i&&(t.loadMore(),e||(s=1))},3e3),this.events.on("panelResized",function(t){e.resizePanels(t)})},deactivate:function(){clearInterval(this.refreshInterval)}})}),define("client-app/routes/settings",["exports","client-app/lib/utilities","client-app/models/pattern-item"],function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Route.extend({model:function(){return(0,t.ajax)("/settings.json")},setupController:function(e,t){this._super.apply(this,arguments)
113
+ var a=t.suppression,s=a.filter(function(e){return e.hard}).map(function(e){return n.default.create(e)}),i=a.reject(function(e){return e.hard}).map(function(e){return n.default.create(e)}),r=s.length>0
114
+ e.setProperties({showCodedSuppression:r,codedSuppression:s,customSuppression:i})}})}),define("client-app/routes/show",["exports","client-app/models/message","client-app/lib/utilities"],function(e,t,n){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.Route.extend({model:function(e){return(0,n.preloadOrAjax)("/show/"+e.id+".json")},setupController:function(e,n){this._super.apply(this,arguments),e.set("model",t.default.create(n))}})}),define("client-app/services/ajax",["exports","ember-ajax/services/ajax"],function(e,t){Object.defineProperty(e,"__esModule",{value:!0}),Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})}),define("client-app/templates/application",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"yOsrYpw5",block:'{"symbols":[],"statements":[[1,[21,"update-time"],false],[0,"\\n"],[1,[21,"outlet"],false],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/application.hbs"}})}),define("client-app/templates/components/actions-menu",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"ebB3+Z4x",block:'{"symbols":["&default"],"statements":[[4,"if",[[23,["actionsInMenu"]]],null,{"statements":[[4,"if",[[23,["showMenu"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","actions-menu"],[9],[0,"\\n "],[14,1],[0,"\\n "],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[7,"button"],[11,"class","expand btn no-text"],[3,"action",[[22,0,[]],"expandMenu"]],[9],[7,"i"],[11,"class","fa fa-ellipsis-h"],[9],[10],[10],[0,"\\n "],[7,"button"],[11,"class","share btn"],[3,"action",[[22,0,[]],"share"]],[9],[7,"i"],[11,"class","fa fa-share"],[9],[10],[7,"span"],[9],[0,"Share"],[10],[10],[0,"\\n"]],"parameters":[]},{"statements":[[0," "],[14,1],[0,"\\n "],[7,"button"],[11,"class","share btn"],[3,"action",[[22,0,[]],"share"]],[9],[7,"i"],[11,"class","fa fa-share"],[9],[10],[7,"span"],[9],[0,"Share"],[10],[10],[0,"\\n"]],"parameters":[]}]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/actions-menu.hbs"}})}),define("client-app/templates/components/env-tab",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"5078JpTW",block:'{"symbols":[],"statements":[[4,"if",[[23,["isEnvArray"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","nav-controls"],[9],[0,"\\n "],[7,"button"],[12,"disabled",[21,"disableBackButtons"]],[11,"class","btn nav-btn no-text"],[3,"action",[[22,0,[]],"bigJump","back"]],[9],[7,"i"],[11,"class","fa fa-fast-backward"],[9],[10],[10],[0,"\\n "],[7,"button"],[12,"disabled",[21,"disableBackButtons"]],[11,"class","btn nav-btn no-text"],[3,"action",[[22,0,[]],"takeStep","back"]],[9],[7,"i"],[11,"class","fa fa-backward"],[9],[10],[10],[0,"\\n "],[7,"span"],[11,"class","env-number"],[9],[1,[21,"current"],false],[0,"/"],[1,[23,["message","env","length"]],false],[10],[0,"\\n "],[7,"button"],[12,"disabled",[21,"disableForwardButtons"]],[11,"class","btn nav-btn no-text"],[3,"action",[[22,0,[]],"takeStep","front"]],[9],[7,"i"],[11,"class","fa fa-forward"],[9],[10],[10],[0,"\\n "],[7,"button"],[12,"disabled",[21,"disableForwardButtons"]],[11,"class","btn nav-btn no-text"],[3,"action",[[22,0,[]],"bigJump","front"]],[9],[7,"i"],[11,"class","fa fa-fast-forward"],[9],[10],[10],[0,"\\n "],[10],[0,"\\n"]],"parameters":[]},null],[1,[21,"html"],true],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/env-tab.hbs"}})}),define("client-app/templates/components/message-info",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"SK12lkYh",block:'{"symbols":["btn"],"statements":[[7,"div"],[11,"class","message-info"],[9],[0,"\\n"],[4,"tabbed-section",null,null,{"statements":[[4,"tab-contents",null,[["name","hint","currentMessage"],["info","show info",[23,["currentMessage"]]]],{"statements":[[4,"if",[[23,["showTitle"]]],null,{"statements":[[0," "],[7,"h3"],[9],[0,"Message\\n"],[4,"if",[[23,["currentMessage","showCount"]]],null,{"statements":[[0," ("],[1,[23,["currentMessage","count"]],false],[0," copies reported)\\n"]],"parameters":[]},null],[0," "],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[7,"pre"],[9],[1,[23,["currentMessage","message"]],false],[10],[0,""]],"parameters":[]},null],[4,"tab-contents",null,[["name","defaultTab","hint","currentMessage"],["backtrace","true","show backtrace",[23,["currentMessage"]]]],{"statements":[[4,"if",[[23,["showTitle"]]],null,{"statements":[[0," "],[7,"h3"],[9],[0,"Backtrace"],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[7,"pre"],[9],[1,[23,["currentMessage","backtrace"]],false],[10],[0,""]],"parameters":[]},null],[4,"if",[[23,["currentMessage","env"]]],null,{"statements":[[4,"tab-contents",null,[["className","name","hint","currentMessage"],["env","env","show environment",[23,["currentMessage"]]]],{"statements":[[4,"if",[[23,["showTitle"]]],null,{"statements":[[0," "],[7,"h3"],[9],[0,"Env"],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[1,[27,"env-tab",null,[["message"],[[23,["currentMessage"]]]]],false],[0,"\\n"]],"parameters":[]},null]],"parameters":[]},null]],"parameters":[]},null],[0,"\\n"],[4,"if",[[23,["currentMessage"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","message-actions"],[9],[0,"\\n"],[4,"actions-menu",null,[["actionsInMenu","share"],[[23,["actionsInMenu"]],[27,"action",[[22,0,[]],"share"],null]]],{"statements":[[4,"each",[[23,["buttons"]]],null,{"statements":[[0," "],[7,"button"],[12,"class",[28,[[22,1,["klass"]]," btn ",[27,"if",[[22,1,["danger"]],"danger",""],null]]]],[3,"action",[[22,0,[]],[22,1,["action"]]]],[9],[0,"\\n "],[7,"i"],[12,"class",[28,["fa fa-",[22,1,["icon"]]]]],[9],[10],[0,"\\n "],[7,"span"],[9],[1,[22,1,["label"]],false],[10],[0,"\\n "],[10],[0,"\\n"]],"parameters":[1]},null]],"parameters":[]},null],[0," "],[10],[0,"\\n"]],"parameters":[]},null],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/message-info.hbs"}})}),define("client-app/templates/components/message-row",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"pF0hQ9a+",block:'{"symbols":[],"statements":[[7,"div"],[11,"class","count"],[9],[0,"\\n"],[4,"if",[[23,["model","showCount"]]],null,{"statements":[[0," "],[1,[23,["model","count"]],false],[0,"\\n"]],"parameters":[]},null],[10],[0,"\\n"],[7,"div"],[11,"class","severity"],[9],[1,[23,["model","glyph"]],true],[10],[0,"\\n"],[7,"div"],[11,"class","message-body"],[9],[0,"\\n "],[1,[23,["model","displayMessage"]],false],[0,"\\n"],[10],[0,"\\n"],[7,"div"],[11,"class","protected"],[9],[0,"\\n"],[4,"if",[[23,["model","protected"]]],null,{"statements":[[0," "],[7,"i"],[11,"title","message is protected, clearing will not remove it"],[11,"class","fa fa-lock"],[9],[10],[0,"\\n"]],"parameters":[]},null],[10],[0,"\\n"],[7,"div"],[11,"class","time"],[9],[1,[27,"time-formatter",null,[["timestamp"],[[23,["model","timestamp"]]]]],false],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/message-row.hbs"}})}),define("client-app/templates/components/panel-resizer",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"FLUzT7ST",block:'{"symbols":[],"statements":[[7,"div"],[11,"class","line-1"],[9],[10],[0,"\\n"],[7,"div"],[11,"class","line-2"],[9],[10],[0,"\\n"],[7,"div"],[11,"class","line-3"],[9],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/panel-resizer.hbs"}})}),define("client-app/templates/components/patterns-list",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"Q0F+8jT0",block:'{"symbols":["pattern"],"statements":[[4,"if",[[23,["mutable"]]],null,{"statements":[[0," "],[7,"button"],[11,"class","btn new-pattern"],[3,"action",[[22,0,[]],"create"]],[9],[7,"i"],[11,"class","fa fa-plus"],[9],[10],[0," New"],[10],[0,"\\n"]],"parameters":[]},null],[4,"each",[[23,["allPatterns"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","pattern-wrapper"],[9],[0,"\\n "],[1,[27,"input",null,[["type","class","placeholder","value","disabled"],["textfield","pattern-input","Enter regular expression…",[22,1,["valueBuffer"]],[27,"or",[[23,["immutable"]],[22,1,["saving"]]],null]]]],false],[0,"\\n"],[4,"if",[[23,["mutable"]]],null,{"statements":[[4,"if",[[22,1,["hasBuffer"]]],null,{"statements":[[0," "],[7,"button"],[12,"disabled",[22,1,["saving"]]],[11,"class","btn ok no-text save shrink"],[3,"action",[[22,0,[]],"save",[22,1,[]]]],[9],[0,"\\n "],[7,"i"],[11,"class","fa fa-check"],[9],[10],[0,"\\n "],[10],[0,"\\n"]],"parameters":[]},null],[0," "],[7,"button"],[12,"disabled",[22,1,["saving"]]],[11,"class","btn no-text trash shrink"],[3,"action",[[22,0,[]],"trash",[22,1,[]]]],[9],[0,"\\n "],[7,"i"],[11,"class","fa fa-trash"],[9],[10],[0,"\\n "],[10],[0,"\\n"]],"parameters":[]},null],[0,"\\n "],[7,"input"],[11,"disabled","true"],[11,"title","Number of logs that have been suppressed by this pattern"],[11,"class","count shrink"],[12,"value",[22,1,["count"]]],[9],[10],[0,"\\n "],[7,"button"],[11,"class","btn no-text reset shrink"],[11,"title","Reset count of suppressed logs"],[12,"disabled",[22,1,["zeroCount"]]],[3,"action",[[22,0,[]],"resetCount",[22,1,[]]]],[9],[0,"\\n "],[7,"i"],[11,"class","fa fa-rotate-right"],[9],[10],[0,"\\n "],[10],[0,"\\n "],[10],[4,"if",[[22,1,["error"]]],null,{"statements":[[7,"pre"],[11,"class","api-error"],[9],[1,[22,1,["error"]],false],[10]],"parameters":[]},null]],"parameters":[1]},null]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/patterns-list.hbs"}})}),define("client-app/templates/components/tabbed-section",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"nreTgL17",block:'{"symbols":["tab","&default"],"statements":[[14,2],[0,"\\n"],[7,"ul"],[11,"class","tabs"],[9],[0,"\\n"],[4,"each",[[23,["tabs"]]],null,{"statements":[[0," "],[7,"li"],[9],[0,"\\n "],[7,"a"],[12,"title",[28,[[27,"unbound",[[22,1,["hint"]]],null]]]],[11,"href","#"],[12,"class",[28,[[27,"if",[[22,1,["active"]],"active"],null]]]],[3,"action",[[22,0,[]],[23,["selectTab"]],[22,1,[]]]],[9],[0,"\\n "],[1,[27,"unbound",[[22,1,["name"]]],null],false],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n"]],"parameters":[1]},null],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/tabbed-section.hbs"}})}),define("client-app/templates/components/time-formatter",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"sp53cTcH",block:'{"symbols":[],"statements":[[1,[21,"time"],false],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/components/time-formatter.hbs"}})}),define("client-app/templates/index",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"kvEL01NO",block:'{"symbols":["message"],"statements":[[7,"div"],[11,"id","top-panel"],[9],[0,"\\n "],[7,"div"],[11,"id","log-table"],[9],[0,"\\n"],[4,"if",[[23,["model","moreBefore"]]],null,{"statements":[[0," "],[7,"div"],[11,"class","show-more"],[3,"action",[[22,0,[]],"showMoreBefore"]],[9],[0,"\\n"],[4,"if",[[23,["model","hideCountInLoadMore"]]],null,{"statements":[[0," Load more\\n"]],"parameters":[]},{"statements":[[0," Select to see "],[1,[23,["model","totalBefore"]],false],[0," more\\n"]],"parameters":[]}],[0," "],[10],[0,"\\n"]],"parameters":[]},null],[4,"each",[[23,["model","messages"]]],null,{"statements":[[0," "],[1,[27,"message-row",null,[["model","selectedMessage"],[[22,1,[]],[27,"action",[[22,0,[]],"selectMessage"],null]]]],false],[0,"\\n"]],"parameters":[1]},null],[0," "],[10],[0,"\\n"],[10],[0,"\\n"],[7,"div"],[11,"id","bottom-panel"],[9],[0,"\\n "],[1,[27,"message-info",null,[["currentMessage","removeMessage","solveMessage","actionsInMenu"],[[23,["currentMessage"]],[27,"action",[[22,0,[]],"removeMessage"],null],[27,"action",[[22,0,[]],"solveMessage"],null],[23,["actionsInMenu"]]]]],false],[0,"\\n\\n "],[7,"div"],[11,"class","action-panel"],[9],[0,"\\n "],[7,"div"],[11,"class","severity-filters"],[9],[0,"\\n "],[7,"div"],[11,"class","more-wrapping"],[9],[0,"\\n "],[7,"label"],[11,"class","debug"],[9],[0,"\\n "],[1,[27,"input",null,[["type","checked"],["checkbox",[23,["showDebug"]]]]],false],[0,"\\n "],[7,"span"],[9],[0,"Debug"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","info"],[9],[0,"\\n "],[1,[27,"input",null,[["type","checked"],["checkbox",[23,["showInfo"]]]]],false],[0,"\\n "],[7,"span"],[9],[0,"Info"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","warn"],[9],[0,"\\n "],[1,[27,"input",null,[["type","checked"],["checkbox",[23,["showWarn"]]]]],false],[0,"\\n "],[7,"i"],[11,"class","fa fa-exclamation-circle warning"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Warning"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","error"],[9],[0,"\\n "],[1,[27,"input",null,[["type","checked"],["checkbox",[23,["showErr"]]]]],false],[0,"\\n "],[7,"i"],[11,"class","fa fa-times-circle error"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Error"],[10],[0,"\\n "],[10],[0,"\\n "],[7,"label"],[11,"class","fatal"],[9],[0,"\\n "],[1,[27,"input",null,[["type","checked"],["checkbox",[23,["showFatal"]]]]],false],[0,"\\n "],[7,"i"],[11,"class","fa fa-times-circle fatal"],[9],[10],[0,"\\n "],[7,"span"],[9],[0,"Fatal"],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[7,"div"],[11,"class","search-clear-all"],[9],[0,"\\n "],[1,[27,"input",null,[["type","class","placeholder","value"],["textfield","search","Search",[23,["search"]]]]],false],[0,"\\n "],[7,"div"],[11,"class","footer-btns"],[9],[0,"\\n"],[4,"if",[[23,["showSettings"]]],null,{"statements":[[4,"link-to",["settings"],[["class"],["settings btn no-text"]],{"statements":[[0," "],[7,"i"],[11,"class","fa fa-cog"],[9],[10],[0,"\\n"]],"parameters":[]},null]],"parameters":[]},null],[0," "],[7,"button"],[11,"class","clear btn danger"],[3,"action",[[22,0,[]],"clear"]],[9],[7,"i"],[11,"class","fa fa-trash-o"],[9],[10],[7,"span"],[9],[0,"Clear logs"],[10],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n "],[10],[0,"\\n"],[10],[0,"\\n"],[1,[21,"panel-resizer"],false],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/index.hbs"}})}),define("client-app/templates/settings",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"K64jJk76",block:'{"symbols":[],"statements":[[7,"div"],[11,"class","settings-page"],[9],[0,"\\n "],[4,"link-to",["index"],null,{"statements":[[0,"Home"]],"parameters":[]},null],[0,"\\n "],[7,"div"],[11,"class","settings-header"],[9],[0,"\\n "],[7,"h1"],[11,"class","header-title"],[9],[0,"Settings"],[10],[0,"\\n "],[7,"img"],[11,"class","header-logo"],[12,"src",[27,"logster-url",["images/icon_144x144.png"],null]],[9],[10],[0,"\\n "],[10],[0,"\\n\\n "],[7,"div"],[11,"class","settings-section suppression-patterns"],[9],[0,"\\n "],[7,"h2"],[11,"class","section-title"],[9],[0,"Suppression Patterns"],[10],[0,"\\n "],[7,"div"],[9],[0,"New messages that match these Regular Expression patterns will be suppressed."],[10],[0,"\\n\\n"],[4,"if",[[23,["showCodedSuppression"]]],null,{"statements":[[0," "],[7,"h3"],[11,"class","subsection-title"],[9],[0,"Hard-coded patterns:"],[10],[0,"\\n "],[7,"div"],[11,"class","tip"],[9],[0,"These patterns can\'t be removed via the UI because they are commited to the source code of your app."],[10],[0,"\\n "],[1,[27,"patterns-list",null,[["patterns","mutable"],[[23,["codedSuppression"]],false]]],false],[0,"\\n"]],"parameters":[]},null],[0,"\\n "],[7,"h3"],[11,"class","subsection-title"],[9],[0,"Custom patterns:"],[10],[0,"\\n "],[1,[27,"patterns-list",null,[["patterns","key","mutable"],[[23,["customSuppression"]],"suppression",true]]],false],[0,"\\n "],[10],[0,"\\n"],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/settings.hbs"}})}),define("client-app/templates/show",["exports"],function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=Ember.HTMLBars.template({id:"V916vpg9",block:'{"symbols":[],"statements":[[4,"link-to",["index"],null,{"statements":[[0,"Recent"]],"parameters":[]},null],[0,"\\n"],[7,"div"],[11,"id","bottom-panel"],[11,"class","full"],[9],[0,"\\n "],[1,[27,"message-info",null,[["currentMessage","showTitle","actionsInMenu"],[[23,["model"]],"true",false]]],false],[0,"\\n"],[10],[0,"\\n"]],"hasEval":false}',meta:{moduleName:"client-app/templates/show.hbs"}})}),define("client-app/config/environment",[],function(){try{var e="client-app/config/environment",t=document.querySelector('meta[name="'+e+'"]').getAttribute("content"),n={default:JSON.parse(unescape(t))}
115
+ return Object.defineProperty(n,"__esModule",{value:!0}),n}catch(a){throw new Error('Could not read config from meta tag with name "'+e+'".')}}),runningTests||require("client-app/app").default.create({name:"client-app",version:"0.0.0+e86a8e78"})
@@ -1 +1 @@
1
- .divider,.message-info{border-bottom:1px solid #ddd}body{font-family:Arial,"Liberation Sans","DejaVu Sans",sans-serif;font-size:12px}body.mobile,body.mobile .message{font-size:14px}pre{font-family:"Roboto Mono",Consolas,Monaco,Ubuntu Mono,monospace}table.env-table tbody tr td{border-top:none;line-height:18px;height:18px;vertical-align:top}table.env-table,table.env-table table{border-spacing:0;border-collapse:collapse}table.env-table td{padding-right:5px}tbody tr{width:98%}.message-row{font-family:Roboto;display:flex}.pattern-wrapper .pattern-input,.settings-section .api-error{font-family:Consolas,"Roboto Mono",Monaco,Ubuntu Mono,monospace}.message-row .protected,.message-row .severity{text-align:center;width:25px;flex-grow:0;flex-shrink:0;font-size:12px}.message-row div{border-top:.5px #e9e9e9 solid;padding-top:1px;padding-bottom:1px;line-height:25px}.message-row .count{width:30px;flex-grow:0;flex-shrink:0;padding-right:4px;box-sizing:border-box;font-size:11px;font-weight:700;text-align:right}.message-row .message-body{flex-grow:1;flex-shrink:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:13px}.message-row .time{flex-grow:0;flex-shrink:0;color:#999;vertical-align:top;font-size:12px;padding-right:8px}.action-panel .search,.action-panel i.fa,.btn .fa,.btn span,.pattern-wrapper .btn,.search-clear-all .clear,input,label span{vertical-align:middle}.message-row:hover{background-color:#f8f8f8;cursor:pointer}.message-row.selected{background-color:#dfdfdf}i.fatal{color:#e00}i.error{color:#900}i.warning{color:#feb800}.debug{color:#777}.btn,.tabs a{text-decoration:none;color:#333}.action-panel .search{border:1px solid #ddd;padding:3px;box-sizing:border-box}#log-table .show-more{text-align:center;height:30px;line-height:30px;text-decoration:none;background-color:#ddd;cursor:pointer;margin-top:8px}#overlay,.divider{cursor:row-resize}#bottom-panel{position:fixed;bottom:0;left:0;right:0;height:300px;background-color:#f1f1f1;padding:0 8px 8px;z-index:2}#bottom-panel.full{position:static;background-color:inherit;height:90%}#bottom-panel.full>div{padding-bottom:40px}#bottom-panel.full .tabs{display:none}#bottom-panel.full .message-info{position:static}#bottom-panel.full .message-info .content{display:block;position:static}#bottom-panel.full button.delete,.hidden{display:none}#bottom-panel.full .save,#bottom-panel.full .share{bottom:10px}#bottom-panel.full .message-actions button{margin-top:8px}#bottom-panel.full .message-actions{position:fixed;height:40px;width:100%;left:0;bottom:0;background-color:#eee;border-top:1px solid #dfdfdf;padding-left:10px}.divider,.tabs{border-top:1px solid #ddd}.message-actions{position:absolute;bottom:5px;right:0;margin-right:10px}.message-actions button{margin-left:5px}.divider{position:fixed;bottom:310px;left:0;right:0;height:15px;background-color:#fafafa}.divider div{margin:auto;width:24px;height:1px;background-color:#ccc;position:relative}.divider .line-1{top:5px}.divider .line-2{top:6px}.divider .line-3{top:7px}#top-panel{position:fixed;top:0;left:0;right:0;bottom:320px;overflow:auto}.action-panel,.message-info{position:absolute;left:0;right:0}.message-info{top:0}.action-panel{bottom:0;font-weight:700}.action-panel input{margin:0}.severity-filters label{margin-right:18px}.search-clear-all .clear{float:right}#log-table{margin:auto;width:99%}.message-info .env-table,.message-info pre{position:relative;margin:5px 10px 10px}#overlay{position:fixed;z-index:99999;top:0;bottom:0;left:0;right:0;opacity:0}.message-info .content,.tabs{position:absolute;left:0;right:0}.message-info .content{top:0;bottom:35px;overflow:auto;display:none}.message-info .content.active{display:block}.tabs{bottom:13px;list-style-type:none;margin:0 0 5px;padding:0 0 0 10px}.tabs a,.tabs li{position:relative}.tabs li{float:left;padding-right:5px;margin:0}.tabs a{top:6px;border:1px solid #ddd;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:6px;background-color:#e1e1e1}.tabs a.active{border-top:1px solid #f1f1f1;background-color:#f1f1f1}.btn{display:inline-block;margin:0;padding:5px 12px;font-size:1em;line-height:0;text-align:center;cursor:pointer;transition:all .25s;background-color:#ddd;border:none;font-weight:400}.btn:hover{color:#000;background-color:#ccc}.btn .fa{margin-right:7px}.btn:active{text-shadow:none}.btn.danger:hover{background-color:#c63c1b;color:#eee}.btn.ok{background-color:#3781dc;color:#fff}.btn.ok:hover{background-color:#286dc2;color:#fff}.search-clear-all .clear,.search-clear-all .search{height:100%}.search-clear-all .clear,.search-clear-all .search,.severity-filters label{align-self:center}.search-clear-all .footer-btns .settings{margin:0 7px}.search-clear-all{display:flex;justify-content:space-between}.search-clear-all .search{min-width:0;flex-shrink:2}.footer-btns{flex-grow:0;flex-shrink:0}@media (min-width:770px){.search-clear-all,.severity-filters{height:100%}.more-wrapping,.severity-filters{display:flex}.severity-filters{float:left}.action-panel{padding:10px;box-sizing:border-box;height:42px}.message-info{bottom:42px}}@media (max-width:770px){.severity-filters{padding:10px}.search-clear-all{padding:0 10px 10px}.action-panel{height:69px}.message-info{bottom:69px}}@media (max-width:430px){.severity-filters{overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.more-wrapping:after,.more-wrapping:before{content:"";position:absolute;height:18px}.more-wrapping:before{width:15px;margin-left:-10px;background:linear-gradient(to right,#f1f1f1 0,rgba(241,241,241,.001) 100%)}.more-wrapping:after{right:0;width:23px;background:linear-gradient(to left,#f1f1f1 0,rgba(241,241,241,.001) 100%)}}.btn.no-text .fa{margin:0}.btn[disabled]{opacity:.5}.actions-menu{position:absolute;background:#fafafa;display:inline-flex;flex-direction:column;bottom:27px;right:45px;width:115px;padding:5px 5px 0;box-shadow:0 4px 14px rgba(0,0,0,.15);z-index:3}.actions-menu button{margin:0 0 5px;height:27px}.nav-controls{padding:10px}#bottom-panel:not(.full) .nav-controls{position:sticky;position:-webkit-sticky;position:-moz-sticky;position:-ms-sticky;position:-o-sticky;top:0;background:#f1f1f1;z-index:1;border-bottom:1px solid #ddd}.env-number{margin:0 7px}.expand-list{text-decoration:underline;color:#00f;cursor:pointer}.settings-page{max-width:1110px;margin-right:auto;margin-left:auto;font-size:15px;padding:0 10px}.settings-header{display:flex;align-items:center;margin-bottom:5px}.settings-header .header-title{flex-grow:1}.settings-header .header-logo{width:50px;height:50px}.settings-section{border-top:1px solid #ddd;padding-top:15px}.settings-section .section-title{margin-top:0}.settings-section .subsection-title{margin-bottom:10px}.settings-section .tip{font-style:italic;font-size:13px;color:grey}.settings-section .pattern-wrapper{margin-top:10px;font-size:16px;display:flex;height:33px}.settings-section .api-error{margin-top:5px;color:red}.pattern-wrapper .pattern-input{width:600px;font-size:inherit;padding:5px 0;height:100%;box-sizing:border-box;vertical-align:middle;flex-grow:1;flex-shrink:1}.btn.new-pattern{height:100%;line-height:18px}.pattern-wrapper .btn{height:100%;box-sizing:border-box;flex-grow:0;flex-shrink:0;margin-left:10px}
1
+ .divider,.message-info{border-bottom:1px solid #ddd}body{font-family:Arial,"Liberation Sans","DejaVu Sans",sans-serif;font-size:12px}body.mobile,body.mobile .message{font-size:14px}pre{font-family:"Roboto Mono",Consolas,Monaco,Ubuntu Mono,monospace}table.env-table tbody tr td{border-top:none;line-height:18px;height:18px;vertical-align:top}table.env-table,table.env-table table{border-spacing:0;border-collapse:collapse}table.env-table td{padding-right:5px}tbody tr{width:98%}.message-row{font-family:Roboto;display:flex}.pattern-wrapper .pattern-input,.settings-section .api-error{font-family:Consolas,"Roboto Mono",Monaco,Ubuntu Mono,monospace}.message-row .protected,.message-row .severity{text-align:center;width:25px;flex-grow:0;flex-shrink:0;font-size:12px}.message-row div{border-top:.5px #e9e9e9 solid;padding-top:1px;padding-bottom:1px;line-height:25px}.message-row .count{width:30px;flex-grow:0;flex-shrink:0;padding-right:4px;box-sizing:border-box;font-size:11px;font-weight:700;text-align:right}.message-row .message-body{flex-grow:1;flex-shrink:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:13px}.message-row .time{flex-grow:0;flex-shrink:0;color:#999;vertical-align:top;font-size:12px;padding-right:8px}.action-panel .search,.action-panel i.fa,.btn .fa,.btn span,.pattern-wrapper .shrink,.search-clear-all .clear,input,label span{vertical-align:middle}.message-row:hover{background-color:#f8f8f8;cursor:pointer}.message-row.selected{background-color:#dfdfdf}i.fatal{color:#e00}i.error{color:#900}i.warning{color:#feb800}.debug{color:#777}.btn,.tabs a{text-decoration:none;color:#333}.action-panel .search{border:1px solid #ddd;padding:3px;box-sizing:border-box}#log-table .show-more{text-align:center;height:30px;line-height:30px;text-decoration:none;background-color:#ddd;cursor:pointer;margin-top:8px}#overlay,.divider{cursor:row-resize}#bottom-panel{position:fixed;bottom:0;left:0;right:0;height:300px;background-color:#f1f1f1;padding:0 8px 8px;z-index:2}#bottom-panel.full{position:static;background-color:inherit;height:90%}#bottom-panel.full>div{padding-bottom:40px}#bottom-panel.full .tabs{display:none}#bottom-panel.full .message-info{position:static}#bottom-panel.full .message-info .content{display:block;position:static}#bottom-panel.full button.delete,.hidden{display:none}#bottom-panel.full .save,#bottom-panel.full .share{bottom:10px}#bottom-panel.full .message-actions button{margin-top:8px}#bottom-panel.full .message-actions{position:fixed;height:40px;width:100%;left:0;bottom:0;background-color:#eee;border-top:1px solid #dfdfdf;padding-left:10px}.divider,.tabs{border-top:1px solid #ddd}.message-actions{position:absolute;bottom:5px;right:0;margin-right:10px}.message-actions button{margin-left:5px}.divider{position:fixed;bottom:310px;left:0;right:0;height:15px;background-color:#fafafa}.divider div{margin:auto;width:24px;height:1px;background-color:#ccc;position:relative}.divider .line-1{top:5px}.divider .line-2{top:6px}.divider .line-3{top:7px}#top-panel{position:fixed;top:0;left:0;right:0;bottom:320px;overflow:auto}.action-panel,.message-info{position:absolute;left:0;right:0}.message-info{top:0}.action-panel{bottom:0;font-weight:700}.action-panel input{margin:0}.severity-filters label{margin-right:18px}.search-clear-all .clear{float:right}#log-table{margin:auto;width:99%}.message-info .env-table,.message-info pre{position:relative;margin:5px 10px 10px}#overlay{position:fixed;z-index:99999;top:0;bottom:0;left:0;right:0;opacity:0}.message-info .content,.tabs{position:absolute;left:0;right:0}.message-info .content{top:0;bottom:35px;overflow:auto;display:none}.message-info .content.active{display:block}.tabs{bottom:13px;list-style-type:none;margin:0 0 5px;padding:0 0 0 10px}.tabs a,.tabs li{position:relative}.tabs li{float:left;padding-right:5px;margin:0}.tabs a{top:6px;border:1px solid #ddd;border-top:none;border-bottom-left-radius:5px;border-bottom-right-radius:5px;padding:6px;background-color:#e1e1e1}.tabs a.active{border-top:1px solid #f1f1f1;background-color:#f1f1f1}.btn{display:inline-block;margin:0;padding:5px 12px;font-size:1em;line-height:0;text-align:center;cursor:pointer;transition:all .25s;background-color:#ddd;border:none;font-weight:400}.btn:hover{color:#000;background-color:#ccc}.btn .fa{margin-right:7px}.btn:active{text-shadow:none}.btn.danger:hover{background-color:#c63c1b;color:#eee}.btn.ok{background-color:#3781dc;color:#fff}.btn.ok:hover{background-color:#286dc2;color:#fff}.search-clear-all .clear,.search-clear-all .search{height:100%}.search-clear-all .clear,.search-clear-all .search,.severity-filters label{align-self:center}.search-clear-all .footer-btns .settings{margin:0 7px}.search-clear-all{display:flex;justify-content:space-between}.search-clear-all .search{min-width:0;flex-shrink:2}.footer-btns{flex-grow:0;flex-shrink:0}@media (min-width:770px){.search-clear-all,.severity-filters{height:100%}.more-wrapping,.severity-filters{display:flex}.severity-filters{float:left}.action-panel{padding:10px;box-sizing:border-box;height:42px}.message-info{bottom:42px}}@media (max-width:770px){.severity-filters{padding:10px}.search-clear-all{padding:0 10px 10px}.action-panel{height:69px}.message-info{bottom:69px}}@media (max-width:430px){.severity-filters{overflow-x:scroll;overflow-y:hidden;white-space:nowrap}.more-wrapping:after,.more-wrapping:before{content:"";position:absolute;height:18px}.more-wrapping:before{width:15px;margin-left:-10px;background:linear-gradient(to right,#f1f1f1 0,rgba(241,241,241,.001) 100%)}.more-wrapping:after{right:0;width:23px;background:linear-gradient(to left,#f1f1f1 0,rgba(241,241,241,.001) 100%)}}.btn.no-text .fa{margin:0}.btn[disabled]{opacity:.5}.actions-menu{position:absolute;background:#fafafa;display:inline-flex;flex-direction:column;bottom:27px;right:45px;width:115px;padding:5px 5px 0;box-shadow:0 4px 14px rgba(0,0,0,.15);z-index:3}.actions-menu button{margin:0 0 5px;height:27px}.nav-controls{padding:10px}#bottom-panel:not(.full) .nav-controls{position:sticky;position:-webkit-sticky;position:-moz-sticky;position:-ms-sticky;position:-o-sticky;top:0;background:#f1f1f1;z-index:1;border-bottom:1px solid #ddd}.env-number{margin:0 7px}.expand-list{text-decoration:underline;color:#00f;cursor:pointer}.settings-page{max-width:1110px;margin-right:auto;margin-left:auto;font-size:15px;padding:0 10px 70px}.settings-header{display:flex;align-items:center;margin-bottom:5px}.settings-header .header-title{flex-grow:1}.settings-header .header-logo{width:50px;height:50px}.settings-section{border-top:1px solid #ddd;padding-top:15px}.settings-section .section-title{margin-top:0}.settings-section .subsection-title{margin-bottom:10px}.settings-section .tip{font-style:italic;font-size:13px;color:grey}.settings-section .pattern-wrapper{margin-top:10px;font-size:16px;display:flex;height:33px}.settings-section .api-error{margin-top:5px;color:red}.pattern-wrapper .pattern-input{width:600px;font-size:inherit;padding:5px 0;height:100%;box-sizing:border-box;vertical-align:middle;flex-grow:1;flex-shrink:1}.btn.new-pattern{height:100%;line-height:18px}.pattern-wrapper .shrink{height:100%;width:40px;text-align:center;box-sizing:border-box;flex-grow:0;flex-shrink:0;margin-left:10px}.fa{opacity:.7}.pattern-wrapper .shrink.reset{background:unset;width:unset;padding:0;margin-left:8px}
@@ -15,9 +15,7 @@ export default Component.extend({
15
15
  },
16
16
 
17
17
  allPatterns: computed("patterns.[]", "newPatterns.[]", function() {
18
- const patterns = this.get("patterns").map(pattern =>
19
- Pattern.create({ value: pattern })
20
- );
18
+ const patterns = this.get("patterns");
21
19
  const newPatterns = this.get("newPatterns") || [];
22
20
  return [...newPatterns.reverse(), ...patterns.reverse()];
23
21
  }),
@@ -67,7 +65,7 @@ export default Component.extend({
67
65
  pattern: pattern.get("value")
68
66
  })
69
67
  .then(() => {
70
- this.get("patterns").removeObject(pattern.get("value"));
68
+ this.get("patterns").removeObject(pattern);
71
69
  pattern.destroy();
72
70
  })
73
71
  .catch(response => this.catchBlock(pattern, response))
@@ -85,7 +83,7 @@ export default Component.extend({
85
83
  }).then(response => {
86
84
  pattern.updateValue(response.pattern);
87
85
  pattern.set("isNew", false);
88
- this.get("patterns").pushObject(pattern.get("value"));
86
+ this.get("patterns").pushObject(pattern);
89
87
  this.get("newPatterns").removeObject(pattern);
90
88
  });
91
89
  } else {
@@ -94,9 +92,8 @@ export default Component.extend({
94
92
  pattern: pattern.get("value"),
95
93
  new_pattern: pattern.get("valueBuffer")
96
94
  }).then(response => {
97
- const index = this.get("patterns").indexOf(pattern.get("value"));
98
95
  pattern.updateValue(response.pattern);
99
- this.get("patterns")[index] = pattern.get("value");
96
+ pattern.set("count", 0);
100
97
  });
101
98
  }
102
99
  promise
@@ -104,6 +101,19 @@ export default Component.extend({
104
101
  this.catchBlock(pattern, response);
105
102
  })
106
103
  .always(() => this.alwaysBlock(pattern));
104
+ },
105
+
106
+ resetCount(pattern) {
107
+ pattern.set("saving", true);
108
+ ajax("/reset-count.json", {
109
+ method: "PUT",
110
+ data: { pattern: pattern.get("value"), hard: !!pattern.get("hard") }
111
+ })
112
+ .then(() => {
113
+ pattern.set("count", 0);
114
+ })
115
+ .catch(response => this.catchBlock(pattern, response))
116
+ .always(() => this.alwaysBlock(pattern));
107
117
  }
108
118
  }
109
119
  });
@@ -6,6 +6,7 @@ export default EmberObject.extend({
6
6
  valueBuffer: "",
7
7
  error: null,
8
8
  saving: false,
9
+ count: 0,
9
10
 
10
11
  init() {
11
12
  this._super(...arguments);
@@ -21,5 +22,9 @@ export default EmberObject.extend({
21
22
 
22
23
  hasBuffer: computed("value", "valueBuffer", function() {
23
24
  return this.get("value") !== this.get("valueBuffer");
25
+ }),
26
+
27
+ zeroCount: computed("count", function() {
28
+ return this.get("count") <= 0;
24
29
  })
25
30
  });
@@ -1,5 +1,6 @@
1
1
  import Route from "@ember/routing/route";
2
2
  import { ajax } from "client-app/lib/utilities";
3
+ import Pattern from "client-app/models/pattern-item";
3
4
 
4
5
  export default Route.extend({
5
6
  model() {
@@ -8,8 +9,20 @@ export default Route.extend({
8
9
 
9
10
  setupController(controller, model) {
10
11
  this._super(...arguments);
11
- const showCodedPatterns =
12
- model.coded_patterns && model.coded_patterns.length > 0;
13
- controller.set("showCodedPatterns", showCodedPatterns);
12
+ const suppression = model.suppression;
13
+ const codedSuppression = suppression
14
+ .filter(p => p.hard)
15
+ .map(hash => Pattern.create(hash));
16
+
17
+ const customSuppression = suppression
18
+ .reject(p => p.hard)
19
+ .map(hash => Pattern.create(hash));
20
+
21
+ const showCodedSuppression = codedSuppression.length > 0;
22
+ controller.setProperties({
23
+ showCodedSuppression,
24
+ codedSuppression,
25
+ customSuppression
26
+ });
14
27
  }
15
28
  });
@@ -557,6 +557,7 @@ label span {
557
557
  margin-left: auto;
558
558
  font-size: 15px;
559
559
  padding: 0 10px;
560
+ padding-bottom: 70px;
560
561
  }
561
562
 
562
563
  .settings-header {
@@ -623,11 +624,24 @@ label span {
623
624
  line-height: 18px;
624
625
  }
625
626
 
626
- .pattern-wrapper .btn {
627
+ .pattern-wrapper .shrink {
627
628
  height: 100%;
629
+ width: 40px;
630
+ text-align: center;
628
631
  box-sizing: border-box;
629
632
  vertical-align: middle;
630
633
  flex-grow: 0;
631
634
  flex-shrink: 0;
632
635
  margin-left: 10px;
633
636
  }
637
+
638
+ .fa {
639
+ opacity: 0.7;
640
+ }
641
+
642
+ .pattern-wrapper .shrink.reset {
643
+ background: unset;
644
+ width: unset;
645
+ padding: 0;
646
+ margin-left: 8px;
647
+ }
@@ -12,10 +12,19 @@
12
12
  }}
13
13
  {{#if mutable}}
14
14
  {{#if pattern.hasBuffer}}
15
- <button {{action "save" pattern}} disabled={{pattern.saving}} class="btn ok no-text save"><i class="fa fa-check"></i></button>
15
+ <button {{action "save" pattern}} disabled={{pattern.saving}} class="btn ok no-text save shrink">
16
+ <i class="fa fa-check"></i>
17
+ </button>
16
18
  {{/if}}
17
- <button {{action "trash" pattern}} disabled={{pattern.saving}} class="btn no-text trash"><i class="fa fa-trash"></i></button>
19
+ <button {{action "trash" pattern}} disabled={{pattern.saving}} class="btn no-text trash shrink">
20
+ <i class="fa fa-trash"></i>
21
+ </button>
18
22
  {{/if}}
23
+
24
+ <input disabled=true title="Number of logs that have been suppressed by this pattern" class="count shrink" value={{pattern.count}}>
25
+ <button {{action "resetCount" pattern}} class="btn no-text reset shrink" title="Reset count of suppressed logs" disabled={{pattern.zeroCount}}>
26
+ <i class="fa fa-rotate-right"></i>
27
+ </button>
19
28
  </div>
20
29
  {{~#if pattern.error~}}
21
30
  <pre class="api-error">
@@ -9,17 +9,17 @@
9
9
  <h2 class="section-title">Suppression Patterns</h2>
10
10
  <div>New messages that match these Regular Expression patterns will be suppressed.</div>
11
11
 
12
- {{#if showCodedPatterns}}
12
+ {{#if showCodedSuppression}}
13
13
  <h3 class="subsection-title">Hard-coded patterns:</h3>
14
14
  <div class="tip">These patterns can't be removed via the UI because they are commited to the source code of your app.</div>
15
15
  {{patterns-list
16
- patterns=model.coded_patterns
16
+ patterns=codedSuppression
17
17
  mutable=false}}
18
18
  {{/if}}
19
19
 
20
20
  <h3 class="subsection-title">Custom patterns:</h3>
21
21
  {{patterns-list
22
- patterns=model.custom_patterns
22
+ patterns=customSuppression
23
23
  key="suppression"
24
24
  mutable=true}}
25
25
  </div>
@@ -2,6 +2,7 @@ import { module, test } from "qunit";
2
2
  import { setupRenderingTest } from "ember-qunit";
3
3
  import hbs from "htmlbars-inline-precompile";
4
4
  import { fillIn, render, findAll } from "@ember/test-helpers";
5
+ import Pattern from "client-app/models/pattern-item";
5
6
 
6
7
  module("Integration | Component | patterns-list", function(hooks) {
7
8
  setupRenderingTest(hooks);
@@ -19,15 +20,26 @@ module("Integration | Component | patterns-list", function(hooks) {
19
20
  .dom(".btn.new-pattern")
20
21
  .exists("It shows a create button when mutable");
21
22
 
22
- this.set("patterns", ["/somepattern/", "/anotherpattern/"]);
23
+ const pattern1 = Pattern.create({ value: "/somepattern/" });
24
+ const pattern2 = Pattern.create({ value: "/anotherpattern/" });
25
+ this.set("patterns", [pattern1, pattern2]);
23
26
  assert.equal(
24
27
  findAll(".pattern-input").length,
25
- 3,
28
+ 3, // yes 3 because there is always an empty pattern input
26
29
  "It correctly displays patterns"
27
30
  );
28
31
  assert
29
32
  .dom(".btn.save")
30
33
  .doesNotExist("No save buttons are shown when there is 0 buffer");
34
+ const counters = findAll("input.count");
35
+ assert.equal(counters.length, 3, "counters shown for all patterns");
36
+ assert.ok(counters.every(c => c.disabled), "counters are disabled");
37
+
38
+ pattern1.set("count", 6);
39
+ this.set("patterns", [pattern1, pattern2]);
40
+ const counterPresent = !!findAll("input.count").find(c => c.value === "6");
41
+ assert.ok(counterPresent, "counter shows correct value");
42
+ assert.dom(".btn.reset").exists("Reset button is shown");
31
43
 
32
44
  let inputs = findAll(".pattern-input");
33
45
  await fillIn(inputs[0], "/newpattern/");
@@ -101,6 +101,20 @@ module Logster
101
101
  not_implemented
102
102
  end
103
103
 
104
+ # increments the number of messages that have been suppressed by a pattern
105
+ def increment_ignore_count(pattern)
106
+ end
107
+
108
+ # removes number of suppressed messages by a pattern
109
+ def remove_ignore_count(pattern)
110
+ end
111
+
112
+ # returns a hash that maps patterns to the number of messages they
113
+ # have suppressed
114
+ def get_all_ignore_count
115
+ {}
116
+ end
117
+
104
118
  def report(severity, progname, msg, opts = {})
105
119
  return if (!msg || (String === msg && msg.empty?)) && skip_empty
106
120
  return if level && severity < level
@@ -125,13 +139,24 @@ module Logster
125
139
  message.backtrace = caller.join("\n")
126
140
  end
127
141
 
128
- return if ignore && ignore.any? { |pattern| message =~ pattern }
142
+ return if ignore && ignore.any? do |pattern|
143
+ if message =~ pattern
144
+ val = Regexp === pattern ? pattern.inspect : pattern.to_s
145
+ increment_ignore_count(val)
146
+ true
147
+ end
148
+ end
129
149
 
130
150
  if Logster.config.enable_custom_patterns_via_ui || allow_custom_patterns
131
151
  custom_ignore = @patterns_cache.fetch do
132
152
  Logster::SuppressionPattern.find_all(store: self)
133
153
  end
134
- return if custom_ignore.any? { |pattern| message =~ pattern }
154
+ return if custom_ignore.any? do |pattern|
155
+ if message =~ pattern
156
+ increment_ignore_count(pattern.inspect)
157
+ true
158
+ end
159
+ end
135
160
  end
136
161
 
137
162
  similar = nil
@@ -109,9 +109,20 @@ module Logster
109
109
  elsif resource =~ /\/settings(\.json)?$/
110
110
  json = $1 == ".json"
111
111
  if json
112
- coded_patterns = Logster.store.ignore&.map(&:inspect) || []
113
- custom_patterns = Logster::SuppressionPattern.find_all(raw: true)
114
- [200, { "Content-Type" => "application/json; charset=utf-8" }, [JSON.generate(coded_patterns: coded_patterns, custom_patterns: custom_patterns)]]
112
+ ignore_count = Logster.store.get_all_ignore_count
113
+ suppression = []
114
+
115
+ Logster.store.ignore&.each do |pattern|
116
+ string_pattern = Regexp === pattern ? pattern.inspect : pattern.to_s
117
+ count = ignore_count[string_pattern] || 0
118
+ suppression << { value: string_pattern, count: count, hard: true }
119
+ end
120
+
121
+ Logster::SuppressionPattern.find_all(raw: true).each do |pattern|
122
+ count = ignore_count[pattern] || 0
123
+ suppression << { value: pattern, count: count }
124
+ end
125
+ [200, { "Content-Type" => "application/json; charset=utf-8" }, [JSON.generate(suppression: suppression)]]
115
126
  else
116
127
  [200, { "Content-Type" => "text/html; charset=utf-8" }, [body(preload_json)]]
117
128
  end
@@ -125,6 +136,24 @@ module Logster
125
136
  return method_not_allowed if req.request_method == "GET"
126
137
 
127
138
  update_patterns(set_name, req)
139
+ elsif resource == "/reset-count.json"
140
+ req = Rack::Request.new(env)
141
+ return method_not_allowed("PUT is needed for this endpoint") if req.request_method != "PUT"
142
+ pattern = nil
143
+ if [true, "true"].include?(req.params["hard"])
144
+ pattern = Logster.store.ignore.find do |patt|
145
+ str = Regexp === patt ? patt.inspect : patt.to_s
146
+ str == req.params["pattern"]
147
+ end
148
+ else
149
+ pattern = Logster::SuppressionPattern.find_all(raw: true).find do |patt|
150
+ patt == req.params["pattern"]
151
+ end
152
+ end
153
+ return not_found("Pattern not found") unless pattern
154
+ pattern = Regexp === pattern ? pattern.inspect : pattern.to_s
155
+ Logster.store.remove_ignore_count(pattern)
156
+ [200, {}, ["OK"]]
128
157
  elsif resource == "/"
129
158
  [200, { "Content-Type" => "text/html; charset=utf-8" }, [body(preload_json)]]
130
159
  else
@@ -272,6 +272,7 @@ module Logster
272
272
  @redis.del(env_key)
273
273
  @redis.del(grouping_key)
274
274
  @redis.del(solved_key)
275
+ @redis.del(ignored_logs_count_key)
275
276
  Logster::PATTERNS.each do |klass|
276
277
  @redis.del(klass.set_name)
277
278
  end
@@ -360,6 +361,18 @@ module Logster
360
361
  @redis.smembers(set_name)
361
362
  end
362
363
 
364
+ def increment_ignore_count(pattern)
365
+ @redis.hincrby(ignored_logs_count_key, pattern, 1)
366
+ end
367
+
368
+ def remove_ignore_count(pattern)
369
+ @redis.hdel(ignored_logs_count_key, pattern)
370
+ end
371
+
372
+ def get_all_ignore_count
373
+ @redis.hgetall(ignored_logs_count_key)
374
+ end
375
+
363
376
  protected
364
377
 
365
378
  def clear_solved(count = nil)
@@ -566,6 +579,10 @@ module Logster
566
579
  @grouping_key ||= "__LOGSTER__GMAP"
567
580
  end
568
581
 
582
+ def ignored_logs_count_key
583
+ @ignored_logs_count_key ||= "__LOGSTER__IGNORED_LOGS_COUNT_KEY__MAP"
584
+ end
585
+
569
586
  private
570
587
 
571
588
  def register_rate_limit(severities, limit, duration, callback)
@@ -11,6 +11,7 @@ module Logster
11
11
 
12
12
  def destroy(clear_cache: true) # arg used in tests
13
13
  super()
14
+ @store.remove_ignore_count(self.to_s)
14
15
  @store.clear_suppression_patterns_cache if clear_cache
15
16
  end
16
17
  end
@@ -1,3 +1,3 @@
1
1
  module Logster
2
- VERSION = "2.2.0"
2
+ VERSION = "2.3.0"
3
3
  end
@@ -67,12 +67,15 @@ class TestViewer < Minitest::Test
67
67
  record = Logster::SuppressionPattern.new("custompattern")
68
68
  record.save
69
69
 
70
+ Logster.store.report(Logger::INFO, "test", "somepattern")
70
71
  response = request.get("/logsie/settings.json")
71
72
  assert_equal(200, response.status)
72
73
  assert_includes(response.content_type, "application/json")
74
+
73
75
  json = JSON.parse(response.body)
74
- custom_patterns = json["custom_patterns"]
75
- coded_patterns = json["coded_patterns"]
76
+ suppression = json["suppression"]
77
+ custom_patterns = suppression.reject { |p| p["hard"] }.map { |p| p["value"] }
78
+ coded_patterns = suppression.select { |p| p["hard"] }.map { |p| p["value"] }
76
79
  assert_includes(custom_patterns, "/custompattern/")
77
80
  assert_includes(coded_patterns, "/somepattern/")
78
81
  assert_includes(coded_patterns, "/anotherpattern/")
@@ -83,8 +86,9 @@ class TestViewer < Minitest::Test
83
86
  response = request.get("/logsie/settings.json")
84
87
  assert_equal(200, response.status)
85
88
  json = JSON.parse(response.body)
86
- assert_equal([], json["custom_patterns"])
87
- assert_equal([], json["coded_patterns"])
89
+ assert_equal([], json["suppression"])
90
+ ensure
91
+ Logster.store.ignore = nil
88
92
  end
89
93
 
90
94
  def test_settings_page_responds_with_html
@@ -231,6 +235,35 @@ class TestViewer < Minitest::Test
231
235
  assert_equal(/testpattern/, records.first)
232
236
  end
233
237
 
238
+ def test_reset_ignore_count_works
239
+ Logster.store.ignore = [/whatever store/]
240
+ Logster.store.allow_custom_patterns = true
241
+ Logster::SuppressionPattern.new(/custom pattern/).save
242
+
243
+ Logster.store.report(Logger::INFO, "test", "something whatever store")
244
+ Logster.store.report(Logger::INFO, "test", "this is for custom pattern")
245
+
246
+ response = request.get("/logsie/settings.json")
247
+ assert_equal(200, response.status)
248
+ json = JSON.parse(response.body)
249
+ suppression = json["suppression"]
250
+ assert_equal("1", suppression.find { |p| p["value"] == "/whatever store/" }["count"])
251
+ assert_equal("1", suppression.find { |p| p["value"] == "/custom pattern/" }["count"])
252
+
253
+ response = request.put("/logsie/reset-count.json",
254
+ params: { pattern: "/whatever store/", hard: true }
255
+ )
256
+ assert_equal(200, response.status)
257
+
258
+ response = request.put("/logsie/reset-count.json",
259
+ params: { pattern: "/custom pattern/", hard: false }
260
+ )
261
+ assert_equal(200, response.status)
262
+
263
+ hash = Logster.store.get_all_ignore_count
264
+ assert_equal({}, hash)
265
+ end
266
+
234
267
  def test_linking_to_a_valid_js_files
235
268
  %w(
236
269
  /logsie/javascript/client-app.js
@@ -580,6 +580,30 @@ class TestRedisStore < Minitest::Test
580
580
  assert_equal("testtesttesttest", latest.first.message)
581
581
  end
582
582
 
583
+ def test_suppressed_logs_are_counted
584
+ @store.ignore = [/store ignore/, Logster::IgnorePattern.new(/ignore pattern/), "an ignore string"]
585
+ @store.allow_custom_patterns = true
586
+ Logster::SuppressionPattern.new(/sup pattern/, store: @store).save
587
+
588
+ 2.times do
589
+ @store.report(Logger::INFO, "test", "this is store ignore")
590
+ @store.report(Logger::INFO, "test", "this is ignore pattern")
591
+ @store.report(Logger::INFO, "test", "this is sup pattern")
592
+ @store.report(Logger::INFO, "test", "this is an ignore string")
593
+ end
594
+
595
+ ignore_pattern = Logster::IgnorePattern.new(/ignore pattern/)
596
+ hash = @store.get_all_ignore_count
597
+ assert_equal("2", hash[ignore_pattern.to_s])
598
+ assert_equal("2", hash[/sup pattern/.inspect])
599
+ assert_equal("2", hash[/store ignore/.inspect])
600
+ assert_equal("2", hash["an ignore string"])
601
+
602
+ @store.remove_ignore_count(ignore_pattern.to_s)
603
+ hash = @store.get_all_ignore_count
604
+ assert_nil(hash[ignore_pattern.to_s])
605
+ end
606
+
583
607
  def test_rate_limits
584
608
  %w{minute hour}.each do |duration|
585
609
  begin
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logster
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - UI for viewing logs in Rack
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-19 00:00:00.000000000 Z
11
+ date: 2019-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler