logster 1.3.0 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +18 -18
  3. data/.travis.yml +15 -15
  4. data/CHANGELOG.md +137 -130
  5. data/Gemfile +4 -4
  6. data/Guardfile +8 -8
  7. data/LICENSE.txt +22 -22
  8. data/README.md +99 -99
  9. data/Rakefile +24 -24
  10. data/assets/fonts/FontAwesome.otf +0 -0
  11. data/assets/fonts/fontawesome-webfont.eot +0 -0
  12. data/assets/fonts/fontawesome-webfont.svg +639 -639
  13. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  14. data/assets/fonts/fontawesome-webfont.woff +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  16. data/assets/images/Icon-144_rounded.png +0 -0
  17. data/assets/images/Icon-144_square.png +0 -0
  18. data/assets/images/icon_144x144.png +0 -0
  19. data/assets/images/icon_64x64.png +0 -0
  20. data/assets/javascript/client-app.js +81 -81
  21. data/assets/javascript/vendor.js +5302 -5302
  22. data/assets/stylesheets/client-app.css +0 -0
  23. data/assets/stylesheets/vendor.css +3 -3
  24. data/build_client_app.sh +12 -12
  25. data/client-app/.editorconfig +20 -20
  26. data/client-app/.ember-cli +9 -9
  27. data/client-app/.eslintignore +19 -19
  28. data/client-app/.eslintrc.js +46 -46
  29. data/client-app/.gitignore +23 -23
  30. data/client-app/.travis.yml +27 -27
  31. data/client-app/.watchmanconfig +3 -3
  32. data/client-app/README.md +57 -57
  33. data/client-app/app/app.js +14 -14
  34. data/client-app/app/components/message-info.js +18 -18
  35. data/client-app/app/components/message-row.js +45 -45
  36. data/client-app/app/components/panel-resizer.js +75 -75
  37. data/client-app/app/components/tab-contents.js +27 -27
  38. data/client-app/app/components/tab-link.js +5 -5
  39. data/client-app/app/components/tabbed-section.js +32 -32
  40. data/client-app/app/components/time-formatter.js +25 -25
  41. data/client-app/app/components/update-time.js +21 -21
  42. data/client-app/app/controllers/index.js +83 -83
  43. data/client-app/app/controllers/show.js +13 -13
  44. data/client-app/app/index.html +29 -29
  45. data/client-app/app/initializers/app-init.js +55 -55
  46. data/client-app/app/lib/preload.js +14 -14
  47. data/client-app/app/lib/utilities.js +140 -140
  48. data/client-app/app/models/message-collection.js +158 -158
  49. data/client-app/app/models/message.js +99 -99
  50. data/client-app/app/resolver.js +3 -3
  51. data/client-app/app/router.js +14 -14
  52. data/client-app/app/routes/index.js +53 -53
  53. data/client-app/app/routes/show.js +14 -14
  54. data/client-app/app/styles/app.css +387 -387
  55. data/client-app/app/templates/application.hbs +2 -2
  56. data/client-app/app/templates/components/message-info.hbs +44 -44
  57. data/client-app/app/templates/components/message-row.hbs +17 -17
  58. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  59. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  60. data/client-app/app/templates/index.hbs +57 -57
  61. data/client-app/app/templates/show.hbs +4 -4
  62. data/client-app/config/environment.js +51 -51
  63. data/client-app/config/optional-features.json +3 -3
  64. data/client-app/config/targets.js +18 -18
  65. data/client-app/ember-cli-build.js +29 -29
  66. data/client-app/package-lock.json +11365 -11365
  67. data/client-app/package.json +56 -56
  68. data/client-app/testem.js +25 -25
  69. data/client-app/tests/index.html +34 -34
  70. data/client-app/tests/integration/components/message-info-test.js +26 -26
  71. data/client-app/tests/integration/components/message-row-test.js +26 -26
  72. data/client-app/tests/integration/components/panel-resizer-test.js +26 -26
  73. data/client-app/tests/integration/components/tab-contents-test.js +26 -26
  74. data/client-app/tests/integration/components/tab-link-test.js +26 -26
  75. data/client-app/tests/integration/components/tabbed-section-test.js +26 -26
  76. data/client-app/tests/integration/components/time-formatter-test.js +26 -26
  77. data/client-app/tests/integration/components/update-time-test.js +26 -26
  78. data/client-app/tests/test-helper.js +8 -8
  79. data/client-app/tests/unit/controllers/index-test.js +12 -12
  80. data/client-app/tests/unit/controllers/show-test.js +12 -12
  81. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  82. data/client-app/tests/unit/routes/index-test.js +11 -11
  83. data/client-app/tests/unit/routes/show-test.js +11 -11
  84. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  85. data/lib/logster.rb +54 -54
  86. data/lib/logster/base_store.rb +130 -130
  87. data/lib/logster/configuration.rb +25 -25
  88. data/lib/logster/ignore_pattern.rb +65 -65
  89. data/lib/logster/logger.rb +108 -102
  90. data/lib/logster/message.rb +227 -227
  91. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  92. data/lib/logster/middleware/reporter.rb +56 -56
  93. data/lib/logster/middleware/viewer.rb +220 -220
  94. data/lib/logster/rails/railtie.rb +58 -58
  95. data/lib/logster/redis_store.rb +481 -481
  96. data/lib/logster/version.rb +3 -3
  97. data/lib/logster/web.rb +14 -14
  98. data/logster.gemspec +34 -34
  99. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  100. data/test/fake_data/Gemfile +4 -4
  101. data/test/fake_data/generate.rb +10 -10
  102. data/test/logster/middleware/test_reporter.rb +21 -21
  103. data/test/logster/middleware/test_viewer.rb +96 -96
  104. data/test/logster/test_base_store.rb +147 -147
  105. data/test/logster/test_ignore_pattern.rb +41 -41
  106. data/test/logster/test_logger.rb +80 -74
  107. data/test/logster/test_message.rb +34 -34
  108. data/test/logster/test_redis_rate_limiter.rb +230 -230
  109. data/test/logster/test_redis_store.rb +427 -427
  110. data/test/test_helper.rb +38 -38
  111. data/vendor/assets/javascripts/logster.js.erb +39 -39
  112. metadata +3 -3
