All files / coral-component-panelstack/src/scripts Panel.js

100% Statements 33/33
100% Branches 10/10
100% Functions 10/10
100% Lines 33/33

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123                                          2x                 2x 2x   2x           800x   800x   800x     800x                 2x         702x   702x   702x 562x       702x   702x 562x 752x         702x         248x     702x       702x                                 376x     422x   422x 86x     336x   336x   336x 336x 336x
/**
 * Copyright 2019 Adobe. All rights reserved.
 * This file is licensed to you under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License. You may obtain a copy
 * of the License at http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software distributed under
 * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
 * OF ANY KIND, either express or implied. See the License for the specific language
 * governing permissions and limitations under the License.
 */
 
import {BaseComponent} from '../../../coral-base-component';
import {transform} from '../../../coral-utils';
import {Decorator} from '../../../coral-decorator';
 
const CLASSNAME = '_coral-Panel';
 
/**
 @class Coral.Panel
 @classdesc A Panel component
 @htmltag coral-panel
 @extends {HTMLElement}
 @extends {BaseComponent}
 */
const Panel = Decorator(class extends BaseComponent(HTMLElement) {
  /** @ignore */
  constructor() {
    super();
 
    // Templates
    this._elements = {
      content: this.querySelector('coral-panel-content') || document.createElement('coral-panel-content')
    };
  }
 
  /**
   The content of the panel.
 
   @type {PanelContent}
   @contentzone
   */
  get content() {
    return this._getContentZone(this._elements.content);
  }
 
  set content(value) {
    this._setContentZone('content', value, {
      handle: 'content',
      tagName: 'coral-panel-content',
      insert: function (content) {
        this.appendChild(content);
      }
    });
  }
 
  /**
   Whether the item is selected. When true, the item will appear as the active element in the PanelStack. The item
   must be a child of a PanelStack before this property is set to true. This property cannot be programmatically set
   to false.
 
   @type {Boolean}
   @default false
   @htmlattribute selected
   @htmlattributereflected
   */
  get selected() {
    return this._selected || false;
  }
 
  set selected(value) {
    let _selected = transform.booleanAttr(value);
 
    if(this._selected === _selected) {
      return;
    }
 
    this._selected = _selected;
    this._reflectAttribute('selected', this._selected);
 
    this.classList.toggle('is-selected', this._selected);
    this.setAttribute('aria-hidden', !this.selected);
 
    this.trigger('coral-panel:_selectedchanged');
  }
 
  get _contentZones() {
    return {'coral-panel-content': 'content'};
  }
 
  /** @ignore */
  static get observedAttributes() {
    return super.observedAttributes.concat(['selected']);
  }
 
  /** @ignore */
  render() {
    super.render();
 
    this.classList.add(CLASSNAME);
 
    // Adds the role to support accessibility when role is not already defined.
    if (!this.hasAttribute('role')) {
      this.setAttribute('role', 'region');
    }
 
    // Fetch the content zone elements
    const content = this._elements.content;
 
    // Move the content into the content zone if none specified
    if (!content.parentNode) {
      while (this.firstChild) {
        content.appendChild(this.firstChild);
      }
    }
 
    // Assign the content zone so the insert function will be called
    this.content = content;
  }
});
 
export default Panel;