mongo_browser 0.2.0.rc2 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. data/.gitignore +3 -1
  2. data/.rspec +1 -1
  3. data/.travis.yml +6 -1
  4. data/CHANGELOG.md +15 -0
  5. data/{grunt.js → Gruntfile.js} +10 -8
  6. data/Procfile +1 -0
  7. data/README.md +44 -2
  8. data/Rakefile +1 -12
  9. data/app/assets/images/ajax-loader.gif +0 -0
  10. data/app/assets/javascripts/app/controllers/{breadcrumbs.js.coffee → breadcrumbs_controller.js.coffee} +4 -7
  11. data/app/assets/javascripts/app/controllers/collections/index_controller.js.coffee +38 -0
  12. data/app/assets/javascripts/app/controllers/collections/stats_controller.js.coffee +17 -0
  13. data/app/assets/javascripts/app/controllers/{databases.js.coffee → databases/index_controller.js.coffee} +11 -15
  14. data/app/assets/javascripts/app/controllers/databases/stats_controller.js.coffee +15 -0
  15. data/app/assets/javascripts/app/controllers/documents/index_controller.js.coffee +54 -0
  16. data/app/assets/javascripts/app/controllers/documents/show_controller.js.coffee +38 -0
  17. data/app/assets/javascripts/app/controllers/main_controller.js.coffee +15 -0
  18. data/app/assets/javascripts/app/controllers/servers/show_controller.js.coffee +17 -0
  19. data/app/assets/javascripts/app/directives.js.coffee +23 -0
  20. data/app/assets/javascripts/app/filters.js.coffee +14 -1
  21. data/app/assets/javascripts/app/modules/alerts.js.coffee +58 -0
  22. data/app/assets/javascripts/app/modules/pager.js.coffee +2 -2
  23. data/app/assets/javascripts/app/modules/spinner.js.coffee +29 -0
  24. data/app/assets/javascripts/app/modules/table_filter.js.coffee +4 -4
  25. data/app/assets/javascripts/app/resources.js.coffee +14 -8
  26. data/app/assets/javascripts/app/services.js.coffee +11 -33
  27. data/app/assets/javascripts/application.js.coffee +62 -34
  28. data/app/assets/javascripts/application.test.js.coffee +5 -0
  29. data/app/assets/javascripts/compiled_templates.js.coffee +1 -0
  30. data/app/assets/javascripts/vendor.js.coffee +0 -1
  31. data/app/assets/stylesheets/application.css.scss +36 -18
  32. data/{public/index.html → app/views/index.erb} +8 -8
  33. data/bin/mongo_browser +2 -13
  34. data/config.ru +3 -1
  35. data/lib/mongo_browser.rb +1 -0
  36. data/lib/mongo_browser/api.rb +11 -0
  37. data/lib/mongo_browser/api/collections.rb +34 -0
  38. data/lib/mongo_browser/api/databases.rb +32 -0
  39. data/lib/mongo_browser/api/documents.rb +37 -0
  40. data/lib/mongo_browser/api/mongo.rb +41 -0
  41. data/lib/mongo_browser/application.rb +8 -174
  42. data/lib/mongo_browser/application/development.rb +32 -0
  43. data/lib/mongo_browser/cli.rb +48 -0
  44. data/lib/mongo_browser/entities.rb +43 -0
  45. data/lib/mongo_browser/models/collection.rb +7 -12
  46. data/lib/mongo_browser/models/document.rb +5 -1
  47. data/lib/mongo_browser/models/pager.rb +22 -9
  48. data/lib/mongo_browser/version.rb +1 -1
  49. data/mongo_browser.gemspec +22 -15
  50. data/package.json +30 -0
  51. data/public/ng/templates/alerts.html +6 -0
  52. data/public/ng/templates/collections/index.html +39 -0
  53. data/public/ng/templates/collections/stats.html +18 -0
  54. data/public/ng/templates/databases/index.html +35 -0
  55. data/public/ng/templates/databases/stats.html +18 -0
  56. data/public/ng/templates/documents/index.html +40 -0
  57. data/public/ng/templates/documents/show.html +17 -0
  58. data/{app/assets → public/ng}/templates/pager.html +0 -0
  59. data/{app/assets/templates/server_info.html → public/ng/templates/server/show.html} +1 -1
  60. data/{app/assets → public/ng}/templates/table_filter.html +0 -0
  61. data/script/ci_all +5 -1
  62. data/script/ci_e2e +5 -2
  63. data/script/ci_javascripts +1 -1
  64. data/script/ci_rspec +1 -1
  65. data/spec/javascripts/app/controllers/{breadcrumbs_spec.js.coffee → breadcrumbs_controller_spec.js.coffee} +1 -1
  66. data/spec/javascripts/app/controllers/collections/index_controller_spec.js.coffee +95 -0
  67. data/spec/javascripts/app/controllers/collections/stats_controller_spec.js.coffee +34 -0
  68. data/spec/javascripts/app/controllers/databases/index_controller_spec.js.coffee +93 -0
  69. data/spec/javascripts/app/controllers/databases/stats_controller_spec.js.coffee +30 -0
  70. data/spec/javascripts/app/controllers/documents/index_controller_spec.js.coffee +108 -0
  71. data/spec/javascripts/app/controllers/documents/show_controller_spec.js.coffee +94 -0
  72. data/spec/javascripts/app/controllers/{main_spec.js.coffee → main_controller_spec.js.coffee} +2 -2
  73. data/spec/javascripts/app/controllers/{server_info_spec.js.coffee → server/show_controller_spec.js.coffee} +5 -6
  74. data/spec/javascripts/app/directives_spec.js.coffee +108 -24
  75. data/spec/javascripts/app/filters_spec.js.coffee +31 -5
  76. data/spec/javascripts/app/modules/alerts_spec.js.coffee +138 -0
  77. data/spec/javascripts/app/modules/dialogs_spec.js.coffee +1 -2
  78. data/spec/javascripts/app/modules/pager_spec.js.coffee +0 -1
  79. data/spec/javascripts/app/modules/spinner_spec.js.coffee +65 -0
  80. data/spec/javascripts/app/modules/table_filter_spec.js.coffee +9 -9
  81. data/spec/javascripts/app/resources_spec.js.coffee +99 -0
  82. data/spec/javascripts/app/services_spec.js.coffee +31 -71
  83. data/spec/javascripts/config/{testacular-e2e.conf.js → karma-e2e.conf.js} +1 -1
  84. data/spec/javascripts/config/{testacular.conf.js → karma.conf.js} +2 -3
  85. data/spec/javascripts/e2e/collection_stats_scenario.js.coffee +12 -0
  86. data/spec/javascripts/e2e/collections_scenario.js.coffee +59 -20
  87. data/spec/javascripts/e2e/database_stats_scenario.js.coffee +11 -0
  88. data/spec/javascripts/e2e/databases_scenario.js.coffee +37 -36
  89. data/spec/javascripts/e2e/document_show_scenario.js.coffee +31 -0
  90. data/spec/javascripts/e2e/documents_pagination_scenario.js.coffee +33 -0
  91. data/spec/javascripts/e2e/documents_scenario.js.coffee +43 -4
  92. data/spec/javascripts/e2e/server_info_scenario.js.coffee +8 -2
  93. data/spec/javascripts/helpers/mocks.js.coffee +2 -0
  94. data/spec/javascripts/helpers_e2e/dsl.js.coffee +20 -0
  95. data/spec/javascripts/lib/angular-mocks.js +64 -16
  96. data/spec/javascripts/lib/angular-scenario.js +724 -561
  97. data/spec/javascripts/runner.html +5 -5
  98. data/spec/lib/api/collections_spec.rb +62 -0
  99. data/spec/lib/api/databases_spec.rb +58 -0
  100. data/spec/lib/api/documents_spec.rb +135 -0
  101. data/spec/lib/api/mongo_spec.rb +27 -0
  102. data/spec/lib/cli_spec.rb +19 -0
  103. data/spec/lib/entities_spec.rb +39 -0
  104. data/spec/lib/models/collection_spec.rb +16 -10
  105. data/spec/lib/models/database_spec.rb +4 -4
  106. data/spec/lib/models/document_spec.rb +5 -5
  107. data/spec/lib/models/pager_spec.rb +20 -11
  108. data/spec/spec_helper.rb +7 -15
  109. data/spec/support/api_example_group.rb +45 -0
  110. data/spec/support/fixtures.rb +10 -6
  111. data/spec/support/matchers/expose.rb +18 -0
  112. data/vendor/assets/javascripts/angular/angular-bootstrap.js +1 -1
  113. data/vendor/assets/javascripts/angular/angular-resource.js +78 -56
  114. data/vendor/assets/javascripts/angular/angular-sanitize.js +3 -1
  115. data/vendor/assets/javascripts/angular/angular.js +720 -404
  116. metadata +323 -183
  117. data/app/assets/javascripts/app.js.coffee +0 -8
  118. data/app/assets/javascripts/app/controllers.js.coffee +0 -2
  119. data/app/assets/javascripts/app/controllers/alerts.js.coffee +0 -12
  120. data/app/assets/javascripts/app/controllers/collections.js.coffee +0 -40
  121. data/app/assets/javascripts/app/controllers/documents.js.coffee +0 -49
  122. data/app/assets/javascripts/app/controllers/main.js.coffee +0 -10
  123. data/app/assets/javascripts/app/controllers/server_info.js.coffee +0 -14
  124. data/app/assets/javascripts/templates.js.coffee +0 -1
  125. data/app/assets/javascripts/templates/.gitkeep +0 -0
  126. data/app/assets/templates/collections.html +0 -53
  127. data/app/assets/templates/databases.html +0 -32
  128. data/app/assets/templates/documents.html +0 -45
  129. data/config-e2e.ru +0 -20
  130. data/spec/features/collections_list_spec.rb +0 -64
  131. data/spec/features/documents_list_spec.rb +0 -139
  132. data/spec/features/server_info_spec.rb +0 -23
  133. data/spec/javascripts/app/controllers/alerts_spec.js.coffee +0 -36
  134. data/spec/javascripts/app/controllers/collections_spec.js.coffee +0 -78
  135. data/spec/javascripts/app/controllers/databases_spec.js.coffee +0 -55
  136. data/spec/javascripts/app/controllers/documents_spec.js.coffee +0 -62
  137. data/spec/javascripts/helpers_e2e/app_element.js.coffee +0 -6
  138. data/spec/support/feature_example_group.rb +0 -53
  139. data/spec/support/matchers/have_flash_message.rb +0 -16
  140. data/spec/support/mongod.rb +0 -91
  141. data/spec/support/mongodb.conf +0 -47
