Gaurav Pandey 
							
						 
					 
					
						
						
							
						
						d6cf1ef27b 
					 
					
						
						
							
							api: Fix encoding of strings in hotspot endpoint.  
						
						... 
						
						
						
						* Remove unnecessary json_validator for string parameter.
* Update frontend to pass right parameters.
Fixes part of #18035 . 
						
						
					 
					
						2021-05-07 11:45:25 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						38ffd47b90 
					 
					
						
						
							
							js: Convert static/js/page_params.js to ES6 module.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2021-03-26 10:17:56 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						3ef6f6e2e2 
					 
					
						
						
							
							js: Convert static/js/blueslip.js to ES6 module.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2021-03-17 08:47:15 -04:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						ea9ca6b7d0 
					 
					
						
						
							
							js: Use jQuery as a module.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2021-03-12 10:08:25 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						a7b2e5ba03 
					 
					
						
						
							
							js: Convert static/js/hotspots.js to ES6 module.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2021-02-28 14:23:00 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						b3f74af090 
					 
					
						
						
							
							js: Convert static/js/popovers.js to ES6 module.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2021-02-28 14:23:00 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						09920af211 
					 
					
						
						
							
							js: Convert static/js/channel.js to ES6 module.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2021-02-28 14:23:00 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						56d0d30387 
					 
					
						
						
							
							hotspots: Generate properly escaped HTML.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2021-02-05 09:26:47 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						aa650a4c88 
					 
					
						
						
							
							js: Escape strings interpolated into CSS selectors with CSS.escape.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2021-02-04 11:00:06 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						552f4e3d22 
					 
					
						
						
							
							eslint: Fix unicorn/no-array-for-each.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2021-01-25 14:53:19 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						6ec808b8df 
					 
					
						
						
							
							js: Add "use strict" directive to CommonJS files.  
						
						... 
						
						
						
						ES and TypeScript modules are strict by default and don’t need this
directive.  ESLint will remind us to add it to new CommonJS files and
remove it from ES and TypeScript modules.
Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2020-07-31 22:09:46 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						d2520cd7e0 
					 
					
						
						
							
							js: Replace underscore with lodash and remove it from globals.  
						
						... 
						
						
						
						Tweaked by tabbott to bump PROVISION_VERSION.
Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2020-07-26 16:12:06 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						96dcc0ce6e 
					 
					
						
						
							
							js: Use ES6 object literal shorthand syntax.  
						
						... 
						
						
						
						Generated by ESLint.
Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2020-07-21 12:42:22 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						b65d2e063d 
					 
					
						
						
							
							js: Reformat with Prettier.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2020-07-17 14:31:25 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						883e2fd325 
					 
					
						
						
							
							js: Remove inner spacing from object literals.  
						
						... 
						
						
						
						We’re configuring Prettier with bracketSpacing: false.  Generated by
ESLint.
Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2020-07-17 14:31:25 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						6924d501bc 
					 
					
						
						
							
							js: Indent case clauses in switch statements.  
						
						... 
						
						
						
						Prettier would do this anyway, but it’s separated out for a more
reviewable diff.  Generated by ESLint.
Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2020-07-17 14:31:25 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						f3726db89a 
					 
					
						
						
							
							js: Normalize strings to double quotes.  
						
						... 
						
						
						
						Prettier would do this anyway, but it’s separated out for a more
reviewable diff.  Generated by ESLint.
Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2020-07-17 14:31:24 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						e014ea966a 
					 
					
						
						
							
							eslint: Enable comma-dangle for functions.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2020-07-03 16:55:51 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						a79322bc94 
					 
					
						
						
							
							eslint: Enable prefer-arrow-callback.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2020-07-03 16:55:50 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						b0253c5a2e 
					 
					
						
						
							
							eslint: Enable arrow-parens.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulip.com > 
						
						
					 
					
						2020-07-03 16:53:39 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						71dd495214 
					 
					
						
						
							
							js: Convert _.pluck(a, "key") to item => item.key.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-27 17:20:34 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						ed032817c7 
					 
					
						
						
							
							hotspots: Convert HOTSPOT_LOCATIONS from object to Map.  
						
						... 
						
						
						
						Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-10 15:57:20 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						02511bff1c 
					 
					
						
						
							
							js: Automatically convert _.each to for…of.  
						
						... 
						
						
						
						This commit was automatically generated by the following script,
followed by lint --fix and a few small manual lint-related cleanups.
import * as babelParser from "recast/parsers/babel";
import * as recast from "recast";
import * as tsParser from "recast/parsers/typescript";
import { builders as b, namedTypes as n } from "ast-types";
import { Context } from "ast-types/lib/path-visitor";
import K from "ast-types/gen/kinds";
import { NodePath } from "ast-types/lib/node-path";
import assert from "assert";
import fs from "fs";
import path from "path";
import process from "process";
const checkExpression = (node: n.Node): node is K.ExpressionKind =>
  n.Expression.check(node);
