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,48 @@
1
+ require "mongo_browser"
2
+
3
+ require "thor"
4
+ require "thin"
5
+
6
+ module MongoBrowser
7
+ RACK_CONFIG = File.join(File.dirname(__FILE__), "../..", "config.ru")
8
+
9
+ class CLI < Thor
10
+ desc :start, "Starts the application"
11
+ option :port, aliases: :p, default: "5678",
12
+ desc: "Specify application port"
13
+ option :environment, aliases: :e, default: "production",
14
+ desc: "Specify application environment"
15
+ option :"mongodb-port", default: MongoBrowser::DEFAULT_MONGODB_PORT,
16
+ desc: "Specify mongodb port"
17
+ option :"mongodb-host", default: MongoBrowser::DEFAULT_MONGODB_HOST,
18
+ desc: "Specify mongodb host"
19
+
20
+ def start
21
+ setup_mongodb_connection!(options)
22
+ run_thin(options)
23
+ end
24
+
25
+ private
26
+
27
+ def setup_mongodb_connection!(options)
28
+ port = options[:"mongodb-port"].to_i
29
+ MongoBrowser.mongodb_port = port
30
+ puts "MongoDB port: #{port}"
31
+
32
+ host = options[:"mongodb-host"]
33
+ MongoBrowser.mongodb_host = host
34
+ puts "MongoDB host: #{host}"
35
+ end
36
+
37
+ def run_thin(options)
38
+ argv = ["start"]
39
+ argv << ["-R", RACK_CONFIG]
40
+ argv << ["-p", options[:port]]
41
+ argv << ["-e", options[:environment]]
42
+
43
+ puts "Application environment: #{options[:environment]}"
44
+ puts "Application url: http://localhost:#{options[:port]}"
45
+ Thin::Runner.new(argv.flatten).run!
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,43 @@
1
+ module MongoBrowser::Entities
2
+
3
+ class Database < Grape::Entity
4
+ expose :name, documentation: { type: String, desc: "Database name." }
5
+ expose :size, documentation: { type: Integer, desc: "Database size in bytes." }
6
+ expose :count, documentation: { type: Integer, desc: "Number of collections." }
7
+ end
8
+
9
+ class Collection < Grape::Entity
10
+ expose(:dbName, documentation: { type: String, desc: "Database name." }) do |collection|
11
+ collection.db_name
12
+ end
13
+ expose :name, documentation: { type: String, desc: "Collection name." }
14
+ expose :size, documentation: { type: Integer, desc: "Number of documents." }
15
+ end
16
+
17
+ class Document < Grape::Entity
18
+ expose(:id, documentation: { type: String, desc: "Document id." }) do |document|
19
+ document.id.to_s
20
+ end
21
+
22
+ expose(:dbName, documentation: { type: String, desc: "Database name." }) do |document|
23
+ document.db_name
24
+ end
25
+
26
+ expose(:collectionName, documentation: { type: String, desc: "Collection name." }) do |document|
27
+ document.collection_name
28
+ end
29
+
30
+ expose :data, documentation: { type: Hash, desc: "Document" }
31
+ end
32
+
33
+ class PagedDocuments < Grape::Entity
34
+ expose :page, documentation: { type: Integer, desc: "Current page." }
35
+ expose :size, documentation: { type: Integer, desc: "Total number of records." }
36
+ expose(:totalPages, documentation: { type: Integer, desc: "Total number of pages" }) do |paged|
37
+ paged.total_pages
38
+ end
39
+
40
+ expose :documents, using: Document
41
+ end
42
+
43
+ end
@@ -30,13 +30,14 @@ module MongoBrowser
30
30
  end
31
31
 
32
32
  def documents_with_pagination(page_number = 1)
33
- pager = pager_for(page_number)
33
+ pager = Pager.new(page_number, size)
34
34
 
35
- paged_documents = mongo_collection.find
36
- .skip(pager.offset)
37
- .limit(pager.per_page)
35
+ documents = mongo_collection.find
36
+ .skip(pager.offset)
37
+ .limit(pager.per_page)
38
+ .map { |document| Document.new(db_name, name, document) }
38
39
 
39
- return paged_documents.map { |doc| Document.new(doc) }, pager
40
+ OpenStruct.new pager.to_hash.merge(documents: documents)
40
41
  end
41
42
 
42
43
  def drop!
@@ -49,19 +50,13 @@ module MongoBrowser
49
50
  def find(id)
