logster 2.11.4 → 2.12.2

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.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +63 -12
  3. data/.gitignore +2 -0
  4. data/CHANGELOG.md +15 -5
  5. data/README.md +8 -0
  6. data/assets/javascript/.gitkeep +0 -0
  7. data/assets/javascript/chunk.143.f61340b825c6a3bf6dbe.js +22 -0
  8. data/assets/javascript/chunk.178.6d9ae01775c898e7b748.js +22 -0
  9. data/assets/javascript/chunk.468.95dd450003497c781cb3.js +1213 -0
  10. data/assets/javascript/chunk.916.85a3fc9d873df80f5ea5.js +579 -0
  11. data/assets/javascript/client-app.js +1259 -280
  12. data/assets/javascript/vendor.js +4068 -3375
  13. data/assets/stylesheets/.gitkeep +0 -0
  14. data/assets/stylesheets/client-app.css +1 -1
  15. data/assets/stylesheets/vendor.css +1 -1
  16. data/build_client_app.sh +6 -8
  17. data/client-app/.editorconfig +0 -1
  18. data/client-app/.eslintignore +2 -0
  19. data/client-app/.eslintrc +10 -0
  20. data/client-app/.gitignore +1 -1
  21. data/client-app/.prettierignore +21 -0
  22. data/client-app/.prettierrc +1 -0
  23. data/client-app/.template-lintrc.js +10 -0
  24. data/client-app/README.md +4 -5
  25. data/client-app/app/app.js +2 -2
  26. data/client-app/app/components/actions-menu.js +21 -21
  27. data/client-app/app/components/back-trace.js +93 -90
  28. data/client-app/app/components/env-tab.js +41 -29
  29. data/client-app/app/components/message-info.js +78 -75
  30. data/client-app/app/components/message-row.js +20 -17
  31. data/client-app/app/components/page-nav.js +33 -24
  32. data/client-app/app/components/panel-resizer.js +53 -37
  33. data/client-app/app/components/patterns-list.js +101 -84
  34. data/client-app/app/components/tab-contents.js +15 -19
  35. data/client-app/app/components/tabbed-section.js +30 -18
  36. data/client-app/app/components/time-formatter.js +29 -18
  37. data/client-app/app/controllers/index.js +143 -119
  38. data/client-app/app/controllers/show.js +17 -13
  39. data/client-app/app/helpers/or.js +1 -1
  40. data/client-app/app/initializers/app-init.js +23 -34
  41. data/client-app/app/lib/decorators.js +4 -2
  42. data/client-app/app/lib/preload.js +7 -4
  43. data/client-app/app/lib/utilities.js +55 -54
  44. data/client-app/app/models/group.js +20 -15
  45. data/client-app/app/models/message-collection.js +153 -149
  46. data/client-app/app/models/message.js +60 -58
  47. data/client-app/app/models/pattern-item.js +24 -22
  48. data/client-app/app/router.js +2 -2
  49. data/client-app/app/routes/index.js +19 -12
  50. data/client-app/app/routes/settings.js +12 -10
  51. data/client-app/app/routes/show.js +6 -4
  52. data/client-app/app/services/events.js +4 -0
  53. data/client-app/app/styles/app.css +2 -0
  54. data/client-app/app/templates/application.hbs +1 -2
  55. data/client-app/app/templates/components/actions-menu.hbs +23 -8
  56. data/client-app/app/templates/components/back-trace.hbs +10 -3
  57. data/client-app/app/templates/components/env-tab.hbs +9 -7
  58. data/client-app/app/templates/components/message-info.hbs +65 -34
  59. data/client-app/app/templates/components/message-row.hbs +25 -8
  60. data/client-app/app/templates/components/page-nav.hbs +34 -10
  61. data/client-app/app/templates/components/panel-resizer.hbs +3 -3
  62. data/client-app/app/templates/components/patterns-list.hbs +54 -20
  63. data/client-app/app/templates/components/tabbed-section.hbs +12 -4
  64. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  65. data/client-app/app/templates/index.hbs +100 -78
  66. data/client-app/app/templates/settings.hbs +30 -19
  67. data/client-app/app/templates/show.hbs +9 -8
  68. data/client-app/config/ember-cli-update.json +18 -0
  69. data/client-app/config/environment.js +13 -13
  70. data/client-app/config/icons.js +3 -3
  71. data/client-app/config/targets.js +16 -8
  72. data/client-app/ember-cli-build.js +4 -4
  73. data/client-app/package.json +41 -31
  74. data/client-app/testem.js +16 -17
  75. data/client-app/tests/index.html +8 -1
  76. data/client-app/tests/integration/components/back-trace-test.js +49 -26
  77. data/client-app/tests/integration/components/env-tab-test.js +79 -53
  78. data/client-app/tests/integration/components/message-info-test.js +25 -23
  79. data/client-app/tests/integration/components/patterns-list-test.js +14 -11
  80. data/client-app/tests/test-helper.js +8 -4
  81. data/client-app/tests/unit/controllers/index-test.js +32 -16
  82. data/client-app/tests/unit/controllers/show-test.js +5 -5
  83. data/client-app/tests/unit/routes/index-test.js +5 -5
  84. data/client-app/tests/unit/routes/show-test.js +5 -5
  85. data/client-app/yarn.lock +9673 -0
  86. data/lib/logster/version.rb +1 -1
  87. data/logster.gemspec +6 -3
  88. metadata +15 -6
  89. data/client-app/.eslintrc.js +0 -60
  90. data/client-app/.travis.yml +0 -28
  91. data/client-app/app/components/update-time.js +0 -21
  92. data/client-app/package-lock.json +0 -16639
