logster 2.11.4 → 2.12.1

Sign up to get free protection for your applications and to get access to all the features.
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 +10 -5
  5. data/README.md +8 -0
  6. data/assets/javascript/.gitkeep +0 -0
  7. data/assets/javascript/chunk.143.2faa04830259ce9aa59a.js +22 -0
  8. data/assets/javascript/chunk.178.ca5ade1d8cbdbfbe6d72.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 +1257 -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 +89 -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 +32 -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>