const checkStatement = (node: n.Node): node is K.StatementKind =>
  n.Statement.check(node);
for (const file of process.argv.slice(2)) {
  console.log("Parsing", file);
  const ast = recast.parse(fs.readFileSync(file, { encoding: "utf8" }), {
    parser: path.extname(file) === ".ts" ? tsParser : babelParser,
  });
  let changed = false;
  let inLoop = false;
  let replaceReturn = false;
  const visitLoop = (...args: string[]) =>
    function(this: Context, path: NodePath) {
      for (const arg of args) {
        this.visit(path.get(arg));
      }
      const old = { inLoop };
      inLoop = true;
      this.visit(path.get("body"));
      inLoop = old.inLoop;
      return false;
    };
  recast.visit(ast, {
    visitDoWhileStatement: visitLoop("test"),
    visitExpressionStatement(path) {
      const { expression, comments } = path.node;
      let valueOnly;
      if (
        n.CallExpression.check(expression) &&
        n.MemberExpression.check(expression.callee) &&
        !expression.callee.computed &&
        n.Identifier.check(expression.callee.object) &&
        expression.callee.object.name === "_" &&
        n.Identifier.check(expression.callee.property) &&
        ["each", "forEach"].includes(expression.callee.property.name) &&
        [2, 3].includes(expression.arguments.length) &&
        checkExpression(expression.arguments[0]) &&
        (n.FunctionExpression.check(expression.arguments[1]) ||
          n.ArrowFunctionExpression.check(expression.arguments[1])) &&
        [1, 2].includes(expression.arguments[1].params.length) &&
        n.Identifier.check(expression.arguments[1].params[0]) &&
        ((valueOnly = expression.arguments[1].params[1] === undefined) ||
          n.Identifier.check(expression.arguments[1].params[1])) &&
        (expression.arguments[2] === undefined ||
          n.ThisExpression.check(expression.arguments[2]))
      ) {
        const old = { inLoop, replaceReturn };
        inLoop = false;
        replaceReturn = true;
        this.visit(
          path
            .get("expression")
            .get("arguments")
            .get(1)
            .get("body")
        );
        inLoop = old.inLoop;
        replaceReturn = old.replaceReturn;
        const [right, { body, params }] = expression.arguments;
        const loop = b.forOfStatement(
          b.variableDeclaration("let", [
            b.variableDeclarator(
              valueOnly ? params[0] : b.arrayPattern([params[1], params[0]])
            ),
          ]),
          valueOnly
            ? right
            : b.callExpression(
                b.memberExpression(right, b.identifier("entries")),
                []
              ),
          checkStatement(body) ? body : b.expressionStatement(body)
        );
        loop.comments = comments;
        path.replace(loop);
        changed = true;
      }
      this.traverse(path);
    },
    visitForStatement: visitLoop("init", "test", "update"),
    visitForInStatement: visitLoop("left", "right"),
    visitForOfStatement: visitLoop("left", "right"),
    visitFunction(path) {
      this.visit(path.get("params"));
      const old = { replaceReturn };
      replaceReturn = false;
      this.visit(path.get("body"));
      replaceReturn = old.replaceReturn;
      return false;
    },
    visitReturnStatement(path) {
      if (replaceReturn) {
        assert(!inLoop); // could use labeled continue if this ever fires
        const { argument, comments } = path.node;
        if (argument === null) {
          const s = b.continueStatement();
          s.comments = comments;
          path.replace(s);
        } else {
          const s = b.expressionStatement(argument);
          s.comments = comments;
          path.replace(s, b.continueStatement());
        }
        return false;
      }
      this.traverse(path);
    },
    visitWhileStatement: visitLoop("test"),
  });
  if (changed) {
    console.log("Writing", file);
    fs.writeFileSync(file, recast.print(ast).code, { encoding: "utf8" });
  }
}
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2020-02-07 14:09:47 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						28f3dfa284 
					 
					
						
						
							
							js: Automatically convert var to let and const in most files.  
						
						... 
						
						
						
						This commit was originally automatically generated using `tools/lint
--only=eslint --fix`.  It was then modified by tabbott to contain only
changes to a set of files that are unlikely to result in significant
merge conflicts with any open pull request, excluding about 20 files.
His plan is to merge the remaining changes with more precise care,
potentially involving merging parts of conflicting pull requests
before running the `eslint --fix` operation.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2019-11-03 12:42:39 -08:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						d17b577d0c 
					 
					
						
						
							
							js: Purge useless IIFEs.  
						
						... 
						
						
						
						With webpack, variables declared in each file are already file-local
