Angular показать список как всплывающую подсказку в поле выбора даты с bootstrap? - PullRequest
2 голосов
/ 04 апреля 2020

Мне нужно показать подсказку, которая является списком Html при наведении курсора.

Я могу показать выделенную дату и простое сообщение, но список не будет отображаться вообще. Это связано с bootstrap. Если я удаляю bootstrap, то это показывает, но мне нужно bootstrap в приложении. Есть ли способ показать список во всплывающей подсказке с bootstrap?

Вот код

export class DatepickerDateClassExample {
 list: string =
"Date - (3)<br/>" +
"Names - (4)<br/>" +
"Addresses - (25)<br>" +
"Values - (30)";

  constructor(private renderer: Renderer2) {}
  dates = [
       { date: "2020-04-20", text: this.list }
  ];
  dateClass = (d: Date) => {
    const dateSearch = this.dateToString(d);
    return this.dates.find(f => f.date == dateSearch)
      ? "example-custom-date-class"
      : undefined;
  };


  displayMonth() {
    let elements = document.querySelectorAll(".endDate");
    let x = elements[0].querySelectorAll(".mat-calendar-body-cell");
    x.forEach(y => {
      const dateSearch = this.dateToString(
        new Date(y.getAttribute("aria-label"))
      );
      const data = this.dates.find(f => f.date == dateSearch);
      if (data) y.setAttribute("aria-label", data.text);
    });
  }
  streamOpened(event) {
    setTimeout(() => {
      let buttons = document.querySelectorAll("mat-calendar .mat-icon-button");

      buttons.forEach(btn =>
        this.renderer.listen(btn, "click", () => {
          setTimeout(() => {
            //debugger
            this.displayMonth();
          });
        })
      );
      this.displayMonth();
    });
  }
  dateToString(date: any) {
    return (
      date.getFullYear() +
      "-" +
      ("0" + (date.getMonth() + 1)).slice(-2) +
      "-" +
      ("0" + date.getDate()).slice(-2)
    );
  }

Css:

::ng-deep .example-custom-date-class {
          background: orange;
          border-radius: 100%;
        }

  .tooltip 
    {
      display: none;
      position: absolute;
      text-align: center;
      margin-top: 30px;
      width: 155px;
      padding: 10px;
      z-index: 2000;
      box-shadow: 0px 0px 4px #222;  
      border-radius: 10px;  
      background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #eeeeee),color-stop(1, #cccccc));
      background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc);  
      color: gray;   
    }


.tooltip:before {
  content: '';
  display: block;  
    position: absolute;
    left: 10px;
    top: -20px;
    width: 0;
    height: 0;
    border: 9px solid transparent;
    border-bottom-color: #cccccc;
}

Html:

<mat-form-field class="example-full-width" >
  <input matInput [matDatepicker]="picker" placeholder="Choose a date">
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker (opened)="streamOpened($event)" [dateClass]="dateClass" #picker panelClass="endDate" ></mat-datepicker>
</mat-form-field>


<div #toolTip class="tooltip" (mouseover)="onTool=true"
(mouseout)="onTool=false"
 [style.display]="show || onTool?'inline-block':'none'" [innerHTML]="toolTipMessage">
 </div>

Вот стек стека

Ответы [ 2 ]

3 голосов
/ 05 апреля 2020

Я боюсь, что вы не можете использовать простой css, потому что контент допускает только \A, чтобы сделать разрывную строку, но это невозможно, используя attr -it, возможно указывать que \ A как строку в содержимом- ( и не разрешать. html)

Что ж, мы можем предпринять еще один подход, который заключается в том, чтобы использовать div в качестве всплывающей подсказки и использовать рендерер для прослушивания mouseout и mouseover

Если наш div как

<div #toolTip class="tooltip" 
   (mouseover)="onTool=true"
   (mouseout)="onTool=false"
   [style.display]="show || onTool?'inline-block':'none'" 
   [innerHTML]="toolTipMessage">
</div>

И имеет две переменные и получить div, используя ViewChild

@ViewChild('toolTip') tool:ElementRef
show:boolean=false;
onTool:boolean=false;

Мы можем изменить нашу функцию displayMonth, чтобы добавить указатель мыши и мышь

  displayMonth() {
    let elements = document.querySelectorAll(".endDate");
    let x = elements[0].querySelectorAll(".mat-calendar-body-cell");
    x.forEach(y => {
      const dateSearch = this.dateToString(
        new Date(y.getAttribute("aria-label"))
      );
      const data = this.dates.find(f => f.date == dateSearch);
      if (data) {
        this.renderer.listen(y, "mouseover", () => this.showTool(y, data.text));
        this.renderer.listen(y, "mouseout", () => this.hideTool());
      }
    });
  }
  showTool(y, data) {
    this.show = true;
    this.toolTipMessage = data;
    this.renderer.setStyle(
      this.tool.nativeElement,
      "top",
      y.getBoundingClientRect().y+ "px"
    );
    this.renderer.setStyle(
      this.tool.nativeElement,
      "left",
      y.getBoundingClientRect().x + "px"
    );
  }
  hideTool() {
    this.show = false;
  }

См. стекблиц

2 голосов
/ 06 апреля 2020

Вам просто нужно установить непрозрачность всплывающей подсказки равной 1. Bootstrap устанавливает непрозрачность классов tooltip по умолчанию на 0.

.tooltip 
{
 /*.... */  
 opacity: 1;
}

Вы также можете просто изменить имя класса и не использовать tooltip.

Модифицированный стек * блик

Пояснение

Если вы используете собственный bootstrap js, вы обычно необходимо вызвать .tooltip('show') метод для элемента, для которого должна появиться подсказка. Это, в свою очередь, изменит непрозрачность элемента всплывающей подсказки.

Здесь, похоже, вы просто используете css часть bootstrap, а не js lib, поэтому вам нужно изменить Непрозрачность самостоятельно.

Примечание: использование bootstrap js требует jquery, что не рекомендуется в angular проектах. Существуют некоторые подобные библиотеки, которые предоставляют bootstrap компонентов для angular без необходимости jquery, например ngx- bootstrap

Edit

Только для информации, если вы действительно хотите использовать jquery и bootstrap для всплывающей подсказки, взгляните на этот пример stackblitz .

По сути, вы просто звоните tooltip в календаре даты и передать текст для отображения. Bootstrap будет обрабатывать скрытие / показ и позиционирование всплывающей подсказки.

$(y).tooltip({'title': data.text, html: true});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...