{
  "file": "addon/components/fountainhead-class/items-container.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><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><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> Component <span class=\"token keyword\">from</span> <span class=\"token string\">'ember-component'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> hbs <span class=\"token keyword\">from</span> <span class=\"token string\">'htmlbars-inline-precompile'</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\n<span class=\"token comment\" spellcheck=\"true\">/**\n * Tab container for the class' documentation items. Component handles running\n * a controlled instance of `fountainhead-tabs` by tracking `activeTab`\n * internally and passing `tabChanged` to the `fountainhead-tabs` instance.\n *\n * The active tab is reset to the index panel anytime that the `name` (of the\n * class) changes.\n *\n * @class FountainheadClass.ItemsContainer\n * @constructor\n * @extends Ember.Component\n */</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> Component<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\">// Passed Properties</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Array of *ALL* items for this class. Used to find the type when an item is\n   * specified in a query param.\n   * @property classitems\n   * @type {Array}\n   * @default []\n   */</span>\n  classitems<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * This class' array of event documentation items.\n   * @property event\n   * @type {Array}\n   * @default []\n   * @passed\n   */</span>\n  event<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Route scroll target passed in to allow automatic scrolling in\n   * {{c-l 'didReceiveAttrs'}} hook.\n   * @property fragmentId\n   * @passed\n   * @type {?string}\n   * @default null\n   */</span>\n  fragmentId<span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * This class' array of method documentation items.\n   * @property method\n   * @type {Array}\n   * @default []\n   * @passed\n   */</span>\n  method<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Name of the class. Is checked in `didReceiveAttrs` to know if the tabs\n   * should be reset to the index panel\n   * @property name\n   * @type {string}\n   * @passed\n   */</span>\n  name<span class=\"token punctuation\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * This class' array of property documentation items.\n   * @property property\n   * @type {Array}\n   * @default []\n   * @passed\n   */</span>\n  property<span class=\"token punctuation\">:</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   * The currently active tab. This is controlled by this component to allow\n   * us to change the tab whenever a documentation item is clicked in the index\n   * panel.\n   * @property activeTab\n   * @type {string}\n   * @protected\n   * @default indexPanel\n   */</span>\n  activeTab<span class=\"token punctuation\">:</span> <span class=\"token string\">'indexPanel'</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * @property classNames\n   * @type {Array}\n   * @default ['fh-tabs-container']\n   */</span>\n  classNames<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'fh-tabs-container'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * The panel that that the tabs should render on creation. The tabs component\n   * tracks this separately and it needs to be updated separately when a class\n   * page is loaded with an item query parameter.\n   * @property defaultTab\n   * @type {string}\n   * @default 'indexPanel'\n   */</span>\n  defaultTab<span class=\"token punctuation\">:</span> <span class=\"token string\">'indexPanel'</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Methods</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Handles finding the classitem model using the `item` query param value.\n   * If a classitem is found, initiate a scroll.\n   * @method _selectTabForProperty\n   * @protected\n   * @param {!string} id The id identifying which property to scroll to\n   */</span>\n  <span class=\"token function\">_selectTabForProperty</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\" spellcheck=\"true\">// Find specific classitem data in complete classitems array</span>\n    <span class=\"token keyword\">let</span> targetItem <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\">'classitems'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>classitem <span class=\"token operator\">=</span><span class=\"token operator\">></span> classitem<span class=\"token punctuation\">.</span>name <span class=\"token operator\">===</span> id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\" spellcheck=\"true\">// Only attempt to scroll to item if we found it</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>targetItem<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      targetItem <span class=\"token operator\">=</span> targetItem<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\" spellcheck=\"true\">/*\n       * This is only required on the first load of the tabs, but there isn't\n       * an easy way to track that and it's ok to set it every time b/c the tabs\n       * only uses it in the `init` hook. Setting this ensures that the first\n       * time the tabs renders the passed `defaultTab` matches the passed\n       * `activeTab`. If these don't match the first render of the tabs is blank.\n       */</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\">'defaultTab'</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>targetItem<span class=\"token punctuation\">.</span>itemtype<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">Panel`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\" spellcheck=\"true\">// Change to the selected tab using the itemtype</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\">'activeTab'</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>targetItem<span class=\"token punctuation\">.</span>itemtype<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">Panel`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</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   * When component attributes change, either the backing data or the scroll target\n   * has changed. Use {{c-l 'fragmentId'}} to reset tabs to index panel if there\n   * is no scroll target, or select the correct tab for a scroll target.\n   * @event didReceiveAttrs\n   */</span>\n  <span class=\"token function\">didReceiveAttrs</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">const</span> fragmentId <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\">'fragmentId'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>fragmentId<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</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\">'defaultTab'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'indexPanel'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</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\">'activeTab'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'indexPanel'</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 keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">_selectTabForProperty</span><span class=\"token punctuation\">(</span>fragmentId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <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     * Closure action passed to {{c-l class='FountainheadClass.PropertyLink'}} instances\n     * so that the tab for the property can be selected when a property is clicked\n     * before the selection bubbles up and the browser attempts to find the matching\n     * id for the property.\n     * @method selectTabForProperty\n     * @param {string} id Id of the property matches the name of the property\n     */</span>\n    <span class=\"token function\">selectTabForProperty</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">_selectTabForProperty</span><span class=\"token punctuation\">(</span>id<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token comment\" spellcheck=\"true\">/**\n     * Closure action passed into the tab component. This action is called\n     * whenever a tab is clicked with the id of the tab. Use this to update the\n     * controlling `activeTab` property for the tabs DDAU style.\n     * @method tabChanged\n     * @action\n     * @param {Object} tab           Backing object for a given tab\n     * @param {string} tab.elementId The id of the tab, controls current tab displayed\n     */</span>\n    <span class=\"token function\">tabChanged</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> elementId <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</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\">'activeTab'</span><span class=\"token punctuation\">,</span> elementId<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Layout</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  layout<span class=\"token punctuation\">:</span> hbs<span class=\"token template-string\"><span class=\"token string\">`\n    {{#fountainhead-tabs\n      defaultTab=defaultTab\n      activeId=activeTab\n      onChange=(action 'tabChanged')\n      as |components|}}\n      {{! --------------------------------------------------------------------- }}\n      {{! Index Tab - Links to Items\n      {{! --------------------------------------------------------------------- }}\n      {{#components.content label='Index' elementId='indexPanel'}}\n        {{! TODO: Refactor this to a loop over method, props and events to cut out duplicated template code }}\n        {{#if method.length}}\n          &lt;h4 class='fh-docs-category uppercase'>Methods&lt;/h4>\n          &lt;ul class='fh-index-list'>\n            {{#each method as |method|}}\n              &lt;li class='fh-index-item'>\n                {{fountainhead-class/property-link\n                  fragmentId=method.name\n                  selectTabForProperty=(action 'selectTabForProperty')}}\n              &lt;/li>\n            {{/each}}\n          &lt;/ul>\n        {{/if}}\n\n        {{#if property.length}}\n          &lt;h4 class='fh-docs-category uppercase'>Properties&lt;/h4>\n          &lt;ul class='fh-index-list'>\n            {{#each property as |property|}}\n              &lt;li class='fh-index-item'>\n                {{fountainhead-class/property-link\n                  fragmentId=property.name\n                  selectTabForProperty=(action 'selectTabForProperty')}}\n              &lt;/li>\n            {{/each}}\n          &lt;/ul>\n        {{/if}}\n\n        {{#if event.length}}\n          &lt;h4 class='fh-docs-category uppercase'>Events&lt;/h4>\n          &lt;ul class='fh-index-list'>\n            {{#each event as |event|}}\n              &lt;li class='fh-index-item'>\n                {{fountainhead-class/property-link\n                  fragmentId=event.name\n                  selectTabForProperty=(action 'selectTabForProperty')}}\n              &lt;/li>\n            {{/each}}\n          &lt;/ul>\n        {{/if}}\n      {{/components.content}}\n\n      {{! --------------------------------------------------------------------- }}\n      {{! Method/Property/Event Panels\n      {{! --------------------------------------------------------------------- }}\n      {{#components.content label='Methods' hidden=(eq method.length 0) elementId='methodPanel'}}\n        {{#each method as |method|}}\n          {{fountainhead-class/item\n            classItem=method}}\n        {{/each}}\n      {{/components.content}}\n      {{#components.content label='Properties' hidden=(eq property.length 0) elementId='propertyPanel'}}\n        {{#each property as |property|}}\n          {{fountainhead-class/item\n            classItem=property}}\n        {{/each}}\n      {{/components.content}}\n      {{#components.content label='Events' hidden=(eq event.length 0) elementId='eventPanel'}}\n        {{#each event as |event|}}\n          {{fountainhead-class/item\n            classItem=event}}\n        {{/each}}\n      {{/components.content}}\n    {{/fountainhead-tabs}}\n  `</span></span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n</code></pre>"
}