(Global variables need to be explicitly exported), so these IIFEs are
no longer needed.
Signed-off-by: Anders Kaseorg <andersk@mit.edu > 
						
						
					 
					
						2019-10-25 13:51:21 -07:00 
						 
				 
			
				
					
						
							
							
								Anders Kaseorg 
							
						 
					 
					
						
						
							
						
						db0b33842c 
					 
					
						
						
							
							templates: Replace templates.render with require calls.  
						
						... 
						
						
						
						This removes an unnecessary layer of indirection and allows webpack to
catch filename mistakes.
Signed-off-by: Anders Kaseorg <anders@zulipchat.com > 
						
						
					 
					
						2019-07-12 21:11:14 -07:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						36472413e4 
					 
					
						
						
							
							hotspots: Add hotspot for gear menu.  
						
						
						
						
					 
					
						2019-02-05 12:19:21 -08:00 
						 
				 
			
				
					
						
							
							
								Armaan Ahluwalia 
							
						 
					 
					
						
						
							
						
						6d255efe4c 
					 
					
						
						
							
							app: Prepare JS files for consumption by webpack.  
						
						... 
						
						
						
						This commit prepares the frontend code to be consumed by webpack.
It is a hack: In theory, modules should be declaring and importing the
modules they depend on and the globals they expose directly.
However, that requires significant per-module work, which we don't
really want to block moving our toolchain to webpack on.
So we expose the modules by setting window.varName = varName; as
needed in the js files. 
						
						
					 
					
						2018-07-05 10:53:36 +02:00 
						 
				 
			
				
					
						
							
							
								Shubham Dhama 
							
						 
					 
					
						
						
							
						
						80a2d5bc59 
					 
					
						
						
							
							eslint: Enable conditionalAssign config of no-trailing-spaces rule.  
						
						
						
						
					 
					
						2018-06-11 07:51:24 -04:00 
						 
				 
			
				
					
						
							
							
								Shubham Dhama 
							
						 
					 
					
						
						
							
						
						dcb6254a4e 
					 
					
						
						
							
							eslint: Enable no-extra-parens rule.  
						
						... 
						
						
						
						Following sub-configuration is disabled:
                "nestedBinaryExpressions": false, 
						
						
					 
					
						2018-06-11 07:51:24 -04:00 
						 
				 
			
				
					
						
							
							
								Joshua Pan 
							
						 
					 
					
						
						
							
						
						dcee398622 
					 
					
						
						
							
							onboarding: Redesign intro_reply hotspot in bottom whitespace.  
						
						... 
						
						
						
						This is a trial to have the first reply hotspot in the bottom
whitespace (and stick there until "Got it!"  is pressed).
Tweaked by tabbott to clean it up a bit.  Still needs more work on the
visuals. 
						
						
					 
					
						2018-05-23 14:22:19 -07:00 
						 
				 
			
				
					
						
							
							
								Tim Abbott 
							
						 
					 
					
						
						
							
						
						063d11b139 
					 
					
						
						
							
							js: Standardize indentation of switch/case statements.  
						
						... 
						
						
						
						This gets my current draft eslint indentation configuration passing
cleaning on static/js. 
						
						
					 
					
						2018-05-06 19:35:18 -07:00 
						 
				 
			
				
					
						
							
							
								Tim Abbott 
							
						 
					 
					
						
						
							
						
						7ab8a8e820 
					 
					
						
						
							
							js: Fix a bunch of indentation issues found by eslint.  
						
						... 
						
						
						
						This is preparation for enabling an eslint indentation configuration.
90% of these changes are just fixes for indentation errors that have
snuck into the codebase over the years; the others are more
significant reformatting to make eslint happy (that are not otherwise
actually improvements).
The one area that we do not attempt to work on here is the
"switch/case" indentation. 
						
						
					 
					
						2018-05-06 16:25:02 -07:00 
						 
				 
			
				
					
						
							
							
								Shubham Dhama 
							
						 
					 
					
						
						
							
						
						b34b8cdb97 
					 
					
						
						
							
							hotspots: Fix real-time sync for dismissing hotspots.  
						
						... 
						
						
						
						This closes all the hotspots which aren't included in the event.hotspots.
