{"version":3,"file":"ngx-nested-ellipsis.mjs","sources":["../../../projects/ngx-nested-ellipsis/src/lib/components/nested-ellipsis-content.component.ts","../../../projects/ngx-nested-ellipsis/src/lib/directives/nested-ellipsis.directive.ts","../../../projects/ngx-nested-ellipsis/src/lib/nested-ellipsis.module.ts","../../../projects/ngx-nested-ellipsis/src/public_api.ts","../../../projects/ngx-nested-ellipsis/src/ngx-nested-ellipsis.ts"],"sourcesContent":["import { Component, ElementRef } from '@angular/core';\n\n@Component({\n  selector: 'nested-ellipsis-content',\n  template: `\n    <ng-content></ng-content>\n  `,\n  styles: [`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n      overflow: hidden;\n    }\n  `],\n  standalone: true\n  })\nexport class NestedEllipsisContentComponent {\n  constructor(public elementRef: ElementRef) {}\n}\n\n","import {\n  Directive,\n  Renderer2,\n  Input,\n  Output,\n  EventEmitter,\n  NgZone,\n  OnDestroy,\n  Inject,\n  PLATFORM_ID,\n  TemplateRef,\n  ViewContainerRef,\n  EmbeddedViewRef,\n  AfterViewChecked,\n  OnInit,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { NestedEllipsisContentComponent } from '../components/nested-ellipsis-content.component';\nimport { EllipsisResizeDetectionEnum } from '../enums/ellipsis-resize-detection.enum';\nimport { Subject } from 'rxjs';\nimport { take } from 'rxjs/operators';\n\nconst nodeTypesToProcess: number[] = [Node.TEXT_NODE, Node.ELEMENT_NODE];\n\n/**\n * Directive to truncate the contained text, if it exceeds the element's boundaries\n * and append characters (configurable, default '...') if so.\n */\n@Directive({\n  selector: '[nestedEllipsis]',\n  exportAs: 'ngxNestedEllipsis',\n  standalone: true\n  })\nexport class NestedEllipsisDirective implements OnInit, OnDestroy, AfterViewChecked {\n  /**\n   * The referenced element\n   */\n  private elem?: HTMLElement;\n\n  /**\n   * ViewRef of the main template (the one to be truncated)\n   */\n  private templateView: EmbeddedViewRef<unknown>;\n\n  /**\n   * ViewRef of the indicator template\n   */\n  private indicatorView: EmbeddedViewRef<unknown>;\n\n  /**\n   * Concatenated template html at the time of the last time the ellipsis has been applied\n   */\n  private previousTemplateHtml: string;\n\n  /**\n   * Text length before truncating\n   */\n  private initialTextLength: number;\n\n  /**\n   * Subject triggered when resize listeners should be removed\n   */\n  private removeResizeListeners$ = new Subject<void>();\n\n  private previousDimensions: {\n    width: number,\n    height: number,\n    scrollWidth: number,\n    scrollHeight: number\n  };\n\n  /**\n   * The ngxNestedEllipsis html attribute\n   * Passing true (default) will perform the directive's task,\n   * otherwise the template will be rendered without truncating its contents.\n   */\n  @Input('nestedEllipsis') active?: boolean | string = true;\n\n  /**\n   * The ellipsisIndicator html attribute\n   * Passing a string (default: '...') will append it when the passed template has been truncated\n   * Passing a template will append that template instead\n   */\n  @Input('nestedEllipsisIndicator') indicator: string | TemplateRef<unknown>;\n\n  /**\n   * The ellipsisWordBoundaries html attribute\n   * Each character passed to this input will be interpreted\n   * as a word boundary at which the text may be truncated.\n   * Else the text may be truncated at any character.\n   */\n  @Input('nestedEllipsisWordBoundaries') wordBoundaries: string;\n\n  /**\n   * The ellipsisMayTruncateAtFn html attribute\n   * Function that lets you specify whether the contents may be truncated at a specific point or not:\n   * `(node: CharacterData, position: number) => boolean`\n   * `node` Text node that is being truncated\n   * `position` String position the text would be truncated at\n   * Should return true, if the text may be truncated here, else false\n   */\n  @Input('nestedEllipsisMayTruncateAtFn') mayTruncateAtFn: (node: CharacterData, position: number) => boolean;\n\n  /**\n   * The ellipsisResizeDetection html attribute\n   * Algorithm to use to detect element/window resize - any value of `EllipsisResizeDetectionEnum`\n   */\n  @Input('nestedEllipsisResizeDetection') resizeDetection: EllipsisResizeDetectionEnum;\n\n\n  /**\n   * The ellipsisChange html attribute\n   * This emits after which index the text has been truncated.\n   * If it hasn't been truncated, null is emitted.\n   */\n  @Output('nestedEllipsisChange') readonly ellipsisChange: EventEmitter<number> = new EventEmitter();\n\n  /**\n   * Utility method to quickly find the largest number for\n   * which `callback(number)` still returns true.\n   * @param  max      Highest possible number\n   * @param  callback Should return true as long as the passed number is valid\n   * @returns         Largest possible number\n   */\n  private static numericBinarySearch(max: number, callback: (n: number) => boolean): number {\n    let low = 0;\n    let high = max;\n    let best = -1;\n    let mid: number;\n\n    while (low <= high) {\n      mid = Math.floor((low + high) / 2);\n      const result = callback(mid);\n      if (!result) {\n        high = mid - 1;\n      } else {\n        best = mid;\n        low = mid + 1;\n      }\n    }\n\n    return best;\n  }\n\n  private flattenTextAndElementNodes(element: HTMLElement): (CharacterData | HTMLElement)[] {\n    const nodes: (CharacterData | HTMLElement)[] = [];\n    for (let i = 0; i < element.childNodes.length; i++) {\n      const child = element.childNodes.item(i);\n      if (child instanceof HTMLElement || child instanceof CharacterData) {\n        nodes.push(child);\n\n        if (child instanceof HTMLElement) {\n          nodes.push(...this.flattenTextAndElementNodes(child));\n        }\n      }\n    }\n\n    return nodes;\n  }\n\n\n  /**\n   * The directive's constructor\n   */\n  public constructor(\n    private readonly templateRef: TemplateRef<unknown>,\n    private readonly viewContainer: ViewContainerRef,\n    private readonly renderer: Renderer2,\n    private readonly ngZone: NgZone,\n    @Inject(PLATFORM_ID) private platformId: Object\n  ) { }\n\n  /**\n   * Angular's onInit life cycle hook.\n   * Initializes the element for displaying the ellipsis.\n   */\n  ngOnInit() {\n    if (!isPlatformBrowser(this.platformId)) {\n      // in angular universal we don't have access to the ugly\n      // DOM manipulation properties we sadly need to access here,\n      // so wait until we're in the browser:\n      return;\n    }\n\n    if (typeof(this.active) !== 'boolean') {\n      this.active = true;\n    }\n\n    if (typeof(this.indicator) === 'undefined') {\n      this.indicator = '...';\n    }\n\n    if (typeof (this.resizeDetection) === 'undefined') {\n      this.resizeDetection = EllipsisResizeDetectionEnum.ResizeObserver;\n    }\n\n    // perform regex replace on word boundaries:\n    if (!this.wordBoundaries) {\n      this.wordBoundaries = '';\n    }\n    this.wordBoundaries = '[' + this.wordBoundaries.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') + ']';\n\n    // initialize view:\n    this.restoreView();\n    this.previousDimensions = {\n      width: this.elem.clientWidth,\n      height: this.elem.clientHeight,\n      scrollWidth: this.elem.scrollWidth,\n      scrollHeight: this.elem.scrollHeight\n    };\n\n    this.applyEllipsis();\n  }\n\n\n  /**\n   * Angular's destroy life cycle hook.\n   * Remove event listeners\n   */\n  ngOnDestroy() {\n    this.removeResizeListeners$.next();\n    this.removeResizeListeners$.complete();\n  }\n\n  /**\n   * Angular's afterViewChecked life cycle hook.\n   * Reapply ellipsis, if any of the templates have changed\n   */\n  ngAfterViewChecked() {\n    if (this.resizeDetection !== 'manual') {\n      if (this.templatesHaveChanged) {\n        this.applyEllipsis();\n      }\n    }\n  }\n\n  /**\n   * Convert a list of Nodes to html\n   * @param nodes Nodes to convert\n   * @returns html code\n   */\n  private nodesToHtml(nodes: Node[]): string {\n    const div = <HTMLElement> this.renderer.createElement('div');\n    for (const node of nodes) {\n      this.renderer.appendChild(div, node.cloneNode(true));\n    }\n    return div.innerHTML;\n  }\n\n  /**\n   * Convert the passed templates to html\n   * @param templateView the main template view ref\n   * @param indicatorView the indicator template view ref\n   * @returns concatenated template html\n   */\n  private templatesToHtml(templateView: EmbeddedViewRef<unknown>, indicatorView?: EmbeddedViewRef<unknown>): string {\n    let html = this.nodesToHtml(templateView.rootNodes);\n    if (indicatorView) {\n      html += this.nodesToHtml(indicatorView.rootNodes);\n    } else {\n      html += <string> this.indicator;\n    }\n\n    return html;\n  }\n\n  /**\n   * Whether any of the passed templates have changed since the last time\n   * the ellipsis has been applied\n   */\n  private get templatesHaveChanged(): boolean {\n    if (!this.templateView || !this.previousTemplateHtml) {\n      return false;\n    }\n\n    const templateView = this.templateRef.createEmbeddedView({});\n    templateView.detectChanges();\n\n    const indicatorView = (typeof this.indicator !== 'string') ? this.indicator.createEmbeddedView({}) : null;\n    if (indicatorView) {\n      indicatorView.detectChanges();\n    }\n\n    const templateHtml = this.templatesToHtml(templateView, indicatorView);\n\n    return this.previousTemplateHtml !== templateHtml;\n  }\n\n  /**\n   * Restore the view from the templates (non-truncated)\n   */\n  private restoreView() {\n    this.viewContainer.clear();\n    if (this.elem != null && document.body.contains(this.elem)) {\n      // Workaround for https://github.com/lentschi/ngx-nested-ellipsis/issues/17:\n      this.renderer.setStyle(this.elem, 'display', 'none');\n    }\n    this.templateView = this.templateRef.createEmbeddedView({});\n    this.templateView.detectChanges();\n\n    const componentRef = this.viewContainer.createComponent(NestedEllipsisContentComponent, {\n      injector: this.viewContainer.injector,\n      projectableNodes: [this.templateView.rootNodes]\n    });\n    this.elem = componentRef.instance.elementRef.nativeElement;\n    this.initialTextLength = this.currentLength;\n\n    this.indicatorView = (typeof this.indicator !== 'string') ? this.indicator.createEmbeddedView({}) : null;\n    if (this.indicatorView) {\n      this.indicatorView.detectChanges();\n    }\n  }\n\n\n  /**\n   * Set up an event listener to call applyEllipsis() whenever a resize has been registered.\n   * The type of the listener (window/element) depends on the `ellipsisResizeDetection`.\n   */\n  private addResizeListener() {\n    switch (this.resizeDetection) {\n      case EllipsisResizeDetectionEnum.Manual:\n        // Users will trigger applyEllipsis via the public API\n        break;\n      case EllipsisResizeDetectionEnum.Window:\n        this.addWindowResizeListener();\n        break;\n      default:\n        if (typeof (console) !== 'undefined') {\n          console.warn(`\n            No such ellipsisResizeDetection strategy: '${this.resizeDetection}'.\n            Using '${EllipsisResizeDetectionEnum.ResizeObserver}' instead.\n          `);\n        }\n        this.resizeDetection = EllipsisResizeDetectionEnum.ResizeObserver;\n      // eslint-disable-next-line no-fallthrough\n      case EllipsisResizeDetectionEnum.ResizeObserver:\n        this.addResizeObserver();\n        break;\n    }\n  }\n\n  /**\n   * Set up an event listener to call applyEllipsis() whenever the window gets resized.\n   */\n  private addWindowResizeListener() {\n    const removeWindowResizeListener = this.renderer.listen('window', 'resize', () => {\n      this.ngZone.run(() => {\n        this.applyEllipsis();\n      });\n    });\n\n    this.removeResizeListeners$.pipe(take(1)).subscribe(() => removeWindowResizeListener());\n  }\n\n  /**\n   * Set up an event listener to call applyEllipsis() whenever ResizeObserver is triggered for the element.\n   */\n  private addResizeObserver() {\n    const resizeObserver = new ResizeObserver(() => {\n      window.requestAnimationFrame(() => {\n        if (\n          this.previousDimensions.width !== this.elem.clientWidth\n          || this.previousDimensions.height !== this.elem.clientHeight\n          || this.previousDimensions.scrollWidth !== this.elem.scrollWidth\n          || this.previousDimensions.scrollHeight !== this.elem.scrollHeight\n        ) {\n          this.ngZone.run(() => {\n            this.applyEllipsis();\n          });\n\n          this.previousDimensions.width = this.elem.clientWidth;\n          this.previousDimensions.height = this.elem.clientHeight;\n          this.previousDimensions.scrollWidth = this.elem.scrollWidth;\n          this.previousDimensions.scrollHeight = this.elem.scrollHeight;\n        }\n      });\n    });\n    resizeObserver.observe(this.elem);\n    this.removeResizeListeners$.pipe(take(1)).subscribe(() => resizeObserver.disconnect());\n  }\n\n\n  /**\n   * Get the original text's truncated version. If the text really needed to\n   * be truncated, this.ellipsisCharacters will be appended.\n   * @param max the maximum length the text may have\n   * @returns the text node that has been truncated or null if truncating wasn't required\n   */\n  private truncateContents(max: number): Node {\n    this.restoreView();\n    const nodes = <(HTMLElement | CharacterData)[]>this.flattenTextAndElementNodes(this.elem)\n      .filter(node => nodeTypesToProcess.includes(node.nodeType));\n\n    let foundIndex = -1;\n    let foundNode: Node;\n    let offset = this.initialTextLength;\n    for (let i = nodes.length - 1; i >= 0; i--) {\n      const node = nodes[i];\n\n      if (node instanceof CharacterData) {\n        offset -= node.data.length;\n      } else {\n        offset--;\n      }\n\n      if (offset <= max) {\n        if (node instanceof CharacterData) {\n          if (this.wordBoundaries === '[]' && !this.mayTruncateAtFn) {\n            node.data = node.data.substr(0, max - offset);\n          } else if (max - offset !== node.data.length) {\n            let j = max - offset - 1;\n            while (\n              j > 0 && (\n                (this.wordBoundaries !== '[]' && !node.data.charAt(j).match(this.wordBoundaries)) ||\n                (this.mayTruncateAtFn && !this.mayTruncateAtFn(node, j))\n              )\n            ) {\n              j--;\n            }\n            if (offset > 0 && j === 0) {\n              continue;\n            }\n            node.data = node.data.substr(0, j);\n          }\n        }\n        foundIndex = i;\n        foundNode = node;\n        break;\n      }\n    }\n\n    for (let i = foundIndex + 1; i < nodes.length; i++) {\n      const node = nodes[i];\n      if (node.textContent !== '' && node.parentNode !== this.elem && node.parentNode?.childNodes.length === 1) {\n        node.parentNode.parentNode?.removeChild(node.parentNode);\n      } else {\n        node.parentNode?.removeChild(node);\n      }\n    }\n\n    return (this.currentLength !== this.initialTextLength) ? foundNode : null;\n  }\n\n  private get currentLength(): number {\n    return this.flattenTextAndElementNodes(this.elem)\n      .filter(node => nodeTypesToProcess.includes(node.nodeType))\n      .map(node => (node instanceof CharacterData) ? node.data.length : 1)\n      .reduce((sum, length) => sum + length, 0);\n  }\n\n  /**\n   * Set the truncated text to be displayed in the inner div\n   * @param max the maximum length the text may have\n   * @param addMoreListener=false listen for click on the ellipsisCharacters anchor tag if the text has been truncated\n   */\n  private truncateText(max: number) {\n    const truncatedNode = this.truncateContents(max);\n\n    if (truncatedNode) {\n      if (!this.indicatorView) {\n        if (truncatedNode instanceof CharacterData) {\n          truncatedNode.data += <string> this.indicator;\n        } else {\n          this.renderer.appendChild(this.elem, this.renderer.createText(<string> this.indicator));\n        }\n      } else {\n        for (const node of this.indicatorView.rootNodes) {\n          this.renderer.appendChild(this.elem, node);\n        }\n      }\n    }\n  }\n\n\n  /**\n   * Display ellipsis in the EllipsisContentComponent if the text would exceed the boundaries\n   */\n  public applyEllipsis() {\n    // Remove the resize listener as changing the contained text would trigger events:\n    this.removeResizeListeners$.next();\n\n    // update from templates:\n    this.restoreView();\n\n    // remember template state:\n    this.previousTemplateHtml = this.templatesToHtml(this.templateView, this.indicatorView);\n\n    // abort if [nestedEllipsis]=\"false\" has been set\n    if (!this.active) {\n      return;\n    }\n\n    // Find the best length by trial and error:\n    const maxLength = NestedEllipsisDirective.numericBinarySearch(this.initialTextLength, curLength => {\n      this.truncateText(curLength);\n      return !this.isOverflowing;\n    });\n\n    // Apply the best length:\n    this.truncateText(maxLength);\n\n    // Re-attach the resize listener:\n    this.addResizeListener();\n\n    // Emit change event:\n    if (this.ellipsisChange.observers.length > 0) {\n      const currentLength = this.currentLength;\n      this.ellipsisChange.emit(\n        (currentLength === this.initialTextLength) ? null : currentLength\n      );\n    }\n  }\n\n\n  /**\n   * Whether the text is exceeding the element's boundaries or not\n   */\n  private get isOverflowing(): boolean {\n    // Enforce hidden overflow (required to compare client width/height with scroll width/height)\n    const currentOverflow = this.elem.style.overflow;\n    if (!currentOverflow || currentOverflow === 'visible') {\n      this.elem.style.overflow = 'hidden';\n    }\n\n    const isOverflowing = this.elem.clientWidth < this.elem.scrollWidth - 1 || this.elem.clientHeight < this.elem.scrollHeight - 1;\n\n    // Reset overflow to the original configuration:\n    this.elem.style.overflow = currentOverflow;\n\n    return isOverflowing;\n  }\n\n}\n","import { NgModule } from '@angular/core';\nimport { NestedEllipsisDirective } from './directives/nested-ellipsis.directive';\n\n@NgModule({\n  imports: [NestedEllipsisDirective],\n  exports: [NestedEllipsisDirective]\n  })\nexport class NestedEllipsisModule { }\n","/*\n * Public API Surface of ngx-nested-ellipsis\n */\n\nexport * from './lib/directives/nested-ellipsis.directive';\nexport * from './lib/components/nested-ellipsis-content.component';\nexport * from './lib/enums/ellipsis-resize-detection.enum';\nexport * from './lib/nested-ellipsis.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}