logster 2.11.3 → 2.12.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +72 -11
- data/.gitignore +2 -0
- data/CHANGELOG.md +13 -3
- data/README.md +8 -0
- data/assets/javascript/.gitkeep +0 -0
- data/assets/javascript/chunk.143.2faa04830259ce9aa59a.js +22 -0
- data/assets/javascript/chunk.178.ca5ade1d8cbdbfbe6d72.js +22 -0
- data/assets/javascript/chunk.468.95dd450003497c781cb3.js +1213 -0
- data/assets/javascript/chunk.916.85a3fc9d873df80f5ea5.js +579 -0
- data/assets/javascript/client-app.js +1261 -276
- data/assets/javascript/vendor.js +4199 -3514
- data/assets/stylesheets/.gitkeep +0 -0
- data/assets/stylesheets/client-app.css +1 -1
- data/assets/stylesheets/vendor.css +1 -1
- data/build_client_app.sh +6 -8
- data/client-app/.editorconfig +0 -1
- data/client-app/.eslintignore +2 -0
- data/client-app/.eslintrc +10 -0
- data/client-app/.gitignore +1 -1
- data/client-app/.prettierignore +21 -0
- data/client-app/.prettierrc +1 -0
- data/client-app/.template-lintrc.js +10 -0
- data/client-app/README.md +4 -5
- data/client-app/app/app.js +2 -2
- data/client-app/app/components/actions-menu.js +21 -21
- data/client-app/app/components/back-trace.js +89 -90
- data/client-app/app/components/env-tab.js +41 -29
- data/client-app/app/components/message-info.js +78 -75
- data/client-app/app/components/message-row.js +20 -17
- data/client-app/app/components/page-nav.js +33 -24
- data/client-app/app/components/panel-resizer.js +53 -37
- data/client-app/app/components/patterns-list.js +101 -84
- data/client-app/app/components/tab-contents.js +15 -19
- data/client-app/app/components/tabbed-section.js +30 -18
- data/client-app/app/components/time-formatter.js +29 -18
- data/client-app/app/controllers/index.js +143 -119
- data/client-app/app/controllers/show.js +17 -13
- data/client-app/app/helpers/or.js +1 -1
- data/client-app/app/initializers/app-init.js +23 -34
- data/client-app/app/lib/decorators.js +4 -2
- data/client-app/app/lib/preload.js +7 -4
- data/client-app/app/lib/utilities.js +55 -54
- data/client-app/app/models/group.js +20 -15
- data/client-app/app/models/message-collection.js +153 -148
- data/client-app/app/models/message.js +60 -58
- data/client-app/app/models/pattern-item.js +24 -22
- data/client-app/app/router.js +2 -2
- data/client-app/app/routes/index.js +19 -12
- data/client-app/app/routes/settings.js +12 -10
- data/client-app/app/routes/show.js +6 -4
- data/client-app/app/services/events.js +4 -0
- data/client-app/app/styles/app.css +2 -0
- data/client-app/app/templates/application.hbs +1 -2
- data/client-app/app/templates/components/actions-menu.hbs +23 -8
- data/client-app/app/templates/components/back-trace.hbs +10 -3
- data/client-app/app/templates/components/env-tab.hbs +9 -7
- data/client-app/app/templates/components/message-info.hbs +65 -34
- data/client-app/app/templates/components/message-row.hbs +25 -8
- data/client-app/app/templates/components/page-nav.hbs +34 -10
- data/client-app/app/templates/components/panel-resizer.hbs +3 -3
- data/client-app/app/templates/components/patterns-list.hbs +54 -20
- data/client-app/app/templates/components/tabbed-section.hbs +12 -4
- data/client-app/app/templates/components/time-formatter.hbs +1 -1
- data/client-app/app/templates/index.hbs +100 -78
- data/client-app/app/templates/settings.hbs +30 -19
- data/client-app/app/templates/show.hbs +9 -8
- data/client-app/config/ember-cli-update.json +18 -0
- data/client-app/config/environment.js +13 -13
- data/client-app/config/icons.js +3 -3
- data/client-app/config/targets.js +16 -8
- data/client-app/ember-cli-build.js +4 -4
- data/client-app/package.json +43 -30
- data/client-app/testem.js +16 -17
- data/client-app/tests/index.html +8 -1
- data/client-app/tests/integration/components/back-trace-test.js +32 -26
- data/client-app/tests/integration/components/env-tab-test.js +79 -53
- data/client-app/tests/integration/components/message-info-test.js +25 -23
- data/client-app/tests/integration/components/patterns-list-test.js +14 -11
- data/client-app/tests/test-helper.js +8 -4
- data/client-app/tests/unit/controllers/index-test.js +32 -16
- data/client-app/tests/unit/controllers/show-test.js +5 -5
- data/client-app/tests/unit/routes/index-test.js +5 -5
- data/client-app/tests/unit/routes/show-test.js +5 -5
- data/client-app/yarn.lock +9673 -0
- data/lib/logster/middleware/viewer.rb +12 -12
- data/lib/logster/version.rb +1 -1
- data/logster.gemspec +6 -3
- data/test/logster/middleware/test_viewer.rb +14 -8
- metadata +15 -6
- data/client-app/.eslintrc.js +0 -60
- data/client-app/.travis.yml +0 -28
- data/client-app/app/components/update-time.js +0 -21
- data/client-app/package-lock.json +0 -39196
@@ -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
|
-
|
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
|
-
|
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
|
-
|
16
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
13
|
+
super.setupController(...arguments);
|
12
14
|
controller.set("model", Message.create(model));
|
13
15
|
}
|
14
|
-
}
|
16
|
+
}
|
@@ -1,2 +1 @@
|
|
1
|
-
{{
|
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
|
-
|
8
|
-
|
9
|
-
|
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
|
-
|
14
|
-
|
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
|
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
|
-
|
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
|
-
|
9
|
+
|
10
|
+
{{this.html}}
|
@@ -1,55 +1,86 @@
|
|
1
1
|
<div class="message-info">
|
2
|
-
|
3
|
-
|
4
|
-
|
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}}
|
11
|
+
{{#if @currentMessage.showCount}}
|
12
|
+
({{@currentMessage.count}}
|
13
|
+
copies reported)
|
8
14
|
{{/if}}
|
9
15
|
</h3>
|
10
16
|
{{/if}}
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
18
|
-
|
31
|
+
|
32
|
+
<pre><BackTrace
|
19
33
|
class="backtrace"
|
20
|
-
backtrace=currentMessage.backtrace
|
21
|
-
env=currentMessage.env
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
41
|
-
|
63
|
+
</TabContents>
|
64
|
+
</TabbedSection>
|
42
65
|
|
43
|
-
{{#if currentMessage}}
|
44
|
-
<div class=
|
45
|
-
|
46
|
-
{{
|
47
|
-
|
48
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
29
|
+
|
30
|
+
<div class="time">
|
31
|
+
<TimeFormatter @timestamp={{@model.timestamp}} />
|
32
|
+
</div>
|
@@ -1,13 +1,37 @@
|
|
1
|
-
<button
|
2
|
-
{{
|
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
|
-
|
5
|
-
|
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
|
-
|
8
|
-
<
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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=
|
2
|
-
<div class=
|
3
|
-
<div class=
|
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
|
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
|
-
|
7
|
+
|
8
|
+
{{#each this.allPatterns as |pattern|}}
|
5
9
|
<div class="pattern-wrapper">
|
6
|
-
|
7
|
-
type="textfield"
|
10
|
+
<Input
|
11
|
+
@type="textfield"
|
12
|
+
@value={{pattern.valueBuffer}}
|
8
13
|
class="pattern-input"
|
9
14
|
placeholder="Enter regular expression…"
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
{{#if mutable}}
|
15
|
+
disabled={{or this.immutable pattern.saving}}
|
16
|
+
/>
|
17
|
+
|
18
|
+
{{#if @mutable}}
|
14
19
|
{{#if pattern.hasBuffer}}
|
15
|
-
<button
|
16
|
-
{{
|
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
|
-
|
20
|
-
|
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
|
26
|
-
|
27
|
-
|
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
|
-
|
58
|
+
|
59
|
+
{{#if @applyRetroactivelyCheckbox}}
|
32
60
|
{{#if pattern.isNew}}
|
33
61
|
<div class="retro-checkbox">
|
34
|
-
<input
|
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
|
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>
|