50
51
  condition = { _id: BSON::ObjectId(id.to_s) }
51
52
  mongo_document = mongo_collection.find(condition).first
52
- Document.new(mongo_document) if mongo_document
53
+ Document.new(db_name, name, mongo_document) if mongo_document
53
54
  end
54
55
 
55
56
  # Removes the given document from the collection.
56
57
  def remove!(document)
57
58
  mongo_collection.remove(_id: document.id)
58
59
  end
59
-
60
- private
61
-
62
- def pager_for(page)
63
- Pager.new(page, size)
64
- end
65
60
  end
66
61
  end
67
62
  end
@@ -1,9 +1,13 @@
1
1
  module MongoBrowser
2
2
  module Models
3
3
  class Document
4
+ attr_reader :db_name, :collection_name
4
5
  attr_reader :mongo_document
5
6
 
6
- def initialize(mongo_document)
7
+ def initialize(db_name, collection_name, mongo_document)
8
+ @db_name = db_name
9
+ @collection_name = collection_name
10
+
7
11
  @mongo_document = mongo_document
8
12
  end
9
13
 
@@ -3,15 +3,16 @@ module MongoBrowser
3
3
  class Pager
4
4
  PER_PAGE = 25
5
5
 
6
- attr_reader :current_page
6
+ attr_reader :page
7
7
  attr_reader :size
8
8
 
9
- def initialize(current_page, size)
9
+ def initialize(page, size)
10
10
  @size = size
11
- @current_page = if current_page.to_i <= 0 then 1
12
- else
13
- [current_page.to_i, total_pages].min
14
- end
11
+ @page = if page.to_i <= 0 then
12
+ 1
13
+ else
14
+ [page.to_i, total_pages].min
15
+ end
15
16
  end
16
17
 
17
18
  def per_page
@@ -19,12 +20,24 @@ module MongoBrowser
19
20
  end
20
21
 
21
22
  def offset
22
- (current_page - 1) * per_page
23
+ (page - 1) * per_page
23
24
  end
24
25
 
25
26
  def total_pages
26
- (size.to_f / per_page).ceil
27
+ if size == 0 then
28
+ 1
29
+ else
30
+ (size.to_f / per_page).ceil
31
+ end
32
+ end
33
+
34
+ def to_hash
35
+ {
36
+ size: size,
37
+ page: page,
38
+ total_pages: total_pages
39
+ }
27
40
  end
28
41
  end
29
42
  end
30
- end
43
+ end
@@ -1,3 +1,3 @@
1
1
  module MongoBrowser
2
- VERSION = "0.2.0.rc2"
2
+ VERSION = "0.2.5"
3
3
  end
@@ -12,26 +12,33 @@ Gem::Specification.new do |gem|
12
12
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
14
  gem.name = "mongo_browser"
15
+ gem.license = "MIT"
15
16
  gem.require_paths = ["lib"]
16
17
  gem.version = MongoBrowser::VERSION
17
18
 
18
- gem.add_development_dependency("rdoc", "~> 3.12")
19
- gem.add_development_dependency("rake", "~> 10.0.2")
19
+ gem.add_development_dependency("rdoc", "4.0.1")
20
+ gem.add_development_dependency("rake", "10.1.0")
20
21
 
21
- gem.add_development_dependency("thin", "~> 1.5.0")
22
- gem.add_development_dependency("rspec", "~> 2.12.0")
23
- gem.add_development_dependency("simplecov", "~> 0.7.1")
24
- gem.add_development_dependency("debugger", "~> 1.2.2")
22
+ gem.add_development_dependency("coveralls", "0.6.7")
23
+ gem.add_development_dependency("foreman", "0.63.0")
24
+ gem.add_development_dependency("rspec", "2.14.1")
25
+ gem.add_development_dependency("rack-test", "0.6.2")
26
+ gem.add_development_dependency("simplecov", "0.7.1")
27
+ gem.add_development_dependency("debugger", "1.6.1")
25
28
 
26
- gem.add_dependency("mongo", "~> 1.8.0")
27
- gem.add_dependency("bson_ext", "~> 1.8.0")
28
- gem.add_dependency("vegas", "~> 0.1.11")
29
+ gem.add_dependency("thin", "1.5.1")
30
+ gem.add_dependency("mongo", "1.9.1")
31
+ gem.add_dependency("bson_ext", "1.9.1")
29
32
 
