mongo_browser 0.2.0.rc2 → 0.2.5

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.
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
+ }