UNPKG

novo-elements

Version:

1 lines 14.2 kB
{"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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"}