{"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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"}