|
1 | 1 | var View = require('ampersand-view');
|
2 | 2 | var State = require('ampersand-state');
|
3 | 3 |
|
| 4 | +var $ = require('jquery'); |
4 | 5 | var _ = require('lodash');
|
5 | 6 | var app = require('ampersand-app');
|
6 | 7 | var ExplainPlanModel = require('mongodb-explain-plan-model');
|
7 | 8 | var DocumentView = require('../documents/document-list-item');
|
8 | 9 | var IndexDefinitionView = require('../indexes/index-definition');
|
9 | 10 | var TreeView = require('./tree-view');
|
10 | 11 | var StageModel = require('./stage-model');
|
| 12 | +var metrics = require('mongodb-js-metrics')(); |
11 | 13 |
|
12 | 14 | var electron = require('electron');
|
13 | 15 | var shell = electron.shell;
|
@@ -35,6 +37,11 @@ module.exports = View.extend({
|
35 | 37 | required: true,
|
36 | 38 | default: false
|
37 | 39 | },
|
| 40 | + showExplainTree: { |
| 41 | + type: 'boolean', |
| 42 | + required: true, |
| 43 | + default: false |
| 44 | + }, |
38 | 45 | // refine bar for explain view
|
39 | 46 | hasRefineBar: ['boolean', true, true],
|
40 | 47 | activeDetailView: {
|
@@ -77,6 +84,13 @@ module.exports = View.extend({
|
77 | 84 | return 'INDEX';
|
78 | 85 | }
|
79 | 86 | },
|
| 87 | + treasureHuntClueVisible: { |
| 88 | + deps: ['indexMessageType'], |
| 89 | + fn: function() { |
| 90 | + return (app.isFeatureEnabled('treasureHunt') && |
| 91 | + this.indexMessageType === 'INDEX'); |
| 92 | + } |
| 93 | + }, |
80 | 94 | showWarningTriangle: {
|
81 | 95 | deps: ['indexMessageType'],
|
82 | 96 | fn: function() {
|
@@ -133,9 +147,17 @@ module.exports = View.extend({
|
133 | 147 | 'click i.link': 'linkIconClicked'
|
134 | 148 | },
|
135 | 149 | bindings: {
|
| 150 | + treasureHuntClueVisible: { |
| 151 | + type: 'toggle', |
| 152 | + hook: 'treasure-hunt-subview' |
| 153 | + }, |
136 | 154 | ns: {
|
137 | 155 | hook: 'ns'
|
138 | 156 | },
|
| 157 | + showExplainTree: { |
| 158 | + type: 'toggle', |
| 159 | + hook: 'tree-button' |
| 160 | + }, |
139 | 161 | visible: {
|
140 | 162 | type: 'booleanClass',
|
141 | 163 | no: 'hidden'
|
@@ -218,6 +240,27 @@ module.exports = View.extend({
|
218 | 240 | this.listenTo(this.model, 'sync', this.onModelSynced.bind(this));
|
219 | 241 | this.listenTo(this.parent, 'submit:query', this.onQueryChanged.bind(this));
|
220 | 242 | this.on('change:visible', this.onVisibleChanged.bind(this));
|
| 243 | + this.showExplainTree = app.isFeatureEnabled('showExplainPlanTab'); |
| 244 | + }, |
| 245 | + // entire render method just for treasure hunt, remove afterwards |
| 246 | + render: function() { |
| 247 | + this.renderWithTemplate(this); |
| 248 | + if (app.isFeatureEnabled('treasureHunt')) { |
| 249 | + var $main = $(this.query('.main')); |
| 250 | + var view = this; |
| 251 | + // check if user has scrolled to the bottom of the explain tree |
| 252 | + $main.on('scroll', function() { |
| 253 | + var scrolledToBottom = ($main.scrollTop() + $main.innerHeight() >= $main[0].scrollHeight - 20); |
| 254 | + if (view.indexMessageType === 'INDEX' && |
| 255 | + scrolledToBottom && |
| 256 | + view.activeDetailView === 'tree') { |
| 257 | + $main.off('scroll'); |
| 258 | + debug('found the location!'); |
| 259 | + // user looked at the bottom of an indexed tree explain plan |
| 260 | + metrics.track('Treasure Hunt', 'stage6'); |
| 261 | + } |
| 262 | + }); |
| 263 | + } |
221 | 264 | },
|
222 | 265 | onModelSynced: function() {
|
223 | 266 | this.ns = this.model._id;
|
|
0 commit comments