Chromium Code Reviews| Index: pkg/polymer/lib/src/build/log_injector.dart |
| diff --git a/pkg/polymer/lib/src/build/log_injector.dart b/pkg/polymer/lib/src/build/log_injector.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..bf7d458de4a465eb918fd18a6111a83a6b3486d0 |
| --- /dev/null |
| +++ b/pkg/polymer/lib/src/build/log_injector.dart |
| @@ -0,0 +1,82 @@ |
| +/// This library provides a single function called injectLogs which when called |
|
Siggi Cherem (dart-lang)
2014/08/01 21:31:52
+ copyright notice above this
jakemac
2014/08/04 19:49:59
Done.
|
| +/// will request a logs json file and build a small widget out of them which |
| +/// groups the logs by level. |
| +library polymer.build.log_injector; |
| + |
| +import 'dart:convert'; |
| +import 'dart:html'; |
| + |
| +import 'package:path/path.dart' as path; |
| + |
| +injectLogs() { |
|
Siggi Cherem (dart-lang)
2014/08/01 21:31:52
Consider adding a note in a comment here to indica
jakemac
2014/08/04 19:49:59
Done.
|
| + var buildLogsUrl = '${window.location.href}._buildLogs'; |
| + var r = HttpRequest.getString(buildLogsUrl).then((data) { |
| + // Group all logs by level. |
| + var logsByLevel = {}; |
| + JSON.decode(data).forEach((log) { |
| + logsByLevel.putIfAbsent(log['level'], () => []); |
| + logsByLevel[log['level']].add(log); |
| + }); |
|
Siggi Cherem (dart-lang)
2014/08/01 21:31:52
maybe return here if there are no messages?
jakemac
2014/08/04 19:49:59
Done.
|
| + |
| + // Build the wrapper, menu, and content divs. |
| + var wrapperDiv = new DivElement()..classes.add('build-logs'); |
|
Siggi Cherem (dart-lang)
2014/08/01 21:31:52
or wrapperDiv = new Element.html('<div class="buil
jakemac
2014/08/04 19:49:58
But mine is shorter! (and a little faster?)
Siggi Cherem (dart-lang)
2014/08/04 20:38:37
:-) let's keep it as you have it.
As of speed go
|
| + var menuWrapper = new DivElement()..classes.add('menu'); |
| + var contentWrapper = new DivElement()..classes.add('content'); |
| + wrapperDiv..append(menuWrapper)..append(contentWrapper); |
| + |
| + // For each log level, add a menu item, content section, and all the logs. |
| + logsByLevel.forEach((level, logs) { |
| + var levelClassName = level.toLowerCase(); |
| + |
| + // Add the menu item and content item. |
| + var menuItem = new DivElement() |
| + ..classes.add(levelClassName) |
| + ..appendHtml('$level <span class="num">(${logs.length})</span>'); |
|
Siggi Cherem (dart-lang)
2014/08/01 21:31:52
how about:
menuItem = new Element.html(
'<div
jakemac
2014/08/04 19:49:59
Done.
|
| + menuWrapper.append(menuItem); |
| + var contentItem = new DivElement()..classes.add(levelClassName); |
| + contentWrapper.append(contentItem); |
| + |
| + // Set up the click handlers. |
| + menuItem.onClick.listen((event) { |
| + // Clear active class from everything, then add it to ourselves. |
| + wrapperDiv.querySelectorAll('.menu > div, .content > div') |
|
Siggi Cherem (dart-lang)
2014/08/01 21:31:52
alternatively:
- save a list of items/contents? s
jakemac
2014/08/04 19:49:58
Done, keeping track of the currently selected item
|
| + .where((e) => !identical(e, menuItem) && !identical(e, contentItem)) |
| + .forEach((e) { e.classes.remove('active'); }); |
| + |
| + menuItem.classes.toggle('active'); |
| + contentItem.classes.toggle('active'); |
| + }); |
| + |
| + // Add the logs to the content item. |
| + logs.forEach((log) { |
|
Siggi Cherem (dart-lang)
2014/08/01 21:31:52
for long blocks, we tend to use a normal loop inst
jakemac
2014/08/04 19:49:58
Done.
|
| + var logHtml = new StringBuffer(); |
| + logHtml.write( |
| + '<div class="message $levelClassName">${log['message']}</div>'); |
| + var assetId = log['assetId']; |
| + if (assetId != null) { |
| + logHtml.write( |
| + '<div class="asset">' |
| + ' <span class="package">${assetId['package']}</span>:' |
| + ' <span class="path">${assetId['path']}</span>' |
| + '</div>'); |
| + } |
| + var span = log['span']; |
| + if (span != null) { |
| + logHtml.write( |
| + '<div class="span">' |
| + ' <div class="location">${span['location']}</div>' |
| + ' <code class="text">${span['text']}</code>' |
| + '</div>'); |
| + } |
| + |
| + var logElement = new DivElement() |
|
Siggi Cherem (dart-lang)
2014/08/01 21:31:52
How about at the beginning do:
logHtml.write('<div
jakemac
2014/08/04 19:49:59
Done.
|
| + ..classes.add('log') |
| + ..appendHtml(logHtml.toString()); |
| + |
| + contentItem.append(logElement); |
| + }); |
| + }); |
| + |
| + document.body.append(wrapperDiv); |
| + }); |
| +} |