UNPKG

@ng-prime-extensions/px-searchable-accordion

Version:
1 lines 18.2 kB
{"version":3,"file":"ng-prime-extensions-px-searchable-accordion.mjs","sources":["../../../projects/px-searchable-accordion/src/lib/px-searchable-accordion.component.ts","../../../projects/px-searchable-accordion/src/lib/px-searchable-accordion.component.html","../../../projects/px-searchable-accordion/src/public-api.ts","../../../projects/px-searchable-accordion/src/ng-prime-extensions-px-searchable-accordion.ts"],"sourcesContent":["import {\n AfterViewInit, ChangeDetectorRef,\n Component, Inject,\n Input,\n OnChanges,\n OnDestroy,\n SimpleChanges,\n TemplateRef,\n ViewEncapsulation,\n DOCUMENT\n} from '@angular/core';\nimport {Accordion, AccordionContent, AccordionHeader, AccordionPanel} from \"primeng/accordion\";\nimport {PxSearchableAccordionEntry} from \"./px-searchable-accordion\";\nimport {AsyncPipe, NgTemplateOutlet} from \"@angular/common\";\nimport {BehaviorSubject, debounceTime, Observable, Subject, Subscription} from \"rxjs\";\nimport {ActivatedRoute, Router} from \"@angular/router\";\n\n@Component({\n selector: 'px-searchable-accordion',\n imports: [\n Accordion,\n AsyncPipe,\n NgTemplateOutlet,\n AccordionPanel,\n AccordionHeader,\n AccordionContent\n ],\n templateUrl: './px-searchable-accordion.component.html',\n styleUrl: './px-searchable-accordion.component.scss',\n encapsulation: ViewEncapsulation.None\n})\nexport class PxSearchableAccordionComponent implements OnChanges, AfterViewInit, OnDestroy {\n /**\n * Accordion entries to be rendered.\n */\n @Input({required: true}) entries!: PxSearchableAccordionEntry[];\n /**\n * A search string or an observable that emits the search string.\n */\n @Input({required: true}) searchString!: string | Observable<string> | Subject<string> | BehaviorSubject<string>;\n /**\n * Template to render the header with.\n */\n @Input() headerTemplate?: TemplateRef<any>;\n /**\n * Template to render the content with.\n */\n @Input() contentTemplate?: TemplateRef<any>;\n /**\n * Template to render the no results message.\n */\n @Input() noResultsTemplate?: TemplateRef<any>;\n /**\n * Search delay time in milliseconds.\n */\n @Input() searchDebounceTime = 250;\n /**\n * Weather searched words will be highlighted.\n */\n @Input() highlightWords: boolean = true;\n /**\n * The css class applied to the highlighted words.\n */\n @Input() highlightClass: string = 'px-searchable-accordion-highlight';\n /**\n * If true, url fragments will be generated based on the set entry id.\n */\n @Input() allowUrlFragments: boolean = true;\n\n protected filteredEntries = new BehaviorSubject<PxSearchableAccordionEntry[]>([]);\n protected activeEntryIndex: number = 0;\n\n private searchSub?: Subscription;\n private routeFragmentsSub?: Subscription;\n private lastSearchString = '';\n private searchQueryRegex = /[^a-zA-Z0-9\\s]/g;\n\n constructor(\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private changeDetector: ChangeDetectorRef,\n @Inject(DOCUMENT) private document: Document\n ) {}\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes['searchString']) {\n this.lastSearchString = '';\n this.searchSub?.unsubscribe();\n delete this.searchSub;\n\n if (typeof this.searchString === \"string\") {\n this.search(this.searchString).then();\n }\n else {\n this.search(this.lastSearchString).then();\n this.searchSub = this.searchString\n .pipe(\n debounceTime(this.searchDebounceTime)\n )\n .subscribe(searchStr => this.search(searchStr).then());\n }\n }\n else if (changes['entries']) {\n if (typeof this.searchString === \"string\") {\n this.search(this.searchString).then();\n }\n else {\n this.search(this.lastSearchString).then();\n }\n }\n }\n\n ngAfterViewInit() {\n if(this.allowUrlFragments)\n {\n this.routeFragmentsSub = this.activatedRoute.fragment\n .subscribe((fragment: string | null) => {\n if(fragment) {\n const activeEntries = this.filteredEntries.getValue();\n const activeEntriesLen = activeEntries.length;\n\n for (let i = 0; i < activeEntriesLen; i++) {\n const entry = activeEntries[i];\n\n if(entry.id === fragment && this.activeEntryIndex !== i) {\n this.activeEntryIndex = i;\n this.changeDetector.detectChanges();\n this.document.getElementById(entry.id)?.scrollIntoView({behavior: 'auto', block: 'center', inline: 'center'});\n break;\n }\n }\n }\n });\n }\n }\n\n /**\n * Searches the available entries for the given search string\n * @param searchStr\n */\n async search(searchStr: string) {\n searchStr = searchStr.replace(this.searchQueryRegex, '').trim().toLowerCase();\n\n if (searchStr === '') {\n this.filteredEntries.next(this.entries);\n return;\n }\n else if (searchStr === this.lastSearchString) {\n return;\n }\n\n this.lastSearchString = searchStr;\n\n const entries = this.entries;\n const entriesLen = entries.length;\n const filteredEntries: PxSearchableAccordionEntry[] = [];\n\n for (let entryIndex = 0; entryIndex < entriesLen; ++entryIndex) {\n const entry = entries[entryIndex];\n const lowerCaseHeader = entry.header.toLowerCase();\n const lowerCaseContent = entry.content.toLowerCase();\n const headerIncludesStr = lowerCaseHeader.indexOf(searchStr) !== -1;\n const contentIncludesStr = lowerCaseContent.indexOf(searchStr) !== -1;\n\n if (!(headerIncludesStr || contentIncludesStr)) {\n continue;\n }\n\n filteredEntries.push(this.highlightWords ? {\n header: headerIncludesStr ? this.highlightString(entry.header, lowerCaseHeader, searchStr) : entry.header,\n content: contentIncludesStr ? this.highlightString(entry.content, lowerCaseContent, searchStr) : entry.content,\n data: entry.data,\n } : entry);\n }\n\n this.filteredEntries.next(filteredEntries);\n }\n\n protected activeIndexChanged() {\n let activeIndex: number;\n if(Array.isArray(this.activeEntryIndex)) {\n activeIndex = this.activeEntryIndex[0];\n } else {\n activeIndex = this.activeEntryIndex;\n }\n\n if(!(activeIndex && this.allowUrlFragments)) {\n return;\n }\n\n const entries = this.filteredEntries.getValue();\n if(!entries.length) {\n return;\n }\n\n const activeEntry = entries[activeIndex];\n if(!activeEntry.id) {\n return;\n }\n\n this.router.navigate([], {\n fragment: activeEntry.id,\n }).then();\n }\n\n private highlightString(sourceString: string, sourceStringLower: string, searchStr: string) {\n const destString = [];\n const sourceStringLen = sourceString.length;\n const highlightClass = this.highlightClass;\n let highlightedChars = [];\n let inHtmlTag = false;\n\n for (let i = 0; i < sourceStringLen; ++i) {\n let char = sourceString[i];\n\n if(inHtmlTag) {\n if(char === '>') {\n inHtmlTag = false;\n }\n }\n else if(char === '<') {\n inHtmlTag = true;\n }\n else if (searchStr.indexOf(sourceStringLower[i]) !== -1) {\n highlightedChars.push(char);\n continue;\n }\n else if (highlightedChars.length) {\n if(highlightedChars.length === searchStr.length) {\n char = '<span class=\"' + highlightClass + '\">' + highlightedChars.join('') + '</span>' + char;\n }\n else {\n char = highlightedChars.join('') + char;\n }\n\n highlightedChars = [];\n }\n\n destString.push(char);\n }\n\n if (highlightedChars.length) {\n if(highlightedChars.length === searchStr.length) {\n destString.push('<span class=\"' + highlightClass + '\">' + highlightedChars.join('') + '</span>');\n }\n else {\n destString.push(highlightedChars.join(''));\n }\n }\n\n return destString.join('');\n }\n\n ngOnDestroy() {\n this.searchSub?.unsubscribe();\n this.filteredEntries.complete();\n this.routeFragmentsSub?.unsubscribe();\n }\n}\n","<p-accordion [(value)]=\"activeEntryIndex\" (valueChange)=\"activeIndexChanged()\">\n @if(!(filteredEntries | async)?.length)\n {\n @if(noResultsTemplate)\n {\n <ng-container *ngTemplateOutlet=\"noResultsTemplate ? noResultsTemplate : defaultNoResultsTemplate\"></ng-container>\n }\n }\n\n @for(entry of filteredEntries | async; track entry.id || $index)\n {\n <p-accordion-panel [value]=\"$index\" [attr.id]=\"entry.id\">\n <p-accordion-header>\n <ng-container *ngTemplateOutlet=\"headerTemplate ? headerTemplate : defaultHeader; context: { $implicit: entry }\"></ng-container>\n </p-accordion-header>\n\n <p-accordion-content>\n <ng-container *ngTemplateOutlet=\"contentTemplate ? contentTemplate : defaultContent; context: { $implicit: entry }\"></ng-container>\n </p-accordion-content>\n </p-accordion-panel>\n }\n</p-accordion>\n\n<ng-template #defaultHeader let-entry>\n <span [innerHTML]=\"entry.header\"></span>\n</ng-template>\n<ng-template #defaultContent let-entry>\n <p [innerHTML]=\"entry.content\"></p>\n</ng-template>\n<ng-template #defaultNoResultsTemplate>\n\n</ng-template>\n","/*\n * Public API Surface of px-searchable-accordion\n */\n\nexport * from './lib/px-searchable-accordion';\nexport * from './lib/px-searchable-accordion.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}