@@ -0,0 +1,17 @@
1
+ class ServersShowCtrl
2
+ @$inject = ["$scope", "$http"]
3
+ constructor: (@$scope, @$http) ->
4
+ @loading = true
5
+ @fetchServerInfo()
6
+
7
+ $scope.isLoading = => @loading
8
+
9
+ fetchServerInfo: ->
10
+ @$http.get("/api/server_info").success(@onLoadComplete)
11
+
12
+ onLoadComplete: (data) =>
13
+ @$scope.serverInfo = data
14
+ @loading = false
15
+
16
+ angular.module("mb")
17
+ .controller("servers.show", ServersShowCtrl)
@@ -9,6 +9,19 @@ module.directive "onEsc", ->
9
9
  return unless event.keyCode is EscapeCode
10
10
  $scope.$apply(attrs.onEsc)
11
11
 
12
+ module.directive "showButton", ->
13
+ replace: true
14
+ restrict: "E"
15
+ scope:
16
+ path: "@path",
17
+ label: "@label"
18
+ template: """
19
+ <a class="btn btn-success" href="{{path}}">
20
+ <i class="icon-th-list"></i>
21
+ {{label || "Show"}}
22
+ </a>
23
+ """
24
+
12
25
  module.directive "deleteButton", ->
13
26
  replace: true
