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.
- data/.gitignore +3 -1
- data/.rspec +1 -1
- data/.travis.yml +6 -1
- data/CHANGELOG.md +15 -0
- data/{grunt.js → Gruntfile.js} +10 -8
- data/Procfile +1 -0
- data/README.md +44 -2
- data/Rakefile +1 -12
- data/app/assets/images/ajax-loader.gif +0 -0
- data/app/assets/javascripts/app/controllers/{breadcrumbs.js.coffee → breadcrumbs_controller.js.coffee} +4 -7
- data/app/assets/javascripts/app/controllers/collections/index_controller.js.coffee +38 -0
- data/app/assets/javascripts/app/controllers/collections/stats_controller.js.coffee +17 -0
- data/app/assets/javascripts/app/controllers/{databases.js.coffee → databases/index_controller.js.coffee} +11 -15
- data/app/assets/javascripts/app/controllers/databases/stats_controller.js.coffee +15 -0
- data/app/assets/javascripts/app/controllers/documents/index_controller.js.coffee +54 -0
- data/app/assets/javascripts/app/controllers/documents/show_controller.js.coffee +38 -0
- data/app/assets/javascripts/app/controllers/main_controller.js.coffee +15 -0
- data/app/assets/javascripts/app/controllers/servers/show_controller.js.coffee +17 -0
- data/app/assets/javascripts/app/directives.js.coffee +23 -0
- data/app/assets/javascripts/app/filters.js.coffee +14 -1
- data/app/assets/javascripts/app/modules/alerts.js.coffee +58 -0
- data/app/assets/javascripts/app/modules/pager.js.coffee +2 -2
- data/app/assets/javascripts/app/modules/spinner.js.coffee +29 -0
- data/app/assets/javascripts/app/modules/table_filter.js.coffee +4 -4
- data/app/assets/javascripts/app/resources.js.coffee +14 -8
- data/app/assets/javascripts/app/services.js.coffee +11 -33
- data/app/assets/javascripts/application.js.coffee +62 -34
- data/app/assets/javascripts/application.test.js.coffee +5 -0
- data/app/assets/javascripts/compiled_templates.js.coffee +1 -0
- data/app/assets/javascripts/vendor.js.coffee +0 -1
- data/app/assets/stylesheets/application.css.scss +36 -18
- data/{public/index.html → app/views/index.erb} +8 -8
- data/bin/mongo_browser +2 -13
- data/config.ru +3 -1
- data/lib/mongo_browser.rb +1 -0
- data/lib/mongo_browser/api.rb +11 -0
- data/lib/mongo_browser/api/collections.rb +34 -0
- data/lib/mongo_browser/api/databases.rb +32 -0
- data/lib/mongo_browser/api/documents.rb +37 -0
- data/lib/mongo_browser/api/mongo.rb +41 -0
- data/lib/mongo_browser/application.rb +8 -174
- data/lib/mongo_browser/application/development.rb +32 -0
- data/lib/mongo_browser/cli.rb +48 -0
- data/lib/mongo_browser/entities.rb +43 -0
- data/lib/mongo_browser/models/collection.rb +7 -12
- data/lib/mongo_browser/models/document.rb +5 -1
- data/lib/mongo_browser/models/pager.rb +22 -9
- data/lib/mongo_browser/version.rb +1 -1
- data/mongo_browser.gemspec +22 -15
- data/package.json +30 -0
- data/public/ng/templates/alerts.html +6 -0
- data/public/ng/templates/collections/index.html +39 -0
- data/public/ng/templates/collections/stats.html +18 -0
- data/public/ng/templates/databases/index.html +35 -0
- data/public/ng/templates/databases/stats.html +18 -0
- data/public/ng/templates/documents/index.html +40 -0
- data/public/ng/templates/documents/show.html +17 -0
- data/{app/assets → public/ng}/templates/pager.html +0 -0
- data/{app/assets/templates/server_info.html → public/ng/templates/server/show.html} +1 -1
- data/{app/assets → public/ng}/templates/table_filter.html +0 -0
- data/script/ci_all +5 -1
- data/script/ci_e2e +5 -2
- data/script/ci_javascripts +1 -1
- data/script/ci_rspec +1 -1
- data/spec/javascripts/app/controllers/{breadcrumbs_spec.js.coffee → breadcrumbs_controller_spec.js.coffee} +1 -1
- data/spec/javascripts/app/controllers/collections/index_controller_spec.js.coffee +95 -0
- data/spec/javascripts/app/controllers/collections/stats_controller_spec.js.coffee +34 -0
- data/spec/javascripts/app/controllers/databases/index_controller_spec.js.coffee +93 -0
- data/spec/javascripts/app/controllers/databases/stats_controller_spec.js.coffee +30 -0
- data/spec/javascripts/app/controllers/documents/index_controller_spec.js.coffee +108 -0
- data/spec/javascripts/app/controllers/documents/show_controller_spec.js.coffee +94 -0
- data/spec/javascripts/app/controllers/{main_spec.js.coffee → main_controller_spec.js.coffee} +2 -2
- data/spec/javascripts/app/controllers/{server_info_spec.js.coffee → server/show_controller_spec.js.coffee} +5 -6
- data/spec/javascripts/app/directives_spec.js.coffee +108 -24
- data/spec/javascripts/app/filters_spec.js.coffee +31 -5
- data/spec/javascripts/app/modules/alerts_spec.js.coffee +138 -0
- data/spec/javascripts/app/modules/dialogs_spec.js.coffee +1 -2
- data/spec/javascripts/app/modules/pager_spec.js.coffee +0 -1
- data/spec/javascripts/app/modules/spinner_spec.js.coffee +65 -0
- data/spec/javascripts/app/modules/table_filter_spec.js.coffee +9 -9
- data/spec/javascripts/app/resources_spec.js.coffee +99 -0
- data/spec/javascripts/app/services_spec.js.coffee +31 -71
- data/spec/javascripts/config/{testacular-e2e.conf.js → karma-e2e.conf.js} +1 -1
- data/spec/javascripts/config/{testacular.conf.js → karma.conf.js} +2 -3
- data/spec/javascripts/e2e/collection_stats_scenario.js.coffee +12 -0
- data/spec/javascripts/e2e/collections_scenario.js.coffee +59 -20
- data/spec/javascripts/e2e/database_stats_scenario.js.coffee +11 -0
- data/spec/javascripts/e2e/databases_scenario.js.coffee +37 -36
- data/spec/javascripts/e2e/document_show_scenario.js.coffee +31 -0
- data/spec/javascripts/e2e/documents_pagination_scenario.js.coffee +33 -0
- data/spec/javascripts/e2e/documents_scenario.js.coffee +43 -4
- data/spec/javascripts/e2e/server_info_scenario.js.coffee +8 -2
- data/spec/javascripts/helpers/mocks.js.coffee +2 -0
- data/spec/javascripts/helpers_e2e/dsl.js.coffee +20 -0
- data/spec/javascripts/lib/angular-mocks.js +64 -16
- data/spec/javascripts/lib/angular-scenario.js +724 -561
- data/spec/javascripts/runner.html +5 -5
- data/spec/lib/api/collections_spec.rb +62 -0
- data/spec/lib/api/databases_spec.rb +58 -0
- data/spec/lib/api/documents_spec.rb +135 -0
- data/spec/lib/api/mongo_spec.rb +27 -0
- data/spec/lib/cli_spec.rb +19 -0
- data/spec/lib/entities_spec.rb +39 -0
- data/spec/lib/models/collection_spec.rb +16 -10
- data/spec/lib/models/database_spec.rb +4 -4
- data/spec/lib/models/document_spec.rb +5 -5
- data/spec/lib/models/pager_spec.rb +20 -11
- data/spec/spec_helper.rb +7 -15
- data/spec/support/api_example_group.rb +45 -0
- data/spec/support/fixtures.rb +10 -6
- data/spec/support/matchers/expose.rb +18 -0
- data/vendor/assets/javascripts/angular/angular-bootstrap.js +1 -1
- data/vendor/assets/javascripts/angular/angular-resource.js +78 -56
- data/vendor/assets/javascripts/angular/angular-sanitize.js +3 -1
- data/vendor/assets/javascripts/angular/angular.js +720 -404
- metadata +323 -183
- data/app/assets/javascripts/app.js.coffee +0 -8
- data/app/assets/javascripts/app/controllers.js.coffee +0 -2
- data/app/assets/javascripts/app/controllers/alerts.js.coffee +0 -12
- data/app/assets/javascripts/app/controllers/collections.js.coffee +0 -40
- data/app/assets/javascripts/app/controllers/documents.js.coffee +0 -49
- data/app/assets/javascripts/app/controllers/main.js.coffee +0 -10
- data/app/assets/javascripts/app/controllers/server_info.js.coffee +0 -14
- data/app/assets/javascripts/templates.js.coffee +0 -1
- data/app/assets/javascripts/templates/.gitkeep +0 -0
- data/app/assets/templates/collections.html +0 -53
- data/app/assets/templates/databases.html +0 -32
- data/app/assets/templates/documents.html +0 -45
- data/config-e2e.ru +0 -20
- data/spec/features/collections_list_spec.rb +0 -64
- data/spec/features/documents_list_spec.rb +0 -139
- data/spec/features/server_info_spec.rb +0 -23
- data/spec/javascripts/app/controllers/alerts_spec.js.coffee +0 -36
- data/spec/javascripts/app/controllers/collections_spec.js.coffee +0 -78
- data/spec/javascripts/app/controllers/databases_spec.js.coffee +0 -55
- data/spec/javascripts/app/controllers/documents_spec.js.coffee +0 -62
- data/spec/javascripts/helpers_e2e/app_element.js.coffee +0 -6
- data/spec/support/feature_example_group.rb +0 -53
- data/spec/support/matchers/have_flash_message.rb +0 -16
- data/spec/support/mongod.rb +0 -91
- 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
|
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",
|
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
|
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
|
-
|
11
|
+
TableFilterCtrl.$inject = ["$scope"]
|
12
12
|
|
13
|
-
taleFilter.controller "tableFilter",
|
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
|
-
|
7
|
-
|
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
|
-
|
14
|
-
|
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
|
-
|
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
|
1
|
+
module = angular.module("mb.services", [])
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module.factory "httpErrorsInterceptor", [
|
4
|
+
"$injector", "$q", "alerts", ($injector, $q, alerts) ->
|
5
|
+
(promise) ->
|
6
|
+
$http = $injector.get("$http")
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
onError = (response) ->
|
9
|
+
errorMessage = response.data?.error || "Unexpected HTTP error"
|
10
|
+
alerts.error(errorMessage)
|
11
|
+
$q.reject(response)
|
11
12
|
|
12
|
-
|
13
|
-
|
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
|
-
#=
|
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
|
-
|
5
|
-
"
|
6
|
-
"mb.
|
7
|
-
"mb.dialogs", "mb.pager", "mb.tableFilter"
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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 @@
|
|
1
|
+
#= require_tree compiled_templates
|
@@ -1,7 +1,5 @@
|
|
1
|
-
|
2
|
-
|
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
|
-
|
51
|
-
background: none;
|
52
|
-
border: 0px;
|
53
|
-
padding: 0px;
|
54
|
-
display: inline;
|
48
|
+
height: 47px;
|
55
49
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
-
|
67
|
-
|
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
|
+
}
|