{
  "file": "addon/routes/base-route.js",
  "content": "<pre class=\"language-javascript line-numbers\"><code class=\"language-javascript}\"><span aria-hidden=\"true\" role=\"presentation\" class=\"line-numbers-rows\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span><span class=\"token keyword\">import</span> Route <span class=\"token keyword\">from</span> <span class=\"token string\">'ember-route'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> inject <span class=\"token keyword\">from</span> <span class=\"token string\">'ember-service/inject'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> scheduleOnce <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'ember-runloop'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> $ <span class=\"token keyword\">from</span> <span class=\"token string\">'jquery'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\" spellcheck=\"true\">/**\n * The Fountainhead base route class contains handlers for targeted scrolling\n * including {{c-l 'resetController'}} (to clear sticky parameters),\n * {{c-l 'crossLinkFragmentOverride'}} (for History consumers using a cross link),\n * and {{c-l 'didTransition'}} (to update application hash tracker).\n * @class BaseRoute\n * @constructor\n * @extends Ember.Route\n */</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Route<span class=\"token punctuation\">.</span><span class=\"token function\">extend</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  fountainhead<span class=\"token punctuation\">:</span> <span class=\"token function\">inject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Properties</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Required for History consumers when cross linking to a different class _(Ember\n   * strips hash from the {{c-l class='FHHref'}} component)_. When a cross link with\n   * a property is clicked, the cross link will set this property to notify the route\n   * that there is a fragment that should be observed on transition.\n   * @property crossLinkFragmentOverride\n   * @type {?string}\n   * @protected\n   * @default null\n   */</span>\n  crossLinkFragmentOverride<span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Hooks</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * We don't want the `id` query param to be sticky. If it is, then if you\n   * have an `id` scroll target for a class, navigate elsewhere and then click that\n   * class again in the `api-nav`, the sticky query param will set the `id` to the\n   * previous scroll target, 😣.\n   *\n   * The `resetController` hook is called anytime a route's model changes or the\n   * route is exited, and is the recommended time to reset query param values on\n   * a controller.\n   * @method resetController\n   * @param {Object}  controller\n   * @param {Boolean} isExiting\n   * @param {Object}  transition\n   */</span>\n  <span class=\"token function\">resetController</span><span class=\"token punctuation\">(</span>controller<span class=\"token punctuation\">,</span> isExiting<span class=\"token punctuation\">,</span> transition<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    controller<span class=\"token punctuation\">.</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'id'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Actions</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  actions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\" spellcheck=\"true\">/**\n     * On transition, handle resetting scroll position as well as updating\n     * {{c-l class='Fountainhead'}} service that a transition has occurred so that\n     * the new location can be checked for a scroll target hash.\n     * @event didTransition\n     */</span>\n    <span class=\"token function\">didTransition</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">const</span> crossLinkFragmentOverride <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'crossLinkFragmentOverride'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\" spellcheck=\"true\">// For all transitions, first scroll back to top, this handles when a user scrolls</span>\n      <span class=\"token comment\" spellcheck=\"true\">// down th page and then transitions without making any hash changes. If the url</span>\n      <span class=\"token comment\" spellcheck=\"true\">// includes a scroll target it will be passed to a page component and trigger a</span>\n      <span class=\"token comment\" spellcheck=\"true\">// scroll event</span>\n      <span class=\"token function\">$</span><span class=\"token punctuation\">(</span><span class=\"token string\">'.fh-page-in-page-wrapper'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">scrollTop</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token keyword\">const</span> sendFragment <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fountainhead'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">send</span><span class=\"token punctuation\">(</span><span class=\"token string\">'setFragmentId'</span><span class=\"token punctuation\">,</span> location<span class=\"token punctuation\">.</span>hash<span class=\"token punctuation\">.</span><span class=\"token function\">slice</span><span class=\"token punctuation\">(</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">||</span> <span class=\"token string\">''</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token keyword\">const</span> overrideHash <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n        history<span class=\"token punctuation\">.</span><span class=\"token function\">replaceState</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token template-string\"><span class=\"token string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>location<span class=\"token punctuation\">.</span>href<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">#</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>crossLinkFragmentOverride<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token function\">sendFragment</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>crossLinkFragmentOverride<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\" spellcheck=\"true\">// A cross link was used with a scroll target hash. Ember will strip this</span>\n        <span class=\"token comment\" spellcheck=\"true\">// target from the URL. After render, handle overriding hash back to the</span>\n        <span class=\"token comment\" spellcheck=\"true\">// original target</span>\n        <span class=\"token function\">scheduleOnce</span><span class=\"token punctuation\">(</span><span class=\"token string\">'render'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> overrideHash<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token comment\" spellcheck=\"true\">// Clear out override now that it has been handled</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'crossLinkFragmentOverride'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\" spellcheck=\"true\">// hashChange event does not fire on transitions, after render the URL will</span>\n        <span class=\"token comment\" spellcheck=\"true\">// be updated to new location. Send update to Fountainhead service notifying</span>\n        <span class=\"token comment\" spellcheck=\"true\">// change event</span>\n        <span class=\"token function\">scheduleOnce</span><span class=\"token punctuation\">(</span><span class=\"token string\">'render'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">,</span> sendFragment<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code></pre>"
}