30
- gem.add_dependency("sinatra", "~> 1.3.3")
31
- gem.add_dependency("sinatra-contrib", "~> 1.3.2")
32
- gem.add_dependency("json", "~> 1.7.5")
33
+ gem.add_dependency("thor", "0.18.1")
34
+ gem.add_dependency("sinatra", "1.4.3")
35
+ gem.add_dependency("sinatra-contrib", "1.4.0")
36
+ gem.add_dependency("grape", "0.5.0")
37
+ gem.add_dependency("grape-entity", "0.3.0")
33
38
 
34
- gem.add_dependency("sprockets", "~> 2.8.1")
35
- gem.add_dependency("coffee-script", "~> 2.2.0")
36
- gem.add_dependency("sass", "~> 3.2.3")
39
+ gem.add_dependency("sprockets", "2.10.0")
40
+ gem.add_dependency("execjs", "1.4.0")
41
+ gem.add_dependency("therubyracer", "0.11.4")
42
+ gem.add_dependency("coffee-script", "2.2.0")
43
+ gem.add_dependency("sass", "3.2.9")
37
44
  end
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "mongo_browser",
3
+ "version": "0.0.1",
4
+ "description": "[![Build status](https://secure.travis-ci.org/lucassus/mongo_browser.png)](http://travis-ci.org/lucassus/mongo_browser) [![Dependency Status](https://gemnasium.com/lucassus/mongo_browser.png)](http://gemnasium.com/lucassus/mongo_browser) [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/lucassus/mongo_browser)",
5
+ "main": "Gruntfile.js",
6
+ "dependencies": {
7
+ "grunt": "~0.4.1",
8
+ "grunt-cli": "~0.1.9",
9
+ "karma": "~0.8.5"
10
+ },
11
+ "devDependencies": {},
12
+ "scripts": {
13
+ "test": "echo \"Error: no test specified\" && exit 1"
14
+ },
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git://github.com/lucassus/mongo_browser.git"
18
+ },
19
+ "keywords": [
20
+ "mongodb",
21
+ "angularjs"
22
+ ],
23
+ "author": "Lukasz Bandzarewicz",
24
+ "license": "BSD",
25
+ "readmeFilename": "README.md",
26
+ "gitHead": "dc2044e1f9d67c258b30c5b4c5efcd53067697c8",
27
+ "bugs": {
28
+ "url": "https://github.com/lucassus/mongo_browser/issues"
29
+ }
30
+ }
@@ -0,0 +1,6 @@
1
+ <aside id="alerts">
2
+ <div ng-repeat="message in alertMessages" class="alert alert-{{message.type}}">
3
+ <button ng-click="disposeAlert(message.id)" type="button" class="close">×</button>
4
+ <strong>{{message.type}}</strong> <span>{{message.text}}</span>
5
+ </div>
6
+ </aside>
@@ -0,0 +1,39 @@
1
+ <header>
2
+ <h2>{{dbName}} collections</h2>
3
+ </header>
4
+
5
+ <table-filter value="filterValue.name" placeholder="Enter collection name"></table-filter>
6
+
7
+ <table ng-show="(collections | filter:filterValue).length" class="table table-striped table-hover collections">
8
+ <thead>
9
+ <tr>
10
+ <th>Name</th>
11
+ <th>Documents</th>
12
+ <th class="actions">&nbsp;</th>
13
+ </tr>
14
+ </thead>
15
+ <tbody>
16
+ <tr ng-repeat="collection in collections | orderBy:'name' | filter:filterValue"
17
+ ng-mouseleave="showActions = false"
18
+ ng-mouseenter="showActions = true">
19
+ <td>
20
+ <a href="{{collection | documentsPath}}">
21
+ {{collection.name}}
22
+ </a>
23
+ </td>
24
+ <td>{{collection.size}}</td>
25
+ <td>
26
+ <span class="actions" ng-show="showActions">
27
+ <show-button path="{{collection | documentsPath}}"></show-button>
28
+ <delete-button ng-click="delete(collection)"></delete-button>
29
+ </span>
30
+ </td>
31
+ </tr>
32
+ </tbody>
33
+ </table>
34
+
35
+ <div ng-hide="(collections | filter:filterValue).length" class="alert">
36
+ Nothing has been found.
37
+ </div>
38
+
39
+ <a href="/databases/{{dbName}}/stats" class="btn">Database stats</a>
@@ -0,0 +1,18 @@
1
+ <header>
2
+ <h2>{{dbName}} / {{collectionName}} stats</h2>
3
+ </header>
4
+
5
+ <table class="table table-striped table-hover">
6
+ <thead>
7
+ <tr>
8
+ <th>Property</th>
9
+ <th>Value</th>
10
+ </tr>
11
+ </thead>
12
+ <tbody>
13
+ <tr ng-repeat="(property, value) in stats">
14
+ <td>{{property}}</td>
15
+ <td>{{value}}</td>
16
+ </tr>
17
+ </tbody>
18
+ </table>
@@ -0,0 +1,35 @@
1
+ <header>
2
+ <h2>localhost databases</h2>
3
+ </header>
4
+
5
+ <table-filter value="filterValue.name" placeholder="Enter database name"></table-filter>
6
+
7
+ <table ng-hide="isLoading()" ng-show="(databases | filter:filterValue).length" class="table table-striped table-hover databases">
8
+ <thead>
9
+ <tr>
10
+ <th>Name</th>
11
+ <th>Collections</th>
12
+ <th>Size</th>
13
+ <th class="actions">&nbsp;</th>
14
+ </tr>
15
+ </thead>
16
+ <tbody>
17
+ <tr ng-repeat="database in databases | orderBy:'name' | filter:filterValue"
18
+ ng-mouseleave="showActions = false"
19
+ ng-mouseenter="showActions = true">
20
+ <td><a href="{{database | collectionsPath}}">{{database.name}}</a></td>
21
+ <td>{{database.count}}</td>
22
+ <td>{{database.size | humanSize}}</td>
23
+ <td>
24
+ <span class="actions" ng-show="showActions">
25
+ <show-button path="{{database | collectionsPath}}"></show-button>
26
+ <delete-button ng-click="delete(database)"></delete-button>
27
+ </span>
28
+ </td>
29
+ </tr>
30
+ </tbody>
31
+ </table>
32
+
33
+ <div ng-hide="(databases | filter:filterValue).length" class="alert">
34
+ Nothing has been found.
35
+ </div>
@@ -0,0 +1,18 @@
1
+ <header>
2
+ <h2>{{dbName}} stats</h2>
3
+ </header>
4
+
5
+ <table class="table table-striped table-hover">
6
+ <thead>
7
+ <tr>
8
+ <th>Property</th>
9
+ <th>Value</th>
10
+ </tr>
11
+ </thead>
12
+ <tbody>
13
+ <tr ng-repeat="(property, value) in stats">
14
+ <td>{{property}}</td>
15
+ <td>{{value}}</td>
16
+ </tr>
17
+ </tbody>
18
+ </table>
@@ -0,0 +1,40 @@
1
+ <header>
2
+ <h2>{{collectionName}} documents</h2>
3
+ </header>
4
+
5
+ <pager page="page" total-pages="totalPages"></pager>
6
+
7
+ <table ng-show="showDocuments()" class="table table-striped table-hover documents">
8
+ <thead>
9
+ <tr>
10
+ <th>Data</th>
11
+ <th class="actions">&nbsp;</th>
12
+ </tr>
13
+ </thead>
14
+ <tbody>
15
+ <tr ng-repeat="document in documents" class="document id-{{document.id}}"
16
+ ng-mouseleave="showActions = false"
17
+ ng-mouseenter="showActions = true"
18
+ ng-init="document.dbName = dbName; document.collectionName = collectionName">
19
+ <td class="data">
20
+ <span class="id"><a href="{{document | documentPath}}">{{document.id}}</a></span>
21
+ <span>{{document | documentPrettyTime}}</span>
22
+ <div ng-bind-html="document.data | jsonDocument"></div>
23
+ </td>
24
+ <td>
25
+ <span class="actions" ng-show="showActions">
26
+ <show-button path="{{document | documentPath}}"></show-button>
27
+ <delete-button ng-click="delete(document)"></delete-button>
28
+ </span>
29
+ </td>
30
+ </tr>
31
+ </tbody>
32
+ </table>
33
+
34
+ <pager page="page" total-pages="totalPages"></pager>
35
+
36
+ <div ng-hide="showDocuments()" class="alert">
37
+ Nothing has been found.
38
+ </div>
39
+
40
+ <a href="/databases/{{dbName}}/collections/{{collectionName}}/stats" class="btn">Collection stats</a>