@@ -1,3 +1,3 @@
1
- import Resolver from 'ember-resolver';
2
-
3
- export default Resolver;
1
+ import Resolver from 'ember-resolver';
2
+
3
+ export default Resolver;
@@ -1,14 +1,14 @@
1
- import EmberRouter from '@ember/routing/router';
2
- import config from './config/environment';
3
-
4
- const Router = EmberRouter.extend({
5
- location: config.locationType,
6
- rootURL: config.rootURL
7
- });
8
-
9
- Router.map(function() {
10
- this.route("index", { path: "/" });
11
- this.route("show", { path: "/show/:id" });
12
- });
13
-
14
- export default Router;
1
+ import EmberRouter from '@ember/routing/router';
2
+ import config from './config/environment';
3
+
4
+ const Router = EmberRouter.extend({
5
+ location: config.locationType,
6
+ rootURL: config.rootURL
7
+ });
8
+
9
+ Router.map(function() {
10
+ this.route("index", { path: "/" });
11
+ this.route("show", { path: "/show/:id" });
12
+ });
13
+
14
+ export default Router;
@@ -1,53 +1,53 @@
1
- import Route from "@ember/routing/route";
2
- import MessageCollection from "client-app/models/message-collection";
3
- import { isHidden } from "client-app/lib/utilities";
4
-
5
- export default Route.extend({
6
- model() {
7
- // TODO from preload json?
8
- return MessageCollection.create();
9
- },
10
-
11
- setupController(controller, model) {
12
- this._super(controller, model);
13
- controller.setProperties({
14
- showDebug: true,
15
- showInfo: true,
16
- showWarn: true,
17
- showErr: true,
18
- showFatal: true,
19
- search: "",
20
- initialized: true
21
- });
22
- model.reload();
23
-
24
- let times = 0;
25
- let backoff = 1;
26
-
27
- this.refreshInterval = setInterval(() => {
28
- times += 1;
29
- const hidden = isHidden();
30
- let load = !hidden;
31
-
32
- if (hidden) {
33
- if (times % backoff === 0) {
34
- load = true;
35
- if (backoff < 20) {
36
- backoff++;
37
- }
38
- }
39
- }
40
- // refresh a lot less aggressively in background
41
- if (load) {
42
- model.loadMore();
43
- if (!hidden) {
44
- backoff = 1;
45
- }
46
- }
47
- }, 3000);
48
- },
49
-
50
- deactivate() {
51
- clearInterval(this.refreshInterval);
52
- }
53
- });
1
+ import Route from "@ember/routing/route";
2
+ import MessageCollection from "client-app/models/message-collection";
3
+ import { isHidden } from "client-app/lib/utilities";
4
+
5
+ export default Route.extend({
6
+ model() {
7
+ // TODO from preload json?
8
+ return MessageCollection.create();
9
+ },
10
+
11
+ setupController(controller, model) {
12
+ this._super(controller, model);
13
+ controller.setProperties({
14
+ showDebug: true,
15
+ showInfo: true,
16
+ showWarn: true,
17
+ showErr: true,
18
+ showFatal: true,
19
+ search: "",
20
+ initialized: true
21
+ });
22
+ model.reload();
23
+
24
+ let times = 0;
25
+ let backoff = 1;
26
+
27
+ this.refreshInterval = setInterval(() => {
28
+ times += 1;
29
+ const hidden = isHidden();
30
+ let load = !hidden;
31
+
32
+ if (hidden) {
33
+ if (times % backoff === 0) {
34
+ load = true;
35
+ if (backoff < 20) {
36
+ backoff++;
37
+ }
38
+ }
39
+ }
40
+ // refresh a lot less aggressively in background
41
+ if (load) {
42
+ model.loadMore();
43
+ if (!hidden) {
44
+ backoff = 1;
45
+ }
46
+ }
47
+ }, 3000);
48
+ },
49
+
50
+ deactivate() {
51
+ clearInterval(this.refreshInterval);
52
+ }
53
+ });
@@ -1,14 +1,14 @@
1
- import Route from "@ember/routing/route";
2
- import Message from "client-app/models/message";
3
- import { preloadOrAjax } from "client-app/lib/utilities";
4
-
5
- export default Route.extend({
6
- model(params) {
7
- return preloadOrAjax("/show/" + params.id + ".json");
8
- },
9
-
10
- setupController(controller, model) {
11
- this._super(...arguments);
12
- controller.set("model", Message.create(model));
13
- }
14
- });
1
+ import Route from "@ember/routing/route";
2
+ import Message from "client-app/models/message";
3
+ import { preloadOrAjax } from "client-app/lib/utilities";
4
+
5
+ export default Route.extend({
6
+ model(params) {
7
+ return preloadOrAjax("/show/" + params.id + ".json");
8
+ },
9
+
10
+ setupController(controller, model) {
11
+ this._super(...arguments);
12
+ controller.set("model", Message.create(model));
13
+ }
14
+ });
@@ -1,387 +1,387 @@
1
- body {
2
- font-family: "Roboto", Arial, "Liberation Sans", "DejaVu Sans", sans-serif;
3
- font-size: 12px;
4
- }
5
-
6
- pre {
7
- font-family: "Roboto Mono", Consolas, Monaco, Ubuntu Mono, monospace;
8
- }
9
-
10
- table.env-table tbody tr td {
11
- border-top: none;
12
- line-height: 18px;
13
- vertical-align: top;
14
- }
15
-
16
- table.env-table,
17
- table.env-table table {
18
- border-spacing: 0;
19
- border-collapse: collapse;
20
- }
21
-
22
- table.env-table td {
23
- padding-right: 5px;
24
- }
25
-
26
- tbody tr {
27
- width: 98%;
28
- }
29
-
30
- tbody tr td {
31
- border-top: 1px #e9e9e9 solid;
32
- line-height: 25px;
33
- }
34
-
35
- .message-row:hover {
36
- background-color: #f8f8f8;
37
- cursor: pointer;
38
- }
39
-
40
- .message-row.selected {
41
- background-color: #dfdfdf;
42
- }
43
-
44
- th {
45
- text-align: left;
46
- padding-right: 10px;
47
- font-size: 12px;
48
- color: #222;
49
- padding-bottom: 8px;
50
- }
51
-
52
- td.time {
53
- font-size: 12px;
54
- color: #999;
55
- vertical-align: top;
56
- }
57
- .message {
58
- font-size: 13px;
59
- overflow: hidden;
60
- white-space: nowrap;
61
- text-overflow: ellipsis;
62
- padding-right: 10px;
63
- }
64
-
65
- th.count {
66
- width: 20px;
67
- }
68
-
69
- th.severity {
70
- width: 15px;
71
- }
72
-
73
- th.time {
74
- width: 90px;
75
- text-align: right;
76
- padding-right: 20px;
77
- }
78
-
79
- td.time {
80
- text-align: right;
81
- padding-right: 8px;
82
- }
83
-
84
- th.protected {
85
- width: 10px;
86
- }
87
-
88
- i.fatal {
89
- color: #e00;
90
- }
91
-
92
- i.error {
93
- color: #900;
94
- }
95
-
96
- i.warning {
97
- color: #feb800;
98
- }
99
-
100
- .debug {
101
- color: #777;
102
- }
103
-
104
- td.count {
105
- text-align: right;
106
- padding-right: 4px;
107
- }
108
-
109
- .count span {
110
- font-size: 11px;
111
- font-weight: bold;
112
- }
113
-
114
- .action-panel .search input {
115
- border: 1px solid #ddd;
116
- padding: 3px;
117
- vertical-align: middle;
118
- }
119
-
120
- .regex input {
121
- margin-left: 2px !important;
122
- }
123
-
124
- tr.show-more {
125
- text-align: center;
126
- height: 30px;
127
- text-decoration: none;
128
- background-color: #ddd;
129
- cursor: pointer;
130
- font-size: 12px;
131
- }
132
-
133
- #bottom-panel {
134
- position: fixed;
135
- bottom: 0;
136
- left: 0;
137
- right: 100%;
138
- height: 300px;
139
- width: 100%;
140
- background-color: #f1f1f1;
141
- padding: 8px;
142
- font-size: 12px;
143
- }
144
-
145
- #bottom-panel.full {
146
- position: static;
147
- background-color: inherit;
148
- height: 90%;
149
- }
150
-
151
- #bottom-panel.full > div {
152
- padding-bottom: 40px;
153
- }
154
- #bottom-panel.full .tabs {
155
- display: none;
156
- }
157
-
158
- #bottom-panel.full .message-info {
159
- position: static;
160
- }
161
-
162
- #bottom-panel.full .message-info .content {
163
- display: block;
164
- position: static;
165
- }
166
-
167
- #bottom-panel.full .save,
168
- #bottom-panel.full .share {
169
- bottom: 10px;
170
- }
171
-
172
- #bottom-panel.full button.delete {
173
- display: none;
174
- }
175
-
176
- #bottom-panel.full .message-actions {
177
- position: fixed;
178
- height: 40px;
179
- width: 100%;
180
- left: 0;
181
- bottom: 0;
182
- background-color: #eee;
183
- border-top: 1px solid #dfdfdf;
184
- padding-left: 10px;
185
- }
186
-
187
- #bottom-panel.full .message-actions button {
188
- margin-top: 10px;
189
- }
190
-
191
- .message-actions {
192
- position: absolute;
193
- bottom: 3px;
194
- right: 30px;
195
- }
196
-
197
- .message-actions button {
198
- margin-right: 7px;
199
- }
200
-
201
- .message-actions .share {
202
- text-decoration: none;
203
- color: #333;
204
- }
205
-
206
- .divider {
207
- position: fixed;
208
- bottom: 310px;
209
- left: 0;
210
- right: 0;
211
- height: 10px;
212
- border-top: 1px solid #ddd;
213
- border-bottom: 1px solid #ddd;
214
- background-color: #fafafa;
215
- cursor: row-resize;
216
- z-index: 1;
217
- }
218
-
219
- .divider div {
220
- margin: auto;
221
- width: 24px;
222
- height: 1px;
223
- background-color: #ccc;
224
- position: relative;
225
- }
226
-
227
- .divider .line-1 {
228
- top: 3px;
229
- }
230
-
231
- .divider .line-2 {
232
- top: 4px;
233
- }
234
-
235
- .divider .line-3 {
236
- top: 5px;
237
- }
238
-
239
- #top-panel {
240
- position: fixed;
241
- top: 0;
242
- left: 0;
243
- right: 0;
244
- bottom: 320px;
245
- overflow: auto;
246
- }
247
-
248
- .message-info {
249
- position: absolute;
250
- border-bottom: 1px solid #ddd;
251
- bottom: 35px;
252
- top: 0;
253
- left: 0;
254
- right: 0;
255
- overflow: auto;
256
- }
257
-
258
- .action-panel {
259
- position: absolute;
260
- left: 0;
261
- right: 0;
262
- bottom: 0;
263
- height: 30px;
264
- font-weight: bold;
265
- }
266
- .action-panel input {
267
- position: relative;
268
- top: -1px;
269
- margin-left: 20px;
270
- vertical-align: sub;
271
- }
272
-
273
- .action-panel .clear {
274
- position: absolute;
275
- right: 30px;
276
- vertical-align: middle;
277
- }
278
-
279
- #log-table {
280
- border-collapse: collapse;
281
- margin: auto;
282
- width: 99%;
283
- table-layout: fixed;
284
- }
285
-
286
- .hidden {
287
- display: none;
288
- }
289
-
290
- .message-info pre {
291
- position: relative;
292
- margin: 10px;
293
- }
294
-
295
- #overlay {
296
- position: fixed;
297
- z-index: 99999;
298
- top: 0;
299
- bottom: 0;
300
- left: 0;
301
- right: 0;
302
- cursor: row-resize;
303
- opacity: 0;
304
- }
305
-
306
- .message-info .content {
307
- position: absolute;
308
- top: 5px;
309
- bottom: 35px;
310
- left: 5px;
311
- right: 5px;
312
- overflow: auto;
313
- display: none;
314
- }
315
-
316
- .message-info .content.active {
317
- display: block;
318
- }
319
-
320
- .tabs {
321
- position: absolute;
322
- bottom: 10px;
323
- left: 0;
324
- right: 0;
325
- list-style-type: none;
326
- border-top: 1px solid #ddd;
327
- margin: 0 0 5px;
328
- padding: 0 0 0 14px;
329
- }
330
- .tabs li {
331
- float: left;
332
- position: relative;
333
- padding-right: 5px;
334
- margin: 0;
335
- }
336
- .tabs a {
337
- position: relative;
338
- top: 4px;
339
- text-decoration: none;
340
- color: #333;
341
- border: 1px solid #ddd;
342
- border-top: none;
343
- border-bottom-left-radius: 5px;
344
- border-bottom-right-radius: 5px;
345
- padding: 4px;
346
- background-color: #e1e1e1;
347
- }
348
-
349
- .tabs a.active {
350
- border-top: 1px solid #f1f1f1;
351
- background-color: #f1f1f1;
352
- }
353
-
354
- .btn {
355
- display: inline-block;
356
- margin: 0;
357
- padding: 2px 12px;
358
- font-weight: 500;
359
- font-size: 1em;
360
- line-height: 18px;
361
- text-align: center;
362
- cursor: pointer;
363
- transition: all 0.25s;
364
- background-color: #ddd;
365
- text-decoration: none;
366
- border: none;
367
- color: #333;
368
- font-weight: normal;
369
- }
370
-
371
- .btn:hover {
372
- color: #000;
373
- background-color: #ccc;
374
- }
375
-
376
- .btn .fa {
377
- margin-right: 7px;
378
- }
379
-
380
- .btn:active {
381
- text-shadow: none;
382
- }
383
-
384
- .btn.danger:hover {
385
- background-color: #c63c1b;
386
- color: #eee;
387
- }
1
+ body {
2
+ font-family: "Roboto", Arial, "Liberation Sans", "DejaVu Sans", sans-serif;
3
+ font-size: 12px;
4
+ }
5
+
6
+ pre {
7
+ font-family: "Roboto Mono", Consolas, Monaco, Ubuntu Mono, monospace;
8
+ }
9
+
10
+ table.env-table tbody tr td {
11
+ border-top: none;
12
+ line-height: 18px;
13
+ vertical-align: top;
14
+ }
15
+
16
+ table.env-table,
17
+ table.env-table table {
18
+ border-spacing: 0;
19
+ border-collapse: collapse;
20
+ }
21
+
22
+ table.env-table td {
23
+ padding-right: 5px;
24
+ }
25
+
26
+ tbody tr {
27
+ width: 98%;
28
+ }
29
+
30
+ tbody tr td {
31
+ border-top: 1px #e9e9e9 solid;
32
+ line-height: 25px;
33
+ }
34
+
35
+ .message-row:hover {
36
+ background-color: #f8f8f8;
37
+ cursor: pointer;
38
+ }
39
+
40
+ .message-row.selected {
41
+ background-color: #dfdfdf;
42
+ }
43
+
44
+ th {
45
+ text-align: left;
46
+ padding-right: 10px;
47
+ font-size: 12px;
48
+ color: #222;
49
+ padding-bottom: 8px;
50
+ }
51
+
52
+ td.time {
53
+ font-size: 12px;
54
+ color: #999;
55
+ vertical-align: top;
56
+ }
57
+ .message {
58
+ font-size: 13px;
59
+ overflow: hidden;
60
+ white-space: nowrap;
61
+ text-overflow: ellipsis;
62
+ padding-right: 10px;
63
+ }
64
+
65
+ th.count {
66
+ width: 20px;
67
+ }
68
+
69
+ th.severity {
70
+ width: 15px;
71
+ }
72
+
73
+ th.time {
74
+ width: 90px;
75
+ text-align: right;
76
+ padding-right: 20px;
77
+ }
78
+
79
+ td.time {
80
+ text-align: right;
81
+ padding-right: 8px;
82
+ }
83
+
84
+ th.protected {
85
+ width: 10px;
86
+ }
87
+
88
+ i.fatal {
89
+ color: #e00;
90
+ }
91
+
92
+ i.error {
93
+ color: #900;
94
+ }
95
+
96
+ i.warning {
97
+ color: #feb800;
98
+ }
99
+
100
+ .debug {
101
+ color: #777;
102
+ }
103
+
104
+ td.count {
105
+ text-align: right;
106
+ padding-right: 4px;
107
+ }
108
+
109
+ .count span {
110
+ font-size: 11px;
111
+ font-weight: bold;
112
+ }
113
+
114
+ .action-panel .search input {
115
+ border: 1px solid #ddd;
116
+ padding: 3px;
117
+ vertical-align: middle;
118
+ }
119
+
120
+ .regex input {
121
+ margin-left: 2px !important;
122
+ }
123
+
124
+ tr.show-more {
125
+ text-align: center;
126
+ height: 30px;
127
+ text-decoration: none;
128
+ background-color: #ddd;
129
+ cursor: pointer;
130
+ font-size: 12px;
131
+ }
132
+
133
+ #bottom-panel {
134
+ position: fixed;
135
+ bottom: 0;
136
+ left: 0;
137
+ right: 100%;
138
+ height: 300px;
139
+ width: 100%;
140
+ background-color: #f1f1f1;
141
+ padding: 8px;
142
+ font-size: 12px;
143
+ }
144
+
145
+ #bottom-panel.full {
146
+ position: static;
147
+ background-color: inherit;
148
+ height: 90%;
149
+ }
150
+
151
+ #bottom-panel.full > div {
152
+ padding-bottom: 40px;
153
+ }
154
+ #bottom-panel.full .tabs {
155
+ display: none;
156
+ }
157
+
158
+ #bottom-panel.full .message-info {
159
+ position: static;
160
+ }
161
+
162
+ #bottom-panel.full .message-info .content {
163
+ display: block;
164
+ position: static;
165
+ }
166
+
167
+ #bottom-panel.full .save,
168
+ #bottom-panel.full .share {
169
+ bottom: 10px;
170
+ }
171
+
172
+ #bottom-panel.full button.delete {
173
+ display: none;
174
+ }
175
+
176
+ #bottom-panel.full .message-actions {
177
+ position: fixed;
178
+ height: 40px;
179
+ width: 100%;
180
+ left: 0;
181
+ bottom: 0;
182
+ background-color: #eee;
183
+ border-top: 1px solid #dfdfdf;
184
+ padding-left: 10px;
185
+ }
186
+
187
+ #bottom-panel.full .message-actions button {
188
+ margin-top: 10px;
189
+ }
190
+
191
+ .message-actions {
192
+ position: absolute;
193
+ bottom: 3px;
194
+ right: 30px;
195
+ }
196
+
197
+ .message-actions button {
198
+ margin-right: 7px;
199
+ }
200
+
201
+ .message-actions .share {
202
+ text-decoration: none;
203
+ color: #333;
204
+ }
205
+
206
+ .divider {
207
+ position: fixed;
208
+ bottom: 310px;
209
+ left: 0;
210
+ right: 0;
211
+ height: 10px;
212
+ border-top: 1px solid #ddd;
213
+ border-bottom: 1px solid #ddd;
214
+ background-color: #fafafa;
215
+ cursor: row-resize;
216
+ z-index: 1;
217
+ }
218
+
219
+ .divider div {
220
+ margin: auto;
221
+ width: 24px;
222
+ height: 1px;
223
+ background-color: #ccc;
224
+ position: relative;
225
+ }
226
+
227
+ .divider .line-1 {
228
+ top: 3px;
229
+ }
230
+
231
+ .divider .line-2 {
232
+ top: 4px;
233
+ }
234
+
235
+ .divider .line-3 {
236
+ top: 5px;
237
+ }
238
+
239
+ #top-panel {
240
+ position: fixed;
241
+ top: 0;
242
+ left: 0;
243
+ right: 0;
244
+ bottom: 320px;
245
+ overflow: auto;
246
+ }
247
+
248
+ .message-info {
249
+ position: absolute;
250
+ border-bottom: 1px solid #ddd;
251
+ bottom: 35px;
252
+ top: 0;
253
+ left: 0;
254
+ right: 0;
255
+ overflow: auto;
256
+ }
257
+
258
+ .action-panel {
259
+ position: absolute;
260
+ left: 0;
261
+ right: 0;
262
+ bottom: 0;
263
+ height: 30px;
264
+ font-weight: bold;
265
+ }
266
+ .action-panel input {
267
+ position: relative;
268
+ top: -1px;
269
+ margin-left: 20px;
270
+ vertical-align: sub;
271
+ }
272
+
273
+ .action-panel .clear {
274
+ position: absolute;
275
+ right: 30px;
276
+ vertical-align: middle;
277
+ }
278
+
279
+ #log-table {
280
+ border-collapse: collapse;
281
+ margin: auto;
282
+ width: 99%;
283
+ table-layout: fixed;
284
+ }
285
+
286
+ .hidden {
287
+ display: none;
288
+ }
289
+
290
+ .message-info pre {
291
+ position: relative;
292
+ margin: 10px;
293
+ }
294
+
295
+ #overlay {
296
+ position: fixed;
297
+ z-index: 99999;
298
+ top: 0;
299
+ bottom: 0;
300
+ left: 0;
301
+ right: 0;
302
+ cursor: row-resize;
303
+ opacity: 0;
304
+ }
305
+
306
+ .message-info .content {
307
+ position: absolute;
308
+ top: 5px;
309
+ bottom: 35px;
310
+ left: 5px;
311
+ right: 5px;
312
+ overflow: auto;
313
+ display: none;
314
+ }
315
+
316
+ .message-info .content.active {
317
+ display: block;
318
+ }
319
+
320
+ .tabs {
321
+ position: absolute;
322
+ bottom: 10px;
323
+ left: 0;
324
+ right: 0;
325
+ list-style-type: none;
326
+ border-top: 1px solid #ddd;
327
+ margin: 0 0 5px;
328
+ padding: 0 0 0 14px;
329
+ }
330
+ .tabs li {
331
+ float: left;
332
+ position: relative;
333
+ padding-right: 5px;
334
+ margin: 0;
335
+ }
336
+ .tabs a {
337
+ position: relative;
338
+ top: 4px;
339
+ text-decoration: none;
340
+ color: #333;
341
+ border: 1px solid #ddd;
342
+ border-top: none;
343
+ border-bottom-left-radius: 5px;
344
+ border-bottom-right-radius: 5px;
345
+ padding: 4px;
346
+ background-color: #e1e1e1;
347
+ }
348
+
349
+ .tabs a.active {
350
+ border-top: 1px solid #f1f1f1;
351
+ background-color: #f1f1f1;
352
+ }
353
+
354
+ .btn {
355
+ display: inline-block;
356
+ margin: 0;
357
+ padding: 2px 12px;
358
+ font-weight: 500;
359
+ font-size: 1em;
360
+ line-height: 18px;
361
+ text-align: center;
362
+ cursor: pointer;
363
+ transition: all 0.25s;
364
+ background-color: #ddd;
365
+ text-decoration: none;
366
+ border: none;
367
+ color: #333;
368
+ font-weight: normal;
369
+ }
370
+
371
+ .btn:hover {
372
+ color: #000;
373
+ background-color: #ccc;
374
+ }
375
+
376
+ .btn .fa {
377
+ margin-right: 7px;
378
+ }
379
+
380
+ .btn:active {
381
+ text-shadow: none;
382
+ }
383
+
384
+ .btn.danger:hover {
385
+ background-color: #c63c1b;
386
+ color: #eee;
387
+ }