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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +63 -12
- data/.gitignore +2 -0
- data/CHANGELOG.md +15 -5
- data/README.md +8 -0
- data/assets/javascript/.gitkeep +0 -0
- data/assets/javascript/chunk.143.f61340b825c6a3bf6dbe.js +22 -0
- data/assets/javascript/chunk.178.6d9ae01775c898e7b748.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 +1259 -280
- data/assets/javascript/vendor.js +4068 -3375
- 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 +93 -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 -149
- 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 +41 -31
- 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 +49 -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/version.rb +1 -1
- data/logster.gemspec +6 -3
- 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 -16639
|
@@ -1,23 +1,26 @@
|
|
|
1
|
+
import classic from "ember-classic-decorator";
|
|
1
2
|
import { ajax, increaseTitleCount } from "client-app/lib/utilities";
|
|
2
3
|
import Message from "client-app/models/message";
|
|
3
4
|
import Group from "client-app/models/group";
|
|
4
5
|
import { compare } from "@ember/utils";
|
|
5
|
-
import
|
|
6
|
+
import EmberObject, { computed } from "@ember/object";
|
|
6
7
|
import { A } from "@ember/array";
|
|
7
8
|
|
|
8
9
|
const BATCH_SIZE = 50;
|
|
9
|
-
|
|
10
10
|
export const SEVERITIES = ["Debug", "Info", "Warn", "Err", "Fatal"];
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
12
|
+
@classic
|
|
13
|
+
export default class MessageCollection extends EmberObject {
|
|
14
|
+
total = 0;
|
|
15
|
+
rows = A();
|
|
16
|
+
currentRow = null;
|
|
17
|
+
currentTab = null;
|
|
18
|
+
currentEnvPosition = 0;
|
|
19
|
+
currentGroupedMessagesPosition = 0;
|
|
20
|
+
search = "";
|
|
21
|
+
|
|
22
|
+
@computed(...SEVERITIES.map((s) => `show${s}`))
|
|
23
|
+
get filter() {
|
|
21
24
|
const filter = [];
|
|
22
25
|
SEVERITIES.forEach((severity, index) => {
|
|
23
26
|
if (this[`show${severity}`]) {
|
|
@@ -26,35 +29,57 @@ export default EmberObject.extend({
|
|
|
26
29
|
});
|
|
27
30
|
filter.push(5); // always show unknown, rare
|
|
28
31
|
return filter;
|
|
29
|
-
}
|
|
32
|
+
}
|
|
30
33
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
this.
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
34
|
+
@computed("currentRow", "currentGroupedMessagesPosition")
|
|
35
|
+
get currentMessage() {
|
|
36
|
+
const row = this.currentRow;
|
|
37
|
+
const position = this.currentGroupedMessagesPosition;
|
|
38
|
+
if (row && row.group) {
|
|
39
|
+
return row.messages[position];
|
|
40
|
+
} else {
|
|
41
|
+
return row;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@computed("filter", "search.length")
|
|
46
|
+
get hideCountInLoadMore() {
|
|
47
|
+
const filter = this.filter;
|
|
48
|
+
return (
|
|
49
|
+
(this.search && this.search.length > 0) || (filter && filter.length < 6)
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@computed("rows.length", "canLoadMore")
|
|
54
|
+
get moreBefore() {
|
|
55
|
+
return this.rows.length >= BATCH_SIZE && this.canLoadMore;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@computed("total", "rows.length")
|
|
59
|
+
get totalBefore() {
|
|
60
|
+
return this.total - this.rows.length;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@computed("search")
|
|
64
|
+
get regexSearch() {
|
|
65
|
+
const search = this.search;
|
|
66
|
+
if (search && search.length > 2 && search[0] === "/") {
|
|
67
|
+
const match = search.match(/\/(.*)\/(.*)/);
|
|
68
|
+
if (match && match.length === 3) {
|
|
69
|
+
try {
|
|
70
|
+
return new RegExp(match[1], match[2]);
|
|
71
|
+
} catch (err) {
|
|
72
|
+
// don't care
|
|
73
|
+
}
|
|
49
74
|
}
|
|
50
75
|
}
|
|
51
|
-
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
52
78
|
|
|
53
|
-
solve(message) {
|
|
54
|
-
message.solve()
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
},
|
|
79
|
+
async solve(message) {
|
|
80
|
+
await message.solve();
|
|
81
|
+
this.reload();
|
|
82
|
+
}
|
|
58
83
|
|
|
59
84
|
selectRow(row, opts = {}) {
|
|
60
85
|
const old = this.currentRow;
|
|
@@ -69,35 +94,36 @@ export default EmberObject.extend({
|
|
|
69
94
|
currentRow: row,
|
|
70
95
|
loadingEnv: false,
|
|
71
96
|
currentGroupedMessagesPosition,
|
|
72
|
-
currentEnvPosition: 0
|
|
97
|
+
currentEnvPosition: 0,
|
|
73
98
|
});
|
|
74
|
-
if (shouldRefresh)
|
|
99
|
+
if (shouldRefresh) {
|
|
75
100
|
this.notifyPropertyChange("currentGroupedMessagesPosition");
|
|
101
|
+
}
|
|
76
102
|
const forceFetchEnv = this.currentMessage && !this.currentMessage.env;
|
|
77
103
|
this.fetchEnv({ force: forceFetchEnv });
|
|
78
|
-
}
|
|
104
|
+
}
|
|
79
105
|
|
|
80
106
|
tabChanged(newTab) {
|
|
81
107
|
this.setProperties({
|
|
82
108
|
currentTab: newTab,
|
|
83
|
-
loadingEnv: false
|
|
109
|
+
loadingEnv: false,
|
|
84
110
|
});
|
|
85
111
|
this.fetchEnv();
|
|
86
|
-
}
|
|
112
|
+
}
|
|
87
113
|
|
|
88
114
|
groupedMessageChanged(newPosition) {
|
|
89
115
|
this.setProperties({
|
|
90
116
|
currentGroupedMessagesPosition: newPosition,
|
|
91
|
-
currentEnvPosition: 0
|
|
117
|
+
currentEnvPosition: 0,
|
|
92
118
|
});
|
|
93
119
|
const forceFetchEnv = this.currentMessage && !this.currentMessage.env;
|
|
94
120
|
this.fetchEnv({ force: forceFetchEnv });
|
|
95
|
-
}
|
|
121
|
+
}
|
|
96
122
|
|
|
97
123
|
envChanged(newPosition) {
|
|
98
124
|
this.set("currentEnvPosition", newPosition);
|
|
99
125
|
this.fetchEnv();
|
|
100
|
-
}
|
|
126
|
+
}
|
|
101
127
|
|
|
102
128
|
fetchEnv(opts = {}) {
|
|
103
129
|
const message = this.currentMessage;
|
|
@@ -108,27 +134,27 @@ export default EmberObject.extend({
|
|
|
108
134
|
this.set("loadingEnv", true);
|
|
109
135
|
return message.fetchEnv().finally(() => this.set("loadingEnv", false));
|
|
110
136
|
}
|
|
111
|
-
}
|
|
137
|
+
}
|
|
112
138
|
|
|
113
139
|
findEquivalentMessageIndex(row) {
|
|
114
140
|
let messageIndex = 0;
|
|
115
141
|
if (
|
|
116
|
-
row &&
|
|
117
|
-
|
|
118
|
-
this.currentRow &&
|
|
119
|
-
this.currentRow.group &&
|
|
142
|
+
row?.group &&
|
|
143
|
+
this.currentRow?.group &&
|
|
120
144
|
row.key === this.currentRow.key
|
|
121
145
|
) {
|
|
122
146
|
messageIndex = row.messages.mapBy("key").indexOf(this.currentMessage.key);
|
|
123
147
|
messageIndex = Math.max(0, messageIndex);
|
|
124
148
|
}
|
|
149
|
+
|
|
125
150
|
return messageIndex;
|
|
126
|
-
}
|
|
151
|
+
}
|
|
127
152
|
|
|
128
153
|
updateSelectedRow() {
|
|
129
|
-
const currentKey = this.
|
|
154
|
+
const currentKey = this.currentRow?.key;
|
|
155
|
+
|
|
130
156
|
if (currentKey && this.rows) {
|
|
131
|
-
const match = this.rows.find(m => m.key === currentKey);
|
|
157
|
+
const match = this.rows.find((m) => m.key === currentKey);
|
|
132
158
|
if (match) {
|
|
133
159
|
const messageIndex = this.findEquivalentMessageIndex(match);
|
|
134
160
|
this.selectRow(match, { messageIndex });
|
|
@@ -136,17 +162,17 @@ export default EmberObject.extend({
|
|
|
136
162
|
this.setProperties({
|
|
137
163
|
currentRow: null,
|
|
138
164
|
currentEnvPosition: 0,
|
|
139
|
-
currentGroupedMessagesPosition: 0
|
|
165
|
+
currentGroupedMessagesPosition: 0,
|
|
140
166
|
});
|
|
141
167
|
}
|
|
142
168
|
}
|
|
143
|
-
}
|
|
169
|
+
}
|
|
144
170
|
|
|
145
|
-
load(opts) {
|
|
146
|
-
opts
|
|
171
|
+
async load(opts) {
|
|
172
|
+
opts ||= {};
|
|
147
173
|
|
|
148
174
|
const data = {
|
|
149
|
-
filter: this.filter.join("_")
|
|
175
|
+
filter: this.filter.join("_"),
|
|
150
176
|
};
|
|
151
177
|
|
|
152
178
|
if (this.search && this.search.length > 0) {
|
|
@@ -169,131 +195,109 @@ export default EmberObject.extend({
|
|
|
169
195
|
}
|
|
170
196
|
|
|
171
197
|
this.set("loading", true);
|
|
172
|
-
return ajax("/messages.json", {
|
|
173
|
-
data: data,
|
|
174
|
-
method: "POST"
|
|
175
|
-
})
|
|
176
|
-
.then(data => {
|
|
177
|
-
// guard against race: ensure the results we're trying to apply
|
|
178
|
-
// match the current search terms
|
|
179
|
-
if (compare(data.filter, this.filter) != 0) {
|
|
180
|
-
return;
|
|
181
|
-
}
|
|
182
|
-
if (compare(data.search, this.search) != 0) {
|
|
183
|
-
return;
|
|
184
|
-
}
|
|
185
198
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
199
|
+
try {
|
|
200
|
+
const response = await ajax("/messages.json", {
|
|
201
|
+
data,
|
|
202
|
+
method: "POST",
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
// guard against race: ensure the results we're trying to apply
|
|
206
|
+
// match the current search terms
|
|
207
|
+
if (compare(response.filter, this.filter) !== 0) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (compare(response.search, this.search) !== 0) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (response.messages.length > 0) {
|
|
216
|
+
const newRows = this.toObjects(response.messages);
|
|
217
|
+
|
|
218
|
+
if (opts.before) {
|
|
219
|
+
this.rows.unshiftObjects(newRows);
|
|
220
|
+
} else {
|
|
221
|
+
for (const newRow of newRows) {
|
|
222
|
+
for (const row of this.rows) {
|
|
223
|
+
if (row.key !== newRow.key) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
this.rows.removeObject(row);
|
|
228
|
+
|
|
229
|
+
if (this.currentRow === row) {
|
|
230
|
+
const messageIndex = this.findEquivalentMessageIndex(newRow);
|
|
231
|
+
this.selectRow(newRow, { messageIndex });
|
|
232
|
+
}
|
|
207
233
|
}
|
|
208
234
|
}
|
|
235
|
+
|
|
236
|
+
this.rows.addObjects(newRows);
|
|
237
|
+
|
|
238
|
+
if (newRows.length > 0) {
|
|
239
|
+
increaseTitleCount(newRows.length);
|
|
240
|
+
}
|
|
209
241
|
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
this.set("total", response.total);
|
|
245
|
+
return response;
|
|
246
|
+
} finally {
|
|
247
|
+
this.set("loading", false);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
215
250
|
|
|
216
|
-
reload() {
|
|
251
|
+
async reload() {
|
|
217
252
|
this.set("total", 0);
|
|
218
253
|
this.rows.clear();
|
|
219
254
|
|
|
220
|
-
|
|
221
|
-
|
|
255
|
+
const data = await this.load();
|
|
256
|
+
this.updateCanLoadMore(data);
|
|
257
|
+
}
|
|
222
258
|
|
|
223
259
|
updateCanLoadMore(data) {
|
|
224
260
|
if (!data) {
|
|
225
261
|
return;
|
|
226
262
|
}
|
|
263
|
+
|
|
227
264
|
if (data.messages.length < BATCH_SIZE) {
|
|
228
265
|
this.set("canLoadMore", false);
|
|
229
266
|
} else {
|
|
230
267
|
this.set("canLoadMore", true);
|
|
231
268
|
}
|
|
232
|
-
}
|
|
269
|
+
}
|
|
233
270
|
|
|
234
271
|
loadMore() {
|
|
235
|
-
|
|
236
|
-
if (rows.length === 0) {
|
|
272
|
+
if (this.rows.length === 0) {
|
|
237
273
|
this.load({});
|
|
238
274
|
return;
|
|
239
275
|
}
|
|
240
276
|
|
|
241
|
-
const lastLog = rows[rows.length - 1];
|
|
277
|
+
const lastLog = this.rows[this.rows.length - 1];
|
|
242
278
|
const lastKey = lastLog.group ? lastLog.row_id : lastLog.key;
|
|
279
|
+
|
|
243
280
|
this.load({
|
|
244
|
-
after: lastKey
|
|
281
|
+
after: lastKey,
|
|
245
282
|
});
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
hideCountInLoadMore: computed("search", "filter", function() {
|
|
249
|
-
const filter = this.filter;
|
|
250
|
-
return (
|
|
251
|
-
(this.search && this.search.length > 0) || (filter && filter.length < 6)
|
|
252
|
-
);
|
|
253
|
-
}),
|
|
254
|
-
|
|
255
|
-
moreBefore: computed("rows.length", "canLoadMore", function() {
|
|
256
|
-
return this.get("rows.length") >= BATCH_SIZE && this.canLoadMore;
|
|
257
|
-
}),
|
|
258
|
-
|
|
259
|
-
totalBefore: computed("total", "rows.length", function() {
|
|
260
|
-
return this.total - this.rows.length;
|
|
261
|
-
}),
|
|
283
|
+
}
|
|
262
284
|
|
|
263
|
-
showMoreBefore
|
|
264
|
-
const
|
|
265
|
-
const firstLog = rows[0];
|
|
285
|
+
async showMoreBefore() {
|
|
286
|
+
const firstLog = this.rows[0];
|
|
266
287
|
const firstKey = firstLog.group ? firstLog.row_id : firstLog.key;
|
|
267
|
-
const knownGroups = rows.filterBy("group").mapBy("regex");
|
|
288
|
+
const knownGroups = this.rows.filterBy("group").mapBy("regex");
|
|
268
289
|
|
|
269
|
-
this.load({
|
|
290
|
+
const data = await this.load({
|
|
270
291
|
before: firstKey,
|
|
271
|
-
knownGroups
|
|
272
|
-
})
|
|
273
|
-
},
|
|
292
|
+
knownGroups,
|
|
293
|
+
});
|
|
274
294
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
if (search && search.length > 2 && search[0] === "/") {
|
|
278
|
-
const match = search.match(/\/(.*)\/(.*)/);
|
|
279
|
-
if (match && match.length === 3) {
|
|
280
|
-
try {
|
|
281
|
-
return new RegExp(match[1], match[2]);
|
|
282
|
-
} catch (err) {
|
|
283
|
-
// don't care
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
return null;
|
|
288
|
-
}),
|
|
295
|
+
this.updateCanLoadMore(data);
|
|
296
|
+
}
|
|
289
297
|
|
|
290
298
|
toObjects(rows) {
|
|
291
|
-
return rows.map(m => {
|
|
292
|
-
|
|
293
|
-
return Group.create(m);
|
|
294
|
-
} else {
|
|
295
|
-
return Message.create(m);
|
|
296
|
-
}
|
|
299
|
+
return rows.map((m) => {
|
|
300
|
+
return m.group ? Group.create(m) : Message.create(m);
|
|
297
301
|
});
|
|
298
302
|
}
|
|
299
|
-
}
|
|
303
|
+
}
|
|
@@ -1,76 +1,49 @@
|
|
|
1
|
+
import classic from "ember-classic-decorator";
|
|
2
|
+
import { gt } from "@ember/object/computed";
|
|
3
|
+
import EmberObject, { computed } from "@ember/object";
|
|
1
4
|
import { ajax } from "client-app/lib/utilities";
|
|
2
5
|
import { getRootPath } from "client-app/lib/preload";
|
|
3
|
-
import { computed } from "@ember/object";
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
+
@classic
|
|
8
|
+
export default class Message extends EmberObject {
|
|
9
|
+
MAX_LEN = 200;
|
|
7
10
|
|
|
8
|
-
|
|
9
|
-
return ajax(`/fetch-env/${this.key}.json`).then(env =>
|
|
10
|
-
this.set("env", env)
|
|
11
|
-
);
|
|
12
|
-
},
|
|
11
|
+
@gt("count", 1) showCount;
|
|
13
12
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
solve() {
|
|
19
|
-
return ajax(`/solve/${this.key}`, { type: "PUT" });
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
destroy() {
|
|
23
|
-
return ajax(`/message/${this.key}`, { type: "DELETE" });
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
protect() {
|
|
27
|
-
this.set("protected", true);
|
|
28
|
-
return ajax(`/protect/${this.key}`, { type: "PUT" });
|
|
29
|
-
},
|
|
30
|
-
|
|
31
|
-
unprotect() {
|
|
32
|
-
this.set("protected", false);
|
|
33
|
-
return ajax(`/unprotect/${this.key}`, { type: "DELETE" });
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
showCount: computed("count", function() {
|
|
37
|
-
return this.count > 1;
|
|
38
|
-
}),
|
|
39
|
-
|
|
40
|
-
hasMore: computed("message", "expanded", function() {
|
|
13
|
+
@computed("MAX_LEN", "expanded", "message.length")
|
|
14
|
+
get hasMore() {
|
|
41
15
|
return !this.expanded && this.message.length > this.MAX_LEN;
|
|
42
|
-
}
|
|
16
|
+
}
|
|
43
17
|
|
|
44
|
-
|
|
18
|
+
@computed("key")
|
|
19
|
+
get shareUrl() {
|
|
45
20
|
return `${getRootPath()}/show/${this.key}`;
|
|
46
|
-
}
|
|
21
|
+
}
|
|
47
22
|
|
|
48
|
-
|
|
23
|
+
@computed("MAX_LEN", "expanded", "message.length")
|
|
24
|
+
get displayMessage() {
|
|
49
25
|
let message = this.message;
|
|
50
26
|
|
|
51
27
|
if (!this.expanded && this.message.length > this.MAX_LEN) {
|
|
52
28
|
message = this.message.substr(0, this.MAX_LEN);
|
|
53
29
|
}
|
|
54
30
|
return message;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
updateFromObject(other) {
|
|
58
|
-
// XXX Only updatable property is count right now
|
|
59
|
-
this.set("count", other.get("count"));
|
|
60
|
-
},
|
|
31
|
+
}
|
|
61
32
|
|
|
62
|
-
|
|
33
|
+
@computed("backtrace.length", "env.{application_version,length}")
|
|
34
|
+
get canSolve() {
|
|
63
35
|
const appVersion = Array.isArray(this.env)
|
|
64
36
|
? this.env
|
|
65
|
-
.map(e => e.application_version)
|
|
37
|
+
.map((e) => e.application_version)
|
|
66
38
|
.compact()
|
|
67
39
|
.join("")
|
|
68
40
|
: this.env && this.env.application_version;
|
|
69
41
|
return appVersion && this.backtrace && this.backtrace.length > 0;
|
|
70
|
-
}
|
|
42
|
+
}
|
|
71
43
|
|
|
72
|
-
|
|
73
|
-
|
|
44
|
+
@computed("severity")
|
|
45
|
+
get rowClass() {
|
|
46
|
+
switch (this.severity) {
|
|
74
47
|
case 0:
|
|
75
48
|
return "debug";
|
|
76
49
|
case 1:
|
|
@@ -84,9 +57,10 @@ export default Em.Object.extend({
|
|
|
84
57
|
default:
|
|
85
58
|
return "unknown";
|
|
86
59
|
}
|
|
87
|
-
}
|
|
60
|
+
}
|
|
88
61
|
|
|
89
|
-
|
|
62
|
+
@computed("severity")
|
|
63
|
+
get glyph() {
|
|
90
64
|
switch (this.severity) {
|
|
91
65
|
case 0:
|
|
92
66
|
return "";
|
|
@@ -101,13 +75,14 @@ export default Em.Object.extend({
|
|
|
101
75
|
default:
|
|
102
76
|
return "question-circle";
|
|
103
77
|
}
|
|
104
|
-
}
|
|
78
|
+
}
|
|
105
79
|
|
|
106
|
-
prefix
|
|
80
|
+
get prefix() {
|
|
107
81
|
return "fas";
|
|
108
|
-
}
|
|
82
|
+
}
|
|
109
83
|
|
|
110
|
-
|
|
84
|
+
@computed("severity")
|
|
85
|
+
get klass() {
|
|
111
86
|
switch (this.severity) {
|
|
112
87
|
case 0:
|
|
113
88
|
return "";
|
|
@@ -122,5 +97,32 @@ export default Em.Object.extend({
|
|
|
122
97
|
default:
|
|
123
98
|
return "unknown";
|
|
124
99
|
}
|
|
125
|
-
}
|
|
126
|
-
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async fetchEnv() {
|
|
103
|
+
const env = await ajax(`/fetch-env/${this.key}.json`);
|
|
104
|
+
this.set("env", env);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
expand() {
|
|
108
|
+
this.set("expanded", true);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
solve() {
|
|
112
|
+
return ajax(`/solve/${this.key}`, { type: "PUT" });
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
destroy() {
|
|
116
|
+
return ajax(`/message/${this.key}`, { type: "DELETE" });
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
protect() {
|
|
120
|
+
this.set("protected", true);
|
|
121
|
+
return ajax(`/protect/${this.key}`, { type: "PUT" });
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
unprotect() {
|
|
125
|
+
this.set("protected", false);
|
|
126
|
+
return ajax(`/unprotect/${this.key}`, { type: "DELETE" });
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -1,30 +1,32 @@
|
|
|
1
|
-
import
|
|
1
|
+
import classic from "ember-classic-decorator";
|
|
2
|
+
import { lte } from "@ember/object/computed";
|
|
3
|
+
import EmberObject, { computed } from "@ember/object";
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
@classic
|
|
6
|
+
export default class PatternItem extends EmberObject {
|
|
7
|
+
isNew = false;
|
|
8
|
+
value = "";
|
|
9
|
+
valueBuffer = "";
|
|
10
|
+
error = null;
|
|
11
|
+
saving = false;
|
|
12
|
+
count = 0;
|
|
13
|
+
|
|
14
|
+
@lte("count", 0) zeroCount;
|
|
10
15
|
|
|
11
16
|
init() {
|
|
12
|
-
|
|
13
|
-
this.set("valueBuffer", this.
|
|
14
|
-
}
|
|
17
|
+
super.init(...arguments);
|
|
18
|
+
this.set("valueBuffer", this.value);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@computed("value", "valueBuffer")
|
|
22
|
+
get hasBuffer() {
|
|
23
|
+
return this.value !== this.valueBuffer;
|
|
24
|
+
}
|
|
15
25
|
|
|
16
26
|
updateValue(newValue) {
|
|
17
27
|
this.setProperties({
|
|
18
28
|
value: newValue,
|
|
19
|
-
valueBuffer: newValue
|
|
29
|
+
valueBuffer: newValue,
|
|
20
30
|
});
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
hasBuffer: computed("value", "valueBuffer", function() {
|
|
24
|
-
return this.get("value") !== this.get("valueBuffer");
|
|
25
|
-
}),
|
|
26
|
-
|
|
27
|
-
zeroCount: computed("count", function() {
|
|
28
|
-
return this.get("count") <= 0;
|
|
29
|
-
})
|
|
30
|
-
});
|
|
31
|
+
}
|
|
32
|
+
}
|
data/client-app/app/router.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import EmberRouter from "@ember/routing/router";
|
|
2
|
-
import config from "
|
|
2
|
+
import config from "client-app/config/environment";
|
|
3
3
|
|
|
4
4
|
export default class Router extends EmberRouter {
|
|
5
5
|
location = config.locationType;
|
|
6
6
|
rootURL = config.rootURL;
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
Router.map(function() {
|
|
9
|
+
Router.map(function () {
|
|
10
10
|
this.route("index", { path: "/" });
|
|
11
11
|
this.route("show", { path: "/show/:id" });
|
|
12
12
|
this.route("settings");
|