{"version":3,"file":"novo-elements-elements-category-dropdown.mjs","sources":["../../../projects/novo-elements/src/elements/category-dropdown/CategoryDropdown.ts","../../../projects/novo-elements/src/elements/category-dropdown/CategoryDropdown.module.ts","../../../projects/novo-elements/src/elements/category-dropdown/novo-elements-elements-category-dropdown.ts"],"sourcesContent":["// NG2\nimport { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { NovoLabelService } from 'novo-elements/services';\nimport { Helpers, Key, OutsideClick } from 'novo-elements/utils';\n\n@Component({\n    selector: 'novo-category-dropdown',\n    template: `\n    <ng-content select=\"button\"></ng-content>\n    <div class=\"dropdown-container\" *ngIf=\"active\">\n      <div class=\"novo-category-dropdown-search\" *ngIf=\"search\" data-automation-id=\"novo-category-dropdown-search\">\n        <input\n          type=\"text\"\n          [placeholder]=\"search.placeholder || labels.search\"\n          [value]=\"_query\"\n          (input)=\"queryCategories($event.target.value)\"\n        />\n        <i class=\"bhi-search\" *ngIf=\"!_query\"></i>\n        <i class=\"bhi-times\" *ngIf=\"_query\" (click)=\"clearQuery($event)\"></i>\n      </div>\n      <novo-nav theme=\"white\" [outlet]=\"novoCategoryDropdownOutlet\" direction=\"vertical\">\n        <novo-tab *ngFor=\"let category of _categories\" [attr.data-automation-id]=\"category\" (activeChange)=\"onCategorySelected(category)\">\n          <span>{{ category }} ({{ _categoryMap[category].length }})</span>\n        </novo-tab>\n      </novo-nav>\n      <novo-nav-outlet #novoCategoryDropdownOutlet>\n        <novo-nav-content *ngFor=\"let category of _categories\">\n          <novo-list direction=\"vertical\">\n            <novo-list-item\n              *ngFor=\"let item of _categoryMap[category]\"\n              (click)=\"select($event, item)\"\n              [attr.data-automation-id]=\"item.label\"\n            >\n              <item-content>{{ item.label }}</item-content>\n              <item-end class=\"novo-category-dropdown-hover\" *ngIf=\"item.hoverText && !item.selected\">{{ item.hoverText }}</item-end>\n              <item-end class=\"novo-category-dropdown-hover\" *ngIf=\"item.hoverIcon && !item.selected\"\n                ><i class=\"bhi-{{ item.hoverIcon }}\"></i\n              ></item-end>\n              <item-end *ngIf=\"item.selected\"><i class=\"bhi-check\"></i></item-end>\n            </novo-list-item>\n            <novo-list-item *ngIf=\"_categoryMap[category].length === 0 && search\" class=\"novo-category-dropdown-empty-item\">\n              <item-content>{{ search.emptyMessage || labels.noItems }}</item-content>\n            </novo-list-item>\n          </novo-list>\n        </novo-nav-content>\n      </novo-nav-outlet>\n      <footer *ngIf=\"footer\" class=\"novo-category-dropdown-footer-align-{{ footer.align || 'right' }}\">\n        <a *ngFor=\"let link of footer.links\" (click)=\"executeClickCallback($event, link)\">{{ link.label }}</a>\n      </footer>\n    </div>\n  `,\n    styleUrls: ['./CategoryDropdown.scss'],\n    host: {\n        '(keydown)': 'onKeyDown($event)',\n        '[class.active]': 'active',\n    },\n    standalone: false,\n})\nexport class NovoCategoryDropdownElement extends OutsideClick implements OnInit, OnDestroy {\n  _query: string = '';\n  _categoryMap: any = {};\n  _categories: string[] = [];\n  clickHandler: Function;\n  _masterCategoryMap: any;\n  _queryTimeout: any;\n  // Boolean to keep the selection persist when closing the dropdown\n  @Input()\n  persistSelection: boolean = false;\n  // Boolean to close the dropdown on selection\n  @Input()\n  closeOnSelect: boolean = false;\n  // Search Config\n  // {\n  //   placeholder: 'STRING' // defaults to \"SEARCH\" - placeholder for search input\n  //   emptyMessage: 'STRING' // defaults to \"There are no items.\" - empty message when there are no items in the category\n  //   debounce: 'NUMBER (in MS)' // defaults to 300ms - debounce time for the search\n  //   compare: 'FUNCTION' // default to simple indexOf - compare function for category search, should accept (query, item) and return true/false\n  // }\n  @Input()\n  search: any;\n  // Footer config\n  // {\n  //   align: 'STRING' // defaults to \"right\" - alignment of the links\n  //   links: 'ARRAY' // array of links to go into the footer, be away of spacing - { label, callback } for the object inside\n  // }\n  @Input()\n  footer: any;\n  // Event that is emitted whenever an item is selected\n  @Output('itemSelected')\n  _select: EventEmitter<any> = new EventEmitter();\n  // Event that is emitted whenever a category is selected\n  @Output()\n  categorySelected: EventEmitter<any> = new EventEmitter<any>();\n\n  @Input()\n  set categories(categories: any) {\n    this._masterCategoryMap = Object.assign({}, categories);\n    this._categoryMap = Object.assign({}, categories);\n    this._categories = Object.keys(categories);\n  }\n\n  constructor(element: ElementRef, public labels: NovoLabelService) {\n    super(element);\n    this.clickHandler = this.toggleActive.bind(this);\n  }\n\n  ngOnInit() {\n    const button = this.element.nativeElement.querySelector('button');\n    button.addEventListener('click', this.clickHandler);\n  }\n\n  ngOnDestroy() {\n    const button = this.element.nativeElement.querySelector('button');\n    if (button) {\n      button.removeEventListener('click', this.clickHandler);\n    }\n  }\n\n  onKeyDown(event) {\n    if (this.active && (event.key === Key.Escape || event.key === Key.Enter)) {\n      this.toggleActive();\n    }\n  }\n\n  clearSelection() {\n    this._categories.forEach((category) => {\n      this._categoryMap[category].forEach((item) => {\n        item.selected = false;\n      });\n    });\n  }\n\n  select(event, item) {\n    Helpers.swallowEvent(event);\n    // If we persist the selection, clear and show a check\n    if (this.persistSelection) {\n      this.clearSelection();\n      item.selected = true;\n    }\n    // Emit the item\n    this._select.emit(item);\n    // Close, if input is set\n    if (this.closeOnSelect) {\n      this.toggleActive();\n    }\n  }\n\n  onCategorySelected(category) {\n    this.categorySelected.emit(category);\n  }\n\n  clearQuery(event) {\n    Helpers.swallowEvent(event);\n    this._query = '';\n    // Reset the categories\n    this._categories.forEach((category) => {\n      this._categoryMap[category] = this._masterCategoryMap[category];\n    });\n  }\n\n  queryCategories(query) {\n    // Save the query\n    this._query = query;\n    // Check timeout\n    if (this._queryTimeout) {\n      clearTimeout(this._queryTimeout);\n    }\n    // Store a timeout, to debounce user input\n    this._queryTimeout = setTimeout(() => {\n      this._categories.forEach((category) => {\n        if (this.search.compare) {\n          this._categoryMap[category] = this._masterCategoryMap[category].filter((item) => this.search.compare(query, item));\n        } else {\n          this._categoryMap[category] = this._masterCategoryMap[category].filter(\n            (item) => ~item.label.toLowerCase().indexOf(query.toLowerCase()),\n          );\n        }\n      });\n    }, this.search.debounce || 300);\n  }\n\n  executeClickCallback(event, link) {\n    link.callback(event);\n    // Close, if input is set\n    if (this.closeOnSelect) {\n      this.toggleActive();\n    }\n  }\n}\n","// NG2\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { NovoListModule } from 'novo-elements/elements/list';\nimport { NovoTabModule } from 'novo-elements/elements/tabs';\n// APP\nimport { NovoCategoryDropdownElement } from './CategoryDropdown';\n\n@NgModule({\n  imports: [CommonModule, NovoTabModule, NovoListModule],\n  declarations: [NovoCategoryDropdownElement],\n  exports: [NovoCategoryDropdownElement],\n})\nexport class NovoCategoryDropdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}