Skip to content
Snippets Groups Projects
hy-general-list.tsx 2.73 KiB
Newer Older
druid's avatar
druid committed
export interface ListItemValue {
  description: string;
druid's avatar
druid committed
  id: string;
  imageAlt: string;
  imageUrl: string;
druid's avatar
druid committed
  label: string;
Tuukka Turu's avatar
Tuukka Turu committed
  subLabel: string;
  date: string;
  tag: string;
druid's avatar
druid committed
  title: string;
  type: string;
druid's avatar
druid committed
  url: string;
Tuukka Turu's avatar
Tuukka Turu committed
  target: boolean;
druid's avatar
druid committed
}

Ekaterina Kondareva's avatar
Ekaterina Kondareva committed
import {Component, Element, h, Prop, State, Watch, Host} from '@stencil/core';
Tuukka Turu's avatar
Tuukka Turu committed
import {GeneralListTypes} from '../../utils/utils';
druid's avatar
druid committed

@Component({
  tag: 'hy-general-list',
  styleUrl: 'hy-general-list.scss',
  shadow: true,
})
export class HyGeneralList {
Tuukka Turu's avatar
Tuukka Turu committed
  @Prop() type: GeneralListTypes = GeneralListTypes.list;
  @Prop() blank: boolean = true;
druid's avatar
druid committed
  @Prop() dataItems: ListItemValue[] | string;
Ekaterina Kondareva's avatar
Ekaterina Kondareva committed
  @Prop() truncateDescription: boolean = true;
  @Prop() truncateLimit: number = 140;
druid's avatar
druid committed
  private _dataItems: ListItemValue[];
druid's avatar
druid committed
  @Element() el: HTMLElement;
Ekaterina Kondareva's avatar
Ekaterina Kondareva committed
  @State() hasSidebar: boolean = false;
druid's avatar
druid committed

  @Watch('dataItems')
  arrayDataWatcher(newValue: ListItemValue[] | string) {
    if (typeof newValue === 'string') {
      this._dataItems = JSON.parse(newValue);
    } else {
      this._dataItems = newValue;
    }
  }

  componentWillLoad() {
    this.arrayDataWatcher(this.dataItems);
Ekaterina Kondareva's avatar
Ekaterina Kondareva committed

    const hyMainDiv = this.el.closest('.hy-main');
    if (hyMainDiv) {
      if (hyMainDiv.classList.contains('with-sidebar')) {
        this.hasSidebar = true;
      }
    }
druid's avatar
druid committed
  }

  render() {
Ekaterina Kondareva's avatar
Ekaterina Kondareva committed
    const classAttributes = [
      'hy-general-list',
      this.hasSidebar ? 'hy-general-list--with-sidebar' : '',
      `hy-general-list--style-${this.type}`,
    ].join(' ');
druid's avatar
druid committed

Tuukka Turu's avatar
Tuukka Turu committed
    let listData = this._dataItems;
    if (typeof this._dataItems === 'object') {
      listData = Object.values(this._dataItems);
    }
Ekaterina Kondareva's avatar
Ekaterina Kondareva committed

    function truncate(str, n) {
      return str.length > n ? str.substr(0, n - 1) + '...' : str;
    }

    return (
Ekaterina Kondareva's avatar
Ekaterina Kondareva committed
      <Host>
        <ul class={classAttributes}>
          {listData &&
            listData.map((item) => (
              <li>
                <hy-general-list-item
                  has-sidebar={this.hasSidebar}
                  target={this.blank}
                  data-location={item.url}
                  description={
                    this.truncateDescription ? truncate(item.description, this.truncateLimit) : item.description
                  }
                  id={item.id}
                  imageAlt={item.imageAlt}
                  imageUrl={item.imageUrl}
                  item-title={item.title}
                  label={item.label}
                  sub-label={item.subLabel}
                  tag={item.tag}
                  date={item.date}
                  type={item.type}
                  url={item.url}
                  list-style={this.type}
                ></hy-general-list-item>
              </li>
            ))}
        </ul>
        <hy-box mb="1.75, 1.75, 2, 2.5" />
      </Host>
druid's avatar
druid committed
  }
}