Search code examples
javascripthtmlcssangularellipsis

How to show "show more" button when text has ellipsis?


I have searched on Google and here on SO before posting this question. I have found several solution to my problem, but none of them fits my needs.

Here is my code: Plunker

    <div *ngIf="description.length > 200" class="ui mini compact buttons expand">
        <button class="ui button" (click)="showMore($event)">Show more</button>
    </div>

The "show more" button appears only if text length exceeds 200 characters. As you can see it seems to be a nice solution.

showMore(event: any) {
    $(event.target).text((i, text) => { return text === "Show more" ? "Show less" : "Show more";    });
    $(event.target).parent().prev().find('.detail-value').toggleClass('text-ellipsis');
}

Anyway I could have a text that is not 200 characters long and that doesn't fit the SPAN element, then it has the ellipsis but the "show more" button doesn't appear.

enter image description here

How can I make my solution work in any case? Do you know a workaround or a best solution to solve that?


Solution

  • Edit with a possible solution:

    //our root app component
    import {Component, NgModule, VERSION, OnInit} from '@angular/core'
    import {BrowserModule} from '@angular/platform-browser'
    import {ElementRef,ViewChild} from '@angular/core';
    
    @Component({
      selector: 'my-app',
      template: `
        <div class="ui segment detail-container" (window:resize)="checkOverflow(span)">
          <span class="title-container" role="heading">User details</span>
          <div class="detail-group">
            <div class="detail-element">
              <span class="detail-label">Name</span>
              <span class="detail-value">John</span>
            </div>
            <div class="detail-element">
              <span class="detail-label">Surname</span>
              <span class="detail-value">Smith</span>
            </div>
          </div>
    
          <div class="detail-group">
            <div class="detail-element">
              <span class="detail-label">Description</span>
              <span #span class="detail-value text-ellipsis">{{description}}</span>
            </div>
            <div class="ui mini compact buttons expand">
                <button  *ngIf="checkOverflow(span) && showMoreFlag" class="ui button" (click)="showMore($event)">Show more</button>
                <button  *ngIf="!showMoreFlag" class="ui button" (click)="showMore($event)">Show less</button>
            </div>
          </div>
        </div>
      `,
      styleUrls: ['src/app.css']
    })
    
    
    
    export class App implements OnInit {
      description: string = 'Lorem ipsum dolor sit a ';
      showMoreFlag:boolean = true;
    
      constructor() {
      }
    
      ngOnInit(): void {
        this.overflowOcurs = this.checkOverflow(this.el.nativeElement);
      }
    
      showMore(event: any) {
            this.showMoreFlag = !this.showMoreFlag;
            $(event.target).parent().prev().find('.detail-value').toggleClass('text-ellipsis');
        }
    
        checkOverflow (element) {
        if (element.offsetHeight < element.scrollHeight ||
            element.offsetWidth < element.scrollWidth) {
          return true;
        } else {
          return false;
        }
      }
    }
    
    @NgModule({
      imports: [ BrowserModule ],
      declarations: [ App ],
      bootstrap: [ App ]
    })
    export class AppModule {}
    

    Plunker working properly:

    https://plnkr.co/edit/HCd6ds5RBYvlcmUtdvKr