14
27
  restrict: "E"
@@ -18,3 +31,13 @@ module.directive "deleteButton", ->
18
31
  Delete
19
32
  </a>
20
33
  """
34
+
35
+ module.directive "refreshButton", ->
36
+ replace: true
37
+ restrict: "E"
38
+ template: """
39
+ <a class="btn">
40
+ <i class="icon-refresh"></i>
41
+ Refresh
42
+ </a>
43
+ """
@@ -7,7 +7,7 @@ module.filter "humanSize", -> (bytes) ->
7
7
 
8
8
  "#{scaledSize} #{sizes[n]}"
9
9
 
10
- module.filter "jsonDocument", -> (document) ->
10
+ module.filter "jsonDocument", -> (document = {}) ->
11
11
  str = JSON.stringify(document, undefined, 2)
12
12
 
13
13
  # Replace for the ObjectId
@@ -46,3 +46,16 @@ module.filter "documentsPath", (collectionsPathFilter) ->
46
46
  collectionName = collection.name || ":collectionName"
47
47
 
48
48
  "#{collectionsPathFilter(name: dbName)}/#{collectionName}/documents"
49
+
50
+ module.filter "documentPath", (documentsPathFilter) ->
51
+ (document = {}) ->
52
+ dbName = document.dbName || ":dbName"
53
+ collectionName = document.collectionName || ":collectionName"
54
+ id = document.id || ":id"
55
+
56
+ "#{documentsPathFilter(dbName: dbName, name: collectionName)}/#{id}"
57
+
58
+ module.filter "documentPrettyTime", ->
59
+ (document) ->
60
+ timestamp = document.id.toString().substring(0, 8)
61
+ new Date(parseInt(timestamp, 16) * 1000).toGMTString()
@@ -0,0 +1,58 @@
1
+ alerts = angular.module("mb.alerts", [])
2
+
3
+ class Alerts
4
+ @$inject = ["$log", "$timeout", "alertTimeout"]
5
+ constructor: (@$log, @$timeout, @alertTimeout) ->
6
+ @lastId = 0
7
+ @messages = []
8
+
9
+ # Returns a next id for the new message
10
+ nextId: ->
11
+ @lastId += 1
12
+
13
+ push: (type, text) ->
14
+ id = @nextId()
15
+ @$log.info("Alert [#{id}, #{type}]", text)
16
+
17
+ @messages.push(id: id, type: type, text: text)
18
+ @delayedDispose(id)
19
+
20
+ id
21
+
22
+ # Helper methods for various alerts types
23
+ info: (text) -> @push("info", text)
24
+ error: (text) -> @push("error", text)
25
+
26
+ # Disposes a message with the given id
27
+ dispose: (id) ->
28
+ at = @messages.map((message) -> message.id).indexOf(id)
29
+ @messages.splice(at, 1)
30
+
31
+ # Dispose the message after the given time in milliseconds
32
+ delayedDispose: (id) ->
33
+ if @alertTimeout? and @alertTimeout > 0
34
+ disposeTheAlert = =>
35
+ @$log.info("Disposing alert", id, "after", @alertTimeout, "milliseconds")
36
+ @dispose(id)
37
+ @$timeout(disposeTheAlert, @alertTimeout)
38
+
39
+ alerts.service "alerts", Alerts
40
+
41
+ class AlertsCtrl
42
+ @$inject = ["$scope", "alerts"]
43
+ constructor: (@$scope, @alerts) ->
44
+ @$scope.alertMessages = @alerts.messages
45
+
46
+ @$scope.disposeAlert = (id) =>
47
+ @alerts.dispose(id)
48
+
49
+ alerts.controller "alerts", AlertsCtrl
50
+
51
+ alerts.directive "alerts", ->
52
+ restrict: "E"
53
+ transclude: true
54
+
55
+ templateUrl: "/ng/templates/alerts.html"
56
+ replace: true
57
+
58
+ controller: "alerts"
@@ -46,7 +46,7 @@ pager.factory "pager", ->
46
46
  left.concat(middle).concat(right)
47
47
 
48
48
  # TODO block button when the resource is loading
49
- class PagerController
49
+ class PagerCtrl
50
50
  constructor: (@$scope, @pager) ->
51
51
  @$scope.$watch "page", => @paginate()
52
52
  @$scope.$watch "totalPages", => @paginate()
@@ -73,7 +73,7 @@ class PagerController
73
73
  prepare = @pager(page: @$scope.page, totalPages: @$scope.totalPages)
74
74
  @$scope.windowedPageNumbers = prepare.windowedPageNumbers()
75
75
 
76
- pager.controller "pager", PagerController
76
+ pager.controller "pager", PagerCtrl
77
77
 
78
78
  pager.directive "pager", ->
79
79
  templateUrl: "/ng/templates/pager.html"
@@ -0,0 +1,29 @@
1
+ spinner = angular.module("mb.spinner", [])
2
+
3
+ spinner.factory "httpRequestTracker", [
4
+ "$http", ($http) ->
5
+ hasPendingRequests: ->
6
+ $http.pendingRequests.length > 0
7
+ ]
8
+
9
+ class SpinnerCtrl
10
+ @$inject = ["$scope", "httpRequestTracker"]
11
+ constructor: (@$scope, @httpRequestTracker) ->
12
+ @$scope.showSpinner = @showSpinner
13
+
14
+ showSpinner: =>
15
+ @httpRequestTracker.hasPendingRequests()
16
+
17
+ spinner.controller "spinner", SpinnerCtrl
18
+
19
+ spinner.directive "spinner", ->
20
+ replace: true
21
+ restrict: "E"
22
+ template: """
23
+ <li class="spinner">
24
+ <a href="#">
25
+ <img ng-show="showSpinner()" src="/assets/ajax-loader.gif" />
26
+ </a>
27
+ </li>
28
+ """
29
+ controller: "spinner"
@@ -1,6 +1,6 @@
1
1
  taleFilter = angular.module("mb.tableFilter", [])
2
2
 
3
- class TableFilterController
3
+ class TableFilterCtrl
4
4
  constructor: ($scope) ->
5
5
  # Clears the filter value
6
6
  $scope.clear = -> $scope.value = ""
@@ -8,17 +8,17 @@ class TableFilterController
8
8
  # Reruns true when the filter is empty
9
9
  $scope.isEmpty = -> !$scope.value
10
10
 
11
- TableFilterController.$inject = ["$scope"]
11
+ TableFilterCtrl.$inject = ["$scope"]
12
12
 
13
- taleFilter.controller "tableFilter", TableFilterController
13
+ taleFilter.controller "tableFilter", TableFilterCtrl
14
14
 
15
15
  # Filter for databases and collections
16
16
  taleFilter.directive "tableFilter", ->
17
17
  restrict: "E"
18
18
  transclude: true
19
+ replace: true
19
20
 
20
21
  templateUrl: "/ng/templates/table_filter.html"
21
- replace: true
22
22
 
23
23
  scope:
24
24
  placeholder: "@placeholder"
@@ -1,22 +1,28 @@
1
1
  angular.module "mb.resources", ["ngResource", "mb.filters"], ($provide) ->
2
2
 
3
3
  $provide.factory "Database", [
4
- "$resource", (resource) ->
4
+ "$resource", ($resource) ->
5
5
 
6
- resource "/api/databases.json", {},
7
- query: method: "GET", isArray: true
6
+ paramDefaults = dbName: "@name"
7
+ $resource "/api/databases/:dbName/:action", paramDefaults,
8
+ query: { method: "GET", isArray: true },
9
+ stats: { method: "GET", params: { action: "stats" } }
8
10
  ]
9
11
 
10
12
  $provide.factory "Collection", [
11
- "$resource", "$filter", (resource, $filter) ->
13
+ "$resource", "$filter", ($resource, $filter) ->
12
14
 
13
- resource "/api#{$filter("collectionsPath")()}.json", {},
14
- query: method: "GET", isArray: true
15
+ paramDefaults = dbName: "@dbName", collectionName: "@name"
16
+ $resource "/api#{$filter("collectionsPath")()}/:collectionName/:action",
17
+ paramDefaults,
18
+ query: { method: "GET", isArray: true },
19
+ stats: { method: "GET", params: { action: "stats" } }
15
20
  ]
16
21
 
17
22
  $provide.factory "Document", [
18
- "$resource", "$filter", (resource, $filter) ->
23
+ "$resource", "$filter", ($resource, $filter) ->
19
24
 
20
- resource "/api#{$filter("documentsPath")()}.json", {},
25
+ paramDefaults = dbName: "@dbName", collectionName: "@collectionName", id: "@id"
26
+ $resource "/api#{$filter("documentsPath")()}/:id", paramDefaults,
21
27
  query: method: "GET", isArray: false
22
28
  ]
@@ -1,36 +1,14 @@
1
- angular.module "mb.services", [], ($provide) ->
1
+ module = angular.module("mb.services", [])
2
2
 
3
- $provide.factory "alerts", [
4
- "$log", "$timeout", ($log, $timeout) ->
5
- lastId: 0
6
- messages: []
3
+ module.factory "httpErrorsInterceptor", [
4
+ "$injector", "$q", "alerts", ($injector, $q, alerts) ->
5
+ (promise) ->
6
+ $http = $injector.get("$http")
7
7
 
8
- # Returns a next id for the new message
9
- nextId: ->
10
- @lastId += 1
8
+ onError = (response) ->
9
+ errorMessage = response.data?.error || "Unexpected HTTP error"
10
+ alerts.error(errorMessage)
11
+ $q.reject(response)
11
12
 
12
- push: (type, text) ->
13
- id = @nextId()
14
- $log.info("Alert [#{id}, #{type}]", text)
15
-
16
- @messages.push(id: id, type: type, text: text)
17
- @delayedDispose(id)
18
-
19
- id
20
-
21
- # Helper methods for various alerts types
22
- info: (text) -> @push("info", text)
23
- error: (text) -> @push("error", text)
24
-
25
- # Disposes a message with the given id
26
- dispose: (id) ->
27
- at = @messages.map((message) -> message.id).indexOf(id)
28
- @messages.splice(at, 1)
29
-
30
- # Dispose the message after the given time in milliseconds
31
- delayedDispose: (id, timeout = 3000) ->
32
- disposeTheAlert = =>
33
- $log.info("Disposing alert", id, "after", timeout, "milliseconds")
34
- @dispose(id)
35
- $timeout(disposeTheAlert, timeout)
36
- ]
13
+ promise.then(null, onError)
14
+ ]
@@ -1,36 +1,64 @@
1
- #= require app
1
+ #= require_tree ./app/modules
2
+ #= require app/resources
3
+ #= require app/directives
4
+ #= require app/filters
5
+ #= require app/services
6
+
7
+ #= require_self
8
+
9
+ #= require_tree ./app/controllers
2
10
 
3
11
  # App Module
4
- requires = [
5
- "bootstrap", "ngSanitize",
6
- "mb.controllers", "mb.directives", "mb.filters",
7
- "mb.dialogs", "mb.pager", "mb.tableFilter"]
8
-
9
- angular.module("mb", requires)
10
- .config [
11
- "$routeProvider", "$locationProvider", (route, location) ->
12
- route
13
- # Main page, list of all available databases
14
- .when "/",
15
- templateUrl: "/ng/templates/databases.html",
16
- controller: "databases"
17
-
18
- # List of collections for the given database
19
- .when "/databases/:dbName/collections",
20
- templateUrl: "/ng/templates/collections.html",
21
- controller: "collections"
22
-
23
- # list of documents for the given collection
24
- .when "/databases/:dbName/collections/:collectionName/documents",
25
- templateUrl: "/ng/templates/documents.html",
26
- controller: "documents"
27
-
28
- # Information about the server
29
- .when "/server_info",
30
- templateUrl: "/ng/templates/server_info.html",
31
- controller: "serverInfo"
32
-
33
- .otherwise(redirectTo: "/")
34
-
35
- location.html5Mode(true)
36
- ]
12
+ mb = angular.module "mb", [
13
+ "ngSanitize",
14
+ "mb.resources", "mb.directives", "mb.filters", "mb.services",
15
+ "mb.dialogs", "mb.pager", "mb.tableFilter", "mb.alerts", "mb.spinner"
16
+ ]
17
+
18
+ mb.config [
19
+ "$provide", "$httpProvider", "$routeProvider", "$locationProvider",
20
+ ($provide, $httpProvider, $routeProvider, $locationProvider) ->
21
+ $provide.value("alertTimeout", 3000)
22
+
23
+ $httpProvider.responseInterceptors.push("httpErrorsInterceptor")
24
+
25
+ $routeProvider
26
+ # Main page, list of all available databases
27
+ .when "/",
28
+ templateUrl: "/ng/templates/databases/index.html",
29
+ controller: "databases.index"
30
+
31
+ # Database stats
32
+ .when "/databases/:dbName/stats",
33
+ templateUrl: "/ng/templates/databases/stats.html",
34
+ controller: "databases.stats"
35
+
36
+ # List of collections for the given database
37
+ .when "/databases/:dbName/collections",
38
+ templateUrl: "/ng/templates/collections/index.html",
39
+ controller: "collections.index"
40
+
41
+ # Collection stats
42
+ .when "/databases/:dbName/collections/:collectionName/stats",
43
+ templateUrl: "/ng/templates/collections/stats.html",
44
+ controller: "collections.stats",
45
+
46
+ # List of documents for the given collection
47
+ .when "/databases/:dbName/collections/:collectionName/documents",
48
+ templateUrl: "/ng/templates/documents/index.html",
49
+ controller: "documents.index",
50
+ reloadOnSearch: false
51
+
52
+ .when "/databases/:dbName/collections/:collectionName/documents/:id",
53
+ templateUrl: "/ng/templates/documents/show.html",
54
+ controller: "documents.show",
55
+
56
+ # Information about the server
57
+ .when "/server_info",
58
+ templateUrl: "/ng/templates/server/show.html",
59
+ controller: "servers.show"
60
+
61
+ .otherwise(redirectTo: "/")
62
+
63
+ $locationProvider.html5Mode(true)
64
+ ]
@@ -0,0 +1,5 @@
1
+ angular.module("mb")
2
+ .config [
3
+ "$provide", ($provide) ->
4
+ $provide.value("alertTimeout", null)
5
+ ]
@@ -0,0 +1 @@
1
+ #= require_tree compiled_templates
@@ -3,6 +3,5 @@
3
3
  #= require bootstrap
4
4
  #= require bootbox
5
5
  #= require angular/angular
6
- #= require angular/angular-bootstrap
7
6
  #= require angular/angular-resource
8
7
  #= require angular/angular-sanitize
@@ -1,7 +1,5 @@
1
- /*
2
- *= require bootstrap
3
- *= require_self
4
- */
1
+ //= require bootstrap
2
+ //= require_self
5
3
 
6
4
  body {
7
5
  position: relative;
@@ -47,24 +45,40 @@ section.container {
47
45
 
48
46
  table.table {
49
47
  tr {
50
- &.document td.data pre {
51
- background: none;
52
- border: 0px;
53
- padding: 0px;
54
- display: inline;
48
+ height: 47px;
55
49
 
56
- // syntax higlight for json document
57
- span {
58
- &.string { color: green; }
59
- &.number { color: darkorange; }
60
- &.boolean { color: blue; }
61
- &.null { color: magenta; }
62
- &.key { color: red; }
50
+ td {
51
+ vertical-align: middle;
52
+ &:last-child {
53
+ width: 175px;
63
54
  }
64
55
  }
65
56
 
66
- th.actions {
67
- width: 90px;
57
+ &.document td.data {
58
+ .id {
59
+ font-size: large;
60
+ font-weight: bold;
61
+
62
+ a {
63
+ color: black;
64
+ }
65
+ }
66
+
67
+ pre {
68
+ background: none;
69
+ border: 0px;
70
+ padding: 0px;
71
+ display: inline;
72
+
73
+ // syntax higlight for json document
74
+ span {
75
+ &.string { color: green; }
76
+ &.number { color: darkorange; }
77
+ &.boolean { color: blue; }
78
+ &.null { color: magenta; }
79
+ &.key { color: red; }
80
+ }
81
+ }
68
82
  }
69
83
  }
70
84
  }
@@ -77,3 +91,7 @@ ul.nav.breadcrumbs {
77
91
  background-color: transparent;
78
92
  }
79
93
  }
94
+
95
+ li.spinner {
96
+ width: 45px;
97
+ }