@@ -1,21 +1,26 @@
1
+ import classic from "ember-classic-decorator";
2
+ import { inject as service } from "@ember/service";
1
3
  import Route from "@ember/routing/route";
2
- import {
3
- default as MessageCollection,
4
- SEVERITIES
4
+ import MessageCollection, {
5
+ SEVERITIES,
5
6
  } from "client-app/models/message-collection";
6
7
  import { isHidden } from "client-app/lib/utilities";
7
8
 
8
- export default Route.extend({
9
+ @classic
10
+ export default class IndexRoute extends Route {
11
+ @service events;
12
+
9
13
  model() {
10
14
  // TODO from preload json?
11
15
  return MessageCollection.create();
12
- },
16
+ }
13
17
 
14
18
  setupController(controller, model) {
15
- this._super(controller, model);
16
- SEVERITIES.forEach(severity =>
17
- model.set(`show${severity}`, controller[`show${severity}`])
18
- );
19
+ super.setupController(controller, model);
20
+ for (const severity of SEVERITIES) {
21
+ model.set(`show${severity}`, controller[`show${severity}`]);
22
+ }
23
+
19
24
  model.reload();
20
25
 
21
26
  let times = 0;
@@ -25,6 +30,7 @@ export default Route.extend({
25
30
  if (model.loading) {
26
31
  return;
27
32
  }
33
+
28
34
  times += 1;
29
35
  const hidden = isHidden();
30
36
  let load = !hidden;
@@ -37,6 +43,7 @@ export default Route.extend({
37
43
  }
38
44
  }
39
45
  }
46
+
40
47
  // refresh a lot less aggressively in background
41
48
  if (load) {
42
49
  model.loadMore();
@@ -46,12 +53,12 @@ export default Route.extend({
46
53
  }
47
54
  }, 3000);
48
55
 
49
- this.events.on("panelResized", amount => {
56
+ this.events.on("panelResized", (amount) => {
50
57
  controller.resizePanels(amount);
51
58
  });
52
- },
59
+ }
53
60
 
54
61
  deactivate() {
55
62
  clearInterval(this.refreshInterval);
56
63
  }
57
- });
64
+ }
@@ -1,30 +1,32 @@
1
+ import classic from "ember-classic-decorator";
1
2
  import Route from "@ember/routing/route";
2
3
  import { ajax } from "client-app/lib/utilities";
3
4
  import Pattern from "client-app/models/pattern-item";
4
5
 
5
- export default Route.extend({
6
+ @classic
7
+ export default class SettingsRoute extends Route {
6
8
  model() {
7
9
  return ajax("/settings.json");
8
- },
10
+ }
9
11
 
10
12
  setupController(controller, model) {
11
- this._super(...arguments);
13
+ super.setupController(...arguments);
12
14
  const suppression = model.suppression;
13
15
  const codedSuppression = suppression
14
- .filter(p => p.hard)
15
- .map(hash => Pattern.create(hash));
16
+ .filter((p) => p.hard)
17
+ .map((hash) => Pattern.create(hash));
16
18
 
17
19
  const customSuppression = suppression
18
- .reject(p => p.hard)
19
- .map(hash => Pattern.create(hash));
20
+ .reject((p) => p.hard)
21
+ .map((hash) => Pattern.create(hash));
20
22
 
21
- const grouping = model.grouping.map(hash => Pattern.create(hash));
23
+ const grouping = model.grouping.map((hash) => Pattern.create(hash));
22
24
  const showCodedSuppression = codedSuppression.length > 0;
23
25
  controller.setProperties({
24
26
  showCodedSuppression,
25
27
  codedSuppression,
26
28
  customSuppression,
27
- grouping
29
+ grouping,
28
30
  });
29
31
  }
30
- });
32
+ }
@@ -1,14 +1,16 @@
1
+ import classic from "ember-classic-decorator";
1
2
  import Route from "@ember/routing/route";
2
3
  import Message from "client-app/models/message";
3
4
  import { preloadOrAjax } from "client-app/lib/utilities";
4
5
 
5
- export default Route.extend({
6
+ @classic
7
+ export default class ShowRoute extends Route {
6
8
  model(params) {
7
9
  return preloadOrAjax("/show/" + params.id + ".json");
8
- },
10
+ }
9
11
 
10
12
  setupController(controller, model) {
11
- this._super(...arguments);
13
+ super.setupController(...arguments);
12
14
  controller.set("model", Message.create(model));
13
15
  }
14
- });
16
+ }
@@ -0,0 +1,4 @@
1
+ import Service from "@ember/service";
2
+ import Evented from "@ember/object/evented";
3
+
4
+ export default class Events extends Service.extend(Evented) {}
@@ -689,6 +689,8 @@ label span {
689
689
  .backtrace-line .line-link {
690
690
  color: #9e9e9e;
691
691
  margin-left: 3px;
692
+ text-decoration: none;
693
+ white-space: normal;
692
694
  }
693
695
 
694
696
  @media (prefers-color-scheme: dark) {
@@ -1,2 +1 @@
1
- {{update-time}}
2
- {{outlet}}
1
+ {{outlet}}
@@ -1,16 +1,31 @@
1
- {{#if actionsInMenu}}
2
- {{#if showMenu}}
1
+ {{#if @actionsInMenu}}
2
+ {{#if this.showMenu}}
3
3
  <div class="actions-menu">
4
4
  {{yield}}
5
5
  </div>
6
6
  {{/if}}
7
- <button {{action 'expandMenu'}} class="expand btn no-text">{{fa-icon 'ellipsis-h'}}</button>
8
- {{#if showShare}}
9
- <button {{action "share"}} class="share btn">{{fa-icon "share"}}<span>Share</span></button>
7
+
8
+ <button
9
+ class="expand btn no-text"
10
+ type="button"
11
+ {{on "click" this.expandMenu}}
12
+ >
13
+ <FaIcon @icon="ellipsis-h" />
14
+ </button>
15
+
16
+ {{#if @showShare}}
17
+ <button class="share btn" type="button" {{on "click" this.share}}>
18
+ <FaIcon @icon="share" />
19
+ <span>Share</span>
20
+ </button>
10
21
  {{/if}}
11
22
  {{else}}
12
23
  {{yield}}
13
- {{#if showShare}}
14
- <button {{action "share"}} class="share btn">{{fa-icon "share"}}<span>Share</span></button>
24
+
25
+ {{#if @showShare}}
26
+ <button class="share btn" type="button" {{on "click" this.share}}>
27
+ <FaIcon @icon="share" />
28
+ <span>Share</span>
29
+ </button>
15
30
  {{/if}}
16
- {{/if}}
31
+ {{/if}}
@@ -1,8 +1,15 @@
1
- {{~#each lines as |line|~}}
1
+ {{~#each this.lines as |line|~}}
2
2
  <div class="backtrace-line">
3
3
  {{~line.line~}}
4
4
  {{~#if line.url~}}
5
- <a href="{{line.url}}" target="_blank" class="line-link">{{fa-icon "external-link-square-alt"}}</a>
5
+ <a
6
+ href={{line.url}}
7
+ target="_blank"
8
+ class="line-link"
9
+ rel="noopener noreferrer"
10
+ >
11
+ <FaIcon @icon="external-link-square-alt" />
12
+ </a>
6
13
  {{~/if~}}
7
14
  </div>
8
- {{~/each~}}
15
+ {{~/each~}}
@@ -1,8 +1,10 @@
1
- {{#if isEnvArray}}
2
- {{page-nav
3
- list=message.env
4
- position=currentEnvPosition
5
- extraClasses="env-nav"
6
- navigate=envChangedAction}}
1
+ {{#if this.isEnvArray}}
2
+ <PageNav
3
+ @list={{@message.env}}
4
+ @position={{@currentEnvPosition}}
5
+ @extraClasses="env-nav"
6
+ @navigate={{@envChangedAction}}
7
+ />
7
8
  {{/if}}
8
- {{{html}}}
9
+
10
+ {{this.html}}
@@ -1,55 +1,86 @@
1
1
  <div class="message-info">
2
- {{#tabbed-section onTabChange=(action "tabChanged")}}
3
- {{#tab-contents name="info" hint="show info" currentMessage=currentMessage}}
4
- {{#if showTitle}}
2
+ <TabbedSection @onTabChange={{this.tabChanged}} as |tabActions|>
3
+ <TabContents
4
+ @name="info"
5
+ @hint="show info"
6
+ @currentMessage={{@currentMessage}}
7
+ @tabActions={{tabActions}}
8
+ >
9
+ {{#if @showTitle}}
5
10
  <h3>Message
6
- {{#if currentMessage.showCount}}
7
- ({{currentMessage.count}} copies reported)
11
+ {{#if @currentMessage.showCount}}
12
+ ({{@currentMessage.count}}
13
+ copies reported)
8
14
  {{/if}}
9
15
  </h3>
10
16
  {{/if}}
11
- <pre>{{currentMessage.message}}</pre>
12
- {{/tab-contents}}
13
- {{#tab-contents name="backtrace" defaultTab="true" hint="show backtrace" currentMessage=currentMessage}}
14
- {{#if showTitle}}
17
+
18
+ <pre>{{@currentMessage.message}}</pre>
19
+ </TabContents>
20
+
21
+ <TabContents
22
+ @name="backtrace"
23
+ @defaultTab="true"
24
+ @hint="show backtrace"
25
+ @currentMessage={{@currentMessage}}
26
+ @tabActions={{tabActions}}
27
+ >
28
+ {{#if @showTitle}}
15
29
  <h3>Backtrace</h3>
16
30
  {{/if}}
17
- <pre>
18
- {{~back-trace
31
+
32
+ <pre><BackTrace
19
33
  class="backtrace"
20
- backtrace=currentMessage.backtrace
21
- env=currentMessage.env~}}
22
- </pre>
23
- {{/tab-contents}}
24
- {{#tab-contents className="env" name="env" hint="show environment" currentMessage=currentMessage }}
25
- {{#if currentMessage}}
26
- {{#if currentMessage.env}}
27
- {{#if showTitle}}
34
+ @backtrace={{@currentMessage.backtrace}}
35
+ @env={{@currentMessage.env}}
36
+ /></pre>
37
+ </TabContents>
38
+
39
+ <TabContents
40
+ @className="env"
41
+ @name="env"
42
+ @hint="show environment"
43
+ @currentMessage={{@currentMessage}}
44
+ @tabActions={{tabActions}}
45
+ >
46
+ {{#if @currentMessage}}
47
+ {{#if @currentMessage.env}}
48
+ {{#if @showTitle}}
28
49
  <h3>Env</h3>
29
50
  {{/if}}
30
- {{env-tab
31
- message=currentMessage
32
- currentEnvPosition=currentEnvPosition
33
- envChangedAction=envChangedAction}}
34
- {{else if loadingEnv}}
51
+
52
+ <EnvTab
53
+ @message={{@currentMessage}}
54
+ @currentEnvPosition={{@currentEnvPosition}}
55
+ @envChangedAction={{@envChangedAction}}
56
+ />
57
+ {{else if @loadingEnv}}
35
58
  Loading env...
36
59
  {{else}}
37
60
  No env for this message.
38
61
  {{/if}}
39
62
  {{/if}}
40
- {{/tab-contents}}
41
- {{/tabbed-section}}
63
+ </TabContents>
64
+ </TabbedSection>
42
65
 
43
- {{#if currentMessage}}
44
- <div class='message-actions'>
45
- {{#actions-menu actionsInMenu=actionsInMenu showShare=showShare share=(action "share")}}
46
- {{#each buttons as |btn|}}
47
- <button {{action btn.action}} class="{{btn.klass}} btn {{if btn.danger 'danger' ''}}">
48
- {{fa-icon btn.icon prefix=btn.prefix}}
66
+ {{#if @currentMessage}}
67
+ <div class="message-actions">
68
+ <ActionsMenu
69
+ @actionsInMenu={{@actionsInMenu}}
70
+ @showShare={{@showShare}}
71
+ @share={{this.share}}
72
+ >
73
+ {{#each this.buttons as |btn|}}
74
+ <button
75
+ class="{{btn.klass}} btn {{if btn.danger 'danger' ''}}"
76
+ type="button"
77
+ {{on "click" btn.action}}
78
+ >
79
+ <FaIcon @icon={{btn.icon}} @prefix={{btn.prefix}} />
49
80
  <span>{{btn.label}}</span>
50
81
  </button>
51
82
  {{/each}}
52
- {{/actions-menu}}
83
+ </ActionsMenu>
53
84
  </div>
54
85
  {{/if}}
55
- </div>
86
+ </div>
@@ -1,15 +1,32 @@
1
1
  <div class="count">
2
- {{#if model.showCount}}
3
- {{model.count}}
2
+ {{#if @model.showCount}}
3
+ {{@model.count}}
4
4
  {{/if}}
5
5
  </div>
6
- <div class="severity">{{#if model.glyph}}{{fa-icon model.glyph class=model.klass prefix=model.prefix}}{{/if}}</div>
6
+
7
+ <div class="severity">
8
+ {{#if @model.glyph}}
9
+ <FaIcon
10
+ @icon={{@model.glyph}}
11
+ @prefix={{@model.prefix}}
12
+ class={{@model.klass}}
13
+ />
14
+ {{/if}}
15
+ </div>
16
+
7
17
  <div class="message-body">
8
- {{model.displayMessage}}
18
+ {{@model.displayMessage}}
9
19
  </div>
10
- <div class='protected'>
11
- {{#if model.protected}}
12
- {{fa-icon "lock" title="message is protected, clearing will not remove it"}}
20
+
21
+ <div class="protected">
22
+ {{#if @model.protected}}
23
+ <FaIcon
24
+ @icon="lock"
25
+ title="message is protected, clearing will not remove it"
26
+ />
13
27
  {{/if}}
14
28
  </div>
15
- <div class="time">{{time-formatter timestamp=model.timestamp}}</div>
29
+
30
+ <div class="time">
31
+ <TimeFormatter @timestamp={{@model.timestamp}} />
32
+ </div>
@@ -1,13 +1,37 @@
1
- <button disabled={{disableBackButtons}} {{action "bigJump" "back"}} class="btn nav-btn no-text">
2
- {{fa-icon "fast-backward"}}
1
+ <button
2
+ disabled={{this.disableBackButtons}}
3
+ class="btn nav-btn no-text"
4
+ type="button"
5
+ {{on "click" (fn this.bigJump "back")}}
6
+ >
7
+ <FaIcon @icon="fast-backward" />
3
8
  </button>
4
- <button disabled={{disableBackButtons}} {{action "takeStep" "back"}} class="btn nav-btn no-text">
5
- {{fa-icon "backward"}}
9
+
10
+ <button
11
+ disabled={{this.disableBackButtons}}
12
+ class="btn nav-btn no-text"
13
+ type="button"
14
+ {{on "click" (fn this.takeStep "back")}}
15
+ >
16
+ <FaIcon @icon="backward" />
6
17
  </button>
7
- <span class="current-number">{{displayNumber}}/{{list.length}}</span>
8
- <button disabled={{disableForwardButtons}} {{action "takeStep" "front"}} class="btn nav-btn no-text">
9
- {{fa-icon "forward"}}
10
- </button>
11
- <button disabled={{disableForwardButtons}} {{action "bigJump" "front"}} class="btn nav-btn no-text">
12
- {{fa-icon "fast-forward"}}
18
+
19
+ <span class="current-number">{{this.displayNumber}}/{{@list.length}}</span>
20
+
21
+ <button
22
+ disabled={{this.disableForwardButtons}}
23
+ class="btn nav-btn no-text"
24
+ type="button"
25
+ {{on "click" (fn this.takeStep "front")}}
26
+ >
27
+ <FaIcon @icon="forward" />
13
28
  </button>
29
+
30
+ <button
31
+ disabled={{this.disableForwardButtons}}
32
+ class="btn nav-btn no-text"
33
+ type="button"
34
+ {{on "click" (fn this.bigJump "front")}}
35
+ >
36
+ <FaIcon @icon="fast-forward" />
37
+ </button>
@@ -1,3 +1,3 @@
1
- <div class='line-1'></div>
2
- <div class='line-2'></div>
3
- <div class='line-3'></div>
1
+ <div class="line-1"></div>
2
+ <div class="line-2"></div>
3
+ <div class="line-3"></div>
@@ -1,44 +1,78 @@
1
- {{#if mutable}}
2
- <button {{action "create"}} class="btn new-pattern">{{fa-icon "plus"}}<span>New</span></button>
1
+ {{#if @mutable}}
2
+ <button class="btn new-pattern" type="button" {{on "click" this.create}}>
3
+ <FaIcon @icon="plus" />
4
+ <span>New</span>
5
+ </button>
3
6
  {{/if}}
4
- {{#each allPatterns as |pattern|}}
7
+
8
+ {{#each this.allPatterns as |pattern|}}
5
9
  <div class="pattern-wrapper">
6
- {{input
7
- type="textfield"
10
+ <Input
11
+ @type="textfield"
12
+ @value={{pattern.valueBuffer}}
8
13
  class="pattern-input"
9
14
  placeholder="Enter regular expression…"
10
- value=pattern.valueBuffer
11
- disabled=(or immutable pattern.saving)
12
- }}
13
- {{#if mutable}}
15
+ disabled={{or this.immutable pattern.saving}}
16
+ />
17
+
18
+ {{#if @mutable}}
14
19
  {{#if pattern.hasBuffer}}
15
- <button {{action "save" pattern}} disabled={{pattern.saving}} class="btn ok no-text save shrink">
16
- {{fa-icon "check"}}
20
+ <button
21
+ disabled={{pattern.saving}}
22
+ class="btn ok no-text save shrink"
23
+ type="button"
24
+ {{on "click" (fn this.save pattern)}}
25
+ >
26
+ <FaIcon @icon="check" />
17
27
  </button>
18
28
  {{/if}}
19
- <button {{action "trash" pattern}} disabled={{pattern.saving}} class="btn no-text trash shrink">
20
- {{fa-icon "trash-alt"}}
29
+
30
+ <button
31
+ disabled={{pattern.saving}}
32
+ class="btn no-text trash shrink"
33
+ type="button"
34
+ {{on "click" (fn this.trash pattern)}}
35
+ >
36
+ <FaIcon @icon="trash-alt" />
21
37
  </button>
22
38
  {{/if}}
23
39
 
24
- {{#if showCounter}}
25
- <input disabled=true title="Number of logs that have been suppressed by this pattern" class="count shrink" value={{pattern.count}}>
26
- <button {{action "resetCount" pattern}} class="btn no-text reset shrink" title="Reset count of suppressed logs" disabled={{pattern.zeroCount}}>
27
- {{fa-icon "redo-alt"}}
40
+ {{#if this.showCounter}}
41
+ <input
42
+ disabled="true"
43
+ title="Number of logs that have been suppressed by this pattern"
44
+ class="count shrink"
45
+ value={{pattern.count}}
46
+ />
47
+ <button
48
+ class="btn no-text reset shrink"
49
+ title="Reset count of suppressed logs"
50
+ disabled={{pattern.zeroCount}}
51
+ type="button"
52
+ {{on "click" (fn this.resetCount pattern)}}
53
+ >
54
+ <FaIcon @icon="redo-alt" />
28
55
  </button>
29
56
  {{/if}}
30
57
  </div>
31
- {{#if applyRetroactivelyCheckbox}}
58
+
59
+ {{#if @applyRetroactivelyCheckbox}}
32
60
  {{#if pattern.isNew}}
33
61
  <div class="retro-checkbox">
34
- <input checked={{pattern.retroactive}} type="checkbox" class="checkbox" onclick={{action "checkboxChanged" pattern}}>
62
+ <input
63
+ checked={{pattern.retroactive}}
64
+ type="checkbox"
65
+ class="checkbox"
66
+ onclick={{fn this.checkboxChanged pattern}}
67
+ />
35
68
  Apply retroactively
36
69
  </div>
37
70
  {{/if}}
38
71
  {{/if}}
72
+
39
73
  {{~#if pattern.error~}}
40
74
  <pre class="api-error">
41
75
  {{~pattern.error~}}
42
76
  </pre>
43
77
  {{~/if~}}
44
- {{/each}}
78
+ {{/each}}
@@ -1,10 +1,18 @@
1
- {{yield}}
1
+ {{yield
2
+ (hash addTab=this.addTab removeTab=this.removeTab selectTab=this.selectTab)
3
+ }}
4
+
2
5
  <ul class="tabs">
3
- {{#each tabs as |tab|}}
6
+ {{#each this.tabs as |tab|}}
4
7
  <li>
5
- <a title="{{unbound tab.hint}}" href="#" class="{{if tab.active 'active'}}" {{action selectTab tab}}>
8
+ <a
9
+ title={{unbound tab.hint}}
10
+ href="#"
11
+ class={{if tab.active "active"}}
12
+ {{on "click" (fn this.selectTab tab)}}
13
+ >
6
14
  {{unbound tab.name}}
7
15
  </a>
8
16
  </li>
9
17
  {{/each}}
10
- </ul>
18
+ </ul>
@@ -1 +1 @@
1
- {{time}}
1
+ <span title={{this.title}}>{{this.time}}</span>