This means we treat all the hotspots in event.hotspots as the hotspot
which need to be shown.
Fixes : #8690 . 
						
						
					 
					
						2018-03-18 10:22:09 -07:00 
						 
				 
			
				
					
						
							
							
								Shubham Dhama 
							
						 
					 
					
						
						
							
						
						120ebc8f13 
					 
					
						
						
							
							hotspots: Move the code for closing hotspot icon to hotspots.js.  
						
						
						
						
					 
					
						2018-03-18 10:22:09 -07:00 
						 
				 
			
				
					
						
							
							
								Shubham Padia 
							
						 
					 
					
						
						
							
						
						8722c755e3 
					 
					
						
						
							
							onboarding: Add bouncing ? next to hotspots.  
						
						... 
						
						
						
						Fixes  #8124 .
Adds bouncing question mark with twice the frequency of the
pulse. 
					
						2018-03-01 20:23:51 -08:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						ac48772732 
					 
					
						
						
							
							hotspots.js: Fix timeout millisecond conversion.  
						
						
						
						
					 
					
						2017-09-15 04:14:52 -07:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						a8deedbbb6 
					 
					
						
						
							
							hotspots: Replace stream_settings with intro_streams and intro_topics.  
						
						
						
						
					 
					
						2017-09-15 04:14:52 -07:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						0677bd2a6d 
					 
					
						
						
							
							hotspots: Rename and update new_topic_button.  
						
						
						
						
					 
					
						2017-09-15 04:14:52 -07:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						4a383544af 
					 
					
						
						
							
							hotspots: Rename and update click_to_reply.  
						
						
						
						
					 
					
						2017-09-15 04:14:52 -07:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						c985791773 
					 
					
						
						
							
							hotspots.js: Inline map_hotspots_to_DOM.  
						
						... 
						
						
						
						The function is confusing and added unnecessary complexity, given that it is
only called in one place, and is not a function that should be exposed to
other modules. 
						
						
					 
					
						2017-09-15 04:14:52 -07:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						546384ce30 
					 
					
						
						
							
							hotspots.js: Refactor place_icon for clarity.  
						
						
						
						
					 
					
						2017-09-15 04:14:52 -07:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						91819fa694 
					 
					
						
						
							
							hotspots.js: Give names to long selectors in place_icon.  
						
						
						
						
					 
					
						2017-09-15 04:14:52 -07:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						9f7b310a3e 
					 
					
						
						
							
							hotspots.js: Do not place_popover if icon is not visible.  
						
						... 
						
						
						
						Attempting to do so throws an exception if hotspot.location.element can't be
found. 
						
						
					 
					
						2017-09-15 04:14:52 -07:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						836a2c502e 
					 
					
						
						
							
							hotspots.js: Clean up icon positioning code.  
						
						... 
						
						
						
						Also will allow more fine-grained positioning. 
						
						
					 
					
						2017-09-15 04:14:52 -07:00 
						 
				 
			
				
					
						
							
							
								Rishi Gupta 
							
						 
					 
					
						
						
							
						
						09b4927578 
					 
					
						
						
							
							hotspots.js: Fix hotspots not appearing.  
						
						... 
						
						
						
						The original had two bugs in this line of code that cancelled each other
out. 4d0f304 
						
						
					 
					
						2017-08-29 14:08:45 -07:00 
						 
				 
			
				
					
						
							
							
								Harshit Bansal 
							
						 
					 
					
						
						
							
						
						cd2f41dbb1 
					 
					
						
						
							
							popovers: Extend the compute_placement() function.  
						
						... 
						
						
						
						This commit extends the `compute_placement()` function in
`popovers.js` to take into account height/width of popover as well as
positioning preference. If vertical positioning is desired and the
popover fits in either 'top/bottom' positions then we don't check for
`left/right' positions. Earlier the behavior was to prefer
'left/right'positions over 'top/bottom' positions, which resulted in
the emoji picker popping incorrectly to the left. 
						
						
					 
					
						2017-08-27 12:27:53 -07:00 
						 
				 
			
				
					
						
							
							
								Max Schaefer 
							
						 
					 
					
						
						
							
						
						4d0f304048 
					 
					
						
						
							
							js: Fix two misphrased conditions.  
						
						
						
						
					 
					
						2017-08-22 09:37:15 -07:00 
						 
				 
			
				
					
						
							
							
								Jack Zhang 
							
						 
					 
					
						
						
							
						
						c69b5d7d65 
					 
					
						
						
							
							hotkey: Add support for hotspots on enter.  
						
						
						
						
					 
					
						2017-08-05 18:32:37 -07:00 
						 
				 
			
				
					
						
							
							
								Jack Zhang 
							
						 
					 
					
						
						
							
						
						1e40665e51 
					 
					
						
						
							
							hotspots: Debounce hotspot placement on UI updates by 10ms.  
						
						... 
						
						
						
						A small delay to ensure that the event (i.e. a click) has completed
and the UI has updated before hotspot icon and popover placement
is recomputed. 
						
						
					 
					
						2017-08-05 18:32:37 -07:00