From cb61a02ba61643906dc783739998e622acc839e1 Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Fri, 13 Nov 2015 22:28:03 +1100 Subject: [PATCH 01/26] :construction: adding help window this isn't working yet. --- src/connect/index.jade | 3 ++ src/connect/index.js | 11 ++++++-- src/help/index.jade | 3 ++ src/help/index.js | 28 +++++++++++++++++++ src/help/index.less | 1 + .../items/auth-certificate-authority.jade | 0 .../items/auth-client-certificate-key.jade | 0 src/help/items/auth-connect-to-host.jade | 0 src/help/items/auth-principal.jade | 0 src/router.js | 11 ++++++-- 10 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 src/help/index.jade create mode 100644 src/help/index.js create mode 100644 src/help/index.less create mode 100644 src/help/items/auth-certificate-authority.jade create mode 100644 src/help/items/auth-client-certificate-key.jade create mode 100644 src/help/items/auth-connect-to-host.jade create mode 100644 src/help/items/auth-principal.jade diff --git a/src/connect/index.jade b/src/connect/index.jade index fa7efcb1c6c..4efbeeb0ab8 100644 --- a/src/connect/index.jade +++ b/src/connect/index.jade @@ -3,6 +3,9 @@ .form-container header h2 Connect to Host + //- @todo remove the next two lines, just a test to click on a help button + |   + i.help.fa.fa-info-circle(data-hook='auth-connect-to-host') .message.error(data-hook="message-div") p(data-hook='message') diff --git a/src/connect/index.js b/src/connect/index.js index 407540c3036..486ae20a3fa 100644 --- a/src/connect/index.js +++ b/src/connect/index.js @@ -6,10 +6,11 @@ var ConnectFormView = require('./connect-form-view'); var Connection = require('../models/connection'); var debug = require('debug')('scout:connect:index'); var _ = require('lodash'); +var $ = require('jquery'); var app = require('ampersand-app'); var format = require('util').format; var metrics = require('mongodb-js-metrics'); - +var Help = require('../help'); /** * AuthenticationOptionCollection */ @@ -97,7 +98,8 @@ var ConnectView = View.extend({ 'input input': 'onAnyInputChanged', 'change input': 'onAnyInputChanged', 'change select': 'onAnyInputChanged', - 'click div.btn': 'onAnyInputChanged' + 'click div.btn': 'onAnyInputChanged', + 'click i.help': 'onHelpClicked' }, /** @@ -139,6 +141,11 @@ var ConnectView = View.extend({ this.dispatch('save changes clicked'); }, + onHelpClicked: function(evt) { + var id = $(evt.target).attr('data-hook'); + Help.open(id); + }, + bindings: { // show error div hasError: { diff --git a/src/help/index.jade b/src/help/index.jade new file mode 100644 index 00000000000..11ee8d97f71 --- /dev/null +++ b/src/help/index.jade @@ -0,0 +1,3 @@ +.page.help + h3 Compass Help + .subview(data-hook='item-subview') diff --git a/src/help/index.js b/src/help/index.js new file mode 100644 index 00000000000..3dfd79d8f4a --- /dev/null +++ b/src/help/index.js @@ -0,0 +1,28 @@ +var View = require('ampersand-view'); +var format = require('util').format; +// var debug = require('debug')('scout:help:index'); + +module.exports = View.extend({ + session: { + id: 'string', + default: '', + required: true + }, + template: require('./index.jade'), + initialize: function(id) { + // @imlucas how does the id get passed in here? + this.id = id; + }, + render: function() { + this.renderWithTemplate(this); + var subview = new View(); + subview.template = require(format('./items/%s.jade', this.id)); + this.renderSubview(subview, this.queryByHook('item-subview')); + } +}); + +// convenience helper method to open the Help window with the right id +module.exports.open = function(id) { + var url = format('%s?id=%s#help', window.location.origin, id); + window.open(url); +}; diff --git a/src/help/index.less b/src/help/index.less new file mode 100644 index 00000000000..137402b2105 --- /dev/null +++ b/src/help/index.less @@ -0,0 +1 @@ +// @todo need to import in ./src/index.less diff --git a/src/help/items/auth-certificate-authority.jade b/src/help/items/auth-certificate-authority.jade new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/help/items/auth-client-certificate-key.jade b/src/help/items/auth-client-certificate-key.jade new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/help/items/auth-connect-to-host.jade b/src/help/items/auth-connect-to-host.jade new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/help/items/auth-principal.jade b/src/help/items/auth-principal.jade new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/router.js b/src/router.js index 03555658931..45be969c180 100644 --- a/src/router.js +++ b/src/router.js @@ -1,7 +1,8 @@ var AmpersandRouter = require('ampersand-router'); var HomePage = require('./home'); -var Connect = require('./connect'); +var ConnectPage = require('./connect'); +var HelpPage = require('./help'); module.exports = AmpersandRouter.extend({ routes: { @@ -9,6 +10,7 @@ module.exports = AmpersandRouter.extend({ schema: 'index', connect: 'connect', 'schema/:ns': 'schema', + 'help': 'help', '(*path)': 'catchAll' }, index: function() { @@ -19,10 +21,15 @@ module.exports = AmpersandRouter.extend({ ns: ns })); }, + help: function(id) { + this.trigger('page', new HelpPage({ + id: id + })); + }, catchAll: function() { this.redirectTo(''); }, connect: function() { - this.trigger('page', new Connect({})); + this.trigger('page', new ConnectPage({})); } }); From 5f334aa24cc90b07d72034843a7d3e31ee11d610 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 14 Nov 2015 04:40:19 -0500 Subject: [PATCH 02/26] :shirt: --- src/tour/index.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tour/index.js b/src/tour/index.js index 6c28a992454..0aa98cacce3 100644 --- a/src/tour/index.js +++ b/src/tour/index.js @@ -40,10 +40,10 @@ var TourView = View.extend({ evt.stopPropagation(); this.tourRemove(); } else if ([ - RIGHT_ARROW_KEY, - TAB_KEY, - ENTER_KEY, - SPACE_KEY].indexOf(evt.keyCode) !== -1) { + RIGHT_ARROW_KEY, + TAB_KEY, + ENTER_KEY, + SPACE_KEY].indexOf(evt.keyCode) !== -1) { this.showNextFeature(); } else if (evt.keyCode === LEFT_ARROW_KEY) { this.showPreviousFeature(); From a4d1ece29c580ad94a627341459319e6586cffc5 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 14 Nov 2015 04:41:09 -0500 Subject: [PATCH 03/26] make model/collection for help entries --- src/models/help-entry-collection.js | 42 +++++++++++++++++++++++++++++ src/models/help-entry.js | 38 ++++++++++++++++++++++++++ src/models/with-sync.js | 20 ++++++++++++++ 3 files changed, 100 insertions(+) create mode 100644 src/models/help-entry-collection.js create mode 100644 src/models/help-entry.js create mode 100644 src/models/with-sync.js diff --git a/src/models/help-entry-collection.js b/src/models/help-entry-collection.js new file mode 100644 index 00000000000..48e3397abf6 --- /dev/null +++ b/src/models/help-entry-collection.js @@ -0,0 +1,42 @@ +var Collection = require('ampersand-rest-collection'); +var HelpEntry = require('./help-entry'); +var selectableMixin = require('./selectable-collection-mixin'); +var withSync = require('./with-sync'); +var debug = require('debug')('scout:models:help-entry-collection'); +var ipc = window.require('ipc'); + +var HelpEntryCollection = Collection.extend(selectableMixin, { + namespace: 'HelpEntryCollection', + model: HelpEntry +}, withSync(function(options, done) { + if (options.method !== 'read') { + return done(new TypeError('Read-only!')); + } + + debug('sync called w options', options); + + if (this.models.length > 0) { + debug('already fetched'); + options.reset = false; + return done(); + } + + var onSuccess; + var onError = function(err) { + debug('error', err); + ipc.removeListener('/help/entries/success', onSuccess); + done(err); + }; + + onSuccess = function(entries) { + debug('got entries', entries); + ipc.removeListener('/help/entries/error', onError); + }; + + debug('loading help entries...'); + ipc.once('/help/entries/success', onSuccess) + .once('/help/entries/error', onError) + .send('/help/entries'); +})); + +module.exports = HelpEntryCollection; diff --git a/src/models/help-entry.js b/src/models/help-entry.js new file mode 100644 index 00000000000..36f7ec254a6 --- /dev/null +++ b/src/models/help-entry.js @@ -0,0 +1,38 @@ +var State = require('ampersand-state'); +var format = require('util').format; +var debug = require('debug')('scout:models:help-entry'); + +var HelpEntry = State.extend({ + namespace: 'HelpEntry', + props: { + id: 'string', + title: 'string', + content: 'string', + tags: 'array' + }, + derived: { + url: { + deps: ['id'], + fn: function() { + return format('/help/%s', this.getId()); + } + } + }, + session: { + selected: { + type: 'boolean', + default: false + } + }, + parse: function(resp) { + debug('parse', resp); + return { + id: resp.filename.replace('.md', ''), + title: resp.meta.title, + tags: resp.meta.tags || [], + content: resp.content + }; + } +}); + +module.exports = HelpEntry; diff --git a/src/models/with-sync.js b/src/models/with-sync.js new file mode 100644 index 00000000000..1fc3870810c --- /dev/null +++ b/src/models/with-sync.js @@ -0,0 +1,20 @@ +var withSync = function(fn) { + return { + sync: function(method, model, options) { + var done = function(err, res) { + if (options.success) { + options.success(res); + } else if (options.error) { + options.error(err); + } + }; + + options.model = model; + options.method = method; + + fn.apply(model, [options, done]); + } + }; +}; + +module.exports = withSync; From a1d0981cc1b63f85d3a1a6f5978dc704f1d2552d Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 14 Nov 2015 04:41:45 -0500 Subject: [PATCH 04/26] Move help entries to markdown, add sidebar. --- .../entries/auth-certificate-authority.md | 9 +++ .../entries/auth-client-certificate-key.md | 9 +++ src/help/entries/auth-connect-to-host.md | 6 ++ src/help/entries/auth-principal.md | 7 ++ src/help/index.jade | 3 +- src/help/index.js | 73 +++++++++++++++---- .../items/auth-certificate-authority.jade | 0 .../items/auth-client-certificate-key.jade | 0 src/help/items/auth-connect-to-host.jade | 0 src/help/items/auth-principal.jade | 0 src/help/sidebar.jade | 4 + src/help/sidebar.js | 40 ++++++++++ 12 files changed, 136 insertions(+), 15 deletions(-) create mode 100644 src/help/entries/auth-certificate-authority.md create mode 100644 src/help/entries/auth-client-certificate-key.md create mode 100644 src/help/entries/auth-connect-to-host.md create mode 100644 src/help/entries/auth-principal.md delete mode 100644 src/help/items/auth-certificate-authority.jade delete mode 100644 src/help/items/auth-client-certificate-key.jade delete mode 100644 src/help/items/auth-connect-to-host.jade delete mode 100644 src/help/items/auth-principal.jade create mode 100644 src/help/sidebar.jade create mode 100644 src/help/sidebar.js diff --git a/src/help/entries/auth-certificate-authority.md b/src/help/entries/auth-certificate-authority.md new file mode 100644 index 00000000000..0bfd2464412 --- /dev/null +++ b/src/help/entries/auth-certificate-authority.md @@ -0,0 +1,9 @@ +--- +title: Certificate Authority File +tags: + - connect + - ssl +--- +Describes what the `Certificate Authority` field in the connect dialog does. + +I am *markdown*. diff --git a/src/help/entries/auth-client-certificate-key.md b/src/help/entries/auth-client-certificate-key.md new file mode 100644 index 00000000000..0acbd4e406d --- /dev/null +++ b/src/help/entries/auth-client-certificate-key.md @@ -0,0 +1,9 @@ +--- +title: Client Certificate Key +tags: + - connect + - ssl +--- +Describes what the `Client Certificate Key` field in the connect dialog does. + +I am *markdown*. diff --git a/src/help/entries/auth-connect-to-host.md b/src/help/entries/auth-connect-to-host.md new file mode 100644 index 00000000000..0194bac1e77 --- /dev/null +++ b/src/help/entries/auth-connect-to-host.md @@ -0,0 +1,6 @@ +--- +title: Connect to Host +tags: + - connect +--- +Describes how to connect to a host. diff --git a/src/help/entries/auth-principal.md b/src/help/entries/auth-principal.md new file mode 100644 index 00000000000..a626642d576 --- /dev/null +++ b/src/help/entries/auth-principal.md @@ -0,0 +1,7 @@ +--- +title: Principal +tags: + - connect + - kerberos +--- +Describes what a principal is. diff --git a/src/help/index.jade b/src/help/index.jade index 11ee8d97f71..bb8438dced0 100644 --- a/src/help/index.jade +++ b/src/help/index.jade @@ -1,3 +1,4 @@ .page.help + div(data-hook='sidebar-subview') h3 Compass Help - .subview(data-hook='item-subview') + div(data-hook='item-subview') diff --git a/src/help/index.js b/src/help/index.js index 3dfd79d8f4a..4fa931a55ad 100644 --- a/src/help/index.js +++ b/src/help/index.js @@ -1,28 +1,73 @@ var View = require('ampersand-view'); var format = require('util').format; -// var debug = require('debug')('scout:help:index'); +var debug = require('debug')('scout:help'); +var HelpEntryCollection = require('../models/help-entry-collection'); +var SidebarView = require('./sidebar'); -module.exports = View.extend({ +var HelpPage = View.extend({ session: { - id: 'string', - default: '', - required: true + itemId: 'string' + }, + collections: { + entries: HelpEntryCollection }, template: require('./index.jade'), - initialize: function(id) { - // @imlucas how does the id get passed in here? - this.id = id; + initialize: function(spec) { + spec = spec || {}; + this.entries.fetch(); + + if (spec.itemId) { + this.itemId = spec.itemId; + debug('initialized with itemId `%s`', this.itemId); + } }, render: function() { this.renderWithTemplate(this); - var subview = new View(); - subview.template = require(format('./items/%s.jade', this.id)); - this.renderSubview(subview, this.queryByHook('item-subview')); + /** + * @todo (imlucas) switch to `ampersand-view-switcher`. + */ + if (this.itemId) { + if (this.entries.length === 0) { + this.listenTo(this.entries, 'sync', this.render.bind(this)); + return; + } + debug('rendering item `%s`', this.itemId); + var item = this.entries.get(this.itemId); + + var subview = new View(); + subview.template = item.content; + this.renderSubview(subview, this.queryByHook('item-subview')); + } + }, + subviews: { + sidebar: { + hook: 'sidebar-subview', + prepareView: function(el) { + return new SidebarView({ + el: el, + parent: this, + entries: this.entries + }); + } + } } }); -// convenience helper method to open the Help window with the right id -module.exports.open = function(id) { - var url = format('%s?id=%s#help', window.location.origin, id); +/** + * Convenience to open the help window if needed and show an item. + * + * @param {String} [itemId] - Optional filename to show from `./items/#{itemId}.jade`. + * + * @todo (imlucas) Add helper to `./src/electron/window-manager.js` so this works + * like connect window (singleton w/ custom dimensions). + */ +HelpPage.open = function(itemId) { + var url = format('%s?#help', window.location.origin); + if (itemId) { + url += '/' + itemId; + } + debug('Opening item `%s`', itemId); window.open(url); }; + +module.exports = HelpPage; diff --git a/src/help/items/auth-certificate-authority.jade b/src/help/items/auth-certificate-authority.jade deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/help/items/auth-client-certificate-key.jade b/src/help/items/auth-client-certificate-key.jade deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/help/items/auth-connect-to-host.jade b/src/help/items/auth-connect-to-host.jade deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/help/items/auth-principal.jade b/src/help/items/auth-principal.jade deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/help/sidebar.jade b/src/help/sidebar.jade new file mode 100644 index 00000000000..002f3cc9c5c --- /dev/null +++ b/src/help/sidebar.jade @@ -0,0 +1,4 @@ +.sidebar + .compass-logo + .panel.panel-default + .list-group(data-hook='help-entry-list') diff --git a/src/help/sidebar.js b/src/help/sidebar.js new file mode 100644 index 00000000000..c2bd21ea059 --- /dev/null +++ b/src/help/sidebar.js @@ -0,0 +1,40 @@ +var View = require('ampersand-view'); +var jade = require('jade'); +var HelpEntryCollection = require('../models/help-entry-collection'); + +var SidebarItemView = View.extend({ + namespace: 'HelpSidebarItemView', + bindings: { + 'model.url': { + hook: 'url' + }, + 'model.title': { + hook: 'title' + }, + 'model.description': { + hook: 'description' + }, + 'model.selected': { + type: 'booleanClass', + yes: 'active' + } + }, + template: jade.compile([ + 'a.list-group-item(data-hook="url")', + ' h4.list-group-item-heading(data-hook="title")' + ].join('\n')) +}); + +var SidebarView = View.extend({ + collections: { + entries: HelpEntryCollection + }, + namespace: 'HelpSidebarView', + template: require('./sidebar.jade'), + render: function() { + this.renderWithTemplate({}); + this.renderCollection(this.entries, SidebarItemView, this.queryByHook('help-entry-list')); + } +}); + +module.exports = SidebarView; From 0de6a5c39afa81cf2393ba92ab9d4fa71ac45918 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 14 Nov 2015 04:42:00 -0500 Subject: [PATCH 05/26] Fix router for help --- src/router.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/router.js b/src/router.js index 45be969c180..4c70bfc5ea4 100644 --- a/src/router.js +++ b/src/router.js @@ -6,24 +6,22 @@ var HelpPage = require('./help'); module.exports = AmpersandRouter.extend({ routes: { - '': 'index', + '': 'connect', schema: 'index', connect: 'connect', 'schema/:ns': 'schema', - 'help': 'help', + help: 'help', + 'help/:itemId': 'help', '(*path)': 'catchAll' }, - index: function() { - this.trigger('page', new HomePage({})); - }, schema: function(ns) { this.trigger('page', new HomePage({ ns: ns })); }, - help: function(id) { + help: function(itemId) { this.trigger('page', new HelpPage({ - id: id + itemId: itemId })); }, catchAll: function() { From 35ac7b60014d5493b38fe68fecd76b330e691887 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 14 Nov 2015 04:42:31 -0500 Subject: [PATCH 06/26] ipc to parse help markdown entries via ipc --- package.json | 1 + src/electron/help.js | 19 +++++++++++++++++++ src/electron/index.js | 4 ++++ 3 files changed, 24 insertions(+) create mode 100644 src/electron/help.js diff --git a/package.json b/package.json index 0536de3bde7..ab84e66baa5 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "electron-squirrel-startup": "^0.1.4", "keytar": "^3.0.0", "localforage": "^1.3.0", + "marky-mark": "^1.2.1", "mongodb-collection-model": "^0.1.1", "mongodb-connection-model": "^3.0.6", "mongodb-instance-model": "^1.0.2", diff --git a/src/electron/help.js b/src/electron/help.js new file mode 100644 index 00000000000..76c83b9aaf6 --- /dev/null +++ b/src/electron/help.js @@ -0,0 +1,19 @@ +var path = require('path'); +var ipc = require('ipc'); +var mm = require('marky-mark'); +var debug = require('debug')('scout:electron:help'); + +debug('adding ipc listener for `/help/entries`...'); +ipc.on('/help/entries', function(evt) { + var dir = path.join(__dirname, '..', 'help', 'entries'); + debug('parsing entries with marky-mark from `%s`', dir); + mm.parseDirectory(dir, function(err, posts) { + if (err) { + debug('error parsing entries', err); + evt.sender.send('/help/entries/error', err); + return; + } + debug('successfully parsed!', posts); + evt.sender.send('/help/entries/success', posts); + }); +}); diff --git a/src/electron/index.js b/src/electron/index.js index 57ca581544f..ceb8e747b25 100644 --- a/src/electron/index.js +++ b/src/electron/index.js @@ -40,4 +40,8 @@ if (!require('electron-squirrel-startup')) { var AppMenu = require('./menu'); AppMenu.init(); require('./window-manager'); + + app.on('ready', function() { + require('./help'); + }); } From 75690aa18f1f85f6d8ff83d8d07019d1d567e9d3 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 14 Nov 2015 06:00:07 -0500 Subject: [PATCH 07/26] Finish laying in all of the groundwork for help https://cldup.com/3syEI18arr-3000x3000.png --- gulpfile.js | 9 ++- src/help/index.jade | 6 +- src/help/index.js | 108 ++++++++++++++++++++-------- src/help/index.less | 61 +++++++++++++++- src/help/sidebar.jade | 4 +- src/help/sidebar.js | 25 +++++-- src/index.less | 1 + src/models/help-entry-collection.js | 1 + src/models/with-sync.js | 20 +++++- src/router.js | 6 +- 10 files changed, 194 insertions(+), 47 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 43b726f5613..0759035ed1c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -95,6 +95,7 @@ gulp.task('watch', function() { gulp.watch(['src/*.jade'], ['build:pages']); gulp.watch('images/{*,**/*}', ['copy:images']); gulp.watch('fonts/*', ['copy:fonts']); + gulp.watch('src/help/entries/*.md', ['copy:text']); gulp.watch(['src/electron/{*,**/*}'], ['copy:js']); gulp.watch('package.json', function() { gutil.log('package.json changed!'); @@ -231,8 +232,12 @@ gulp.task('copy:package.json', function() { }); gulp.task('copy:text', function() { - return gulp.src(['README.md']) - .pipe(gulp.dest('build/')); + return merge( + gulp.src('README.md') + .pipe(gulp.dest('build/')), + gulp.src('src/help/entries/*.md') + .pipe(gulp.dest('build/src/help/entries')) + ); }); // Copy non-UI js into the build. diff --git a/src/help/index.jade b/src/help/index.jade index bb8438dced0..bf2b0f98da4 100644 --- a/src/help/index.jade +++ b/src/help/index.jade @@ -1,4 +1,6 @@ .page.help div(data-hook='sidebar-subview') - h3 Compass Help - div(data-hook='item-subview') + .content.with-sidebar + h3 Compass Help  + small(data-hook='help-entry-title') + .help-entry(data-hook='help-entry-content') diff --git a/src/help/index.js b/src/help/index.js index 4fa931a55ad..ad5bd451d4d 100644 --- a/src/help/index.js +++ b/src/help/index.js @@ -2,42 +2,94 @@ var View = require('ampersand-view'); var format = require('util').format; var debug = require('debug')('scout:help'); var HelpEntryCollection = require('../models/help-entry-collection'); +var HelpEntry = require('../models/help-entry'); var SidebarView = require('./sidebar'); +var ViewSwitcher = require('ampersand-view-switcher'); +var app = require('ampersand-app'); + +var ENTRIES = new HelpEntryCollection(); var HelpPage = View.extend({ session: { - itemId: 'string' + entryId: 'string' }, - collections: { - entries: HelpEntryCollection + children: { + entry: HelpEntry + }, + derived: { + title: { + deps: ['entry.title'], + fn: function() { + var t = 'MongoDB Compass: Help'; + if (this.entry.title) { + t += ': ' + this.entry.title; + } + return t; + } + } + }, + bindings: { + 'entry.title': { + hook: 'help-entry-title' + }, + title: { + type: function(el, newVal) { + document.title = newVal; + } + } }, template: require('./index.jade'), initialize: function(spec) { spec = spec || {}; - this.entries.fetch(); + ENTRIES.fetch(); - if (spec.itemId) { - this.itemId = spec.itemId; - debug('initialized with itemId `%s`', this.itemId); + if (spec.entryId) { + this.entryId = spec.entryId; + debug('initialized with entryId `%s`', this.entryId); } - }, - render: function() { - this.renderWithTemplate(this); - /** - * @todo (imlucas) switch to `ampersand-view-switcher`. - */ - if (this.itemId) { - if (this.entries.length === 0) { - this.listenTo(this.entries, 'sync', this.render.bind(this)); - return; + this.listenTo(this, 'change:rendered', function() { + this.viewSwitcher = new ViewSwitcher(this.queryByHook('help-entry-content')); + + if (this.entryId) { + this.show(this.entryId); } - debug('rendering item `%s`', this.itemId); - var item = this.entries.get(this.itemId); + }); + }, + show: function(entryId) { + debug('show `%s`', entryId); + if (ENTRIES.length === 0) { + ENTRIES.once('sync', this.show.bind(this, entryId)); + debug('entries not synced yet. queuing...'); + return; + } + + var entry = ENTRIES.get(entryId); + + if (!entry) { + debug('entry not found'); + return; + } - var subview = new View(); - subview.template = item.content; - this.renderSubview(subview, this.queryByHook('item-subview')); + if (!ENTRIES.select(entry)) { + debug('already selected'); + return; } + + if (!entry) { + debug('unknown entry'); + this.viewSwitcher.clear(); + return; + } + var view = new View({ + template: '
' + entry.content + '
' + }); + this.viewSwitcher.set(view); + + this.entry.set(entry.serialize()); + app.navigate(format('help/%s', this.entry.getId()), { + silent: true + }); + }, subviews: { sidebar: { @@ -46,7 +98,7 @@ var HelpPage = View.extend({ return new SidebarView({ el: el, parent: this, - entries: this.entries + entries: ENTRIES }); } } @@ -56,17 +108,17 @@ var HelpPage = View.extend({ /** * Convenience to open the help window if needed and show an item. * - * @param {String} [itemId] - Optional filename to show from `./items/#{itemId}.jade`. + * @param {String} [entryId] - Optional filename to show from `./items/#{entryId}.jade`. * * @todo (imlucas) Add helper to `./src/electron/window-manager.js` so this works * like connect window (singleton w/ custom dimensions). */ -HelpPage.open = function(itemId) { +HelpPage.open = function(entryId) { var url = format('%s?#help', window.location.origin); - if (itemId) { - url += '/' + itemId; + if (entryId) { + url += '/' + entryId; } - debug('Opening item `%s`', itemId); + debug('Opening item `%s`', entryId); window.open(url); }; diff --git a/src/help/index.less b/src/help/index.less index 137402b2105..029c85a74a1 100644 --- a/src/help/index.less +++ b/src/help/index.less @@ -1 +1,60 @@ -// @todo need to import in ./src/index.less +#application > div { + height: 100%; +} +.page.help { + .container-fluid; + + .sidebar { + .compass-logo { + height: 72px; + } + + .panel { + position: absolute; + top: 72px; + left: 0; + bottom: 0; + width: 220px; + overflow-y: auto; + background: none; + + .panel-title { + padding: 8px 0; + overflow: auto; + border-top: 1px solid lighten(@slate1, 5%); + border-left: 4px solid transparent; + } + + .list-group { + position: initial; + + a.list-group-item { + color: @gray5; + padding: 2px 0 2px 10px; + display: block; + cursor: pointer; + border-left: 4px solid transparent; + font-weight: bold; + + &.selected { + border-left: 4px solid @green3; + color: @green3; + + &:hover { + color: @green3; + } + } + &:hover { + text-decoration: none; + background: lighten(@slate1, 5%); + color: @pw; + } + } + } + } + } + + .help-entry { + + } +} diff --git a/src/help/sidebar.jade b/src/help/sidebar.jade index 002f3cc9c5c..9e8e3ff2958 100644 --- a/src/help/sidebar.jade +++ b/src/help/sidebar.jade @@ -1,4 +1,6 @@ .sidebar .compass-logo - .panel.panel-default + .panel + .panel-title + | Help Topics .list-group(data-hook='help-entry-list') diff --git a/src/help/sidebar.js b/src/help/sidebar.js index c2bd21ea059..be2219f75f8 100644 --- a/src/help/sidebar.js +++ b/src/help/sidebar.js @@ -1,12 +1,14 @@ var View = require('ampersand-view'); var jade = require('jade'); -var HelpEntryCollection = require('../models/help-entry-collection'); +var debug = require('debug')('scout:help:sidebar'); var SidebarItemView = View.extend({ namespace: 'HelpSidebarItemView', bindings: { 'model.url': { - hook: 'url' + hook: 'url', + type: 'attribute', + name: 'href' }, 'model.title': { hook: 'title' @@ -16,23 +18,32 @@ var SidebarItemView = View.extend({ }, 'model.selected': { type: 'booleanClass', - yes: 'active' + yes: 'selected' } }, + events: { + 'click a': 'show' + }, + show: function(evt) { + evt.stopPropagation(); + evt.preventDefault(); + this.parent.parent.show(this.model.getId()); + }, template: jade.compile([ 'a.list-group-item(data-hook="url")', - ' h4.list-group-item-heading(data-hook="title")' + ' span(data-hook="title")' ].join('\n')) }); var SidebarView = View.extend({ - collections: { - entries: HelpEntryCollection + initialize: function(spec) { + this.entries = spec.entries; }, namespace: 'HelpSidebarView', template: require('./sidebar.jade'), render: function() { - this.renderWithTemplate({}); + this.renderWithTemplate(this); + debug('rendering collection', this.entries); this.renderCollection(this.entries, SidebarItemView, this.queryByHook('help-entry-list')); } }); diff --git a/src/index.less b/src/index.less index 3b0f4d21120..fd8356b6b94 100644 --- a/src/index.less +++ b/src/index.less @@ -6,6 +6,7 @@ @import "./src/connect/index.less"; @import "./src/document-list/index.less"; @import "./src/field-list/index.less"; +@import "./src/help/index.less"; @import "./src/home/index.less"; @import "./src/minicharts/index.less"; @import "./src/refine-view/index.less"; diff --git a/src/models/help-entry-collection.js b/src/models/help-entry-collection.js index 48e3397abf6..188ccac9d41 100644 --- a/src/models/help-entry-collection.js +++ b/src/models/help-entry-collection.js @@ -31,6 +31,7 @@ var HelpEntryCollection = Collection.extend(selectableMixin, { onSuccess = function(entries) { debug('got entries', entries); ipc.removeListener('/help/entries/error', onError); + done(null, entries); }; debug('loading help entries...'); diff --git a/src/models/with-sync.js b/src/models/with-sync.js index 1fc3870810c..0ef078e81bd 100644 --- a/src/models/with-sync.js +++ b/src/models/with-sync.js @@ -1,17 +1,31 @@ +var debug = require('debug')('scout:models:with-sync'); var withSync = function(fn) { return { sync: function(method, model, options) { var done = function(err, res) { + debug('done called', { + err: err, + res: res + }); + + if (err) { + if (options.error) { + options.error(err, 'error', err.message); + } + model.trigger('error', err); + return; + } + if (options.success) { - options.success(res); - } else if (options.error) { - options.error(err); + options.success(res, 'success'); } + model.trigger('sync'); }; options.model = model; options.method = method; + model.trigger('request', {}, {}, options); fn.apply(model, [options, done]); } }; diff --git a/src/router.js b/src/router.js index 4c70bfc5ea4..e76e49dd48f 100644 --- a/src/router.js +++ b/src/router.js @@ -11,7 +11,7 @@ module.exports = AmpersandRouter.extend({ connect: 'connect', 'schema/:ns': 'schema', help: 'help', - 'help/:itemId': 'help', + 'help/:entryId': 'help', '(*path)': 'catchAll' }, schema: function(ns) { @@ -19,9 +19,9 @@ module.exports = AmpersandRouter.extend({ ns: ns })); }, - help: function(itemId) { + help: function(entryId) { this.trigger('page', new HelpPage({ - itemId: itemId + entryId: entryId })); }, catchAll: function() { From 5e381a8e7fab51074ff7bae3b82370ea058a0b73 Mon Sep 17 00:00:00 2001 From: Lucas Hrabovsky Date: Sat, 14 Nov 2015 06:07:42 -0500 Subject: [PATCH 08/26] :shirt: --- src/help/index.js | 1 - src/tour/index.js | 9 +++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/help/index.js b/src/help/index.js index ad5bd451d4d..d06c64875a7 100644 --- a/src/help/index.js +++ b/src/help/index.js @@ -89,7 +89,6 @@ var HelpPage = View.extend({ app.navigate(format('help/%s', this.entry.getId()), { silent: true }); - }, subviews: { sidebar: { diff --git a/src/tour/index.js b/src/tour/index.js index 0aa98cacce3..c19e73e8dc0 100644 --- a/src/tour/index.js +++ b/src/tour/index.js @@ -40,10 +40,11 @@ var TourView = View.extend({ evt.stopPropagation(); this.tourRemove(); } else if ([ - RIGHT_ARROW_KEY, - TAB_KEY, - ENTER_KEY, - SPACE_KEY].indexOf(evt.keyCode) !== -1) { + RIGHT_ARROW_KEY, + TAB_KEY, + ENTER_KEY, + SPACE_KEY + ].indexOf(evt.keyCode) !== -1) { this.showNextFeature(); } else if (evt.keyCode === LEFT_ARROW_KEY) { this.showPreviousFeature(); From 3b2cc6a1e980c9dedd348cc73c6a6206a2be3ef4 Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Sun, 15 Nov 2015 12:10:58 +1100 Subject: [PATCH 09/26] support local links via `[link](#help-entry)` --- src/help/index.jade | 3 +-- src/help/index.js | 12 ++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/help/index.jade b/src/help/index.jade index bf2b0f98da4..602938eb257 100644 --- a/src/help/index.jade +++ b/src/help/index.jade @@ -1,6 +1,5 @@ .page.help div(data-hook='sidebar-subview') .content.with-sidebar - h3 Compass Help  - small(data-hook='help-entry-title') + h3(data-hook='help-entry-title') .help-entry(data-hook='help-entry-content') diff --git a/src/help/index.js b/src/help/index.js index d06c64875a7..cd26c138716 100644 --- a/src/help/index.js +++ b/src/help/index.js @@ -28,6 +28,9 @@ var HelpPage = View.extend({ } } }, + events: { + 'click a': 'onLinkClicked' + }, bindings: { 'entry.title': { hook: 'help-entry-title' @@ -38,6 +41,15 @@ var HelpPage = View.extend({ } } }, + onLinkClicked: function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + // @todo handle external links + var entryId = evt.delegateTarget.hash.slice(1); + if (entryId) { + this.show(entryId); + } + }, template: require('./index.jade'), initialize: function(spec) { spec = spec || {}; From f85894b7026f13c24134d503f08243ec0b64774d Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Sun, 15 Nov 2015 12:47:05 +1100 Subject: [PATCH 10/26] form fields support help entries, "not found" msg --- src/connect/authentication.js | 1 + src/connect/index.jade | 3 --- src/connect/input-default.jade | 6 +++++- src/connect/input-view.js | 12 +++++++++++- src/help/entries/auth-certificate-authority.md | 1 + src/help/entries/auth-client-certificate-key.md | 1 + src/help/entries/auth-connect-to-host.md | 1 + src/help/entries/auth-principal.md | 1 + src/help/index.js | 12 ++++++------ src/statusbar/index.js | 5 +++++ 10 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/connect/authentication.js b/src/connect/authentication.js index b2964325af0..edd4fa1ca1f 100644 --- a/src/connect/authentication.js +++ b/src/connect/authentication.js @@ -39,6 +39,7 @@ var MONGODB = { name: 'mongodb_database_name', label: 'Database Name', placeholder: 'admin', + helpEntry: 'auth-auth-source', required: false }) ] diff --git a/src/connect/index.jade b/src/connect/index.jade index 4efbeeb0ab8..fa7efcb1c6c 100644 --- a/src/connect/index.jade +++ b/src/connect/index.jade @@ -3,9 +3,6 @@ .form-container header h2 Connect to Host - //- @todo remove the next two lines, just a test to click on a help button - |   - i.help.fa.fa-info-circle(data-hook='auth-connect-to-host') .message.error(data-hook="message-div") p(data-hook='message') diff --git a/src/connect/input-default.jade b/src/connect/input-default.jade index 97d39b97898..e26844af483 100644 --- a/src/connect/input-default.jade +++ b/src/connect/input-default.jade @@ -1,5 +1,9 @@ .form-item - label(data-hook='label')= label + label + span(data-hook='label')= label + if helpEntry + |   + i.help.fa.fa-info-circle(data-hook='#{helpEntry}') .message.message-above.message-error(data-hook='message-container') p(data-hook='message-text') input.form-control(placeholder='#{placeholder}') diff --git a/src/connect/input-view.js b/src/connect/input-view.js index 76a82d049cc..b48f5aca2fd 100644 --- a/src/connect/input-view.js +++ b/src/connect/input-view.js @@ -6,7 +6,17 @@ var InputView = require('ampersand-input-view'); * so that label gets correctly rendered on subsequent render() calls. */ module.exports = InputView.extend({ - initialize: function() { + props: { + helpEntry: { + type: 'string', + default: null + } + }, + initialize: function(spec) { + spec = spec || {}; + if (spec.helpEntry) { + this.helpEntry = spec.helpEntry; + } this.invalidClass = 'has-error'; this.validityClassSelector = '.form-item'; InputView.prototype.initialize.apply(this, arguments); diff --git a/src/help/entries/auth-certificate-authority.md b/src/help/entries/auth-certificate-authority.md index 0bfd2464412..06f13ddf10b 100644 --- a/src/help/entries/auth-certificate-authority.md +++ b/src/help/entries/auth-certificate-authority.md @@ -1,6 +1,7 @@ --- title: Certificate Authority File tags: + - authentication - connect - ssl --- diff --git a/src/help/entries/auth-client-certificate-key.md b/src/help/entries/auth-client-certificate-key.md index 0acbd4e406d..bb70c22da45 100644 --- a/src/help/entries/auth-client-certificate-key.md +++ b/src/help/entries/auth-client-certificate-key.md @@ -1,6 +1,7 @@ --- title: Client Certificate Key tags: + - authentication - connect - ssl --- diff --git a/src/help/entries/auth-connect-to-host.md b/src/help/entries/auth-connect-to-host.md index 0194bac1e77..1e526c4a950 100644 --- a/src/help/entries/auth-connect-to-host.md +++ b/src/help/entries/auth-connect-to-host.md @@ -1,6 +1,7 @@ --- title: Connect to Host tags: + - authentication - connect --- Describes how to connect to a host. diff --git a/src/help/entries/auth-principal.md b/src/help/entries/auth-principal.md index a626642d576..858fd59c7ab 100644 --- a/src/help/entries/auth-principal.md +++ b/src/help/entries/auth-principal.md @@ -1,6 +1,7 @@ --- title: Principal tags: + - authentication - connect - kerberos --- diff --git a/src/help/index.js b/src/help/index.js index cd26c138716..c672482e2ec 100644 --- a/src/help/index.js +++ b/src/help/index.js @@ -75,23 +75,23 @@ var HelpPage = View.extend({ return; } + var entry = ENTRIES.get(entryId); if (!entry) { - debug('entry not found'); + debug('Unknown help entry', entryId); + this.viewSwitcher.clear(); + app.statusbar.showMessage('Help entry not found.'); return; } + app.statusbar.hide(); + if (!ENTRIES.select(entry)) { debug('already selected'); return; } - if (!entry) { - debug('unknown entry'); - this.viewSwitcher.clear(); - return; - } var view = new View({ template: '
' + entry.content + '
' }); diff --git a/src/statusbar/index.js b/src/statusbar/index.js index 419570ed441..39a4f2b7037 100644 --- a/src/statusbar/index.js +++ b/src/statusbar/index.js @@ -114,6 +114,11 @@ var StatusbarView = View.extend({ this.width = 100; this.loadingIndicator = true; }, + showMessage: function(message) { + this.visible = true; + this.message = message || ''; + this.loadingIndicator = false; + }, hide: function(completed) { this.message = ''; this.loadingIndicator = false; From f9a8419a8607c3b46c87b19997c05d121210a428 Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Sun, 15 Nov 2015 23:08:42 +1100 Subject: [PATCH 11/26] add support for related help entries --- src/connect/authentication.js | 4 +++- src/connect/connect-form-view.js | 1 + src/connect/filereader-default.jade | 6 +++++- src/connect/filereader-view.js | 7 +++++++ src/connect/select-default.jade | 6 +++++- src/connect/ssl.js | 5 +++++ src/help/entries/auth-connect-to-host.md | 7 ------- src/help/entries/auth-principal.md | 8 -------- src/help/entries/connect-favorite-name.md | 14 ++++++++++++++ src/help/entries/connect-kerberos-principal.md | 10 ++++++++++ .../entries/connect-kerberos-service-name.md | 8 ++++++++ ...md => connect-ssl-certificate-authority.md} | 6 ++++-- ...d => connect-ssl-client-certificate-key.md} | 4 ++++ .../entries/connect-ssl-client-certificate.md | 14 ++++++++++++++ .../connect-ssl-private-key-password.md | 12 ++++++++++++ .../entries/connect-userpass-auth-source.md | 18 ++++++++++++++++++ src/help/index.jade | 2 +- src/help/index.js | 11 ++++++++++- src/help/index.less | 4 +++- src/help/related.jade | 7 +++++++ src/models/help-entry-collection.js | 1 + src/models/help-entry.js | 4 +++- 22 files changed, 135 insertions(+), 24 deletions(-) delete mode 100644 src/help/entries/auth-connect-to-host.md delete mode 100644 src/help/entries/auth-principal.md create mode 100644 src/help/entries/connect-favorite-name.md create mode 100644 src/help/entries/connect-kerberos-principal.md create mode 100644 src/help/entries/connect-kerberos-service-name.md rename src/help/entries/{auth-certificate-authority.md => connect-ssl-certificate-authority.md} (57%) rename src/help/entries/{auth-client-certificate-key.md => connect-ssl-client-certificate-key.md} (60%) create mode 100644 src/help/entries/connect-ssl-client-certificate.md create mode 100644 src/help/entries/connect-ssl-private-key-password.md create mode 100644 src/help/entries/connect-userpass-auth-source.md create mode 100644 src/help/related.jade diff --git a/src/connect/authentication.js b/src/connect/authentication.js index edd4fa1ca1f..9b341c0b0c7 100644 --- a/src/connect/authentication.js +++ b/src/connect/authentication.js @@ -39,7 +39,7 @@ var MONGODB = { name: 'mongodb_database_name', label: 'Database Name', placeholder: 'admin', - helpEntry: 'auth-auth-source', + helpEntry: 'connect-userpass-auth-source', required: false }) ] @@ -57,6 +57,7 @@ var KERBEROS = { name: 'kerberos_service_name', label: 'Kerberos Service Name', placeholder: 'mongodb', + helpEntry: 'connect-kerberos-service-name', required: false }), new InputView({ @@ -64,6 +65,7 @@ var KERBEROS = { name: 'kerberos_principal', label: 'Kerberos Principal', placeholder: '', + helpEntry: 'connect-kerberos-principal', required: true }), new InputView({ diff --git a/src/connect/connect-form-view.js b/src/connect/connect-form-view.js index 026d0f087c5..6eb8494dc16 100644 --- a/src/connect/connect-form-view.js +++ b/src/connect/connect-form-view.js @@ -187,6 +187,7 @@ var ConnectFormView = FormView.extend({ name: 'name', label: 'Favorite Name', placeholder: 'e.g. Shared Dev, QA Box, PRODUCTION', + helpEntry: 'connect-favorite-name', required: false }) ]; diff --git a/src/connect/filereader-default.jade b/src/connect/filereader-default.jade index 5899d26547a..0000e9e3177 100644 --- a/src/connect/filereader-default.jade +++ b/src/connect/filereader-default.jade @@ -1,5 +1,9 @@ .form-item - label(data-hook='label')= label + label + span(data-hook='label')= label + if helpEntry + |  + i.help.fa.fa-info-circle(data-hook='#{helpEntry}') .message.message-below.message-error(data-hook='message-container') p(data-hook='message-text') .form-item-file diff --git a/src/connect/filereader-view.js b/src/connect/filereader-view.js index f1cbbe5dc63..d2b17362d45 100644 --- a/src/connect/filereader-view.js +++ b/src/connect/filereader-view.js @@ -30,6 +30,10 @@ module.exports = InputView.extend({ type: 'boolean', required: true, default: false + }, + helpEntry: { + type: 'string', + default: null } }, derived: { @@ -91,6 +95,9 @@ module.exports = InputView.extend({ _.defaults(spec, { value: [] }); + if (spec.helpEntry) { + this.helpEntry = spec.helpEntry; + } this.invalidClass = 'has-error'; this.validityClassSelector = '.form-item-file'; InputView.prototype.initialize.call(this, spec); diff --git a/src/connect/select-default.jade b/src/connect/select-default.jade index 0af3b291c89..aa096d90564 100644 --- a/src/connect/select-default.jade +++ b/src/connect/select-default.jade @@ -1,5 +1,9 @@ .form-item - label(data-hook='label')= label + label + span(data-hook='label')= label + if helpEntry + |   + i.help.fa.fa-info-circle(data-hook='#{helpEntry}') .message.message-below.message-error(data-hook='message-container') p(data-hook='message-text') select.form-control(type='select') diff --git a/src/connect/ssl.js b/src/connect/ssl.js index c1f2faaf0d4..191bc29aaad 100644 --- a/src/connect/ssl.js +++ b/src/connect/ssl.js @@ -41,6 +41,7 @@ var SERVER = { name: 'ssl_ca', multi: true, label: 'Certificate Authority', + helpEntry: 'connect-ssl-certificate-authority', required: true }) ] @@ -59,22 +60,26 @@ var ALL = { name: 'ssl_ca', multi: true, label: 'Certificate Authority', + helpEntry: 'connect-ssl-certificate-authority', required: true }), new FileReaderView({ name: 'ssl_private_key', label: 'Client Certificate Key', + helpEntry: 'connect-ssl-client-certificate-key', required: true }), new FileReaderView({ name: 'ssl_certificate', label: 'Client Certificate', + helpEntry: 'connect-ssl-client-certificate', required: true }), new InputView({ template: inputTemplate, name: 'ssl_private_key_password', label: 'Client Key Password', + helpEntry: 'connect-ssl-private-key-password', required: false }) ] diff --git a/src/help/entries/auth-connect-to-host.md b/src/help/entries/auth-connect-to-host.md deleted file mode 100644 index 1e526c4a950..00000000000 --- a/src/help/entries/auth-connect-to-host.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Connect to Host -tags: - - authentication - - connect ---- -Describes how to connect to a host. diff --git a/src/help/entries/auth-principal.md b/src/help/entries/auth-principal.md deleted file mode 100644 index 858fd59c7ab..00000000000 --- a/src/help/entries/auth-principal.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: Principal -tags: - - authentication - - connect - - kerberos ---- -Describes what a principal is. diff --git a/src/help/entries/connect-favorite-name.md b/src/help/entries/connect-favorite-name.md new file mode 100644 index 00000000000..475a13d09b2 --- /dev/null +++ b/src/help/entries/connect-favorite-name.md @@ -0,0 +1,14 @@ +--- +title: Favorite Name +tags: + - authentication + - connect + - kerberos +--- + +Favorite name for a saved connection. + +![](./images/help/geo_fallback.png) + +Connections can be saved as favorites. Provide a name here and click +"Create Favorite" to save a connection. diff --git a/src/help/entries/connect-kerberos-principal.md b/src/help/entries/connect-kerberos-principal.md new file mode 100644 index 00000000000..09d6331a9c0 --- /dev/null +++ b/src/help/entries/connect-kerberos-principal.md @@ -0,0 +1,10 @@ +--- +title: Kerberos Principal +tags: + - authentication + - connect + - kerberos +related: + - connect-kerberos-service-name +--- +Describes what a Kerberos principal is. diff --git a/src/help/entries/connect-kerberos-service-name.md b/src/help/entries/connect-kerberos-service-name.md new file mode 100644 index 00000000000..6beb6e2ae98 --- /dev/null +++ b/src/help/entries/connect-kerberos-service-name.md @@ -0,0 +1,8 @@ +--- +title: Kerberos Service Name +tags: + - authentication + - connect + - kerberos +--- +Describes what a Kerberos Service name is. diff --git a/src/help/entries/auth-certificate-authority.md b/src/help/entries/connect-ssl-certificate-authority.md similarity index 57% rename from src/help/entries/auth-certificate-authority.md rename to src/help/entries/connect-ssl-certificate-authority.md index 06f13ddf10b..fe6d987af7f 100644 --- a/src/help/entries/auth-certificate-authority.md +++ b/src/help/entries/connect-ssl-certificate-authority.md @@ -4,7 +4,9 @@ tags: - authentication - connect - ssl +related: + - connect-ssl-client-certificate-key + - connect-ssl-client-certificate + - connect-ssl-private-key-password --- Describes what the `Certificate Authority` field in the connect dialog does. - -I am *markdown*. diff --git a/src/help/entries/auth-client-certificate-key.md b/src/help/entries/connect-ssl-client-certificate-key.md similarity index 60% rename from src/help/entries/auth-client-certificate-key.md rename to src/help/entries/connect-ssl-client-certificate-key.md index bb70c22da45..1488ff2593e 100644 --- a/src/help/entries/auth-client-certificate-key.md +++ b/src/help/entries/connect-ssl-client-certificate-key.md @@ -4,6 +4,10 @@ tags: - authentication - connect - ssl +related: + - connect-ssl-certificate-authority + - connect-ssl-client-certificate + - connect-ssl-private-key-password --- Describes what the `Client Certificate Key` field in the connect dialog does. diff --git a/src/help/entries/connect-ssl-client-certificate.md b/src/help/entries/connect-ssl-client-certificate.md new file mode 100644 index 00000000000..77a60bc8c56 --- /dev/null +++ b/src/help/entries/connect-ssl-client-certificate.md @@ -0,0 +1,14 @@ +--- +title: Client Certificate +tags: + - authentication + - connect + - ssl +related: + - connect-ssl-certificate-authority + - connect-ssl-client-certificate-key + - connect-ssl-private-key-password +--- +Describes what the `Client Certificate` field in the connect dialog does. + +I am *markdown*. diff --git a/src/help/entries/connect-ssl-private-key-password.md b/src/help/entries/connect-ssl-private-key-password.md new file mode 100644 index 00000000000..82ff980e724 --- /dev/null +++ b/src/help/entries/connect-ssl-private-key-password.md @@ -0,0 +1,12 @@ +--- +title: Private Key Password +tags: + - authentication + - connect + - ssl +related: + - connect-ssl-certificate-authority + - connect-ssl-client-certificate-key + - connect-ssl-client-certificate +--- +Describes what the `Private Key Password` field in the connect dialog does. It's optional. diff --git a/src/help/entries/connect-userpass-auth-source.md b/src/help/entries/connect-userpass-auth-source.md new file mode 100644 index 00000000000..eff008b8c34 --- /dev/null +++ b/src/help/entries/connect-userpass-auth-source.md @@ -0,0 +1,18 @@ +--- +title: Authentication Source +tags: + - authentication + - connect +--- +This field represents the _Authentication Source_ (also called +_Authentication Database_) for User/Password authentication. + +In MongoDB's authentication model, a username is scoped to a database, called +_Authentication Source_. The user’s privileges are not necessarily limited to +this database. The user can have privileges in additional databases. + +For authentication methods other than User/Password authentication (like +_Kerberos_, _LDAP_, _X.509_), the Authentication Source is always set +to `$external` and no user input is required. + +If the field is left blank, the default value `admin` is used. diff --git a/src/help/index.jade b/src/help/index.jade index 602938eb257..875d782c12c 100644 --- a/src/help/index.jade +++ b/src/help/index.jade @@ -1,5 +1,5 @@ .page.help div(data-hook='sidebar-subview') .content.with-sidebar - h3(data-hook='help-entry-title') + h2(data-hook='help-entry-title') .help-entry(data-hook='help-entry-content') diff --git a/src/help/index.js b/src/help/index.js index c672482e2ec..3cb74acf983 100644 --- a/src/help/index.js +++ b/src/help/index.js @@ -1,11 +1,13 @@ var View = require('ampersand-view'); var format = require('util').format; var debug = require('debug')('scout:help'); +var relatedTemplate = require('./related.jade'); var HelpEntryCollection = require('../models/help-entry-collection'); var HelpEntry = require('../models/help-entry'); var SidebarView = require('./sidebar'); var ViewSwitcher = require('ampersand-view-switcher'); var app = require('ampersand-app'); +var _ = require('lodash'); var ENTRIES = new HelpEntryCollection(); @@ -92,8 +94,15 @@ var HelpPage = View.extend({ return; } + // get related entries + var relatedEntries = _.map(entry.related, function(relEntry) { + return ENTRIES.get(relEntry); + }); + var view = new View({ - template: '
' + entry.content + '
' + template: '
' + entry.content + relatedTemplate({ + relatedEntries: relatedEntries + }) + '
' }); this.viewSwitcher.set(view); diff --git a/src/help/index.less b/src/help/index.less index 029c85a74a1..cf6e78017a2 100644 --- a/src/help/index.less +++ b/src/help/index.less @@ -55,6 +55,8 @@ } .help-entry { - + .related { + padding-top: 20px; + } } } diff --git a/src/help/related.jade b/src/help/related.jade new file mode 100644 index 00000000000..c593d83b8e9 --- /dev/null +++ b/src/help/related.jade @@ -0,0 +1,7 @@ +.related + if relatedEntries && relatedEntries.length > 0 + h4 Related Topics + ul + each entry in relatedEntries + li + a(href='##{entry.id}')= entry.title diff --git a/src/models/help-entry-collection.js b/src/models/help-entry-collection.js index 188ccac9d41..94ea1934b7b 100644 --- a/src/models/help-entry-collection.js +++ b/src/models/help-entry-collection.js @@ -7,6 +7,7 @@ var ipc = window.require('ipc'); var HelpEntryCollection = Collection.extend(selectableMixin, { namespace: 'HelpEntryCollection', + comparator: 'title', model: HelpEntry }, withSync(function(options, done) { if (options.method !== 'read') { diff --git a/src/models/help-entry.js b/src/models/help-entry.js index 36f7ec254a6..82370a961d3 100644 --- a/src/models/help-entry.js +++ b/src/models/help-entry.js @@ -8,7 +8,8 @@ var HelpEntry = State.extend({ id: 'string', title: 'string', content: 'string', - tags: 'array' + tags: 'array', + related: 'array' }, derived: { url: { @@ -30,6 +31,7 @@ var HelpEntry = State.extend({ id: resp.filename.replace('.md', ''), title: resp.meta.title, tags: resp.meta.tags || [], + related: resp.meta.related || [], content: resp.content }; } From 3398a04b268f779deab18d30c5fbffd1edec672b Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Mon, 16 Nov 2015 00:25:07 +1100 Subject: [PATCH 12/26] added tags, devOnly entries, and how-help-works.md --- src/app.js | 9 +- src/connect/index.js | 11 +-- src/electron/help.js | 7 ++ src/help/entries/connect-favorite-name.md | 2 - src/help/entries/dev-how-help-works.md | 107 ++++++++++++++++++++++ src/help/index.js | 31 ++++--- src/help/index.less | 3 + src/help/tags.jade | 8 ++ src/models/help-entry.js | 4 +- 9 files changed, 158 insertions(+), 24 deletions(-) create mode 100644 src/help/entries/dev-how-help-works.md create mode 100644 src/help/tags.jade diff --git a/src/app.js b/src/app.js index 32456b3df90..801f95d3a92 100644 --- a/src/app.js +++ b/src/app.js @@ -28,6 +28,8 @@ var MongoDBInstance = require('./models/mongodb-instance'); var User = require('./models/user'); var Router = require('./router'); var Statusbar = require('./statusbar'); +var Help = require('./help'); +var $ = require('jquery'); var debug = require('debug')('scout:app'); @@ -119,7 +121,12 @@ var Application = View.extend({ user: User }, events: { - 'click a': 'onLinkClick' + 'click a': 'onLinkClick', + 'click i.help': 'onHelpClicked' + }, + onHelpClicked: function(evt) { + var id = $(evt.target).attr('data-hook'); + Help.open(id); }, onClientReady: function() { debug('Client ready! Took %dms to become readable', diff --git a/src/connect/index.js b/src/connect/index.js index 486ae20a3fa..407540c3036 100644 --- a/src/connect/index.js +++ b/src/connect/index.js @@ -6,11 +6,10 @@ var ConnectFormView = require('./connect-form-view'); var Connection = require('../models/connection'); var debug = require('debug')('scout:connect:index'); var _ = require('lodash'); -var $ = require('jquery'); var app = require('ampersand-app'); var format = require('util').format; var metrics = require('mongodb-js-metrics'); -var Help = require('../help'); + /** * AuthenticationOptionCollection */ @@ -98,8 +97,7 @@ var ConnectView = View.extend({ 'input input': 'onAnyInputChanged', 'change input': 'onAnyInputChanged', 'change select': 'onAnyInputChanged', - 'click div.btn': 'onAnyInputChanged', - 'click i.help': 'onHelpClicked' + 'click div.btn': 'onAnyInputChanged' }, /** @@ -141,11 +139,6 @@ var ConnectView = View.extend({ this.dispatch('save changes clicked'); }, - onHelpClicked: function(evt) { - var id = $(evt.target).attr('data-hook'); - Help.open(id); - }, - bindings: { // show error div hasError: { diff --git a/src/electron/help.js b/src/electron/help.js index 76c83b9aaf6..07e210ce1f8 100644 --- a/src/electron/help.js +++ b/src/electron/help.js @@ -1,6 +1,7 @@ var path = require('path'); var ipc = require('ipc'); var mm = require('marky-mark'); +var _ = require('lodash'); var debug = require('debug')('scout:electron:help'); debug('adding ipc listener for `/help/entries`...'); @@ -14,6 +15,12 @@ ipc.on('/help/entries', function(evt) { return; } debug('successfully parsed!', posts); + // in production don't return the dev-only entries + if (process.env.NODE_ENV === 'production') { + posts = _.filter(posts, function(post) { + return !post.meta.devOnly; + }); + } evt.sender.send('/help/entries/success', posts); }); }); diff --git a/src/help/entries/connect-favorite-name.md b/src/help/entries/connect-favorite-name.md index 475a13d09b2..e0b41663b02 100644 --- a/src/help/entries/connect-favorite-name.md +++ b/src/help/entries/connect-favorite-name.md @@ -8,7 +8,5 @@ tags: Favorite name for a saved connection. -![](./images/help/geo_fallback.png) - Connections can be saved as favorites. Provide a name here and click "Create Favorite" to save a connection. diff --git a/src/help/entries/dev-how-help-works.md b/src/help/entries/dev-how-help-works.md new file mode 100644 index 00000000000..343134d8d1b --- /dev/null +++ b/src/help/entries/dev-how-help-works.md @@ -0,0 +1,107 @@ +--- +title: Compass Help System +tags: + - help +devOnly: true +--- + +This entry explains the help system in Compass. + +The Help system in Compass runs in a separate singleton window, like the +Connect Window. The sidebar shows a list of all available entries, sorted +alphabetically, the main view shows the title, tags, the actual help text, +and related entries. + +### How to add a help button in Compass + +To add a help button (little round info circle) anywhere in the app, go to +the `.jade` file and add a font-awesome symbol like so: + +``` +i.help.fa.fa-info(data-hook='my-help-entry') +``` + +The data-hook needs to point to a valid help entry key, in this case +`my-help-entry`. + +No additional click handlers are required in any of the view classes. This +is already handled in `./src/app.js`, see the `event` object and the +`onHelpClicked` method. + + +### How to add a help entry + +To add a help entry, add a file to the `src/help/entries` folder. +The filename must be the help entry that was used in the `i.help` +element, and the extension is `.md` for markdown, e.g. `my-help-entry.md`. + +As a convention, the first part of the entry key should be one of: + +- `connect-` for help entries related to the Connect Window +- `schema-` for help entries related to the Schema Window +- `dev-` for developer-only help entries like this one + + +##### Front Matter + +The entry content itself needs to start with a header called "front matter", +which is in YAML format. Here is an example: + +``` +--- +title: Kerberos Principal +tags: + - authentication + - connect + - kerberos +related: + - connect-kerberos-service-name +devOnly: false +--- +``` + +The only required field in the front matter is the `title` field. All other +fields are optional. + +##### Tags + +`tags` are added to the top of the article below the title, but currently +don't have any other function. We might add search by tags in a later version. + +##### Related Links + +When you add one or more related entry keys under the `related` field, a +"Related" section is automatically added at the bottom of the article, linking +to the related entries. + +##### Entries for Developers + +If the `devOnly` field is present and set to `true`, the entry receives +a special red `development` tag, indicating that this entry is meant for +internal development. All such entries are filtered out in the production +version and will not be visible to the end user. + +##### Content + +The actual content for a help entry is written in Markdown. For instructions +see Google. + +##### Images + +Images can be included in help entries as well. To add an image, copy it +to the `./images/help/` folder at the top level, and insert the image in +a help entry like so: + +``` +![](./images/help/my_image.png) +``` + +### Known Issues + +- The help system currently doesn't support external links yet. +- The help window is not yet a singleton +- The help window is too big +- The help window needs styling +- The sidebar should have some hierarchy to find articles faster +- The sidebar should have a filter at the top to find articles faster +- The help system should be accessible from the Help menu diff --git a/src/help/index.js b/src/help/index.js index 3cb74acf983..7f55d5efe65 100644 --- a/src/help/index.js +++ b/src/help/index.js @@ -2,6 +2,7 @@ var View = require('ampersand-view'); var format = require('util').format; var debug = require('debug')('scout:help'); var relatedTemplate = require('./related.jade'); +var tagTemplate = require('./tags.jade'); var HelpEntryCollection = require('../models/help-entry-collection'); var HelpEntry = require('../models/help-entry'); var SidebarView = require('./sidebar'); @@ -9,7 +10,7 @@ var ViewSwitcher = require('ampersand-view-switcher'); var app = require('ampersand-app'); var _ = require('lodash'); -var ENTRIES = new HelpEntryCollection(); +var entries = new HelpEntryCollection(); var HelpPage = View.extend({ session: { @@ -55,7 +56,7 @@ var HelpPage = View.extend({ template: require('./index.jade'), initialize: function(spec) { spec = spec || {}; - ENTRIES.fetch(); + entries.fetch(); if (spec.entryId) { this.entryId = spec.entryId; @@ -71,14 +72,14 @@ var HelpPage = View.extend({ }, show: function(entryId) { debug('show `%s`', entryId); - if (ENTRIES.length === 0) { - ENTRIES.once('sync', this.show.bind(this, entryId)); + if (entries.length === 0) { + entries.once('sync', this.show.bind(this, entryId)); debug('entries not synced yet. queuing...'); return; } - var entry = ENTRIES.get(entryId); + var entry = entries.get(entryId); if (!entry) { debug('Unknown help entry', entryId); @@ -89,20 +90,28 @@ var HelpPage = View.extend({ app.statusbar.hide(); - if (!ENTRIES.select(entry)) { + if (!entries.select(entry)) { debug('already selected'); return; } // get related entries var relatedEntries = _.map(entry.related, function(relEntry) { - return ENTRIES.get(relEntry); + return entries.get(relEntry); }); var view = new View({ - template: '
' + entry.content + relatedTemplate({ - relatedEntries: relatedEntries - }) + '
' + template: + '
' + + tagTemplate({ + tags: entry.tags, + devOnly: entry.devOnly + }) + + entry.content + + relatedTemplate({ + relatedEntries: relatedEntries + }) + + '
' }); this.viewSwitcher.set(view); @@ -118,7 +127,7 @@ var HelpPage = View.extend({ return new SidebarView({ el: el, parent: this, - entries: ENTRIES + entries: entries }); } } diff --git a/src/help/index.less b/src/help/index.less index cf6e78017a2..6b6332c97ab 100644 --- a/src/help/index.less +++ b/src/help/index.less @@ -58,5 +58,8 @@ .related { padding-top: 20px; } + .tags { + padding-bottom: 20px; + } } } diff --git a/src/help/tags.jade b/src/help/tags.jade new file mode 100644 index 00000000000..50713ab5b61 --- /dev/null +++ b/src/help/tags.jade @@ -0,0 +1,8 @@ +.tags + if tags && tags.length > 0 + ul.list-inline + each tag in tags + li + span.label.label-primary= tag + if devOnly + span.label.label-danger development diff --git a/src/models/help-entry.js b/src/models/help-entry.js index 82370a961d3..6a2bc1bb456 100644 --- a/src/models/help-entry.js +++ b/src/models/help-entry.js @@ -9,7 +9,8 @@ var HelpEntry = State.extend({ title: 'string', content: 'string', tags: 'array', - related: 'array' + related: 'array', + devOnly: 'boolean' }, derived: { url: { @@ -32,6 +33,7 @@ var HelpEntry = State.extend({ title: resp.meta.title, tags: resp.meta.tags || [], related: resp.meta.related || [], + devOnly: !!resp.meta.devOnly, content: resp.content }; } From 43e119fe6e20682c9ea53e95952e3a1b8b9258c7 Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Mon, 16 Nov 2015 10:56:27 +1100 Subject: [PATCH 13/26] :pencil: :add comment explaining template --- src/help/index.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/help/index.js b/src/help/index.js index 7f55d5efe65..4224ce92820 100644 --- a/src/help/index.js +++ b/src/help/index.js @@ -101,6 +101,13 @@ var HelpPage = View.extend({ }); var view = new View({ + /** + * constructing the final help window template here, which consists of + * - surrounding
+ * - "tags" template, @see ./tags.jade + * - the content, @see ./entries/*.md files + * - "related" template, @see ./related.jade + */ template: '
' + tagTemplate({ From 1cea3b05b3ffc677eecbe7d929a345d1a541db6d Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Mon, 16 Nov 2015 11:02:01 +1100 Subject: [PATCH 14/26] :bug: fix issue connecting to schema window --- src/router.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/router.js b/src/router.js index e76e49dd48f..b83c202bd03 100644 --- a/src/router.js +++ b/src/router.js @@ -6,7 +6,7 @@ var HelpPage = require('./help'); module.exports = AmpersandRouter.extend({ routes: { - '': 'connect', + '': 'index', schema: 'index', connect: 'connect', 'schema/:ns': 'schema', @@ -14,6 +14,9 @@ module.exports = AmpersandRouter.extend({ 'help/:entryId': 'help', '(*path)': 'catchAll' }, + index: function() { + this.trigger('page', new HomePage({})); + }, schema: function(ns) { this.trigger('page', new HomePage({ ns: ns From 2fbdec2ca9e1641dd08506967ed9c609f02a8aa5 Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Mon, 16 Nov 2015 12:00:44 +1100 Subject: [PATCH 15/26] consistent styling of i.help(), more entries --- images/help/schema/sampling-results-full.png | Bin 0 -> 12133 bytes .../help/schema/sampling-results-sample.png | Bin 0 -> 13815 bytes src/connect/filereader-default.jade | 3 +- src/connect/input-default.jade | 3 +- src/connect/select-default.jade | 3 +- src/help/entries/dev-how-help-works.md | 2 +- src/help/entries/schema-how-sampling-works.md | 6 +++ src/help/entries/schema-query-bar.md | 7 ++++ src/help/entries/schema-sampling-results.md | 37 ++++++++++++++++++ src/help/index.js | 12 ++++-- src/sampling-message/index.jade | 1 + styles/index.less | 16 +++++++- 12 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 images/help/schema/sampling-results-full.png create mode 100644 images/help/schema/sampling-results-sample.png create mode 100644 src/help/entries/schema-how-sampling-works.md create mode 100644 src/help/entries/schema-query-bar.md create mode 100644 src/help/entries/schema-sampling-results.md diff --git a/images/help/schema/sampling-results-full.png b/images/help/schema/sampling-results-full.png new file mode 100644 index 0000000000000000000000000000000000000000..e6f3a8ba8f1eb31661f2ac7fcfad18306e9e4901 GIT binary patch literal 12133 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 z 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 M#TCS=L=1!eKm2{y_5c6? literal 0 HcmV?d00001 diff --git a/images/help/schema/sampling-results-sample.png b/images/help/schema/sampling-results-sample.png new file mode 100644 index 0000000000000000000000000000000000000000..8c752a0862df2d21496722c3dd17ff5c07e3d94f GIT binary patch literal 13815 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 Nw77y;rHEnB{{cR7KN0`{ literal 0 HcmV?d00001 diff --git a/src/connect/filereader-default.jade b/src/connect/filereader-default.jade index 0000e9e3177..4bfc3311954 100644 --- a/src/connect/filereader-default.jade +++ b/src/connect/filereader-default.jade @@ -2,8 +2,7 @@ label span(data-hook='label')= label if helpEntry - |  - i.help.fa.fa-info-circle(data-hook='#{helpEntry}') + i.help(data-hook='#{helpEntry}') .message.message-below.message-error(data-hook='message-container') p(data-hook='message-text') .form-item-file diff --git a/src/connect/input-default.jade b/src/connect/input-default.jade index e26844af483..2c3f9fbda1b 100644 --- a/src/connect/input-default.jade +++ b/src/connect/input-default.jade @@ -2,8 +2,7 @@ label span(data-hook='label')= label if helpEntry - |   - i.help.fa.fa-info-circle(data-hook='#{helpEntry}') + i.help(data-hook='#{helpEntry}') .message.message-above.message-error(data-hook='message-container') p(data-hook='message-text') input.form-control(placeholder='#{placeholder}') diff --git a/src/connect/select-default.jade b/src/connect/select-default.jade index aa096d90564..90c222689d4 100644 --- a/src/connect/select-default.jade +++ b/src/connect/select-default.jade @@ -2,8 +2,7 @@ label span(data-hook='label')= label if helpEntry - |   - i.help.fa.fa-info-circle(data-hook='#{helpEntry}') + i.help(data-hook='#{helpEntry}') .message.message-below.message-error(data-hook='message-container') p(data-hook='message-text') select.form-control(type='select') diff --git a/src/help/entries/dev-how-help-works.md b/src/help/entries/dev-how-help-works.md index 343134d8d1b..1a849698e1b 100644 --- a/src/help/entries/dev-how-help-works.md +++ b/src/help/entries/dev-how-help-works.md @@ -18,7 +18,7 @@ To add a help button (little round info circle) anywhere in the app, go to the `.jade` file and add a font-awesome symbol like so: ``` -i.help.fa.fa-info(data-hook='my-help-entry') +i.help(data-hook='my-help-entry') ``` The data-hook needs to point to a valid help entry key, in this case diff --git a/src/help/entries/schema-how-sampling-works.md b/src/help/entries/schema-how-sampling-works.md new file mode 100644 index 00000000000..6411a7cfbfd --- /dev/null +++ b/src/help/entries/schema-how-sampling-works.md @@ -0,0 +1,6 @@ +--- +title: How Sampling Works +tags: + - schema + - sampling +--- diff --git a/src/help/entries/schema-query-bar.md b/src/help/entries/schema-query-bar.md new file mode 100644 index 00000000000..2a99e0b27df --- /dev/null +++ b/src/help/entries/schema-query-bar.md @@ -0,0 +1,7 @@ +--- +title: Query Bar +tags: + - schema + - sampling + - query +--- diff --git a/src/help/entries/schema-sampling-results.md b/src/help/entries/schema-sampling-results.md new file mode 100644 index 00000000000..f4fc5059692 --- /dev/null +++ b/src/help/entries/schema-sampling-results.md @@ -0,0 +1,37 @@ +--- +title: Sampling Results +tags: + - schema + - sampling + - results +related: + - schema-how-sampling-works + - schema-query-bar +--- + +The message below the Query Bar provides information about the +number of documents that matched the query, and the number of documents +used for the schema report. + + +There are two possible outcomes when you use the +[Query Bar](#schema-query-bar) to refine the results. + +1. The query you specified matches _more than_ the sampling limit (currently + 100 documents). + + In this case, Compass samples 100 documents randomly from + the matching documents, and builds a schema report based on that sample. + You will see a message that provides both the number of matched documents + and the size of the sample set. Example: + + ![](./images/help/schema/sampling-results-sample.png) + +2. The query you specified matches _less than or equal to_ the sampling limit + (currently 100 documents). + + In this case, Compass uses all matched documents + to build a schema report. You will see a message that provides the number + of matched documents. Example: + + ![](./images/help/schema/sampling-results-full.png) diff --git a/src/help/index.js b/src/help/index.js index 4224ce92820..13a997545f8 100644 --- a/src/help/index.js +++ b/src/help/index.js @@ -78,7 +78,6 @@ var HelpPage = View.extend({ return; } - var entry = entries.get(entryId); if (!entry) { @@ -96,9 +95,14 @@ var HelpPage = View.extend({ } // get related entries - var relatedEntries = _.map(entry.related, function(relEntry) { - return entries.get(relEntry); - }); + var relatedEntries = _(entry.related) + .map(function(relEntry) { + return entries.get(relEntry); + }) + .filter(function(relEntry) { + return relEntry; + }) + .value(); var view = new View({ /** diff --git a/src/sampling-message/index.jade b/src/sampling-message/index.jade index 5feb81eb8aa..7197348f473 100644 --- a/src/sampling-message/index.jade +++ b/src/sampling-message/index.jade @@ -11,3 +11,4 @@ | Query returned  b #{formatted_sample_size} |  #{sample_size_document}. + i.help(data-hook='schema-sampling-results') diff --git a/styles/index.less b/styles/index.less index 2b45af66d65..680dbf82d60 100644 --- a/styles/index.less +++ b/styles/index.less @@ -6,7 +6,6 @@ // Configuration // @import "./variables.less"; @octicons-font-path: "fonts"; - @fa-font-path: "fonts"; // Tweaks to bootstrap @@ -62,3 +61,18 @@ html, body { } } } + +// make all help buttons consistent +i.help { + .fa-icon; + margin: 0 5px; + cursor: pointer; + color: @gray5; + + &:hover { + color: @alertOrange; + } + &:before { + content: @fa-var-info-circle; + } +} From 3c162e158a3c7e02e0e2176e91b8e3dc4c4d32cf Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Mon, 16 Nov 2015 15:57:01 +1100 Subject: [PATCH 16/26] moved taxonomy and view hierarchy to help --- images/help/dev/view_hierarchy.png | Bin 0 -> 212029 bytes src/help/entries/dev-ampersand-tips.md | 101 +++++++++++++++++++ src/help/entries/dev-taxonomy.md | 129 +++++++++++++++++++++++++ src/help/index.less | 4 + 4 files changed, 234 insertions(+) create mode 100644 images/help/dev/view_hierarchy.png create mode 100644 src/help/entries/dev-ampersand-tips.md create mode 100644 src/help/entries/dev-taxonomy.md diff --git a/images/help/dev/view_hierarchy.png b/images/help/dev/view_hierarchy.png new file mode 100644 index 0000000000000000000000000000000000000000..761805501ee69133aa70e800d55003721959db9a GIT binary patch literal 212029 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.js is the Model and View layer used by Compass. + +## Some Tips and Tricks using Ampersand.js + +### View Hierarchy + +This diagram shows the view hierarchy of Compass and where the `.js` files and `.jade` templates for each view are. + +![](./images/help/dev/view_hierarchy.png) + +### Subviews vs. `renderCollection()` vs. `renderSubview()` + +[Ampersand views](http://ampersandjs.com/docs#ampersand-view) offer a number of ways of rendering subviews inside of them, for modular view composition. Each have their own advantages for certain use cases. + +#### Subviews + +Subviews can be defined inside a `subviews` property when extending an AmpersandView, see [ampersand-view subviews](http://ampersandjs.com/docs#ampersand-view-subviews). An example would look like this: + +```javascript +var AmpersandView = require('ampersand-view'); +var ControlPanelView = require('./controlpanel'); + +module.exports = AmpersandView.extend({ + template: require('./my-view.jade'), + subviews: { + controlpanel: { // just a name, choose something + container: '[data-hook=controlpanel-subview]', // use *-subiew hook + waitFor: 'model.controls', // waits until model.controls becomes true-thy + prepareView: function (el) { + return new ControlPanelView({ // return new view instance + el: el, // always pass in the el element + model: this.model.controls // optionally pass in a model or collection + }); + } + } +}); +``` + +Subviews defined this way in the `subviews` property **replace** the DOM element container. Keep this in mind when writing your .html or .jade templates. It makes no sense to add a class or id or any other attributes to the container element, as it will be removed and replaced with the root of the subview. + +**Pro Tip:** A good convention is to always use a hook ending in `-subview`, as opposed to `-container` (see below), to make it easy to see which elements are replaced and which ones stay in the DOM. + +#### renderCollection() + +AmpersandView also has a [`.renderCollection()`](http://ampersandjs.com/docs#ampersand-view-rendercollection) method. It takes an AmpersandCollection, a view class, and a container selector and renders an instance of the view for each model in the collection inside the container. It also listens to changes in the collection and automatically removes or adds new views. + +A typical example often uses `.renderCollection()` inside the `render()` method and could look like this: + +```js +var AmpersandView = require('ampersand-view'); +var MySingleItemView = require('./single-item'); + +module.exports = AmpersandView.extend({ + template: require('./my-view.jade'), + render: function () { + this.renderWithTemplate(this); + this.renderCollection(this.collection, MySingleItemView, this.queryByHook('items-container')); + } +} +``` + +**Pro Tip:** As a convention, here we use a hook ending in `-container`, because the container remains in the DOM. + + +#### renderSubview() + +[`.renderSubview()`](http://ampersandjs.com/docs#ampersand-view-rendersubview) is like a manual version of the `subviews` property mentioned above. It is most often used if the subview is added dynamically at some later point, if you require the container to remain in the DOM, or if the `subviews` mechanism doesn't allow for your specific use case, e.g. the conditions when the subview needs to be rendered. (Notice though that often this can be solved with a _derived property_, that the subview can `waitFor`). + +Typical code could look like this: + +```js +var AmpersandView = require('ampersand-view'); +var MySpecialView = require('./my-special'); + +module.exports = AmpersandView.extend({ + template: require('./my-view.jade'), + events: { + 'click .specialButton': 'onSpecialClicked' + }, + onSpecialClicked: function (evt) { + if (this.rendered) { + var specialModel = ...; // compute special model here + this.renderSubview(specialModel, MySpecialView, this.queryByHook('special-container')); + } + } +} +``` + +This is similar to the `.renderCollection()` example, except it applies to a single view instance instead of multiple views. + +**Pro Tip:** As a convention, again we use a hook ending in `-container`, because the container remains in the DOM. diff --git a/src/help/entries/dev-taxonomy.md b/src/help/entries/dev-taxonomy.md new file mode 100644 index 00000000000..4b5a8c6a957 --- /dev/null +++ b/src/help/entries/dev-taxonomy.md @@ -0,0 +1,129 @@ +--- +title: Compass Taxonomy +tags: + - taxonomy +devOnly: true +--- + +The [docs style guide][docs-style] has a beautifully detailed and thorough +taxonomy which covers most of the tech taxonomy and it is strongly recommended +you spend some time reviewing it. + +## mongoscope + +``` +i.fa.fa-fw.fa-scope +``` + +Consider synonymous with web admin, webmin, web ui, 28017, +"dbwebserver.cpp", etc. This is the product you're most likely working on +if your name begins with an "L" and sounds like "mucus". + +## deployment + +``` +i.fa.fa-fw.fa-leaf +``` + +1 or more instances that make up a descrete unit of infrastructure. +There are 3 types of deployments: + +### standalone + +``` +i.fa.fa-fw.fa-store +``` + +Only instance is a store instance. + +### replicaset + +``` +i.fa.fa-fw.fa-replicaset +``` + +3 or more store instances and 0 or more arbiter instances. + +### cluster + +``` +i.fa.fa-fw.fa-cluster +``` + +A deployment with sharding enabled. Made up of 1 or more router instances, and general 2 or more replica sets. + +## instance + +A MongoDB process. + +### router + +``` +i.fa.fa-fw.fa-router +``` + +A mongos process. + +### config + +``` +i.fa.fa-fw.fa-config +``` + +A mongod process running as a config server for routers. + +### store + +``` +i.fa.fa-fw.fa-store +``` + +A vanilla mongod process running as part of a standlone or replica set. + +## dataset + +### database + +### collection + +### index + +### document + +## System (wip. whats it called in the kernel?) + +### Replication + +The active distributed-system providing fault-tolerance. + +#### oplog + +The element of replication that stores all operations and powers the oplog synchronization subsystem. + +#### oplog synchronization + +The subsystem by which members communicate. + +#### election + +#### member + +##### primary + +##### secondary + +##### arbiter + +### Sharding + +#### routing + +#### shard + +#### balancing + +#### chunk + +#### chunk migration + +[docs-style]: http://docs.mongodb.org/manual/meta/style-guide/#jargon-and-common-terms diff --git a/src/help/index.less b/src/help/index.less index 6b6332c97ab..3629bd8fb8e 100644 --- a/src/help/index.less +++ b/src/help/index.less @@ -55,6 +55,10 @@ } .help-entry { + + img { + max-width: 100%; + } .related { padding-top: 20px; } From 50ddb138698d7b3ce10e3d60ca98e22109cda18d Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Mon, 16 Nov 2015 16:57:05 +1100 Subject: [PATCH 17/26] syntax highlighting for code snippets in help --- package.json | 1 + src/electron/help.js | 16 +++++++++++++++- src/help/entries/dev-ampersand-tips.md | 2 +- styles/index.less | 1 + 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ab84e66baa5..dcea2ee8ce1 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "dependencies": { "debug": "^2.2.0", "electron-squirrel-startup": "^0.1.4", + "highlight.js": "^8.9.1", "keytar": "^3.0.0", "localforage": "^1.3.0", "marky-mark": "^1.2.1", diff --git a/src/electron/help.js b/src/electron/help.js index 07e210ce1f8..6cb12665a39 100644 --- a/src/electron/help.js +++ b/src/electron/help.js @@ -2,13 +2,27 @@ var path = require('path'); var ipc = require('ipc'); var mm = require('marky-mark'); var _ = require('lodash'); +var highlight = require('highlight.js'); + var debug = require('debug')('scout:electron:help'); debug('adding ipc listener for `/help/entries`...'); ipc.on('/help/entries', function(evt) { var dir = path.join(__dirname, '..', 'help', 'entries'); debug('parsing entries with marky-mark from `%s`', dir); - mm.parseDirectory(dir, function(err, posts) { + + // add syntax highlighting options, pass through to `marked` module + var options = { + marked: { + highlight: function(code) { + var result = highlight.highlightAuto(code).value; + debug('result', result); + return result; + } + } + }; + + mm.parseDirectory(dir, options, function(err, posts) { if (err) { debug('error parsing entries', err); evt.sender.send('/help/entries/error', err); diff --git a/src/help/entries/dev-ampersand-tips.md b/src/help/entries/dev-ampersand-tips.md index aaa21cf2a81..354751f9119 100644 --- a/src/help/entries/dev-ampersand-tips.md +++ b/src/help/entries/dev-ampersand-tips.md @@ -26,7 +26,7 @@ This diagram shows the view hierarchy of Compass and where the `.js` files and ` Subviews can be defined inside a `subviews` property when extending an AmpersandView, see [ampersand-view subviews](http://ampersandjs.com/docs#ampersand-view-subviews). An example would look like this: -```javascript +```js var AmpersandView = require('ampersand-view'); var ControlPanelView = require('./controlpanel'); diff --git a/styles/index.less b/styles/index.less index 680dbf82d60..950dbe77403 100644 --- a/styles/index.less +++ b/styles/index.less @@ -2,6 +2,7 @@ @import "font-awesome"; @import "octicons"; @import "bootstrap"; +@import (css) "node_modules/highlight.js/styles/github.css"; // Configuration // @import "./variables.less"; From 6fa4ee8025203bd947ab68c7fe4e403480786e0c Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Mon, 16 Nov 2015 17:32:49 +1100 Subject: [PATCH 18/26] :pencil: more help entries --- src/connect/authentication.js | 4 ++-- src/electron/help.js | 1 - src/help/entries/connect-favorite-name.md | 2 +- src/help/entries/connect-kerberos-principal.md | 13 ++++++++++++- .../entries/connect-kerberos-service-name.md | 11 ++++++++++- .../connect-ssl-certificate-authority.md | 18 +++++++++++++++++- .../connect-ssl-client-certificate-key.md | 1 + .../entries/connect-ssl-client-certificate.md | 1 + .../connect-ssl-private-key-password.md | 1 + ...h-source.md => connect-userpass-auth-db.md} | 14 +++++++------- src/help/entries/dev-ampersand-tips.md | 4 +--- src/help/entries/dev-taxonomy.md | 10 +--------- src/help/entries/schema-how-sampling-works.md | 1 + src/help/entries/schema-query-bar.md | 1 + src/help/index.jade | 2 +- 15 files changed, 57 insertions(+), 27 deletions(-) rename src/help/entries/{connect-userpass-auth-source.md => connect-userpass-auth-db.md} (53%) diff --git a/src/connect/authentication.js b/src/connect/authentication.js index 9b341c0b0c7..a04ecfb8218 100644 --- a/src/connect/authentication.js +++ b/src/connect/authentication.js @@ -37,9 +37,9 @@ var MONGODB = { new InputView({ template: inputTemplate, name: 'mongodb_database_name', - label: 'Database Name', + label: 'Authentication Database', placeholder: 'admin', - helpEntry: 'connect-userpass-auth-source', + helpEntry: 'connect-userpass-auth-db', required: false }) ] diff --git a/src/electron/help.js b/src/electron/help.js index 6cb12665a39..6491b4a2f34 100644 --- a/src/electron/help.js +++ b/src/electron/help.js @@ -16,7 +16,6 @@ ipc.on('/help/entries', function(evt) { marked: { highlight: function(code) { var result = highlight.highlightAuto(code).value; - debug('result', result); return result; } } diff --git a/src/help/entries/connect-favorite-name.md b/src/help/entries/connect-favorite-name.md index e0b41663b02..e4024cbc48b 100644 --- a/src/help/entries/connect-favorite-name.md +++ b/src/help/entries/connect-favorite-name.md @@ -3,7 +3,7 @@ title: Favorite Name tags: - authentication - connect - - kerberos + - favorite --- Favorite name for a saved connection. diff --git a/src/help/entries/connect-kerberos-principal.md b/src/help/entries/connect-kerberos-principal.md index 09d6331a9c0..53299018fbc 100644 --- a/src/help/entries/connect-kerberos-principal.md +++ b/src/help/entries/connect-kerberos-principal.md @@ -4,7 +4,18 @@ tags: - authentication - connect - kerberos + - needs review related: - connect-kerberos-service-name --- -Describes what a Kerberos principal is. + + +A Kerberos principal is a unique identity to which Kerberos can assign tickets. + + +Principals can have an arbitrary number of components. Each component is +separated by a component separator, generally `/`. The last component is the +realm, separated from the rest of the principal by the realm separator, +generally `@`. + +An example for a Kerberos Principal is: `primary/instance@REALM`. diff --git a/src/help/entries/connect-kerberos-service-name.md b/src/help/entries/connect-kerberos-service-name.md index 6beb6e2ae98..7ad27925190 100644 --- a/src/help/entries/connect-kerberos-service-name.md +++ b/src/help/entries/connect-kerberos-service-name.md @@ -4,5 +4,14 @@ tags: - authentication - connect - kerberos + - needs review --- -Describes what a Kerberos Service name is. + + +A Kerberos Service Name is the name by which a client uniquely identifies an +instance of a service. + + +Typically, the service name for a MongoDB instance is named `mongodb`. Provide +another name here if your MongoDB instance was set up with a different service +name. diff --git a/src/help/entries/connect-ssl-certificate-authority.md b/src/help/entries/connect-ssl-certificate-authority.md index fe6d987af7f..764d29bf2e4 100644 --- a/src/help/entries/connect-ssl-certificate-authority.md +++ b/src/help/entries/connect-ssl-certificate-authority.md @@ -4,9 +4,25 @@ tags: - authentication - connect - ssl + - needs review related: - connect-ssl-client-certificate-key - connect-ssl-client-certificate - connect-ssl-private-key-password --- -Describes what the `Certificate Authority` field in the connect dialog does. + + +Provide certificate(s) of one or more Certificate Authorities that you trust +to validate the server's identity. + + +For production use, your MongoDB deployment should use valid certificates +generated and signed by a single certificate authority. You or your organization +can generate and maintain an independent certificate authority, or use +certificates generated by a third-party SSL vendor. + +To verify the identity of the MongoDB deployment you connect to, provide +one or more certificates of trusted Certificate Authorities. If this field +is left blank, the server's identity will not be checked which is +**not recommended** because it leaves you vulnerable to man-in-the-middle +attacks. diff --git a/src/help/entries/connect-ssl-client-certificate-key.md b/src/help/entries/connect-ssl-client-certificate-key.md index 1488ff2593e..4e5f64d92b0 100644 --- a/src/help/entries/connect-ssl-client-certificate-key.md +++ b/src/help/entries/connect-ssl-client-certificate-key.md @@ -4,6 +4,7 @@ tags: - authentication - connect - ssl + - todo related: - connect-ssl-certificate-authority - connect-ssl-client-certificate diff --git a/src/help/entries/connect-ssl-client-certificate.md b/src/help/entries/connect-ssl-client-certificate.md index 77a60bc8c56..f00bd088d96 100644 --- a/src/help/entries/connect-ssl-client-certificate.md +++ b/src/help/entries/connect-ssl-client-certificate.md @@ -4,6 +4,7 @@ tags: - authentication - connect - ssl + - todo related: - connect-ssl-certificate-authority - connect-ssl-client-certificate-key diff --git a/src/help/entries/connect-ssl-private-key-password.md b/src/help/entries/connect-ssl-private-key-password.md index 82ff980e724..aa56a7117ba 100644 --- a/src/help/entries/connect-ssl-private-key-password.md +++ b/src/help/entries/connect-ssl-private-key-password.md @@ -4,6 +4,7 @@ tags: - authentication - connect - ssl + - todo related: - connect-ssl-certificate-authority - connect-ssl-client-certificate-key diff --git a/src/help/entries/connect-userpass-auth-source.md b/src/help/entries/connect-userpass-auth-db.md similarity index 53% rename from src/help/entries/connect-userpass-auth-source.md rename to src/help/entries/connect-userpass-auth-db.md index eff008b8c34..ed235c8d87e 100644 --- a/src/help/entries/connect-userpass-auth-source.md +++ b/src/help/entries/connect-userpass-auth-db.md @@ -1,18 +1,18 @@ --- -title: Authentication Source +title: Authentication Database tags: - authentication - connect --- -This field represents the _Authentication Source_ (also called -_Authentication Database_) for User/Password authentication. +This field represents the _Authentication Database_ (also called +_Authentication Source_) for User/Password authentication. In MongoDB's authentication model, a username is scoped to a database, called -_Authentication Source_. The user’s privileges are not necessarily limited to +_Authentication Database_. The user’s privileges are not necessarily limited to this database. The user can have privileges in additional databases. +If the field is left blank, the default value `admin` is used. + For authentication methods other than User/Password authentication (like -_Kerberos_, _LDAP_, _X.509_), the Authentication Source is always set +_Kerberos_, _LDAP_, _X.509_) the _Authentication Database_ is always set to `$external` and no user input is required. - -If the field is left blank, the default value `admin` is used. diff --git a/src/help/entries/dev-ampersand-tips.md b/src/help/entries/dev-ampersand-tips.md index 354751f9119..4dca856cac1 100644 --- a/src/help/entries/dev-ampersand-tips.md +++ b/src/help/entries/dev-ampersand-tips.md @@ -10,8 +10,6 @@ devOnly: true Ampersand.js is the Model and View layer used by Compass. -## Some Tips and Tricks using Ampersand.js - ### View Hierarchy This diagram shows the view hierarchy of Compass and where the `.js` files and `.jade` templates for each view are. @@ -33,7 +31,7 @@ var ControlPanelView = require('./controlpanel'); module.exports = AmpersandView.extend({ template: require('./my-view.jade'), subviews: { - controlpanel: { // just a name, choose something + controlview: { // accessible via `self.controlview` container: '[data-hook=controlpanel-subview]', // use *-subiew hook waitFor: 'model.controls', // waits until model.controls becomes true-thy prepareView: function (el) { diff --git a/src/help/entries/dev-taxonomy.md b/src/help/entries/dev-taxonomy.md index 4b5a8c6a957..2e1a1d93e53 100644 --- a/src/help/entries/dev-taxonomy.md +++ b/src/help/entries/dev-taxonomy.md @@ -2,6 +2,7 @@ title: Compass Taxonomy tags: - taxonomy + - needs work devOnly: true --- @@ -9,15 +10,6 @@ The [docs style guide][docs-style] has a beautifully detailed and thorough taxonomy which covers most of the tech taxonomy and it is strongly recommended you spend some time reviewing it. -## mongoscope - -``` -i.fa.fa-fw.fa-scope -``` - -Consider synonymous with web admin, webmin, web ui, 28017, -"dbwebserver.cpp", etc. This is the product you're most likely working on -if your name begins with an "L" and sounds like "mucus". ## deployment diff --git a/src/help/entries/schema-how-sampling-works.md b/src/help/entries/schema-how-sampling-works.md index 6411a7cfbfd..316f3ab3ac8 100644 --- a/src/help/entries/schema-how-sampling-works.md +++ b/src/help/entries/schema-how-sampling-works.md @@ -3,4 +3,5 @@ title: How Sampling Works tags: - schema - sampling + - todo --- diff --git a/src/help/entries/schema-query-bar.md b/src/help/entries/schema-query-bar.md index 2a99e0b27df..e9cb6427ee4 100644 --- a/src/help/entries/schema-query-bar.md +++ b/src/help/entries/schema-query-bar.md @@ -4,4 +4,5 @@ tags: - schema - sampling - query + - todo --- diff --git a/src/help/index.jade b/src/help/index.jade index 875d782c12c..1c343878a27 100644 --- a/src/help/index.jade +++ b/src/help/index.jade @@ -1,5 +1,5 @@ .page.help div(data-hook='sidebar-subview') .content.with-sidebar - h2(data-hook='help-entry-title') + h1(data-hook='help-entry-title') .help-entry(data-hook='help-entry-content') From 25802c79f50bbf9dbb499618814c8199e0db76f8 Mon Sep 17 00:00:00 2001 From: Waley Date: Mon, 16 Nov 2015 19:46:29 -0500 Subject: [PATCH 19/26] INT-833 help window behaviour modifications --- src/app.js | 2 +- src/electron/menu.js | 52 ++++++++++++++------------- src/electron/window-manager.js | 66 ++++++++++++++++++++++------------ src/home/index.js | 2 -- 4 files changed, 72 insertions(+), 50 deletions(-) diff --git a/src/app.js b/src/app.js index 801f95d3a92..60577499df7 100644 --- a/src/app.js +++ b/src/app.js @@ -126,7 +126,7 @@ var Application = View.extend({ }, onHelpClicked: function(evt) { var id = $(evt.target).attr('data-hook'); - Help.open(id); + app.sendMessage('show help window', id); }, onClientReady: function() { debug('Client ready! Took %dms to become readable', diff --git a/src/electron/menu.js b/src/electron/menu.js index 2f7ca1eb907..8f4a1d7889f 100644 --- a/src/electron/menu.js +++ b/src/electron/menu.js @@ -1,13 +1,14 @@ // based off of https://github.com/atom/atom/blob/master/src/browser/application-menu.coffee // use js2.coffee to convert it to JS -var _ = require('lodash'); -var app = require('app'); var BrowserWindow = require('browser-window'); -var debug = require('debug')('electron:menu'); var Menu = require('menu'); var State = require('ampersand-state'); +var _ = require('lodash'); +var app = require('app'); +var debug = require('debug')('electron:menu'); + // submenu related function separator() { return { @@ -15,7 +16,7 @@ function separator() { }; } -function quitSubMenu(label) { +function quitSubMenuItem(label) { return { label: label, accelerator: 'CmdOrCtrl+Q', @@ -25,7 +26,7 @@ function quitSubMenu(label) { }; } -function compassOverviewSubMenu() { +function compassOverviewSubMenuItem() { return { label: 'Compass Overview', click: function() { @@ -58,7 +59,7 @@ function darwinCompassSubMenu() { selector: 'unhideAllApplications:' }, separator(), - quitSubMenu('Quit') + quitSubMenuItem('Quit') ] }; } @@ -117,7 +118,7 @@ function editSubMenu() { }; } -function nonDarwinAboutSubMenu() { +function nonDarwinAboutSubMenuItem() { return { label: 'About Compass', click: function() { @@ -128,16 +129,15 @@ function nonDarwinAboutSubMenu() { function helpSubMenu(showCompassOverview) { var subMenu = []; - if (showCompassOverview) { - subMenu.push(compassOverviewSubMenu()); + subMenu.push(helpWindowSubMenuItem()); - if (process.platform !== 'darwin') { - subMenu.push(separator()); - } + if (showCompassOverview) { + subMenu.push(compassOverviewSubMenuItem()); } if (process.platform !== 'darwin') { - subMenu.push(nonDarwinAboutSubMenu()); + subMenu.push(separator()); + subMenu.push(nonDarwinAboutSubMenuItem()); } return { @@ -146,11 +146,21 @@ function helpSubMenu(showCompassOverview) { }; } -function nonDarwinCompassSubMenu() { +function helpWindowSubMenuItem() { + return { + label: 'Help', + accelerator: 'CmdOrCtrl+H', + click: function() { + app.emit('show help window'); + } + }; +} + +function nonDarwinCompassSubMenuItem() { return { label: 'MongoDB Compass', submenu: [ - quitSubMenu('Exit') + quitSubMenuItem('Exit') ] }; } @@ -233,17 +243,14 @@ function darwinMenu(menuState) { } menu.push(windowSubMenu()); - - if (menuState.showCompassOverview) { - menu.push(helpSubMenu(menuState.showCompassOverview)); - } + menu.push(helpSubMenu(menuState.showCompassOverview)); return menu; } function nonDarwinMenu(menuState) { var menu = [ - nonDarwinCompassSubMenu() + nonDarwinCompassSubMenuItem() ]; if (menuState.showConnect) { @@ -309,11 +316,6 @@ var AppMenu = (function() { getTemplate: function(winID) { var menuState = this.windowTemplates.get(winID); - debug('WINDOW\'s ' + winID + ' Menu State'); - debug('showCompassOverview: ' + menuState.showCompassOverview); - debug('showConnect: ' + menuState.showConnect); - debug('showShare: ' + menuState.showShare); - if (process.platform === 'darwin') { return darwinMenu(menuState); } diff --git a/src/electron/window-manager.js b/src/electron/window-manager.js index 0d1fd334dc8..e7e2f351e1a 100644 --- a/src/electron/window-manager.js +++ b/src/electron/window-manager.js @@ -3,15 +3,16 @@ * [BrowserWindow](https://github.com/atom/electron/blob/master/docs/api/browser-window.md) * class */ -var path = require('path'); -var _ = require('lodash'); -var app = require('app'); var AppMenu = require('./menu'); var BrowserWindow = require('browser-window'); +var Notifier = require('node-notifier'); + +var _ = require('lodash'); +var app = require('app'); var config = require('./config'); var debug = require('debug')('scout-electron:window-manager'); var dialog = require('dialog'); -var Notifier = require('node-notifier'); +var path = require('path'); /** * When running in electron, we're in `RESOURCES/src/electron`. @@ -23,13 +24,15 @@ var RESOURCES = path.resolve(__dirname, '../../'); * created by the `build:pages` gulp task. */ var DEFAULT_URL = 'file://' + path.join(RESOURCES, 'index.html#connect'); +var HELP_URL = 'file://' + path.join(RESOURCES, 'index.html#help'); /** - * We want the Connect dialog window to be special - * and for there to ever only be one instance of it - * so we'll use scope to essentially make it a Singleton. + * We want the Connect and Help window to be special + * and for there to ever only be one instance of each of them + * so we'll use scope to essentially make each of them a Singleton. */ var connectWindow; +var helpWindow; // @todo (imlucas): Removed in setup branch as we dont need to do this anymore // as a `all-windows-closed` event has been added to the `app` event api @@ -121,20 +124,14 @@ module.exports.create = function(opts) { return _window; }; -app.on('show connect dialog', function(opts) { - if (connectWindow) { - connectWindow.focus(); - return connectWindow; - } - - opts = opts || {}; - opts = _.extend(opts || {}, { +function createWindow(opts, url) { + opts = _.extend(opts, { width: config.windows.DEFAULT_WIDTH_DIALOG, height: config.windows.DEFAULT_HEIGHT_DIALOG, - url: DEFAULT_URL + url: url }); - module.exports.create(opts); -}); + return module.exports.create(opts); +} app.on('show about dialog', function() { dialog.showMessageBox({ @@ -144,6 +141,35 @@ app.on('show about dialog', function() { }); }); +app.on('show connect dialog', function(opts) { + if (connectWindow) { + connectWindow.focus(); + return connectWindow; + } + + createWindow({}, DEFAULT_URL); +}); + +app.on('show help window', function(id) { + if (helpWindow) { + helpWindow.focus(); + if (_.isString(id)) { + var selectTopicJS = '$(\'a[href=\"/' + id + '\"]\')[0].click()'; + helpWindow.webContents.executeJavaScript(selectTopicJS, true); + } + return helpWindow; + } + + var url = HELP_URL; + if (_.isString(id)) { + url += '/' + id; + } + helpWindow = createWindow({}, url); + helpWindow.on('closed', function() { + helpWindow = null; + }); +}); + app.on('hide connect submenu', function() { AppMenu.hideConnect(); }); @@ -152,10 +178,6 @@ app.on('hide share submenu', function() { AppMenu.hideShare(); }); -app.on('show compass overview submenu', function() { - AppMenu.showCompassOverview(); -}); - app.on('show connect submenu', function() { AppMenu.showConnect(); }); diff --git a/src/home/index.js b/src/home/index.js index c461843989b..1e000b2a7fe 100644 --- a/src/home/index.js +++ b/src/home/index.js @@ -49,8 +49,6 @@ var HomeView = View.extend({ this.once('change:rendered', this.onRendered); debug('fetching instance model...'); app.instance.fetch(); - - app.sendMessage('show compass overview submenu'); app.sendMessage('show connect submenu'); }, render: function() { From 7557d7452eba5a0853b1d0b32f173bedb216b340 Mon Sep 17 00:00:00 2001 From: Waley Date: Mon, 16 Nov 2015 19:58:14 -0500 Subject: [PATCH 20/26] INT-833 help window not clicking element bug fix --- src/electron/window-manager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/electron/window-manager.js b/src/electron/window-manager.js index e7e2f351e1a..27031f0c281 100644 --- a/src/electron/window-manager.js +++ b/src/electron/window-manager.js @@ -154,8 +154,8 @@ app.on('show help window', function(id) { if (helpWindow) { helpWindow.focus(); if (_.isString(id)) { - var selectTopicJS = '$(\'a[href=\"/' + id + '\"]\')[0].click()'; - helpWindow.webContents.executeJavaScript(selectTopicJS, true); + var selectTopicJS = '$(\'a[href=\"/help/' + id + '\"]\')[0].click()'; + helpWindow.webContents.executeJavaScript(selectTopicJS); } return helpWindow; } From 6af9aad073c4334242dd17cd2671eb41bcb72fc6 Mon Sep 17 00:00:00 2001 From: Waley Date: Mon, 16 Nov 2015 20:11:53 -0500 Subject: [PATCH 21/26] INT-833 code cleanup --- src/electron/menu.js | 23 ++--------------------- src/electron/window-manager.js | 19 +++++++++---------- src/home/index.js | 1 + 3 files changed, 12 insertions(+), 31 deletions(-) diff --git a/src/electron/menu.js b/src/electron/menu.js index 8f4a1d7889f..ec00574f12f 100644 --- a/src/electron/menu.js +++ b/src/electron/menu.js @@ -231,10 +231,7 @@ function darwinMenu(menuState) { darwinCompassSubMenu() ]; - if (menuState.showConnect) { - menu.push(connectSubMenu()); - } - + menu.push(connectSubMenu()); menu.push(editSubMenu()); menu.push(viewSubMenu()); @@ -253,10 +250,7 @@ function nonDarwinMenu(menuState) { nonDarwinCompassSubMenuItem() ]; - if (menuState.showConnect) { - menu.push(connectSubMenu()); - } - + menu.push(connectSubMenu()); menu.push(viewSubMenu()); if (menuState.showShare) { @@ -274,10 +268,6 @@ var MenuState = State.extend({ type: 'boolean', default: false }, - showConnect: { - type: 'boolean', - default: true - }, showShare: { type: 'boolean', default: false @@ -354,11 +344,6 @@ var AppMenu = (function() { Menu.setApplicationMenu(menu); }, - // share/hide submenu fns - hideConnect: function(_window) { - this.updateMenu('showConnect', false, _window); - }, - hideShare: function() { this.updateMenu('showShare', false); }, @@ -367,10 +352,6 @@ var AppMenu = (function() { this.updateMenu('showCompassOverview', true); }, - showConnect: function() { - this.updateMenu('showConnect', true); - }, - showShare: function() { this.updateMenu('showShare', true); }, diff --git a/src/electron/window-manager.js b/src/electron/window-manager.js index 27031f0c281..5afe5252c16 100644 --- a/src/electron/window-manager.js +++ b/src/electron/window-manager.js @@ -102,15 +102,6 @@ module.exports.create = function(opts) { }); }); - if (opts.url === DEFAULT_URL) { // if it's the connect dialog - AppMenu.hideConnect(_window); - connectWindow = _window; - connectWindow.on('closed', function() { - debug('connect window closed.'); - connectWindow = null; - }); - } - // @see `all-windows-closed` above windowsOpenCount++; _window.on('closed', function() { @@ -147,7 +138,11 @@ app.on('show connect dialog', function(opts) { return connectWindow; } - createWindow({}, DEFAULT_URL); + connectWindow = createWindow({}, DEFAULT_URL); + connectWindow.on('closed', function() { + debug('connect window closed.'); + connectWindow = null; + }); }); app.on('show help window', function(id) { @@ -178,6 +173,10 @@ app.on('hide share submenu', function() { AppMenu.hideShare(); }); +app.on('show compass overview submenu', function() { + AppMenu.showCompassOverview(); +}); + app.on('show connect submenu', function() { AppMenu.showConnect(); }); diff --git a/src/home/index.js b/src/home/index.js index 1e000b2a7fe..43cd0a42ee6 100644 --- a/src/home/index.js +++ b/src/home/index.js @@ -49,6 +49,7 @@ var HomeView = View.extend({ this.once('change:rendered', this.onRendered); debug('fetching instance model...'); app.instance.fetch(); + app.sendMessage('show compass overview submenu'); app.sendMessage('show connect submenu'); }, render: function() { From ce99fa00f54139f6a179f9d58219f09947aa39f0 Mon Sep 17 00:00:00 2001 From: Waley Date: Mon, 16 Nov 2015 20:13:35 -0500 Subject: [PATCH 22/26] INT-833 fix nom run check --- src/app.js | 1 - src/electron/menu.js | 20 ++++++++++---------- src/electron/window-manager.js | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/app.js b/src/app.js index 60577499df7..c97ab2c72ee 100644 --- a/src/app.js +++ b/src/app.js @@ -28,7 +28,6 @@ var MongoDBInstance = require('./models/mongodb-instance'); var User = require('./models/user'); var Router = require('./router'); var Statusbar = require('./statusbar'); -var Help = require('./help'); var $ = require('jquery'); var debug = require('debug')('scout:app'); diff --git a/src/electron/menu.js b/src/electron/menu.js index ec00574f12f..6e176494d15 100644 --- a/src/electron/menu.js +++ b/src/electron/menu.js @@ -127,6 +127,16 @@ function nonDarwinAboutSubMenuItem() { }; } +function helpWindowSubMenuItem() { + return { + label: 'Help', + accelerator: 'CmdOrCtrl+H', + click: function() { + app.emit('show help window'); + } + }; +} + function helpSubMenu(showCompassOverview) { var subMenu = []; subMenu.push(helpWindowSubMenuItem()); @@ -146,16 +156,6 @@ function helpSubMenu(showCompassOverview) { }; } -function helpWindowSubMenuItem() { - return { - label: 'Help', - accelerator: 'CmdOrCtrl+H', - click: function() { - app.emit('show help window'); - } - }; -} - function nonDarwinCompassSubMenuItem() { return { label: 'MongoDB Compass', diff --git a/src/electron/window-manager.js b/src/electron/window-manager.js index 5afe5252c16..ff5b144b601 100644 --- a/src/electron/window-manager.js +++ b/src/electron/window-manager.js @@ -132,7 +132,7 @@ app.on('show about dialog', function() { }); }); -app.on('show connect dialog', function(opts) { +app.on('show connect dialog', function() { if (connectWindow) { connectWindow.focus(); return connectWindow; From 66fe8b319a53d9a7b953cd6a7b465b54d4601343 Mon Sep 17 00:00:00 2001 From: Waley Date: Mon, 16 Nov 2015 20:16:48 -0500 Subject: [PATCH 23/26] INT-833 redundant code --- src/electron/window-manager.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/electron/window-manager.js b/src/electron/window-manager.js index ff5b144b601..fca87f69a00 100644 --- a/src/electron/window-manager.js +++ b/src/electron/window-manager.js @@ -165,10 +165,6 @@ app.on('show help window', function(id) { }); }); -app.on('hide connect submenu', function() { - AppMenu.hideConnect(); -}); - app.on('hide share submenu', function() { AppMenu.hideShare(); }); @@ -177,10 +173,6 @@ app.on('show compass overview submenu', function() { AppMenu.showCompassOverview(); }); -app.on('show connect submenu', function() { - AppMenu.showConnect(); -}); - app.on('show share submenu', function() { AppMenu.showShare(); }); From 2d1bdf25b470db89d1396ba5b0b58e239efb207f Mon Sep 17 00:00:00 2001 From: Waley Date: Mon, 16 Nov 2015 22:56:34 -0500 Subject: [PATCH 24/26] INT-833 use loadURL instead of executeJS --- src/electron/window-manager.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/electron/window-manager.js b/src/electron/window-manager.js index fca87f69a00..55601ee87db 100644 --- a/src/electron/window-manager.js +++ b/src/electron/window-manager.js @@ -146,19 +146,19 @@ app.on('show connect dialog', function() { }); app.on('show help window', function(id) { + var url = HELP_URL; + if (_.isString(id)) { + url += '/' + id; + } + if (helpWindow) { helpWindow.focus(); if (_.isString(id)) { - var selectTopicJS = '$(\'a[href=\"/help/' + id + '\"]\')[0].click()'; - helpWindow.webContents.executeJavaScript(selectTopicJS); + helpWindow.webContents.loadURL(url); } - return helpWindow; + return; } - var url = HELP_URL; - if (_.isString(id)) { - url += '/' + id; - } helpWindow = createWindow({}, url); helpWindow.on('closed', function() { helpWindow = null; From 41e0481f5b38649d909cd2676a49e7b041246e83 Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Wed, 18 Nov 2015 15:27:15 +1100 Subject: [PATCH 25/26] send message instead of loadURL, much faster --- src/app.js | 10 +++++----- src/electron/window-manager.js | 18 +++++++++--------- src/help/index.js | 19 ++----------------- 3 files changed, 16 insertions(+), 31 deletions(-) diff --git a/src/app.js b/src/app.js index c97ab2c72ee..1b116635503 100644 --- a/src/app.js +++ b/src/app.js @@ -290,12 +290,12 @@ app.extend({ setFeature: function(id, bool) { FEATURES[id] = bool; }, - sendMessage: function(msg, arg1) { - ipc.send('message', msg, arg1); + sendMessage: function(msg, arg) { + ipc.send('message', msg, arg); }, - onMessageReceived: function(msg) { - debug('message received from main process:', msg); - this.trigger(msg); + onMessageReceived: function(msg, arg) { + debug('message received from main process:', msg, arg); + this.trigger(msg, arg); }, metrics: metrics, init: function() { diff --git a/src/electron/window-manager.js b/src/electron/window-manager.js index 55601ee87db..a279abf6a51 100644 --- a/src/electron/window-manager.js +++ b/src/electron/window-manager.js @@ -146,19 +146,19 @@ app.on('show connect dialog', function() { }); app.on('show help window', function(id) { - var url = HELP_URL; - if (_.isString(id)) { - url += '/' + id; - } - if (helpWindow) { helpWindow.focus(); if (_.isString(id)) { - helpWindow.webContents.loadURL(url); + helpWindow.webContents.send('message', 'show-help-entry', id); } return; } + var url = HELP_URL; + if (_.isString(id)) { + url += '/' + id; + } + helpWindow = createWindow({}, url); helpWindow.on('closed', function() { helpWindow = null; @@ -205,7 +205,7 @@ app.on('ready', function() { }); var ipc = require('ipc'); -ipc.on('message', function(event, msg, arg1) { - debug('message received in main process', msg); - app.emit(msg, arg1); +ipc.on('message', function(event, msg, arg) { + debug('message received in main process', msg, arg); + app.emit(msg, arg, event); }); diff --git a/src/help/index.js b/src/help/index.js index 13a997545f8..396b5e4cb22 100644 --- a/src/help/index.js +++ b/src/help/index.js @@ -69,6 +69,8 @@ var HelpPage = View.extend({ this.show(this.entryId); } }); + + this.listenTo(app, 'show-help-entry', this.show.bind(this)); }, show: function(entryId) { debug('show `%s`', entryId); @@ -145,21 +147,4 @@ var HelpPage = View.extend({ } }); -/** - * Convenience to open the help window if needed and show an item. - * - * @param {String} [entryId] - Optional filename to show from `./items/#{entryId}.jade`. - * - * @todo (imlucas) Add helper to `./src/electron/window-manager.js` so this works - * like connect window (singleton w/ custom dimensions). - */ -HelpPage.open = function(entryId) { - var url = format('%s?#help', window.location.origin); - if (entryId) { - url += '/' + entryId; - } - debug('Opening item `%s`', entryId); - window.open(url); -}; - module.exports = HelpPage; From 68e26b5de99fb9aebac30a7d0d948a37f6859d8b Mon Sep 17 00:00:00 2001 From: Thomas Rueckstiess Date: Wed, 18 Nov 2015 15:45:10 +1100 Subject: [PATCH 26/26] Cmd-H is already used, use F1 accelerator for help --- src/electron/menu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/electron/menu.js b/src/electron/menu.js index 6e176494d15..038a4feccad 100644 --- a/src/electron/menu.js +++ b/src/electron/menu.js @@ -129,8 +129,8 @@ function nonDarwinAboutSubMenuItem() { function helpWindowSubMenuItem() { return { - label: 'Help', - accelerator: 'CmdOrCtrl+H', + label: 'Show Compass Help', + accelerator: 'F1', click: function() { app.emit('show help window'); }